summaryrefslogtreecommitdiff
path: root/target/lemote
diff options
context:
space:
mode:
authorWaldemar Brodkorb <wbx@openadk.org>2010-02-27 22:27:29 +0100
committerWaldemar Brodkorb <wbx@openadk.org>2010-02-27 22:27:29 +0100
commit4db531872ce8e489cf036526975d8f73c8b20a88 (patch)
tree54367cb1de49734b81fed75ff68637f891f34ffb /target/lemote
parent58d5b9279d9c28e0acd5bde9f9e02a001ac2c736 (diff)
remove old patch, yeelong support is included upstream
Diffstat (limited to 'target/lemote')
-rw-r--r--target/lemote/patches/yeelong.patch57994
1 files changed, 0 insertions, 57994 deletions
diff --git a/target/lemote/patches/yeelong.patch b/target/lemote/patches/yeelong.patch
deleted file mode 100644
index 5909a579e..000000000
--- a/target/lemote/patches/yeelong.patch
+++ /dev/null
@@ -1,57994 +0,0 @@
-diff -Nur linux-2.6.30.5.orig/arch/mips/configs/fulong_defconfig linux-2.6.30.5/arch/mips/configs/fulong_defconfig
---- linux-2.6.30.5.orig/arch/mips/configs/fulong_defconfig 2009-08-16 23:19:38.000000000 +0200
-+++ linux-2.6.30.5/arch/mips/configs/fulong_defconfig 1970-01-01 01:00:00.000000000 +0100
-@@ -1,1912 +0,0 @@
--#
--# Automatically generated make config: don't edit
--# Linux kernel version: 2.6.28-rc6
--# Fri Nov 28 17:53:48 2008
--#
--CONFIG_MIPS=y
--
--#
--# Machine selection
--#
--# CONFIG_MACH_ALCHEMY is not set
--# CONFIG_BASLER_EXCITE is not set
--# CONFIG_BCM47XX is not set
--# CONFIG_MIPS_COBALT is not set
--# CONFIG_MACH_DECSTATION is not set
--# CONFIG_MACH_JAZZ is not set
--# CONFIG_LASAT is not set
--CONFIG_LEMOTE_FULONG=y
--# CONFIG_MIPS_MALTA is not set
--# CONFIG_MIPS_SIM is not set
--# CONFIG_MACH_EMMA is not set
--# CONFIG_MACH_VR41XX is not set
--# CONFIG_NXP_STB220 is not set
--# CONFIG_NXP_STB225 is not set
--# CONFIG_PNX8550_JBS is not set
--# CONFIG_PNX8550_STB810 is not set
--# CONFIG_PMC_MSP is not set
--# CONFIG_PMC_YOSEMITE is not set
--# CONFIG_SGI_IP22 is not set
--# CONFIG_SGI_IP27 is not set
--# CONFIG_SGI_IP28 is not set
--# CONFIG_SGI_IP32 is not set
--# CONFIG_SIBYTE_CRHINE is not set
--# CONFIG_SIBYTE_CARMEL is not set
--# CONFIG_SIBYTE_CRHONE is not set
--# CONFIG_SIBYTE_RHONE is not set
--# CONFIG_SIBYTE_SWARM is not set
--# CONFIG_SIBYTE_LITTLESUR is not set
--# CONFIG_SIBYTE_SENTOSA is not set
--# CONFIG_SIBYTE_BIGSUR is not set
--# CONFIG_SNI_RM is not set
--# CONFIG_MACH_TX39XX is not set
--# CONFIG_MACH_TX49XX is not set
--# CONFIG_MIKROTIK_RB532 is not set
--# CONFIG_WR_PPMC is not set
--CONFIG_RWSEM_GENERIC_SPINLOCK=y
--# CONFIG_ARCH_HAS_ILOG2_U32 is not set
--# CONFIG_ARCH_HAS_ILOG2_U64 is not set
--CONFIG_ARCH_SUPPORTS_OPROFILE=y
--CONFIG_GENERIC_FIND_NEXT_BIT=y
--CONFIG_GENERIC_HWEIGHT=y
--CONFIG_GENERIC_CALIBRATE_DELAY=y
--CONFIG_GENERIC_CLOCKEVENTS=y
--CONFIG_GENERIC_TIME=y
--CONFIG_GENERIC_CMOS_UPDATE=y
--CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
--CONFIG_GENERIC_HARDIRQS_NO__DO_IRQ=y
--CONFIG_CEVT_R4K=y
--CONFIG_CSRC_R4K=y
--CONFIG_DMA_NONCOHERENT=y
--CONFIG_DMA_NEED_PCI_MAP_STATE=y
--CONFIG_EARLY_PRINTK=y
--CONFIG_SYS_HAS_EARLY_PRINTK=y
--# CONFIG_HOTPLUG_CPU is not set
--CONFIG_I8259=y
--# CONFIG_NO_IOPORT is not set
--CONFIG_GENERIC_ISA_DMA=y
--CONFIG_GENERIC_ISA_DMA_SUPPORT_BROKEN=y
--# CONFIG_CPU_BIG_ENDIAN is not set
--CONFIG_CPU_LITTLE_ENDIAN=y
--CONFIG_SYS_SUPPORTS_LITTLE_ENDIAN=y
--CONFIG_IRQ_CPU=y
--CONFIG_BOOT_ELF32=y
--CONFIG_MIPS_L1_CACHE_SHIFT=5
--CONFIG_HAVE_STD_PC_SERIAL_PORT=y
--
--#
--# CPU selection
--#
--CONFIG_CPU_LOONGSON2=y
--# CONFIG_CPU_MIPS32_R1 is not set
--# CONFIG_CPU_MIPS32_R2 is not set
--# CONFIG_CPU_MIPS64_R1 is not set
--# CONFIG_CPU_MIPS64_R2 is not set
--# CONFIG_CPU_R3000 is not set
--# CONFIG_CPU_TX39XX is not set
--# CONFIG_CPU_VR41XX is not set
--# CONFIG_CPU_R4300 is not set
--# CONFIG_CPU_R4X00 is not set
--# CONFIG_CPU_TX49XX is not set
--# CONFIG_CPU_R5000 is not set
--# CONFIG_CPU_R5432 is not set
--# CONFIG_CPU_R5500 is not set
--# CONFIG_CPU_R6000 is not set
--# CONFIG_CPU_NEVADA is not set
--# CONFIG_CPU_R8000 is not set
--# CONFIG_CPU_R10000 is not set
--# CONFIG_CPU_RM7000 is not set
--# CONFIG_CPU_RM9000 is not set
--# CONFIG_CPU_SB1 is not set
--CONFIG_SYS_HAS_CPU_LOONGSON2=y
--CONFIG_SYS_SUPPORTS_32BIT_KERNEL=y
--CONFIG_SYS_SUPPORTS_64BIT_KERNEL=y
--CONFIG_CPU_SUPPORTS_32BIT_KERNEL=y
--CONFIG_CPU_SUPPORTS_64BIT_KERNEL=y
--
--#
--# Kernel type
--#
--# CONFIG_32BIT is not set
--CONFIG_64BIT=y
--# CONFIG_PAGE_SIZE_4KB is not set
--# CONFIG_PAGE_SIZE_8KB is not set
--CONFIG_PAGE_SIZE_16KB=y
--# CONFIG_PAGE_SIZE_64KB is not set
--CONFIG_BOARD_SCACHE=y
--CONFIG_MIPS_MT_DISABLED=y
--# CONFIG_MIPS_MT_SMP is not set
--# CONFIG_MIPS_MT_SMTC is not set
--CONFIG_CPU_HAS_WB=y
--CONFIG_CPU_HAS_SYNC=y
--CONFIG_GENERIC_HARDIRQS=y
--CONFIG_GENERIC_IRQ_PROBE=y
--CONFIG_CPU_SUPPORTS_HIGHMEM=y
--CONFIG_SYS_SUPPORTS_HIGHMEM=y
--CONFIG_ARCH_FLATMEM_ENABLE=y
--CONFIG_ARCH_POPULATES_NODE_MAP=y
--CONFIG_ARCH_SPARSEMEM_ENABLE=y
--CONFIG_SELECT_MEMORY_MODEL=y
--CONFIG_FLATMEM_MANUAL=y
--# CONFIG_DISCONTIGMEM_MANUAL is not set
--# CONFIG_SPARSEMEM_MANUAL is not set
--CONFIG_FLATMEM=y
--CONFIG_FLAT_NODE_MEM_MAP=y
--CONFIG_SPARSEMEM_STATIC=y
--CONFIG_PAGEFLAGS_EXTENDED=y
--CONFIG_SPLIT_PTLOCK_CPUS=4
--CONFIG_RESOURCES_64BIT=y
--CONFIG_PHYS_ADDR_T_64BIT=y
--CONFIG_ZONE_DMA_FLAG=0
--CONFIG_VIRT_TO_BUS=y
--CONFIG_UNEVICTABLE_LRU=y
--CONFIG_TICK_ONESHOT=y
--CONFIG_NO_HZ=y
--CONFIG_HIGH_RES_TIMERS=y
--CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
--# CONFIG_HZ_48 is not set
--# CONFIG_HZ_100 is not set
--# CONFIG_HZ_128 is not set
--CONFIG_HZ_250=y
--# CONFIG_HZ_256 is not set
--# CONFIG_HZ_1000 is not set
--# CONFIG_HZ_1024 is not set
--CONFIG_SYS_SUPPORTS_ARBIT_HZ=y
--CONFIG_HZ=250
--# CONFIG_PREEMPT_NONE is not set
--CONFIG_PREEMPT_VOLUNTARY=y
--# CONFIG_PREEMPT is not set
--# CONFIG_KEXEC is not set
--CONFIG_SECCOMP=y
--CONFIG_LOCKDEP_SUPPORT=y
--CONFIG_STACKTRACE_SUPPORT=y
--CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
--
--#
--# General setup
--#
--CONFIG_EXPERIMENTAL=y
--CONFIG_BROKEN_ON_SMP=y
--CONFIG_INIT_ENV_ARG_LIMIT=32
--CONFIG_LOCALVERSION="lm32"
--# CONFIG_LOCALVERSION_AUTO is not set
--CONFIG_SWAP=y
--CONFIG_SYSVIPC=y
--CONFIG_SYSVIPC_SYSCTL=y
--CONFIG_POSIX_MQUEUE=y
--CONFIG_BSD_PROCESS_ACCT=y
--# CONFIG_BSD_PROCESS_ACCT_V3 is not set
--# CONFIG_TASKSTATS is not set
--# CONFIG_AUDIT is not set
--CONFIG_IKCONFIG=y
--CONFIG_IKCONFIG_PROC=y
--CONFIG_LOG_BUF_SHIFT=14
--# CONFIG_CGROUPS is not set
--# CONFIG_GROUP_SCHED is not set
--CONFIG_SYSFS_DEPRECATED=y
--CONFIG_SYSFS_DEPRECATED_V2=y
--# CONFIG_RELAY is not set
--CONFIG_NAMESPACES=y
--# CONFIG_UTS_NS is not set
--# CONFIG_IPC_NS is not set
--CONFIG_USER_NS=y
--CONFIG_PID_NS=y
--# CONFIG_BLK_DEV_INITRD is not set
--# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
--CONFIG_SYSCTL=y
--CONFIG_EMBEDDED=y
--CONFIG_SYSCTL_SYSCALL=y
--CONFIG_KALLSYMS=y
--# CONFIG_KALLSYMS_EXTRA_PASS is not set
--CONFIG_HOTPLUG=y
--CONFIG_PRINTK=y
--CONFIG_BUG=y
--CONFIG_ELF_CORE=y
--# CONFIG_PCSPKR_PLATFORM is not set
--# CONFIG_COMPAT_BRK is not set
--CONFIG_BASE_FULL=y
--CONFIG_FUTEX=y
--CONFIG_ANON_INODES=y
--CONFIG_EPOLL=y
--CONFIG_SIGNALFD=y
--CONFIG_TIMERFD=y
--CONFIG_EVENTFD=y
--CONFIG_SHMEM=y
--CONFIG_AIO=y
--CONFIG_VM_EVENT_COUNTERS=y
--CONFIG_PCI_QUIRKS=y
--CONFIG_SLAB=y
--# CONFIG_SLUB is not set
--# CONFIG_SLOB is not set
--CONFIG_PROFILING=y
--# CONFIG_MARKERS is not set
--CONFIG_OPROFILE=m
--CONFIG_HAVE_OPROFILE=y
--# CONFIG_HAVE_GENERIC_DMA_COHERENT is not set
--CONFIG_SLABINFO=y
--CONFIG_RT_MUTEXES=y
--# CONFIG_TINY_SHMEM is not set
--CONFIG_BASE_SMALL=0
--CONFIG_MODULES=y
--# CONFIG_MODULE_FORCE_LOAD is not set
--CONFIG_MODULE_UNLOAD=y
--CONFIG_MODULE_FORCE_UNLOAD=y
--# CONFIG_MODVERSIONS is not set
--# CONFIG_MODULE_SRCVERSION_ALL is not set
--CONFIG_KMOD=y
--CONFIG_BLOCK=y
--# CONFIG_BLK_DEV_IO_TRACE is not set
--CONFIG_BLK_DEV_BSG=y
--# CONFIG_BLK_DEV_INTEGRITY is not set
--CONFIG_BLOCK_COMPAT=y
--
--#
--# IO Schedulers
--#
--CONFIG_IOSCHED_NOOP=y
--CONFIG_IOSCHED_AS=y
--CONFIG_IOSCHED_DEADLINE=y
--CONFIG_IOSCHED_CFQ=y
--# CONFIG_DEFAULT_AS is not set
--# CONFIG_DEFAULT_DEADLINE is not set
--CONFIG_DEFAULT_CFQ=y
--# CONFIG_DEFAULT_NOOP is not set
--CONFIG_DEFAULT_IOSCHED="cfq"
--CONFIG_CLASSIC_RCU=y
--CONFIG_FREEZER=y
--
--#
--# Bus options (PCI, PCMCIA, EISA, ISA, TC)
--#
--CONFIG_HW_HAS_PCI=y
--CONFIG_PCI=y
--CONFIG_PCI_DOMAINS=y
--# CONFIG_ARCH_SUPPORTS_MSI is not set
--CONFIG_PCI_LEGACY=y
--CONFIG_ISA=y
--CONFIG_MMU=y
--# CONFIG_PCCARD is not set
--# CONFIG_HOTPLUG_PCI is not set
--
--#
--# Executable file formats
--#
--CONFIG_BINFMT_ELF=y
--# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set
--# CONFIG_HAVE_AOUT is not set
--CONFIG_BINFMT_MISC=y
--CONFIG_MIPS32_COMPAT=y
--CONFIG_COMPAT=y
--CONFIG_SYSVIPC_COMPAT=y
--CONFIG_MIPS32_O32=y
--CONFIG_MIPS32_N32=y
--CONFIG_BINFMT_ELF32=y
--
--#
--# Power management options
--#
--CONFIG_ARCH_SUSPEND_POSSIBLE=y
--CONFIG_PM=y
--# CONFIG_PM_DEBUG is not set
--CONFIG_PM_SLEEP=y
--CONFIG_SUSPEND=y
--CONFIG_SUSPEND_FREEZER=y
--CONFIG_NET=y
--
--#
--# Networking options
--#
--CONFIG_PACKET=y
--CONFIG_PACKET_MMAP=y
--CONFIG_UNIX=y
--CONFIG_XFRM=y
--# CONFIG_XFRM_USER is not set
--# CONFIG_XFRM_SUB_POLICY is not set
--# CONFIG_XFRM_MIGRATE is not set
--# CONFIG_XFRM_STATISTICS is not set
--# CONFIG_NET_KEY is not set
--CONFIG_INET=y
--CONFIG_IP_MULTICAST=y
--# CONFIG_IP_ADVANCED_ROUTER is not set
--CONFIG_IP_FIB_HASH=y
--CONFIG_IP_PNP=y
--# CONFIG_IP_PNP_DHCP is not set
--CONFIG_IP_PNP_BOOTP=y
--# CONFIG_IP_PNP_RARP is not set
--CONFIG_NET_IPIP=m
--CONFIG_NET_IPGRE=m
--CONFIG_NET_IPGRE_BROADCAST=y
--# CONFIG_IP_MROUTE is not set
--# CONFIG_ARPD is not set
--# CONFIG_SYN_COOKIES is not set
--# CONFIG_INET_AH is not set
--# CONFIG_INET_ESP is not set
--# CONFIG_INET_IPCOMP is not set
--# CONFIG_INET_XFRM_TUNNEL is not set
--CONFIG_INET_TUNNEL=m
--# CONFIG_INET_XFRM_MODE_TRANSPORT is not set
--# CONFIG_INET_XFRM_MODE_TUNNEL is not set
--CONFIG_INET_XFRM_MODE_BEET=y
--# CONFIG_INET_LRO is not set
--# CONFIG_INET_DIAG is not set
--# CONFIG_TCP_CONG_ADVANCED is not set
--CONFIG_TCP_CONG_CUBIC=y
--CONFIG_DEFAULT_TCP_CONG="cubic"
--# CONFIG_TCP_MD5SIG is not set
--# CONFIG_IPV6 is not set
--# CONFIG_NETWORK_SECMARK is not set
--CONFIG_NETFILTER=y
--# CONFIG_NETFILTER_DEBUG is not set
--CONFIG_NETFILTER_ADVANCED=y
--
--#
--# Core Netfilter Configuration
--#
--CONFIG_NETFILTER_NETLINK=m
--CONFIG_NETFILTER_NETLINK_QUEUE=m
--CONFIG_NETFILTER_NETLINK_LOG=m
--# CONFIG_NF_CONNTRACK is not set
--CONFIG_NETFILTER_XTABLES=m
--CONFIG_NETFILTER_XT_TARGET_CLASSIFY=m
--# CONFIG_NETFILTER_XT_TARGET_DSCP is not set
--CONFIG_NETFILTER_XT_TARGET_MARK=m
--# CONFIG_NETFILTER_XT_TARGET_NFLOG is not set
--CONFIG_NETFILTER_XT_TARGET_NFQUEUE=m
--CONFIG_NETFILTER_XT_TARGET_RATEEST=m
--CONFIG_NETFILTER_XT_TARGET_TRACE=m
--# CONFIG_NETFILTER_XT_TARGET_TCPMSS is not set
--CONFIG_NETFILTER_XT_TARGET_TCPOPTSTRIP=m
--CONFIG_NETFILTER_XT_MATCH_COMMENT=m
--CONFIG_NETFILTER_XT_MATCH_DCCP=m
--# CONFIG_NETFILTER_XT_MATCH_DSCP is not set
--CONFIG_NETFILTER_XT_MATCH_ESP=m
--# CONFIG_NETFILTER_XT_MATCH_HASHLIMIT is not set
--CONFIG_NETFILTER_XT_MATCH_IPRANGE=m
--CONFIG_NETFILTER_XT_MATCH_LENGTH=m
--CONFIG_NETFILTER_XT_MATCH_LIMIT=m
--CONFIG_NETFILTER_XT_MATCH_MAC=m
--CONFIG_NETFILTER_XT_MATCH_MARK=m
--CONFIG_NETFILTER_XT_MATCH_MULTIPORT=m
--CONFIG_NETFILTER_XT_MATCH_OWNER=m
--# CONFIG_NETFILTER_XT_MATCH_POLICY is not set
--CONFIG_NETFILTER_XT_MATCH_PKTTYPE=m
--CONFIG_NETFILTER_XT_MATCH_QUOTA=m
--CONFIG_NETFILTER_XT_MATCH_RATEEST=m
--CONFIG_NETFILTER_XT_MATCH_REALM=m
--CONFIG_NETFILTER_XT_MATCH_RECENT=m
--# CONFIG_NETFILTER_XT_MATCH_RECENT_PROC_COMPAT is not set
--CONFIG_NETFILTER_XT_MATCH_SCTP=m
--CONFIG_NETFILTER_XT_MATCH_STATISTIC=m
--CONFIG_NETFILTER_XT_MATCH_STRING=m
--CONFIG_NETFILTER_XT_MATCH_TCPMSS=m
--CONFIG_NETFILTER_XT_MATCH_TIME=m
--CONFIG_NETFILTER_XT_MATCH_U32=m
--# CONFIG_IP_VS is not set
--
--#
--# IP: Netfilter Configuration
--#
--# CONFIG_NF_DEFRAG_IPV4 is not set
--CONFIG_IP_NF_QUEUE=m
--CONFIG_IP_NF_IPTABLES=m
--CONFIG_IP_NF_MATCH_ADDRTYPE=m
--CONFIG_IP_NF_MATCH_AH=m
--CONFIG_IP_NF_MATCH_ECN=m
--CONFIG_IP_NF_MATCH_TTL=m
--CONFIG_IP_NF_FILTER=m
--CONFIG_IP_NF_TARGET_REJECT=m
--CONFIG_IP_NF_TARGET_LOG=m
--CONFIG_IP_NF_TARGET_ULOG=m
--CONFIG_IP_NF_MANGLE=m
--CONFIG_IP_NF_TARGET_ECN=m
--CONFIG_IP_NF_TARGET_TTL=m
--CONFIG_IP_NF_RAW=m
--CONFIG_IP_NF_ARPTABLES=m
--CONFIG_IP_NF_ARPFILTER=m
--CONFIG_IP_NF_ARP_MANGLE=m
--# CONFIG_IP_DCCP is not set
--# CONFIG_IP_SCTP is not set
--# CONFIG_TIPC is not set
--# CONFIG_ATM is not set
--# CONFIG_BRIDGE is not set
--# CONFIG_NET_DSA is not set
--# CONFIG_VLAN_8021Q is not set
--# CONFIG_DECNET is not set
--# CONFIG_LLC2 is not set
--# CONFIG_IPX is not set
--# CONFIG_ATALK is not set
--# CONFIG_X25 is not set
--# CONFIG_LAPB is not set
--# CONFIG_ECONET is not set
--# CONFIG_WAN_ROUTER is not set
--# CONFIG_NET_SCHED is not set
--CONFIG_NET_CLS_ROUTE=y
--
--#
--# Network testing
--#
--# CONFIG_NET_PKTGEN is not set
--# CONFIG_HAMRADIO is not set
--# CONFIG_CAN is not set
--# CONFIG_IRDA is not set
--# CONFIG_BT is not set
--# CONFIG_AF_RXRPC is not set
--CONFIG_PHONET=m
--CONFIG_WIRELESS=y
--# CONFIG_CFG80211 is not set
--CONFIG_WIRELESS_OLD_REGULATORY=y
--CONFIG_WIRELESS_EXT=y
--CONFIG_WIRELESS_EXT_SYSFS=y
--# CONFIG_MAC80211 is not set
--CONFIG_IEEE80211=m
--# CONFIG_IEEE80211_DEBUG is not set
--CONFIG_IEEE80211_CRYPT_WEP=m
--# CONFIG_IEEE80211_CRYPT_CCMP is not set
--# CONFIG_IEEE80211_CRYPT_TKIP is not set
--# CONFIG_RFKILL is not set
--CONFIG_NET_9P=m
--# CONFIG_NET_9P_DEBUG is not set
--
--#
--# Device Drivers
--#
--
--#
--# Generic Driver Options
--#
--CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
--CONFIG_STANDALONE=y
--CONFIG_PREVENT_FIRMWARE_BUILD=y
--CONFIG_FW_LOADER=m
--CONFIG_FIRMWARE_IN_KERNEL=y
--CONFIG_EXTRA_FIRMWARE=""
--# CONFIG_SYS_HYPERVISOR is not set
--# CONFIG_CONNECTOR is not set
--CONFIG_MTD=m
--# CONFIG_MTD_DEBUG is not set
--# CONFIG_MTD_CONCAT is not set
--# CONFIG_MTD_PARTITIONS is not set
--
--#
--# User Modules And Translation Layers
--#
--CONFIG_MTD_CHAR=m
--CONFIG_MTD_BLKDEVS=m
--CONFIG_MTD_BLOCK=m
--# CONFIG_MTD_BLOCK_RO is not set
--# CONFIG_FTL is not set
--# CONFIG_NFTL is not set
--# CONFIG_INFTL is not set
--# CONFIG_RFD_FTL is not set
--# CONFIG_SSFDC is not set
--# CONFIG_MTD_OOPS is not set
--
--#
--# RAM/ROM/Flash chip drivers
--#
--CONFIG_MTD_CFI=m
--CONFIG_MTD_JEDECPROBE=m
--CONFIG_MTD_GEN_PROBE=m
--CONFIG_MTD_CFI_ADV_OPTIONS=y
--CONFIG_MTD_CFI_NOSWAP=y
--# CONFIG_MTD_CFI_BE_BYTE_SWAP is not set
--# CONFIG_MTD_CFI_LE_BYTE_SWAP is not set
--# CONFIG_MTD_CFI_GEOMETRY is not set
--CONFIG_MTD_MAP_BANK_WIDTH_1=y
--CONFIG_MTD_MAP_BANK_WIDTH_2=y
--CONFIG_MTD_MAP_BANK_WIDTH_4=y
--# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set
--# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set
--# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set
--CONFIG_MTD_CFI_I1=y
--CONFIG_MTD_CFI_I2=y
--# CONFIG_MTD_CFI_I4 is not set
--# CONFIG_MTD_CFI_I8 is not set
--# CONFIG_MTD_OTP is not set
--# CONFIG_MTD_CFI_INTELEXT is not set
--CONFIG_MTD_CFI_AMDSTD=m
--CONFIG_MTD_CFI_STAA=m
--CONFIG_MTD_CFI_UTIL=m
--# CONFIG_MTD_RAM is not set
--# CONFIG_MTD_ROM is not set
--# CONFIG_MTD_ABSENT is not set
--
--#
--# Mapping drivers for chip access
--#
--# CONFIG_MTD_COMPLEX_MAPPINGS is not set
--CONFIG_MTD_PHYSMAP=m
--CONFIG_MTD_PHYSMAP_START=0x1fc00000
--CONFIG_MTD_PHYSMAP_LEN=0x80000
--CONFIG_MTD_PHYSMAP_BANKWIDTH=1
--# CONFIG_MTD_INTEL_VR_NOR is not set
--# CONFIG_MTD_PLATRAM is not set
--
--#
--# Self-contained MTD device drivers
--#
--# CONFIG_MTD_PMC551 is not set
--# CONFIG_MTD_SLRAM is not set
--# CONFIG_MTD_PHRAM is not set
--# CONFIG_MTD_MTDRAM is not set
--# CONFIG_MTD_BLOCK2MTD is not set
--
--#
--# Disk-On-Chip Device Drivers
--#
--# CONFIG_MTD_DOC2000 is not set
--# CONFIG_MTD_DOC2001 is not set
--# CONFIG_MTD_DOC2001PLUS is not set
--# CONFIG_MTD_NAND is not set
--# CONFIG_MTD_ONENAND is not set
--
--#
--# UBI - Unsorted block images
--#
--# CONFIG_MTD_UBI is not set
--# CONFIG_PARPORT is not set
--# CONFIG_PNP is not set
--CONFIG_BLK_DEV=y
--# CONFIG_BLK_CPQ_DA is not set
--# CONFIG_BLK_CPQ_CISS_DA is not set
--# CONFIG_BLK_DEV_DAC960 is not set
--# CONFIG_BLK_DEV_UMEM is not set
--# CONFIG_BLK_DEV_COW_COMMON is not set
--CONFIG_BLK_DEV_LOOP=y
--CONFIG_BLK_DEV_CRYPTOLOOP=m
--# CONFIG_BLK_DEV_NBD is not set
--# CONFIG_BLK_DEV_SX8 is not set
--# CONFIG_BLK_DEV_UB is not set
--CONFIG_BLK_DEV_RAM=m
--CONFIG_BLK_DEV_RAM_COUNT=16
--CONFIG_BLK_DEV_RAM_SIZE=4096
--# CONFIG_BLK_DEV_XIP is not set
--CONFIG_CDROM_PKTCDVD=m
--CONFIG_CDROM_PKTCDVD_BUFFERS=8
--# CONFIG_CDROM_PKTCDVD_WCACHE is not set
--CONFIG_ATA_OVER_ETH=m
--# CONFIG_BLK_DEV_HD is not set
--# CONFIG_MISC_DEVICES is not set
--CONFIG_HAVE_IDE=y
--CONFIG_IDE=y
--
--#
--# Please see Documentation/ide/ide.txt for help/info on IDE drives
--#
--CONFIG_IDE_TIMINGS=y
--CONFIG_IDE_ATAPI=y
--# CONFIG_BLK_DEV_IDE_SATA is not set
--CONFIG_IDE_GD=y
--CONFIG_IDE_GD_ATA=y
--# CONFIG_IDE_GD_ATAPI is not set
--CONFIG_BLK_DEV_IDECD=y
--CONFIG_BLK_DEV_IDECD_VERBOSE_ERRORS=y
--# CONFIG_BLK_DEV_IDETAPE is not set
--CONFIG_BLK_DEV_IDESCSI=y
--CONFIG_IDE_TASK_IOCTL=y
--CONFIG_IDE_PROC_FS=y
--
--#
--# IDE chipset support/bugfixes
--#
--CONFIG_IDE_GENERIC=y
--# CONFIG_BLK_DEV_PLATFORM is not set
--CONFIG_BLK_DEV_IDEDMA_SFF=y
--
--#
--# PCI IDE chipsets support
--#
--CONFIG_BLK_DEV_IDEPCI=y
--CONFIG_IDEPCI_PCIBUS_ORDER=y
--# CONFIG_BLK_DEV_OFFBOARD is not set
--CONFIG_BLK_DEV_GENERIC=y
--# CONFIG_BLK_DEV_OPTI621 is not set
--CONFIG_BLK_DEV_IDEDMA_PCI=y
--# CONFIG_BLK_DEV_AEC62XX is not set
--# CONFIG_BLK_DEV_ALI15X3 is not set
--# CONFIG_BLK_DEV_AMD74XX is not set
--# CONFIG_BLK_DEV_CMD64X is not set
--# CONFIG_BLK_DEV_TRIFLEX is not set
--# CONFIG_BLK_DEV_CS5520 is not set
--# CONFIG_BLK_DEV_CS5530 is not set
--# CONFIG_BLK_DEV_HPT366 is not set
--# CONFIG_BLK_DEV_JMICRON is not set
--# CONFIG_BLK_DEV_SC1200 is not set
--# CONFIG_BLK_DEV_PIIX is not set
--# CONFIG_BLK_DEV_IT8213 is not set
--# CONFIG_BLK_DEV_IT821X is not set
--# CONFIG_BLK_DEV_NS87415 is not set
--# CONFIG_BLK_DEV_PDC202XX_OLD is not set
--# CONFIG_BLK_DEV_PDC202XX_NEW is not set
--# CONFIG_BLK_DEV_SVWKS is not set
--# CONFIG_BLK_DEV_SIIMAGE is not set
--# CONFIG_BLK_DEV_SLC90E66 is not set
--# CONFIG_BLK_DEV_TRM290 is not set
--CONFIG_BLK_DEV_VIA82CXXX=y
--# CONFIG_BLK_DEV_TC86C001 is not set
--
--#
--# Other IDE chipsets support
--#
--
--#
--# Note: most of these also require special kernel boot parameters
--#
--# CONFIG_BLK_DEV_4DRIVES is not set
--# CONFIG_BLK_DEV_ALI14XX is not set
--# CONFIG_BLK_DEV_DTC2278 is not set
--# CONFIG_BLK_DEV_HT6560B is not set
--# CONFIG_BLK_DEV_QD65XX is not set
--# CONFIG_BLK_DEV_UMC8672 is not set
--CONFIG_BLK_DEV_IDEDMA=y
--
--#
--# SCSI device support
--#
--# CONFIG_RAID_ATTRS is not set
--CONFIG_SCSI=y
--CONFIG_SCSI_DMA=y
--# CONFIG_SCSI_TGT is not set
--# CONFIG_SCSI_NETLINK is not set
--CONFIG_SCSI_PROC_FS=y
--
--#
--# SCSI support type (disk, tape, CD-ROM)
--#
--CONFIG_BLK_DEV_SD=y
--# CONFIG_CHR_DEV_ST is not set
--# CONFIG_CHR_DEV_OSST is not set
--CONFIG_BLK_DEV_SR=y
--CONFIG_BLK_DEV_SR_VENDOR=y
--CONFIG_CHR_DEV_SG=y
--# CONFIG_CHR_DEV_SCH is not set
--
--#
--# Some SCSI devices (e.g. CD jukebox) support multiple LUNs
--#
--# CONFIG_SCSI_MULTI_LUN is not set
--CONFIG_SCSI_CONSTANTS=y
--# CONFIG_SCSI_LOGGING is not set
--# CONFIG_SCSI_SCAN_ASYNC is not set
--CONFIG_SCSI_WAIT_SCAN=m
--
--#
--# SCSI Transports
--#
--# CONFIG_SCSI_SPI_ATTRS is not set
--# CONFIG_SCSI_FC_ATTRS is not set
--# CONFIG_SCSI_ISCSI_ATTRS is not set
--# CONFIG_SCSI_SAS_ATTRS is not set
--# CONFIG_SCSI_SAS_LIBSAS is not set
--# CONFIG_SCSI_SRP_ATTRS is not set
--# CONFIG_SCSI_LOWLEVEL is not set
--# CONFIG_SCSI_DH is not set
--# CONFIG_ATA is not set
--# CONFIG_MD is not set
--# CONFIG_FUSION is not set
--
--#
--# IEEE 1394 (FireWire) support
--#
--
--#
--# Enable only one of the two stacks, unless you know what you are doing
--#
--# CONFIG_FIREWIRE is not set
--# CONFIG_IEEE1394 is not set
--# CONFIG_I2O is not set
--CONFIG_NETDEVICES=y
--# CONFIG_DUMMY is not set
--# CONFIG_BONDING is not set
--CONFIG_MACVLAN=m
--# CONFIG_EQUALIZER is not set
--# CONFIG_TUN is not set
--CONFIG_VETH=m
--# CONFIG_ARCNET is not set
--CONFIG_PHYLIB=m
--
--#
--# MII PHY device drivers
--#
--CONFIG_MARVELL_PHY=m
--CONFIG_DAVICOM_PHY=m
--CONFIG_QSEMI_PHY=m
--CONFIG_LXT_PHY=m
--CONFIG_CICADA_PHY=m
--# CONFIG_VITESSE_PHY is not set
--# CONFIG_SMSC_PHY is not set
--# CONFIG_BROADCOM_PHY is not set
--# CONFIG_ICPLUS_PHY is not set
--# CONFIG_REALTEK_PHY is not set
--# CONFIG_MDIO_BITBANG is not set
--CONFIG_NET_ETHERNET=y
--CONFIG_MII=y
--# CONFIG_AX88796 is not set
--# CONFIG_HAPPYMEAL is not set
--# CONFIG_SUNGEM is not set
--# CONFIG_CASSINI is not set
--# CONFIG_NET_VENDOR_3COM is not set
--# CONFIG_NET_VENDOR_SMC is not set
--# CONFIG_SMC91X is not set
--# CONFIG_DM9000 is not set
--# CONFIG_NET_VENDOR_RACAL is not set
--# CONFIG_NET_TULIP is not set
--# CONFIG_AT1700 is not set
--# CONFIG_DEPCA is not set
--# CONFIG_HP100 is not set
--# CONFIG_NET_ISA is not set
--# CONFIG_IBM_NEW_EMAC_ZMII is not set
--# CONFIG_IBM_NEW_EMAC_RGMII is not set
--# CONFIG_IBM_NEW_EMAC_TAH is not set
--# CONFIG_IBM_NEW_EMAC_EMAC4 is not set
--# CONFIG_IBM_NEW_EMAC_NO_FLOW_CTRL is not set
--# CONFIG_IBM_NEW_EMAC_MAL_CLR_ICINTSTAT is not set
--# CONFIG_IBM_NEW_EMAC_MAL_COMMON_ERR is not set
--CONFIG_NET_PCI=y
--# CONFIG_PCNET32 is not set
--# CONFIG_AMD8111_ETH is not set
--# CONFIG_ADAPTEC_STARFIRE is not set
--# CONFIG_AC3200 is not set
--# CONFIG_APRICOT is not set
--# CONFIG_B44 is not set
--# CONFIG_FORCEDETH is not set
--# CONFIG_CS89x0 is not set
--# CONFIG_TC35815 is not set
--# CONFIG_EEPRO100 is not set
--# CONFIG_E100 is not set
--# CONFIG_FEALNX is not set
--# CONFIG_NATSEMI is not set
--# CONFIG_NE2K_PCI is not set
--# CONFIG_8139CP is not set
--CONFIG_8139TOO=y
--# CONFIG_8139TOO_PIO is not set
--# CONFIG_8139TOO_TUNE_TWISTER is not set
--# CONFIG_8139TOO_8129 is not set
--# CONFIG_8139_OLD_RX_RESET is not set
--# CONFIG_R6040 is not set
--# CONFIG_SIS900 is not set
--# CONFIG_EPIC100 is not set
--# CONFIG_SUNDANCE is not set
--# CONFIG_TLAN is not set
--# CONFIG_VIA_RHINE is not set
--# CONFIG_SC92031 is not set
--# CONFIG_ATL2 is not set
--CONFIG_NETDEV_1000=y
--# CONFIG_ACENIC is not set
--# CONFIG_DL2K is not set
--# CONFIG_E1000 is not set
--# CONFIG_E1000E is not set
--# CONFIG_IP1000 is not set
--# CONFIG_IGB is not set
--# CONFIG_NS83820 is not set
--# CONFIG_HAMACHI is not set
--# CONFIG_YELLOWFIN is not set
--# CONFIG_R8169 is not set
--# CONFIG_SIS190 is not set
--# CONFIG_SKGE is not set
--# CONFIG_SKY2 is not set
--# CONFIG_VIA_VELOCITY is not set
--# CONFIG_TIGON3 is not set
--# CONFIG_BNX2 is not set
--# CONFIG_QLA3XXX is not set
--# CONFIG_ATL1 is not set
--# CONFIG_ATL1E is not set
--# CONFIG_JME is not set
--CONFIG_NETDEV_10000=y
--# CONFIG_CHELSIO_T1 is not set
--# CONFIG_CHELSIO_T3 is not set
--# CONFIG_ENIC is not set
--# CONFIG_IXGBE is not set
--# CONFIG_IXGB is not set
--# CONFIG_S2IO is not set
--# CONFIG_MYRI10GE is not set
--# CONFIG_NETXEN_NIC is not set
--# CONFIG_NIU is not set
--# CONFIG_MLX4_EN is not set
--# CONFIG_MLX4_CORE is not set
--# CONFIG_TEHUTI is not set
--# CONFIG_BNX2X is not set
--# CONFIG_QLGE is not set
--# CONFIG_SFC is not set
--# CONFIG_TR is not set
--
--#
--# Wireless LAN
--#
--# CONFIG_WLAN_PRE80211 is not set
--# CONFIG_WLAN_80211 is not set
--# CONFIG_IWLWIFI_LEDS is not set
--
--#
--# USB Network Adapters
--#
--# CONFIG_USB_CATC is not set
--# CONFIG_USB_KAWETH is not set
--# CONFIG_USB_PEGASUS is not set
--# CONFIG_USB_RTL8150 is not set
--# CONFIG_USB_USBNET is not set
--# CONFIG_WAN is not set
--# CONFIG_FDDI is not set
--# CONFIG_HIPPI is not set
--CONFIG_PPP=m
--CONFIG_PPP_MULTILINK=y
--CONFIG_PPP_FILTER=y
--CONFIG_PPP_ASYNC=m
--CONFIG_PPP_SYNC_TTY=m
--CONFIG_PPP_DEFLATE=m
--CONFIG_PPP_BSDCOMP=m
--CONFIG_PPP_MPPE=m
--CONFIG_PPPOE=m
--CONFIG_PPPOL2TP=m
--CONFIG_SLIP=m
--CONFIG_SLIP_COMPRESSED=y
--CONFIG_SLHC=m
--CONFIG_SLIP_SMART=y
--CONFIG_SLIP_MODE_SLIP6=y
--CONFIG_NET_FC=y
--# CONFIG_NETCONSOLE is not set
--# CONFIG_NETPOLL is not set
--# CONFIG_NET_POLL_CONTROLLER is not set
--# CONFIG_ISDN is not set
--# CONFIG_PHONE is not set
--
--#
--# Input device support
--#
--CONFIG_INPUT=y
--CONFIG_INPUT_FF_MEMLESS=y
--# CONFIG_INPUT_POLLDEV is not set
--
--#
--# Userland interfaces
--#
--CONFIG_INPUT_MOUSEDEV=y
--CONFIG_INPUT_MOUSEDEV_PSAUX=y
--CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024
--CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
--# CONFIG_INPUT_JOYDEV is not set
--# CONFIG_INPUT_EVDEV is not set
--# CONFIG_INPUT_EVBUG is not set
--
--#
--# Input Device Drivers
--#
--CONFIG_INPUT_KEYBOARD=y
--CONFIG_KEYBOARD_ATKBD=m
--# CONFIG_KEYBOARD_SUNKBD is not set
--# CONFIG_KEYBOARD_LKKBD is not set
--# CONFIG_KEYBOARD_XTKBD is not set
--# CONFIG_KEYBOARD_NEWTON is not set
--# CONFIG_KEYBOARD_STOWAWAY is not set
--CONFIG_INPUT_MOUSE=y
--CONFIG_MOUSE_PS2=y
--CONFIG_MOUSE_PS2_ALPS=y
--CONFIG_MOUSE_PS2_LOGIPS2PP=y
--CONFIG_MOUSE_PS2_SYNAPTICS=y
--CONFIG_MOUSE_PS2_LIFEBOOK=y
--CONFIG_MOUSE_PS2_TRACKPOINT=y
--# CONFIG_MOUSE_PS2_ELANTECH is not set
--# CONFIG_MOUSE_PS2_TOUCHKIT is not set
--CONFIG_MOUSE_SERIAL=y
--# CONFIG_MOUSE_APPLETOUCH is not set
--# CONFIG_MOUSE_BCM5974 is not set
--# CONFIG_MOUSE_INPORT is not set
--# CONFIG_MOUSE_LOGIBM is not set
--# CONFIG_MOUSE_PC110PAD is not set
--# CONFIG_MOUSE_VSXXXAA is not set
--# CONFIG_INPUT_JOYSTICK is not set
--# CONFIG_INPUT_TABLET is not set
--# CONFIG_INPUT_TOUCHSCREEN is not set
--# CONFIG_INPUT_MISC is not set
--
--#
--# Hardware I/O ports
--#
--CONFIG_SERIO=y
--CONFIG_SERIO_I8042=y
--CONFIG_SERIO_SERPORT=y
--# CONFIG_SERIO_PCIPS2 is not set
--CONFIG_SERIO_LIBPS2=y
--# CONFIG_SERIO_RAW is not set
--# CONFIG_GAMEPORT is not set
--
--#
--# Character devices
--#
--CONFIG_VT=y
--CONFIG_CONSOLE_TRANSLATIONS=y
--CONFIG_VT_CONSOLE=y
--CONFIG_HW_CONSOLE=y
--# CONFIG_VT_HW_CONSOLE_BINDING is not set
--CONFIG_DEVKMEM=y
--# CONFIG_SERIAL_NONSTANDARD is not set
--# CONFIG_NOZOMI is not set
--
--#
--# Serial drivers
--#
--CONFIG_SERIAL_8250=y
--CONFIG_SERIAL_8250_CONSOLE=y
--CONFIG_SERIAL_8250_PCI=y
--CONFIG_SERIAL_8250_NR_UARTS=2
--CONFIG_SERIAL_8250_RUNTIME_UARTS=2
--# CONFIG_SERIAL_8250_EXTENDED is not set
--
--#
--# Non-8250 serial port support
--#
--CONFIG_SERIAL_CORE=y
--CONFIG_SERIAL_CORE_CONSOLE=y
--# CONFIG_SERIAL_JSM is not set
--CONFIG_UNIX98_PTYS=y
--CONFIG_LEGACY_PTYS=y
--CONFIG_LEGACY_PTY_COUNT=256
--# CONFIG_IPMI_HANDLER is not set
--CONFIG_HW_RANDOM=y
--# CONFIG_DTLK is not set
--# CONFIG_R3964 is not set
--# CONFIG_APPLICOM is not set
--# CONFIG_RAW_DRIVER is not set
--# CONFIG_TCG_TPM is not set
--CONFIG_DEVPORT=y
--CONFIG_I2C=m
--CONFIG_I2C_BOARDINFO=y
--CONFIG_I2C_CHARDEV=m
--CONFIG_I2C_HELPER_AUTO=y
--
--#
--# I2C Hardware Bus support
--#
--
--#
--# PC SMBus host controller drivers
--#
--# CONFIG_I2C_ALI1535 is not set
--# CONFIG_I2C_ALI1563 is not set
--# CONFIG_I2C_ALI15X3 is not set
--# CONFIG_I2C_AMD756 is not set
--# CONFIG_I2C_AMD8111 is not set
--# CONFIG_I2C_I801 is not set
--# CONFIG_I2C_ISCH is not set
--# CONFIG_I2C_PIIX4 is not set
--# CONFIG_I2C_NFORCE2 is not set
--# CONFIG_I2C_SIS5595 is not set
--# CONFIG_I2C_SIS630 is not set
--# CONFIG_I2C_SIS96X is not set
--# CONFIG_I2C_VIA is not set
--CONFIG_I2C_VIAPRO=m
--
--#
--# I2C system bus drivers (mostly embedded / system-on-chip)
--#
--# CONFIG_I2C_OCORES is not set
--# CONFIG_I2C_SIMTEC is not set
--
--#
--# External I2C/SMBus adapter drivers
--#
--# CONFIG_I2C_PARPORT_LIGHT is not set
--# CONFIG_I2C_TAOS_EVM is not set
--# CONFIG_I2C_TINY_USB is not set
--
--#
--# Graphics adapter I2C/DDC channel drivers
--#
--# CONFIG_I2C_VOODOO3 is not set
--
--#
--# Other I2C/SMBus bus drivers
--#
--# CONFIG_I2C_ELEKTOR is not set
--# CONFIG_I2C_PCA_ISA is not set
--# CONFIG_I2C_PCA_PLATFORM is not set
--# CONFIG_I2C_STUB is not set
--
--#
--# Miscellaneous I2C Chip support
--#
--# CONFIG_DS1682 is not set
--# CONFIG_EEPROM_AT24 is not set
--# CONFIG_EEPROM_LEGACY is not set
--# CONFIG_SENSORS_PCF8574 is not set
--# CONFIG_PCF8575 is not set
--# CONFIG_SENSORS_PCA9539 is not set
--# CONFIG_SENSORS_PCF8591 is not set
--# CONFIG_SENSORS_MAX6875 is not set
--# CONFIG_SENSORS_TSL2550 is not set
--# CONFIG_I2C_DEBUG_CORE is not set
--# CONFIG_I2C_DEBUG_ALGO is not set
--# CONFIG_I2C_DEBUG_BUS is not set
--# CONFIG_I2C_DEBUG_CHIP is not set
--# CONFIG_SPI is not set
--# CONFIG_W1 is not set
--# CONFIG_POWER_SUPPLY is not set
--# CONFIG_HWMON is not set
--# CONFIG_THERMAL is not set
--# CONFIG_THERMAL_HWMON is not set
--# CONFIG_WATCHDOG is not set
--CONFIG_SSB_POSSIBLE=y
--
--#
--# Sonics Silicon Backplane
--#
--# CONFIG_SSB is not set
--
--#
--# Multifunction device drivers
--#
--# CONFIG_MFD_CORE is not set
--# CONFIG_MFD_SM501 is not set
--# CONFIG_HTC_PASIC3 is not set
--# CONFIG_MFD_TMIO is not set
--# CONFIG_MFD_WM8400 is not set
--# CONFIG_MFD_WM8350_I2C is not set
--# CONFIG_REGULATOR is not set
--
--#
--# Multimedia devices
--#
--
--#
--# Multimedia core support
--#
--CONFIG_VIDEO_DEV=m
--CONFIG_VIDEO_V4L2_COMMON=m
--CONFIG_VIDEO_ALLOW_V4L1=y
--CONFIG_VIDEO_V4L1_COMPAT=y
--# CONFIG_DVB_CORE is not set
--CONFIG_VIDEO_MEDIA=m
--
--#
--# Multimedia drivers
--#
--CONFIG_MEDIA_ATTACH=y
--CONFIG_MEDIA_TUNER=m
--CONFIG_MEDIA_TUNER_CUSTOMIZE=y
--CONFIG_MEDIA_TUNER_SIMPLE=m
--CONFIG_MEDIA_TUNER_TDA8290=m
--CONFIG_MEDIA_TUNER_TDA827X=m
--CONFIG_MEDIA_TUNER_TDA18271=m
--CONFIG_MEDIA_TUNER_TDA9887=m
--CONFIG_MEDIA_TUNER_TEA5761=m
--CONFIG_MEDIA_TUNER_TEA5767=m
--CONFIG_MEDIA_TUNER_MT20XX=m
--CONFIG_MEDIA_TUNER_MT2060=m
--CONFIG_MEDIA_TUNER_MT2266=m
--CONFIG_MEDIA_TUNER_MT2131=m
--CONFIG_MEDIA_TUNER_QT1010=m
--CONFIG_MEDIA_TUNER_XC2028=m
--CONFIG_MEDIA_TUNER_XC5000=m
--CONFIG_MEDIA_TUNER_MXL5005S=m
--CONFIG_MEDIA_TUNER_MXL5007T=m
--CONFIG_VIDEO_V4L2=m
--CONFIG_VIDEO_V4L1=m
--CONFIG_VIDEOBUF_GEN=m
--CONFIG_VIDEOBUF_VMALLOC=m
--CONFIG_VIDEOBUF_DMA_CONTIG=m
--CONFIG_VIDEO_CAPTURE_DRIVERS=y
--# CONFIG_VIDEO_ADV_DEBUG is not set
--# CONFIG_VIDEO_FIXED_MINOR_RANGES is not set
--CONFIG_VIDEO_HELPER_CHIPS_AUTO=y
--# CONFIG_VIDEO_VIVI is not set
--# CONFIG_VIDEO_BT848 is not set
--# CONFIG_VIDEO_PMS is not set
--# CONFIG_VIDEO_CPIA is not set
--# CONFIG_VIDEO_CPIA2 is not set
--# CONFIG_VIDEO_SAA5246A is not set
--# CONFIG_VIDEO_SAA5249 is not set
--# CONFIG_VIDEO_STRADIS is not set
--# CONFIG_VIDEO_SAA7134 is not set
--# CONFIG_VIDEO_MXB is not set
--# CONFIG_VIDEO_HEXIUM_ORION is not set
--# CONFIG_VIDEO_HEXIUM_GEMINI is not set
--# CONFIG_VIDEO_CX88 is not set
--# CONFIG_VIDEO_IVTV is not set
--# CONFIG_VIDEO_CAFE_CCIC is not set
--CONFIG_SOC_CAMERA=m
--CONFIG_SOC_CAMERA_MT9M001=m
--CONFIG_SOC_CAMERA_MT9M111=m
--CONFIG_SOC_CAMERA_MT9V022=m
--CONFIG_SOC_CAMERA_PLATFORM=m
--CONFIG_VIDEO_SH_MOBILE_CEU=m
--CONFIG_V4L_USB_DRIVERS=y
--CONFIG_USB_VIDEO_CLASS=m
--CONFIG_USB_VIDEO_CLASS_INPUT_EVDEV=y
--CONFIG_USB_GSPCA=m
--CONFIG_USB_M5602=m
--CONFIG_USB_GSPCA_CONEX=m
--CONFIG_USB_GSPCA_ETOMS=m
--CONFIG_USB_GSPCA_FINEPIX=m
--CONFIG_USB_GSPCA_MARS=m
--CONFIG_USB_GSPCA_OV519=m
--CONFIG_USB_GSPCA_PAC207=m
--CONFIG_USB_GSPCA_PAC7311=m
--CONFIG_USB_GSPCA_SONIXB=m
--CONFIG_USB_GSPCA_SONIXJ=m
--CONFIG_USB_GSPCA_SPCA500=m
--CONFIG_USB_GSPCA_SPCA501=m
--CONFIG_USB_GSPCA_SPCA505=m
--CONFIG_USB_GSPCA_SPCA506=m
--CONFIG_USB_GSPCA_SPCA508=m
--CONFIG_USB_GSPCA_SPCA561=m
--CONFIG_USB_GSPCA_STK014=m
--CONFIG_USB_GSPCA_SUNPLUS=m
--CONFIG_USB_GSPCA_T613=m
--CONFIG_USB_GSPCA_TV8532=m
--CONFIG_USB_GSPCA_VC032X=m
--CONFIG_USB_GSPCA_ZC3XX=m
--# CONFIG_VIDEO_PVRUSB2 is not set
--# CONFIG_VIDEO_EM28XX is not set
--# CONFIG_VIDEO_USBVISION is not set
--CONFIG_VIDEO_USBVIDEO=m
--CONFIG_USB_VICAM=m
--CONFIG_USB_IBMCAM=m
--CONFIG_USB_KONICAWC=m
--CONFIG_USB_QUICKCAM_MESSENGER=m
--CONFIG_USB_ET61X251=m
--# CONFIG_VIDEO_OVCAMCHIP is not set
--CONFIG_USB_OV511=m
--CONFIG_USB_SE401=m
--CONFIG_USB_SN9C102=m
--CONFIG_USB_STV680=m
--CONFIG_USB_ZC0301=m
--CONFIG_USB_PWC=m
--# CONFIG_USB_PWC_DEBUG is not set
--# CONFIG_USB_ZR364XX is not set
--CONFIG_USB_STKWEBCAM=m
--CONFIG_USB_S2255=m
--CONFIG_RADIO_ADAPTERS=y
--# CONFIG_RADIO_CADET is not set
--# CONFIG_RADIO_RTRACK is not set
--# CONFIG_RADIO_RTRACK2 is not set
--# CONFIG_RADIO_AZTECH is not set
--# CONFIG_RADIO_GEMTEK is not set
--# CONFIG_RADIO_GEMTEK_PCI is not set
--# CONFIG_RADIO_MAXIRADIO is not set
--# CONFIG_RADIO_MAESTRO is not set
--# CONFIG_RADIO_SF16FMI is not set
--# CONFIG_RADIO_SF16FMR2 is not set
--# CONFIG_RADIO_TERRATEC is not set
--# CONFIG_RADIO_TRUST is not set
--# CONFIG_RADIO_TYPHOON is not set
--# CONFIG_RADIO_ZOLTRIX is not set
--# CONFIG_USB_DSBR is not set
--CONFIG_USB_SI470X=m
--CONFIG_USB_MR800=m
--CONFIG_DAB=y
--# CONFIG_USB_DABUSB is not set
--
--#
--# Graphics support
--#
--# CONFIG_DRM is not set
--# CONFIG_VGASTATE is not set
--CONFIG_VIDEO_OUTPUT_CONTROL=m
--CONFIG_FB=y
--# CONFIG_FIRMWARE_EDID is not set
--# CONFIG_FB_DDC is not set
--# CONFIG_FB_BOOT_VESA_SUPPORT is not set
--CONFIG_FB_CFB_FILLRECT=y
--CONFIG_FB_CFB_COPYAREA=y
--CONFIG_FB_CFB_IMAGEBLIT=y
--# CONFIG_FB_CFB_REV_PIXELS_IN_BYTE is not set
--# CONFIG_FB_SYS_FILLRECT is not set
--# CONFIG_FB_SYS_COPYAREA is not set
--# CONFIG_FB_SYS_IMAGEBLIT is not set
--# CONFIG_FB_FOREIGN_ENDIAN is not set
--# CONFIG_FB_SYS_FOPS is not set
--# CONFIG_FB_SVGALIB is not set
--# CONFIG_FB_MACMODES is not set
--CONFIG_FB_BACKLIGHT=y
--CONFIG_FB_MODE_HELPERS=y
--# CONFIG_FB_TILEBLITTING is not set
--
--#
--# Frame buffer hardware drivers
--#
--# CONFIG_FB_CIRRUS is not set
--# CONFIG_FB_PM2 is not set
--# CONFIG_FB_CYBER2000 is not set
--# CONFIG_FB_ASILIANT is not set
--# CONFIG_FB_IMSTT is not set
--# CONFIG_FB_S1D13XXX is not set
--# CONFIG_FB_NVIDIA is not set
--# CONFIG_FB_RIVA is not set
--# CONFIG_FB_MATROX is not set
--CONFIG_FB_RADEON=y
--# CONFIG_FB_RADEON_I2C is not set
--CONFIG_FB_RADEON_BACKLIGHT=y
--# CONFIG_FB_RADEON_DEBUG is not set
--# CONFIG_FB_ATY128 is not set
--# CONFIG_FB_ATY is not set
--# CONFIG_FB_S3 is not set
--# CONFIG_FB_SAVAGE is not set
--# CONFIG_FB_SIS is not set
--# CONFIG_FB_VIA is not set
--# CONFIG_FB_NEOMAGIC is not set
--# CONFIG_FB_KYRO is not set
--# CONFIG_FB_3DFX is not set
--# CONFIG_FB_VOODOO1 is not set
--# CONFIG_FB_VT8623 is not set
--# CONFIG_FB_TRIDENT is not set
--# CONFIG_FB_ARK is not set
--# CONFIG_FB_PM3 is not set
--# CONFIG_FB_CARMINE is not set
--# CONFIG_FB_VIRTUAL is not set
--# CONFIG_FB_METRONOME is not set
--# CONFIG_FB_MB862XX is not set
--CONFIG_BACKLIGHT_LCD_SUPPORT=y
--CONFIG_LCD_CLASS_DEVICE=m
--# CONFIG_LCD_ILI9320 is not set
--# CONFIG_LCD_PLATFORM is not set
--CONFIG_BACKLIGHT_CLASS_DEVICE=y
--# CONFIG_BACKLIGHT_CORGI is not set
--
--#
--# Display device support
--#
--# CONFIG_DISPLAY_SUPPORT is not set
--
--#
--# Console display driver support
--#
--# CONFIG_VGA_CONSOLE is not set
--# CONFIG_MDA_CONSOLE is not set
--CONFIG_DUMMY_CONSOLE=y
--CONFIG_FRAMEBUFFER_CONSOLE=y
--# CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY is not set
--# CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set
--# CONFIG_FONTS is not set
--CONFIG_FONT_8x8=y
--CONFIG_FONT_8x16=y
--# CONFIG_LOGO is not set
--CONFIG_SOUND=y
--CONFIG_SOUND_OSS_CORE=y
--CONFIG_SND=m
--CONFIG_SND_TIMER=m
--CONFIG_SND_PCM=m
--CONFIG_SND_RAWMIDI=m
--CONFIG_SND_SEQUENCER=m
--CONFIG_SND_SEQ_DUMMY=m
--CONFIG_SND_OSSEMUL=y
--CONFIG_SND_MIXER_OSS=m
--CONFIG_SND_PCM_OSS=m
--CONFIG_SND_PCM_OSS_PLUGINS=y
--CONFIG_SND_SEQUENCER_OSS=y
--# CONFIG_SND_DYNAMIC_MINORS is not set
--CONFIG_SND_SUPPORT_OLD_API=y
--CONFIG_SND_VERBOSE_PROCFS=y
--# CONFIG_SND_VERBOSE_PRINTK is not set
--# CONFIG_SND_DEBUG is not set
--CONFIG_SND_VMASTER=y
--CONFIG_SND_MPU401_UART=m
--CONFIG_SND_AC97_CODEC=m
--CONFIG_SND_DRIVERS=y
--# CONFIG_SND_DUMMY is not set
--# CONFIG_SND_VIRMIDI is not set
--# CONFIG_SND_MTPAV is not set
--# CONFIG_SND_SERIAL_U16550 is not set
--# CONFIG_SND_MPU401 is not set
--# CONFIG_SND_AC97_POWER_SAVE is not set
--CONFIG_SND_PCI=y
--# CONFIG_SND_AD1889 is not set
--# CONFIG_SND_ALS300 is not set
--# CONFIG_SND_ALI5451 is not set
--# CONFIG_SND_ATIIXP is not set
--# CONFIG_SND_ATIIXP_MODEM is not set
--# CONFIG_SND_AU8810 is not set
--# CONFIG_SND_AU8820 is not set
--# CONFIG_SND_AU8830 is not set
--# CONFIG_SND_AW2 is not set
--# CONFIG_SND_AZT3328 is not set
--# CONFIG_SND_BT87X is not set
--# CONFIG_SND_CA0106 is not set
--# CONFIG_SND_CMIPCI is not set
--# CONFIG_SND_OXYGEN is not set
--# CONFIG_SND_CS4281 is not set
--# CONFIG_SND_CS46XX is not set
--# CONFIG_SND_DARLA20 is not set
--# CONFIG_SND_GINA20 is not set
--# CONFIG_SND_LAYLA20 is not set
--# CONFIG_SND_DARLA24 is not set
--# CONFIG_SND_GINA24 is not set
--# CONFIG_SND_LAYLA24 is not set
--# CONFIG_SND_MONA is not set
--# CONFIG_SND_MIA is not set
--# CONFIG_SND_ECHO3G is not set
--# CONFIG_SND_INDIGO is not set
--# CONFIG_SND_INDIGOIO is not set
--# CONFIG_SND_INDIGODJ is not set
--# CONFIG_SND_EMU10K1 is not set
--# CONFIG_SND_EMU10K1X is not set
--# CONFIG_SND_ENS1370 is not set
--# CONFIG_SND_ENS1371 is not set
--# CONFIG_SND_ES1938 is not set
--# CONFIG_SND_ES1968 is not set
--# CONFIG_SND_FM801 is not set
--# CONFIG_SND_HDA_INTEL is not set
--# CONFIG_SND_HDSP is not set
--# CONFIG_SND_HDSPM is not set
--# CONFIG_SND_HIFIER is not set
--# CONFIG_SND_ICE1712 is not set
--# CONFIG_SND_ICE1724 is not set
--# CONFIG_SND_INTEL8X0 is not set
--# CONFIG_SND_INTEL8X0M is not set
--# CONFIG_SND_KORG1212 is not set
--# CONFIG_SND_MAESTRO3 is not set
--# CONFIG_SND_MIXART is not set
--# CONFIG_SND_NM256 is not set
--# CONFIG_SND_PCXHR is not set
--# CONFIG_SND_RIPTIDE is not set
--# CONFIG_SND_RME32 is not set
--# CONFIG_SND_RME96 is not set
--# CONFIG_SND_RME9652 is not set
--# CONFIG_SND_SONICVIBES is not set
--# CONFIG_SND_TRIDENT is not set
--CONFIG_SND_VIA82XX=m
--# CONFIG_SND_VIA82XX_MODEM is not set
--# CONFIG_SND_VIRTUOSO is not set
--# CONFIG_SND_VX222 is not set
--# CONFIG_SND_YMFPCI is not set
--CONFIG_SND_MIPS=y
--CONFIG_SND_USB=y
--# CONFIG_SND_USB_AUDIO is not set
--# CONFIG_SND_USB_CAIAQ is not set
--# CONFIG_SND_SOC is not set
--# CONFIG_SOUND_PRIME is not set
--CONFIG_AC97_BUS=m
--CONFIG_HID_SUPPORT=y
--CONFIG_HID=y
--# CONFIG_HID_DEBUG is not set
--CONFIG_HIDRAW=y
--
--#
--# USB Input Devices
--#
--CONFIG_USB_HID=m
--CONFIG_HID_PID=y
--CONFIG_USB_HIDDEV=y
--
--#
--# USB HID Boot Protocol drivers
--#
--# CONFIG_USB_KBD is not set
--# CONFIG_USB_MOUSE is not set
--
--#
--# Special HID drivers
--#
--CONFIG_HID_COMPAT=y
--CONFIG_HID_A4TECH=m
--CONFIG_HID_APPLE=m
--CONFIG_HID_BELKIN=m
--CONFIG_HID_BRIGHT=m
--CONFIG_HID_CHERRY=m
--CONFIG_HID_CHICONY=m
--CONFIG_HID_CYPRESS=m
--CONFIG_HID_DELL=m
--CONFIG_HID_EZKEY=m
--CONFIG_HID_GYRATION=m
--CONFIG_HID_LOGITECH=m
--CONFIG_LOGITECH_FF=y
--CONFIG_LOGIRUMBLEPAD2_FF=y
--CONFIG_HID_MICROSOFT=m
--CONFIG_HID_MONTEREY=m
--CONFIG_HID_PANTHERLORD=m
--# CONFIG_PANTHERLORD_FF is not set
--CONFIG_HID_PETALYNX=m
--CONFIG_HID_SAMSUNG=m
--CONFIG_HID_SONY=m
--CONFIG_HID_SUNPLUS=m
--# CONFIG_THRUSTMASTER_FF is not set
--CONFIG_ZEROPLUS_FF=m
--CONFIG_USB_SUPPORT=y
--CONFIG_USB_ARCH_HAS_HCD=y
--CONFIG_USB_ARCH_HAS_OHCI=y
--CONFIG_USB_ARCH_HAS_EHCI=y
--CONFIG_USB=y
--# CONFIG_USB_DEBUG is not set
--CONFIG_USB_ANNOUNCE_NEW_DEVICES=y
--
--#
--# Miscellaneous USB options
--#
--CONFIG_USB_DEVICEFS=y
--# CONFIG_USB_DEVICE_CLASS is not set
--# CONFIG_USB_DYNAMIC_MINORS is not set
--# CONFIG_USB_SUSPEND is not set
--# CONFIG_USB_OTG is not set
--CONFIG_USB_OTG_WHITELIST=y
--# CONFIG_USB_OTG_BLACKLIST_HUB is not set
--# CONFIG_USB_MON is not set
--# CONFIG_USB_WUSB is not set
--CONFIG_USB_WUSB_CBAF=m
--# CONFIG_USB_WUSB_CBAF_DEBUG is not set
--
--#
--# USB Host Controller Drivers
--#
--CONFIG_USB_C67X00_HCD=m
--CONFIG_USB_EHCI_HCD=y
--CONFIG_USB_EHCI_ROOT_HUB_TT=y
--CONFIG_USB_EHCI_TT_NEWSCHED=y
--# CONFIG_USB_ISP116X_HCD is not set
--CONFIG_USB_ISP1760_HCD=m
--CONFIG_USB_OHCI_HCD=y
--# CONFIG_USB_OHCI_BIG_ENDIAN_DESC is not set
--# CONFIG_USB_OHCI_BIG_ENDIAN_MMIO is not set
--CONFIG_USB_OHCI_LITTLE_ENDIAN=y
--CONFIG_USB_UHCI_HCD=m
--# CONFIG_USB_SL811_HCD is not set
--CONFIG_USB_R8A66597_HCD=m
--# CONFIG_USB_WHCI_HCD is not set
--# CONFIG_USB_HWA_HCD is not set
--
--#
--# USB Device Class drivers
--#
--CONFIG_USB_ACM=y
--CONFIG_USB_PRINTER=y
--CONFIG_USB_WDM=m
--CONFIG_USB_TMC=m
--
--#
--# NOTE: USB_STORAGE depends on SCSI but BLK_DEV_SD may also be needed;
--#
--
--#
--# see USB_STORAGE Help for more information
--#
--CONFIG_USB_STORAGE=y
--# CONFIG_USB_STORAGE_DEBUG is not set
--# CONFIG_USB_STORAGE_DATAFAB is not set
--# CONFIG_USB_STORAGE_FREECOM is not set
--# CONFIG_USB_STORAGE_ISD200 is not set
--# CONFIG_USB_STORAGE_DPCM is not set
--# CONFIG_USB_STORAGE_USBAT is not set
--# CONFIG_USB_STORAGE_SDDR09 is not set
--# CONFIG_USB_STORAGE_SDDR55 is not set
--# CONFIG_USB_STORAGE_JUMPSHOT is not set
--# CONFIG_USB_STORAGE_ALAUDA is not set
--CONFIG_USB_STORAGE_ONETOUCH=y
--# CONFIG_USB_STORAGE_KARMA is not set
--CONFIG_USB_STORAGE_CYPRESS_ATACB=y
--CONFIG_USB_LIBUSUAL=y
--
--#
--# USB Imaging devices
--#
--# CONFIG_USB_MDC800 is not set
--# CONFIG_USB_MICROTEK is not set
--
--#
--# USB port drivers
--#
--# CONFIG_USB_SERIAL is not set
--
--#
--# USB Miscellaneous drivers
--#
--# CONFIG_USB_EMI62 is not set
--# CONFIG_USB_EMI26 is not set
--# CONFIG_USB_ADUTUX is not set
--CONFIG_USB_SEVSEG=m
--# CONFIG_USB_RIO500 is not set
--# CONFIG_USB_LEGOTOWER is not set
--# CONFIG_USB_LCD is not set
--# CONFIG_USB_BERRY_CHARGE is not set
--# CONFIG_USB_LED is not set
--# CONFIG_USB_CYPRESS_CY7C63 is not set
--# CONFIG_USB_CYTHERM is not set
--# CONFIG_USB_PHIDGET is not set
--# CONFIG_USB_IDMOUSE is not set
--# CONFIG_USB_FTDI_ELAN is not set
--# CONFIG_USB_APPLEDISPLAY is not set
--# CONFIG_USB_SISUSBVGA is not set
--# CONFIG_USB_LD is not set
--# CONFIG_USB_TRANCEVIBRATOR is not set
--# CONFIG_USB_IOWARRIOR is not set
--# CONFIG_USB_TEST is not set
--CONFIG_USB_ISIGHTFW=m
--CONFIG_USB_VST=m
--# CONFIG_USB_GADGET is not set
--# CONFIG_UWB is not set
--# CONFIG_MMC is not set
--# CONFIG_MEMSTICK is not set
--# CONFIG_NEW_LEDS is not set
--# CONFIG_ACCESSIBILITY is not set
--# CONFIG_INFINIBAND is not set
--CONFIG_RTC_LIB=y
--CONFIG_RTC_CLASS=m
--
--#
--# RTC interfaces
--#
--CONFIG_RTC_INTF_SYSFS=y
--CONFIG_RTC_INTF_PROC=y
--CONFIG_RTC_INTF_DEV=y
--CONFIG_RTC_INTF_DEV_UIE_EMUL=y
--# CONFIG_RTC_DRV_TEST is not set
--
--#
--# I2C RTC drivers
--#
--# CONFIG_RTC_DRV_DS1307 is not set
--# CONFIG_RTC_DRV_DS1374 is not set
--# CONFIG_RTC_DRV_DS1672 is not set
--# CONFIG_RTC_DRV_MAX6900 is not set
--# CONFIG_RTC_DRV_RS5C372 is not set
--# CONFIG_RTC_DRV_ISL1208 is not set
--# CONFIG_RTC_DRV_X1205 is not set
--# CONFIG_RTC_DRV_PCF8563 is not set
--# CONFIG_RTC_DRV_PCF8583 is not set
--# CONFIG_RTC_DRV_M41T80 is not set
--# CONFIG_RTC_DRV_S35390A is not set
--# CONFIG_RTC_DRV_FM3130 is not set
--# CONFIG_RTC_DRV_RX8581 is not set
--
--#
--# SPI RTC drivers
--#
--
--#
--# Platform RTC drivers
--#
--CONFIG_RTC_DRV_CMOS=m
--# CONFIG_RTC_DRV_DS1286 is not set
--# CONFIG_RTC_DRV_DS1511 is not set
--# CONFIG_RTC_DRV_DS1553 is not set
--# CONFIG_RTC_DRV_DS1742 is not set
--# CONFIG_RTC_DRV_STK17TA8 is not set
--# CONFIG_RTC_DRV_M48T86 is not set
--# CONFIG_RTC_DRV_M48T35 is not set
--# CONFIG_RTC_DRV_M48T59 is not set
--# CONFIG_RTC_DRV_BQ4802 is not set
--# CONFIG_RTC_DRV_V3020 is not set
--
--#
--# on-CPU RTC drivers
--#
--# CONFIG_DMADEVICES is not set
--CONFIG_UIO=m
--CONFIG_UIO_CIF=m
--# CONFIG_UIO_PDRV is not set
--# CONFIG_UIO_PDRV_GENIRQ is not set
--# CONFIG_UIO_SMX is not set
--# CONFIG_UIO_SERCOS3 is not set
--# CONFIG_STAGING is not set
--CONFIG_STAGING_EXCLUDE_BUILD=y
--
--#
--# File systems
--#
--CONFIG_EXT2_FS=y
--# CONFIG_EXT2_FS_XATTR is not set
--CONFIG_EXT2_FS_XIP=y
--CONFIG_EXT3_FS=y
--# CONFIG_EXT3_FS_XATTR is not set
--CONFIG_EXT4_FS=m
--CONFIG_EXT4DEV_COMPAT=y
--CONFIG_EXT4_FS_XATTR=y
--CONFIG_EXT4_FS_POSIX_ACL=y
--CONFIG_EXT4_FS_SECURITY=y
--CONFIG_FS_XIP=y
--CONFIG_JBD=y
--CONFIG_JBD2=m
--CONFIG_FS_MBCACHE=m
--CONFIG_REISERFS_FS=m
--# CONFIG_REISERFS_CHECK is not set
--# CONFIG_REISERFS_PROC_INFO is not set
--# CONFIG_REISERFS_FS_XATTR is not set
--# CONFIG_JFS_FS is not set
--CONFIG_FS_POSIX_ACL=y
--CONFIG_FILE_LOCKING=y
--# CONFIG_XFS_FS is not set
--# CONFIG_GFS2_FS is not set
--# CONFIG_OCFS2_FS is not set
--CONFIG_DNOTIFY=y
--CONFIG_INOTIFY=y
--CONFIG_INOTIFY_USER=y
--# CONFIG_QUOTA is not set
--CONFIG_AUTOFS_FS=y
--CONFIG_AUTOFS4_FS=y
--CONFIG_FUSE_FS=y
--
--#
--# CD-ROM/DVD Filesystems
--#
--CONFIG_ISO9660_FS=m
--CONFIG_JOLIET=y
--CONFIG_ZISOFS=y
--CONFIG_UDF_FS=m
--CONFIG_UDF_NLS=y
--
--#
--# DOS/FAT/NT Filesystems
--#
--CONFIG_FAT_FS=m
--CONFIG_MSDOS_FS=m
--CONFIG_VFAT_FS=m
--CONFIG_FAT_DEFAULT_CODEPAGE=936
--CONFIG_FAT_DEFAULT_IOCHARSET="utf8"
--CONFIG_NTFS_FS=m
--# CONFIG_NTFS_DEBUG is not set
--CONFIG_NTFS_RW=y
--
--#
--# Pseudo filesystems
--#
--CONFIG_PROC_FS=y
--CONFIG_PROC_KCORE=y
--CONFIG_PROC_SYSCTL=y
--CONFIG_PROC_PAGE_MONITOR=y
--CONFIG_SYSFS=y
--CONFIG_TMPFS=y
--# CONFIG_TMPFS_POSIX_ACL is not set
--# CONFIG_HUGETLB_PAGE is not set
--# CONFIG_CONFIGFS_FS is not set
--
--#
--# Miscellaneous filesystems
--#
--# CONFIG_ADFS_FS is not set
--# CONFIG_AFFS_FS is not set
--# CONFIG_HFS_FS is not set
--# CONFIG_HFSPLUS_FS is not set
--# CONFIG_BEFS_FS is not set
--# CONFIG_BFS_FS is not set
--# CONFIG_EFS_FS is not set
--# CONFIG_JFFS2_FS is not set
--# CONFIG_CRAMFS is not set
--# CONFIG_VXFS_FS is not set
--# CONFIG_MINIX_FS is not set
--CONFIG_OMFS_FS=m
--# CONFIG_HPFS_FS is not set
--# CONFIG_QNX4FS_FS is not set
--# CONFIG_ROMFS_FS is not set
--# CONFIG_SYSV_FS is not set
--# CONFIG_UFS_FS is not set
--CONFIG_NETWORK_FILESYSTEMS=y
--CONFIG_NFS_FS=m
--CONFIG_NFS_V3=y
--CONFIG_NFS_V3_ACL=y
--CONFIG_NFS_V4=y
--CONFIG_NFSD=m
--CONFIG_NFSD_V2_ACL=y
--CONFIG_NFSD_V3=y
--CONFIG_NFSD_V3_ACL=y
--CONFIG_NFSD_V4=y
--CONFIG_LOCKD=m
--CONFIG_LOCKD_V4=y
--CONFIG_EXPORTFS=m
--CONFIG_NFS_ACL_SUPPORT=m
--CONFIG_NFS_COMMON=y
--CONFIG_SUNRPC=m
--CONFIG_SUNRPC_GSS=m
--# CONFIG_SUNRPC_REGISTER_V4 is not set
--CONFIG_RPCSEC_GSS_KRB5=m
--# CONFIG_RPCSEC_GSS_SPKM3 is not set
--CONFIG_SMB_FS=m
--CONFIG_SMB_NLS_DEFAULT=y
--CONFIG_SMB_NLS_REMOTE="cp936"
--CONFIG_CIFS=m
--CONFIG_CIFS_STATS=y
--CONFIG_CIFS_STATS2=y
--CONFIG_CIFS_WEAK_PW_HASH=y
--CONFIG_CIFS_XATTR=y
--CONFIG_CIFS_POSIX=y
--CONFIG_CIFS_DEBUG2=y
--CONFIG_CIFS_EXPERIMENTAL=y
--# CONFIG_NCP_FS is not set
--# CONFIG_CODA_FS is not set
--# CONFIG_AFS_FS is not set
--# CONFIG_9P_FS is not set
--
--#
--# Partition Types
--#
--CONFIG_PARTITION_ADVANCED=y
--# CONFIG_ACORN_PARTITION is not set
--# CONFIG_OSF_PARTITION is not set
--# CONFIG_AMIGA_PARTITION is not set
--# CONFIG_ATARI_PARTITION is not set
--# CONFIG_MAC_PARTITION is not set
--CONFIG_MSDOS_PARTITION=y
--# CONFIG_BSD_DISKLABEL is not set
--# CONFIG_MINIX_SUBPARTITION is not set
--# CONFIG_SOLARIS_X86_PARTITION is not set
--# CONFIG_UNIXWARE_DISKLABEL is not set
--# CONFIG_LDM_PARTITION is not set
--# CONFIG_SGI_PARTITION is not set
--# CONFIG_ULTRIX_PARTITION is not set
--# CONFIG_SUN_PARTITION is not set
--# CONFIG_KARMA_PARTITION is not set
--# CONFIG_EFI_PARTITION is not set
--# CONFIG_SYSV68_PARTITION is not set
--CONFIG_NLS=y
--CONFIG_NLS_DEFAULT="utf8"
--# CONFIG_NLS_CODEPAGE_437 is not set
--# CONFIG_NLS_CODEPAGE_737 is not set
--# CONFIG_NLS_CODEPAGE_775 is not set
--# CONFIG_NLS_CODEPAGE_850 is not set
--# CONFIG_NLS_CODEPAGE_852 is not set
--# CONFIG_NLS_CODEPAGE_855 is not set
--# CONFIG_NLS_CODEPAGE_857 is not set
--# CONFIG_NLS_CODEPAGE_860 is not set
--# CONFIG_NLS_CODEPAGE_861 is not set
--# CONFIG_NLS_CODEPAGE_862 is not set
--# CONFIG_NLS_CODEPAGE_863 is not set
--# CONFIG_NLS_CODEPAGE_864 is not set
--# CONFIG_NLS_CODEPAGE_865 is not set
--# CONFIG_NLS_CODEPAGE_866 is not set
--# CONFIG_NLS_CODEPAGE_869 is not set
--CONFIG_NLS_CODEPAGE_936=y
--# CONFIG_NLS_CODEPAGE_950 is not set
--# CONFIG_NLS_CODEPAGE_932 is not set
--# CONFIG_NLS_CODEPAGE_949 is not set
--# CONFIG_NLS_CODEPAGE_874 is not set
--# CONFIG_NLS_ISO8859_8 is not set
--# CONFIG_NLS_CODEPAGE_1250 is not set
--# CONFIG_NLS_CODEPAGE_1251 is not set
--# CONFIG_NLS_ASCII is not set
--CONFIG_NLS_ISO8859_1=y
--# CONFIG_NLS_ISO8859_2 is not set
--# CONFIG_NLS_ISO8859_3 is not set
--# CONFIG_NLS_ISO8859_4 is not set
--# CONFIG_NLS_ISO8859_5 is not set
--# CONFIG_NLS_ISO8859_6 is not set
--# CONFIG_NLS_ISO8859_7 is not set
--# CONFIG_NLS_ISO8859_9 is not set
--# CONFIG_NLS_ISO8859_13 is not set
--# CONFIG_NLS_ISO8859_14 is not set
--# CONFIG_NLS_ISO8859_15 is not set
--# CONFIG_NLS_KOI8_R is not set
--# CONFIG_NLS_KOI8_U is not set
--CONFIG_NLS_UTF8=y
--# CONFIG_DLM is not set
--
--#
--# Kernel hacking
--#
--CONFIG_TRACE_IRQFLAGS_SUPPORT=y
--# CONFIG_PRINTK_TIME is not set
--CONFIG_ENABLE_WARN_DEPRECATED=y
--# CONFIG_ENABLE_MUST_CHECK is not set
--CONFIG_FRAME_WARN=2048
--# CONFIG_MAGIC_SYSRQ is not set
--# CONFIG_UNUSED_SYMBOLS is not set
--# CONFIG_DEBUG_FS is not set
--# CONFIG_HEADERS_CHECK is not set
--# CONFIG_DEBUG_KERNEL is not set
--# CONFIG_DEBUG_MEMORY_INIT is not set
--# CONFIG_RCU_CPU_STALL_DETECTOR is not set
--CONFIG_SYSCTL_SYSCALL_CHECK=y
--
--#
--# Tracers
--#
--CONFIG_DYNAMIC_PRINTK_DEBUG=y
--# CONFIG_SAMPLES is not set
--CONFIG_HAVE_ARCH_KGDB=y
--CONFIG_CMDLINE=""
--
--#
--# Security options
--#
--# CONFIG_KEYS is not set
--# CONFIG_SECURITY is not set
--# CONFIG_SECURITYFS is not set
--CONFIG_SECURITY_FILE_CAPABILITIES=y
--CONFIG_CRYPTO=y
--
--#
--# Crypto core or helper
--#
--CONFIG_CRYPTO_FIPS=y
--CONFIG_CRYPTO_ALGAPI=y
--CONFIG_CRYPTO_AEAD=y
--CONFIG_CRYPTO_BLKCIPHER=y
--CONFIG_CRYPTO_HASH=y
--CONFIG_CRYPTO_RNG=y
--CONFIG_CRYPTO_MANAGER=y
--CONFIG_CRYPTO_GF128MUL=m
--# CONFIG_CRYPTO_NULL is not set
--# CONFIG_CRYPTO_CRYPTD is not set
--CONFIG_CRYPTO_AUTHENC=m
--# CONFIG_CRYPTO_TEST is not set
--
--#
--# Authenticated Encryption with Associated Data
--#
--CONFIG_CRYPTO_CCM=m
--CONFIG_CRYPTO_GCM=m
--CONFIG_CRYPTO_SEQIV=m
--
--#
--# Block modes
--#
--CONFIG_CRYPTO_CBC=m
--CONFIG_CRYPTO_CTR=m
--CONFIG_CRYPTO_CTS=m
--CONFIG_CRYPTO_ECB=m
--# CONFIG_CRYPTO_LRW is not set
--CONFIG_CRYPTO_PCBC=m
--CONFIG_CRYPTO_XTS=m
--
--#
--# Hash modes
--#
--CONFIG_CRYPTO_HMAC=y
--# CONFIG_CRYPTO_XCBC is not set
--
--#
--# Digest
--#
--# CONFIG_CRYPTO_CRC32C is not set
--# CONFIG_CRYPTO_MD4 is not set
--CONFIG_CRYPTO_MD5=m
--# CONFIG_CRYPTO_MICHAEL_MIC is not set
--CONFIG_CRYPTO_RMD128=m
--CONFIG_CRYPTO_RMD160=m
--CONFIG_CRYPTO_RMD256=m
--CONFIG_CRYPTO_RMD320=m
--CONFIG_CRYPTO_SHA1=m
--# CONFIG_CRYPTO_SHA256 is not set
--# CONFIG_CRYPTO_SHA512 is not set
--# CONFIG_CRYPTO_TGR192 is not set
--# CONFIG_CRYPTO_WP512 is not set
--
--#
--# Ciphers
--#
--CONFIG_CRYPTO_AES=m
--# CONFIG_CRYPTO_ANUBIS is not set
--CONFIG_CRYPTO_ARC4=m
--# CONFIG_CRYPTO_BLOWFISH is not set
--# CONFIG_CRYPTO_CAMELLIA is not set
--# CONFIG_CRYPTO_CAST5 is not set
--# CONFIG_CRYPTO_CAST6 is not set
--CONFIG_CRYPTO_DES=m
--# CONFIG_CRYPTO_FCRYPT is not set
--# CONFIG_CRYPTO_KHAZAD is not set
--CONFIG_CRYPTO_SALSA20=m
--CONFIG_CRYPTO_SEED=m
--# CONFIG_CRYPTO_SERPENT is not set
--# CONFIG_CRYPTO_TEA is not set
--# CONFIG_CRYPTO_TWOFISH is not set
--
--#
--# Compression
--#
--CONFIG_CRYPTO_DEFLATE=m
--CONFIG_CRYPTO_LZO=m
--
--#
--# Random Number Generation
--#
--CONFIG_CRYPTO_ANSI_CPRNG=m
--# CONFIG_CRYPTO_HW is not set
--
--#
--# Library routines
--#
--CONFIG_BITREVERSE=y
--CONFIG_CRC_CCITT=y
--CONFIG_CRC16=m
--# CONFIG_CRC_T10DIF is not set
--CONFIG_CRC_ITU_T=m
--CONFIG_CRC32=y
--CONFIG_CRC7=m
--# CONFIG_LIBCRC32C is not set
--CONFIG_ZLIB_INFLATE=m
--CONFIG_ZLIB_DEFLATE=m
--CONFIG_LZO_COMPRESS=m
--CONFIG_LZO_DECOMPRESS=m
--CONFIG_TEXTSEARCH=y
--CONFIG_TEXTSEARCH_KMP=m
--CONFIG_TEXTSEARCH_BM=m
--CONFIG_TEXTSEARCH_FSM=m
--CONFIG_PLIST=y
--CONFIG_HAS_IOMEM=y
--CONFIG_HAS_IOPORT=y
--CONFIG_HAS_DMA=y
-diff -Nur linux-2.6.30.5.orig/arch/mips/configs/fuloong2e_defconfig linux-2.6.30.5/arch/mips/configs/fuloong2e_defconfig
---- linux-2.6.30.5.orig/arch/mips/configs/fuloong2e_defconfig 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.30.5/arch/mips/configs/fuloong2e_defconfig 2009-08-23 19:01:04.000000000 +0200
-@@ -0,0 +1,1919 @@
-+#
-+# Automatically generated make config: don't edit
-+# Linux kernel version: 2.6.31-rc1
-+# Tue Jun 30 15:37:31 2009
-+#
-+CONFIG_MIPS=y
-+
-+#
-+# Machine selection
-+#
-+# CONFIG_MACH_ALCHEMY is not set
-+# CONFIG_AR7 is not set
-+# CONFIG_BASLER_EXCITE is not set
-+# CONFIG_BCM47XX is not set
-+# CONFIG_MIPS_COBALT is not set
-+# CONFIG_MACH_DECSTATION is not set
-+# CONFIG_MACH_JAZZ is not set
-+# CONFIG_LASAT is not set
-+CONFIG_MACH_LOONGSON=y
-+# CONFIG_MIPS_MALTA is not set
-+# CONFIG_MIPS_SIM is not set
-+# CONFIG_NEC_MARKEINS is not set
-+# CONFIG_MACH_VR41XX is not set
-+# CONFIG_NXP_STB220 is not set
-+# CONFIG_NXP_STB225 is not set
-+# CONFIG_PNX8550_JBS is not set
-+# CONFIG_PNX8550_STB810 is not set
-+# CONFIG_PMC_MSP is not set
-+# CONFIG_PMC_YOSEMITE is not set
-+# CONFIG_SGI_IP22 is not set
-+# CONFIG_SGI_IP27 is not set
-+# CONFIG_SGI_IP28 is not set
-+# CONFIG_SGI_IP32 is not set
-+# CONFIG_SIBYTE_CRHINE is not set
-+# CONFIG_SIBYTE_CARMEL is not set
-+# CONFIG_SIBYTE_CRHONE is not set
-+# CONFIG_SIBYTE_RHONE is not set
-+# CONFIG_SIBYTE_SWARM is not set
-+# CONFIG_SIBYTE_LITTLESUR is not set
-+# CONFIG_SIBYTE_SENTOSA is not set
-+# CONFIG_SIBYTE_BIGSUR is not set
-+# CONFIG_SNI_RM is not set
-+# CONFIG_MACH_TX39XX is not set
-+# CONFIG_MACH_TX49XX is not set
-+# CONFIG_MIKROTIK_RB532 is not set
-+# CONFIG_WR_PPMC is not set
-+# CONFIG_CAVIUM_OCTEON_SIMULATOR is not set
-+# CONFIG_CAVIUM_OCTEON_REFERENCE_BOARD is not set
-+# CONFIG_ALCHEMY_GPIO_INDIRECT is not set
-+CONFIG_ARCH_SPARSEMEM_ENABLE=y
-+CONFIG_LEMOTE_FULOONG2E=y
-+# CONFIG_LEMOTE_FULOONG2F is not set
-+# CONFIG_LEMOTE_YEELOONG2F is not set
-+CONFIG_RWSEM_GENERIC_SPINLOCK=y
-+# CONFIG_ARCH_HAS_ILOG2_U32 is not set
-+# CONFIG_ARCH_HAS_ILOG2_U64 is not set
-+CONFIG_ARCH_SUPPORTS_OPROFILE=y
-+CONFIG_GENERIC_FIND_NEXT_BIT=y
-+CONFIG_GENERIC_HWEIGHT=y
-+CONFIG_GENERIC_CALIBRATE_DELAY=y
-+CONFIG_GENERIC_CLOCKEVENTS=y
-+CONFIG_GENERIC_TIME=y
-+CONFIG_GENERIC_CMOS_UPDATE=y
-+CONFIG_SCHED_OMIT_FRAME_POINTER=y
-+CONFIG_GENERIC_HARDIRQS_NO__DO_IRQ=y
-+CONFIG_CEVT_R4K_LIB=y
-+CONFIG_CEVT_R4K=y
-+CONFIG_CSRC_R4K_LIB=y
-+CONFIG_CSRC_R4K=y
-+CONFIG_DMA_NONCOHERENT=y
-+CONFIG_DMA_NEED_PCI_MAP_STATE=y
-+CONFIG_EARLY_PRINTK=y
-+CONFIG_SYS_HAS_EARLY_PRINTK=y
-+CONFIG_SYS_SUPPORTS_HOTPLUG_CPU=y
-+CONFIG_I8259=y
-+# CONFIG_NO_IOPORT is not set
-+CONFIG_GENERIC_ISA_DMA=y
-+CONFIG_GENERIC_ISA_DMA_SUPPORT_BROKEN=y
-+# CONFIG_CPU_BIG_ENDIAN is not set
-+CONFIG_CPU_LITTLE_ENDIAN=y
-+CONFIG_SYS_SUPPORTS_LITTLE_ENDIAN=y
-+CONFIG_IRQ_CPU=y
-+CONFIG_BOOT_ELF32=y
-+CONFIG_MIPS_L1_CACHE_SHIFT=5
-+
-+#
-+# CPU selection
-+#
-+CONFIG_CPU_LOONGSON2E=y
-+# CONFIG_CPU_LOONGSON2F is not set
-+# CONFIG_CPU_MIPS32_R1 is not set
-+# CONFIG_CPU_MIPS32_R2 is not set
-+# CONFIG_CPU_MIPS64_R1 is not set
-+# CONFIG_CPU_MIPS64_R2 is not set
-+# CONFIG_CPU_R3000 is not set
-+# CONFIG_CPU_TX39XX is not set
-+# CONFIG_CPU_VR41XX is not set
-+# CONFIG_CPU_R4300 is not set
-+# CONFIG_CPU_R4X00 is not set
-+# CONFIG_CPU_TX49XX is not set
-+# CONFIG_CPU_R5000 is not set
-+# CONFIG_CPU_R5432 is not set
-+# CONFIG_CPU_R5500 is not set
-+# CONFIG_CPU_R6000 is not set
-+# CONFIG_CPU_NEVADA is not set
-+# CONFIG_CPU_R8000 is not set
-+# CONFIG_CPU_R10000 is not set
-+# CONFIG_CPU_RM7000 is not set
-+# CONFIG_CPU_RM9000 is not set
-+# CONFIG_CPU_SB1 is not set
-+# CONFIG_CPU_CAVIUM_OCTEON is not set
-+CONFIG_CPU_LOONGSON2=y
-+CONFIG_SYS_HAS_CPU_LOONGSON2E=y
-+CONFIG_SYS_SUPPORTS_32BIT_KERNEL=y
-+CONFIG_SYS_SUPPORTS_64BIT_KERNEL=y
-+CONFIG_CPU_SUPPORTS_32BIT_KERNEL=y
-+CONFIG_CPU_SUPPORTS_64BIT_KERNEL=y
-+
-+#
-+# Kernel type
-+#
-+# CONFIG_32BIT is not set
-+CONFIG_64BIT=y
-+# CONFIG_PAGE_SIZE_4KB is not set
-+# CONFIG_PAGE_SIZE_8KB is not set
-+CONFIG_PAGE_SIZE_16KB=y
-+# CONFIG_PAGE_SIZE_32KB is not set
-+# CONFIG_PAGE_SIZE_64KB is not set
-+CONFIG_BOARD_SCACHE=y
-+CONFIG_MIPS_MT_DISABLED=y
-+# CONFIG_MIPS_MT_SMP is not set
-+# CONFIG_MIPS_MT_SMTC is not set
-+CONFIG_CPU_HAS_WB=y
-+CONFIG_CPU_HAS_SYNC=y
-+CONFIG_GENERIC_HARDIRQS=y
-+CONFIG_GENERIC_IRQ_PROBE=y
-+CONFIG_CPU_SUPPORTS_HIGHMEM=y
-+CONFIG_SYS_SUPPORTS_HIGHMEM=y
-+CONFIG_ARCH_FLATMEM_ENABLE=y
-+CONFIG_ARCH_POPULATES_NODE_MAP=y
-+CONFIG_SELECT_MEMORY_MODEL=y
-+# CONFIG_FLATMEM_MANUAL is not set
-+# CONFIG_DISCONTIGMEM_MANUAL is not set
-+CONFIG_SPARSEMEM_MANUAL=y
-+CONFIG_SPARSEMEM=y
-+CONFIG_HAVE_MEMORY_PRESENT=y
-+CONFIG_SPARSEMEM_STATIC=y
-+
-+#
-+# Memory hotplug is currently incompatible with Software Suspend
-+#
-+CONFIG_PAGEFLAGS_EXTENDED=y
-+CONFIG_SPLIT_PTLOCK_CPUS=4
-+CONFIG_PHYS_ADDR_T_64BIT=y
-+CONFIG_ZONE_DMA_FLAG=0
-+CONFIG_VIRT_TO_BUS=y
-+CONFIG_HAVE_MLOCK=y
-+CONFIG_HAVE_MLOCKED_PAGE_BIT=y
-+CONFIG_DEFAULT_MMAP_MIN_ADDR=4096
-+CONFIG_TICK_ONESHOT=y
-+CONFIG_NO_HZ=y
-+CONFIG_HIGH_RES_TIMERS=y
-+CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
-+# CONFIG_HZ_48 is not set
-+# CONFIG_HZ_100 is not set
-+# CONFIG_HZ_128 is not set
-+CONFIG_HZ_250=y
-+# CONFIG_HZ_256 is not set
-+# CONFIG_HZ_1000 is not set
-+# CONFIG_HZ_1024 is not set
-+CONFIG_SYS_SUPPORTS_ARBIT_HZ=y
-+CONFIG_HZ=250
-+# CONFIG_PREEMPT_NONE is not set
-+CONFIG_PREEMPT_VOLUNTARY=y
-+# CONFIG_PREEMPT is not set
-+# CONFIG_KEXEC is not set
-+CONFIG_SECCOMP=y
-+CONFIG_LOCKDEP_SUPPORT=y
-+CONFIG_STACKTRACE_SUPPORT=y
-+CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
-+CONFIG_CONSTRUCTORS=y
-+
-+#
-+# General setup
-+#
-+CONFIG_EXPERIMENTAL=y
-+CONFIG_BROKEN_ON_SMP=y
-+CONFIG_INIT_ENV_ARG_LIMIT=32
-+CONFIG_LOCALVERSION="-loongson2e"
-+# CONFIG_LOCALVERSION_AUTO is not set
-+CONFIG_SWAP=y
-+CONFIG_SYSVIPC=y
-+CONFIG_SYSVIPC_SYSCTL=y
-+CONFIG_POSIX_MQUEUE=y
-+CONFIG_POSIX_MQUEUE_SYSCTL=y
-+CONFIG_BSD_PROCESS_ACCT=y
-+# CONFIG_BSD_PROCESS_ACCT_V3 is not set
-+# CONFIG_TASKSTATS is not set
-+# CONFIG_AUDIT is not set
-+
-+#
-+# RCU Subsystem
-+#
-+CONFIG_CLASSIC_RCU=y
-+# CONFIG_TREE_RCU is not set
-+# CONFIG_PREEMPT_RCU is not set
-+# CONFIG_TREE_RCU_TRACE is not set
-+# CONFIG_PREEMPT_RCU_TRACE is not set
-+CONFIG_IKCONFIG=y
-+CONFIG_IKCONFIG_PROC=y
-+CONFIG_LOG_BUF_SHIFT=14
-+# CONFIG_GROUP_SCHED is not set
-+# CONFIG_CGROUPS is not set
-+CONFIG_SYSFS_DEPRECATED=y
-+CONFIG_SYSFS_DEPRECATED_V2=y
-+# CONFIG_RELAY is not set
-+CONFIG_NAMESPACES=y
-+# CONFIG_UTS_NS is not set
-+# CONFIG_IPC_NS is not set
-+CONFIG_USER_NS=y
-+CONFIG_PID_NS=y
-+# CONFIG_NET_NS is not set
-+# CONFIG_BLK_DEV_INITRD is not set
-+# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
-+CONFIG_SYSCTL=y
-+CONFIG_ANON_INODES=y
-+CONFIG_EMBEDDED=y
-+CONFIG_SYSCTL_SYSCALL=y
-+CONFIG_KALLSYMS=y
-+# CONFIG_KALLSYMS_EXTRA_PASS is not set
-+CONFIG_HOTPLUG=y
-+CONFIG_PRINTK=y
-+CONFIG_BUG=y
-+CONFIG_ELF_CORE=y
-+# CONFIG_PCSPKR_PLATFORM is not set
-+CONFIG_BASE_FULL=y
-+CONFIG_FUTEX=y
-+CONFIG_EPOLL=y
-+CONFIG_SIGNALFD=y
-+CONFIG_TIMERFD=y
-+CONFIG_EVENTFD=y
-+CONFIG_SHMEM=y
-+CONFIG_AIO=y
-+
-+#
-+# Performance Counters
-+#
-+CONFIG_VM_EVENT_COUNTERS=y
-+CONFIG_PCI_QUIRKS=y
-+# CONFIG_STRIP_ASM_SYMS is not set
-+# CONFIG_COMPAT_BRK is not set
-+CONFIG_SLAB=y
-+# CONFIG_SLUB is not set
-+# CONFIG_SLOB is not set
-+CONFIG_PROFILING=y
-+CONFIG_TRACEPOINTS=y
-+CONFIG_MARKERS=y
-+CONFIG_OPROFILE=m
-+CONFIG_HAVE_OPROFILE=y
-+CONFIG_HAVE_SYSCALL_WRAPPERS=y
-+
-+#
-+# GCOV-based kernel profiling
-+#
-+# CONFIG_GCOV_KERNEL is not set
-+# CONFIG_SLOW_WORK is not set
-+# CONFIG_HAVE_GENERIC_DMA_COHERENT is not set
-+CONFIG_SLABINFO=y
-+CONFIG_RT_MUTEXES=y
-+CONFIG_BASE_SMALL=0
-+CONFIG_MODULES=y
-+# CONFIG_MODULE_FORCE_LOAD is not set
-+CONFIG_MODULE_UNLOAD=y
-+CONFIG_MODULE_FORCE_UNLOAD=y
-+# CONFIG_MODVERSIONS is not set
-+# CONFIG_MODULE_SRCVERSION_ALL is not set
-+CONFIG_BLOCK=y
-+CONFIG_BLK_DEV_BSG=y
-+# CONFIG_BLK_DEV_INTEGRITY is not set
-+CONFIG_BLOCK_COMPAT=y
-+
-+#
-+# IO Schedulers
-+#
-+CONFIG_IOSCHED_NOOP=y
-+CONFIG_IOSCHED_AS=y
-+CONFIG_IOSCHED_DEADLINE=y
-+CONFIG_IOSCHED_CFQ=y
-+# CONFIG_DEFAULT_AS is not set
-+# CONFIG_DEFAULT_DEADLINE is not set
-+CONFIG_DEFAULT_CFQ=y
-+# CONFIG_DEFAULT_NOOP is not set
-+CONFIG_DEFAULT_IOSCHED="cfq"
-+CONFIG_FREEZER=y
-+
-+#
-+# Bus options (PCI, PCMCIA, EISA, ISA, TC)
-+#
-+CONFIG_HW_HAS_PCI=y
-+CONFIG_PCI=y
-+CONFIG_PCI_DOMAINS=y
-+# CONFIG_ARCH_SUPPORTS_MSI is not set
-+CONFIG_PCI_LEGACY=y
-+# CONFIG_PCI_STUB is not set
-+# CONFIG_PCI_IOV is not set
-+CONFIG_ISA=y
-+CONFIG_MMU=y
-+# CONFIG_PCCARD is not set
-+# CONFIG_HOTPLUG_PCI is not set
-+
-+#
-+# Executable file formats
-+#
-+CONFIG_BINFMT_ELF=y
-+# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set
-+# CONFIG_HAVE_AOUT is not set
-+CONFIG_BINFMT_MISC=y
-+CONFIG_MIPS32_COMPAT=y
-+CONFIG_COMPAT=y
-+CONFIG_SYSVIPC_COMPAT=y
-+CONFIG_MIPS32_O32=y
-+CONFIG_MIPS32_N32=y
-+CONFIG_BINFMT_ELF32=y
-+
-+#
-+# Power management options
-+#
-+CONFIG_ARCH_HIBERNATION_POSSIBLE=y
-+CONFIG_ARCH_SUSPEND_POSSIBLE=y
-+CONFIG_PM=y
-+# CONFIG_PM_DEBUG is not set
-+CONFIG_PM_SLEEP=y
-+CONFIG_SUSPEND=y
-+CONFIG_SUSPEND_FREEZER=y
-+CONFIG_HIBERNATION_NVS=y
-+CONFIG_HIBERNATION=y
-+CONFIG_PM_STD_PARTITION="/dev/hda3"
-+
-+#
-+# CPU Frequency scaling
-+#
-+# CONFIG_CPU_FREQ is not set
-+CONFIG_NET=y
-+
-+#
-+# Networking options
-+#
-+CONFIG_PACKET=y
-+CONFIG_PACKET_MMAP=y
-+CONFIG_UNIX=y
-+CONFIG_XFRM=y
-+# CONFIG_XFRM_USER is not set
-+# CONFIG_XFRM_SUB_POLICY is not set
-+# CONFIG_XFRM_MIGRATE is not set
-+# CONFIG_XFRM_STATISTICS is not set
-+# CONFIG_NET_KEY is not set
-+CONFIG_INET=y
-+CONFIG_IP_MULTICAST=y
-+# CONFIG_IP_ADVANCED_ROUTER is not set
-+CONFIG_IP_FIB_HASH=y
-+CONFIG_IP_PNP=y
-+# CONFIG_IP_PNP_DHCP is not set
-+CONFIG_IP_PNP_BOOTP=y
-+# CONFIG_IP_PNP_RARP is not set
-+CONFIG_NET_IPIP=m
-+CONFIG_NET_IPGRE=m
-+CONFIG_NET_IPGRE_BROADCAST=y
-+# CONFIG_IP_MROUTE is not set
-+# CONFIG_ARPD is not set
-+# CONFIG_SYN_COOKIES is not set
-+# CONFIG_INET_AH is not set
-+# CONFIG_INET_ESP is not set
-+# CONFIG_INET_IPCOMP is not set
-+# CONFIG_INET_XFRM_TUNNEL is not set
-+CONFIG_INET_TUNNEL=m
-+# CONFIG_INET_XFRM_MODE_TRANSPORT is not set
-+# CONFIG_INET_XFRM_MODE_TUNNEL is not set
-+CONFIG_INET_XFRM_MODE_BEET=y
-+# CONFIG_INET_LRO is not set
-+# CONFIG_INET_DIAG is not set
-+# CONFIG_TCP_CONG_ADVANCED is not set
-+CONFIG_TCP_CONG_CUBIC=y
-+CONFIG_DEFAULT_TCP_CONG="cubic"
-+# CONFIG_TCP_MD5SIG is not set
-+# CONFIG_IPV6 is not set
-+# CONFIG_NETWORK_SECMARK is not set
-+CONFIG_NETFILTER=y
-+# CONFIG_NETFILTER_DEBUG is not set
-+CONFIG_NETFILTER_ADVANCED=y
-+
-+#
-+# Core Netfilter Configuration
-+#
-+CONFIG_NETFILTER_NETLINK=m
-+CONFIG_NETFILTER_NETLINK_QUEUE=m
-+CONFIG_NETFILTER_NETLINK_LOG=m
-+# CONFIG_NF_CONNTRACK is not set
-+# CONFIG_NETFILTER_TPROXY is not set
-+CONFIG_NETFILTER_XTABLES=m
-+CONFIG_NETFILTER_XT_TARGET_CLASSIFY=m
-+# CONFIG_NETFILTER_XT_TARGET_DSCP is not set
-+CONFIG_NETFILTER_XT_TARGET_HL=m
-+CONFIG_NETFILTER_XT_TARGET_MARK=m
-+# CONFIG_NETFILTER_XT_TARGET_NFLOG is not set
-+CONFIG_NETFILTER_XT_TARGET_NFQUEUE=m
-+CONFIG_NETFILTER_XT_TARGET_RATEEST=m
-+CONFIG_NETFILTER_XT_TARGET_TRACE=m
-+# CONFIG_NETFILTER_XT_TARGET_TCPMSS is not set
-+CONFIG_NETFILTER_XT_TARGET_TCPOPTSTRIP=m
-+CONFIG_NETFILTER_XT_MATCH_COMMENT=m
-+CONFIG_NETFILTER_XT_MATCH_DCCP=m
-+# CONFIG_NETFILTER_XT_MATCH_DSCP is not set
-+CONFIG_NETFILTER_XT_MATCH_ESP=m
-+# CONFIG_NETFILTER_XT_MATCH_HASHLIMIT is not set
-+CONFIG_NETFILTER_XT_MATCH_HL=m
-+CONFIG_NETFILTER_XT_MATCH_IPRANGE=m
-+CONFIG_NETFILTER_XT_MATCH_LENGTH=m
-+CONFIG_NETFILTER_XT_MATCH_LIMIT=m
-+CONFIG_NETFILTER_XT_MATCH_MAC=m
-+CONFIG_NETFILTER_XT_MATCH_MARK=m
-+CONFIG_NETFILTER_XT_MATCH_MULTIPORT=m
-+CONFIG_NETFILTER_XT_MATCH_OWNER=m
-+# CONFIG_NETFILTER_XT_MATCH_POLICY is not set
-+CONFIG_NETFILTER_XT_MATCH_PKTTYPE=m
-+CONFIG_NETFILTER_XT_MATCH_QUOTA=m
-+CONFIG_NETFILTER_XT_MATCH_RATEEST=m
-+CONFIG_NETFILTER_XT_MATCH_REALM=m
-+CONFIG_NETFILTER_XT_MATCH_RECENT=m
-+# CONFIG_NETFILTER_XT_MATCH_RECENT_PROC_COMPAT is not set
-+CONFIG_NETFILTER_XT_MATCH_SCTP=m
-+CONFIG_NETFILTER_XT_MATCH_STATISTIC=m
-+CONFIG_NETFILTER_XT_MATCH_STRING=m
-+CONFIG_NETFILTER_XT_MATCH_TCPMSS=m
-+CONFIG_NETFILTER_XT_MATCH_TIME=m
-+CONFIG_NETFILTER_XT_MATCH_U32=m
-+# CONFIG_NETFILTER_XT_MATCH_OSF is not set
-+# CONFIG_IP_VS is not set
-+
-+#
-+# IP: Netfilter Configuration
-+#
-+# CONFIG_NF_DEFRAG_IPV4 is not set
-+CONFIG_IP_NF_QUEUE=m
-+CONFIG_IP_NF_IPTABLES=m
-+CONFIG_IP_NF_MATCH_ADDRTYPE=m
-+CONFIG_IP_NF_MATCH_AH=m
-+CONFIG_IP_NF_MATCH_ECN=m
-+CONFIG_IP_NF_MATCH_TTL=m
-+CONFIG_IP_NF_FILTER=m
-+CONFIG_IP_NF_TARGET_REJECT=m
-+CONFIG_IP_NF_TARGET_LOG=m
-+CONFIG_IP_NF_TARGET_ULOG=m
-+CONFIG_IP_NF_MANGLE=m
-+CONFIG_IP_NF_TARGET_ECN=m
-+CONFIG_IP_NF_TARGET_TTL=m
-+CONFIG_IP_NF_RAW=m
-+CONFIG_IP_NF_ARPTABLES=m
-+CONFIG_IP_NF_ARPFILTER=m
-+CONFIG_IP_NF_ARP_MANGLE=m
-+# CONFIG_IP_DCCP is not set
-+# CONFIG_IP_SCTP is not set
-+# CONFIG_TIPC is not set
-+# CONFIG_ATM is not set
-+# CONFIG_BRIDGE is not set
-+# CONFIG_NET_DSA is not set
-+# CONFIG_VLAN_8021Q is not set
-+# CONFIG_DECNET is not set
-+# CONFIG_LLC2 is not set
-+# CONFIG_IPX is not set
-+# CONFIG_ATALK is not set
-+# CONFIG_X25 is not set
-+# CONFIG_LAPB is not set
-+# CONFIG_ECONET is not set
-+# CONFIG_WAN_ROUTER is not set
-+CONFIG_PHONET=m
-+# CONFIG_IEEE802154 is not set
-+# CONFIG_NET_SCHED is not set
-+CONFIG_NET_CLS_ROUTE=y
-+# CONFIG_DCB is not set
-+
-+#
-+# Network testing
-+#
-+# CONFIG_NET_PKTGEN is not set
-+# CONFIG_NET_DROP_MONITOR is not set
-+# CONFIG_HAMRADIO is not set
-+# CONFIG_CAN is not set
-+# CONFIG_IRDA is not set
-+# CONFIG_BT is not set
-+# CONFIG_AF_RXRPC is not set
-+CONFIG_WIRELESS=y
-+# CONFIG_CFG80211 is not set
-+CONFIG_WIRELESS_OLD_REGULATORY=y
-+CONFIG_WIRELESS_EXT=y
-+CONFIG_WIRELESS_EXT_SYSFS=y
-+# CONFIG_LIB80211 is not set
-+
-+#
-+# CFG80211 needs to be enabled for MAC80211
-+#
-+CONFIG_MAC80211_DEFAULT_PS_VALUE=0
-+# CONFIG_WIMAX is not set
-+# CONFIG_RFKILL is not set
-+CONFIG_NET_9P=m
-+# CONFIG_NET_9P_DEBUG is not set
-+
-+#
-+# Device Drivers
-+#
-+
-+#
-+# Generic Driver Options
-+#
-+CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
-+CONFIG_STANDALONE=y
-+CONFIG_PREVENT_FIRMWARE_BUILD=y
-+CONFIG_FW_LOADER=m
-+CONFIG_FIRMWARE_IN_KERNEL=y
-+CONFIG_EXTRA_FIRMWARE=""
-+# CONFIG_SYS_HYPERVISOR is not set
-+# CONFIG_CONNECTOR is not set
-+CONFIG_MTD=m
-+# CONFIG_MTD_DEBUG is not set
-+# CONFIG_MTD_CONCAT is not set
-+# CONFIG_MTD_PARTITIONS is not set
-+# CONFIG_MTD_TESTS is not set
-+
-+#
-+# User Modules And Translation Layers
-+#
-+CONFIG_MTD_CHAR=m
-+CONFIG_MTD_BLKDEVS=m
-+CONFIG_MTD_BLOCK=m
-+# CONFIG_MTD_BLOCK_RO is not set
-+# CONFIG_FTL is not set
-+# CONFIG_NFTL is not set
-+# CONFIG_INFTL is not set
-+# CONFIG_RFD_FTL is not set
-+# CONFIG_SSFDC is not set
-+# CONFIG_MTD_OOPS is not set
-+
-+#
-+# RAM/ROM/Flash chip drivers
-+#
-+CONFIG_MTD_CFI=m
-+CONFIG_MTD_JEDECPROBE=m
-+CONFIG_MTD_GEN_PROBE=m
-+CONFIG_MTD_CFI_ADV_OPTIONS=y
-+CONFIG_MTD_CFI_NOSWAP=y
-+# CONFIG_MTD_CFI_BE_BYTE_SWAP is not set
-+# CONFIG_MTD_CFI_LE_BYTE_SWAP is not set
-+# CONFIG_MTD_CFI_GEOMETRY is not set
-+CONFIG_MTD_MAP_BANK_WIDTH_1=y
-+CONFIG_MTD_MAP_BANK_WIDTH_2=y
-+CONFIG_MTD_MAP_BANK_WIDTH_4=y
-+# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set
-+# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set
-+# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set
-+CONFIG_MTD_CFI_I1=y
-+CONFIG_MTD_CFI_I2=y
-+# CONFIG_MTD_CFI_I4 is not set
-+# CONFIG_MTD_CFI_I8 is not set
-+# CONFIG_MTD_OTP is not set
-+# CONFIG_MTD_CFI_INTELEXT is not set
-+CONFIG_MTD_CFI_AMDSTD=m
-+CONFIG_MTD_CFI_STAA=m
-+CONFIG_MTD_CFI_UTIL=m
-+# CONFIG_MTD_RAM is not set
-+# CONFIG_MTD_ROM is not set
-+# CONFIG_MTD_ABSENT is not set
-+
-+#
-+# Mapping drivers for chip access
-+#
-+# CONFIG_MTD_COMPLEX_MAPPINGS is not set
-+CONFIG_MTD_PHYSMAP=m
-+# CONFIG_MTD_PHYSMAP_COMPAT is not set
-+# CONFIG_MTD_INTEL_VR_NOR is not set
-+# CONFIG_MTD_PLATRAM is not set
-+
-+#
-+# Self-contained MTD device drivers
-+#
-+# CONFIG_MTD_PMC551 is not set
-+# CONFIG_MTD_SLRAM is not set
-+# CONFIG_MTD_PHRAM is not set
-+# CONFIG_MTD_MTDRAM is not set
-+# CONFIG_MTD_BLOCK2MTD is not set
-+
-+#
-+# Disk-On-Chip Device Drivers
-+#
-+# CONFIG_MTD_DOC2000 is not set
-+# CONFIG_MTD_DOC2001 is not set
-+# CONFIG_MTD_DOC2001PLUS is not set
-+# CONFIG_MTD_NAND is not set
-+# CONFIG_MTD_ONENAND is not set
-+
-+#
-+# LPDDR flash memory drivers
-+#
-+# CONFIG_MTD_LPDDR is not set
-+
-+#
-+# UBI - Unsorted block images
-+#
-+# CONFIG_MTD_UBI is not set
-+# CONFIG_PARPORT is not set
-+# CONFIG_PNP is not set
-+CONFIG_BLK_DEV=y
-+# CONFIG_BLK_CPQ_DA is not set
-+# CONFIG_BLK_CPQ_CISS_DA is not set
-+# CONFIG_BLK_DEV_DAC960 is not set
-+# CONFIG_BLK_DEV_UMEM is not set
-+# CONFIG_BLK_DEV_COW_COMMON is not set
-+CONFIG_BLK_DEV_LOOP=y
-+CONFIG_BLK_DEV_CRYPTOLOOP=m
-+# CONFIG_BLK_DEV_NBD is not set
-+# CONFIG_BLK_DEV_SX8 is not set
-+# CONFIG_BLK_DEV_UB is not set
-+CONFIG_BLK_DEV_RAM=m
-+CONFIG_BLK_DEV_RAM_COUNT=16
-+CONFIG_BLK_DEV_RAM_SIZE=4096
-+# CONFIG_BLK_DEV_XIP is not set
-+CONFIG_CDROM_PKTCDVD=m
-+CONFIG_CDROM_PKTCDVD_BUFFERS=8
-+# CONFIG_CDROM_PKTCDVD_WCACHE is not set
-+CONFIG_ATA_OVER_ETH=m
-+# CONFIG_BLK_DEV_HD is not set
-+# CONFIG_MISC_DEVICES is not set
-+CONFIG_HAVE_IDE=y
-+CONFIG_IDE=y
-+
-+#
-+# Please see Documentation/ide/ide.txt for help/info on IDE drives
-+#
-+CONFIG_IDE_XFER_MODE=y
-+CONFIG_IDE_TIMINGS=y
-+CONFIG_IDE_ATAPI=y
-+# CONFIG_BLK_DEV_IDE_SATA is not set
-+CONFIG_IDE_GD=y
-+CONFIG_IDE_GD_ATA=y
-+# CONFIG_IDE_GD_ATAPI is not set
-+CONFIG_BLK_DEV_IDECD=y
-+CONFIG_BLK_DEV_IDECD_VERBOSE_ERRORS=y
-+# CONFIG_BLK_DEV_IDETAPE is not set
-+CONFIG_IDE_TASK_IOCTL=y
-+CONFIG_IDE_PROC_FS=y
-+
-+#
-+# IDE chipset support/bugfixes
-+#
-+CONFIG_IDE_GENERIC=y
-+# CONFIG_BLK_DEV_PLATFORM is not set
-+CONFIG_BLK_DEV_IDEDMA_SFF=y
-+
-+#
-+# PCI IDE chipsets support
-+#
-+CONFIG_BLK_DEV_IDEPCI=y
-+CONFIG_IDEPCI_PCIBUS_ORDER=y
-+# CONFIG_BLK_DEV_OFFBOARD is not set
-+CONFIG_BLK_DEV_GENERIC=y
-+# CONFIG_BLK_DEV_OPTI621 is not set
-+CONFIG_BLK_DEV_IDEDMA_PCI=y
-+# CONFIG_BLK_DEV_AEC62XX is not set
-+# CONFIG_BLK_DEV_ALI15X3 is not set
-+# CONFIG_BLK_DEV_AMD74XX is not set
-+# CONFIG_BLK_DEV_CMD64X is not set
-+# CONFIG_BLK_DEV_TRIFLEX is not set
-+# CONFIG_BLK_DEV_CS5520 is not set
-+# CONFIG_BLK_DEV_CS5530 is not set
-+# CONFIG_BLK_DEV_HPT366 is not set
-+# CONFIG_BLK_DEV_JMICRON is not set
-+# CONFIG_BLK_DEV_SC1200 is not set
-+# CONFIG_BLK_DEV_PIIX is not set
-+# CONFIG_BLK_DEV_IT8172 is not set
-+# CONFIG_BLK_DEV_IT8213 is not set
-+# CONFIG_BLK_DEV_IT821X is not set
-+# CONFIG_BLK_DEV_NS87415 is not set
-+# CONFIG_BLK_DEV_PDC202XX_OLD is not set
-+# CONFIG_BLK_DEV_PDC202XX_NEW is not set
-+# CONFIG_BLK_DEV_SVWKS is not set
-+# CONFIG_BLK_DEV_SIIMAGE is not set
-+# CONFIG_BLK_DEV_SLC90E66 is not set
-+# CONFIG_BLK_DEV_TRM290 is not set
-+CONFIG_BLK_DEV_VIA82CXXX=y
-+# CONFIG_BLK_DEV_TC86C001 is not set
-+
-+#
-+# Other IDE chipsets support
-+#
-+
-+#
-+# Note: most of these also require special kernel boot parameters
-+#
-+# CONFIG_BLK_DEV_4DRIVES is not set
-+# CONFIG_BLK_DEV_ALI14XX is not set
-+# CONFIG_BLK_DEV_DTC2278 is not set
-+# CONFIG_BLK_DEV_HT6560B is not set
-+# CONFIG_BLK_DEV_QD65XX is not set
-+# CONFIG_BLK_DEV_UMC8672 is not set
-+CONFIG_BLK_DEV_IDEDMA=y
-+
-+#
-+# SCSI device support
-+#
-+# CONFIG_RAID_ATTRS is not set
-+CONFIG_SCSI=y
-+CONFIG_SCSI_DMA=y
-+# CONFIG_SCSI_TGT is not set
-+# CONFIG_SCSI_NETLINK is not set
-+CONFIG_SCSI_PROC_FS=y
-+
-+#
-+# SCSI support type (disk, tape, CD-ROM)
-+#
-+CONFIG_BLK_DEV_SD=y
-+# CONFIG_CHR_DEV_ST is not set
-+# CONFIG_CHR_DEV_OSST is not set
-+CONFIG_BLK_DEV_SR=y
-+CONFIG_BLK_DEV_SR_VENDOR=y
-+CONFIG_CHR_DEV_SG=y
-+# CONFIG_CHR_DEV_SCH is not set
-+# CONFIG_SCSI_MULTI_LUN is not set
-+CONFIG_SCSI_CONSTANTS=y
-+# CONFIG_SCSI_LOGGING is not set
-+# CONFIG_SCSI_SCAN_ASYNC is not set
-+CONFIG_SCSI_WAIT_SCAN=m
-+
-+#
-+# SCSI Transports
-+#
-+# CONFIG_SCSI_SPI_ATTRS is not set
-+# CONFIG_SCSI_FC_ATTRS is not set
-+# CONFIG_SCSI_ISCSI_ATTRS is not set
-+# CONFIG_SCSI_SAS_ATTRS is not set
-+# CONFIG_SCSI_SAS_LIBSAS is not set
-+# CONFIG_SCSI_SRP_ATTRS is not set
-+# CONFIG_SCSI_LOWLEVEL is not set
-+# CONFIG_SCSI_DH is not set
-+# CONFIG_SCSI_OSD_INITIATOR is not set
-+# CONFIG_ATA is not set
-+# CONFIG_MD is not set
-+# CONFIG_FUSION is not set
-+
-+#
-+# IEEE 1394 (FireWire) support
-+#
-+
-+#
-+# You can enable one or both FireWire driver stacks.
-+#
-+
-+#
-+# See the help texts for more information.
-+#
-+# CONFIG_FIREWIRE is not set
-+# CONFIG_IEEE1394 is not set
-+# CONFIG_I2O is not set
-+CONFIG_NETDEVICES=y
-+# CONFIG_DUMMY is not set
-+# CONFIG_BONDING is not set
-+CONFIG_MACVLAN=m
-+# CONFIG_EQUALIZER is not set
-+# CONFIG_TUN is not set
-+CONFIG_VETH=m
-+# CONFIG_ARCNET is not set
-+CONFIG_PHYLIB=m
-+
-+#
-+# MII PHY device drivers
-+#
-+CONFIG_MARVELL_PHY=m
-+CONFIG_DAVICOM_PHY=m
-+CONFIG_QSEMI_PHY=m
-+CONFIG_LXT_PHY=m
-+CONFIG_CICADA_PHY=m
-+# CONFIG_VITESSE_PHY is not set
-+# CONFIG_SMSC_PHY is not set
-+# CONFIG_BROADCOM_PHY is not set
-+# CONFIG_ICPLUS_PHY is not set
-+# CONFIG_REALTEK_PHY is not set
-+# CONFIG_NATIONAL_PHY is not set
-+# CONFIG_STE10XP is not set
-+# CONFIG_LSI_ET1011C_PHY is not set
-+# CONFIG_MDIO_BITBANG is not set
-+CONFIG_NET_ETHERNET=y
-+CONFIG_MII=y
-+# CONFIG_AX88796 is not set
-+# CONFIG_HAPPYMEAL is not set
-+# CONFIG_SUNGEM is not set
-+# CONFIG_CASSINI is not set
-+# CONFIG_NET_VENDOR_3COM is not set
-+# CONFIG_NET_VENDOR_SMC is not set
-+# CONFIG_SMC91X is not set
-+# CONFIG_DM9000 is not set
-+# CONFIG_ETHOC is not set
-+# CONFIG_NET_VENDOR_RACAL is not set
-+# CONFIG_DNET is not set
-+# CONFIG_NET_TULIP is not set
-+# CONFIG_AT1700 is not set
-+# CONFIG_DEPCA is not set
-+# CONFIG_HP100 is not set
-+# CONFIG_NET_ISA is not set
-+# CONFIG_IBM_NEW_EMAC_ZMII is not set
-+# CONFIG_IBM_NEW_EMAC_RGMII is not set
-+# CONFIG_IBM_NEW_EMAC_TAH is not set
-+# CONFIG_IBM_NEW_EMAC_EMAC4 is not set
-+# CONFIG_IBM_NEW_EMAC_NO_FLOW_CTRL is not set
-+# CONFIG_IBM_NEW_EMAC_MAL_CLR_ICINTSTAT is not set
-+# CONFIG_IBM_NEW_EMAC_MAL_COMMON_ERR is not set
-+CONFIG_NET_PCI=y
-+# CONFIG_PCNET32 is not set
-+# CONFIG_AMD8111_ETH is not set
-+# CONFIG_ADAPTEC_STARFIRE is not set
-+# CONFIG_AC3200 is not set
-+# CONFIG_APRICOT is not set
-+# CONFIG_B44 is not set
-+# CONFIG_FORCEDETH is not set
-+# CONFIG_CS89x0 is not set
-+# CONFIG_TC35815 is not set
-+# CONFIG_E100 is not set
-+# CONFIG_FEALNX is not set
-+# CONFIG_NATSEMI is not set
-+# CONFIG_NE2K_PCI is not set
-+# CONFIG_8139CP is not set
-+CONFIG_8139TOO=y
-+# CONFIG_8139TOO_PIO is not set
-+# CONFIG_8139TOO_TUNE_TWISTER is not set
-+# CONFIG_8139TOO_8129 is not set
-+# CONFIG_8139_OLD_RX_RESET is not set
-+# CONFIG_R6040 is not set
-+# CONFIG_SIS900 is not set
-+# CONFIG_EPIC100 is not set
-+# CONFIG_SMSC9420 is not set
-+# CONFIG_SUNDANCE is not set
-+# CONFIG_TLAN is not set
-+# CONFIG_KS8842 is not set
-+# CONFIG_VIA_RHINE is not set
-+# CONFIG_SC92031 is not set
-+# CONFIG_ATL2 is not set
-+CONFIG_NETDEV_1000=y
-+# CONFIG_ACENIC is not set
-+# CONFIG_DL2K is not set
-+# CONFIG_E1000 is not set
-+# CONFIG_E1000E is not set
-+# CONFIG_IP1000 is not set
-+# CONFIG_IGB is not set
-+# CONFIG_IGBVF is not set
-+# CONFIG_NS83820 is not set
-+# CONFIG_HAMACHI is not set
-+# CONFIG_YELLOWFIN is not set
-+# CONFIG_R8169 is not set
-+# CONFIG_SIS190 is not set
-+# CONFIG_SKGE is not set
-+# CONFIG_SKY2 is not set
-+# CONFIG_VIA_VELOCITY is not set
-+# CONFIG_TIGON3 is not set
-+# CONFIG_BNX2 is not set
-+# CONFIG_CNIC is not set
-+# CONFIG_QLA3XXX is not set
-+# CONFIG_ATL1 is not set
-+# CONFIG_ATL1E is not set
-+# CONFIG_ATL1C is not set
-+# CONFIG_JME is not set
-+CONFIG_NETDEV_10000=y
-+# CONFIG_CHELSIO_T1 is not set
-+CONFIG_CHELSIO_T3_DEPENDS=y
-+# CONFIG_CHELSIO_T3 is not set
-+# CONFIG_ENIC is not set
-+# CONFIG_IXGBE is not set
-+# CONFIG_IXGB is not set
-+# CONFIG_S2IO is not set
-+# CONFIG_VXGE is not set
-+# CONFIG_MYRI10GE is not set
-+# CONFIG_NETXEN_NIC is not set
-+# CONFIG_NIU is not set
-+# CONFIG_MLX4_EN is not set
-+# CONFIG_MLX4_CORE is not set
-+# CONFIG_TEHUTI is not set
-+# CONFIG_BNX2X is not set
-+# CONFIG_QLGE is not set
-+# CONFIG_SFC is not set
-+# CONFIG_BE2NET is not set
-+# CONFIG_TR is not set
-+
-+#
-+# Wireless LAN
-+#
-+# CONFIG_WLAN_PRE80211 is not set
-+# CONFIG_WLAN_80211 is not set
-+
-+#
-+# Enable WiMAX (Networking options) to see the WiMAX drivers
-+#
-+
-+#
-+# USB Network Adapters
-+#
-+# CONFIG_USB_CATC is not set
-+# CONFIG_USB_KAWETH is not set
-+# CONFIG_USB_PEGASUS is not set
-+# CONFIG_USB_RTL8150 is not set
-+# CONFIG_USB_USBNET is not set
-+# CONFIG_WAN is not set
-+# CONFIG_FDDI is not set
-+# CONFIG_HIPPI is not set
-+CONFIG_PPP=m
-+CONFIG_PPP_MULTILINK=y
-+CONFIG_PPP_FILTER=y
-+CONFIG_PPP_ASYNC=m
-+CONFIG_PPP_SYNC_TTY=m
-+CONFIG_PPP_DEFLATE=m
-+CONFIG_PPP_BSDCOMP=m
-+CONFIG_PPP_MPPE=m
-+CONFIG_PPPOE=m
-+CONFIG_PPPOL2TP=m
-+CONFIG_SLIP=m
-+CONFIG_SLIP_COMPRESSED=y
-+CONFIG_SLHC=m
-+CONFIG_SLIP_SMART=y
-+CONFIG_SLIP_MODE_SLIP6=y
-+CONFIG_NET_FC=y
-+# CONFIG_NETCONSOLE is not set
-+# CONFIG_NETPOLL is not set
-+# CONFIG_NET_POLL_CONTROLLER is not set
-+# CONFIG_ISDN is not set
-+# CONFIG_PHONE is not set
-+
-+#
-+# Input device support
-+#
-+CONFIG_INPUT=y
-+CONFIG_INPUT_FF_MEMLESS=y
-+# CONFIG_INPUT_POLLDEV is not set
-+
-+#
-+# Userland interfaces
-+#
-+CONFIG_INPUT_MOUSEDEV=y
-+CONFIG_INPUT_MOUSEDEV_PSAUX=y
-+CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024
-+CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
-+# CONFIG_INPUT_JOYDEV is not set
-+# CONFIG_INPUT_EVDEV is not set
-+# CONFIG_INPUT_EVBUG is not set
-+
-+#
-+# Input Device Drivers
-+#
-+CONFIG_INPUT_KEYBOARD=y
-+CONFIG_KEYBOARD_ATKBD=m
-+# CONFIG_KEYBOARD_SUNKBD is not set
-+# CONFIG_KEYBOARD_LKKBD is not set
-+# CONFIG_KEYBOARD_XTKBD is not set
-+# CONFIG_KEYBOARD_NEWTON is not set
-+# CONFIG_KEYBOARD_STOWAWAY is not set
-+CONFIG_INPUT_MOUSE=y
-+CONFIG_MOUSE_PS2=y
-+CONFIG_MOUSE_PS2_ALPS=y
-+CONFIG_MOUSE_PS2_LOGIPS2PP=y
-+CONFIG_MOUSE_PS2_SYNAPTICS=y
-+CONFIG_MOUSE_PS2_TRACKPOINT=y
-+# CONFIG_MOUSE_PS2_ELANTECH is not set
-+# CONFIG_MOUSE_PS2_TOUCHKIT is not set
-+CONFIG_MOUSE_SERIAL=y
-+# CONFIG_MOUSE_APPLETOUCH is not set
-+# CONFIG_MOUSE_BCM5974 is not set
-+# CONFIG_MOUSE_INPORT is not set
-+# CONFIG_MOUSE_LOGIBM is not set
-+# CONFIG_MOUSE_PC110PAD is not set
-+# CONFIG_MOUSE_VSXXXAA is not set
-+# CONFIG_MOUSE_SYNAPTICS_I2C is not set
-+# CONFIG_INPUT_JOYSTICK is not set
-+# CONFIG_INPUT_TABLET is not set
-+# CONFIG_INPUT_TOUCHSCREEN is not set
-+# CONFIG_INPUT_MISC is not set
-+
-+#
-+# Hardware I/O ports
-+#
-+CONFIG_SERIO=y
-+CONFIG_SERIO_I8042=y
-+CONFIG_SERIO_SERPORT=y
-+# CONFIG_SERIO_PCIPS2 is not set
-+CONFIG_SERIO_LIBPS2=y
-+# CONFIG_SERIO_RAW is not set
-+# CONFIG_GAMEPORT is not set
-+
-+#
-+# Character devices
-+#
-+CONFIG_VT=y
-+CONFIG_CONSOLE_TRANSLATIONS=y
-+CONFIG_VT_CONSOLE=y
-+CONFIG_HW_CONSOLE=y
-+# CONFIG_VT_HW_CONSOLE_BINDING is not set
-+CONFIG_DEVKMEM=y
-+# CONFIG_SERIAL_NONSTANDARD is not set
-+# CONFIG_NOZOMI is not set
-+
-+#
-+# Serial drivers
-+#
-+CONFIG_SERIAL_8250=y
-+CONFIG_SERIAL_8250_CONSOLE=y
-+CONFIG_SERIAL_8250_PCI=y
-+CONFIG_SERIAL_8250_NR_UARTS=2
-+CONFIG_SERIAL_8250_RUNTIME_UARTS=2
-+# CONFIG_SERIAL_8250_EXTENDED is not set
-+
-+#
-+# Non-8250 serial port support
-+#
-+CONFIG_SERIAL_CORE=y
-+CONFIG_SERIAL_CORE_CONSOLE=y
-+# CONFIG_SERIAL_JSM is not set
-+CONFIG_UNIX98_PTYS=y
-+# CONFIG_DEVPTS_MULTIPLE_INSTANCES is not set
-+CONFIG_LEGACY_PTYS=y
-+CONFIG_LEGACY_PTY_COUNT=256
-+# CONFIG_IPMI_HANDLER is not set
-+CONFIG_HW_RANDOM=y
-+# CONFIG_HW_RANDOM_TIMERIOMEM is not set
-+# CONFIG_DTLK is not set
-+# CONFIG_R3964 is not set
-+# CONFIG_APPLICOM is not set
-+# CONFIG_RAW_DRIVER is not set
-+# CONFIG_TCG_TPM is not set
-+CONFIG_DEVPORT=y
-+CONFIG_I2C=m
-+CONFIG_I2C_BOARDINFO=y
-+CONFIG_I2C_CHARDEV=m
-+CONFIG_I2C_HELPER_AUTO=y
-+
-+#
-+# I2C Hardware Bus support
-+#
-+
-+#
-+# PC SMBus host controller drivers
-+#
-+# CONFIG_I2C_ALI1535 is not set
-+# CONFIG_I2C_ALI1563 is not set
-+# CONFIG_I2C_ALI15X3 is not set
-+# CONFIG_I2C_AMD756 is not set
-+# CONFIG_I2C_AMD8111 is not set
-+# CONFIG_I2C_I801 is not set
-+# CONFIG_I2C_ISCH is not set
-+# CONFIG_I2C_PIIX4 is not set
-+# CONFIG_I2C_NFORCE2 is not set
-+# CONFIG_I2C_SIS5595 is not set
-+# CONFIG_I2C_SIS630 is not set
-+# CONFIG_I2C_SIS96X is not set
-+# CONFIG_I2C_VIA is not set
-+CONFIG_I2C_VIAPRO=m
-+
-+#
-+# I2C system bus drivers (mostly embedded / system-on-chip)
-+#
-+# CONFIG_I2C_OCORES is not set
-+# CONFIG_I2C_SIMTEC is not set
-+
-+#
-+# External I2C/SMBus adapter drivers
-+#
-+# CONFIG_I2C_PARPORT_LIGHT is not set
-+# CONFIG_I2C_TAOS_EVM is not set
-+# CONFIG_I2C_TINY_USB is not set
-+
-+#
-+# Graphics adapter I2C/DDC channel drivers
-+#
-+# CONFIG_I2C_VOODOO3 is not set
-+
-+#
-+# Other I2C/SMBus bus drivers
-+#
-+# CONFIG_I2C_ELEKTOR is not set
-+# CONFIG_I2C_PCA_ISA is not set
-+# CONFIG_I2C_PCA_PLATFORM is not set
-+# CONFIG_I2C_STUB is not set
-+
-+#
-+# Miscellaneous I2C Chip support
-+#
-+# CONFIG_DS1682 is not set
-+# CONFIG_SENSORS_PCF8574 is not set
-+# CONFIG_PCF8575 is not set
-+# CONFIG_SENSORS_PCA9539 is not set
-+# CONFIG_SENSORS_TSL2550 is not set
-+# CONFIG_I2C_DEBUG_CORE is not set
-+# CONFIG_I2C_DEBUG_ALGO is not set
-+# CONFIG_I2C_DEBUG_BUS is not set
-+# CONFIG_I2C_DEBUG_CHIP is not set
-+# CONFIG_SPI is not set
-+
-+#
-+# PPS support
-+#
-+# CONFIG_PPS is not set
-+# CONFIG_W1 is not set
-+# CONFIG_POWER_SUPPLY is not set
-+# CONFIG_HWMON is not set
-+# CONFIG_THERMAL is not set
-+# CONFIG_THERMAL_HWMON is not set
-+# CONFIG_WATCHDOG is not set
-+CONFIG_SSB_POSSIBLE=y
-+
-+#
-+# Sonics Silicon Backplane
-+#
-+# CONFIG_SSB is not set
-+
-+#
-+# Multifunction device drivers
-+#
-+# CONFIG_MFD_CORE is not set
-+# CONFIG_MFD_SM501 is not set
-+# CONFIG_HTC_PASIC3 is not set
-+# CONFIG_MFD_TMIO is not set
-+# CONFIG_MFD_WM8400 is not set
-+# CONFIG_MFD_WM8350_I2C is not set
-+# CONFIG_MFD_PCF50633 is not set
-+# CONFIG_AB3100_CORE is not set
-+# CONFIG_REGULATOR is not set
-+# CONFIG_MEDIA_SUPPORT is not set
-+
-+#
-+# Graphics support
-+#
-+# CONFIG_DRM is not set
-+# CONFIG_VGASTATE is not set
-+CONFIG_VIDEO_OUTPUT_CONTROL=m
-+CONFIG_FB=y
-+# CONFIG_FIRMWARE_EDID is not set
-+# CONFIG_FB_DDC is not set
-+# CONFIG_FB_BOOT_VESA_SUPPORT is not set
-+CONFIG_FB_CFB_FILLRECT=y
-+CONFIG_FB_CFB_COPYAREA=y
-+CONFIG_FB_CFB_IMAGEBLIT=y
-+# CONFIG_FB_CFB_REV_PIXELS_IN_BYTE is not set
-+# CONFIG_FB_SYS_FILLRECT is not set
-+# CONFIG_FB_SYS_COPYAREA is not set
-+# CONFIG_FB_SYS_IMAGEBLIT is not set
-+# CONFIG_FB_FOREIGN_ENDIAN is not set
-+# CONFIG_FB_SYS_FOPS is not set
-+# CONFIG_FB_SVGALIB is not set
-+# CONFIG_FB_MACMODES is not set
-+CONFIG_FB_BACKLIGHT=y
-+CONFIG_FB_MODE_HELPERS=y
-+# CONFIG_FB_TILEBLITTING is not set
-+
-+#
-+# Frame buffer hardware drivers
-+#
-+# CONFIG_FB_CIRRUS is not set
-+# CONFIG_FB_PM2 is not set
-+# CONFIG_FB_CYBER2000 is not set
-+# CONFIG_FB_ASILIANT is not set
-+# CONFIG_FB_IMSTT is not set
-+# CONFIG_FB_S1D13XXX is not set
-+# CONFIG_FB_NVIDIA is not set
-+# CONFIG_FB_RIVA is not set
-+# CONFIG_FB_MATROX is not set
-+CONFIG_FB_RADEON=y
-+# CONFIG_FB_RADEON_I2C is not set
-+CONFIG_FB_RADEON_BACKLIGHT=y
-+# CONFIG_FB_RADEON_DEBUG is not set
-+# CONFIG_FB_ATY128 is not set
-+# CONFIG_FB_ATY is not set
-+# CONFIG_FB_S3 is not set
-+# CONFIG_FB_SAVAGE is not set
-+# CONFIG_FB_SIS is not set
-+# CONFIG_FB_VIA is not set
-+# CONFIG_FB_NEOMAGIC is not set
-+# CONFIG_FB_KYRO is not set
-+# CONFIG_FB_3DFX is not set
-+# CONFIG_FB_VOODOO1 is not set
-+# CONFIG_FB_VT8623 is not set
-+# CONFIG_FB_TRIDENT is not set
-+# CONFIG_FB_ARK is not set
-+# CONFIG_FB_PM3 is not set
-+# CONFIG_FB_CARMINE is not set
-+# CONFIG_FB_SM7XX is not set
-+# CONFIG_FB_VIRTUAL is not set
-+# CONFIG_FB_METRONOME is not set
-+# CONFIG_FB_MB862XX is not set
-+# CONFIG_FB_BROADSHEET is not set
-+CONFIG_BACKLIGHT_LCD_SUPPORT=y
-+CONFIG_LCD_CLASS_DEVICE=m
-+# CONFIG_LCD_ILI9320 is not set
-+# CONFIG_LCD_PLATFORM is not set
-+CONFIG_BACKLIGHT_CLASS_DEVICE=y
-+CONFIG_BACKLIGHT_GENERIC=y
-+
-+#
-+# Display device support
-+#
-+# CONFIG_DISPLAY_SUPPORT is not set
-+
-+#
-+# Console display driver support
-+#
-+# CONFIG_VGA_CONSOLE is not set
-+# CONFIG_MDA_CONSOLE is not set
-+CONFIG_DUMMY_CONSOLE=y
-+CONFIG_FRAMEBUFFER_CONSOLE=y
-+# CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY is not set
-+# CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set
-+# CONFIG_FONTS is not set
-+CONFIG_FONT_8x8=y
-+CONFIG_FONT_8x16=y
-+# CONFIG_LOGO is not set
-+CONFIG_SOUND=y
-+CONFIG_SOUND_OSS_CORE=y
-+CONFIG_SND=m
-+CONFIG_SND_TIMER=m
-+CONFIG_SND_PCM=m
-+CONFIG_SND_RAWMIDI=m
-+CONFIG_SND_SEQUENCER=m
-+CONFIG_SND_SEQ_DUMMY=m
-+CONFIG_SND_OSSEMUL=y
-+CONFIG_SND_MIXER_OSS=m
-+CONFIG_SND_PCM_OSS=m
-+CONFIG_SND_PCM_OSS_PLUGINS=y
-+CONFIG_SND_SEQUENCER_OSS=y
-+# CONFIG_SND_HRTIMER is not set
-+# CONFIG_SND_DYNAMIC_MINORS is not set
-+CONFIG_SND_SUPPORT_OLD_API=y
-+CONFIG_SND_VERBOSE_PROCFS=y
-+# CONFIG_SND_VERBOSE_PRINTK is not set
-+# CONFIG_SND_DEBUG is not set
-+CONFIG_SND_VMASTER=y
-+CONFIG_SND_RAWMIDI_SEQ=m
-+# CONFIG_SND_OPL3_LIB_SEQ is not set
-+# CONFIG_SND_OPL4_LIB_SEQ is not set
-+# CONFIG_SND_SBAWE_SEQ is not set
-+# CONFIG_SND_EMU10K1_SEQ is not set
-+CONFIG_SND_MPU401_UART=m
-+CONFIG_SND_AC97_CODEC=m
-+CONFIG_SND_DRIVERS=y
-+# CONFIG_SND_DUMMY is not set
-+# CONFIG_SND_VIRMIDI is not set
-+# CONFIG_SND_MTPAV is not set
-+# CONFIG_SND_SERIAL_U16550 is not set
-+# CONFIG_SND_MPU401 is not set
-+# CONFIG_SND_AC97_POWER_SAVE is not set
-+CONFIG_SND_PCI=y
-+# CONFIG_SND_AD1889 is not set
-+# CONFIG_SND_ALS300 is not set
-+# CONFIG_SND_ALI5451 is not set
-+# CONFIG_SND_ATIIXP is not set
-+# CONFIG_SND_ATIIXP_MODEM is not set
-+# CONFIG_SND_AU8810 is not set
-+# CONFIG_SND_AU8820 is not set
-+# CONFIG_SND_AU8830 is not set
-+# CONFIG_SND_AW2 is not set
-+# CONFIG_SND_AZT3328 is not set
-+# CONFIG_SND_BT87X is not set
-+# CONFIG_SND_CA0106 is not set
-+# CONFIG_SND_CMIPCI is not set
-+# CONFIG_SND_OXYGEN is not set
-+# CONFIG_SND_CS4281 is not set
-+# CONFIG_SND_CS46XX is not set
-+# CONFIG_SND_CS5535AUDIO is not set
-+# CONFIG_SND_CTXFI is not set
-+# CONFIG_SND_DARLA20 is not set
-+# CONFIG_SND_GINA20 is not set
-+# CONFIG_SND_LAYLA20 is not set
-+# CONFIG_SND_DARLA24 is not set
-+# CONFIG_SND_GINA24 is not set
-+# CONFIG_SND_LAYLA24 is not set
-+# CONFIG_SND_MONA is not set
-+# CONFIG_SND_MIA is not set
-+# CONFIG_SND_ECHO3G is not set
-+# CONFIG_SND_INDIGO is not set
-+# CONFIG_SND_INDIGOIO is not set
-+# CONFIG_SND_INDIGODJ is not set
-+# CONFIG_SND_INDIGOIOX is not set
-+# CONFIG_SND_INDIGODJX is not set
-+# CONFIG_SND_EMU10K1 is not set
-+# CONFIG_SND_EMU10K1X is not set
-+# CONFIG_SND_ENS1370 is not set
-+# CONFIG_SND_ENS1371 is not set
-+# CONFIG_SND_ES1938 is not set
-+# CONFIG_SND_ES1968 is not set
-+# CONFIG_SND_FM801 is not set
-+# CONFIG_SND_HDA_INTEL is not set
-+# CONFIG_SND_HDSP is not set
-+# CONFIG_SND_HDSPM is not set
-+# CONFIG_SND_HIFIER is not set
-+# CONFIG_SND_ICE1712 is not set
-+# CONFIG_SND_ICE1724 is not set
-+# CONFIG_SND_INTEL8X0 is not set
-+# CONFIG_SND_INTEL8X0M is not set
-+# CONFIG_SND_KORG1212 is not set
-+# CONFIG_SND_LX6464ES is not set
-+# CONFIG_SND_MAESTRO3 is not set
-+# CONFIG_SND_MIXART is not set
-+# CONFIG_SND_NM256 is not set
-+# CONFIG_SND_PCXHR is not set
-+# CONFIG_SND_RIPTIDE is not set
-+# CONFIG_SND_RME32 is not set
-+# CONFIG_SND_RME96 is not set
-+# CONFIG_SND_RME9652 is not set
-+# CONFIG_SND_SONICVIBES is not set
-+# CONFIG_SND_TRIDENT is not set
-+CONFIG_SND_VIA82XX=m
-+# CONFIG_SND_VIA82XX_MODEM is not set
-+# CONFIG_SND_VIRTUOSO is not set
-+# CONFIG_SND_VX222 is not set
-+# CONFIG_SND_YMFPCI is not set
-+CONFIG_SND_MIPS=y
-+CONFIG_SND_USB=y
-+# CONFIG_SND_USB_AUDIO is not set
-+# CONFIG_SND_USB_CAIAQ is not set
-+# CONFIG_SND_SOC is not set
-+# CONFIG_SOUND_PRIME is not set
-+CONFIG_AC97_BUS=m
-+CONFIG_HID_SUPPORT=y
-+CONFIG_HID=y
-+# CONFIG_HID_DEBUG is not set
-+CONFIG_HIDRAW=y
-+
-+#
-+# USB Input Devices
-+#
-+CONFIG_USB_HID=m
-+CONFIG_HID_PID=y
-+CONFIG_USB_HIDDEV=y
-+
-+#
-+# USB HID Boot Protocol drivers
-+#
-+# CONFIG_USB_KBD is not set
-+# CONFIG_USB_MOUSE is not set
-+
-+#
-+# Special HID drivers
-+#
-+CONFIG_HID_A4TECH=m
-+CONFIG_HID_APPLE=m
-+CONFIG_HID_BELKIN=m
-+CONFIG_HID_CHERRY=m
-+CONFIG_HID_CHICONY=m
-+CONFIG_HID_CYPRESS=m
-+# CONFIG_HID_DRAGONRISE is not set
-+CONFIG_HID_EZKEY=m
-+# CONFIG_HID_KYE is not set
-+CONFIG_HID_GYRATION=m
-+# CONFIG_HID_KENSINGTON is not set
-+CONFIG_HID_LOGITECH=m
-+CONFIG_LOGITECH_FF=y
-+CONFIG_LOGIRUMBLEPAD2_FF=y
-+CONFIG_HID_MICROSOFT=m
-+CONFIG_HID_MONTEREY=m
-+# CONFIG_HID_NTRIG is not set
-+CONFIG_HID_PANTHERLORD=m
-+# CONFIG_PANTHERLORD_FF is not set
-+CONFIG_HID_PETALYNX=m
-+CONFIG_HID_SAMSUNG=m
-+CONFIG_HID_SONY=m
-+CONFIG_HID_SUNPLUS=m
-+# CONFIG_HID_GREENASIA is not set
-+# CONFIG_HID_SMARTJOYPLUS is not set
-+# CONFIG_HID_TOPSEED is not set
-+# CONFIG_HID_THRUSTMASTER is not set
-+# CONFIG_HID_ZEROPLUS is not set
-+CONFIG_USB_SUPPORT=y
-+CONFIG_USB_ARCH_HAS_HCD=y
-+CONFIG_USB_ARCH_HAS_OHCI=y
-+CONFIG_USB_ARCH_HAS_EHCI=y
-+CONFIG_USB=y
-+# CONFIG_USB_DEBUG is not set
-+CONFIG_USB_ANNOUNCE_NEW_DEVICES=y
-+
-+#
-+# Miscellaneous USB options
-+#
-+CONFIG_USB_DEVICEFS=y
-+# CONFIG_USB_DEVICE_CLASS is not set
-+# CONFIG_USB_DYNAMIC_MINORS is not set
-+# CONFIG_USB_SUSPEND is not set
-+# CONFIG_USB_OTG is not set
-+CONFIG_USB_OTG_WHITELIST=y
-+# CONFIG_USB_OTG_BLACKLIST_HUB is not set
-+# CONFIG_USB_MON is not set
-+# CONFIG_USB_WUSB is not set
-+CONFIG_USB_WUSB_CBAF=m
-+# CONFIG_USB_WUSB_CBAF_DEBUG is not set
-+
-+#
-+# USB Host Controller Drivers
-+#
-+CONFIG_USB_C67X00_HCD=m
-+# CONFIG_USB_XHCI_HCD is not set
-+CONFIG_USB_EHCI_HCD=y
-+CONFIG_USB_EHCI_ROOT_HUB_TT=y
-+CONFIG_USB_EHCI_TT_NEWSCHED=y
-+# CONFIG_USB_OXU210HP_HCD is not set
-+# CONFIG_USB_ISP116X_HCD is not set
-+CONFIG_USB_ISP1760_HCD=m
-+CONFIG_USB_OHCI_HCD=y
-+# CONFIG_USB_OHCI_BIG_ENDIAN_DESC is not set
-+# CONFIG_USB_OHCI_BIG_ENDIAN_MMIO is not set
-+CONFIG_USB_OHCI_LITTLE_ENDIAN=y
-+CONFIG_USB_UHCI_HCD=m
-+# CONFIG_USB_SL811_HCD is not set
-+CONFIG_USB_R8A66597_HCD=m
-+# CONFIG_USB_WHCI_HCD is not set
-+# CONFIG_USB_HWA_HCD is not set
-+
-+#
-+# USB Device Class drivers
-+#
-+CONFIG_USB_ACM=y
-+CONFIG_USB_PRINTER=y
-+CONFIG_USB_WDM=m
-+CONFIG_USB_TMC=m
-+
-+#
-+# NOTE: USB_STORAGE depends on SCSI but BLK_DEV_SD may
-+#
-+
-+#
-+# also be needed; see USB_STORAGE Help for more info
-+#
-+CONFIG_USB_STORAGE=y
-+# CONFIG_USB_STORAGE_DEBUG is not set
-+# CONFIG_USB_STORAGE_DATAFAB is not set
-+# CONFIG_USB_STORAGE_FREECOM is not set
-+# CONFIG_USB_STORAGE_ISD200 is not set
-+# CONFIG_USB_STORAGE_USBAT is not set
-+# CONFIG_USB_STORAGE_SDDR09 is not set
-+# CONFIG_USB_STORAGE_SDDR55 is not set
-+# CONFIG_USB_STORAGE_JUMPSHOT is not set
-+# CONFIG_USB_STORAGE_ALAUDA is not set
-+CONFIG_USB_STORAGE_ONETOUCH=y
-+# CONFIG_USB_STORAGE_KARMA is not set
-+CONFIG_USB_STORAGE_CYPRESS_ATACB=y
-+CONFIG_USB_LIBUSUAL=y
-+
-+#
-+# USB Imaging devices
-+#
-+# CONFIG_USB_MDC800 is not set
-+# CONFIG_USB_MICROTEK is not set
-+
-+#
-+# USB port drivers
-+#
-+# CONFIG_USB_SERIAL is not set
-+
-+#
-+# USB Miscellaneous drivers
-+#
-+# CONFIG_USB_EMI62 is not set
-+# CONFIG_USB_EMI26 is not set
-+# CONFIG_USB_ADUTUX is not set
-+CONFIG_USB_SEVSEG=m
-+# CONFIG_USB_RIO500 is not set
-+# CONFIG_USB_LEGOTOWER is not set
-+# CONFIG_USB_LCD is not set
-+# CONFIG_USB_BERRY_CHARGE is not set
-+# CONFIG_USB_LED is not set
-+# CONFIG_USB_CYPRESS_CY7C63 is not set
-+# CONFIG_USB_CYTHERM is not set
-+# CONFIG_USB_IDMOUSE is not set
-+# CONFIG_USB_FTDI_ELAN is not set
-+# CONFIG_USB_APPLEDISPLAY is not set
-+# CONFIG_USB_SISUSBVGA is not set
-+# CONFIG_USB_LD is not set
-+# CONFIG_USB_TRANCEVIBRATOR is not set
-+# CONFIG_USB_IOWARRIOR is not set
-+# CONFIG_USB_TEST is not set
-+CONFIG_USB_ISIGHTFW=m
-+CONFIG_USB_VST=m
-+# CONFIG_USB_GADGET is not set
-+
-+#
-+# OTG and related infrastructure
-+#
-+# CONFIG_NOP_USB_XCEIV is not set
-+# CONFIG_UWB is not set
-+# CONFIG_MMC is not set
-+# CONFIG_MEMSTICK is not set
-+# CONFIG_NEW_LEDS is not set
-+# CONFIG_ACCESSIBILITY is not set
-+# CONFIG_INFINIBAND is not set
-+CONFIG_RTC_LIB=y
-+CONFIG_RTC_CLASS=y
-+CONFIG_RTC_HCTOSYS=y
-+CONFIG_RTC_HCTOSYS_DEVICE="rtc0"
-+# CONFIG_RTC_DEBUG is not set
-+
-+#
-+# RTC interfaces
-+#
-+CONFIG_RTC_INTF_SYSFS=y
-+CONFIG_RTC_INTF_PROC=y
-+CONFIG_RTC_INTF_DEV=y
-+# CONFIG_RTC_INTF_DEV_UIE_EMUL is not set
-+# CONFIG_RTC_DRV_TEST is not set
-+
-+#
-+# I2C RTC drivers
-+#
-+# CONFIG_RTC_DRV_DS1307 is not set
-+# CONFIG_RTC_DRV_DS1374 is not set
-+# CONFIG_RTC_DRV_DS1672 is not set
-+# CONFIG_RTC_DRV_MAX6900 is not set
-+# CONFIG_RTC_DRV_RS5C372 is not set
-+# CONFIG_RTC_DRV_ISL1208 is not set
-+# CONFIG_RTC_DRV_X1205 is not set
-+# CONFIG_RTC_DRV_PCF8563 is not set
-+# CONFIG_RTC_DRV_PCF8583 is not set
-+# CONFIG_RTC_DRV_M41T80 is not set
-+# CONFIG_RTC_DRV_S35390A is not set
-+# CONFIG_RTC_DRV_FM3130 is not set
-+# CONFIG_RTC_DRV_RX8581 is not set
-+# CONFIG_RTC_DRV_RX8025 is not set
-+
-+#
-+# SPI RTC drivers
-+#
-+
-+#
-+# Platform RTC drivers
-+#
-+CONFIG_RTC_DRV_CMOS=y
-+# CONFIG_RTC_DRV_DS1286 is not set
-+# CONFIG_RTC_DRV_DS1511 is not set
-+# CONFIG_RTC_DRV_DS1553 is not set
-+# CONFIG_RTC_DRV_DS1742 is not set
-+# CONFIG_RTC_DRV_STK17TA8 is not set
-+# CONFIG_RTC_DRV_M48T86 is not set
-+# CONFIG_RTC_DRV_M48T35 is not set
-+# CONFIG_RTC_DRV_M48T59 is not set
-+# CONFIG_RTC_DRV_BQ4802 is not set
-+# CONFIG_RTC_DRV_V3020 is not set
-+
-+#
-+# on-CPU RTC drivers
-+#
-+# CONFIG_DMADEVICES is not set
-+# CONFIG_AUXDISPLAY is not set
-+CONFIG_UIO=m
-+CONFIG_UIO_CIF=m
-+# CONFIG_UIO_PDRV is not set
-+# CONFIG_UIO_PDRV_GENIRQ is not set
-+# CONFIG_UIO_SMX is not set
-+# CONFIG_UIO_AEC is not set
-+# CONFIG_UIO_SERCOS3 is not set
-+
-+#
-+# TI VLYNQ
-+#
-+# CONFIG_STAGING is not set
-+
-+#
-+# File systems
-+#
-+CONFIG_EXT2_FS=y
-+# CONFIG_EXT2_FS_XATTR is not set
-+CONFIG_EXT2_FS_XIP=y
-+CONFIG_EXT3_FS=y
-+# CONFIG_EXT3_DEFAULTS_TO_ORDERED is not set
-+# CONFIG_EXT3_FS_XATTR is not set
-+CONFIG_EXT4_FS=m
-+CONFIG_EXT4DEV_COMPAT=y
-+CONFIG_EXT4_FS_XATTR=y
-+CONFIG_EXT4_FS_POSIX_ACL=y
-+CONFIG_EXT4_FS_SECURITY=y
-+CONFIG_FS_XIP=y
-+CONFIG_JBD=y
-+# CONFIG_JBD_DEBUG is not set
-+CONFIG_JBD2=m
-+# CONFIG_JBD2_DEBUG is not set
-+CONFIG_FS_MBCACHE=m
-+CONFIG_REISERFS_FS=m
-+# CONFIG_REISERFS_CHECK is not set
-+# CONFIG_REISERFS_PROC_INFO is not set
-+# CONFIG_REISERFS_FS_XATTR is not set
-+# CONFIG_JFS_FS is not set
-+CONFIG_FS_POSIX_ACL=y
-+# CONFIG_XFS_FS is not set
-+# CONFIG_GFS2_FS is not set
-+# CONFIG_OCFS2_FS is not set
-+# CONFIG_BTRFS_FS is not set
-+CONFIG_FILE_LOCKING=y
-+CONFIG_FSNOTIFY=y
-+CONFIG_DNOTIFY=y
-+CONFIG_INOTIFY=y
-+CONFIG_INOTIFY_USER=y
-+# CONFIG_QUOTA is not set
-+CONFIG_AUTOFS_FS=y
-+CONFIG_AUTOFS4_FS=y
-+CONFIG_FUSE_FS=y
-+# CONFIG_CUSE is not set
-+
-+#
-+# Caches
-+#
-+# CONFIG_FSCACHE is not set
-+
-+#
-+# CD-ROM/DVD Filesystems
-+#
-+CONFIG_ISO9660_FS=m
-+CONFIG_JOLIET=y
-+CONFIG_ZISOFS=y
-+CONFIG_UDF_FS=m
-+CONFIG_UDF_NLS=y
-+
-+#
-+# DOS/FAT/NT Filesystems
-+#
-+CONFIG_FAT_FS=m
-+CONFIG_MSDOS_FS=m
-+CONFIG_VFAT_FS=m
-+CONFIG_FAT_DEFAULT_CODEPAGE=936
-+CONFIG_FAT_DEFAULT_IOCHARSET="utf8"
-+CONFIG_NTFS_FS=m
-+# CONFIG_NTFS_DEBUG is not set
-+CONFIG_NTFS_RW=y
-+
-+#
-+# Pseudo filesystems
-+#
-+CONFIG_PROC_FS=y
-+CONFIG_PROC_KCORE=y
-+CONFIG_PROC_SYSCTL=y
-+CONFIG_PROC_PAGE_MONITOR=y
-+CONFIG_SYSFS=y
-+CONFIG_TMPFS=y
-+# CONFIG_TMPFS_POSIX_ACL is not set
-+# CONFIG_HUGETLB_PAGE is not set
-+# CONFIG_CONFIGFS_FS is not set
-+CONFIG_MISC_FILESYSTEMS=y
-+# CONFIG_ADFS_FS is not set
-+# CONFIG_AFFS_FS is not set
-+# CONFIG_HFS_FS is not set
-+# CONFIG_HFSPLUS_FS is not set
-+# CONFIG_BEFS_FS is not set
-+# CONFIG_BFS_FS is not set
-+# CONFIG_EFS_FS is not set
-+# CONFIG_JFFS2_FS is not set
-+# CONFIG_CRAMFS is not set
-+# CONFIG_SQUASHFS is not set
-+# CONFIG_VXFS_FS is not set
-+# CONFIG_MINIX_FS is not set
-+CONFIG_OMFS_FS=m
-+# CONFIG_HPFS_FS is not set
-+# CONFIG_QNX4FS_FS is not set
-+# CONFIG_ROMFS_FS is not set
-+# CONFIG_SYSV_FS is not set
-+# CONFIG_UFS_FS is not set
-+# CONFIG_NILFS2_FS is not set
-+CONFIG_NETWORK_FILESYSTEMS=y
-+CONFIG_NFS_FS=m
-+CONFIG_NFS_V3=y
-+CONFIG_NFS_V3_ACL=y
-+CONFIG_NFS_V4=y
-+# CONFIG_NFS_V4_1 is not set
-+CONFIG_NFSD=m
-+CONFIG_NFSD_V2_ACL=y
-+CONFIG_NFSD_V3=y
-+CONFIG_NFSD_V3_ACL=y
-+CONFIG_NFSD_V4=y
-+CONFIG_LOCKD=m
-+CONFIG_LOCKD_V4=y
-+CONFIG_EXPORTFS=m
-+CONFIG_NFS_ACL_SUPPORT=m
-+CONFIG_NFS_COMMON=y
-+CONFIG_SUNRPC=m
-+CONFIG_SUNRPC_GSS=m
-+CONFIG_RPCSEC_GSS_KRB5=m
-+# CONFIG_RPCSEC_GSS_SPKM3 is not set
-+CONFIG_SMB_FS=m
-+CONFIG_SMB_NLS_DEFAULT=y
-+CONFIG_SMB_NLS_REMOTE="cp936"
-+CONFIG_CIFS=m
-+CONFIG_CIFS_STATS=y
-+CONFIG_CIFS_STATS2=y
-+CONFIG_CIFS_WEAK_PW_HASH=y
-+CONFIG_CIFS_XATTR=y
-+CONFIG_CIFS_POSIX=y
-+CONFIG_CIFS_DEBUG2=y
-+CONFIG_CIFS_EXPERIMENTAL=y
-+# CONFIG_NCP_FS is not set
-+# CONFIG_CODA_FS is not set
-+# CONFIG_AFS_FS is not set
-+# CONFIG_9P_FS is not set
-+
-+#
-+# Partition Types
-+#
-+CONFIG_PARTITION_ADVANCED=y
-+# CONFIG_ACORN_PARTITION is not set
-+# CONFIG_OSF_PARTITION is not set
-+# CONFIG_AMIGA_PARTITION is not set
-+# CONFIG_ATARI_PARTITION is not set
-+# CONFIG_MAC_PARTITION is not set
-+CONFIG_MSDOS_PARTITION=y
-+# CONFIG_BSD_DISKLABEL is not set
-+# CONFIG_MINIX_SUBPARTITION is not set
-+# CONFIG_SOLARIS_X86_PARTITION is not set
-+# CONFIG_UNIXWARE_DISKLABEL is not set
-+# CONFIG_LDM_PARTITION is not set
-+# CONFIG_SGI_PARTITION is not set
-+# CONFIG_ULTRIX_PARTITION is not set
-+# CONFIG_SUN_PARTITION is not set
-+# CONFIG_KARMA_PARTITION is not set
-+# CONFIG_EFI_PARTITION is not set
-+# CONFIG_SYSV68_PARTITION is not set
-+CONFIG_NLS=y
-+CONFIG_NLS_DEFAULT="utf8"
-+# CONFIG_NLS_CODEPAGE_437 is not set
-+# CONFIG_NLS_CODEPAGE_737 is not set
-+# CONFIG_NLS_CODEPAGE_775 is not set
-+# CONFIG_NLS_CODEPAGE_850 is not set
-+# CONFIG_NLS_CODEPAGE_852 is not set
-+# CONFIG_NLS_CODEPAGE_855 is not set
-+# CONFIG_NLS_CODEPAGE_857 is not set
-+# CONFIG_NLS_CODEPAGE_860 is not set
-+# CONFIG_NLS_CODEPAGE_861 is not set
-+# CONFIG_NLS_CODEPAGE_862 is not set
-+# CONFIG_NLS_CODEPAGE_863 is not set
-+# CONFIG_NLS_CODEPAGE_864 is not set
-+# CONFIG_NLS_CODEPAGE_865 is not set
-+# CONFIG_NLS_CODEPAGE_866 is not set
-+# CONFIG_NLS_CODEPAGE_869 is not set
-+CONFIG_NLS_CODEPAGE_936=y
-+# CONFIG_NLS_CODEPAGE_950 is not set
-+# CONFIG_NLS_CODEPAGE_932 is not set
-+# CONFIG_NLS_CODEPAGE_949 is not set
-+# CONFIG_NLS_CODEPAGE_874 is not set
-+# CONFIG_NLS_ISO8859_8 is not set
-+# CONFIG_NLS_CODEPAGE_1250 is not set
-+# CONFIG_NLS_CODEPAGE_1251 is not set
-+# CONFIG_NLS_ASCII is not set
-+CONFIG_NLS_ISO8859_1=y
-+# CONFIG_NLS_ISO8859_2 is not set
-+# CONFIG_NLS_ISO8859_3 is not set
-+# CONFIG_NLS_ISO8859_4 is not set
-+# CONFIG_NLS_ISO8859_5 is not set
-+# CONFIG_NLS_ISO8859_6 is not set
-+# CONFIG_NLS_ISO8859_7 is not set
-+# CONFIG_NLS_ISO8859_9 is not set
-+# CONFIG_NLS_ISO8859_13 is not set
-+# CONFIG_NLS_ISO8859_14 is not set
-+# CONFIG_NLS_ISO8859_15 is not set
-+# CONFIG_NLS_KOI8_R is not set
-+# CONFIG_NLS_KOI8_U is not set
-+CONFIG_NLS_UTF8=y
-+# CONFIG_DLM is not set
-+
-+#
-+# Kernel hacking
-+#
-+CONFIG_TRACE_IRQFLAGS_SUPPORT=y
-+# CONFIG_PRINTK_TIME is not set
-+CONFIG_ENABLE_WARN_DEPRECATED=y
-+# CONFIG_ENABLE_MUST_CHECK is not set
-+CONFIG_FRAME_WARN=2048
-+# CONFIG_MAGIC_SYSRQ is not set
-+# CONFIG_UNUSED_SYMBOLS is not set
-+CONFIG_DEBUG_FS=y
-+# CONFIG_HEADERS_CHECK is not set
-+# CONFIG_DEBUG_KERNEL is not set
-+CONFIG_STACKTRACE=y
-+# CONFIG_DEBUG_MEMORY_INIT is not set
-+# CONFIG_RCU_CPU_STALL_DETECTOR is not set
-+CONFIG_SYSCTL_SYSCALL_CHECK=y
-+CONFIG_NOP_TRACER=y
-+CONFIG_RING_BUFFER=y
-+CONFIG_EVENT_TRACING=y
-+CONFIG_CONTEXT_SWITCH_TRACER=y
-+CONFIG_TRACING=y
-+CONFIG_TRACING_SUPPORT=y
-+# CONFIG_FTRACE is not set
-+# CONFIG_DYNAMIC_DEBUG is not set
-+# CONFIG_SAMPLES is not set
-+CONFIG_HAVE_ARCH_KGDB=y
-+CONFIG_CMDLINE=""
-+
-+#
-+# Security options
-+#
-+# CONFIG_KEYS is not set
-+# CONFIG_SECURITY is not set
-+# CONFIG_SECURITYFS is not set
-+CONFIG_SECURITY_FILE_CAPABILITIES=y
-+CONFIG_CRYPTO=y
-+
-+#
-+# Crypto core or helper
-+#
-+CONFIG_CRYPTO_FIPS=y
-+CONFIG_CRYPTO_ALGAPI=y
-+CONFIG_CRYPTO_ALGAPI2=y
-+CONFIG_CRYPTO_AEAD=m
-+CONFIG_CRYPTO_AEAD2=y
-+CONFIG_CRYPTO_BLKCIPHER=m
-+CONFIG_CRYPTO_BLKCIPHER2=y
-+CONFIG_CRYPTO_HASH=y
-+CONFIG_CRYPTO_HASH2=y
-+CONFIG_CRYPTO_RNG=m
-+CONFIG_CRYPTO_RNG2=y
-+CONFIG_CRYPTO_PCOMP=y
-+CONFIG_CRYPTO_MANAGER=y
-+CONFIG_CRYPTO_MANAGER2=y
-+CONFIG_CRYPTO_GF128MUL=m
-+# CONFIG_CRYPTO_NULL is not set
-+CONFIG_CRYPTO_WORKQUEUE=y
-+# CONFIG_CRYPTO_CRYPTD is not set
-+CONFIG_CRYPTO_AUTHENC=m
-+# CONFIG_CRYPTO_TEST is not set
-+
-+#
-+# Authenticated Encryption with Associated Data
-+#
-+CONFIG_CRYPTO_CCM=m
-+CONFIG_CRYPTO_GCM=m
-+CONFIG_CRYPTO_SEQIV=m
-+
-+#
-+# Block modes
-+#
-+CONFIG_CRYPTO_CBC=m
-+CONFIG_CRYPTO_CTR=m
-+CONFIG_CRYPTO_CTS=m
-+CONFIG_CRYPTO_ECB=m
-+# CONFIG_CRYPTO_LRW is not set
-+CONFIG_CRYPTO_PCBC=m
-+CONFIG_CRYPTO_XTS=m
-+
-+#
-+# Hash modes
-+#
-+CONFIG_CRYPTO_HMAC=y
-+# CONFIG_CRYPTO_XCBC is not set
-+
-+#
-+# Digest
-+#
-+# CONFIG_CRYPTO_CRC32C is not set
-+# CONFIG_CRYPTO_MD4 is not set
-+CONFIG_CRYPTO_MD5=m
-+# CONFIG_CRYPTO_MICHAEL_MIC is not set
-+CONFIG_CRYPTO_RMD128=m
-+CONFIG_CRYPTO_RMD160=m
-+CONFIG_CRYPTO_RMD256=m
-+CONFIG_CRYPTO_RMD320=m
-+CONFIG_CRYPTO_SHA1=m
-+# CONFIG_CRYPTO_SHA256 is not set
-+# CONFIG_CRYPTO_SHA512 is not set
-+# CONFIG_CRYPTO_TGR192 is not set
-+# CONFIG_CRYPTO_WP512 is not set
-+
-+#
-+# Ciphers
-+#
-+CONFIG_CRYPTO_AES=m
-+# CONFIG_CRYPTO_ANUBIS is not set
-+CONFIG_CRYPTO_ARC4=m
-+# CONFIG_CRYPTO_BLOWFISH is not set
-+# CONFIG_CRYPTO_CAMELLIA is not set
-+# CONFIG_CRYPTO_CAST5 is not set
-+# CONFIG_CRYPTO_CAST6 is not set
-+CONFIG_CRYPTO_DES=m
-+# CONFIG_CRYPTO_FCRYPT is not set
-+# CONFIG_CRYPTO_KHAZAD is not set
-+CONFIG_CRYPTO_SALSA20=m
-+CONFIG_CRYPTO_SEED=m
-+# CONFIG_CRYPTO_SERPENT is not set
-+# CONFIG_CRYPTO_TEA is not set
-+# CONFIG_CRYPTO_TWOFISH is not set
-+
-+#
-+# Compression
-+#
-+CONFIG_CRYPTO_DEFLATE=m
-+# CONFIG_CRYPTO_ZLIB is not set
-+CONFIG_CRYPTO_LZO=m
-+
-+#
-+# Random Number Generation
-+#
-+CONFIG_CRYPTO_ANSI_CPRNG=m
-+# CONFIG_CRYPTO_HW is not set
-+CONFIG_BINARY_PRINTF=y
-+
-+#
-+# Library routines
-+#
-+CONFIG_BITREVERSE=y
-+CONFIG_GENERIC_FIND_LAST_BIT=y
-+CONFIG_CRC_CCITT=y
-+CONFIG_CRC16=m
-+# CONFIG_CRC_T10DIF is not set
-+CONFIG_CRC_ITU_T=m
-+CONFIG_CRC32=y
-+CONFIG_CRC7=m
-+# CONFIG_LIBCRC32C is not set
-+CONFIG_ZLIB_INFLATE=m
-+CONFIG_ZLIB_DEFLATE=m
-+CONFIG_LZO_COMPRESS=m
-+CONFIG_LZO_DECOMPRESS=m
-+CONFIG_TEXTSEARCH=y
-+CONFIG_TEXTSEARCH_KMP=m
-+CONFIG_TEXTSEARCH_BM=m
-+CONFIG_TEXTSEARCH_FSM=m
-+CONFIG_HAS_IOMEM=y
-+CONFIG_HAS_IOPORT=y
-+CONFIG_HAS_DMA=y
-+CONFIG_NLATTR=y
-diff -Nur linux-2.6.30.5.orig/arch/mips/configs/fuloong2f_defconfig linux-2.6.30.5/arch/mips/configs/fuloong2f_defconfig
---- linux-2.6.30.5.orig/arch/mips/configs/fuloong2f_defconfig 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.30.5/arch/mips/configs/fuloong2f_defconfig 2009-08-23 19:01:04.000000000 +0200
-@@ -0,0 +1,2637 @@
-+#
-+# Automatically generated make config: don't edit
-+# Linux kernel version: 2.6.30-rc8
-+# Wed Jun 10 22:20:53 2009
-+#
-+CONFIG_MIPS=y
-+
-+#
-+# Machine selection
-+#
-+# CONFIG_MACH_ALCHEMY is not set
-+# CONFIG_BASLER_EXCITE is not set
-+# CONFIG_BCM47XX is not set
-+# CONFIG_MIPS_COBALT is not set
-+# CONFIG_MACH_DECSTATION is not set
-+# CONFIG_MACH_JAZZ is not set
-+# CONFIG_LASAT is not set
-+CONFIG_MACH_LOONGSON=y
-+# CONFIG_MIPS_MALTA is not set
-+# CONFIG_MIPS_SIM is not set
-+# CONFIG_NEC_MARKEINS is not set
-+# CONFIG_MACH_VR41XX is not set
-+# CONFIG_NXP_STB220 is not set
-+# CONFIG_NXP_STB225 is not set
-+# CONFIG_PNX8550_JBS is not set
-+# CONFIG_PNX8550_STB810 is not set
-+# CONFIG_PMC_MSP is not set
-+# CONFIG_PMC_YOSEMITE is not set
-+# CONFIG_SGI_IP22 is not set
-+# CONFIG_SGI_IP27 is not set
-+# CONFIG_SGI_IP28 is not set
-+# CONFIG_SGI_IP32 is not set
-+# CONFIG_SIBYTE_CRHINE is not set
-+# CONFIG_SIBYTE_CARMEL is not set
-+# CONFIG_SIBYTE_CRHONE is not set
-+# CONFIG_SIBYTE_RHONE is not set
-+# CONFIG_SIBYTE_SWARM is not set
-+# CONFIG_SIBYTE_LITTLESUR is not set
-+# CONFIG_SIBYTE_SENTOSA is not set
-+# CONFIG_SIBYTE_BIGSUR is not set
-+# CONFIG_SNI_RM is not set
-+# CONFIG_MACH_TX39XX is not set
-+# CONFIG_MACH_TX49XX is not set
-+# CONFIG_MIKROTIK_RB532 is not set
-+# CONFIG_WR_PPMC is not set
-+# CONFIG_CAVIUM_OCTEON_SIMULATOR is not set
-+# CONFIG_CAVIUM_OCTEON_REFERENCE_BOARD is not set
-+CONFIG_ARCH_SPARSEMEM_ENABLE=y
-+# CONFIG_LEMOTE_FULOONG2E is not set
-+CONFIG_LEMOTE_FULOONG2F=y
-+# CONFIG_LEMOTE_YEELOONG2F is not set
-+CONFIG_CS5536=y
-+CONFIG_CS5536_MFGPT=y
-+CONFIG_UCA_SIZE=0x2000000
-+CONFIG_RWSEM_GENERIC_SPINLOCK=y
-+# CONFIG_ARCH_HAS_ILOG2_U32 is not set
-+# CONFIG_ARCH_HAS_ILOG2_U64 is not set
-+CONFIG_ARCH_SUPPORTS_OPROFILE=y
-+CONFIG_GENERIC_FIND_NEXT_BIT=y
-+CONFIG_GENERIC_HWEIGHT=y
-+CONFIG_GENERIC_CALIBRATE_DELAY=y
-+CONFIG_GENERIC_CLOCKEVENTS=y
-+CONFIG_GENERIC_TIME=y
-+CONFIG_GENERIC_CMOS_UPDATE=y
-+CONFIG_SCHED_OMIT_FRAME_POINTER=y
-+CONFIG_GENERIC_HARDIRQS_NO__DO_IRQ=y
-+CONFIG_DMA_NONCOHERENT=y
-+CONFIG_DMA_NEED_PCI_MAP_STATE=y
-+CONFIG_EARLY_PRINTK=y
-+CONFIG_SYS_HAS_EARLY_PRINTK=y
-+# CONFIG_HOTPLUG_CPU is not set
-+CONFIG_I8259=y
-+# CONFIG_NO_IOPORT is not set
-+CONFIG_GENERIC_ISA_DMA=y
-+CONFIG_GENERIC_ISA_DMA_SUPPORT_BROKEN=y
-+# CONFIG_CPU_BIG_ENDIAN is not set
-+CONFIG_CPU_LITTLE_ENDIAN=y
-+CONFIG_SYS_SUPPORTS_LITTLE_ENDIAN=y
-+CONFIG_IRQ_CPU=y
-+CONFIG_BOOT_ELF32=y
-+CONFIG_MIPS_L1_CACHE_SHIFT=5
-+
-+#
-+# CPU selection
-+#
-+# CONFIG_CPU_LOONGSON2E is not set
-+CONFIG_CPU_LOONGSON2F=y
-+# CONFIG_CPU_MIPS32_R1 is not set
-+# CONFIG_CPU_MIPS32_R2 is not set
-+# CONFIG_CPU_MIPS64_R1 is not set
-+# CONFIG_CPU_MIPS64_R2 is not set
-+# CONFIG_CPU_R3000 is not set
-+# CONFIG_CPU_TX39XX is not set
-+# CONFIG_CPU_VR41XX is not set
-+# CONFIG_CPU_R4300 is not set
-+# CONFIG_CPU_R4X00 is not set
-+# CONFIG_CPU_TX49XX is not set
-+# CONFIG_CPU_R5000 is not set
-+# CONFIG_CPU_R5432 is not set
-+# CONFIG_CPU_R5500 is not set
-+# CONFIG_CPU_R6000 is not set
-+# CONFIG_CPU_NEVADA is not set
-+# CONFIG_CPU_R8000 is not set
-+# CONFIG_CPU_R10000 is not set
-+# CONFIG_CPU_RM7000 is not set
-+# CONFIG_CPU_RM9000 is not set
-+# CONFIG_CPU_SB1 is not set
-+# CONFIG_CPU_CAVIUM_OCTEON is not set
-+CONFIG_CPU_LOONGSON2=y
-+CONFIG_SYS_HAS_CPU_LOONGSON2F=y
-+CONFIG_SYS_SUPPORTS_32BIT_KERNEL=y
-+CONFIG_SYS_SUPPORTS_64BIT_KERNEL=y
-+CONFIG_CPU_SUPPORTS_32BIT_KERNEL=y
-+CONFIG_CPU_SUPPORTS_64BIT_KERNEL=y
-+
-+#
-+# Kernel type
-+#
-+# CONFIG_32BIT is not set
-+CONFIG_64BIT=y
-+# CONFIG_PAGE_SIZE_4KB is not set
-+# CONFIG_PAGE_SIZE_8KB is not set
-+CONFIG_PAGE_SIZE_16KB=y
-+# CONFIG_PAGE_SIZE_32KB is not set
-+# CONFIG_PAGE_SIZE_64KB is not set
-+CONFIG_BOARD_SCACHE=y
-+CONFIG_MIPS_MT_DISABLED=y
-+# CONFIG_MIPS_MT_SMP is not set
-+# CONFIG_MIPS_MT_SMTC is not set
-+CONFIG_CPU_HAS_WB=y
-+CONFIG_CPU_HAS_SYNC=y
-+CONFIG_GENERIC_HARDIRQS=y
-+CONFIG_GENERIC_IRQ_PROBE=y
-+CONFIG_CPU_SUPPORTS_HIGHMEM=y
-+CONFIG_SYS_SUPPORTS_HIGHMEM=y
-+CONFIG_ARCH_FLATMEM_ENABLE=y
-+CONFIG_ARCH_POPULATES_NODE_MAP=y
-+CONFIG_SELECT_MEMORY_MODEL=y
-+# CONFIG_FLATMEM_MANUAL is not set
-+# CONFIG_DISCONTIGMEM_MANUAL is not set
-+CONFIG_SPARSEMEM_MANUAL=y
-+CONFIG_SPARSEMEM=y
-+CONFIG_HAVE_MEMORY_PRESENT=y
-+CONFIG_SPARSEMEM_STATIC=y
-+
-+#
-+# Memory hotplug is currently incompatible with Software Suspend
-+#
-+CONFIG_PAGEFLAGS_EXTENDED=y
-+CONFIG_SPLIT_PTLOCK_CPUS=4
-+CONFIG_PHYS_ADDR_T_64BIT=y
-+CONFIG_ZONE_DMA_FLAG=0
-+CONFIG_VIRT_TO_BUS=y
-+CONFIG_UNEVICTABLE_LRU=y
-+CONFIG_HAVE_MLOCK=y
-+CONFIG_HAVE_MLOCKED_PAGE_BIT=y
-+CONFIG_TICK_ONESHOT=y
-+CONFIG_NO_HZ=y
-+CONFIG_HIGH_RES_TIMERS=y
-+CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
-+# CONFIG_HZ_48 is not set
-+# CONFIG_HZ_100 is not set
-+# CONFIG_HZ_128 is not set
-+CONFIG_HZ_250=y
-+# CONFIG_HZ_256 is not set
-+# CONFIG_HZ_1000 is not set
-+# CONFIG_HZ_1024 is not set
-+CONFIG_SYS_SUPPORTS_ARBIT_HZ=y
-+CONFIG_HZ=250
-+# CONFIG_PREEMPT_NONE is not set
-+CONFIG_PREEMPT_VOLUNTARY=y
-+# CONFIG_PREEMPT is not set
-+CONFIG_KEXEC=y
-+# CONFIG_SECCOMP is not set
-+CONFIG_LOCKDEP_SUPPORT=y
-+CONFIG_STACKTRACE_SUPPORT=y
-+CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
-+
-+#
-+# General setup
-+#
-+CONFIG_EXPERIMENTAL=y
-+CONFIG_BROKEN_ON_SMP=y
-+CONFIG_INIT_ENV_ARG_LIMIT=32
-+CONFIG_LOCALVERSION=""
-+# CONFIG_LOCALVERSION_AUTO is not set
-+CONFIG_SWAP=y
-+CONFIG_SYSVIPC=y
-+CONFIG_SYSVIPC_SYSCTL=y
-+CONFIG_POSIX_MQUEUE=y
-+CONFIG_POSIX_MQUEUE_SYSCTL=y
-+CONFIG_BSD_PROCESS_ACCT=y
-+CONFIG_BSD_PROCESS_ACCT_V3=y
-+# CONFIG_TASKSTATS is not set
-+CONFIG_AUDIT=y
-+
-+#
-+# RCU Subsystem
-+#
-+CONFIG_CLASSIC_RCU=y
-+# CONFIG_TREE_RCU is not set
-+# CONFIG_PREEMPT_RCU is not set
-+# CONFIG_TREE_RCU_TRACE is not set
-+# CONFIG_PREEMPT_RCU_TRACE is not set
-+CONFIG_IKCONFIG=y
-+CONFIG_IKCONFIG_PROC=y
-+CONFIG_LOG_BUF_SHIFT=15
-+# CONFIG_GROUP_SCHED is not set
-+# CONFIG_CGROUPS is not set
-+CONFIG_SYSFS_DEPRECATED=y
-+CONFIG_SYSFS_DEPRECATED_V2=y
-+# CONFIG_RELAY is not set
-+# CONFIG_NAMESPACES is not set
-+CONFIG_BLK_DEV_INITRD=y
-+CONFIG_INITRAMFS_SOURCE=""
-+CONFIG_RD_GZIP=y
-+# CONFIG_RD_BZIP2 is not set
-+# CONFIG_RD_LZMA is not set
-+CONFIG_CC_OPTIMIZE_FOR_SIZE=y
-+CONFIG_SYSCTL=y
-+CONFIG_ANON_INODES=y
-+CONFIG_EMBEDDED=y
-+CONFIG_SYSCTL_SYSCALL=y
-+CONFIG_KALLSYMS=y
-+# CONFIG_KALLSYMS_EXTRA_PASS is not set
-+# CONFIG_STRIP_ASM_SYMS is not set
-+CONFIG_HOTPLUG=y
-+CONFIG_PRINTK=y
-+CONFIG_BUG=y
-+CONFIG_ELF_CORE=y
-+CONFIG_PCSPKR_PLATFORM=y
-+CONFIG_BASE_FULL=y
-+CONFIG_FUTEX=y
-+CONFIG_EPOLL=y
-+CONFIG_SIGNALFD=y
-+CONFIG_TIMERFD=y
-+CONFIG_EVENTFD=y
-+CONFIG_SHMEM=y
-+CONFIG_AIO=y
-+CONFIG_VM_EVENT_COUNTERS=y
-+CONFIG_PCI_QUIRKS=y
-+CONFIG_COMPAT_BRK=y
-+CONFIG_SLAB=y
-+# CONFIG_SLUB is not set
-+# CONFIG_SLOB is not set
-+CONFIG_PROFILING=y
-+# CONFIG_MARKERS is not set
-+# CONFIG_OPROFILE is not set
-+CONFIG_HAVE_OPROFILE=y
-+CONFIG_HAVE_SYSCALL_WRAPPERS=y
-+# CONFIG_SLOW_WORK is not set
-+# CONFIG_HAVE_GENERIC_DMA_COHERENT is not set
-+CONFIG_SLABINFO=y
-+CONFIG_RT_MUTEXES=y
-+CONFIG_BASE_SMALL=0
-+CONFIG_MODULES=y
-+# CONFIG_MODULE_FORCE_LOAD is not set
-+CONFIG_MODULE_UNLOAD=y
-+CONFIG_MODULE_FORCE_UNLOAD=y
-+CONFIG_MODVERSIONS=y
-+# CONFIG_MODULE_SRCVERSION_ALL is not set
-+CONFIG_BLOCK=y
-+# CONFIG_BLK_DEV_BSG is not set
-+# CONFIG_BLK_DEV_INTEGRITY is not set
-+CONFIG_BLOCK_COMPAT=y
-+
-+#
-+# IO Schedulers
-+#
-+CONFIG_IOSCHED_NOOP=y
-+CONFIG_IOSCHED_AS=y
-+CONFIG_IOSCHED_DEADLINE=y
-+CONFIG_IOSCHED_CFQ=y
-+# CONFIG_DEFAULT_AS is not set
-+# CONFIG_DEFAULT_DEADLINE is not set
-+CONFIG_DEFAULT_CFQ=y
-+# CONFIG_DEFAULT_NOOP is not set
-+CONFIG_DEFAULT_IOSCHED="cfq"
-+# CONFIG_PROBE_INITRD_HEADER is not set
-+CONFIG_FREEZER=y
-+
-+#
-+# Bus options (PCI, PCMCIA, EISA, ISA, TC)
-+#
-+CONFIG_HW_HAS_PCI=y
-+CONFIG_PCI=y
-+CONFIG_PCI_DOMAINS=y
-+# CONFIG_ARCH_SUPPORTS_MSI is not set
-+CONFIG_PCI_LEGACY=y
-+# CONFIG_PCI_STUB is not set
-+# CONFIG_PCI_IOV is not set
-+CONFIG_ISA=y
-+CONFIG_MMU=y
-+CONFIG_PCCARD=m
-+# CONFIG_PCMCIA_DEBUG is not set
-+CONFIG_PCMCIA=m
-+CONFIG_PCMCIA_LOAD_CIS=y
-+CONFIG_PCMCIA_IOCTL=y
-+CONFIG_CARDBUS=y
-+
-+#
-+# PC-card bridges
-+#
-+CONFIG_YENTA=m
-+CONFIG_YENTA_O2=y
-+CONFIG_YENTA_RICOH=y
-+CONFIG_YENTA_TI=y
-+CONFIG_YENTA_ENE_TUNE=y
-+CONFIG_YENTA_TOSHIBA=y
-+CONFIG_PD6729=m
-+CONFIG_I82092=m
-+CONFIG_I82365=m
-+CONFIG_TCIC=m
-+CONFIG_PCMCIA_PROBE=y
-+CONFIG_PCCARD_NONSTATIC=m
-+CONFIG_HOTPLUG_PCI=m
-+CONFIG_HOTPLUG_PCI_FAKE=m
-+CONFIG_HOTPLUG_PCI_CPCI=y
-+CONFIG_HOTPLUG_PCI_SHPC=m
-+
-+#
-+# Executable file formats
-+#
-+CONFIG_BINFMT_ELF=y
-+# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set
-+# CONFIG_HAVE_AOUT is not set
-+CONFIG_BINFMT_MISC=m
-+CONFIG_MIPS32_COMPAT=y
-+CONFIG_COMPAT=y
-+CONFIG_SYSVIPC_COMPAT=y
-+CONFIG_MIPS32_O32=y
-+CONFIG_MIPS32_N32=y
-+CONFIG_BINFMT_ELF32=y
-+
-+#
-+# Power management options
-+#
-+CONFIG_ARCH_HIBERNATION_POSSIBLE=y
-+CONFIG_ARCH_SUSPEND_POSSIBLE=y
-+CONFIG_PM=y
-+# CONFIG_PM_DEBUG is not set
-+CONFIG_PM_SLEEP=y
-+CONFIG_SUSPEND=y
-+CONFIG_SUSPEND_FREEZER=y
-+CONFIG_HIBERNATION=y
-+CONFIG_PM_STD_PARTITION="/dev/hda3"
-+
-+#
-+# CPU Frequency scaling
-+#
-+CONFIG_CPU_FREQ=y
-+CONFIG_CPU_FREQ_TABLE=y
-+# CONFIG_CPU_FREQ_DEBUG is not set
-+CONFIG_CPU_FREQ_STAT=y
-+# CONFIG_CPU_FREQ_STAT_DETAILS is not set
-+# CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE is not set
-+# CONFIG_CPU_FREQ_DEFAULT_GOV_POWERSAVE is not set
-+# CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set
-+# CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND is not set
-+CONFIG_CPU_FREQ_DEFAULT_GOV_CONSERVATIVE=y
-+CONFIG_CPU_FREQ_GOV_PERFORMANCE=y
-+CONFIG_CPU_FREQ_GOV_POWERSAVE=y
-+CONFIG_CPU_FREQ_GOV_USERSPACE=y
-+CONFIG_CPU_FREQ_GOV_ONDEMAND=y
-+CONFIG_CPU_FREQ_GOV_CONSERVATIVE=y
-+CONFIG_LOONGSON2F_CPU_FREQ=y
-+CONFIG_NET=y
-+
-+#
-+# Networking options
-+#
-+CONFIG_PACKET=y
-+CONFIG_PACKET_MMAP=y
-+CONFIG_UNIX=y
-+CONFIG_XFRM=y
-+CONFIG_XFRM_USER=m
-+# CONFIG_XFRM_SUB_POLICY is not set
-+# CONFIG_XFRM_MIGRATE is not set
-+# CONFIG_XFRM_STATISTICS is not set
-+CONFIG_XFRM_IPCOMP=m
-+CONFIG_NET_KEY=m
-+# CONFIG_NET_KEY_MIGRATE is not set
-+CONFIG_INET=y
-+CONFIG_IP_MULTICAST=y
-+CONFIG_IP_ADVANCED_ROUTER=y
-+CONFIG_ASK_IP_FIB_HASH=y
-+# CONFIG_IP_FIB_TRIE is not set
-+CONFIG_IP_FIB_HASH=y
-+CONFIG_IP_MULTIPLE_TABLES=y
-+CONFIG_IP_ROUTE_MULTIPATH=y
-+CONFIG_IP_ROUTE_VERBOSE=y
-+# CONFIG_IP_PNP is not set
-+CONFIG_NET_IPIP=m
-+CONFIG_NET_IPGRE=m
-+CONFIG_NET_IPGRE_BROADCAST=y
-+CONFIG_IP_MROUTE=y
-+CONFIG_IP_PIMSM_V1=y
-+CONFIG_IP_PIMSM_V2=y
-+# CONFIG_ARPD is not set
-+CONFIG_SYN_COOKIES=y
-+CONFIG_INET_AH=m
-+CONFIG_INET_ESP=m
-+CONFIG_INET_IPCOMP=m
-+CONFIG_INET_XFRM_TUNNEL=m
-+CONFIG_INET_TUNNEL=m
-+CONFIG_INET_XFRM_MODE_TRANSPORT=m
-+CONFIG_INET_XFRM_MODE_TUNNEL=m
-+CONFIG_INET_XFRM_MODE_BEET=y
-+CONFIG_INET_LRO=y
-+CONFIG_INET_DIAG=m
-+CONFIG_INET_TCP_DIAG=m
-+CONFIG_TCP_CONG_ADVANCED=y
-+CONFIG_TCP_CONG_BIC=y
-+CONFIG_TCP_CONG_CUBIC=m
-+CONFIG_TCP_CONG_WESTWOOD=m
-+CONFIG_TCP_CONG_HTCP=m
-+CONFIG_TCP_CONG_HSTCP=m
-+CONFIG_TCP_CONG_HYBLA=m
-+CONFIG_TCP_CONG_VEGAS=m
-+CONFIG_TCP_CONG_SCALABLE=m
-+CONFIG_TCP_CONG_LP=m
-+CONFIG_TCP_CONG_VENO=m
-+# CONFIG_TCP_CONG_YEAH is not set
-+# CONFIG_TCP_CONG_ILLINOIS is not set
-+CONFIG_DEFAULT_BIC=y
-+# CONFIG_DEFAULT_CUBIC is not set
-+# CONFIG_DEFAULT_HTCP is not set
-+# CONFIG_DEFAULT_VEGAS is not set
-+# CONFIG_DEFAULT_WESTWOOD is not set
-+# CONFIG_DEFAULT_RENO is not set
-+CONFIG_DEFAULT_TCP_CONG="bic"
-+# CONFIG_TCP_MD5SIG is not set
-+CONFIG_IPV6=m
-+CONFIG_IPV6_PRIVACY=y
-+# CONFIG_IPV6_ROUTER_PREF is not set
-+# CONFIG_IPV6_OPTIMISTIC_DAD is not set
-+CONFIG_INET6_AH=m
-+CONFIG_INET6_ESP=m
-+CONFIG_INET6_IPCOMP=m
-+# CONFIG_IPV6_MIP6 is not set
-+CONFIG_INET6_XFRM_TUNNEL=m
-+CONFIG_INET6_TUNNEL=m
-+CONFIG_INET6_XFRM_MODE_TRANSPORT=m
-+CONFIG_INET6_XFRM_MODE_TUNNEL=m
-+CONFIG_INET6_XFRM_MODE_BEET=m
-+# CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION is not set
-+CONFIG_IPV6_SIT=m
-+CONFIG_IPV6_NDISC_NODETYPE=y
-+CONFIG_IPV6_TUNNEL=m
-+# CONFIG_IPV6_MULTIPLE_TABLES is not set
-+# CONFIG_IPV6_MROUTE is not set
-+# CONFIG_NETLABEL is not set
-+CONFIG_NETWORK_SECMARK=y
-+CONFIG_NETFILTER=y
-+# CONFIG_NETFILTER_DEBUG is not set
-+CONFIG_NETFILTER_ADVANCED=y
-+CONFIG_BRIDGE_NETFILTER=y
-+
-+#
-+# Core Netfilter Configuration
-+#
-+CONFIG_NETFILTER_NETLINK=m
-+CONFIG_NETFILTER_NETLINK_QUEUE=m
-+CONFIG_NETFILTER_NETLINK_LOG=m
-+# CONFIG_NF_CONNTRACK is not set
-+# CONFIG_NETFILTER_TPROXY is not set
-+CONFIG_NETFILTER_XTABLES=m
-+CONFIG_NETFILTER_XT_TARGET_CLASSIFY=m
-+# CONFIG_NETFILTER_XT_TARGET_DSCP is not set
-+CONFIG_NETFILTER_XT_TARGET_HL=m
-+CONFIG_NETFILTER_XT_TARGET_MARK=m
-+# CONFIG_NETFILTER_XT_TARGET_NFLOG is not set
-+CONFIG_NETFILTER_XT_TARGET_NFQUEUE=m
-+# CONFIG_NETFILTER_XT_TARGET_RATEEST is not set
-+# CONFIG_NETFILTER_XT_TARGET_TRACE is not set
-+CONFIG_NETFILTER_XT_TARGET_SECMARK=m
-+# CONFIG_NETFILTER_XT_TARGET_TCPMSS is not set
-+# CONFIG_NETFILTER_XT_TARGET_TCPOPTSTRIP is not set
-+CONFIG_NETFILTER_XT_MATCH_COMMENT=m
-+CONFIG_NETFILTER_XT_MATCH_DCCP=m
-+# CONFIG_NETFILTER_XT_MATCH_DSCP is not set
-+CONFIG_NETFILTER_XT_MATCH_ESP=m
-+# CONFIG_NETFILTER_XT_MATCH_HASHLIMIT is not set
-+CONFIG_NETFILTER_XT_MATCH_HL=m
-+# CONFIG_NETFILTER_XT_MATCH_IPRANGE is not set
-+CONFIG_NETFILTER_XT_MATCH_LENGTH=m
-+CONFIG_NETFILTER_XT_MATCH_LIMIT=m
-+CONFIG_NETFILTER_XT_MATCH_MAC=m
-+CONFIG_NETFILTER_XT_MATCH_MARK=m
-+CONFIG_NETFILTER_XT_MATCH_MULTIPORT=m
-+# CONFIG_NETFILTER_XT_MATCH_OWNER is not set
-+CONFIG_NETFILTER_XT_MATCH_POLICY=m
-+CONFIG_NETFILTER_XT_MATCH_PHYSDEV=m
-+CONFIG_NETFILTER_XT_MATCH_PKTTYPE=m
-+CONFIG_NETFILTER_XT_MATCH_QUOTA=m
-+# CONFIG_NETFILTER_XT_MATCH_RATEEST is not set
-+CONFIG_NETFILTER_XT_MATCH_REALM=m
-+# CONFIG_NETFILTER_XT_MATCH_RECENT is not set
-+CONFIG_NETFILTER_XT_MATCH_SCTP=m
-+CONFIG_NETFILTER_XT_MATCH_STATISTIC=m
-+CONFIG_NETFILTER_XT_MATCH_STRING=m
-+CONFIG_NETFILTER_XT_MATCH_TCPMSS=m
-+# CONFIG_NETFILTER_XT_MATCH_TIME is not set
-+# CONFIG_NETFILTER_XT_MATCH_U32 is not set
-+CONFIG_IP_VS=m
-+# CONFIG_IP_VS_IPV6 is not set
-+# CONFIG_IP_VS_DEBUG is not set
-+CONFIG_IP_VS_TAB_BITS=12
-+
-+#
-+# IPVS transport protocol load balancing support
-+#
-+CONFIG_IP_VS_PROTO_TCP=y
-+CONFIG_IP_VS_PROTO_UDP=y
-+CONFIG_IP_VS_PROTO_AH_ESP=y
-+CONFIG_IP_VS_PROTO_ESP=y
-+CONFIG_IP_VS_PROTO_AH=y
-+
-+#
-+# IPVS scheduler
-+#
-+CONFIG_IP_VS_RR=m
-+CONFIG_IP_VS_WRR=m
-+CONFIG_IP_VS_LC=m
-+CONFIG_IP_VS_WLC=m
-+CONFIG_IP_VS_LBLC=m
-+CONFIG_IP_VS_LBLCR=m
-+CONFIG_IP_VS_DH=m
-+CONFIG_IP_VS_SH=m
-+CONFIG_IP_VS_SED=m
-+CONFIG_IP_VS_NQ=m
-+
-+#
-+# IPVS application helper
-+#
-+CONFIG_IP_VS_FTP=m
-+
-+#
-+# IP: Netfilter Configuration
-+#
-+# CONFIG_NF_DEFRAG_IPV4 is not set
-+CONFIG_IP_NF_QUEUE=m
-+CONFIG_IP_NF_IPTABLES=m
-+CONFIG_IP_NF_MATCH_ADDRTYPE=m
-+CONFIG_IP_NF_MATCH_AH=m
-+CONFIG_IP_NF_MATCH_ECN=m
-+CONFIG_IP_NF_MATCH_TTL=m
-+CONFIG_IP_NF_FILTER=m
-+CONFIG_IP_NF_TARGET_REJECT=m
-+CONFIG_IP_NF_TARGET_LOG=m
-+CONFIG_IP_NF_TARGET_ULOG=m
-+CONFIG_IP_NF_MANGLE=m
-+CONFIG_IP_NF_TARGET_ECN=m
-+CONFIG_IP_NF_TARGET_TTL=m
-+CONFIG_IP_NF_RAW=m
-+# CONFIG_IP_NF_SECURITY is not set
-+CONFIG_IP_NF_ARPTABLES=m
-+CONFIG_IP_NF_ARPFILTER=m
-+CONFIG_IP_NF_ARP_MANGLE=m
-+
-+#
-+# IPv6: Netfilter Configuration
-+#
-+CONFIG_IP6_NF_QUEUE=m
-+CONFIG_IP6_NF_IPTABLES=m
-+CONFIG_IP6_NF_MATCH_AH=m
-+CONFIG_IP6_NF_MATCH_EUI64=m
-+CONFIG_IP6_NF_MATCH_FRAG=m
-+CONFIG_IP6_NF_MATCH_OPTS=m
-+CONFIG_IP6_NF_MATCH_HL=m
-+CONFIG_IP6_NF_MATCH_IPV6HEADER=m
-+# CONFIG_IP6_NF_MATCH_MH is not set
-+CONFIG_IP6_NF_MATCH_RT=m
-+CONFIG_IP6_NF_TARGET_HL=m
-+CONFIG_IP6_NF_TARGET_LOG=m
-+CONFIG_IP6_NF_FILTER=m
-+CONFIG_IP6_NF_TARGET_REJECT=m
-+CONFIG_IP6_NF_MANGLE=m
-+CONFIG_IP6_NF_RAW=m
-+# CONFIG_IP6_NF_SECURITY is not set
-+
-+#
-+# DECnet: Netfilter Configuration
-+#
-+CONFIG_DECNET_NF_GRABULATOR=m
-+CONFIG_BRIDGE_NF_EBTABLES=m
-+CONFIG_BRIDGE_EBT_BROUTE=m
-+CONFIG_BRIDGE_EBT_T_FILTER=m
-+CONFIG_BRIDGE_EBT_T_NAT=m
-+CONFIG_BRIDGE_EBT_802_3=m
-+CONFIG_BRIDGE_EBT_AMONG=m
-+CONFIG_BRIDGE_EBT_ARP=m
-+CONFIG_BRIDGE_EBT_IP=m
-+# CONFIG_BRIDGE_EBT_IP6 is not set
-+CONFIG_BRIDGE_EBT_LIMIT=m
-+CONFIG_BRIDGE_EBT_MARK=m
-+CONFIG_BRIDGE_EBT_PKTTYPE=m
-+CONFIG_BRIDGE_EBT_STP=m
-+CONFIG_BRIDGE_EBT_VLAN=m
-+CONFIG_BRIDGE_EBT_ARPREPLY=m
-+CONFIG_BRIDGE_EBT_DNAT=m
-+CONFIG_BRIDGE_EBT_MARK_T=m
-+CONFIG_BRIDGE_EBT_REDIRECT=m
-+CONFIG_BRIDGE_EBT_SNAT=m
-+CONFIG_BRIDGE_EBT_LOG=m
-+CONFIG_BRIDGE_EBT_ULOG=m
-+# CONFIG_BRIDGE_EBT_NFLOG is not set
-+CONFIG_IP_DCCP=m
-+CONFIG_INET_DCCP_DIAG=m
-+
-+#
-+# DCCP CCIDs Configuration (EXPERIMENTAL)
-+#
-+# CONFIG_IP_DCCP_CCID2_DEBUG is not set
-+CONFIG_IP_DCCP_CCID3=y
-+# CONFIG_IP_DCCP_CCID3_DEBUG is not set
-+CONFIG_IP_DCCP_CCID3_RTO=100
-+CONFIG_IP_DCCP_TFRC_LIB=y
-+CONFIG_IP_SCTP=m
-+# CONFIG_SCTP_DBG_MSG is not set
-+# CONFIG_SCTP_DBG_OBJCNT is not set
-+# CONFIG_SCTP_HMAC_NONE is not set
-+# CONFIG_SCTP_HMAC_SHA1 is not set
-+CONFIG_SCTP_HMAC_MD5=y
-+CONFIG_TIPC=m
-+CONFIG_TIPC_ADVANCED=y
-+CONFIG_TIPC_ZONES=3
-+CONFIG_TIPC_CLUSTERS=1
-+CONFIG_TIPC_NODES=255
-+CONFIG_TIPC_SLAVE_NODES=0
-+CONFIG_TIPC_PORTS=8191
-+CONFIG_TIPC_LOG=0
-+# CONFIG_TIPC_DEBUG is not set
-+CONFIG_ATM=y
-+CONFIG_ATM_CLIP=y
-+# CONFIG_ATM_CLIP_NO_ICMP is not set
-+CONFIG_ATM_LANE=m
-+CONFIG_ATM_MPOA=m
-+CONFIG_ATM_BR2684=m
-+# CONFIG_ATM_BR2684_IPFILTER is not set
-+CONFIG_STP=m
-+CONFIG_BRIDGE=m
-+# CONFIG_NET_DSA is not set
-+CONFIG_VLAN_8021Q=m
-+# CONFIG_VLAN_8021Q_GVRP is not set
-+CONFIG_DECNET=m
-+# CONFIG_DECNET_ROUTER is not set
-+CONFIG_LLC=m
-+CONFIG_LLC2=m
-+CONFIG_IPX=m
-+# CONFIG_IPX_INTERN is not set
-+CONFIG_ATALK=m
-+CONFIG_DEV_APPLETALK=m
-+# CONFIG_COPS is not set
-+CONFIG_IPDDP=m
-+CONFIG_IPDDP_ENCAP=y
-+CONFIG_IPDDP_DECAP=y
-+CONFIG_X25=m
-+CONFIG_LAPB=m
-+CONFIG_ECONET=m
-+CONFIG_ECONET_AUNUDP=y
-+CONFIG_ECONET_NATIVE=y
-+CONFIG_WAN_ROUTER=m
-+# CONFIG_PHONET is not set
-+CONFIG_NET_SCHED=y
-+
-+#
-+# Queueing/Scheduling
-+#
-+CONFIG_NET_SCH_CBQ=m
-+CONFIG_NET_SCH_HTB=m
-+CONFIG_NET_SCH_HFSC=m
-+CONFIG_NET_SCH_ATM=m
-+CONFIG_NET_SCH_PRIO=m
-+# CONFIG_NET_SCH_MULTIQ is not set
-+CONFIG_NET_SCH_RED=m
-+CONFIG_NET_SCH_SFQ=m
-+CONFIG_NET_SCH_TEQL=m
-+CONFIG_NET_SCH_TBF=m
-+CONFIG_NET_SCH_GRED=m
-+CONFIG_NET_SCH_DSMARK=m
-+CONFIG_NET_SCH_NETEM=m
-+# CONFIG_NET_SCH_DRR is not set
-+CONFIG_NET_SCH_INGRESS=m
-+
-+#
-+# Classification
-+#
-+CONFIG_NET_CLS=y
-+CONFIG_NET_CLS_BASIC=m
-+CONFIG_NET_CLS_TCINDEX=m
-+CONFIG_NET_CLS_ROUTE4=m
-+CONFIG_NET_CLS_ROUTE=y
-+CONFIG_NET_CLS_FW=m
-+CONFIG_NET_CLS_U32=m
-+CONFIG_CLS_U32_PERF=y
-+CONFIG_CLS_U32_MARK=y
-+CONFIG_NET_CLS_RSVP=m
-+CONFIG_NET_CLS_RSVP6=m
-+# CONFIG_NET_CLS_FLOW is not set
-+CONFIG_NET_EMATCH=y
-+CONFIG_NET_EMATCH_STACK=32
-+CONFIG_NET_EMATCH_CMP=m
-+CONFIG_NET_EMATCH_NBYTE=m
-+CONFIG_NET_EMATCH_U32=m
-+CONFIG_NET_EMATCH_META=m
-+CONFIG_NET_EMATCH_TEXT=m
-+CONFIG_NET_CLS_ACT=y
-+CONFIG_NET_ACT_POLICE=m
-+CONFIG_NET_ACT_GACT=m
-+CONFIG_GACT_PROB=y
-+CONFIG_NET_ACT_MIRRED=m
-+CONFIG_NET_ACT_IPT=m
-+# CONFIG_NET_ACT_NAT is not set
-+CONFIG_NET_ACT_PEDIT=m
-+CONFIG_NET_ACT_SIMP=m
-+# CONFIG_NET_ACT_SKBEDIT is not set
-+CONFIG_NET_CLS_IND=y
-+CONFIG_NET_SCH_FIFO=y
-+# CONFIG_DCB is not set
-+
-+#
-+# Network testing
-+#
-+CONFIG_NET_PKTGEN=m
-+CONFIG_HAMRADIO=y
-+
-+#
-+# Packet Radio protocols
-+#
-+CONFIG_AX25=m
-+# CONFIG_AX25_DAMA_SLAVE is not set
-+CONFIG_NETROM=m
-+CONFIG_ROSE=m
-+
-+#
-+# AX.25 network device drivers
-+#
-+CONFIG_MKISS=m
-+CONFIG_6PACK=m
-+CONFIG_BPQETHER=m
-+CONFIG_BAYCOM_SER_FDX=m
-+CONFIG_BAYCOM_SER_HDX=m
-+CONFIG_YAM=m
-+# CONFIG_CAN is not set
-+# CONFIG_IRDA is not set
-+# CONFIG_BT is not set
-+CONFIG_AF_RXRPC=y
-+# CONFIG_AF_RXRPC_DEBUG is not set
-+# CONFIG_RXKAD is not set
-+CONFIG_FIB_RULES=y
-+# CONFIG_WIRELESS is not set
-+# CONFIG_WIMAX is not set
-+# CONFIG_RFKILL is not set
-+# CONFIG_NET_9P is not set
-+
-+#
-+# Device Drivers
-+#
-+
-+#
-+# Generic Driver Options
-+#
-+CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
-+CONFIG_STANDALONE=y
-+CONFIG_PREVENT_FIRMWARE_BUILD=y
-+CONFIG_FW_LOADER=m
-+CONFIG_FIRMWARE_IN_KERNEL=y
-+CONFIG_EXTRA_FIRMWARE=""
-+# CONFIG_SYS_HYPERVISOR is not set
-+CONFIG_CONNECTOR=m
-+# CONFIG_MTD is not set
-+# CONFIG_PARPORT is not set
-+CONFIG_PNP=y
-+CONFIG_PNP_DEBUG_MESSAGES=y
-+
-+#
-+# Protocols
-+#
-+CONFIG_ISAPNP=y
-+# CONFIG_PNPACPI is not set
-+CONFIG_BLK_DEV=y
-+# CONFIG_BLK_CPQ_DA is not set
-+# CONFIG_BLK_CPQ_CISS_DA is not set
-+# CONFIG_BLK_DEV_DAC960 is not set
-+# CONFIG_BLK_DEV_UMEM is not set
-+# CONFIG_BLK_DEV_COW_COMMON is not set
-+CONFIG_BLK_DEV_LOOP=y
-+CONFIG_BLK_DEV_CRYPTOLOOP=y
-+CONFIG_BLK_DEV_NBD=m
-+# CONFIG_BLK_DEV_SX8 is not set
-+# CONFIG_BLK_DEV_UB is not set
-+CONFIG_BLK_DEV_RAM=y
-+CONFIG_BLK_DEV_RAM_COUNT=16
-+CONFIG_BLK_DEV_RAM_SIZE=8192
-+# CONFIG_BLK_DEV_XIP is not set
-+CONFIG_CDROM_PKTCDVD=m
-+CONFIG_CDROM_PKTCDVD_BUFFERS=8
-+# CONFIG_CDROM_PKTCDVD_WCACHE is not set
-+CONFIG_ATA_OVER_ETH=m
-+# CONFIG_BLK_DEV_HD is not set
-+CONFIG_MISC_DEVICES=y
-+# CONFIG_PHANTOM is not set
-+# CONFIG_SGI_IOC4 is not set
-+# CONFIG_TIFM_CORE is not set
-+# CONFIG_ICS932S401 is not set
-+# CONFIG_ENCLOSURE_SERVICES is not set
-+# CONFIG_HP_ILO is not set
-+# CONFIG_ISL29003 is not set
-+# CONFIG_C2PORT is not set
-+
-+#
-+# EEPROM support
-+#
-+# CONFIG_EEPROM_AT24 is not set
-+# CONFIG_EEPROM_LEGACY is not set
-+# CONFIG_EEPROM_93CX6 is not set
-+CONFIG_HAVE_IDE=y
-+CONFIG_IDE=y
-+
-+#
-+# Please see Documentation/ide/ide.txt for help/info on IDE drives
-+#
-+CONFIG_IDE_XFER_MODE=y
-+CONFIG_IDE_TIMINGS=y
-+CONFIG_IDE_ATAPI=y
-+# CONFIG_BLK_DEV_IDE_SATA is not set
-+CONFIG_IDE_GD=y
-+CONFIG_IDE_GD_ATA=y
-+# CONFIG_IDE_GD_ATAPI is not set
-+# CONFIG_BLK_DEV_IDECS is not set
-+# CONFIG_BLK_DEV_DELKIN is not set
-+CONFIG_BLK_DEV_IDECD=m
-+CONFIG_BLK_DEV_IDECD_VERBOSE_ERRORS=y
-+# CONFIG_BLK_DEV_IDETAPE is not set
-+CONFIG_IDE_TASK_IOCTL=y
-+CONFIG_IDE_PROC_FS=y
-+
-+#
-+# IDE chipset support/bugfixes
-+#
-+# CONFIG_IDE_GENERIC is not set
-+# CONFIG_BLK_DEV_PLATFORM is not set
-+# CONFIG_BLK_DEV_IDEPNP is not set
-+CONFIG_BLK_DEV_IDEDMA_SFF=y
-+
-+#
-+# PCI IDE chipsets support
-+#
-+CONFIG_BLK_DEV_IDEPCI=y
-+# CONFIG_IDEPCI_PCIBUS_ORDER is not set
-+# CONFIG_BLK_DEV_OFFBOARD is not set
-+CONFIG_BLK_DEV_GENERIC=y
-+# CONFIG_BLK_DEV_OPTI621 is not set
-+CONFIG_BLK_DEV_IDEDMA_PCI=y
-+# CONFIG_BLK_DEV_AEC62XX is not set
-+# CONFIG_BLK_DEV_ALI15X3 is not set
-+CONFIG_BLK_DEV_AMD74XX=y
-+# CONFIG_BLK_DEV_CMD64X is not set
-+# CONFIG_BLK_DEV_TRIFLEX is not set
-+# CONFIG_BLK_DEV_CS5520 is not set
-+# CONFIG_BLK_DEV_CS5530 is not set
-+# CONFIG_BLK_DEV_HPT366 is not set
-+# CONFIG_BLK_DEV_JMICRON is not set
-+# CONFIG_BLK_DEV_SC1200 is not set
-+# CONFIG_BLK_DEV_PIIX is not set
-+# CONFIG_BLK_DEV_IT8172 is not set
-+# CONFIG_BLK_DEV_IT8213 is not set
-+# CONFIG_BLK_DEV_IT821X is not set
-+# CONFIG_BLK_DEV_NS87415 is not set
-+# CONFIG_BLK_DEV_PDC202XX_OLD is not set
-+# CONFIG_BLK_DEV_PDC202XX_NEW is not set
-+# CONFIG_BLK_DEV_SVWKS is not set
-+# CONFIG_BLK_DEV_SIIMAGE is not set
-+# CONFIG_BLK_DEV_SLC90E66 is not set
-+# CONFIG_BLK_DEV_TRM290 is not set
-+# CONFIG_BLK_DEV_VIA82CXXX is not set
-+# CONFIG_BLK_DEV_TC86C001 is not set
-+
-+#
-+# Other IDE chipsets support
-+#
-+
-+#
-+# Note: most of these also require special kernel boot parameters
-+#
-+# CONFIG_BLK_DEV_4DRIVES is not set
-+# CONFIG_BLK_DEV_ALI14XX is not set
-+# CONFIG_BLK_DEV_DTC2278 is not set
-+# CONFIG_BLK_DEV_HT6560B is not set
-+# CONFIG_BLK_DEV_QD65XX is not set
-+# CONFIG_BLK_DEV_UMC8672 is not set
-+CONFIG_BLK_DEV_IDEDMA=y
-+
-+#
-+# SCSI device support
-+#
-+# CONFIG_RAID_ATTRS is not set
-+CONFIG_SCSI=y
-+CONFIG_SCSI_DMA=y
-+# CONFIG_SCSI_TGT is not set
-+CONFIG_SCSI_NETLINK=y
-+CONFIG_SCSI_PROC_FS=y
-+
-+#
-+# SCSI support type (disk, tape, CD-ROM)
-+#
-+CONFIG_BLK_DEV_SD=y
-+# CONFIG_CHR_DEV_ST is not set
-+# CONFIG_CHR_DEV_OSST is not set
-+CONFIG_BLK_DEV_SR=m
-+CONFIG_BLK_DEV_SR_VENDOR=y
-+CONFIG_CHR_DEV_SG=m
-+CONFIG_CHR_DEV_SCH=m
-+
-+#
-+# Some SCSI devices (e.g. CD jukebox) support multiple LUNs
-+#
-+CONFIG_SCSI_MULTI_LUN=y
-+CONFIG_SCSI_CONSTANTS=y
-+CONFIG_SCSI_LOGGING=y
-+# CONFIG_SCSI_SCAN_ASYNC is not set
-+CONFIG_SCSI_WAIT_SCAN=m
-+
-+#
-+# SCSI Transports
-+#
-+CONFIG_SCSI_SPI_ATTRS=m
-+CONFIG_SCSI_FC_ATTRS=m
-+CONFIG_SCSI_ISCSI_ATTRS=m
-+CONFIG_SCSI_SAS_ATTRS=m
-+# CONFIG_SCSI_SAS_LIBSAS is not set
-+CONFIG_SCSI_SRP_ATTRS=m
-+CONFIG_SCSI_LOWLEVEL=y
-+CONFIG_ISCSI_TCP=m
-+# CONFIG_BLK_DEV_3W_XXXX_RAID is not set
-+# CONFIG_SCSI_3W_9XXX is not set
-+# CONFIG_SCSI_ACARD is not set
-+# CONFIG_SCSI_AACRAID is not set
-+# CONFIG_SCSI_AIC7XXX is not set
-+# CONFIG_SCSI_AIC7XXX_OLD is not set
-+# CONFIG_SCSI_AIC79XX is not set
-+# CONFIG_SCSI_AIC94XX is not set
-+# CONFIG_SCSI_DPT_I2O is not set
-+# CONFIG_SCSI_ADVANSYS is not set
-+# CONFIG_SCSI_IN2000 is not set
-+# CONFIG_SCSI_ARCMSR is not set
-+# CONFIG_MEGARAID_NEWGEN is not set
-+# CONFIG_MEGARAID_LEGACY is not set
-+# CONFIG_MEGARAID_SAS is not set
-+# CONFIG_SCSI_MPT2SAS is not set
-+# CONFIG_SCSI_HPTIOP is not set
-+# CONFIG_LIBFC is not set
-+# CONFIG_LIBFCOE is not set
-+# CONFIG_FCOE is not set
-+# CONFIG_SCSI_DMX3191D is not set
-+# CONFIG_SCSI_DTC3280 is not set
-+# CONFIG_SCSI_FUTURE_DOMAIN is not set
-+# CONFIG_SCSI_GENERIC_NCR5380 is not set
-+# CONFIG_SCSI_GENERIC_NCR5380_MMIO is not set
-+# CONFIG_SCSI_IPS is not set
-+# CONFIG_SCSI_INITIO is not set
-+# CONFIG_SCSI_INIA100 is not set
-+# CONFIG_SCSI_MVSAS is not set
-+# CONFIG_SCSI_NCR53C406A is not set
-+# CONFIG_SCSI_STEX is not set
-+# CONFIG_SCSI_SYM53C8XX_2 is not set
-+# CONFIG_SCSI_PAS16 is not set
-+# CONFIG_SCSI_QLOGIC_FAS is not set
-+# CONFIG_SCSI_QLOGIC_1280 is not set
-+# CONFIG_SCSI_QLA_FC is not set
-+# CONFIG_SCSI_QLA_ISCSI is not set
-+# CONFIG_SCSI_LPFC is not set
-+# CONFIG_SCSI_SYM53C416 is not set
-+# CONFIG_SCSI_DC395x is not set
-+# CONFIG_SCSI_DC390T is not set
-+# CONFIG_SCSI_T128 is not set
-+# CONFIG_SCSI_DEBUG is not set
-+# CONFIG_SCSI_SRP is not set
-+# CONFIG_SCSI_LOWLEVEL_PCMCIA is not set
-+# CONFIG_SCSI_DH is not set
-+# CONFIG_SCSI_OSD_INITIATOR is not set
-+# CONFIG_ATA is not set
-+CONFIG_MD=y
-+CONFIG_BLK_DEV_MD=m
-+CONFIG_MD_LINEAR=m
-+CONFIG_MD_RAID0=m
-+CONFIG_MD_RAID1=m
-+CONFIG_MD_RAID10=m
-+CONFIG_MD_RAID456=m
-+CONFIG_MD_RAID6_PQ=m
-+CONFIG_MD_MULTIPATH=m
-+CONFIG_MD_FAULTY=m
-+CONFIG_BLK_DEV_DM=m
-+# CONFIG_DM_DEBUG is not set
-+CONFIG_DM_CRYPT=m
-+CONFIG_DM_SNAPSHOT=m
-+CONFIG_DM_MIRROR=m
-+CONFIG_DM_ZERO=m
-+CONFIG_DM_MULTIPATH=m
-+# CONFIG_DM_DELAY is not set
-+# CONFIG_DM_UEVENT is not set
-+CONFIG_FUSION=y
-+CONFIG_FUSION_SPI=m
-+CONFIG_FUSION_FC=m
-+CONFIG_FUSION_SAS=m
-+CONFIG_FUSION_MAX_SGE=40
-+CONFIG_FUSION_CTL=m
-+# CONFIG_FUSION_LOGGING is not set
-+
-+#
-+# IEEE 1394 (FireWire) support
-+#
-+
-+#
-+# Enable only one of the two stacks, unless you know what you are doing
-+#
-+# CONFIG_FIREWIRE is not set
-+# CONFIG_IEEE1394 is not set
-+# CONFIG_I2O is not set
-+CONFIG_NETDEVICES=y
-+CONFIG_COMPAT_NET_DEV_OPS=y
-+# CONFIG_IFB is not set
-+# CONFIG_DUMMY is not set
-+# CONFIG_BONDING is not set
-+# CONFIG_MACVLAN is not set
-+# CONFIG_EQUALIZER is not set
-+CONFIG_TUN=m
-+CONFIG_VETH=m
-+CONFIG_NET_SB1000=m
-+# CONFIG_ARCNET is not set
-+CONFIG_PHYLIB=y
-+
-+#
-+# MII PHY device drivers
-+#
-+CONFIG_MARVELL_PHY=m
-+CONFIG_DAVICOM_PHY=m
-+CONFIG_QSEMI_PHY=m
-+CONFIG_LXT_PHY=m
-+CONFIG_CICADA_PHY=m
-+CONFIG_VITESSE_PHY=m
-+CONFIG_SMSC_PHY=m
-+# CONFIG_BROADCOM_PHY is not set
-+# CONFIG_ICPLUS_PHY is not set
-+CONFIG_REALTEK_PHY=m
-+# CONFIG_NATIONAL_PHY is not set
-+# CONFIG_STE10XP is not set
-+# CONFIG_LSI_ET1011C_PHY is not set
-+# CONFIG_FIXED_PHY is not set
-+# CONFIG_MDIO_BITBANG is not set
-+CONFIG_NET_ETHERNET=y
-+CONFIG_MII=y
-+# CONFIG_AX88796 is not set
-+# CONFIG_HAPPYMEAL is not set
-+# CONFIG_SUNGEM is not set
-+# CONFIG_CASSINI is not set
-+# CONFIG_NET_VENDOR_3COM is not set
-+# CONFIG_NET_VENDOR_SMC is not set
-+# CONFIG_SMC91X is not set
-+# CONFIG_DM9000 is not set
-+# CONFIG_ETHOC is not set
-+# CONFIG_NET_VENDOR_RACAL is not set
-+# CONFIG_DNET is not set
-+# CONFIG_NET_TULIP is not set
-+# CONFIG_AT1700 is not set
-+# CONFIG_DEPCA is not set
-+# CONFIG_HP100 is not set
-+# CONFIG_NET_ISA is not set
-+# CONFIG_IBM_NEW_EMAC_ZMII is not set
-+# CONFIG_IBM_NEW_EMAC_RGMII is not set
-+# CONFIG_IBM_NEW_EMAC_TAH is not set
-+# CONFIG_IBM_NEW_EMAC_EMAC4 is not set
-+# CONFIG_IBM_NEW_EMAC_NO_FLOW_CTRL is not set
-+# CONFIG_IBM_NEW_EMAC_MAL_CLR_ICINTSTAT is not set
-+# CONFIG_IBM_NEW_EMAC_MAL_COMMON_ERR is not set
-+# CONFIG_NET_PCI is not set
-+# CONFIG_B44 is not set
-+# CONFIG_CS89x0 is not set
-+# CONFIG_ATL2 is not set
-+CONFIG_NETDEV_1000=y
-+# CONFIG_ACENIC is not set
-+# CONFIG_DL2K is not set
-+# CONFIG_E1000 is not set
-+# CONFIG_E1000E is not set
-+# CONFIG_IP1000 is not set
-+# CONFIG_IGB is not set
-+# CONFIG_IGBVF is not set
-+# CONFIG_NS83820 is not set
-+# CONFIG_HAMACHI is not set
-+# CONFIG_YELLOWFIN is not set
-+CONFIG_R8169=y
-+CONFIG_R8169_VLAN=y
-+# CONFIG_SIS190 is not set
-+# CONFIG_SKGE is not set
-+# CONFIG_SKY2 is not set
-+# CONFIG_VIA_VELOCITY is not set
-+# CONFIG_TIGON3 is not set
-+# CONFIG_BNX2 is not set
-+# CONFIG_QLA3XXX is not set
-+# CONFIG_ATL1 is not set
-+# CONFIG_ATL1E is not set
-+# CONFIG_ATL1C is not set
-+# CONFIG_JME is not set
-+# CONFIG_NETDEV_10000 is not set
-+# CONFIG_TR is not set
-+
-+#
-+# Wireless LAN
-+#
-+# CONFIG_WLAN_PRE80211 is not set
-+# CONFIG_WLAN_80211 is not set
-+
-+#
-+# Enable WiMAX (Networking options) to see the WiMAX drivers
-+#
-+
-+#
-+# USB Network Adapters
-+#
-+# CONFIG_USB_CATC is not set
-+# CONFIG_USB_KAWETH is not set
-+# CONFIG_USB_PEGASUS is not set
-+# CONFIG_USB_RTL8150 is not set
-+# CONFIG_USB_USBNET is not set
-+# CONFIG_NET_PCMCIA is not set
-+# CONFIG_WAN is not set
-+# CONFIG_ATM_DRIVERS is not set
-+# CONFIG_FDDI is not set
-+# CONFIG_HIPPI is not set
-+CONFIG_PPP=m
-+CONFIG_PPP_MULTILINK=y
-+CONFIG_PPP_FILTER=y
-+CONFIG_PPP_ASYNC=m
-+CONFIG_PPP_SYNC_TTY=m
-+CONFIG_PPP_DEFLATE=m
-+CONFIG_PPP_BSDCOMP=m
-+CONFIG_PPP_MPPE=m
-+CONFIG_PPPOE=m
-+CONFIG_PPPOATM=m
-+# CONFIG_PPPOL2TP is not set
-+# CONFIG_SLIP is not set
-+CONFIG_SLHC=m
-+# CONFIG_NET_FC is not set
-+# CONFIG_NETCONSOLE is not set
-+# CONFIG_NETPOLL is not set
-+# CONFIG_NET_POLL_CONTROLLER is not set
-+# CONFIG_ISDN is not set
-+# CONFIG_PHONE is not set
-+
-+#
-+# Input device support
-+#
-+CONFIG_INPUT=y
-+# CONFIG_INPUT_FF_MEMLESS is not set
-+# CONFIG_INPUT_POLLDEV is not set
-+
-+#
-+# Userland interfaces
-+#
-+CONFIG_INPUT_MOUSEDEV=y
-+CONFIG_INPUT_MOUSEDEV_PSAUX=y
-+CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024
-+CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
-+CONFIG_INPUT_JOYDEV=m
-+CONFIG_INPUT_EVDEV=m
-+# CONFIG_INPUT_EVBUG is not set
-+
-+#
-+# Input Device Drivers
-+#
-+CONFIG_INPUT_KEYBOARD=y
-+CONFIG_KEYBOARD_ATKBD=y
-+CONFIG_KEYBOARD_SUNKBD=m
-+CONFIG_KEYBOARD_LKKBD=m
-+CONFIG_KEYBOARD_XTKBD=m
-+CONFIG_KEYBOARD_NEWTON=m
-+# CONFIG_KEYBOARD_STOWAWAY is not set
-+CONFIG_INPUT_MOUSE=y
-+CONFIG_MOUSE_PS2=y
-+CONFIG_MOUSE_PS2_ALPS=y
-+CONFIG_MOUSE_PS2_LOGIPS2PP=y
-+CONFIG_MOUSE_PS2_SYNAPTICS=y
-+CONFIG_MOUSE_PS2_TRACKPOINT=y
-+# CONFIG_MOUSE_PS2_ELANTECH is not set
-+# CONFIG_MOUSE_PS2_TOUCHKIT is not set
-+CONFIG_MOUSE_SERIAL=m
-+# CONFIG_MOUSE_APPLETOUCH is not set
-+# CONFIG_MOUSE_BCM5974 is not set
-+CONFIG_MOUSE_INPORT=m
-+# CONFIG_MOUSE_ATIXL is not set
-+CONFIG_MOUSE_LOGIBM=m
-+CONFIG_MOUSE_PC110PAD=m
-+CONFIG_MOUSE_VSXXXAA=m
-+CONFIG_INPUT_JOYSTICK=y
-+CONFIG_JOYSTICK_ANALOG=m
-+CONFIG_JOYSTICK_A3D=m
-+CONFIG_JOYSTICK_ADI=m
-+CONFIG_JOYSTICK_COBRA=m
-+CONFIG_JOYSTICK_GF2K=m
-+CONFIG_JOYSTICK_GRIP=m
-+CONFIG_JOYSTICK_GRIP_MP=m
-+CONFIG_JOYSTICK_GUILLEMOT=m
-+CONFIG_JOYSTICK_INTERACT=m
-+CONFIG_JOYSTICK_SIDEWINDER=m
-+CONFIG_JOYSTICK_TMDC=m
-+CONFIG_JOYSTICK_IFORCE=m
-+CONFIG_JOYSTICK_IFORCE_USB=y
-+CONFIG_JOYSTICK_IFORCE_232=y
-+CONFIG_JOYSTICK_WARRIOR=m
-+CONFIG_JOYSTICK_MAGELLAN=m
-+CONFIG_JOYSTICK_SPACEORB=m
-+CONFIG_JOYSTICK_SPACEBALL=m
-+CONFIG_JOYSTICK_STINGER=m
-+CONFIG_JOYSTICK_TWIDJOY=m
-+# CONFIG_JOYSTICK_ZHENHUA is not set
-+CONFIG_JOYSTICK_JOYDUMP=m
-+# CONFIG_JOYSTICK_XPAD is not set
-+# CONFIG_INPUT_TABLET is not set
-+CONFIG_INPUT_TOUCHSCREEN=y
-+# CONFIG_TOUCHSCREEN_AD7879_I2C is not set
-+# CONFIG_TOUCHSCREEN_AD7879 is not set
-+# CONFIG_TOUCHSCREEN_FUJITSU is not set
-+CONFIG_TOUCHSCREEN_GUNZE=m
-+CONFIG_TOUCHSCREEN_ELO=m
-+# CONFIG_TOUCHSCREEN_WACOM_W8001 is not set
-+CONFIG_TOUCHSCREEN_MTOUCH=m
-+# CONFIG_TOUCHSCREEN_INEXIO is not set
-+CONFIG_TOUCHSCREEN_MK712=m
-+# CONFIG_TOUCHSCREEN_HTCPEN is not set
-+# CONFIG_TOUCHSCREEN_PENMOUNT is not set
-+# CONFIG_TOUCHSCREEN_TOUCHRIGHT is not set
-+# CONFIG_TOUCHSCREEN_TOUCHWIN is not set
-+# CONFIG_TOUCHSCREEN_WM97XX is not set
-+# CONFIG_TOUCHSCREEN_USB_COMPOSITE is not set
-+# CONFIG_TOUCHSCREEN_TOUCHIT213 is not set
-+# CONFIG_TOUCHSCREEN_TSC2007 is not set
-+CONFIG_INPUT_MISC=y
-+CONFIG_INPUT_PCSPKR=m
-+# CONFIG_INPUT_ATI_REMOTE is not set
-+# CONFIG_INPUT_ATI_REMOTE2 is not set
-+# CONFIG_INPUT_KEYSPAN_REMOTE is not set
-+# CONFIG_INPUT_POWERMATE is not set
-+# CONFIG_INPUT_YEALINK is not set
-+# CONFIG_INPUT_CM109 is not set
-+CONFIG_INPUT_UINPUT=m
-+
-+#
-+# Hardware I/O ports
-+#
-+CONFIG_SERIO=y
-+# CONFIG_SERIO_I8042 is not set
-+CONFIG_SERIO_SERPORT=m
-+CONFIG_SERIO_PCIPS2=m
-+CONFIG_SERIO_LIBPS2=y
-+CONFIG_SERIO_RAW=m
-+CONFIG_GAMEPORT=m
-+CONFIG_GAMEPORT_NS558=m
-+CONFIG_GAMEPORT_L4=m
-+CONFIG_GAMEPORT_EMU10K1=m
-+CONFIG_GAMEPORT_FM801=m
-+
-+#
-+# Character devices
-+#
-+CONFIG_VT=y
-+CONFIG_CONSOLE_TRANSLATIONS=y
-+CONFIG_VT_CONSOLE=y
-+CONFIG_HW_CONSOLE=y
-+# CONFIG_VT_HW_CONSOLE_BINDING is not set
-+CONFIG_DEVKMEM=y
-+CONFIG_SERIAL_NONSTANDARD=y
-+# CONFIG_COMPUTONE is not set
-+# CONFIG_ROCKETPORT is not set
-+# CONFIG_CYCLADES is not set
-+# CONFIG_DIGIEPCA is not set
-+# CONFIG_MOXA_INTELLIO is not set
-+# CONFIG_MOXA_SMARTIO is not set
-+# CONFIG_ISI is not set
-+# CONFIG_SYNCLINKMP is not set
-+# CONFIG_SYNCLINK_GT is not set
-+# CONFIG_N_HDLC is not set
-+# CONFIG_RISCOM8 is not set
-+# CONFIG_SPECIALIX is not set
-+# CONFIG_SX is not set
-+# CONFIG_RIO is not set
-+# CONFIG_STALDRV is not set
-+# CONFIG_NOZOMI is not set
-+
-+#
-+# Serial drivers
-+#
-+CONFIG_SERIAL_8250=y
-+CONFIG_SERIAL_8250_CONSOLE=y
-+# CONFIG_SERIAL_8250_PCI is not set
-+# CONFIG_SERIAL_8250_PNP is not set
-+CONFIG_SERIAL_8250_CS=m
-+CONFIG_SERIAL_8250_NR_UARTS=16
-+CONFIG_SERIAL_8250_RUNTIME_UARTS=4
-+CONFIG_SERIAL_8250_EXTENDED=y
-+CONFIG_SERIAL_8250_MANY_PORTS=y
-+CONFIG_SERIAL_8250_FOURPORT=y
-+# CONFIG_SERIAL_8250_ACCENT is not set
-+# CONFIG_SERIAL_8250_BOCA is not set
-+# CONFIG_SERIAL_8250_EXAR_ST16C554 is not set
-+CONFIG_SERIAL_8250_HUB6=m
-+CONFIG_SERIAL_8250_SHARE_IRQ=y
-+# CONFIG_SERIAL_8250_DETECT_IRQ is not set
-+CONFIG_SERIAL_8250_RSA=y
-+
-+#
-+# Non-8250 serial port support
-+#
-+CONFIG_SERIAL_CORE=y
-+CONFIG_SERIAL_CORE_CONSOLE=y
-+# CONFIG_SERIAL_JSM is not set
-+CONFIG_UNIX98_PTYS=y
-+CONFIG_DEVPTS_MULTIPLE_INSTANCES=y
-+CONFIG_LEGACY_PTYS=y
-+CONFIG_LEGACY_PTY_COUNT=16
-+# CONFIG_IPMI_HANDLER is not set
-+CONFIG_HW_RANDOM=y
-+# CONFIG_HW_RANDOM_TIMERIOMEM is not set
-+# CONFIG_DTLK is not set
-+# CONFIG_R3964 is not set
-+# CONFIG_APPLICOM is not set
-+
-+#
-+# PCMCIA character devices
-+#
-+# CONFIG_SYNCLINK_CS is not set
-+# CONFIG_CARDMAN_4000 is not set
-+# CONFIG_CARDMAN_4040 is not set
-+# CONFIG_IPWIRELESS is not set
-+# CONFIG_RAW_DRIVER is not set
-+# CONFIG_TCG_TPM is not set
-+CONFIG_DEVPORT=y
-+CONFIG_I2C=m
-+CONFIG_I2C_BOARDINFO=y
-+CONFIG_I2C_CHARDEV=m
-+CONFIG_I2C_HELPER_AUTO=y
-+CONFIG_I2C_ALGOBIT=m
-+CONFIG_I2C_ALGOPCA=m
-+
-+#
-+# I2C Hardware Bus support
-+#
-+
-+#
-+# PC SMBus host controller drivers
-+#
-+CONFIG_I2C_ALI1535=m
-+CONFIG_I2C_ALI1563=m
-+CONFIG_I2C_ALI15X3=m
-+CONFIG_I2C_AMD756=m
-+CONFIG_I2C_AMD8111=m
-+CONFIG_I2C_I801=m
-+# CONFIG_I2C_ISCH is not set
-+CONFIG_I2C_PIIX4=m
-+CONFIG_I2C_NFORCE2=m
-+CONFIG_I2C_SIS5595=m
-+CONFIG_I2C_SIS630=m
-+CONFIG_I2C_SIS96X=m
-+CONFIG_I2C_VIA=m
-+CONFIG_I2C_VIAPRO=m
-+
-+#
-+# I2C system bus drivers (mostly embedded / system-on-chip)
-+#
-+CONFIG_I2C_OCORES=m
-+# CONFIG_I2C_SIMTEC is not set
-+
-+#
-+# External I2C/SMBus adapter drivers
-+#
-+CONFIG_I2C_PARPORT_LIGHT=m
-+# CONFIG_I2C_TAOS_EVM is not set
-+# CONFIG_I2C_TINY_USB is not set
-+
-+#
-+# Graphics adapter I2C/DDC channel drivers
-+#
-+CONFIG_I2C_VOODOO3=m
-+
-+#
-+# Other I2C/SMBus bus drivers
-+#
-+# CONFIG_I2C_ELEKTOR is not set
-+CONFIG_I2C_PCA_ISA=m
-+# CONFIG_I2C_PCA_PLATFORM is not set
-+CONFIG_I2C_STUB=m
-+
-+#
-+# Miscellaneous I2C Chip support
-+#
-+# CONFIG_DS1682 is not set
-+CONFIG_SENSORS_PCF8574=m
-+# CONFIG_PCF8575 is not set
-+# CONFIG_SENSORS_PCA9539 is not set
-+CONFIG_SENSORS_MAX6875=m
-+# CONFIG_SENSORS_TSL2550 is not set
-+# CONFIG_I2C_DEBUG_CORE is not set
-+# CONFIG_I2C_DEBUG_ALGO is not set
-+# CONFIG_I2C_DEBUG_BUS is not set
-+# CONFIG_I2C_DEBUG_CHIP is not set
-+# CONFIG_SPI is not set
-+# CONFIG_W1 is not set
-+# CONFIG_POWER_SUPPLY is not set
-+# CONFIG_HWMON is not set
-+# CONFIG_THERMAL is not set
-+# CONFIG_THERMAL_HWMON is not set
-+CONFIG_WATCHDOG=y
-+# CONFIG_WATCHDOG_NOWAYOUT is not set
-+
-+#
-+# Watchdog Device Drivers
-+#
-+CONFIG_SOFT_WATCHDOG=m
-+# CONFIG_ALIM7101_WDT is not set
-+
-+#
-+# ISA-based Watchdog Cards
-+#
-+CONFIG_PCWATCHDOG=m
-+CONFIG_MIXCOMWD=m
-+CONFIG_WDT=m
-+
-+#
-+# PCI-based Watchdog Cards
-+#
-+CONFIG_PCIPCWATCHDOG=m
-+CONFIG_WDTPCI=m
-+CONFIG_WDT_501_PCI=y
-+
-+#
-+# USB-based Watchdog Cards
-+#
-+CONFIG_USBPCWATCHDOG=m
-+CONFIG_SSB_POSSIBLE=y
-+
-+#
-+# Sonics Silicon Backplane
-+#
-+CONFIG_SSB=m
-+CONFIG_SSB_SPROM=y
-+CONFIG_SSB_PCIHOST_POSSIBLE=y
-+CONFIG_SSB_PCIHOST=y
-+# CONFIG_SSB_B43_PCI_BRIDGE is not set
-+CONFIG_SSB_PCMCIAHOST_POSSIBLE=y
-+# CONFIG_SSB_PCMCIAHOST is not set
-+# CONFIG_SSB_SILENT is not set
-+# CONFIG_SSB_DEBUG is not set
-+CONFIG_SSB_DRIVER_PCICORE_POSSIBLE=y
-+CONFIG_SSB_DRIVER_PCICORE=y
-+# CONFIG_SSB_DRIVER_MIPS is not set
-+
-+#
-+# Multifunction device drivers
-+#
-+# CONFIG_MFD_CORE is not set
-+# CONFIG_MFD_SM501 is not set
-+# CONFIG_HTC_PASIC3 is not set
-+# CONFIG_MFD_TMIO is not set
-+# CONFIG_MFD_WM8400 is not set
-+# CONFIG_MFD_WM8350_I2C is not set
-+# CONFIG_MFD_PCF50633 is not set
-+# CONFIG_REGULATOR is not set
-+
-+#
-+# Multimedia devices
-+#
-+
-+#
-+# Multimedia core support
-+#
-+CONFIG_VIDEO_DEV=m
-+CONFIG_VIDEO_V4L2_COMMON=m
-+CONFIG_VIDEO_ALLOW_V4L1=y
-+CONFIG_VIDEO_V4L1_COMPAT=y
-+CONFIG_DVB_CORE=m
-+CONFIG_VIDEO_MEDIA=m
-+
-+#
-+# Multimedia drivers
-+#
-+CONFIG_VIDEO_SAA7146=m
-+CONFIG_VIDEO_SAA7146_VV=m
-+# CONFIG_MEDIA_ATTACH is not set
-+CONFIG_MEDIA_TUNER=m
-+# CONFIG_MEDIA_TUNER_CUSTOMISE is not set
-+CONFIG_MEDIA_TUNER_SIMPLE=m
-+CONFIG_MEDIA_TUNER_TDA8290=m
-+CONFIG_MEDIA_TUNER_TDA827X=m
-+CONFIG_MEDIA_TUNER_TDA18271=m
-+CONFIG_MEDIA_TUNER_TDA9887=m
-+CONFIG_MEDIA_TUNER_TEA5761=m
-+CONFIG_MEDIA_TUNER_TEA5767=m
-+CONFIG_MEDIA_TUNER_MT20XX=m
-+CONFIG_MEDIA_TUNER_MT2060=m
-+CONFIG_MEDIA_TUNER_XC2028=m
-+CONFIG_MEDIA_TUNER_XC5000=m
-+CONFIG_MEDIA_TUNER_MXL5005S=m
-+CONFIG_MEDIA_TUNER_MC44S803=m
-+CONFIG_VIDEO_V4L2=m
-+CONFIG_VIDEO_V4L1=m
-+CONFIG_VIDEOBUF_GEN=m
-+CONFIG_VIDEOBUF_DMA_SG=m
-+CONFIG_VIDEOBUF_VMALLOC=m
-+CONFIG_VIDEOBUF_DVB=m
-+CONFIG_VIDEO_BTCX=m
-+CONFIG_VIDEO_IR=m
-+CONFIG_VIDEO_TVEEPROM=m
-+CONFIG_VIDEO_TUNER=m
-+CONFIG_VIDEO_CAPTURE_DRIVERS=y
-+# CONFIG_VIDEO_ADV_DEBUG is not set
-+# CONFIG_VIDEO_FIXED_MINOR_RANGES is not set
-+CONFIG_VIDEO_HELPER_CHIPS_AUTO=y
-+CONFIG_VIDEO_IR_I2C=m
-+CONFIG_VIDEO_TVAUDIO=m
-+CONFIG_VIDEO_TDA7432=m
-+CONFIG_VIDEO_TDA9840=m
-+CONFIG_VIDEO_TEA6415C=m
-+CONFIG_VIDEO_TEA6420=m
-+CONFIG_VIDEO_MSP3400=m
-+CONFIG_VIDEO_CS53L32A=m
-+CONFIG_VIDEO_WM8775=m
-+CONFIG_VIDEO_SAA6588=m
-+CONFIG_VIDEO_BT819=m
-+CONFIG_VIDEO_BT856=m
-+CONFIG_VIDEO_BT866=m
-+CONFIG_VIDEO_KS0127=m
-+CONFIG_VIDEO_SAA7110=m
-+CONFIG_VIDEO_SAA711X=m
-+CONFIG_VIDEO_TVP5150=m
-+CONFIG_VIDEO_VPX3220=m
-+CONFIG_VIDEO_CX25840=m
-+CONFIG_VIDEO_CX2341X=m
-+CONFIG_VIDEO_SAA7185=m
-+CONFIG_VIDEO_ADV7170=m
-+CONFIG_VIDEO_ADV7175=m
-+CONFIG_VIDEO_VIVI=m
-+CONFIG_VIDEO_BT848=m
-+CONFIG_VIDEO_BT848_DVB=y
-+CONFIG_VIDEO_PMS=m
-+CONFIG_VIDEO_CPIA=m
-+CONFIG_VIDEO_CPIA_USB=m
-+CONFIG_VIDEO_CPIA2=m
-+CONFIG_VIDEO_SAA5246A=m
-+CONFIG_VIDEO_SAA5249=m
-+CONFIG_VIDEO_STRADIS=m
-+CONFIG_VIDEO_ZORAN=m
-+CONFIG_VIDEO_ZORAN_DC30=m
-+CONFIG_VIDEO_ZORAN_ZR36060=m
-+CONFIG_VIDEO_ZORAN_BUZ=m
-+CONFIG_VIDEO_ZORAN_DC10=m
-+CONFIG_VIDEO_ZORAN_LML33=m
-+CONFIG_VIDEO_ZORAN_LML33R10=m
-+CONFIG_VIDEO_ZORAN_AVS6EYES=m
-+CONFIG_VIDEO_SAA7134=m
-+CONFIG_VIDEO_SAA7134_ALSA=m
-+CONFIG_VIDEO_SAA7134_DVB=m
-+CONFIG_VIDEO_MXB=m
-+CONFIG_VIDEO_HEXIUM_ORION=m
-+CONFIG_VIDEO_HEXIUM_GEMINI=m
-+CONFIG_VIDEO_CX88=m
-+CONFIG_VIDEO_CX88_ALSA=m
-+CONFIG_VIDEO_CX88_BLACKBIRD=m
-+CONFIG_VIDEO_CX88_DVB=m
-+CONFIG_VIDEO_CX88_MPEG=m
-+CONFIG_VIDEO_CX88_VP3054=m
-+# CONFIG_VIDEO_CX23885 is not set
-+# CONFIG_VIDEO_AU0828 is not set
-+# CONFIG_VIDEO_IVTV is not set
-+# CONFIG_VIDEO_CX18 is not set
-+# CONFIG_VIDEO_CAFE_CCIC is not set
-+# CONFIG_SOC_CAMERA is not set
-+CONFIG_V4L_USB_DRIVERS=y
-+# CONFIG_USB_VIDEO_CLASS is not set
-+CONFIG_USB_VIDEO_CLASS_INPUT_EVDEV=y
-+# CONFIG_USB_GSPCA is not set
-+CONFIG_VIDEO_PVRUSB2=m
-+CONFIG_VIDEO_PVRUSB2_SYSFS=y
-+CONFIG_VIDEO_PVRUSB2_DVB=y
-+# CONFIG_VIDEO_PVRUSB2_DEBUGIFC is not set
-+# CONFIG_VIDEO_HDPVR is not set
-+CONFIG_VIDEO_EM28XX=m
-+# CONFIG_VIDEO_EM28XX_ALSA is not set
-+# CONFIG_VIDEO_EM28XX_DVB is not set
-+# CONFIG_VIDEO_CX231XX is not set
-+# CONFIG_VIDEO_USBVISION is not set
-+CONFIG_VIDEO_USBVIDEO=m
-+CONFIG_USB_VICAM=m
-+CONFIG_USB_IBMCAM=m
-+CONFIG_USB_KONICAWC=m
-+CONFIG_USB_QUICKCAM_MESSENGER=m
-+CONFIG_USB_ET61X251=m
-+CONFIG_VIDEO_OVCAMCHIP=m
-+# CONFIG_USB_W9968CF is not set
-+CONFIG_USB_OV511=m
-+CONFIG_USB_SE401=m
-+CONFIG_USB_SN9C102=m
-+CONFIG_USB_STV680=m
-+CONFIG_USB_ZC0301=m
-+CONFIG_USB_PWC=m
-+# CONFIG_USB_PWC_DEBUG is not set
-+CONFIG_USB_PWC_INPUT_EVDEV=y
-+# CONFIG_USB_ZR364XX is not set
-+# CONFIG_USB_STKWEBCAM is not set
-+# CONFIG_USB_S2255 is not set
-+CONFIG_RADIO_ADAPTERS=y
-+CONFIG_RADIO_CADET=m
-+CONFIG_RADIO_RTRACK=m
-+CONFIG_RADIO_RTRACK2=m
-+CONFIG_RADIO_AZTECH=m
-+CONFIG_RADIO_GEMTEK=m
-+CONFIG_RADIO_GEMTEK_PCI=m
-+CONFIG_RADIO_MAXIRADIO=m
-+CONFIG_RADIO_MAESTRO=m
-+CONFIG_RADIO_SF16FMI=m
-+CONFIG_RADIO_SF16FMR2=m
-+CONFIG_RADIO_TERRATEC=m
-+CONFIG_RADIO_TRUST=m
-+CONFIG_RADIO_TYPHOON=m
-+CONFIG_RADIO_TYPHOON_PROC_FS=y
-+CONFIG_RADIO_ZOLTRIX=m
-+CONFIG_USB_DSBR=m
-+# CONFIG_USB_SI470X is not set
-+# CONFIG_USB_MR800 is not set
-+# CONFIG_RADIO_TEA5764 is not set
-+# CONFIG_DVB_DYNAMIC_MINORS is not set
-+CONFIG_DVB_CAPTURE_DRIVERS=y
-+
-+#
-+# Supported SAA7146 based PCI Adapters
-+#
-+CONFIG_TTPCI_EEPROM=m
-+CONFIG_DVB_AV7110=m
-+CONFIG_DVB_AV7110_OSD=y
-+# CONFIG_DVB_BUDGET_CORE is not set
-+
-+#
-+# Supported USB Adapters
-+#
-+CONFIG_DVB_USB=m
-+# CONFIG_DVB_USB_DEBUG is not set
-+CONFIG_DVB_USB_A800=m
-+CONFIG_DVB_USB_DIBUSB_MB=m
-+CONFIG_DVB_USB_DIBUSB_MB_FAULTY=y
-+CONFIG_DVB_USB_DIBUSB_MC=m
-+# CONFIG_DVB_USB_DIB0700 is not set
-+CONFIG_DVB_USB_UMT_010=m
-+CONFIG_DVB_USB_CXUSB=m
-+# CONFIG_DVB_USB_M920X is not set
-+# CONFIG_DVB_USB_GL861 is not set
-+# CONFIG_DVB_USB_AU6610 is not set
-+CONFIG_DVB_USB_DIGITV=m
-+CONFIG_DVB_USB_VP7045=m
-+CONFIG_DVB_USB_VP702X=m
-+CONFIG_DVB_USB_GP8PSK=m
-+CONFIG_DVB_USB_NOVA_T_USB2=m
-+# CONFIG_DVB_USB_TTUSB2 is not set
-+CONFIG_DVB_USB_DTT200U=m
-+# CONFIG_DVB_USB_OPERA1 is not set
-+# CONFIG_DVB_USB_AF9005 is not set
-+# CONFIG_DVB_USB_DW2102 is not set
-+# CONFIG_DVB_USB_CINERGY_T2 is not set
-+# CONFIG_DVB_USB_ANYSEE is not set
-+# CONFIG_DVB_USB_DTV5100 is not set
-+# CONFIG_DVB_USB_AF9015 is not set
-+# CONFIG_DVB_USB_CE6230 is not set
-+CONFIG_DVB_TTUSB_BUDGET=m
-+CONFIG_DVB_TTUSB_DEC=m
-+# CONFIG_DVB_SIANO_SMS1XXX is not set
-+
-+#
-+# Supported FlexCopII (B2C2) Adapters
-+#
-+CONFIG_DVB_B2C2_FLEXCOP=m
-+CONFIG_DVB_B2C2_FLEXCOP_PCI=m
-+CONFIG_DVB_B2C2_FLEXCOP_USB=m
-+# CONFIG_DVB_B2C2_FLEXCOP_DEBUG is not set
-+
-+#
-+# Supported BT878 Adapters
-+#
-+CONFIG_DVB_BT8XX=m
-+
-+#
-+# Supported Pluto2 Adapters
-+#
-+CONFIG_DVB_PLUTO2=m
-+
-+#
-+# Supported SDMC DM1105 Adapters
-+#
-+# CONFIG_DVB_DM1105 is not set
-+
-+#
-+# Supported DVB Frontends
-+#
-+# CONFIG_DVB_FE_CUSTOMISE is not set
-+CONFIG_DVB_CX24110=m
-+CONFIG_DVB_CX24123=m
-+CONFIG_DVB_MT312=m
-+CONFIG_DVB_ZL10036=m
-+CONFIG_DVB_S5H1420=m
-+CONFIG_DVB_STV0288=m
-+CONFIG_DVB_STB6000=m
-+CONFIG_DVB_STV0299=m
-+CONFIG_DVB_TDA8083=m
-+CONFIG_DVB_TDA10086=m
-+CONFIG_DVB_VES1X93=m
-+CONFIG_DVB_TUNER_ITD1000=m
-+CONFIG_DVB_TUNER_CX24113=m
-+CONFIG_DVB_TDA826X=m
-+CONFIG_DVB_CX24116=m
-+CONFIG_DVB_SP8870=m
-+CONFIG_DVB_SP887X=m
-+CONFIG_DVB_CX22700=m
-+CONFIG_DVB_CX22702=m
-+CONFIG_DVB_L64781=m
-+CONFIG_DVB_TDA1004X=m
-+CONFIG_DVB_NXT6000=m
-+CONFIG_DVB_MT352=m
-+CONFIG_DVB_ZL10353=m
-+CONFIG_DVB_DIB3000MB=m
-+CONFIG_DVB_DIB3000MC=m
-+CONFIG_DVB_DIB7000P=m
-+CONFIG_DVB_TDA10048=m
-+CONFIG_DVB_VES1820=m
-+CONFIG_DVB_STV0297=m
-+CONFIG_DVB_NXT200X=m
-+CONFIG_DVB_OR51211=m
-+CONFIG_DVB_OR51132=m
-+CONFIG_DVB_BCM3510=m
-+CONFIG_DVB_LGDT330X=m
-+CONFIG_DVB_LGDT3305=m
-+CONFIG_DVB_S5H1409=m
-+CONFIG_DVB_S5H1411=m
-+CONFIG_DVB_PLL=m
-+CONFIG_DVB_TUNER_DIB0070=m
-+CONFIG_DVB_LNBP21=m
-+CONFIG_DVB_ISL6405=m
-+CONFIG_DVB_ISL6421=m
-+CONFIG_DVB_LGS8GL5=m
-+# CONFIG_DAB is not set
-+
-+#
-+# Graphics support
-+#
-+CONFIG_DRM=m
-+CONFIG_DRM_TDFX=m
-+CONFIG_DRM_R128=m
-+CONFIG_DRM_RADEON=m
-+CONFIG_DRM_MGA=m
-+CONFIG_DRM_VIA=m
-+CONFIG_DRM_SAVAGE=m
-+CONFIG_VGASTATE=m
-+# CONFIG_VIDEO_OUTPUT_CONTROL is not set
-+CONFIG_FB=y
-+CONFIG_FIRMWARE_EDID=y
-+CONFIG_FB_DDC=m
-+CONFIG_FB_BOOT_VESA_SUPPORT=y
-+CONFIG_FB_CFB_FILLRECT=y
-+CONFIG_FB_CFB_COPYAREA=y
-+CONFIG_FB_CFB_IMAGEBLIT=y
-+# CONFIG_FB_CFB_REV_PIXELS_IN_BYTE is not set
-+CONFIG_FB_SYS_FILLRECT=m
-+CONFIG_FB_SYS_COPYAREA=m
-+CONFIG_FB_SYS_IMAGEBLIT=m
-+# CONFIG_FB_FOREIGN_ENDIAN is not set
-+CONFIG_FB_SYS_FOPS=m
-+# CONFIG_FB_SVGALIB is not set
-+# CONFIG_FB_MACMODES is not set
-+CONFIG_FB_BACKLIGHT=y
-+CONFIG_FB_MODE_HELPERS=y
-+CONFIG_FB_TILEBLITTING=y
-+
-+#
-+# Frame buffer hardware drivers
-+#
-+CONFIG_FB_CIRRUS=m
-+CONFIG_FB_PM2=m
-+CONFIG_FB_PM2_FIFO_DISCONNECT=y
-+CONFIG_FB_CYBER2000=m
-+# CONFIG_FB_ASILIANT is not set
-+# CONFIG_FB_IMSTT is not set
-+# CONFIG_FB_UVESA is not set
-+CONFIG_FB_S1D13XXX=m
-+CONFIG_FB_NVIDIA=m
-+CONFIG_FB_NVIDIA_I2C=y
-+# CONFIG_FB_NVIDIA_DEBUG is not set
-+CONFIG_FB_NVIDIA_BACKLIGHT=y
-+# CONFIG_FB_RIVA is not set
-+CONFIG_FB_MATROX=m
-+CONFIG_FB_MATROX_MILLENIUM=y
-+CONFIG_FB_MATROX_MYSTIQUE=y
-+CONFIG_FB_MATROX_G=y
-+CONFIG_FB_MATROX_I2C=m
-+CONFIG_FB_MATROX_MAVEN=m
-+CONFIG_FB_MATROX_MULTIHEAD=y
-+CONFIG_FB_RADEON=m
-+CONFIG_FB_RADEON_I2C=y
-+CONFIG_FB_RADEON_BACKLIGHT=y
-+# CONFIG_FB_RADEON_DEBUG is not set
-+CONFIG_FB_ATY128=m
-+CONFIG_FB_ATY128_BACKLIGHT=y
-+CONFIG_FB_ATY=m
-+CONFIG_FB_ATY_CT=y
-+CONFIG_FB_ATY_GENERIC_LCD=y
-+CONFIG_FB_ATY_GX=y
-+CONFIG_FB_ATY_BACKLIGHT=y
-+# CONFIG_FB_S3 is not set
-+CONFIG_FB_SAVAGE=m
-+CONFIG_FB_SAVAGE_I2C=y
-+# CONFIG_FB_SAVAGE_ACCEL is not set
-+CONFIG_FB_SIS=y
-+CONFIG_FB_SIS_300=y
-+CONFIG_FB_SIS_315=y
-+# CONFIG_FB_VIA is not set
-+CONFIG_FB_NEOMAGIC=m
-+CONFIG_FB_KYRO=m
-+CONFIG_FB_3DFX=m
-+# CONFIG_FB_3DFX_ACCEL is not set
-+CONFIG_FB_3DFX_I2C=y
-+CONFIG_FB_VOODOO1=m
-+# CONFIG_FB_VT8623 is not set
-+CONFIG_FB_TRIDENT=m
-+# CONFIG_FB_ARK is not set
-+# CONFIG_FB_PM3 is not set
-+# CONFIG_FB_CARMINE is not set
-+# CONFIG_FB_SM7XX is not set
-+CONFIG_FB_VIRTUAL=m
-+# CONFIG_FB_METRONOME is not set
-+# CONFIG_FB_MB862XX is not set
-+# CONFIG_FB_BROADSHEET is not set
-+CONFIG_BACKLIGHT_LCD_SUPPORT=y
-+# CONFIG_LCD_CLASS_DEVICE is not set
-+CONFIG_BACKLIGHT_CLASS_DEVICE=y
-+CONFIG_BACKLIGHT_GENERIC=y
-+
-+#
-+# Display device support
-+#
-+# CONFIG_DISPLAY_SUPPORT is not set
-+
-+#
-+# Console display driver support
-+#
-+# CONFIG_VGA_CONSOLE is not set
-+# CONFIG_MDA_CONSOLE is not set
-+CONFIG_DUMMY_CONSOLE=y
-+CONFIG_FRAMEBUFFER_CONSOLE=y
-+# CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY is not set
-+CONFIG_FRAMEBUFFER_CONSOLE_ROTATION=y
-+# CONFIG_FONTS is not set
-+CONFIG_FONT_8x8=y
-+CONFIG_FONT_8x16=y
-+# CONFIG_LOGO is not set
-+CONFIG_SOUND=m
-+CONFIG_SOUND_OSS_CORE=y
-+CONFIG_SND=m
-+CONFIG_SND_TIMER=m
-+CONFIG_SND_PCM=m
-+CONFIG_SND_SEQUENCER=m
-+CONFIG_SND_SEQ_DUMMY=m
-+CONFIG_SND_OSSEMUL=y
-+CONFIG_SND_MIXER_OSS=m
-+CONFIG_SND_PCM_OSS=m
-+CONFIG_SND_PCM_OSS_PLUGINS=y
-+CONFIG_SND_SEQUENCER_OSS=y
-+# CONFIG_SND_HRTIMER is not set
-+# CONFIG_SND_DYNAMIC_MINORS is not set
-+CONFIG_SND_SUPPORT_OLD_API=y
-+CONFIG_SND_VERBOSE_PROCFS=y
-+# CONFIG_SND_VERBOSE_PRINTK is not set
-+# CONFIG_SND_DEBUG is not set
-+CONFIG_SND_VMASTER=y
-+CONFIG_SND_AC97_CODEC=m
-+# CONFIG_SND_DRIVERS is not set
-+CONFIG_SND_PCI=y
-+# CONFIG_SND_AD1889 is not set
-+# CONFIG_SND_ALS300 is not set
-+# CONFIG_SND_ALI5451 is not set
-+# CONFIG_SND_ATIIXP is not set
-+# CONFIG_SND_ATIIXP_MODEM is not set
-+# CONFIG_SND_AU8810 is not set
-+# CONFIG_SND_AU8820 is not set
-+# CONFIG_SND_AU8830 is not set
-+# CONFIG_SND_AW2 is not set
-+# CONFIG_SND_AZT3328 is not set
-+# CONFIG_SND_BT87X is not set
-+# CONFIG_SND_CA0106 is not set
-+# CONFIG_SND_CMIPCI is not set
-+# CONFIG_SND_OXYGEN is not set
-+# CONFIG_SND_CS4281 is not set
-+# CONFIG_SND_CS46XX is not set
-+CONFIG_SND_CS5535AUDIO=m
-+# CONFIG_SND_DARLA20 is not set
-+# CONFIG_SND_GINA20 is not set
-+# CONFIG_SND_LAYLA20 is not set
-+# CONFIG_SND_DARLA24 is not set
-+# CONFIG_SND_GINA24 is not set
-+# CONFIG_SND_LAYLA24 is not set
-+# CONFIG_SND_MONA is not set
-+# CONFIG_SND_MIA is not set
-+# CONFIG_SND_ECHO3G is not set
-+# CONFIG_SND_INDIGO is not set
-+# CONFIG_SND_INDIGOIO is not set
-+# CONFIG_SND_INDIGODJ is not set
-+# CONFIG_SND_INDIGOIOX is not set
-+# CONFIG_SND_INDIGODJX is not set
-+# CONFIG_SND_EMU10K1 is not set
-+# CONFIG_SND_EMU10K1X is not set
-+# CONFIG_SND_ENS1370 is not set
-+# CONFIG_SND_ENS1371 is not set
-+# CONFIG_SND_ES1938 is not set
-+# CONFIG_SND_ES1968 is not set
-+# CONFIG_SND_FM801 is not set
-+# CONFIG_SND_HDA_INTEL is not set
-+# CONFIG_SND_HDSP is not set
-+# CONFIG_SND_HDSPM is not set
-+# CONFIG_SND_HIFIER is not set
-+# CONFIG_SND_ICE1712 is not set
-+# CONFIG_SND_ICE1724 is not set
-+# CONFIG_SND_INTEL8X0 is not set
-+# CONFIG_SND_INTEL8X0M is not set
-+# CONFIG_SND_KORG1212 is not set
-+# CONFIG_SND_MAESTRO3 is not set
-+# CONFIG_SND_MIXART is not set
-+# CONFIG_SND_NM256 is not set
-+# CONFIG_SND_PCXHR is not set
-+# CONFIG_SND_RIPTIDE is not set
-+# CONFIG_SND_RME32 is not set
-+# CONFIG_SND_RME96 is not set
-+# CONFIG_SND_RME9652 is not set
-+# CONFIG_SND_SONICVIBES is not set
-+# CONFIG_SND_TRIDENT is not set
-+# CONFIG_SND_VIA82XX is not set
-+# CONFIG_SND_VIA82XX_MODEM is not set
-+# CONFIG_SND_VIRTUOSO is not set
-+# CONFIG_SND_VX222 is not set
-+# CONFIG_SND_YMFPCI is not set
-+# CONFIG_SND_MIPS is not set
-+# CONFIG_SND_USB is not set
-+# CONFIG_SND_PCMCIA is not set
-+# CONFIG_SND_SOC is not set
-+# CONFIG_SOUND_PRIME is not set
-+CONFIG_AC97_BUS=m
-+CONFIG_HID_SUPPORT=y
-+CONFIG_HID=y
-+# CONFIG_HID_DEBUG is not set
-+# CONFIG_HIDRAW is not set
-+
-+#
-+# USB Input Devices
-+#
-+CONFIG_USB_HID=y
-+# CONFIG_HID_PID is not set
-+CONFIG_USB_HIDDEV=y
-+
-+#
-+# Special HID drivers
-+#
-+# CONFIG_HID_A4TECH is not set
-+# CONFIG_HID_APPLE is not set
-+# CONFIG_HID_BELKIN is not set
-+# CONFIG_HID_CHERRY is not set
-+# CONFIG_HID_CHICONY is not set
-+# CONFIG_HID_CYPRESS is not set
-+# CONFIG_DRAGONRISE_FF is not set
-+# CONFIG_HID_EZKEY is not set
-+# CONFIG_HID_KYE is not set
-+# CONFIG_HID_GYRATION is not set
-+# CONFIG_HID_KENSINGTON is not set
-+# CONFIG_HID_LOGITECH is not set
-+# CONFIG_HID_MICROSOFT is not set
-+# CONFIG_HID_MONTEREY is not set
-+# CONFIG_HID_NTRIG is not set
-+# CONFIG_HID_PANTHERLORD is not set
-+# CONFIG_HID_PETALYNX is not set
-+# CONFIG_HID_SAMSUNG is not set
-+# CONFIG_HID_SONY is not set
-+# CONFIG_HID_SUNPLUS is not set
-+# CONFIG_GREENASIA_FF is not set
-+# CONFIG_HID_TOPSEED is not set
-+# CONFIG_THRUSTMASTER_FF is not set
-+# CONFIG_ZEROPLUS_FF is not set
-+CONFIG_USB_SUPPORT=y
-+CONFIG_USB_ARCH_HAS_HCD=y
-+CONFIG_USB_ARCH_HAS_OHCI=y
-+CONFIG_USB_ARCH_HAS_EHCI=y
-+CONFIG_USB=y
-+# CONFIG_USB_DEBUG is not set
-+# CONFIG_USB_ANNOUNCE_NEW_DEVICES is not set
-+
-+#
-+# Miscellaneous USB options
-+#
-+CONFIG_USB_DEVICEFS=y
-+# CONFIG_USB_DEVICE_CLASS is not set
-+# CONFIG_USB_DYNAMIC_MINORS is not set
-+# CONFIG_USB_SUSPEND is not set
-+# CONFIG_USB_OTG is not set
-+# CONFIG_USB_OTG_WHITELIST is not set
-+# CONFIG_USB_OTG_BLACKLIST_HUB is not set
-+CONFIG_USB_MON=y
-+# CONFIG_USB_WUSB is not set
-+# CONFIG_USB_WUSB_CBAF is not set
-+
-+#
-+# USB Host Controller Drivers
-+#
-+# CONFIG_USB_C67X00_HCD is not set
-+CONFIG_USB_EHCI_HCD=y
-+CONFIG_USB_EHCI_ROOT_HUB_TT=y
-+# CONFIG_USB_EHCI_TT_NEWSCHED is not set
-+# CONFIG_USB_OXU210HP_HCD is not set
-+# CONFIG_USB_ISP116X_HCD is not set
-+# CONFIG_USB_ISP1760_HCD is not set
-+CONFIG_USB_OHCI_HCD=y
-+# CONFIG_USB_OHCI_BIG_ENDIAN_DESC is not set
-+# CONFIG_USB_OHCI_BIG_ENDIAN_MMIO is not set
-+CONFIG_USB_OHCI_LITTLE_ENDIAN=y
-+CONFIG_USB_UHCI_HCD=m
-+# CONFIG_USB_SL811_HCD is not set
-+# CONFIG_USB_R8A66597_HCD is not set
-+# CONFIG_USB_WHCI_HCD is not set
-+# CONFIG_USB_HWA_HCD is not set
-+
-+#
-+# USB Device Class drivers
-+#
-+CONFIG_USB_ACM=m
-+CONFIG_USB_PRINTER=m
-+# CONFIG_USB_WDM is not set
-+# CONFIG_USB_TMC is not set
-+
-+#
-+# NOTE: USB_STORAGE depends on SCSI but BLK_DEV_SD may
-+#
-+
-+#
-+# also be needed; see USB_STORAGE Help for more info
-+#
-+CONFIG_USB_STORAGE=y
-+# CONFIG_USB_STORAGE_DEBUG is not set
-+CONFIG_USB_STORAGE_DATAFAB=y
-+CONFIG_USB_STORAGE_FREECOM=y
-+CONFIG_USB_STORAGE_ISD200=y
-+CONFIG_USB_STORAGE_USBAT=y
-+CONFIG_USB_STORAGE_SDDR09=y
-+CONFIG_USB_STORAGE_SDDR55=y
-+CONFIG_USB_STORAGE_JUMPSHOT=y
-+CONFIG_USB_STORAGE_ALAUDA=y
-+# CONFIG_USB_STORAGE_ONETOUCH is not set
-+# CONFIG_USB_STORAGE_KARMA is not set
-+# CONFIG_USB_STORAGE_CYPRESS_ATACB is not set
-+# CONFIG_USB_LIBUSUAL is not set
-+
-+#
-+# USB Imaging devices
-+#
-+CONFIG_USB_MDC800=m
-+# CONFIG_USB_MICROTEK is not set
-+
-+#
-+# USB port drivers
-+#
-+CONFIG_USB_SERIAL=m
-+CONFIG_USB_EZUSB=y
-+CONFIG_USB_SERIAL_GENERIC=y
-+# CONFIG_USB_SERIAL_AIRCABLE is not set
-+CONFIG_USB_SERIAL_ARK3116=m
-+CONFIG_USB_SERIAL_BELKIN=m
-+# CONFIG_USB_SERIAL_CH341 is not set
-+# CONFIG_USB_SERIAL_WHITEHEAT is not set
-+CONFIG_USB_SERIAL_DIGI_ACCELEPORT=m
-+# CONFIG_USB_SERIAL_CP210X is not set
-+CONFIG_USB_SERIAL_CYPRESS_M8=m
-+CONFIG_USB_SERIAL_EMPEG=m
-+CONFIG_USB_SERIAL_FTDI_SIO=m
-+CONFIG_USB_SERIAL_FUNSOFT=m
-+CONFIG_USB_SERIAL_VISOR=m
-+CONFIG_USB_SERIAL_IPAQ=m
-+CONFIG_USB_SERIAL_IR=m
-+CONFIG_USB_SERIAL_EDGEPORT=m
-+CONFIG_USB_SERIAL_EDGEPORT_TI=m
-+CONFIG_USB_SERIAL_GARMIN=m
-+CONFIG_USB_SERIAL_IPW=m
-+# CONFIG_USB_SERIAL_IUU is not set
-+CONFIG_USB_SERIAL_KEYSPAN_PDA=m
-+# CONFIG_USB_SERIAL_KEYSPAN is not set
-+CONFIG_USB_SERIAL_KLSI=m
-+CONFIG_USB_SERIAL_KOBIL_SCT=m
-+CONFIG_USB_SERIAL_MCT_U232=m
-+# CONFIG_USB_SERIAL_MOS7720 is not set
-+# CONFIG_USB_SERIAL_MOS7840 is not set
-+# CONFIG_USB_SERIAL_MOTOROLA is not set
-+CONFIG_USB_SERIAL_NAVMAN=m
-+CONFIG_USB_SERIAL_PL2303=m
-+# CONFIG_USB_SERIAL_OTI6858 is not set
-+# CONFIG_USB_SERIAL_QUALCOMM is not set
-+# CONFIG_USB_SERIAL_SPCP8X5 is not set
-+CONFIG_USB_SERIAL_HP4X=m
-+CONFIG_USB_SERIAL_SAFE=m
-+# CONFIG_USB_SERIAL_SAFE_PADDED is not set
-+# CONFIG_USB_SERIAL_SIEMENS_MPI is not set
-+CONFIG_USB_SERIAL_SIERRAWIRELESS=m
-+# CONFIG_USB_SERIAL_SYMBOL is not set
-+CONFIG_USB_SERIAL_TI=m
-+CONFIG_USB_SERIAL_CYBERJACK=m
-+CONFIG_USB_SERIAL_XIRCOM=m
-+CONFIG_USB_SERIAL_OPTION=m
-+CONFIG_USB_SERIAL_OMNINET=m
-+# CONFIG_USB_SERIAL_OPTICON is not set
-+# CONFIG_USB_SERIAL_DEBUG is not set
-+
-+#
-+# USB Miscellaneous drivers
-+#
-+# CONFIG_USB_EMI62 is not set
-+# CONFIG_USB_EMI26 is not set
-+# CONFIG_USB_ADUTUX is not set
-+# CONFIG_USB_SEVSEG is not set
-+# CONFIG_USB_RIO500 is not set
-+# CONFIG_USB_LEGOTOWER is not set
-+# CONFIG_USB_LCD is not set
-+# CONFIG_USB_BERRY_CHARGE is not set
-+# CONFIG_USB_LED is not set
-+# CONFIG_USB_CYPRESS_CY7C63 is not set
-+# CONFIG_USB_CYTHERM is not set
-+# CONFIG_USB_IDMOUSE is not set
-+# CONFIG_USB_FTDI_ELAN is not set
-+# CONFIG_USB_APPLEDISPLAY is not set
-+# CONFIG_USB_SISUSBVGA is not set
-+# CONFIG_USB_LD is not set
-+# CONFIG_USB_TRANCEVIBRATOR is not set
-+# CONFIG_USB_IOWARRIOR is not set
-+# CONFIG_USB_TEST is not set
-+# CONFIG_USB_ISIGHTFW is not set
-+# CONFIG_USB_VST is not set
-+# CONFIG_USB_ATM is not set
-+# CONFIG_USB_GADGET is not set
-+
-+#
-+# OTG and related infrastructure
-+#
-+# CONFIG_NOP_USB_XCEIV is not set
-+# CONFIG_UWB is not set
-+# CONFIG_MMC is not set
-+# CONFIG_MEMSTICK is not set
-+# CONFIG_NEW_LEDS is not set
-+# CONFIG_ACCESSIBILITY is not set
-+# CONFIG_INFINIBAND is not set
-+CONFIG_RTC_LIB=y
-+CONFIG_RTC_CLASS=y
-+CONFIG_RTC_HCTOSYS=y
-+CONFIG_RTC_HCTOSYS_DEVICE="rtc"
-+# CONFIG_RTC_DEBUG is not set
-+
-+#
-+# RTC interfaces
-+#
-+CONFIG_RTC_INTF_SYSFS=y
-+CONFIG_RTC_INTF_PROC=y
-+CONFIG_RTC_INTF_DEV=y
-+# CONFIG_RTC_INTF_DEV_UIE_EMUL is not set
-+# CONFIG_RTC_DRV_TEST is not set
-+
-+#
-+# I2C RTC drivers
-+#
-+# CONFIG_RTC_DRV_DS1307 is not set
-+# CONFIG_RTC_DRV_DS1374 is not set
-+# CONFIG_RTC_DRV_DS1672 is not set
-+# CONFIG_RTC_DRV_MAX6900 is not set
-+# CONFIG_RTC_DRV_RS5C372 is not set
-+# CONFIG_RTC_DRV_ISL1208 is not set
-+# CONFIG_RTC_DRV_X1205 is not set
-+# CONFIG_RTC_DRV_PCF8563 is not set
-+# CONFIG_RTC_DRV_PCF8583 is not set
-+# CONFIG_RTC_DRV_M41T80 is not set
-+# CONFIG_RTC_DRV_S35390A is not set
-+# CONFIG_RTC_DRV_FM3130 is not set
-+# CONFIG_RTC_DRV_RX8581 is not set
-+
-+#
-+# SPI RTC drivers
-+#
-+
-+#
-+# Platform RTC drivers
-+#
-+CONFIG_RTC_DRV_CMOS=y
-+# CONFIG_RTC_DRV_DS1286 is not set
-+# CONFIG_RTC_DRV_DS1511 is not set
-+# CONFIG_RTC_DRV_DS1553 is not set
-+# CONFIG_RTC_DRV_DS1742 is not set
-+# CONFIG_RTC_DRV_STK17TA8 is not set
-+# CONFIG_RTC_DRV_M48T86 is not set
-+# CONFIG_RTC_DRV_M48T35 is not set
-+# CONFIG_RTC_DRV_M48T59 is not set
-+# CONFIG_RTC_DRV_BQ4802 is not set
-+# CONFIG_RTC_DRV_V3020 is not set
-+
-+#
-+# on-CPU RTC drivers
-+#
-+# CONFIG_DMADEVICES is not set
-+# CONFIG_AUXDISPLAY is not set
-+# CONFIG_UIO is not set
-+# CONFIG_STAGING is not set
-+
-+#
-+# File systems
-+#
-+CONFIG_EXT2_FS=y
-+CONFIG_EXT2_FS_XATTR=y
-+CONFIG_EXT2_FS_POSIX_ACL=y
-+CONFIG_EXT2_FS_SECURITY=y
-+# CONFIG_EXT2_FS_XIP is not set
-+CONFIG_EXT3_FS=y
-+# CONFIG_EXT3_DEFAULTS_TO_ORDERED is not set
-+CONFIG_EXT3_FS_XATTR=y
-+CONFIG_EXT3_FS_POSIX_ACL=y
-+CONFIG_EXT3_FS_SECURITY=y
-+# CONFIG_EXT4_FS is not set
-+CONFIG_JBD=y
-+# CONFIG_JBD_DEBUG is not set
-+CONFIG_JBD2=m
-+# CONFIG_JBD2_DEBUG is not set
-+CONFIG_FS_MBCACHE=y
-+CONFIG_REISERFS_FS=m
-+# CONFIG_REISERFS_CHECK is not set
-+# CONFIG_REISERFS_PROC_INFO is not set
-+CONFIG_REISERFS_FS_XATTR=y
-+CONFIG_REISERFS_FS_POSIX_ACL=y
-+CONFIG_REISERFS_FS_SECURITY=y
-+CONFIG_JFS_FS=m
-+CONFIG_JFS_POSIX_ACL=y
-+CONFIG_JFS_SECURITY=y
-+# CONFIG_JFS_DEBUG is not set
-+# CONFIG_JFS_STATISTICS is not set
-+CONFIG_FS_POSIX_ACL=y
-+CONFIG_FILE_LOCKING=y
-+CONFIG_XFS_FS=m
-+CONFIG_XFS_QUOTA=y
-+CONFIG_XFS_POSIX_ACL=y
-+CONFIG_XFS_RT=y
-+# CONFIG_XFS_DEBUG is not set
-+# CONFIG_GFS2_FS is not set
-+CONFIG_OCFS2_FS=m
-+CONFIG_OCFS2_FS_O2CB=m
-+CONFIG_OCFS2_FS_STATS=y
-+CONFIG_OCFS2_DEBUG_MASKLOG=y
-+# CONFIG_OCFS2_DEBUG_FS is not set
-+# CONFIG_OCFS2_FS_POSIX_ACL is not set
-+# CONFIG_BTRFS_FS is not set
-+CONFIG_DNOTIFY=y
-+CONFIG_INOTIFY=y
-+CONFIG_INOTIFY_USER=y
-+CONFIG_QUOTA=y
-+# CONFIG_QUOTA_NETLINK_INTERFACE is not set
-+CONFIG_PRINT_QUOTA_WARNING=y
-+CONFIG_QUOTA_TREE=m
-+CONFIG_QFMT_V1=m
-+CONFIG_QFMT_V2=m
-+CONFIG_QUOTACTL=y
-+CONFIG_AUTOFS_FS=m
-+CONFIG_AUTOFS4_FS=m
-+CONFIG_FUSE_FS=m
-+
-+#
-+# Caches
-+#
-+# CONFIG_FSCACHE is not set
-+
-+#
-+# CD-ROM/DVD Filesystems
-+#
-+CONFIG_ISO9660_FS=m
-+CONFIG_JOLIET=y
-+CONFIG_ZISOFS=y
-+CONFIG_UDF_FS=m
-+CONFIG_UDF_NLS=y
-+
-+#
-+# DOS/FAT/NT Filesystems
-+#
-+CONFIG_FAT_FS=m
-+CONFIG_MSDOS_FS=m
-+CONFIG_VFAT_FS=m
-+CONFIG_FAT_DEFAULT_CODEPAGE=437
-+CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"
-+CONFIG_NTFS_FS=m
-+# CONFIG_NTFS_DEBUG is not set
-+CONFIG_NTFS_RW=y
-+
-+#
-+# Pseudo filesystems
-+#
-+CONFIG_PROC_FS=y
-+CONFIG_PROC_KCORE=y
-+CONFIG_PROC_SYSCTL=y
-+CONFIG_PROC_PAGE_MONITOR=y
-+CONFIG_SYSFS=y
-+CONFIG_TMPFS=y
-+# CONFIG_TMPFS_POSIX_ACL is not set
-+# CONFIG_HUGETLB_PAGE is not set
-+CONFIG_CONFIGFS_FS=m
-+CONFIG_MISC_FILESYSTEMS=y
-+CONFIG_ADFS_FS=m
-+# CONFIG_ADFS_FS_RW is not set
-+CONFIG_AFFS_FS=m
-+# CONFIG_ECRYPT_FS is not set
-+CONFIG_HFS_FS=m
-+CONFIG_HFSPLUS_FS=m
-+CONFIG_BEFS_FS=m
-+# CONFIG_BEFS_DEBUG is not set
-+CONFIG_BFS_FS=m
-+CONFIG_EFS_FS=m
-+CONFIG_CRAMFS=y
-+# CONFIG_SQUASHFS is not set
-+CONFIG_VXFS_FS=m
-+CONFIG_MINIX_FS=m
-+# CONFIG_OMFS_FS is not set
-+CONFIG_HPFS_FS=m
-+CONFIG_QNX4FS_FS=m
-+CONFIG_ROMFS_FS=m
-+CONFIG_ROMFS_BACKED_BY_BLOCK=y
-+# CONFIG_ROMFS_BACKED_BY_MTD is not set
-+# CONFIG_ROMFS_BACKED_BY_BOTH is not set
-+CONFIG_ROMFS_ON_BLOCK=y
-+CONFIG_SYSV_FS=m
-+CONFIG_UFS_FS=m
-+# CONFIG_UFS_FS_WRITE is not set
-+# CONFIG_UFS_DEBUG is not set
-+# CONFIG_NILFS2_FS is not set
-+CONFIG_NETWORK_FILESYSTEMS=y
-+CONFIG_NFS_FS=m
-+CONFIG_NFS_V3=y
-+CONFIG_NFS_V3_ACL=y
-+CONFIG_NFS_V4=y
-+CONFIG_NFSD=m
-+CONFIG_NFSD_V2_ACL=y
-+CONFIG_NFSD_V3=y
-+CONFIG_NFSD_V3_ACL=y
-+CONFIG_NFSD_V4=y
-+CONFIG_LOCKD=m
-+CONFIG_LOCKD_V4=y
-+CONFIG_EXPORTFS=m
-+CONFIG_NFS_ACL_SUPPORT=m
-+CONFIG_NFS_COMMON=y
-+CONFIG_SUNRPC=m
-+CONFIG_SUNRPC_GSS=m
-+CONFIG_RPCSEC_GSS_KRB5=m
-+CONFIG_RPCSEC_GSS_SPKM3=m
-+CONFIG_SMB_FS=m
-+# CONFIG_SMB_NLS_DEFAULT is not set
-+CONFIG_CIFS=m
-+# CONFIG_CIFS_STATS is not set
-+# CONFIG_CIFS_WEAK_PW_HASH is not set
-+# CONFIG_CIFS_UPCALL is not set
-+# CONFIG_CIFS_XATTR is not set
-+# CONFIG_CIFS_DEBUG2 is not set
-+# CONFIG_CIFS_DFS_UPCALL is not set
-+# CONFIG_CIFS_EXPERIMENTAL is not set
-+CONFIG_NCP_FS=m
-+CONFIG_NCPFS_PACKET_SIGNING=y
-+CONFIG_NCPFS_IOCTL_LOCKING=y
-+CONFIG_NCPFS_STRONG=y
-+CONFIG_NCPFS_NFS_NS=y
-+CONFIG_NCPFS_OS2_NS=y
-+# CONFIG_NCPFS_SMALLDOS is not set
-+CONFIG_NCPFS_NLS=y
-+CONFIG_NCPFS_EXTRAS=y
-+CONFIG_CODA_FS=m
-+CONFIG_AFS_FS=m
-+# CONFIG_AFS_DEBUG is not set
-+
-+#
-+# Partition Types
-+#
-+CONFIG_PARTITION_ADVANCED=y
-+CONFIG_ACORN_PARTITION=y
-+# CONFIG_ACORN_PARTITION_CUMANA is not set
-+# CONFIG_ACORN_PARTITION_EESOX is not set
-+CONFIG_ACORN_PARTITION_ICS=y
-+# CONFIG_ACORN_PARTITION_ADFS is not set
-+# CONFIG_ACORN_PARTITION_POWERTEC is not set
-+CONFIG_ACORN_PARTITION_RISCIX=y
-+CONFIG_OSF_PARTITION=y
-+CONFIG_AMIGA_PARTITION=y
-+CONFIG_ATARI_PARTITION=y
-+CONFIG_MAC_PARTITION=y
-+CONFIG_MSDOS_PARTITION=y
-+CONFIG_BSD_DISKLABEL=y
-+CONFIG_MINIX_SUBPARTITION=y
-+CONFIG_SOLARIS_X86_PARTITION=y
-+CONFIG_UNIXWARE_DISKLABEL=y
-+CONFIG_LDM_PARTITION=y
-+# CONFIG_LDM_DEBUG is not set
-+CONFIG_SGI_PARTITION=y
-+CONFIG_ULTRIX_PARTITION=y
-+CONFIG_SUN_PARTITION=y
-+CONFIG_KARMA_PARTITION=y
-+CONFIG_EFI_PARTITION=y
-+# CONFIG_SYSV68_PARTITION is not set
-+CONFIG_NLS=y
-+CONFIG_NLS_DEFAULT="iso8859-1"
-+CONFIG_NLS_CODEPAGE_437=m
-+CONFIG_NLS_CODEPAGE_737=m
-+CONFIG_NLS_CODEPAGE_775=m
-+CONFIG_NLS_CODEPAGE_850=m
-+CONFIG_NLS_CODEPAGE_852=m
-+CONFIG_NLS_CODEPAGE_855=m
-+CONFIG_NLS_CODEPAGE_857=m
-+CONFIG_NLS_CODEPAGE_860=m
-+CONFIG_NLS_CODEPAGE_861=m
-+CONFIG_NLS_CODEPAGE_862=m
-+CONFIG_NLS_CODEPAGE_863=m
-+CONFIG_NLS_CODEPAGE_864=m
-+CONFIG_NLS_CODEPAGE_865=m
-+CONFIG_NLS_CODEPAGE_866=m
-+CONFIG_NLS_CODEPAGE_869=m
-+CONFIG_NLS_CODEPAGE_936=m
-+CONFIG_NLS_CODEPAGE_950=m
-+CONFIG_NLS_CODEPAGE_932=m
-+CONFIG_NLS_CODEPAGE_949=m
-+CONFIG_NLS_CODEPAGE_874=m
-+CONFIG_NLS_ISO8859_8=m
-+CONFIG_NLS_CODEPAGE_1250=m
-+CONFIG_NLS_CODEPAGE_1251=m
-+CONFIG_NLS_ASCII=m
-+CONFIG_NLS_ISO8859_1=m
-+CONFIG_NLS_ISO8859_2=m
-+CONFIG_NLS_ISO8859_3=m
-+CONFIG_NLS_ISO8859_4=m
-+CONFIG_NLS_ISO8859_5=m
-+CONFIG_NLS_ISO8859_6=m
-+CONFIG_NLS_ISO8859_7=m
-+CONFIG_NLS_ISO8859_9=m
-+CONFIG_NLS_ISO8859_13=m
-+CONFIG_NLS_ISO8859_14=m
-+CONFIG_NLS_ISO8859_15=m
-+CONFIG_NLS_KOI8_R=m
-+CONFIG_NLS_KOI8_U=m
-+CONFIG_NLS_UTF8=m
-+# CONFIG_DLM is not set
-+
-+#
-+# Kernel hacking
-+#
-+CONFIG_TRACE_IRQFLAGS_SUPPORT=y
-+# CONFIG_PRINTK_TIME is not set
-+CONFIG_ENABLE_WARN_DEPRECATED=y
-+CONFIG_ENABLE_MUST_CHECK=y
-+CONFIG_FRAME_WARN=1024
-+CONFIG_MAGIC_SYSRQ=y
-+CONFIG_UNUSED_SYMBOLS=y
-+CONFIG_DEBUG_FS=y
-+# CONFIG_HEADERS_CHECK is not set
-+# CONFIG_DEBUG_KERNEL is not set
-+# CONFIG_DEBUG_MEMORY_INIT is not set
-+# CONFIG_RCU_CPU_STALL_DETECTOR is not set
-+CONFIG_SYSCTL_SYSCALL_CHECK=y
-+CONFIG_TRACING_SUPPORT=y
-+
-+#
-+# Tracers
-+#
-+# CONFIG_IRQSOFF_TRACER is not set
-+# CONFIG_SCHED_TRACER is not set
-+# CONFIG_CONTEXT_SWITCH_TRACER is not set
-+# CONFIG_EVENT_TRACER is not set
-+# CONFIG_BOOT_TRACER is not set
-+# CONFIG_TRACE_BRANCH_PROFILING is not set
-+# CONFIG_KMEMTRACE is not set
-+# CONFIG_WORKQUEUE_TRACER is not set
-+# CONFIG_BLK_DEV_IO_TRACE is not set
-+# CONFIG_DYNAMIC_DEBUG is not set
-+# CONFIG_SAMPLES is not set
-+CONFIG_HAVE_ARCH_KGDB=y
-+CONFIG_CMDLINE=""
-+
-+#
-+# Security options
-+#
-+CONFIG_KEYS=y
-+# CONFIG_KEYS_DEBUG_PROC_KEYS is not set
-+CONFIG_SECURITY=y
-+# CONFIG_SECURITYFS is not set
-+CONFIG_SECURITY_NETWORK=y
-+CONFIG_SECURITY_NETWORK_XFRM=y
-+# CONFIG_SECURITY_PATH is not set
-+# CONFIG_SECURITY_FILE_CAPABILITIES is not set
-+# CONFIG_SECURITY_ROOTPLUG is not set
-+CONFIG_SECURITY_DEFAULT_MMAP_MIN_ADDR=0
-+CONFIG_SECURITY_SELINUX=y
-+CONFIG_SECURITY_SELINUX_BOOTPARAM=y
-+CONFIG_SECURITY_SELINUX_BOOTPARAM_VALUE=0
-+CONFIG_SECURITY_SELINUX_DISABLE=y
-+CONFIG_SECURITY_SELINUX_DEVELOP=y
-+CONFIG_SECURITY_SELINUX_AVC_STATS=y
-+CONFIG_SECURITY_SELINUX_CHECKREQPROT_VALUE=1
-+# CONFIG_SECURITY_SELINUX_POLICYDB_VERSION_MAX is not set
-+# CONFIG_SECURITY_TOMOYO is not set
-+CONFIG_XOR_BLOCKS=m
-+CONFIG_ASYNC_CORE=m
-+CONFIG_ASYNC_MEMCPY=m
-+CONFIG_ASYNC_XOR=m
-+CONFIG_CRYPTO=y
-+
-+#
-+# Crypto core or helper
-+#
-+# CONFIG_CRYPTO_FIPS is not set
-+CONFIG_CRYPTO_ALGAPI=y
-+CONFIG_CRYPTO_ALGAPI2=y
-+CONFIG_CRYPTO_AEAD=m
-+CONFIG_CRYPTO_AEAD2=y
-+CONFIG_CRYPTO_BLKCIPHER=y
-+CONFIG_CRYPTO_BLKCIPHER2=y
-+CONFIG_CRYPTO_HASH=y
-+CONFIG_CRYPTO_HASH2=y
-+CONFIG_CRYPTO_RNG2=y
-+CONFIG_CRYPTO_PCOMP=y
-+CONFIG_CRYPTO_MANAGER=y
-+CONFIG_CRYPTO_MANAGER2=y
-+# CONFIG_CRYPTO_GF128MUL is not set
-+CONFIG_CRYPTO_NULL=m
-+CONFIG_CRYPTO_WORKQUEUE=y
-+# CONFIG_CRYPTO_CRYPTD is not set
-+CONFIG_CRYPTO_AUTHENC=m
-+CONFIG_CRYPTO_TEST=m
-+
-+#
-+# Authenticated Encryption with Associated Data
-+#
-+# CONFIG_CRYPTO_CCM is not set
-+# CONFIG_CRYPTO_GCM is not set
-+# CONFIG_CRYPTO_SEQIV is not set
-+
-+#
-+# Block modes
-+#
-+CONFIG_CRYPTO_CBC=y
-+# CONFIG_CRYPTO_CTR is not set
-+# CONFIG_CRYPTO_CTS is not set
-+CONFIG_CRYPTO_ECB=m
-+# CONFIG_CRYPTO_LRW is not set
-+# CONFIG_CRYPTO_PCBC is not set
-+# CONFIG_CRYPTO_XTS is not set
-+
-+#
-+# Hash modes
-+#
-+CONFIG_CRYPTO_HMAC=y
-+# CONFIG_CRYPTO_XCBC is not set
-+
-+#
-+# Digest
-+#
-+CONFIG_CRYPTO_CRC32C=m
-+CONFIG_CRYPTO_MD4=m
-+CONFIG_CRYPTO_MD5=y
-+CONFIG_CRYPTO_MICHAEL_MIC=m
-+# CONFIG_CRYPTO_RMD128 is not set
-+# CONFIG_CRYPTO_RMD160 is not set
-+# CONFIG_CRYPTO_RMD256 is not set
-+# CONFIG_CRYPTO_RMD320 is not set
-+CONFIG_CRYPTO_SHA1=m
-+CONFIG_CRYPTO_SHA256=m
-+CONFIG_CRYPTO_SHA512=m
-+CONFIG_CRYPTO_TGR192=m
-+CONFIG_CRYPTO_WP512=m
-+
-+#
-+# Ciphers
-+#
-+CONFIG_CRYPTO_AES=m
-+CONFIG_CRYPTO_ANUBIS=m
-+CONFIG_CRYPTO_ARC4=m
-+CONFIG_CRYPTO_BLOWFISH=m
-+# CONFIG_CRYPTO_CAMELLIA is not set
-+CONFIG_CRYPTO_CAST5=m
-+CONFIG_CRYPTO_CAST6=m
-+CONFIG_CRYPTO_DES=m
-+# CONFIG_CRYPTO_FCRYPT is not set
-+CONFIG_CRYPTO_KHAZAD=m
-+# CONFIG_CRYPTO_SALSA20 is not set
-+# CONFIG_CRYPTO_SEED is not set
-+CONFIG_CRYPTO_SERPENT=m
-+CONFIG_CRYPTO_TEA=m
-+CONFIG_CRYPTO_TWOFISH=m
-+CONFIG_CRYPTO_TWOFISH_COMMON=m
-+
-+#
-+# Compression
-+#
-+CONFIG_CRYPTO_DEFLATE=m
-+# CONFIG_CRYPTO_ZLIB is not set
-+# CONFIG_CRYPTO_LZO is not set
-+
-+#
-+# Random Number Generation
-+#
-+# CONFIG_CRYPTO_ANSI_CPRNG is not set
-+CONFIG_CRYPTO_HW=y
-+# CONFIG_CRYPTO_DEV_HIFN_795X is not set
-+# CONFIG_BINARY_PRINTF is not set
-+
-+#
-+# Library routines
-+#
-+CONFIG_BITREVERSE=y
-+CONFIG_GENERIC_FIND_LAST_BIT=y
-+CONFIG_CRC_CCITT=m
-+CONFIG_CRC16=m
-+# CONFIG_CRC_T10DIF is not set
-+CONFIG_CRC_ITU_T=m
-+CONFIG_CRC32=y
-+# CONFIG_CRC7 is not set
-+CONFIG_LIBCRC32C=m
-+CONFIG_AUDIT_GENERIC=y
-+CONFIG_ZLIB_INFLATE=y
-+CONFIG_ZLIB_DEFLATE=m
-+CONFIG_DECOMPRESS_GZIP=y
-+CONFIG_TEXTSEARCH=y
-+CONFIG_TEXTSEARCH_KMP=m
-+CONFIG_TEXTSEARCH_BM=m
-+CONFIG_TEXTSEARCH_FSM=m
-+CONFIG_HAS_IOMEM=y
-+CONFIG_HAS_IOPORT=y
-+CONFIG_HAS_DMA=y
-+CONFIG_NLATTR=y
-diff -Nur linux-2.6.30.5.orig/arch/mips/configs/yeeloong2f_defconfig linux-2.6.30.5/arch/mips/configs/yeeloong2f_defconfig
---- linux-2.6.30.5.orig/arch/mips/configs/yeeloong2f_defconfig 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.30.5/arch/mips/configs/yeeloong2f_defconfig 2009-08-23 19:01:04.000000000 +0200
-@@ -0,0 +1,2591 @@
-+#
-+# Automatically generated make config: don't edit
-+# Linux kernel version: 2.6.31-rc2
-+# Sat Jul 11 00:34:44 2009
-+#
-+CONFIG_MIPS=y
-+
-+#
-+# Machine selection
-+#
-+# CONFIG_MACH_ALCHEMY is not set
-+# CONFIG_AR7 is not set
-+# CONFIG_BASLER_EXCITE is not set
-+# CONFIG_BCM47XX is not set
-+# CONFIG_MIPS_COBALT is not set
-+# CONFIG_MACH_DECSTATION is not set
-+# CONFIG_MACH_JAZZ is not set
-+# CONFIG_LASAT is not set
-+CONFIG_MACH_LOONGSON=y
-+# CONFIG_MIPS_MALTA is not set
-+# CONFIG_MIPS_SIM is not set
-+# CONFIG_NEC_MARKEINS is not set
-+# CONFIG_MACH_VR41XX is not set
-+# CONFIG_NXP_STB220 is not set
-+# CONFIG_NXP_STB225 is not set
-+# CONFIG_PNX8550_JBS is not set
-+# CONFIG_PNX8550_STB810 is not set
-+# CONFIG_PMC_MSP is not set
-+# CONFIG_PMC_YOSEMITE is not set
-+# CONFIG_SGI_IP22 is not set
-+# CONFIG_SGI_IP27 is not set
-+# CONFIG_SGI_IP28 is not set
-+# CONFIG_SGI_IP32 is not set
-+# CONFIG_SIBYTE_CRHINE is not set
-+# CONFIG_SIBYTE_CARMEL is not set
-+# CONFIG_SIBYTE_CRHONE is not set
-+# CONFIG_SIBYTE_RHONE is not set
-+# CONFIG_SIBYTE_SWARM is not set
-+# CONFIG_SIBYTE_LITTLESUR is not set
-+# CONFIG_SIBYTE_SENTOSA is not set
-+# CONFIG_SIBYTE_BIGSUR is not set
-+# CONFIG_SNI_RM is not set
-+# CONFIG_MACH_TX39XX is not set
-+# CONFIG_MACH_TX49XX is not set
-+# CONFIG_MIKROTIK_RB532 is not set
-+# CONFIG_WR_PPMC is not set
-+# CONFIG_CAVIUM_OCTEON_SIMULATOR is not set
-+# CONFIG_CAVIUM_OCTEON_REFERENCE_BOARD is not set
-+# CONFIG_ALCHEMY_GPIO_INDIRECT is not set
-+CONFIG_ARCH_SPARSEMEM_ENABLE=y
-+# CONFIG_LEMOTE_FULOONG2E is not set
-+# CONFIG_LEMOTE_FULOONG2F is not set
-+CONFIG_LEMOTE_YEELOONG2F=y
-+CONFIG_CS5536=y
-+CONFIG_SYS_HAS_MACH_PROM_INIT_CMDLINE=y
-+CONFIG_CS5536_MFGPT=y
-+CONFIG_UCA_SIZE=0x400000
-+CONFIG_RWSEM_GENERIC_SPINLOCK=y
-+# CONFIG_ARCH_HAS_ILOG2_U32 is not set
-+# CONFIG_ARCH_HAS_ILOG2_U64 is not set
-+CONFIG_ARCH_SUPPORTS_OPROFILE=y
-+CONFIG_GENERIC_FIND_NEXT_BIT=y
-+CONFIG_GENERIC_HWEIGHT=y
-+CONFIG_GENERIC_CALIBRATE_DELAY=y
-+CONFIG_GENERIC_CLOCKEVENTS=y
-+CONFIG_GENERIC_TIME=y
-+CONFIG_GENERIC_CMOS_UPDATE=y
-+CONFIG_SCHED_OMIT_FRAME_POINTER=y
-+CONFIG_GENERIC_HARDIRQS_NO__DO_IRQ=y
-+CONFIG_DMA_NONCOHERENT=y
-+CONFIG_DMA_NEED_PCI_MAP_STATE=y
-+CONFIG_EARLY_PRINTK=y
-+CONFIG_SYS_HAS_EARLY_PRINTK=y
-+CONFIG_SYS_SUPPORTS_HOTPLUG_CPU=y
-+CONFIG_I8259=y
-+# CONFIG_NO_IOPORT is not set
-+CONFIG_GENERIC_ISA_DMA=y
-+CONFIG_GENERIC_ISA_DMA_SUPPORT_BROKEN=y
-+# CONFIG_CPU_BIG_ENDIAN is not set
-+CONFIG_CPU_LITTLE_ENDIAN=y
-+CONFIG_SYS_SUPPORTS_LITTLE_ENDIAN=y
-+CONFIG_IRQ_CPU=y
-+CONFIG_BOOT_ELF32=y
-+CONFIG_MIPS_L1_CACHE_SHIFT=5
-+
-+#
-+# CPU selection
-+#
-+# CONFIG_CPU_LOONGSON2E is not set
-+CONFIG_CPU_LOONGSON2F=y
-+# CONFIG_CPU_MIPS32_R1 is not set
-+# CONFIG_CPU_MIPS32_R2 is not set
-+# CONFIG_CPU_MIPS64_R1 is not set
-+# CONFIG_CPU_MIPS64_R2 is not set
-+# CONFIG_CPU_R3000 is not set
-+# CONFIG_CPU_TX39XX is not set
-+# CONFIG_CPU_VR41XX is not set
-+# CONFIG_CPU_R4300 is not set
-+# CONFIG_CPU_R4X00 is not set
-+# CONFIG_CPU_TX49XX is not set
-+# CONFIG_CPU_R5000 is not set
-+# CONFIG_CPU_R5432 is not set
-+# CONFIG_CPU_R5500 is not set
-+# CONFIG_CPU_R6000 is not set
-+# CONFIG_CPU_NEVADA is not set
-+# CONFIG_CPU_R8000 is not set
-+# CONFIG_CPU_R10000 is not set
-+# CONFIG_CPU_RM7000 is not set
-+# CONFIG_CPU_RM9000 is not set
-+# CONFIG_CPU_SB1 is not set
-+# CONFIG_CPU_CAVIUM_OCTEON is not set
-+CONFIG_CPU_LOONGSON2=y
-+CONFIG_SYS_HAS_CPU_LOONGSON2F=y
-+CONFIG_SYS_SUPPORTS_32BIT_KERNEL=y
-+CONFIG_SYS_SUPPORTS_64BIT_KERNEL=y
-+CONFIG_CPU_SUPPORTS_32BIT_KERNEL=y
-+CONFIG_CPU_SUPPORTS_64BIT_KERNEL=y
-+
-+#
-+# Kernel type
-+#
-+# CONFIG_32BIT is not set
-+CONFIG_64BIT=y
-+# CONFIG_PAGE_SIZE_4KB is not set
-+# CONFIG_PAGE_SIZE_8KB is not set
-+CONFIG_PAGE_SIZE_16KB=y
-+# CONFIG_PAGE_SIZE_32KB is not set
-+# CONFIG_PAGE_SIZE_64KB is not set
-+CONFIG_BOARD_SCACHE=y
-+CONFIG_MIPS_MT_DISABLED=y
-+# CONFIG_MIPS_MT_SMP is not set
-+# CONFIG_MIPS_MT_SMTC is not set
-+CONFIG_CPU_HAS_WB=y
-+CONFIG_CPU_HAS_SYNC=y
-+CONFIG_GENERIC_HARDIRQS=y
-+CONFIG_GENERIC_IRQ_PROBE=y
-+CONFIG_CPU_SUPPORTS_HIGHMEM=y
-+CONFIG_SYS_SUPPORTS_HIGHMEM=y
-+CONFIG_ARCH_FLATMEM_ENABLE=y
-+CONFIG_ARCH_POPULATES_NODE_MAP=y
-+CONFIG_SELECT_MEMORY_MODEL=y
-+# CONFIG_FLATMEM_MANUAL is not set
-+# CONFIG_DISCONTIGMEM_MANUAL is not set
-+CONFIG_SPARSEMEM_MANUAL=y
-+CONFIG_SPARSEMEM=y
-+CONFIG_HAVE_MEMORY_PRESENT=y
-+CONFIG_SPARSEMEM_STATIC=y
-+
-+#
-+# Memory hotplug is currently incompatible with Software Suspend
-+#
-+CONFIG_PAGEFLAGS_EXTENDED=y
-+CONFIG_SPLIT_PTLOCK_CPUS=4
-+CONFIG_PHYS_ADDR_T_64BIT=y
-+CONFIG_ZONE_DMA_FLAG=0
-+CONFIG_VIRT_TO_BUS=y
-+CONFIG_HAVE_MLOCK=y
-+CONFIG_HAVE_MLOCKED_PAGE_BIT=y
-+CONFIG_DEFAULT_MMAP_MIN_ADDR=4096
-+CONFIG_TICK_ONESHOT=y
-+CONFIG_NO_HZ=y
-+CONFIG_HIGH_RES_TIMERS=y
-+CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
-+# CONFIG_HZ_48 is not set
-+# CONFIG_HZ_100 is not set
-+# CONFIG_HZ_128 is not set
-+CONFIG_HZ_250=y
-+# CONFIG_HZ_256 is not set
-+# CONFIG_HZ_1000 is not set
-+# CONFIG_HZ_1024 is not set
-+CONFIG_SYS_SUPPORTS_ARBIT_HZ=y
-+CONFIG_HZ=250
-+# CONFIG_PREEMPT_NONE is not set
-+CONFIG_PREEMPT_VOLUNTARY=y
-+# CONFIG_PREEMPT is not set
-+CONFIG_KEXEC=y
-+# CONFIG_SECCOMP is not set
-+CONFIG_LOCKDEP_SUPPORT=y
-+CONFIG_STACKTRACE_SUPPORT=y
-+CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
-+CONFIG_CONSTRUCTORS=y
-+
-+#
-+# General setup
-+#
-+CONFIG_EXPERIMENTAL=y
-+CONFIG_BROKEN_ON_SMP=y
-+CONFIG_INIT_ENV_ARG_LIMIT=32
-+CONFIG_LOCALVERSION=""
-+# CONFIG_LOCALVERSION_AUTO is not set
-+CONFIG_SWAP=y
-+CONFIG_SYSVIPC=y
-+CONFIG_SYSVIPC_SYSCTL=y
-+CONFIG_POSIX_MQUEUE=y
-+CONFIG_POSIX_MQUEUE_SYSCTL=y
-+CONFIG_BSD_PROCESS_ACCT=y
-+CONFIG_BSD_PROCESS_ACCT_V3=y
-+# CONFIG_TASKSTATS is not set
-+CONFIG_AUDIT=y
-+
-+#
-+# RCU Subsystem
-+#
-+CONFIG_CLASSIC_RCU=y
-+# CONFIG_TREE_RCU is not set
-+# CONFIG_PREEMPT_RCU is not set
-+# CONFIG_TREE_RCU_TRACE is not set
-+# CONFIG_PREEMPT_RCU_TRACE is not set
-+CONFIG_IKCONFIG=y
-+CONFIG_IKCONFIG_PROC=y
-+CONFIG_LOG_BUF_SHIFT=15
-+# CONFIG_GROUP_SCHED is not set
-+# CONFIG_CGROUPS is not set
-+CONFIG_SYSFS_DEPRECATED=y
-+CONFIG_SYSFS_DEPRECATED_V2=y
-+# CONFIG_RELAY is not set
-+# CONFIG_NAMESPACES is not set
-+CONFIG_BLK_DEV_INITRD=y
-+CONFIG_INITRAMFS_SOURCE=""
-+CONFIG_RD_GZIP=y
-+# CONFIG_RD_BZIP2 is not set
-+# CONFIG_RD_LZMA is not set
-+CONFIG_CC_OPTIMIZE_FOR_SIZE=y
-+CONFIG_SYSCTL=y
-+CONFIG_ANON_INODES=y
-+CONFIG_EMBEDDED=y
-+CONFIG_SYSCTL_SYSCALL=y
-+CONFIG_KALLSYMS=y
-+# CONFIG_KALLSYMS_EXTRA_PASS is not set
-+CONFIG_HOTPLUG=y
-+CONFIG_PRINTK=y
-+CONFIG_BUG=y
-+CONFIG_ELF_CORE=y
-+CONFIG_PCSPKR_PLATFORM=y
-+CONFIG_BASE_FULL=y
-+CONFIG_FUTEX=y
-+CONFIG_EPOLL=y
-+CONFIG_SIGNALFD=y
-+CONFIG_TIMERFD=y
-+CONFIG_EVENTFD=y
-+CONFIG_SHMEM=y
-+CONFIG_AIO=y
-+
-+#
-+# Performance Counters
-+#
-+CONFIG_VM_EVENT_COUNTERS=y
-+CONFIG_PCI_QUIRKS=y
-+# CONFIG_STRIP_ASM_SYMS is not set
-+CONFIG_COMPAT_BRK=y
-+CONFIG_SLAB=y
-+# CONFIG_SLUB is not set
-+# CONFIG_SLOB is not set
-+CONFIG_PROFILING=y
-+CONFIG_TRACEPOINTS=y
-+CONFIG_MARKERS=y
-+CONFIG_OPROFILE=m
-+CONFIG_HAVE_OPROFILE=y
-+CONFIG_HAVE_SYSCALL_WRAPPERS=y
-+
-+#
-+# GCOV-based kernel profiling
-+#
-+# CONFIG_GCOV_KERNEL is not set
-+# CONFIG_SLOW_WORK is not set
-+# CONFIG_HAVE_GENERIC_DMA_COHERENT is not set
-+CONFIG_SLABINFO=y
-+CONFIG_RT_MUTEXES=y
-+CONFIG_BASE_SMALL=0
-+CONFIG_MODULES=y
-+# CONFIG_MODULE_FORCE_LOAD is not set
-+CONFIG_MODULE_UNLOAD=y
-+CONFIG_MODULE_FORCE_UNLOAD=y
-+CONFIG_MODVERSIONS=y
-+# CONFIG_MODULE_SRCVERSION_ALL is not set
-+CONFIG_BLOCK=y
-+# CONFIG_BLK_DEV_BSG is not set
-+# CONFIG_BLK_DEV_INTEGRITY is not set
-+CONFIG_BLOCK_COMPAT=y
-+
-+#
-+# IO Schedulers
-+#
-+CONFIG_IOSCHED_NOOP=y
-+CONFIG_IOSCHED_AS=y
-+CONFIG_IOSCHED_DEADLINE=y
-+CONFIG_IOSCHED_CFQ=y
-+# CONFIG_DEFAULT_AS is not set
-+# CONFIG_DEFAULT_DEADLINE is not set
-+CONFIG_DEFAULT_CFQ=y
-+# CONFIG_DEFAULT_NOOP is not set
-+CONFIG_DEFAULT_IOSCHED="cfq"
-+# CONFIG_PROBE_INITRD_HEADER is not set
-+CONFIG_FREEZER=y
-+
-+#
-+# Bus options (PCI, PCMCIA, EISA, ISA, TC)
-+#
-+CONFIG_HW_HAS_PCI=y
-+CONFIG_PCI=y
-+CONFIG_PCI_DOMAINS=y
-+# CONFIG_ARCH_SUPPORTS_MSI is not set
-+CONFIG_PCI_LEGACY=y
-+# CONFIG_PCI_STUB is not set
-+# CONFIG_PCI_IOV is not set
-+CONFIG_ISA=y
-+CONFIG_MMU=y
-+# CONFIG_PCCARD is not set
-+CONFIG_HOTPLUG_PCI=m
-+CONFIG_HOTPLUG_PCI_FAKE=m
-+CONFIG_HOTPLUG_PCI_CPCI=y
-+CONFIG_HOTPLUG_PCI_SHPC=m
-+
-+#
-+# Executable file formats
-+#
-+CONFIG_BINFMT_ELF=y
-+# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set
-+# CONFIG_HAVE_AOUT is not set
-+CONFIG_BINFMT_MISC=m
-+CONFIG_MIPS32_COMPAT=y
-+CONFIG_COMPAT=y
-+CONFIG_SYSVIPC_COMPAT=y
-+CONFIG_MIPS32_O32=y
-+CONFIG_MIPS32_N32=y
-+CONFIG_BINFMT_ELF32=y
-+
-+#
-+# Power management options
-+#
-+CONFIG_ARCH_HIBERNATION_POSSIBLE=y
-+CONFIG_ARCH_SUSPEND_POSSIBLE=y
-+CONFIG_PM=y
-+# CONFIG_PM_DEBUG is not set
-+CONFIG_PM_SLEEP=y
-+CONFIG_SUSPEND=y
-+CONFIG_SUSPEND_FREEZER=y
-+CONFIG_HIBERNATION_NVS=y
-+CONFIG_HIBERNATION=y
-+CONFIG_PM_STD_PARTITION="/dev/hda3"
-+
-+#
-+# CPU Frequency scaling
-+#
-+CONFIG_CPU_FREQ=y
-+CONFIG_CPU_FREQ_TABLE=y
-+# CONFIG_CPU_FREQ_DEBUG is not set
-+CONFIG_CPU_FREQ_STAT=y
-+# CONFIG_CPU_FREQ_STAT_DETAILS is not set
-+# CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE is not set
-+# CONFIG_CPU_FREQ_DEFAULT_GOV_POWERSAVE is not set
-+# CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set
-+# CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND is not set
-+CONFIG_CPU_FREQ_DEFAULT_GOV_CONSERVATIVE=y
-+CONFIG_CPU_FREQ_GOV_PERFORMANCE=y
-+# CONFIG_CPU_FREQ_GOV_POWERSAVE is not set
-+# CONFIG_CPU_FREQ_GOV_USERSPACE is not set
-+# CONFIG_CPU_FREQ_GOV_ONDEMAND is not set
-+CONFIG_CPU_FREQ_GOV_CONSERVATIVE=y
-+CONFIG_LOONGSON2F_CPU_FREQ=y
-+CONFIG_NET=y
-+
-+#
-+# Networking options
-+#
-+CONFIG_PACKET=y
-+CONFIG_PACKET_MMAP=y
-+CONFIG_UNIX=y
-+CONFIG_XFRM=y
-+CONFIG_XFRM_USER=m
-+# CONFIG_XFRM_SUB_POLICY is not set
-+# CONFIG_XFRM_MIGRATE is not set
-+# CONFIG_XFRM_STATISTICS is not set
-+CONFIG_XFRM_IPCOMP=m
-+CONFIG_NET_KEY=m
-+# CONFIG_NET_KEY_MIGRATE is not set
-+CONFIG_INET=y
-+CONFIG_IP_MULTICAST=y
-+CONFIG_IP_ADVANCED_ROUTER=y
-+CONFIG_ASK_IP_FIB_HASH=y
-+# CONFIG_IP_FIB_TRIE is not set
-+CONFIG_IP_FIB_HASH=y
-+CONFIG_IP_MULTIPLE_TABLES=y
-+CONFIG_IP_ROUTE_MULTIPATH=y
-+CONFIG_IP_ROUTE_VERBOSE=y
-+# CONFIG_IP_PNP is not set
-+CONFIG_NET_IPIP=m
-+CONFIG_NET_IPGRE=m
-+CONFIG_NET_IPGRE_BROADCAST=y
-+CONFIG_IP_MROUTE=y
-+CONFIG_IP_PIMSM_V1=y
-+CONFIG_IP_PIMSM_V2=y
-+# CONFIG_ARPD is not set
-+CONFIG_SYN_COOKIES=y
-+CONFIG_INET_AH=m
-+CONFIG_INET_ESP=m
-+CONFIG_INET_IPCOMP=m
-+CONFIG_INET_XFRM_TUNNEL=m
-+CONFIG_INET_TUNNEL=m
-+CONFIG_INET_XFRM_MODE_TRANSPORT=m
-+CONFIG_INET_XFRM_MODE_TUNNEL=m
-+CONFIG_INET_XFRM_MODE_BEET=y
-+CONFIG_INET_LRO=y
-+CONFIG_INET_DIAG=m
-+CONFIG_INET_TCP_DIAG=m
-+CONFIG_TCP_CONG_ADVANCED=y
-+CONFIG_TCP_CONG_BIC=y
-+CONFIG_TCP_CONG_CUBIC=m
-+CONFIG_TCP_CONG_WESTWOOD=m
-+CONFIG_TCP_CONG_HTCP=m
-+CONFIG_TCP_CONG_HSTCP=m
-+CONFIG_TCP_CONG_HYBLA=m
-+CONFIG_TCP_CONG_VEGAS=m
-+CONFIG_TCP_CONG_SCALABLE=m
-+CONFIG_TCP_CONG_LP=m
-+CONFIG_TCP_CONG_VENO=m
-+# CONFIG_TCP_CONG_YEAH is not set
-+# CONFIG_TCP_CONG_ILLINOIS is not set
-+CONFIG_DEFAULT_BIC=y
-+# CONFIG_DEFAULT_CUBIC is not set
-+# CONFIG_DEFAULT_HTCP is not set
-+# CONFIG_DEFAULT_VEGAS is not set
-+# CONFIG_DEFAULT_WESTWOOD is not set
-+# CONFIG_DEFAULT_RENO is not set
-+CONFIG_DEFAULT_TCP_CONG="bic"
-+# CONFIG_TCP_MD5SIG is not set
-+CONFIG_IPV6=m
-+CONFIG_IPV6_PRIVACY=y
-+# CONFIG_IPV6_ROUTER_PREF is not set
-+# CONFIG_IPV6_OPTIMISTIC_DAD is not set
-+CONFIG_INET6_AH=m
-+CONFIG_INET6_ESP=m
-+CONFIG_INET6_IPCOMP=m
-+# CONFIG_IPV6_MIP6 is not set
-+CONFIG_INET6_XFRM_TUNNEL=m
-+CONFIG_INET6_TUNNEL=m
-+CONFIG_INET6_XFRM_MODE_TRANSPORT=m
-+CONFIG_INET6_XFRM_MODE_TUNNEL=m
-+CONFIG_INET6_XFRM_MODE_BEET=m
-+# CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION is not set
-+CONFIG_IPV6_SIT=m
-+CONFIG_IPV6_NDISC_NODETYPE=y
-+CONFIG_IPV6_TUNNEL=m
-+# CONFIG_IPV6_MULTIPLE_TABLES is not set
-+# CONFIG_IPV6_MROUTE is not set
-+# CONFIG_NETLABEL is not set
-+CONFIG_NETWORK_SECMARK=y
-+CONFIG_NETFILTER=y
-+# CONFIG_NETFILTER_DEBUG is not set
-+CONFIG_NETFILTER_ADVANCED=y
-+CONFIG_BRIDGE_NETFILTER=y
-+
-+#
-+# Core Netfilter Configuration
-+#
-+CONFIG_NETFILTER_NETLINK=m
-+CONFIG_NETFILTER_NETLINK_QUEUE=m
-+CONFIG_NETFILTER_NETLINK_LOG=m
-+# CONFIG_NF_CONNTRACK is not set
-+# CONFIG_NETFILTER_TPROXY is not set
-+CONFIG_NETFILTER_XTABLES=m
-+CONFIG_NETFILTER_XT_TARGET_CLASSIFY=m
-+# CONFIG_NETFILTER_XT_TARGET_DSCP is not set
-+CONFIG_NETFILTER_XT_TARGET_HL=m
-+# CONFIG_NETFILTER_XT_TARGET_LED is not set
-+CONFIG_NETFILTER_XT_TARGET_MARK=m
-+# CONFIG_NETFILTER_XT_TARGET_NFLOG is not set
-+CONFIG_NETFILTER_XT_TARGET_NFQUEUE=m
-+# CONFIG_NETFILTER_XT_TARGET_RATEEST is not set
-+# CONFIG_NETFILTER_XT_TARGET_TRACE is not set
-+CONFIG_NETFILTER_XT_TARGET_SECMARK=m
-+# CONFIG_NETFILTER_XT_TARGET_TCPMSS is not set
-+# CONFIG_NETFILTER_XT_TARGET_TCPOPTSTRIP is not set
-+CONFIG_NETFILTER_XT_MATCH_COMMENT=m
-+CONFIG_NETFILTER_XT_MATCH_DCCP=m
-+# CONFIG_NETFILTER_XT_MATCH_DSCP is not set
-+CONFIG_NETFILTER_XT_MATCH_ESP=m
-+# CONFIG_NETFILTER_XT_MATCH_HASHLIMIT is not set
-+CONFIG_NETFILTER_XT_MATCH_HL=m
-+# CONFIG_NETFILTER_XT_MATCH_IPRANGE is not set
-+CONFIG_NETFILTER_XT_MATCH_LENGTH=m
-+CONFIG_NETFILTER_XT_MATCH_LIMIT=m
-+CONFIG_NETFILTER_XT_MATCH_MAC=m
-+CONFIG_NETFILTER_XT_MATCH_MARK=m
-+CONFIG_NETFILTER_XT_MATCH_MULTIPORT=m
-+# CONFIG_NETFILTER_XT_MATCH_OWNER is not set
-+CONFIG_NETFILTER_XT_MATCH_POLICY=m
-+CONFIG_NETFILTER_XT_MATCH_PHYSDEV=m
-+CONFIG_NETFILTER_XT_MATCH_PKTTYPE=m
-+CONFIG_NETFILTER_XT_MATCH_QUOTA=m
-+# CONFIG_NETFILTER_XT_MATCH_RATEEST is not set
-+CONFIG_NETFILTER_XT_MATCH_REALM=m
-+# CONFIG_NETFILTER_XT_MATCH_RECENT is not set
-+CONFIG_NETFILTER_XT_MATCH_SCTP=m
-+CONFIG_NETFILTER_XT_MATCH_STATISTIC=m
-+CONFIG_NETFILTER_XT_MATCH_STRING=m
-+CONFIG_NETFILTER_XT_MATCH_TCPMSS=m
-+# CONFIG_NETFILTER_XT_MATCH_TIME is not set
-+# CONFIG_NETFILTER_XT_MATCH_U32 is not set
-+# CONFIG_NETFILTER_XT_MATCH_OSF is not set
-+CONFIG_IP_VS=m
-+# CONFIG_IP_VS_IPV6 is not set
-+# CONFIG_IP_VS_DEBUG is not set
-+CONFIG_IP_VS_TAB_BITS=12
-+
-+#
-+# IPVS transport protocol load balancing support
-+#
-+CONFIG_IP_VS_PROTO_TCP=y
-+CONFIG_IP_VS_PROTO_UDP=y
-+CONFIG_IP_VS_PROTO_AH_ESP=y
-+CONFIG_IP_VS_PROTO_ESP=y
-+CONFIG_IP_VS_PROTO_AH=y
-+
-+#
-+# IPVS scheduler
-+#
-+CONFIG_IP_VS_RR=m
-+CONFIG_IP_VS_WRR=m
-+CONFIG_IP_VS_LC=m
-+CONFIG_IP_VS_WLC=m
-+CONFIG_IP_VS_LBLC=m
-+CONFIG_IP_VS_LBLCR=m
-+CONFIG_IP_VS_DH=m
-+CONFIG_IP_VS_SH=m
-+CONFIG_IP_VS_SED=m
-+CONFIG_IP_VS_NQ=m
-+
-+#
-+# IPVS application helper
-+#
-+CONFIG_IP_VS_FTP=m
-+
-+#
-+# IP: Netfilter Configuration
-+#
-+# CONFIG_NF_DEFRAG_IPV4 is not set
-+CONFIG_IP_NF_QUEUE=m
-+CONFIG_IP_NF_IPTABLES=m
-+CONFIG_IP_NF_MATCH_ADDRTYPE=m
-+CONFIG_IP_NF_MATCH_AH=m
-+CONFIG_IP_NF_MATCH_ECN=m
-+CONFIG_IP_NF_MATCH_TTL=m
-+CONFIG_IP_NF_FILTER=m
-+CONFIG_IP_NF_TARGET_REJECT=m
-+CONFIG_IP_NF_TARGET_LOG=m
-+CONFIG_IP_NF_TARGET_ULOG=m
-+CONFIG_IP_NF_MANGLE=m
-+CONFIG_IP_NF_TARGET_ECN=m
-+CONFIG_IP_NF_TARGET_TTL=m
-+CONFIG_IP_NF_RAW=m
-+# CONFIG_IP_NF_SECURITY is not set
-+CONFIG_IP_NF_ARPTABLES=m
-+CONFIG_IP_NF_ARPFILTER=m
-+CONFIG_IP_NF_ARP_MANGLE=m
-+
-+#
-+# IPv6: Netfilter Configuration
-+#
-+CONFIG_IP6_NF_QUEUE=m
-+CONFIG_IP6_NF_IPTABLES=m
-+CONFIG_IP6_NF_MATCH_AH=m
-+CONFIG_IP6_NF_MATCH_EUI64=m
-+CONFIG_IP6_NF_MATCH_FRAG=m
-+CONFIG_IP6_NF_MATCH_OPTS=m
-+CONFIG_IP6_NF_MATCH_HL=m
-+CONFIG_IP6_NF_MATCH_IPV6HEADER=m
-+# CONFIG_IP6_NF_MATCH_MH is not set
-+CONFIG_IP6_NF_MATCH_RT=m
-+CONFIG_IP6_NF_TARGET_HL=m
-+CONFIG_IP6_NF_TARGET_LOG=m
-+CONFIG_IP6_NF_FILTER=m
-+CONFIG_IP6_NF_TARGET_REJECT=m
-+CONFIG_IP6_NF_MANGLE=m
-+CONFIG_IP6_NF_RAW=m
-+# CONFIG_IP6_NF_SECURITY is not set
-+
-+#
-+# DECnet: Netfilter Configuration
-+#
-+CONFIG_DECNET_NF_GRABULATOR=m
-+CONFIG_BRIDGE_NF_EBTABLES=m
-+CONFIG_BRIDGE_EBT_BROUTE=m
-+CONFIG_BRIDGE_EBT_T_FILTER=m
-+CONFIG_BRIDGE_EBT_T_NAT=m
-+CONFIG_BRIDGE_EBT_802_3=m
-+CONFIG_BRIDGE_EBT_AMONG=m
-+CONFIG_BRIDGE_EBT_ARP=m
-+CONFIG_BRIDGE_EBT_IP=m
-+# CONFIG_BRIDGE_EBT_IP6 is not set
-+CONFIG_BRIDGE_EBT_LIMIT=m
-+CONFIG_BRIDGE_EBT_MARK=m
-+CONFIG_BRIDGE_EBT_PKTTYPE=m
-+CONFIG_BRIDGE_EBT_STP=m
-+CONFIG_BRIDGE_EBT_VLAN=m
-+CONFIG_BRIDGE_EBT_ARPREPLY=m
-+CONFIG_BRIDGE_EBT_DNAT=m
-+CONFIG_BRIDGE_EBT_MARK_T=m
-+CONFIG_BRIDGE_EBT_REDIRECT=m
-+CONFIG_BRIDGE_EBT_SNAT=m
-+CONFIG_BRIDGE_EBT_LOG=m
-+CONFIG_BRIDGE_EBT_ULOG=m
-+# CONFIG_BRIDGE_EBT_NFLOG is not set
-+CONFIG_IP_DCCP=m
-+CONFIG_INET_DCCP_DIAG=m
-+
-+#
-+# DCCP CCIDs Configuration (EXPERIMENTAL)
-+#
-+# CONFIG_IP_DCCP_CCID2_DEBUG is not set
-+CONFIG_IP_DCCP_CCID3=y
-+# CONFIG_IP_DCCP_CCID3_DEBUG is not set
-+CONFIG_IP_DCCP_CCID3_RTO=100
-+CONFIG_IP_DCCP_TFRC_LIB=y
-+CONFIG_IP_SCTP=m
-+# CONFIG_SCTP_DBG_MSG is not set
-+# CONFIG_SCTP_DBG_OBJCNT is not set
-+# CONFIG_SCTP_HMAC_NONE is not set
-+# CONFIG_SCTP_HMAC_SHA1 is not set
-+CONFIG_SCTP_HMAC_MD5=y
-+CONFIG_TIPC=m
-+CONFIG_TIPC_ADVANCED=y
-+CONFIG_TIPC_ZONES=3
-+CONFIG_TIPC_CLUSTERS=1
-+CONFIG_TIPC_NODES=255
-+CONFIG_TIPC_SLAVE_NODES=0
-+CONFIG_TIPC_PORTS=8191
-+CONFIG_TIPC_LOG=0
-+# CONFIG_TIPC_DEBUG is not set
-+CONFIG_ATM=y
-+CONFIG_ATM_CLIP=y
-+# CONFIG_ATM_CLIP_NO_ICMP is not set
-+CONFIG_ATM_LANE=m
-+CONFIG_ATM_MPOA=m
-+CONFIG_ATM_BR2684=m
-+# CONFIG_ATM_BR2684_IPFILTER is not set
-+CONFIG_STP=m
-+CONFIG_BRIDGE=m
-+# CONFIG_NET_DSA is not set
-+CONFIG_VLAN_8021Q=m
-+# CONFIG_VLAN_8021Q_GVRP is not set
-+CONFIG_DECNET=m
-+# CONFIG_DECNET_ROUTER is not set
-+CONFIG_LLC=m
-+CONFIG_LLC2=m
-+CONFIG_IPX=m
-+# CONFIG_IPX_INTERN is not set
-+CONFIG_ATALK=m
-+CONFIG_DEV_APPLETALK=m
-+# CONFIG_COPS is not set
-+CONFIG_IPDDP=m
-+CONFIG_IPDDP_ENCAP=y
-+CONFIG_IPDDP_DECAP=y
-+CONFIG_X25=m
-+CONFIG_LAPB=m
-+CONFIG_ECONET=m
-+CONFIG_ECONET_AUNUDP=y
-+CONFIG_ECONET_NATIVE=y
-+CONFIG_WAN_ROUTER=m
-+# CONFIG_PHONET is not set
-+# CONFIG_IEEE802154 is not set
-+CONFIG_NET_SCHED=y
-+
-+#
-+# Queueing/Scheduling
-+#
-+CONFIG_NET_SCH_CBQ=m
-+CONFIG_NET_SCH_HTB=m
-+CONFIG_NET_SCH_HFSC=m
-+CONFIG_NET_SCH_ATM=m
-+CONFIG_NET_SCH_PRIO=m
-+# CONFIG_NET_SCH_MULTIQ is not set
-+CONFIG_NET_SCH_RED=m
-+CONFIG_NET_SCH_SFQ=m
-+CONFIG_NET_SCH_TEQL=m
-+CONFIG_NET_SCH_TBF=m
-+CONFIG_NET_SCH_GRED=m
-+CONFIG_NET_SCH_DSMARK=m
-+CONFIG_NET_SCH_NETEM=m
-+# CONFIG_NET_SCH_DRR is not set
-+CONFIG_NET_SCH_INGRESS=m
-+
-+#
-+# Classification
-+#
-+CONFIG_NET_CLS=y
-+CONFIG_NET_CLS_BASIC=m
-+CONFIG_NET_CLS_TCINDEX=m
-+CONFIG_NET_CLS_ROUTE4=m
-+CONFIG_NET_CLS_ROUTE=y
-+CONFIG_NET_CLS_FW=m
-+CONFIG_NET_CLS_U32=m
-+CONFIG_CLS_U32_PERF=y
-+CONFIG_CLS_U32_MARK=y
-+CONFIG_NET_CLS_RSVP=m
-+CONFIG_NET_CLS_RSVP6=m
-+# CONFIG_NET_CLS_FLOW is not set
-+CONFIG_NET_EMATCH=y
-+CONFIG_NET_EMATCH_STACK=32
-+CONFIG_NET_EMATCH_CMP=m
-+CONFIG_NET_EMATCH_NBYTE=m
-+CONFIG_NET_EMATCH_U32=m
-+CONFIG_NET_EMATCH_META=m
-+CONFIG_NET_EMATCH_TEXT=m
-+CONFIG_NET_CLS_ACT=y
-+CONFIG_NET_ACT_POLICE=m
-+CONFIG_NET_ACT_GACT=m
-+CONFIG_GACT_PROB=y
-+CONFIG_NET_ACT_MIRRED=m
-+CONFIG_NET_ACT_IPT=m
-+# CONFIG_NET_ACT_NAT is not set
-+CONFIG_NET_ACT_PEDIT=m
-+CONFIG_NET_ACT_SIMP=m
-+# CONFIG_NET_ACT_SKBEDIT is not set
-+CONFIG_NET_CLS_IND=y
-+CONFIG_NET_SCH_FIFO=y
-+# CONFIG_DCB is not set
-+
-+#
-+# Network testing
-+#
-+CONFIG_NET_PKTGEN=m
-+# CONFIG_NET_DROP_MONITOR is not set
-+CONFIG_HAMRADIO=y
-+
-+#
-+# Packet Radio protocols
-+#
-+CONFIG_AX25=m
-+# CONFIG_AX25_DAMA_SLAVE is not set
-+CONFIG_NETROM=m
-+CONFIG_ROSE=m
-+
-+#
-+# AX.25 network device drivers
-+#
-+CONFIG_MKISS=m
-+CONFIG_6PACK=m
-+CONFIG_BPQETHER=m
-+CONFIG_BAYCOM_SER_FDX=m
-+CONFIG_BAYCOM_SER_HDX=m
-+CONFIG_YAM=m
-+# CONFIG_CAN is not set
-+CONFIG_IRDA=m
-+
-+#
-+# IrDA protocols
-+#
-+CONFIG_IRLAN=m
-+CONFIG_IRNET=m
-+CONFIG_IRCOMM=m
-+# CONFIG_IRDA_ULTRA is not set
-+
-+#
-+# IrDA options
-+#
-+CONFIG_IRDA_CACHE_LAST_LSAP=y
-+CONFIG_IRDA_FAST_RR=y
-+CONFIG_IRDA_DEBUG=y
-+
-+#
-+# Infrared-port device drivers
-+#
-+
-+#
-+# SIR device drivers
-+#
-+CONFIG_IRTTY_SIR=m
-+
-+#
-+# Dongle support
-+#
-+CONFIG_DONGLE=y
-+CONFIG_ESI_DONGLE=m
-+CONFIG_ACTISYS_DONGLE=m
-+CONFIG_TEKRAM_DONGLE=m
-+CONFIG_TOIM3232_DONGLE=m
-+CONFIG_LITELINK_DONGLE=m
-+CONFIG_MA600_DONGLE=m
-+CONFIG_GIRBIL_DONGLE=m
-+CONFIG_MCP2120_DONGLE=m
-+CONFIG_OLD_BELKIN_DONGLE=m
-+CONFIG_ACT200L_DONGLE=m
-+# CONFIG_KINGSUN_DONGLE is not set
-+# CONFIG_KSDAZZLE_DONGLE is not set
-+# CONFIG_KS959_DONGLE is not set
-+
-+#
-+# FIR device drivers
-+#
-+CONFIG_USB_IRDA=m
-+CONFIG_SIGMATEL_FIR=m
-+CONFIG_VLSI_FIR=m
-+CONFIG_MCS_FIR=m
-+CONFIG_BT=m
-+CONFIG_BT_L2CAP=m
-+CONFIG_BT_SCO=m
-+CONFIG_BT_RFCOMM=m
-+CONFIG_BT_RFCOMM_TTY=y
-+CONFIG_BT_BNEP=m
-+CONFIG_BT_BNEP_MC_FILTER=y
-+CONFIG_BT_BNEP_PROTO_FILTER=y
-+CONFIG_BT_HIDP=m
-+
-+#
-+# Bluetooth device drivers
-+#
-+# CONFIG_BT_HCIBTUSB is not set
-+# CONFIG_BT_HCIBTSDIO is not set
-+CONFIG_BT_HCIUART=m
-+CONFIG_BT_HCIUART_H4=y
-+CONFIG_BT_HCIUART_BCSP=y
-+# CONFIG_BT_HCIUART_LL is not set
-+CONFIG_BT_HCIBCM203X=m
-+CONFIG_BT_HCIBPA10X=m
-+CONFIG_BT_HCIBFUSB=m
-+CONFIG_BT_HCIVHCI=m
-+CONFIG_AF_RXRPC=m
-+# CONFIG_AF_RXRPC_DEBUG is not set
-+# CONFIG_RXKAD is not set
-+CONFIG_FIB_RULES=y
-+CONFIG_WIRELESS=y
-+CONFIG_CFG80211=y
-+# CONFIG_CFG80211_REG_DEBUG is not set
-+# CONFIG_CFG80211_DEBUGFS is not set
-+CONFIG_WIRELESS_OLD_REGULATORY=y
-+CONFIG_WIRELESS_EXT=y
-+CONFIG_WIRELESS_EXT_SYSFS=y
-+# CONFIG_LIB80211 is not set
-+CONFIG_MAC80211=y
-+CONFIG_MAC80211_DEFAULT_PS=y
-+CONFIG_MAC80211_DEFAULT_PS_VALUE=1
-+
-+#
-+# Rate control algorithm selection
-+#
-+CONFIG_MAC80211_RC_PID=y
-+CONFIG_MAC80211_RC_MINSTREL=y
-+# CONFIG_MAC80211_RC_DEFAULT_PID is not set
-+CONFIG_MAC80211_RC_DEFAULT_MINSTREL=y
-+CONFIG_MAC80211_RC_DEFAULT="minstrel"
-+# CONFIG_MAC80211_MESH is not set
-+# CONFIG_MAC80211_LEDS is not set
-+# CONFIG_MAC80211_DEBUGFS is not set
-+# CONFIG_MAC80211_DEBUG_MENU is not set
-+# CONFIG_WIMAX is not set
-+# CONFIG_RFKILL is not set
-+# CONFIG_NET_9P is not set
-+
-+#
-+# Device Drivers
-+#
-+
-+#
-+# Generic Driver Options
-+#
-+CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
-+CONFIG_STANDALONE=y
-+CONFIG_PREVENT_FIRMWARE_BUILD=y
-+CONFIG_FW_LOADER=m
-+CONFIG_FIRMWARE_IN_KERNEL=y
-+CONFIG_EXTRA_FIRMWARE=""
-+# CONFIG_SYS_HYPERVISOR is not set
-+CONFIG_CONNECTOR=m
-+CONFIG_MTD=m
-+# CONFIG_MTD_DEBUG is not set
-+CONFIG_MTD_CONCAT=m
-+CONFIG_MTD_PARTITIONS=y
-+# CONFIG_MTD_TESTS is not set
-+# CONFIG_MTD_REDBOOT_PARTS is not set
-+# CONFIG_MTD_AR7_PARTS is not set
-+
-+#
-+# User Modules And Translation Layers
-+#
-+CONFIG_MTD_CHAR=m
-+CONFIG_MTD_BLKDEVS=m
-+CONFIG_MTD_BLOCK=m
-+# CONFIG_MTD_BLOCK_RO is not set
-+# CONFIG_FTL is not set
-+# CONFIG_NFTL is not set
-+# CONFIG_INFTL is not set
-+# CONFIG_RFD_FTL is not set
-+# CONFIG_SSFDC is not set
-+# CONFIG_MTD_OOPS is not set
-+
-+#
-+# RAM/ROM/Flash chip drivers
-+#
-+CONFIG_MTD_CFI=m
-+CONFIG_MTD_JEDECPROBE=m
-+CONFIG_MTD_GEN_PROBE=m
-+# CONFIG_MTD_CFI_ADV_OPTIONS is not set
-+CONFIG_MTD_MAP_BANK_WIDTH_1=y
-+CONFIG_MTD_MAP_BANK_WIDTH_2=y
-+CONFIG_MTD_MAP_BANK_WIDTH_4=y
-+# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set
-+# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set
-+# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set
-+CONFIG_MTD_CFI_I1=y
-+CONFIG_MTD_CFI_I2=y
-+# CONFIG_MTD_CFI_I4 is not set
-+# CONFIG_MTD_CFI_I8 is not set
-+CONFIG_MTD_CFI_INTELEXT=m
-+CONFIG_MTD_CFI_AMDSTD=m
-+CONFIG_MTD_CFI_STAA=m
-+CONFIG_MTD_CFI_UTIL=m
-+CONFIG_MTD_RAM=m
-+CONFIG_MTD_ROM=m
-+CONFIG_MTD_ABSENT=m
-+
-+#
-+# Mapping drivers for chip access
-+#
-+CONFIG_MTD_COMPLEX_MAPPINGS=y
-+CONFIG_MTD_PHYSMAP=m
-+CONFIG_MTD_PHYSMAP_COMPAT=y
-+CONFIG_MTD_PHYSMAP_START=0x8000000
-+CONFIG_MTD_PHYSMAP_LEN=0
-+CONFIG_MTD_PHYSMAP_BANKWIDTH=2
-+CONFIG_MTD_PCI=m
-+# CONFIG_MTD_INTEL_VR_NOR is not set
-+CONFIG_MTD_PLATRAM=m
-+
-+#
-+# Self-contained MTD device drivers
-+#
-+CONFIG_MTD_PMC551=m
-+# CONFIG_MTD_PMC551_BUGFIX is not set
-+# CONFIG_MTD_PMC551_DEBUG is not set
-+CONFIG_MTD_DATAFLASH=m
-+# CONFIG_MTD_DATAFLASH_WRITE_VERIFY is not set
-+# CONFIG_MTD_DATAFLASH_OTP is not set
-+CONFIG_MTD_M25P80=m
-+CONFIG_M25PXX_USE_FAST_READ=y
-+CONFIG_MTD_SLRAM=m
-+CONFIG_MTD_PHRAM=m
-+CONFIG_MTD_MTDRAM=m
-+CONFIG_MTDRAM_TOTAL_SIZE=4096
-+CONFIG_MTDRAM_ERASE_SIZE=128
-+CONFIG_MTD_BLOCK2MTD=m
-+
-+#
-+# Disk-On-Chip Device Drivers
-+#
-+CONFIG_MTD_DOC2000=m
-+CONFIG_MTD_DOC2001=m
-+CONFIG_MTD_DOC2001PLUS=m
-+CONFIG_MTD_DOCPROBE=m
-+CONFIG_MTD_DOCECC=m
-+# CONFIG_MTD_DOCPROBE_ADVANCED is not set
-+CONFIG_MTD_DOCPROBE_ADDRESS=0
-+# CONFIG_MTD_NAND is not set
-+CONFIG_MTD_NAND_IDS=m
-+# CONFIG_MTD_ONENAND is not set
-+
-+#
-+# LPDDR flash memory drivers
-+#
-+# CONFIG_MTD_LPDDR is not set
-+
-+#
-+# UBI - Unsorted block images
-+#
-+# CONFIG_MTD_UBI is not set
-+# CONFIG_PARPORT is not set
-+CONFIG_PNP=y
-+CONFIG_PNP_DEBUG_MESSAGES=y
-+
-+#
-+# Protocols
-+#
-+CONFIG_ISAPNP=y
-+# CONFIG_PNPACPI is not set
-+CONFIG_BLK_DEV=y
-+# CONFIG_BLK_CPQ_DA is not set
-+# CONFIG_BLK_CPQ_CISS_DA is not set
-+# CONFIG_BLK_DEV_DAC960 is not set
-+# CONFIG_BLK_DEV_UMEM is not set
-+# CONFIG_BLK_DEV_COW_COMMON is not set
-+CONFIG_BLK_DEV_LOOP=y
-+CONFIG_BLK_DEV_CRYPTOLOOP=m
-+CONFIG_BLK_DEV_NBD=m
-+# CONFIG_BLK_DEV_SX8 is not set
-+# CONFIG_BLK_DEV_UB is not set
-+CONFIG_BLK_DEV_RAM=y
-+CONFIG_BLK_DEV_RAM_COUNT=16
-+CONFIG_BLK_DEV_RAM_SIZE=8192
-+# CONFIG_BLK_DEV_XIP is not set
-+CONFIG_CDROM_PKTCDVD=m
-+CONFIG_CDROM_PKTCDVD_BUFFERS=8
-+# CONFIG_CDROM_PKTCDVD_WCACHE is not set
-+CONFIG_ATA_OVER_ETH=m
-+# CONFIG_BLK_DEV_HD is not set
-+CONFIG_MISC_DEVICES=y
-+# CONFIG_PHANTOM is not set
-+# CONFIG_SGI_IOC4 is not set
-+# CONFIG_TIFM_CORE is not set
-+# CONFIG_ICS932S401 is not set
-+# CONFIG_ENCLOSURE_SERVICES is not set
-+# CONFIG_HP_ILO is not set
-+# CONFIG_ISL29003 is not set
-+# CONFIG_C2PORT is not set
-+
-+#
-+# EEPROM support
-+#
-+# CONFIG_EEPROM_AT24 is not set
-+# CONFIG_EEPROM_AT25 is not set
-+# CONFIG_EEPROM_LEGACY is not set
-+# CONFIG_EEPROM_MAX6875 is not set
-+CONFIG_EEPROM_93CX6=y
-+# CONFIG_CB710_CORE is not set
-+CONFIG_HAVE_IDE=y
-+CONFIG_IDE=y
-+
-+#
-+# Please see Documentation/ide/ide.txt for help/info on IDE drives
-+#
-+CONFIG_IDE_XFER_MODE=y
-+CONFIG_IDE_TIMINGS=y
-+CONFIG_IDE_ATAPI=y
-+# CONFIG_BLK_DEV_IDE_SATA is not set
-+CONFIG_IDE_GD=y
-+CONFIG_IDE_GD_ATA=y
-+# CONFIG_IDE_GD_ATAPI is not set
-+CONFIG_BLK_DEV_IDECD=m
-+CONFIG_BLK_DEV_IDECD_VERBOSE_ERRORS=y
-+# CONFIG_BLK_DEV_IDETAPE is not set
-+CONFIG_IDE_TASK_IOCTL=y
-+CONFIG_IDE_PROC_FS=y
-+
-+#
-+# IDE chipset support/bugfixes
-+#
-+# CONFIG_IDE_GENERIC is not set
-+# CONFIG_BLK_DEV_PLATFORM is not set
-+# CONFIG_BLK_DEV_IDEPNP is not set
-+CONFIG_BLK_DEV_IDEDMA_SFF=y
-+
-+#
-+# PCI IDE chipsets support
-+#
-+CONFIG_BLK_DEV_IDEPCI=y
-+# CONFIG_IDEPCI_PCIBUS_ORDER is not set
-+# CONFIG_BLK_DEV_OFFBOARD is not set
-+CONFIG_BLK_DEV_GENERIC=y
-+# CONFIG_BLK_DEV_OPTI621 is not set
-+CONFIG_BLK_DEV_IDEDMA_PCI=y
-+# CONFIG_BLK_DEV_AEC62XX is not set
-+# CONFIG_BLK_DEV_ALI15X3 is not set
-+CONFIG_BLK_DEV_AMD74XX=y
-+# CONFIG_BLK_DEV_CMD64X is not set
-+# CONFIG_BLK_DEV_TRIFLEX is not set
-+# CONFIG_BLK_DEV_CS5520 is not set
-+# CONFIG_BLK_DEV_CS5530 is not set
-+# CONFIG_BLK_DEV_HPT366 is not set
-+# CONFIG_BLK_DEV_JMICRON is not set
-+# CONFIG_BLK_DEV_SC1200 is not set
-+# CONFIG_BLK_DEV_PIIX is not set
-+# CONFIG_BLK_DEV_IT8172 is not set
-+# CONFIG_BLK_DEV_IT8213 is not set
-+# CONFIG_BLK_DEV_IT821X is not set
-+# CONFIG_BLK_DEV_NS87415 is not set
-+# CONFIG_BLK_DEV_PDC202XX_OLD is not set
-+# CONFIG_BLK_DEV_PDC202XX_NEW is not set
-+# CONFIG_BLK_DEV_SVWKS is not set
-+# CONFIG_BLK_DEV_SIIMAGE is not set
-+# CONFIG_BLK_DEV_SLC90E66 is not set
-+# CONFIG_BLK_DEV_TRM290 is not set
-+# CONFIG_BLK_DEV_VIA82CXXX is not set
-+# CONFIG_BLK_DEV_TC86C001 is not set
-+
-+#
-+# Other IDE chipsets support
-+#
-+
-+#
-+# Note: most of these also require special kernel boot parameters
-+#
-+# CONFIG_BLK_DEV_4DRIVES is not set
-+# CONFIG_BLK_DEV_ALI14XX is not set
-+# CONFIG_BLK_DEV_DTC2278 is not set
-+# CONFIG_BLK_DEV_HT6560B is not set
-+# CONFIG_BLK_DEV_QD65XX is not set
-+# CONFIG_BLK_DEV_UMC8672 is not set
-+CONFIG_BLK_DEV_IDEDMA=y
-+
-+#
-+# SCSI device support
-+#
-+CONFIG_RAID_ATTRS=m
-+CONFIG_SCSI=y
-+CONFIG_SCSI_DMA=y
-+# CONFIG_SCSI_TGT is not set
-+CONFIG_SCSI_NETLINK=y
-+CONFIG_SCSI_PROC_FS=y
-+
-+#
-+# SCSI support type (disk, tape, CD-ROM)
-+#
-+CONFIG_BLK_DEV_SD=y
-+# CONFIG_CHR_DEV_ST is not set
-+# CONFIG_CHR_DEV_OSST is not set
-+CONFIG_BLK_DEV_SR=m
-+CONFIG_BLK_DEV_SR_VENDOR=y
-+CONFIG_CHR_DEV_SG=m
-+# CONFIG_CHR_DEV_SCH is not set
-+CONFIG_SCSI_MULTI_LUN=y
-+CONFIG_SCSI_CONSTANTS=y
-+CONFIG_SCSI_LOGGING=y
-+# CONFIG_SCSI_SCAN_ASYNC is not set
-+CONFIG_SCSI_WAIT_SCAN=m
-+
-+#
-+# SCSI Transports
-+#
-+CONFIG_SCSI_SPI_ATTRS=m
-+CONFIG_SCSI_FC_ATTRS=m
-+CONFIG_SCSI_ISCSI_ATTRS=m
-+# CONFIG_SCSI_SAS_LIBSAS is not set
-+CONFIG_SCSI_SRP_ATTRS=m
-+# CONFIG_SCSI_LOWLEVEL is not set
-+# CONFIG_SCSI_DH is not set
-+# CONFIG_SCSI_OSD_INITIATOR is not set
-+# CONFIG_ATA is not set
-+CONFIG_MD=y
-+CONFIG_BLK_DEV_MD=m
-+CONFIG_MD_LINEAR=m
-+CONFIG_MD_RAID0=m
-+CONFIG_MD_RAID1=m
-+CONFIG_MD_RAID10=m
-+CONFIG_MD_RAID456=m
-+CONFIG_MD_RAID6_PQ=m
-+CONFIG_MD_MULTIPATH=m
-+CONFIG_MD_FAULTY=m
-+CONFIG_BLK_DEV_DM=m
-+# CONFIG_DM_DEBUG is not set
-+CONFIG_DM_CRYPT=m
-+CONFIG_DM_SNAPSHOT=m
-+CONFIG_DM_MIRROR=m
-+# CONFIG_DM_LOG_USERSPACE is not set
-+CONFIG_DM_ZERO=m
-+CONFIG_DM_MULTIPATH=m
-+# CONFIG_DM_MULTIPATH_QL is not set
-+# CONFIG_DM_MULTIPATH_ST is not set
-+# CONFIG_DM_DELAY is not set
-+# CONFIG_DM_UEVENT is not set
-+# CONFIG_FUSION is not set
-+
-+#
-+# IEEE 1394 (FireWire) support
-+#
-+
-+#
-+# You can enable one or both FireWire driver stacks.
-+#
-+
-+#
-+# See the help texts for more information.
-+#
-+# CONFIG_FIREWIRE is not set
-+# CONFIG_IEEE1394 is not set
-+# CONFIG_I2O is not set
-+CONFIG_NETDEVICES=y
-+CONFIG_IFB=m
-+CONFIG_DUMMY=m
-+# CONFIG_BONDING is not set
-+CONFIG_MACVLAN=m
-+# CONFIG_EQUALIZER is not set
-+CONFIG_TUN=m
-+CONFIG_VETH=m
-+# CONFIG_NET_SB1000 is not set
-+# CONFIG_ARCNET is not set
-+CONFIG_PHYLIB=m
-+
-+#
-+# MII PHY device drivers
-+#
-+CONFIG_MARVELL_PHY=m
-+CONFIG_DAVICOM_PHY=m
-+CONFIG_QSEMI_PHY=m
-+CONFIG_LXT_PHY=m
-+CONFIG_CICADA_PHY=m
-+CONFIG_VITESSE_PHY=m
-+CONFIG_SMSC_PHY=m
-+# CONFIG_BROADCOM_PHY is not set
-+# CONFIG_ICPLUS_PHY is not set
-+CONFIG_REALTEK_PHY=m
-+# CONFIG_NATIONAL_PHY is not set
-+# CONFIG_STE10XP is not set
-+# CONFIG_LSI_ET1011C_PHY is not set
-+# CONFIG_MDIO_BITBANG is not set
-+CONFIG_NET_ETHERNET=y
-+CONFIG_MII=y
-+# CONFIG_AX88796 is not set
-+# CONFIG_HAPPYMEAL is not set
-+# CONFIG_SUNGEM is not set
-+# CONFIG_CASSINI is not set
-+# CONFIG_NET_VENDOR_3COM is not set
-+# CONFIG_NET_VENDOR_SMC is not set
-+# CONFIG_SMC91X is not set
-+# CONFIG_DM9000 is not set
-+# CONFIG_ENC28J60 is not set
-+# CONFIG_ETHOC is not set
-+# CONFIG_NET_VENDOR_RACAL is not set
-+# CONFIG_DNET is not set
-+# CONFIG_NET_TULIP is not set
-+# CONFIG_AT1700 is not set
-+# CONFIG_DEPCA is not set
-+# CONFIG_HP100 is not set
-+# CONFIG_NET_ISA is not set
-+# CONFIG_IBM_NEW_EMAC_ZMII is not set
-+# CONFIG_IBM_NEW_EMAC_RGMII is not set
-+# CONFIG_IBM_NEW_EMAC_TAH is not set
-+# CONFIG_IBM_NEW_EMAC_EMAC4 is not set
-+# CONFIG_IBM_NEW_EMAC_NO_FLOW_CTRL is not set
-+# CONFIG_IBM_NEW_EMAC_MAL_CLR_ICINTSTAT is not set
-+# CONFIG_IBM_NEW_EMAC_MAL_COMMON_ERR is not set
-+CONFIG_NET_PCI=y
-+# CONFIG_PCNET32 is not set
-+# CONFIG_AMD8111_ETH is not set
-+# CONFIG_ADAPTEC_STARFIRE is not set
-+# CONFIG_AC3200 is not set
-+# CONFIG_APRICOT is not set
-+# CONFIG_B44 is not set
-+# CONFIG_FORCEDETH is not set
-+# CONFIG_CS89x0 is not set
-+# CONFIG_TC35815 is not set
-+# CONFIG_E100 is not set
-+# CONFIG_FEALNX is not set
-+# CONFIG_NATSEMI is not set
-+# CONFIG_NE2K_PCI is not set
-+CONFIG_8139CP=m
-+CONFIG_8139TOO=y
-+# CONFIG_8139TOO_PIO is not set
-+CONFIG_8139TOO_TUNE_TWISTER=y
-+# CONFIG_8139TOO_8129 is not set
-+# CONFIG_8139_OLD_RX_RESET is not set
-+# CONFIG_R6040 is not set
-+# CONFIG_SIS900 is not set
-+# CONFIG_EPIC100 is not set
-+# CONFIG_SMSC9420 is not set
-+# CONFIG_SUNDANCE is not set
-+# CONFIG_TLAN is not set
-+# CONFIG_KS8842 is not set
-+# CONFIG_VIA_RHINE is not set
-+# CONFIG_SC92031 is not set
-+# CONFIG_ATL2 is not set
-+# CONFIG_NETDEV_1000 is not set
-+# CONFIG_NETDEV_10000 is not set
-+# CONFIG_TR is not set
-+
-+#
-+# Wireless LAN
-+#
-+# CONFIG_WLAN_PRE80211 is not set
-+CONFIG_WLAN_80211=y
-+# CONFIG_LIBERTAS is not set
-+# CONFIG_LIBERTAS_THINFIRM is not set
-+# CONFIG_ATMEL is not set
-+# CONFIG_AT76C50X_USB is not set
-+# CONFIG_PRISM54 is not set
-+# CONFIG_USB_ZD1201 is not set
-+# CONFIG_USB_NET_RNDIS_WLAN is not set
-+# CONFIG_RTL8180 is not set
-+CONFIG_RTL8187B=y
-+# CONFIG_ADM8211 is not set
-+# CONFIG_MAC80211_HWSIM is not set
-+# CONFIG_MWL8K is not set
-+# CONFIG_P54_COMMON is not set
-+# CONFIG_ATH5K is not set
-+# CONFIG_ATH9K is not set
-+# CONFIG_AR9170_USB is not set
-+# CONFIG_IPW2100 is not set
-+# CONFIG_IPW2200 is not set
-+# CONFIG_IWLWIFI is not set
-+# CONFIG_HOSTAP is not set
-+# CONFIG_B43 is not set
-+# CONFIG_B43LEGACY is not set
-+# CONFIG_ZD1211RW is not set
-+# CONFIG_RT2X00 is not set
-+# CONFIG_HERMES is not set
-+# CONFIG_WL12XX is not set
-+# CONFIG_IWM is not set
-+
-+#
-+# Enable WiMAX (Networking options) to see the WiMAX drivers
-+#
-+
-+#
-+# USB Network Adapters
-+#
-+CONFIG_USB_CATC=m
-+CONFIG_USB_KAWETH=m
-+CONFIG_USB_PEGASUS=m
-+CONFIG_USB_RTL8150=m
-+CONFIG_USB_USBNET=m
-+CONFIG_USB_NET_AX8817X=m
-+CONFIG_USB_NET_CDCETHER=m
-+# CONFIG_USB_NET_CDC_EEM is not set
-+# CONFIG_USB_NET_DM9601 is not set
-+# CONFIG_USB_NET_SMSC95XX is not set
-+CONFIG_USB_NET_GL620A=m
-+CONFIG_USB_NET_NET1080=m
-+CONFIG_USB_NET_PLUSB=m
-+# CONFIG_USB_NET_MCS7830 is not set
-+CONFIG_USB_NET_RNDIS_HOST=m
-+CONFIG_USB_NET_CDC_SUBSET=m
-+CONFIG_USB_ALI_M5632=y
-+CONFIG_USB_AN2720=y
-+CONFIG_USB_BELKIN=y
-+CONFIG_USB_ARMLINUX=y
-+CONFIG_USB_EPSON2888=y
-+# CONFIG_USB_KC2190 is not set
-+CONFIG_USB_NET_ZAURUS=m
-+# CONFIG_USB_NET_INT51X1 is not set
-+# CONFIG_WAN is not set
-+# CONFIG_ATM_DRIVERS is not set
-+# CONFIG_FDDI is not set
-+# CONFIG_HIPPI is not set
-+CONFIG_PPP=m
-+CONFIG_PPP_MULTILINK=y
-+CONFIG_PPP_FILTER=y
-+CONFIG_PPP_ASYNC=m
-+CONFIG_PPP_SYNC_TTY=m
-+CONFIG_PPP_DEFLATE=m
-+CONFIG_PPP_BSDCOMP=m
-+CONFIG_PPP_MPPE=m
-+CONFIG_PPPOE=m
-+CONFIG_PPPOATM=m
-+# CONFIG_PPPOL2TP is not set
-+# CONFIG_SLIP is not set
-+CONFIG_SLHC=m
-+# CONFIG_NET_FC is not set
-+CONFIG_NETCONSOLE=y
-+# CONFIG_NETCONSOLE_DYNAMIC is not set
-+CONFIG_NETPOLL=y
-+# CONFIG_NETPOLL_TRAP is not set
-+CONFIG_NET_POLL_CONTROLLER=y
-+# CONFIG_ISDN is not set
-+# CONFIG_PHONE is not set
-+
-+#
-+# Input device support
-+#
-+CONFIG_INPUT=y
-+# CONFIG_INPUT_FF_MEMLESS is not set
-+# CONFIG_INPUT_POLLDEV is not set
-+
-+#
-+# Userland interfaces
-+#
-+CONFIG_INPUT_MOUSEDEV=y
-+CONFIG_INPUT_MOUSEDEV_PSAUX=y
-+CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024
-+CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
-+CONFIG_INPUT_JOYDEV=m
-+CONFIG_INPUT_EVDEV=m
-+# CONFIG_INPUT_EVBUG is not set
-+
-+#
-+# Input Device Drivers
-+#
-+CONFIG_INPUT_KEYBOARD=y
-+CONFIG_KEYBOARD_ATKBD=y
-+CONFIG_KEYBOARD_SUNKBD=m
-+CONFIG_KEYBOARD_LKKBD=m
-+CONFIG_KEYBOARD_XTKBD=m
-+CONFIG_KEYBOARD_NEWTON=m
-+# CONFIG_KEYBOARD_STOWAWAY is not set
-+# CONFIG_KEYBOARD_LM8323 is not set
-+CONFIG_INPUT_MOUSE=y
-+CONFIG_MOUSE_PS2=y
-+CONFIG_MOUSE_PS2_ALPS=y
-+CONFIG_MOUSE_PS2_LOGIPS2PP=y
-+CONFIG_MOUSE_PS2_SYNAPTICS=y
-+CONFIG_MOUSE_PS2_TRACKPOINT=y
-+# CONFIG_MOUSE_PS2_ELANTECH is not set
-+# CONFIG_MOUSE_PS2_TOUCHKIT is not set
-+CONFIG_MOUSE_SERIAL=m
-+# CONFIG_MOUSE_APPLETOUCH is not set
-+# CONFIG_MOUSE_BCM5974 is not set
-+CONFIG_MOUSE_INPORT=m
-+# CONFIG_MOUSE_ATIXL is not set
-+CONFIG_MOUSE_LOGIBM=m
-+CONFIG_MOUSE_PC110PAD=m
-+CONFIG_MOUSE_VSXXXAA=m
-+# CONFIG_MOUSE_SYNAPTICS_I2C is not set
-+# CONFIG_INPUT_JOYSTICK is not set
-+# CONFIG_INPUT_TABLET is not set
-+# CONFIG_INPUT_TOUCHSCREEN is not set
-+CONFIG_INPUT_MISC=y
-+CONFIG_INPUT_PCSPKR=m
-+# CONFIG_INPUT_ATI_REMOTE is not set
-+# CONFIG_INPUT_ATI_REMOTE2 is not set
-+# CONFIG_INPUT_KEYSPAN_REMOTE is not set
-+# CONFIG_INPUT_POWERMATE is not set
-+# CONFIG_INPUT_YEALINK is not set
-+# CONFIG_INPUT_CM109 is not set
-+CONFIG_INPUT_UINPUT=m
-+
-+#
-+# Hardware I/O ports
-+#
-+CONFIG_SERIO=y
-+CONFIG_SERIO_I8042=y
-+CONFIG_SERIO_SERPORT=m
-+CONFIG_SERIO_PCIPS2=m
-+CONFIG_SERIO_LIBPS2=y
-+CONFIG_SERIO_RAW=m
-+CONFIG_GAMEPORT=m
-+CONFIG_GAMEPORT_NS558=m
-+CONFIG_GAMEPORT_L4=m
-+CONFIG_GAMEPORT_EMU10K1=m
-+CONFIG_GAMEPORT_FM801=m
-+
-+#
-+# Character devices
-+#
-+CONFIG_VT=y
-+CONFIG_CONSOLE_TRANSLATIONS=y
-+CONFIG_VT_CONSOLE=y
-+CONFIG_HW_CONSOLE=y
-+# CONFIG_VT_HW_CONSOLE_BINDING is not set
-+CONFIG_DEVKMEM=y
-+CONFIG_SERIAL_NONSTANDARD=y
-+# CONFIG_COMPUTONE is not set
-+# CONFIG_ROCKETPORT is not set
-+# CONFIG_CYCLADES is not set
-+# CONFIG_DIGIEPCA is not set
-+# CONFIG_MOXA_INTELLIO is not set
-+# CONFIG_MOXA_SMARTIO is not set
-+# CONFIG_ISI is not set
-+# CONFIG_SYNCLINKMP is not set
-+# CONFIG_SYNCLINK_GT is not set
-+# CONFIG_N_HDLC is not set
-+# CONFIG_RISCOM8 is not set
-+# CONFIG_SPECIALIX is not set
-+# CONFIG_SX is not set
-+# CONFIG_RIO is not set
-+CONFIG_STALDRV=y
-+# CONFIG_STALLION is not set
-+# CONFIG_ISTALLION is not set
-+# CONFIG_NOZOMI is not set
-+
-+#
-+# Serial drivers
-+#
-+CONFIG_SERIAL_8250=y
-+CONFIG_SERIAL_8250_CONSOLE=y
-+# CONFIG_SERIAL_8250_PCI is not set
-+# CONFIG_SERIAL_8250_PNP is not set
-+CONFIG_SERIAL_8250_NR_UARTS=16
-+CONFIG_SERIAL_8250_RUNTIME_UARTS=4
-+CONFIG_SERIAL_8250_EXTENDED=y
-+CONFIG_SERIAL_8250_MANY_PORTS=y
-+CONFIG_SERIAL_8250_FOURPORT=y
-+# CONFIG_SERIAL_8250_ACCENT is not set
-+# CONFIG_SERIAL_8250_BOCA is not set
-+# CONFIG_SERIAL_8250_EXAR_ST16C554 is not set
-+CONFIG_SERIAL_8250_HUB6=m
-+CONFIG_SERIAL_8250_SHARE_IRQ=y
-+# CONFIG_SERIAL_8250_DETECT_IRQ is not set
-+CONFIG_SERIAL_8250_RSA=y
-+
-+#
-+# Non-8250 serial port support
-+#
-+# CONFIG_SERIAL_MAX3100 is not set
-+CONFIG_SERIAL_CORE=y
-+CONFIG_SERIAL_CORE_CONSOLE=y
-+# CONFIG_SERIAL_JSM is not set
-+CONFIG_UNIX98_PTYS=y
-+# CONFIG_DEVPTS_MULTIPLE_INSTANCES is not set
-+CONFIG_LEGACY_PTYS=y
-+CONFIG_LEGACY_PTY_COUNT=16
-+CONFIG_IPMI_HANDLER=m
-+# CONFIG_IPMI_PANIC_EVENT is not set
-+CONFIG_IPMI_DEVICE_INTERFACE=m
-+CONFIG_IPMI_SI=m
-+CONFIG_IPMI_WATCHDOG=m
-+CONFIG_IPMI_POWEROFF=m
-+CONFIG_HW_RANDOM=y
-+# CONFIG_HW_RANDOM_TIMERIOMEM is not set
-+# CONFIG_DTLK is not set
-+# CONFIG_R3964 is not set
-+# CONFIG_APPLICOM is not set
-+CONFIG_RAW_DRIVER=m
-+CONFIG_MAX_RAW_DEVS=256
-+# CONFIG_TCG_TPM is not set
-+CONFIG_DEVPORT=y
-+CONFIG_I2C=m
-+CONFIG_I2C_BOARDINFO=y
-+CONFIG_I2C_CHARDEV=m
-+CONFIG_I2C_HELPER_AUTO=y
-+CONFIG_I2C_ALGOBIT=m
-+CONFIG_I2C_ALGOPCA=m
-+
-+#
-+# I2C Hardware Bus support
-+#
-+
-+#
-+# PC SMBus host controller drivers
-+#
-+CONFIG_I2C_ALI1535=m
-+CONFIG_I2C_ALI1563=m
-+CONFIG_I2C_ALI15X3=m
-+CONFIG_I2C_AMD756=m
-+CONFIG_I2C_AMD8111=m
-+CONFIG_I2C_I801=m
-+# CONFIG_I2C_ISCH is not set
-+CONFIG_I2C_PIIX4=m
-+CONFIG_I2C_NFORCE2=m
-+CONFIG_I2C_SIS5595=m
-+CONFIG_I2C_SIS630=m
-+CONFIG_I2C_SIS96X=m
-+CONFIG_I2C_VIA=m
-+CONFIG_I2C_VIAPRO=m
-+
-+#
-+# I2C system bus drivers (mostly embedded / system-on-chip)
-+#
-+CONFIG_I2C_OCORES=m
-+# CONFIG_I2C_SIMTEC is not set
-+
-+#
-+# External I2C/SMBus adapter drivers
-+#
-+CONFIG_I2C_PARPORT_LIGHT=m
-+# CONFIG_I2C_TAOS_EVM is not set
-+# CONFIG_I2C_TINY_USB is not set
-+
-+#
-+# Graphics adapter I2C/DDC channel drivers
-+#
-+CONFIG_I2C_VOODOO3=m
-+
-+#
-+# Other I2C/SMBus bus drivers
-+#
-+# CONFIG_I2C_ELEKTOR is not set
-+CONFIG_I2C_PCA_ISA=m
-+# CONFIG_I2C_PCA_PLATFORM is not set
-+CONFIG_I2C_STUB=m
-+
-+#
-+# Miscellaneous I2C Chip support
-+#
-+# CONFIG_DS1682 is not set
-+CONFIG_SENSORS_PCF8574=m
-+# CONFIG_PCF8575 is not set
-+# CONFIG_SENSORS_PCA9539 is not set
-+# CONFIG_SENSORS_TSL2550 is not set
-+# CONFIG_I2C_DEBUG_CORE is not set
-+# CONFIG_I2C_DEBUG_ALGO is not set
-+# CONFIG_I2C_DEBUG_BUS is not set
-+# CONFIG_I2C_DEBUG_CHIP is not set
-+CONFIG_SPI=y
-+CONFIG_SPI_MASTER=y
-+
-+#
-+# SPI Master Controller Drivers
-+#
-+CONFIG_SPI_BITBANG=m
-+
-+#
-+# SPI Protocol Masters
-+#
-+# CONFIG_SPI_SPIDEV is not set
-+# CONFIG_SPI_TLE62X0 is not set
-+
-+#
-+# PPS support
-+#
-+# CONFIG_PPS is not set
-+# CONFIG_W1 is not set
-+# CONFIG_POWER_SUPPLY is not set
-+# CONFIG_HWMON is not set
-+# CONFIG_THERMAL is not set
-+# CONFIG_THERMAL_HWMON is not set
-+CONFIG_WATCHDOG=y
-+# CONFIG_WATCHDOG_NOWAYOUT is not set
-+
-+#
-+# Watchdog Device Drivers
-+#
-+CONFIG_SOFT_WATCHDOG=m
-+# CONFIG_ALIM7101_WDT is not set
-+
-+#
-+# ISA-based Watchdog Cards
-+#
-+# CONFIG_PCWATCHDOG is not set
-+# CONFIG_MIXCOMWD is not set
-+# CONFIG_WDT is not set
-+
-+#
-+# PCI-based Watchdog Cards
-+#
-+# CONFIG_PCIPCWATCHDOG is not set
-+# CONFIG_WDTPCI is not set
-+
-+#
-+# USB-based Watchdog Cards
-+#
-+# CONFIG_USBPCWATCHDOG is not set
-+CONFIG_SSB_POSSIBLE=y
-+
-+#
-+# Sonics Silicon Backplane
-+#
-+# CONFIG_SSB is not set
-+
-+#
-+# Multifunction device drivers
-+#
-+# CONFIG_MFD_CORE is not set
-+# CONFIG_MFD_SM501 is not set
-+# CONFIG_HTC_PASIC3 is not set
-+# CONFIG_MFD_TMIO is not set
-+# CONFIG_MFD_WM8400 is not set
-+# CONFIG_MFD_WM8350_I2C is not set
-+# CONFIG_MFD_PCF50633 is not set
-+# CONFIG_AB3100_CORE is not set
-+# CONFIG_EZX_PCAP is not set
-+# CONFIG_REGULATOR is not set
-+# CONFIG_MEDIA_SUPPORT is not set
-+
-+#
-+# Graphics support
-+#
-+CONFIG_DRM=m
-+CONFIG_DRM_TDFX=m
-+CONFIG_DRM_R128=m
-+CONFIG_DRM_RADEON=m
-+CONFIG_DRM_MGA=m
-+CONFIG_DRM_VIA=m
-+CONFIG_DRM_SAVAGE=m
-+# CONFIG_VGASTATE is not set
-+# CONFIG_VIDEO_OUTPUT_CONTROL is not set
-+CONFIG_FB=y
-+CONFIG_FIRMWARE_EDID=y
-+# CONFIG_FB_DDC is not set
-+# CONFIG_FB_BOOT_VESA_SUPPORT is not set
-+CONFIG_FB_CFB_FILLRECT=y
-+CONFIG_FB_CFB_COPYAREA=y
-+CONFIG_FB_CFB_IMAGEBLIT=y
-+# CONFIG_FB_CFB_REV_PIXELS_IN_BYTE is not set
-+CONFIG_FB_SYS_FILLRECT=m
-+CONFIG_FB_SYS_COPYAREA=m
-+CONFIG_FB_SYS_IMAGEBLIT=m
-+# CONFIG_FB_FOREIGN_ENDIAN is not set
-+CONFIG_FB_SYS_FOPS=m
-+# CONFIG_FB_SVGALIB is not set
-+# CONFIG_FB_MACMODES is not set
-+# CONFIG_FB_BACKLIGHT is not set
-+CONFIG_FB_MODE_HELPERS=y
-+CONFIG_FB_TILEBLITTING=y
-+
-+#
-+# Frame buffer hardware drivers
-+#
-+# CONFIG_FB_CIRRUS is not set
-+# CONFIG_FB_PM2 is not set
-+# CONFIG_FB_CYBER2000 is not set
-+# CONFIG_FB_ASILIANT is not set
-+# CONFIG_FB_IMSTT is not set
-+# CONFIG_FB_UVESA is not set
-+# CONFIG_FB_S1D13XXX is not set
-+# CONFIG_FB_NVIDIA is not set
-+# CONFIG_FB_RIVA is not set
-+# CONFIG_FB_MATROX is not set
-+# CONFIG_FB_RADEON is not set
-+# CONFIG_FB_ATY128 is not set
-+# CONFIG_FB_ATY is not set
-+# CONFIG_FB_S3 is not set
-+# CONFIG_FB_SAVAGE is not set
-+# CONFIG_FB_SIS is not set
-+# CONFIG_FB_VIA is not set
-+# CONFIG_FB_NEOMAGIC is not set
-+# CONFIG_FB_KYRO is not set
-+# CONFIG_FB_3DFX is not set
-+# CONFIG_FB_VOODOO1 is not set
-+# CONFIG_FB_VT8623 is not set
-+# CONFIG_FB_TRIDENT is not set
-+# CONFIG_FB_ARK is not set
-+# CONFIG_FB_PM3 is not set
-+# CONFIG_FB_CARMINE is not set
-+CONFIG_FB_SM7XX=y
-+CONFIG_FB_SM7XX_ACCEL=y
-+# CONFIG_FB_SM7XX_DUALHEAD is not set
-+CONFIG_FB_VIRTUAL=m
-+# CONFIG_FB_METRONOME is not set
-+# CONFIG_FB_MB862XX is not set
-+# CONFIG_FB_BROADSHEET is not set
-+CONFIG_BACKLIGHT_LCD_SUPPORT=y
-+# CONFIG_LCD_CLASS_DEVICE is not set
-+CONFIG_BACKLIGHT_CLASS_DEVICE=y
-+CONFIG_BACKLIGHT_GENERIC=y
-+
-+#
-+# Display device support
-+#
-+# CONFIG_DISPLAY_SUPPORT is not set
-+
-+#
-+# Console display driver support
-+#
-+# CONFIG_VGA_CONSOLE is not set
-+# CONFIG_MDA_CONSOLE is not set
-+CONFIG_DUMMY_CONSOLE=y
-+CONFIG_FRAMEBUFFER_CONSOLE=y
-+# CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY is not set
-+CONFIG_FRAMEBUFFER_CONSOLE_ROTATION=y
-+# CONFIG_FONTS is not set
-+CONFIG_FONT_8x8=y
-+CONFIG_FONT_8x16=y
-+# CONFIG_LOGO is not set
-+CONFIG_SOUND=y
-+CONFIG_SOUND_OSS_CORE=y
-+CONFIG_SND=y
-+CONFIG_SND_TIMER=y
-+CONFIG_SND_PCM=y
-+CONFIG_SND_RAWMIDI=m
-+CONFIG_SND_SEQUENCER=m
-+CONFIG_SND_SEQ_DUMMY=m
-+CONFIG_SND_OSSEMUL=y
-+CONFIG_SND_MIXER_OSS=m
-+CONFIG_SND_PCM_OSS=m
-+CONFIG_SND_PCM_OSS_PLUGINS=y
-+CONFIG_SND_SEQUENCER_OSS=y
-+# CONFIG_SND_HRTIMER is not set
-+# CONFIG_SND_DYNAMIC_MINORS is not set
-+CONFIG_SND_SUPPORT_OLD_API=y
-+CONFIG_SND_VERBOSE_PROCFS=y
-+# CONFIG_SND_VERBOSE_PRINTK is not set
-+# CONFIG_SND_DEBUG is not set
-+CONFIG_SND_VMASTER=y
-+CONFIG_SND_RAWMIDI_SEQ=m
-+# CONFIG_SND_OPL3_LIB_SEQ is not set
-+# CONFIG_SND_OPL4_LIB_SEQ is not set
-+# CONFIG_SND_SBAWE_SEQ is not set
-+# CONFIG_SND_EMU10K1_SEQ is not set
-+CONFIG_SND_AC97_CODEC=y
-+CONFIG_SND_DRIVERS=y
-+CONFIG_SND_DUMMY=m
-+# CONFIG_SND_VIRMIDI is not set
-+CONFIG_SND_MTPAV=m
-+# CONFIG_SND_SERIAL_U16550 is not set
-+# CONFIG_SND_MPU401 is not set
-+# CONFIG_SND_AC97_POWER_SAVE is not set
-+CONFIG_SND_PCI=y
-+# CONFIG_SND_AD1889 is not set
-+# CONFIG_SND_ALS300 is not set
-+# CONFIG_SND_ALI5451 is not set
-+# CONFIG_SND_ATIIXP is not set
-+# CONFIG_SND_ATIIXP_MODEM is not set
-+# CONFIG_SND_AU8810 is not set
-+# CONFIG_SND_AU8820 is not set
-+# CONFIG_SND_AU8830 is not set
-+# CONFIG_SND_AW2 is not set
-+# CONFIG_SND_AZT3328 is not set
-+# CONFIG_SND_BT87X is not set
-+# CONFIG_SND_CA0106 is not set
-+# CONFIG_SND_CMIPCI is not set
-+# CONFIG_SND_OXYGEN is not set
-+# CONFIG_SND_CS4281 is not set
-+# CONFIG_SND_CS46XX is not set
-+CONFIG_SND_CS5535AUDIO=y
-+# CONFIG_SND_CTXFI is not set
-+# CONFIG_SND_DARLA20 is not set
-+# CONFIG_SND_GINA20 is not set
-+# CONFIG_SND_LAYLA20 is not set
-+# CONFIG_SND_DARLA24 is not set
-+# CONFIG_SND_GINA24 is not set
-+# CONFIG_SND_LAYLA24 is not set
-+# CONFIG_SND_MONA is not set
-+# CONFIG_SND_MIA is not set
-+# CONFIG_SND_ECHO3G is not set
-+# CONFIG_SND_INDIGO is not set
-+# CONFIG_SND_INDIGOIO is not set
-+# CONFIG_SND_INDIGODJ is not set
-+# CONFIG_SND_INDIGOIOX is not set
-+# CONFIG_SND_INDIGODJX is not set
-+# CONFIG_SND_EMU10K1 is not set
-+# CONFIG_SND_EMU10K1X is not set
-+# CONFIG_SND_ENS1370 is not set
-+# CONFIG_SND_ENS1371 is not set
-+# CONFIG_SND_ES1938 is not set
-+# CONFIG_SND_ES1968 is not set
-+# CONFIG_SND_FM801 is not set
-+# CONFIG_SND_HDA_INTEL is not set
-+# CONFIG_SND_HDSP is not set
-+# CONFIG_SND_HDSPM is not set
-+# CONFIG_SND_HIFIER is not set
-+# CONFIG_SND_ICE1712 is not set
-+# CONFIG_SND_ICE1724 is not set
-+# CONFIG_SND_INTEL8X0 is not set
-+# CONFIG_SND_INTEL8X0M is not set
-+# CONFIG_SND_KORG1212 is not set
-+# CONFIG_SND_LX6464ES is not set
-+# CONFIG_SND_MAESTRO3 is not set
-+# CONFIG_SND_MIXART is not set
-+# CONFIG_SND_NM256 is not set
-+# CONFIG_SND_PCXHR is not set
-+# CONFIG_SND_RIPTIDE is not set
-+# CONFIG_SND_RME32 is not set
-+# CONFIG_SND_RME96 is not set
-+# CONFIG_SND_RME9652 is not set
-+# CONFIG_SND_SONICVIBES is not set
-+# CONFIG_SND_TRIDENT is not set
-+# CONFIG_SND_VIA82XX is not set
-+# CONFIG_SND_VIA82XX_MODEM is not set
-+# CONFIG_SND_VIRTUOSO is not set
-+# CONFIG_SND_VX222 is not set
-+# CONFIG_SND_YMFPCI is not set
-+# CONFIG_SND_SPI is not set
-+# CONFIG_SND_MIPS is not set
-+# CONFIG_SND_USB is not set
-+# CONFIG_SND_SOC is not set
-+# CONFIG_SOUND_PRIME is not set
-+CONFIG_AC97_BUS=y
-+CONFIG_HID_SUPPORT=y
-+CONFIG_HID=y
-+# CONFIG_HID_DEBUG is not set
-+CONFIG_HIDRAW=y
-+
-+#
-+# USB Input Devices
-+#
-+CONFIG_USB_HID=y
-+# CONFIG_HID_PID is not set
-+CONFIG_USB_HIDDEV=y
-+
-+#
-+# Special HID drivers
-+#
-+# CONFIG_HID_A4TECH is not set
-+# CONFIG_HID_APPLE is not set
-+# CONFIG_HID_BELKIN is not set
-+# CONFIG_HID_CHERRY is not set
-+# CONFIG_HID_CHICONY is not set
-+# CONFIG_HID_CYPRESS is not set
-+# CONFIG_HID_DRAGONRISE is not set
-+# CONFIG_HID_EZKEY is not set
-+# CONFIG_HID_KYE is not set
-+# CONFIG_HID_GYRATION is not set
-+# CONFIG_HID_KENSINGTON is not set
-+# CONFIG_HID_LOGITECH is not set
-+# CONFIG_HID_MICROSOFT is not set
-+# CONFIG_HID_MONTEREY is not set
-+# CONFIG_HID_NTRIG is not set
-+# CONFIG_HID_PANTHERLORD is not set
-+# CONFIG_HID_PETALYNX is not set
-+# CONFIG_HID_SAMSUNG is not set
-+# CONFIG_HID_SONY is not set
-+# CONFIG_HID_SUNPLUS is not set
-+# CONFIG_HID_GREENASIA is not set
-+# CONFIG_HID_SMARTJOYPLUS is not set
-+# CONFIG_HID_TOPSEED is not set
-+# CONFIG_HID_THRUSTMASTER is not set
-+# CONFIG_HID_WACOM is not set
-+# CONFIG_HID_ZEROPLUS is not set
-+CONFIG_USB_SUPPORT=y
-+CONFIG_USB_ARCH_HAS_HCD=y
-+CONFIG_USB_ARCH_HAS_OHCI=y
-+CONFIG_USB_ARCH_HAS_EHCI=y
-+CONFIG_USB=y
-+# CONFIG_USB_DEBUG is not set
-+# CONFIG_USB_ANNOUNCE_NEW_DEVICES is not set
-+
-+#
-+# Miscellaneous USB options
-+#
-+CONFIG_USB_DEVICEFS=y
-+CONFIG_USB_DEVICE_CLASS=y
-+CONFIG_USB_DYNAMIC_MINORS=y
-+# CONFIG_USB_SUSPEND is not set
-+# CONFIG_USB_OTG is not set
-+# CONFIG_USB_OTG_WHITELIST is not set
-+# CONFIG_USB_OTG_BLACKLIST_HUB is not set
-+CONFIG_USB_MON=m
-+# CONFIG_USB_WUSB is not set
-+# CONFIG_USB_WUSB_CBAF is not set
-+
-+#
-+# USB Host Controller Drivers
-+#
-+# CONFIG_USB_C67X00_HCD is not set
-+# CONFIG_USB_XHCI_HCD is not set
-+CONFIG_USB_EHCI_HCD=y
-+CONFIG_USB_EHCI_ROOT_HUB_TT=y
-+# CONFIG_USB_EHCI_TT_NEWSCHED is not set
-+# CONFIG_USB_OXU210HP_HCD is not set
-+# CONFIG_USB_ISP116X_HCD is not set
-+# CONFIG_USB_ISP1760_HCD is not set
-+CONFIG_USB_OHCI_HCD=m
-+# CONFIG_USB_OHCI_BIG_ENDIAN_DESC is not set
-+# CONFIG_USB_OHCI_BIG_ENDIAN_MMIO is not set
-+CONFIG_USB_OHCI_LITTLE_ENDIAN=y
-+CONFIG_USB_UHCI_HCD=m
-+# CONFIG_USB_SL811_HCD is not set
-+CONFIG_USB_R8A66597_HCD=y
-+# CONFIG_USB_WHCI_HCD is not set
-+# CONFIG_USB_HWA_HCD is not set
-+
-+#
-+# USB Device Class drivers
-+#
-+CONFIG_USB_ACM=m
-+CONFIG_USB_PRINTER=m
-+# CONFIG_USB_WDM is not set
-+# CONFIG_USB_TMC is not set
-+
-+#
-+# NOTE: USB_STORAGE depends on SCSI but BLK_DEV_SD may
-+#
-+
-+#
-+# also be needed; see USB_STORAGE Help for more info
-+#
-+CONFIG_USB_STORAGE=y
-+# CONFIG_USB_STORAGE_DEBUG is not set
-+CONFIG_USB_STORAGE_DATAFAB=y
-+CONFIG_USB_STORAGE_FREECOM=y
-+CONFIG_USB_STORAGE_ISD200=y
-+CONFIG_USB_STORAGE_USBAT=y
-+CONFIG_USB_STORAGE_SDDR09=y
-+CONFIG_USB_STORAGE_SDDR55=y
-+CONFIG_USB_STORAGE_JUMPSHOT=y
-+CONFIG_USB_STORAGE_ALAUDA=y
-+CONFIG_USB_STORAGE_ONETOUCH=y
-+CONFIG_USB_STORAGE_KARMA=y
-+CONFIG_USB_STORAGE_CYPRESS_ATACB=y
-+# CONFIG_USB_LIBUSUAL is not set
-+
-+#
-+# USB Imaging devices
-+#
-+CONFIG_USB_MDC800=m
-+CONFIG_USB_MICROTEK=m
-+
-+#
-+# USB port drivers
-+#
-+CONFIG_USB_SERIAL=m
-+CONFIG_USB_EZUSB=y
-+CONFIG_USB_SERIAL_GENERIC=y
-+# CONFIG_USB_SERIAL_AIRCABLE is not set
-+CONFIG_USB_SERIAL_ARK3116=m
-+CONFIG_USB_SERIAL_BELKIN=m
-+# CONFIG_USB_SERIAL_CH341 is not set
-+# CONFIG_USB_SERIAL_WHITEHEAT is not set
-+CONFIG_USB_SERIAL_DIGI_ACCELEPORT=m
-+# CONFIG_USB_SERIAL_CP210X is not set
-+CONFIG_USB_SERIAL_CYPRESS_M8=m
-+CONFIG_USB_SERIAL_EMPEG=m
-+CONFIG_USB_SERIAL_FTDI_SIO=m
-+CONFIG_USB_SERIAL_FUNSOFT=m
-+CONFIG_USB_SERIAL_VISOR=m
-+CONFIG_USB_SERIAL_IPAQ=m
-+CONFIG_USB_SERIAL_IR=m
-+CONFIG_USB_SERIAL_EDGEPORT=m
-+CONFIG_USB_SERIAL_EDGEPORT_TI=m
-+CONFIG_USB_SERIAL_GARMIN=m
-+CONFIG_USB_SERIAL_IPW=m
-+# CONFIG_USB_SERIAL_IUU is not set
-+CONFIG_USB_SERIAL_KEYSPAN_PDA=m
-+# CONFIG_USB_SERIAL_KEYSPAN is not set
-+CONFIG_USB_SERIAL_KLSI=m
-+CONFIG_USB_SERIAL_KOBIL_SCT=m
-+CONFIG_USB_SERIAL_MCT_U232=m
-+# CONFIG_USB_SERIAL_MOS7720 is not set
-+# CONFIG_USB_SERIAL_MOS7840 is not set
-+# CONFIG_USB_SERIAL_MOTOROLA is not set
-+CONFIG_USB_SERIAL_NAVMAN=m
-+CONFIG_USB_SERIAL_PL2303=m
-+# CONFIG_USB_SERIAL_OTI6858 is not set
-+# CONFIG_USB_SERIAL_QUALCOMM is not set
-+# CONFIG_USB_SERIAL_SPCP8X5 is not set
-+CONFIG_USB_SERIAL_HP4X=m
-+CONFIG_USB_SERIAL_SAFE=m
-+# CONFIG_USB_SERIAL_SAFE_PADDED is not set
-+# CONFIG_USB_SERIAL_SIEMENS_MPI is not set
-+CONFIG_USB_SERIAL_SIERRAWIRELESS=m
-+# CONFIG_USB_SERIAL_SYMBOL is not set
-+CONFIG_USB_SERIAL_TI=m
-+CONFIG_USB_SERIAL_CYBERJACK=m
-+CONFIG_USB_SERIAL_XIRCOM=m
-+CONFIG_USB_SERIAL_OPTION=m
-+CONFIG_USB_SERIAL_OMNINET=m
-+# CONFIG_USB_SERIAL_OPTICON is not set
-+# CONFIG_USB_SERIAL_DEBUG is not set
-+
-+#
-+# USB Miscellaneous drivers
-+#
-+# CONFIG_USB_EMI62 is not set
-+# CONFIG_USB_EMI26 is not set
-+# CONFIG_USB_ADUTUX is not set
-+# CONFIG_USB_SEVSEG is not set
-+CONFIG_USB_RIO500=m
-+# CONFIG_USB_LEGOTOWER is not set
-+# CONFIG_USB_LCD is not set
-+# CONFIG_USB_BERRY_CHARGE is not set
-+# CONFIG_USB_LED is not set
-+# CONFIG_USB_CYPRESS_CY7C63 is not set
-+# CONFIG_USB_CYTHERM is not set
-+CONFIG_USB_IDMOUSE=m
-+# CONFIG_USB_FTDI_ELAN is not set
-+CONFIG_USB_APPLEDISPLAY=m
-+CONFIG_USB_SISUSBVGA=m
-+CONFIG_USB_SISUSBVGA_CON=y
-+CONFIG_USB_LD=m
-+# CONFIG_USB_TRANCEVIBRATOR is not set
-+# CONFIG_USB_IOWARRIOR is not set
-+CONFIG_USB_TEST=m
-+# CONFIG_USB_ISIGHTFW is not set
-+# CONFIG_USB_VST is not set
-+CONFIG_USB_ATM=m
-+CONFIG_USB_SPEEDTOUCH=m
-+CONFIG_USB_CXACRU=m
-+CONFIG_USB_UEAGLEATM=m
-+CONFIG_USB_XUSBATM=m
-+# CONFIG_USB_GADGET is not set
-+
-+#
-+# OTG and related infrastructure
-+#
-+# CONFIG_NOP_USB_XCEIV is not set
-+# CONFIG_UWB is not set
-+CONFIG_MMC=m
-+# CONFIG_MMC_DEBUG is not set
-+# CONFIG_MMC_UNSAFE_RESUME is not set
-+
-+#
-+# MMC/SD/SDIO Card Drivers
-+#
-+# CONFIG_MMC_BLOCK is not set
-+# CONFIG_SDIO_UART is not set
-+# CONFIG_MMC_TEST is not set
-+
-+#
-+# MMC/SD/SDIO Host Controller Drivers
-+#
-+# CONFIG_MMC_SDHCI is not set
-+# CONFIG_MMC_TIFM_SD is not set
-+# CONFIG_MMC_SPI is not set
-+# CONFIG_MMC_CB710 is not set
-+# CONFIG_MMC_VIA_SDMMC is not set
-+# CONFIG_MEMSTICK is not set
-+CONFIG_NEW_LEDS=y
-+CONFIG_LEDS_CLASS=m
-+
-+#
-+# LED drivers
-+#
-+# CONFIG_LEDS_PCA9532 is not set
-+# CONFIG_LEDS_LP3944 is not set
-+# CONFIG_LEDS_PCA955X is not set
-+# CONFIG_LEDS_DAC124S085 is not set
-+# CONFIG_LEDS_BD2802 is not set
-+
-+#
-+# LED Triggers
-+#
-+CONFIG_LEDS_TRIGGERS=y
-+CONFIG_LEDS_TRIGGER_TIMER=m
-+# CONFIG_LEDS_TRIGGER_IDE_DISK is not set
-+CONFIG_LEDS_TRIGGER_HEARTBEAT=m
-+# CONFIG_LEDS_TRIGGER_BACKLIGHT is not set
-+# CONFIG_LEDS_TRIGGER_DEFAULT_ON is not set
-+
-+#
-+# iptables trigger is under Netfilter config (LED target)
-+#
-+# CONFIG_ACCESSIBILITY is not set
-+# CONFIG_INFINIBAND is not set
-+CONFIG_RTC_LIB=y
-+CONFIG_RTC_CLASS=y
-+CONFIG_RTC_HCTOSYS=y
-+CONFIG_RTC_HCTOSYS_DEVICE="rtc0"
-+# CONFIG_RTC_DEBUG is not set
-+
-+#
-+# RTC interfaces
-+#
-+CONFIG_RTC_INTF_SYSFS=y
-+CONFIG_RTC_INTF_PROC=y
-+CONFIG_RTC_INTF_DEV=y
-+# CONFIG_RTC_INTF_DEV_UIE_EMUL is not set
-+# CONFIG_RTC_DRV_TEST is not set
-+
-+#
-+# I2C RTC drivers
-+#
-+# CONFIG_RTC_DRV_DS1307 is not set
-+# CONFIG_RTC_DRV_DS1374 is not set
-+# CONFIG_RTC_DRV_DS1672 is not set
-+# CONFIG_RTC_DRV_MAX6900 is not set
-+# CONFIG_RTC_DRV_RS5C372 is not set
-+# CONFIG_RTC_DRV_ISL1208 is not set
-+# CONFIG_RTC_DRV_X1205 is not set
-+# CONFIG_RTC_DRV_PCF8563 is not set
-+# CONFIG_RTC_DRV_PCF8583 is not set
-+# CONFIG_RTC_DRV_M41T80 is not set
-+# CONFIG_RTC_DRV_S35390A is not set
-+# CONFIG_RTC_DRV_FM3130 is not set
-+# CONFIG_RTC_DRV_RX8581 is not set
-+# CONFIG_RTC_DRV_RX8025 is not set
-+
-+#
-+# SPI RTC drivers
-+#
-+# CONFIG_RTC_DRV_M41T94 is not set
-+# CONFIG_RTC_DRV_DS1305 is not set
-+# CONFIG_RTC_DRV_DS1390 is not set
-+# CONFIG_RTC_DRV_MAX6902 is not set
-+# CONFIG_RTC_DRV_R9701 is not set
-+# CONFIG_RTC_DRV_RS5C348 is not set
-+# CONFIG_RTC_DRV_DS3234 is not set
-+
-+#
-+# Platform RTC drivers
-+#
-+CONFIG_RTC_DRV_CMOS=y
-+# CONFIG_RTC_DRV_DS1286 is not set
-+# CONFIG_RTC_DRV_DS1511 is not set
-+# CONFIG_RTC_DRV_DS1553 is not set
-+# CONFIG_RTC_DRV_DS1742 is not set
-+# CONFIG_RTC_DRV_STK17TA8 is not set
-+# CONFIG_RTC_DRV_M48T86 is not set
-+# CONFIG_RTC_DRV_M48T35 is not set
-+# CONFIG_RTC_DRV_M48T59 is not set
-+# CONFIG_RTC_DRV_BQ4802 is not set
-+# CONFIG_RTC_DRV_V3020 is not set
-+
-+#
-+# on-CPU RTC drivers
-+#
-+# CONFIG_DMADEVICES is not set
-+# CONFIG_AUXDISPLAY is not set
-+# CONFIG_UIO is not set
-+
-+#
-+# TI VLYNQ
-+#
-+# CONFIG_STAGING is not set
-+CONFIG_LOONGSON_PLATFORM_DEVICES=y
-+CONFIG_EC_KB3310B=y
-+# CONFIG_EC_KB3310B_DEBUG is not set
-+CONFIG_PMON_FLASH=m
-+
-+#
-+# File systems
-+#
-+CONFIG_EXT2_FS=y
-+CONFIG_EXT2_FS_XATTR=y
-+CONFIG_EXT2_FS_POSIX_ACL=y
-+CONFIG_EXT2_FS_SECURITY=y
-+# CONFIG_EXT2_FS_XIP is not set
-+CONFIG_EXT3_FS=y
-+# CONFIG_EXT3_DEFAULTS_TO_ORDERED is not set
-+CONFIG_EXT3_FS_XATTR=y
-+CONFIG_EXT3_FS_POSIX_ACL=y
-+CONFIG_EXT3_FS_SECURITY=y
-+CONFIG_EXT4_FS=m
-+CONFIG_EXT4DEV_COMPAT=y
-+CONFIG_EXT4_FS_XATTR=y
-+CONFIG_EXT4_FS_POSIX_ACL=y
-+CONFIG_EXT4_FS_SECURITY=y
-+CONFIG_JBD=y
-+# CONFIG_JBD_DEBUG is not set
-+CONFIG_JBD2=m
-+# CONFIG_JBD2_DEBUG is not set
-+CONFIG_FS_MBCACHE=y
-+CONFIG_REISERFS_FS=m
-+# CONFIG_REISERFS_CHECK is not set
-+# CONFIG_REISERFS_PROC_INFO is not set
-+CONFIG_REISERFS_FS_XATTR=y
-+CONFIG_REISERFS_FS_POSIX_ACL=y
-+CONFIG_REISERFS_FS_SECURITY=y
-+CONFIG_JFS_FS=m
-+CONFIG_JFS_POSIX_ACL=y
-+CONFIG_JFS_SECURITY=y
-+# CONFIG_JFS_DEBUG is not set
-+# CONFIG_JFS_STATISTICS is not set
-+CONFIG_FS_POSIX_ACL=y
-+CONFIG_XFS_FS=m
-+CONFIG_XFS_QUOTA=y
-+CONFIG_XFS_POSIX_ACL=y
-+CONFIG_XFS_RT=y
-+# CONFIG_XFS_DEBUG is not set
-+# CONFIG_GFS2_FS is not set
-+CONFIG_OCFS2_FS=m
-+CONFIG_OCFS2_FS_O2CB=m
-+CONFIG_OCFS2_FS_STATS=y
-+CONFIG_OCFS2_DEBUG_MASKLOG=y
-+# CONFIG_OCFS2_DEBUG_FS is not set
-+# CONFIG_OCFS2_FS_POSIX_ACL is not set
-+# CONFIG_BTRFS_FS is not set
-+CONFIG_FILE_LOCKING=y
-+CONFIG_FSNOTIFY=y
-+CONFIG_DNOTIFY=y
-+CONFIG_INOTIFY=y
-+CONFIG_INOTIFY_USER=y
-+CONFIG_QUOTA=y
-+# CONFIG_QUOTA_NETLINK_INTERFACE is not set
-+CONFIG_PRINT_QUOTA_WARNING=y
-+CONFIG_QUOTA_TREE=m
-+CONFIG_QFMT_V1=m
-+CONFIG_QFMT_V2=m
-+CONFIG_QUOTACTL=y
-+CONFIG_AUTOFS_FS=m
-+CONFIG_AUTOFS4_FS=m
-+CONFIG_FUSE_FS=m
-+# CONFIG_CUSE is not set
-+
-+#
-+# Caches
-+#
-+# CONFIG_FSCACHE is not set
-+
-+#
-+# CD-ROM/DVD Filesystems
-+#
-+CONFIG_ISO9660_FS=m
-+CONFIG_JOLIET=y
-+CONFIG_ZISOFS=y
-+CONFIG_UDF_FS=m
-+CONFIG_UDF_NLS=y
-+
-+#
-+# DOS/FAT/NT Filesystems
-+#
-+CONFIG_FAT_FS=m
-+CONFIG_MSDOS_FS=m
-+CONFIG_VFAT_FS=m
-+CONFIG_FAT_DEFAULT_CODEPAGE=437
-+CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"
-+CONFIG_NTFS_FS=m
-+# CONFIG_NTFS_DEBUG is not set
-+CONFIG_NTFS_RW=y
-+
-+#
-+# Pseudo filesystems
-+#
-+CONFIG_PROC_FS=y
-+CONFIG_PROC_KCORE=y
-+CONFIG_PROC_SYSCTL=y
-+CONFIG_PROC_PAGE_MONITOR=y
-+CONFIG_SYSFS=y
-+CONFIG_TMPFS=y
-+# CONFIG_TMPFS_POSIX_ACL is not set
-+# CONFIG_HUGETLB_PAGE is not set
-+CONFIG_CONFIGFS_FS=m
-+CONFIG_MISC_FILESYSTEMS=y
-+CONFIG_ADFS_FS=m
-+# CONFIG_ADFS_FS_RW is not set
-+CONFIG_AFFS_FS=m
-+# CONFIG_ECRYPT_FS is not set
-+CONFIG_HFS_FS=m
-+CONFIG_HFSPLUS_FS=m
-+CONFIG_BEFS_FS=m
-+# CONFIG_BEFS_DEBUG is not set
-+CONFIG_BFS_FS=m
-+CONFIG_EFS_FS=m
-+CONFIG_JFFS2_FS=m
-+CONFIG_JFFS2_FS_DEBUG=0
-+CONFIG_JFFS2_FS_WRITEBUFFER=y
-+# CONFIG_JFFS2_FS_WBUF_VERIFY is not set
-+# CONFIG_JFFS2_SUMMARY is not set
-+CONFIG_JFFS2_FS_XATTR=y
-+CONFIG_JFFS2_FS_POSIX_ACL=y
-+CONFIG_JFFS2_FS_SECURITY=y
-+# CONFIG_JFFS2_COMPRESSION_OPTIONS is not set
-+CONFIG_JFFS2_ZLIB=y
-+# CONFIG_JFFS2_LZO is not set
-+CONFIG_JFFS2_RTIME=y
-+# CONFIG_JFFS2_RUBIN is not set
-+CONFIG_CRAMFS=y
-+# CONFIG_SQUASHFS is not set
-+CONFIG_VXFS_FS=m
-+CONFIG_MINIX_FS=m
-+# CONFIG_OMFS_FS is not set
-+CONFIG_HPFS_FS=m
-+CONFIG_QNX4FS_FS=m
-+CONFIG_ROMFS_FS=m
-+CONFIG_ROMFS_BACKED_BY_BLOCK=y
-+# CONFIG_ROMFS_BACKED_BY_MTD is not set
-+# CONFIG_ROMFS_BACKED_BY_BOTH is not set
-+CONFIG_ROMFS_ON_BLOCK=y
-+CONFIG_SYSV_FS=m
-+CONFIG_UFS_FS=m
-+# CONFIG_UFS_FS_WRITE is not set
-+# CONFIG_UFS_DEBUG is not set
-+# CONFIG_NILFS2_FS is not set
-+CONFIG_NETWORK_FILESYSTEMS=y
-+CONFIG_NFS_FS=m
-+CONFIG_NFS_V3=y
-+CONFIG_NFS_V3_ACL=y
-+CONFIG_NFS_V4=y
-+# CONFIG_NFS_V4_1 is not set
-+CONFIG_NFSD=m
-+CONFIG_NFSD_V2_ACL=y
-+CONFIG_NFSD_V3=y
-+CONFIG_NFSD_V3_ACL=y
-+CONFIG_NFSD_V4=y
-+CONFIG_LOCKD=m
-+CONFIG_LOCKD_V4=y
-+CONFIG_EXPORTFS=m
-+CONFIG_NFS_ACL_SUPPORT=m
-+CONFIG_NFS_COMMON=y
-+CONFIG_SUNRPC=m
-+CONFIG_SUNRPC_GSS=m
-+CONFIG_RPCSEC_GSS_KRB5=m
-+CONFIG_RPCSEC_GSS_SPKM3=m
-+CONFIG_SMB_FS=m
-+# CONFIG_SMB_NLS_DEFAULT is not set
-+CONFIG_CIFS=m
-+# CONFIG_CIFS_STATS is not set
-+# CONFIG_CIFS_WEAK_PW_HASH is not set
-+# CONFIG_CIFS_UPCALL is not set
-+# CONFIG_CIFS_XATTR is not set
-+# CONFIG_CIFS_DEBUG2 is not set
-+# CONFIG_CIFS_DFS_UPCALL is not set
-+# CONFIG_CIFS_EXPERIMENTAL is not set
-+CONFIG_NCP_FS=m
-+CONFIG_NCPFS_PACKET_SIGNING=y
-+CONFIG_NCPFS_IOCTL_LOCKING=y
-+CONFIG_NCPFS_STRONG=y
-+CONFIG_NCPFS_NFS_NS=y
-+CONFIG_NCPFS_OS2_NS=y
-+# CONFIG_NCPFS_SMALLDOS is not set
-+CONFIG_NCPFS_NLS=y
-+CONFIG_NCPFS_EXTRAS=y
-+CONFIG_CODA_FS=m
-+CONFIG_AFS_FS=m
-+# CONFIG_AFS_DEBUG is not set
-+
-+#
-+# Partition Types
-+#
-+CONFIG_PARTITION_ADVANCED=y
-+CONFIG_ACORN_PARTITION=y
-+# CONFIG_ACORN_PARTITION_CUMANA is not set
-+# CONFIG_ACORN_PARTITION_EESOX is not set
-+CONFIG_ACORN_PARTITION_ICS=y
-+# CONFIG_ACORN_PARTITION_ADFS is not set
-+# CONFIG_ACORN_PARTITION_POWERTEC is not set
-+CONFIG_ACORN_PARTITION_RISCIX=y
-+CONFIG_OSF_PARTITION=y
-+CONFIG_AMIGA_PARTITION=y
-+CONFIG_ATARI_PARTITION=y
-+CONFIG_MAC_PARTITION=y
-+CONFIG_MSDOS_PARTITION=y
-+CONFIG_BSD_DISKLABEL=y
-+CONFIG_MINIX_SUBPARTITION=y
-+CONFIG_SOLARIS_X86_PARTITION=y
-+CONFIG_UNIXWARE_DISKLABEL=y
-+CONFIG_LDM_PARTITION=y
-+# CONFIG_LDM_DEBUG is not set
-+CONFIG_SGI_PARTITION=y
-+CONFIG_ULTRIX_PARTITION=y
-+CONFIG_SUN_PARTITION=y
-+CONFIG_KARMA_PARTITION=y
-+CONFIG_EFI_PARTITION=y
-+# CONFIG_SYSV68_PARTITION is not set
-+CONFIG_NLS=y
-+CONFIG_NLS_DEFAULT="utf-8"
-+CONFIG_NLS_CODEPAGE_437=m
-+# CONFIG_NLS_CODEPAGE_737 is not set
-+# CONFIG_NLS_CODEPAGE_775 is not set
-+CONFIG_NLS_CODEPAGE_850=m
-+# CONFIG_NLS_CODEPAGE_852 is not set
-+# CONFIG_NLS_CODEPAGE_855 is not set
-+# CONFIG_NLS_CODEPAGE_857 is not set
-+# CONFIG_NLS_CODEPAGE_860 is not set
-+# CONFIG_NLS_CODEPAGE_861 is not set
-+# CONFIG_NLS_CODEPAGE_862 is not set
-+# CONFIG_NLS_CODEPAGE_863 is not set
-+# CONFIG_NLS_CODEPAGE_864 is not set
-+# CONFIG_NLS_CODEPAGE_865 is not set
-+# CONFIG_NLS_CODEPAGE_866 is not set
-+# CONFIG_NLS_CODEPAGE_869 is not set
-+CONFIG_NLS_CODEPAGE_936=m
-+CONFIG_NLS_CODEPAGE_950=m
-+CONFIG_NLS_CODEPAGE_932=m
-+CONFIG_NLS_CODEPAGE_949=m
-+# CONFIG_NLS_CODEPAGE_874 is not set
-+# CONFIG_NLS_ISO8859_8 is not set
-+CONFIG_NLS_CODEPAGE_1250=m
-+CONFIG_NLS_CODEPAGE_1251=m
-+CONFIG_NLS_ASCII=m
-+# CONFIG_NLS_ISO8859_1 is not set
-+# CONFIG_NLS_ISO8859_2 is not set
-+# CONFIG_NLS_ISO8859_3 is not set
-+# CONFIG_NLS_ISO8859_4 is not set
-+# CONFIG_NLS_ISO8859_5 is not set
-+# CONFIG_NLS_ISO8859_6 is not set
-+# CONFIG_NLS_ISO8859_7 is not set
-+# CONFIG_NLS_ISO8859_9 is not set
-+# CONFIG_NLS_ISO8859_13 is not set
-+# CONFIG_NLS_ISO8859_14 is not set
-+# CONFIG_NLS_ISO8859_15 is not set
-+CONFIG_NLS_KOI8_R=m
-+CONFIG_NLS_KOI8_U=m
-+CONFIG_NLS_UTF8=m
-+# CONFIG_DLM is not set
-+
-+#
-+# Kernel hacking
-+#
-+CONFIG_TRACE_IRQFLAGS_SUPPORT=y
-+# CONFIG_PRINTK_TIME is not set
-+CONFIG_ENABLE_WARN_DEPRECATED=y
-+CONFIG_ENABLE_MUST_CHECK=y
-+CONFIG_FRAME_WARN=1024
-+CONFIG_MAGIC_SYSRQ=y
-+CONFIG_UNUSED_SYMBOLS=y
-+CONFIG_DEBUG_FS=y
-+# CONFIG_HEADERS_CHECK is not set
-+# CONFIG_DEBUG_KERNEL is not set
-+CONFIG_STACKTRACE=y
-+# CONFIG_DEBUG_MEMORY_INIT is not set
-+# CONFIG_RCU_CPU_STALL_DETECTOR is not set
-+CONFIG_SYSCTL_SYSCALL_CHECK=y
-+CONFIG_NOP_TRACER=y
-+CONFIG_RING_BUFFER=y
-+CONFIG_EVENT_TRACING=y
-+CONFIG_CONTEXT_SWITCH_TRACER=y
-+CONFIG_TRACING=y
-+CONFIG_TRACING_SUPPORT=y
-+# CONFIG_FTRACE is not set
-+# CONFIG_DYNAMIC_DEBUG is not set
-+# CONFIG_SAMPLES is not set
-+CONFIG_HAVE_ARCH_KGDB=y
-+CONFIG_CMDLINE=""
-+
-+#
-+# Security options
-+#
-+CONFIG_KEYS=y
-+# CONFIG_KEYS_DEBUG_PROC_KEYS is not set
-+CONFIG_SECURITY=y
-+# CONFIG_SECURITYFS is not set
-+CONFIG_SECURITY_NETWORK=y
-+CONFIG_SECURITY_NETWORK_XFRM=y
-+# CONFIG_SECURITY_PATH is not set
-+# CONFIG_SECURITY_FILE_CAPABILITIES is not set
-+# CONFIG_SECURITY_ROOTPLUG is not set
-+CONFIG_SECURITY_SELINUX=y
-+CONFIG_SECURITY_SELINUX_BOOTPARAM=y
-+CONFIG_SECURITY_SELINUX_BOOTPARAM_VALUE=0
-+CONFIG_SECURITY_SELINUX_DISABLE=y
-+CONFIG_SECURITY_SELINUX_DEVELOP=y
-+CONFIG_SECURITY_SELINUX_AVC_STATS=y
-+CONFIG_SECURITY_SELINUX_CHECKREQPROT_VALUE=1
-+# CONFIG_SECURITY_SELINUX_POLICYDB_VERSION_MAX is not set
-+# CONFIG_SECURITY_TOMOYO is not set
-+CONFIG_XOR_BLOCKS=m
-+CONFIG_ASYNC_CORE=m
-+CONFIG_ASYNC_MEMCPY=m
-+CONFIG_ASYNC_XOR=m
-+CONFIG_CRYPTO=y
-+
-+#
-+# Crypto core or helper
-+#
-+# CONFIG_CRYPTO_FIPS is not set
-+CONFIG_CRYPTO_ALGAPI=y
-+CONFIG_CRYPTO_ALGAPI2=y
-+CONFIG_CRYPTO_AEAD=m
-+CONFIG_CRYPTO_AEAD2=y
-+CONFIG_CRYPTO_BLKCIPHER=y
-+CONFIG_CRYPTO_BLKCIPHER2=y
-+CONFIG_CRYPTO_HASH=y
-+CONFIG_CRYPTO_HASH2=y
-+CONFIG_CRYPTO_RNG2=y
-+CONFIG_CRYPTO_PCOMP=y
-+CONFIG_CRYPTO_MANAGER=y
-+CONFIG_CRYPTO_MANAGER2=y
-+# CONFIG_CRYPTO_GF128MUL is not set
-+CONFIG_CRYPTO_NULL=m
-+CONFIG_CRYPTO_WORKQUEUE=y
-+# CONFIG_CRYPTO_CRYPTD is not set
-+CONFIG_CRYPTO_AUTHENC=m
-+CONFIG_CRYPTO_TEST=m
-+
-+#
-+# Authenticated Encryption with Associated Data
-+#
-+# CONFIG_CRYPTO_CCM is not set
-+# CONFIG_CRYPTO_GCM is not set
-+# CONFIG_CRYPTO_SEQIV is not set
-+
-+#
-+# Block modes
-+#
-+CONFIG_CRYPTO_CBC=m
-+# CONFIG_CRYPTO_CTR is not set
-+# CONFIG_CRYPTO_CTS is not set
-+CONFIG_CRYPTO_ECB=y
-+# CONFIG_CRYPTO_LRW is not set
-+# CONFIG_CRYPTO_PCBC is not set
-+# CONFIG_CRYPTO_XTS is not set
-+
-+#
-+# Hash modes
-+#
-+CONFIG_CRYPTO_HMAC=y
-+# CONFIG_CRYPTO_XCBC is not set
-+
-+#
-+# Digest
-+#
-+CONFIG_CRYPTO_CRC32C=m
-+CONFIG_CRYPTO_MD4=m
-+CONFIG_CRYPTO_MD5=y
-+CONFIG_CRYPTO_MICHAEL_MIC=m
-+# CONFIG_CRYPTO_RMD128 is not set
-+# CONFIG_CRYPTO_RMD160 is not set
-+# CONFIG_CRYPTO_RMD256 is not set
-+# CONFIG_CRYPTO_RMD320 is not set
-+CONFIG_CRYPTO_SHA1=m
-+CONFIG_CRYPTO_SHA256=m
-+CONFIG_CRYPTO_SHA512=m
-+CONFIG_CRYPTO_TGR192=m
-+CONFIG_CRYPTO_WP512=m
-+
-+#
-+# Ciphers
-+#
-+CONFIG_CRYPTO_AES=y
-+CONFIG_CRYPTO_ANUBIS=m
-+CONFIG_CRYPTO_ARC4=y
-+CONFIG_CRYPTO_BLOWFISH=m
-+# CONFIG_CRYPTO_CAMELLIA is not set
-+CONFIG_CRYPTO_CAST5=m
-+CONFIG_CRYPTO_CAST6=m
-+CONFIG_CRYPTO_DES=m
-+# CONFIG_CRYPTO_FCRYPT is not set
-+CONFIG_CRYPTO_KHAZAD=m
-+# CONFIG_CRYPTO_SALSA20 is not set
-+# CONFIG_CRYPTO_SEED is not set
-+CONFIG_CRYPTO_SERPENT=m
-+CONFIG_CRYPTO_TEA=m
-+CONFIG_CRYPTO_TWOFISH=m
-+CONFIG_CRYPTO_TWOFISH_COMMON=m
-+
-+#
-+# Compression
-+#
-+CONFIG_CRYPTO_DEFLATE=m
-+# CONFIG_CRYPTO_ZLIB is not set
-+# CONFIG_CRYPTO_LZO is not set
-+
-+#
-+# Random Number Generation
-+#
-+# CONFIG_CRYPTO_ANSI_CPRNG is not set
-+CONFIG_CRYPTO_HW=y
-+# CONFIG_CRYPTO_DEV_HIFN_795X is not set
-+CONFIG_BINARY_PRINTF=y
-+
-+#
-+# Library routines
-+#
-+CONFIG_BITREVERSE=y
-+CONFIG_GENERIC_FIND_LAST_BIT=y
-+CONFIG_CRC_CCITT=m
-+CONFIG_CRC16=m
-+# CONFIG_CRC_T10DIF is not set
-+CONFIG_CRC_ITU_T=m
-+CONFIG_CRC32=y
-+# CONFIG_CRC7 is not set
-+CONFIG_LIBCRC32C=m
-+CONFIG_AUDIT_GENERIC=y
-+CONFIG_ZLIB_INFLATE=y
-+CONFIG_ZLIB_DEFLATE=m
-+CONFIG_DECOMPRESS_GZIP=y
-+CONFIG_TEXTSEARCH=y
-+CONFIG_TEXTSEARCH_KMP=m
-+CONFIG_TEXTSEARCH_BM=m
-+CONFIG_TEXTSEARCH_FSM=m
-+CONFIG_HAS_IOMEM=y
-+CONFIG_HAS_IOPORT=y
-+CONFIG_HAS_DMA=y
-+CONFIG_NLATTR=y
-diff -Nur linux-2.6.30.5.orig/arch/mips/include/asm/bootinfo.h linux-2.6.30.5/arch/mips/include/asm/bootinfo.h
---- linux-2.6.30.5.orig/arch/mips/include/asm/bootinfo.h 2009-08-16 23:19:38.000000000 +0200
-+++ linux-2.6.30.5/arch/mips/include/asm/bootinfo.h 2009-08-23 19:01:04.000000000 +0200
-@@ -7,6 +7,7 @@
- * Copyright (C) 1995, 1996 Andreas Busse
- * Copyright (C) 1995, 1996 Stoned Elipot
- * Copyright (C) 1995, 1996 Paul M. Antoine.
-+ * Copyright (C) 2009 Zhang Le
- */
- #ifndef _ASM_BOOTINFO_H
- #define _ASM_BOOTINFO_H
-@@ -57,6 +58,16 @@
- #define MACH_MIKROTIK_RB532 0 /* Mikrotik RouterBoard 532 */
- #define MACH_MIKROTIK_RB532A 1 /* Mikrotik RouterBoard 532A */
-
-+/*
-+ * Valid machtype for group Loongson
-+ */
-+#define MACH_LOONGSON_UNKNOWN 0
-+#define MACH_LEMOTE_FL2E 1
-+#define MACH_LEMOTE_FL2F 2
-+#define MACH_LEMOTE_YL2F89 3
-+#define MACH_LEMOTE_YL2F7 4
-+#define MACH_LOONGSON_END 5
-+
- #define CL_SIZE COMMAND_LINE_SIZE
-
- extern char *system_type;
-diff -Nur linux-2.6.30.5.orig/arch/mips/include/asm/bug.h linux-2.6.30.5/arch/mips/include/asm/bug.h
---- linux-2.6.30.5.orig/arch/mips/include/asm/bug.h 2009-08-16 23:19:38.000000000 +0200
-+++ linux-2.6.30.5/arch/mips/include/asm/bug.h 2009-08-23 19:01:04.000000000 +0200
-@@ -5,6 +5,8 @@
-
- #ifdef CONFIG_BUG
-
-+#include <linux/compiler.h>
-+
- #include <asm/break.h>
-
- static inline void __noreturn BUG(void)
-diff -Nur linux-2.6.30.5.orig/arch/mips/include/asm/mach-lemote/cpu-feature-overrides.h linux-2.6.30.5/arch/mips/include/asm/mach-lemote/cpu-feature-overrides.h
---- linux-2.6.30.5.orig/arch/mips/include/asm/mach-lemote/cpu-feature-overrides.h 2009-08-16 23:19:38.000000000 +0200
-+++ linux-2.6.30.5/arch/mips/include/asm/mach-lemote/cpu-feature-overrides.h 1970-01-01 01:00:00.000000000 +0100
-@@ -1,59 +0,0 @@
--/*
-- * This file is subject to the terms and conditions of the GNU General Public
-- * License. See the file "COPYING" in the main directory of this archive
-- * for more details.
-- *
-- * Copyright (C) 2009 Wu Zhangjin <wuzj@lemote.com>
-- * Copyright (C) 2009 Philippe Vachon <philippe@cowpig.ca>
-- * Copyright (C) 2009 Zhang Le <r0bertz@gentoo.org>
-- *
-- * reference: /proc/cpuinfo,
-- * arch/mips/kernel/cpu-probe.c(cpu_probe_legacy),
-- * arch/mips/kernel/proc.c(show_cpuinfo),
-- * loongson2f user manual.
-- */
--
--#ifndef __ASM_MACH_LEMOTE_CPU_FEATURE_OVERRIDES_H
--#define __ASM_MACH_LEMOTE_CPU_FEATURE_OVERRIDES_H
--
--#define cpu_dcache_line_size() 32
--#define cpu_icache_line_size() 32
--#define cpu_scache_line_size() 32
--
--
--#define cpu_has_32fpr 1
--#define cpu_has_3k_cache 0
--#define cpu_has_4k_cache 1
--#define cpu_has_4kex 1
--#define cpu_has_64bits 1
--#define cpu_has_cache_cdex_p 0
--#define cpu_has_cache_cdex_s 0
--#define cpu_has_counter 1
--#define cpu_has_dc_aliases 1
--#define cpu_has_divec 0
--#define cpu_has_dsp 0
--#define cpu_has_ejtag 0
--#define cpu_has_fpu 1
--#define cpu_has_ic_fills_f_dc 0
--#define cpu_has_inclusive_pcaches 1
--#define cpu_has_llsc 1
--#define cpu_has_mcheck 0
--#define cpu_has_mdmx 0
--#define cpu_has_mips16 0
--#define cpu_has_mips32r1 0
--#define cpu_has_mips32r2 0
--#define cpu_has_mips3d 0
--#define cpu_has_mips64r1 0
--#define cpu_has_mips64r2 0
--#define cpu_has_mipsmt 0
--#define cpu_has_prefetch 0
--#define cpu_has_smartmips 0
--#define cpu_has_tlb 1
--#define cpu_has_tx39_cache 0
--#define cpu_has_userlocal 0
--#define cpu_has_vce 0
--#define cpu_has_vtag_icache 0
--#define cpu_has_watch 1
--#define cpu_icache_snoops_remote_store 1
--
--#endif /* __ASM_MACH_LEMOTE_CPU_FEATURE_OVERRIDES_H */
-diff -Nur linux-2.6.30.5.orig/arch/mips/include/asm/mach-lemote/mc146818rtc.h linux-2.6.30.5/arch/mips/include/asm/mach-lemote/mc146818rtc.h
---- linux-2.6.30.5.orig/arch/mips/include/asm/mach-lemote/mc146818rtc.h 2009-08-16 23:19:38.000000000 +0200
-+++ linux-2.6.30.5/arch/mips/include/asm/mach-lemote/mc146818rtc.h 1970-01-01 01:00:00.000000000 +0100
-@@ -1,36 +0,0 @@
--/*
-- * This file is subject to the terms and conditions of the GNU General Public
-- * License. See the file "COPYING" in the main directory of this archive
-- * for more details.
-- *
-- * Copyright (C) 1998, 2001, 03, 07 by Ralf Baechle (ralf@linux-mips.org)
-- *
-- * RTC routines for PC style attached Dallas chip.
-- */
--#ifndef __ASM_MACH_LEMOTE_MC146818RTC_H
--#define __ASM_MACH_LEMOTE_MC146818RTC_H
--
--#include <linux/io.h>
--
--#define RTC_PORT(x) (0x70 + (x))
--#define RTC_IRQ 8
--
--static inline unsigned char CMOS_READ(unsigned long addr)
--{
-- outb_p(addr, RTC_PORT(0));
-- return inb_p(RTC_PORT(1));
--}
--
--static inline void CMOS_WRITE(unsigned char data, unsigned long addr)
--{
-- outb_p(addr, RTC_PORT(0));
-- outb_p(data, RTC_PORT(1));
--}
--
--#define RTC_ALWAYS_BCD 0
--
--#ifndef mc146818_decode_year
--#define mc146818_decode_year(year) ((year) < 70 ? (year) + 2000 : (year) + 1970)
--#endif
--
--#endif /* __ASM_MACH_LEMOTE_MC146818RTC_H */
-diff -Nur linux-2.6.30.5.orig/arch/mips/include/asm/mach-lemote/pci.h linux-2.6.30.5/arch/mips/include/asm/mach-lemote/pci.h
---- linux-2.6.30.5.orig/arch/mips/include/asm/mach-lemote/pci.h 2009-08-16 23:19:38.000000000 +0200
-+++ linux-2.6.30.5/arch/mips/include/asm/mach-lemote/pci.h 1970-01-01 01:00:00.000000000 +0100
-@@ -1,30 +0,0 @@
--/*
-- * Copyright (c) 2008 Zhang Le <r0bertz@gentoo.org>
-- *
-- * 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., 675 Mass Ave, Cambridge, MA
-- * 02139, USA.
-- */
--
--#ifndef _LEMOTE_PCI_H_
--#define _LEMOTE_PCI_H_
--
--#define LOONGSON2E_PCI_MEM_START 0x14000000UL
--#define LOONGSON2E_PCI_MEM_END 0x1fffffffUL
--#define LOONGSON2E_PCI_IO_START 0x00004000UL
--#define LOONGSON2E_IO_PORT_BASE 0x1fd00000UL
--
--#endif /* !_LEMOTE_PCI_H_ */
-diff -Nur linux-2.6.30.5.orig/arch/mips/include/asm/mach-lemote/war.h linux-2.6.30.5/arch/mips/include/asm/mach-lemote/war.h
---- linux-2.6.30.5.orig/arch/mips/include/asm/mach-lemote/war.h 2009-08-16 23:19:38.000000000 +0200
-+++ linux-2.6.30.5/arch/mips/include/asm/mach-lemote/war.h 1970-01-01 01:00:00.000000000 +0100
-@@ -1,25 +0,0 @@
--/*
-- * This file is subject to the terms and conditions of the GNU General Public
-- * License. See the file "COPYING" in the main directory of this archive
-- * for more details.
-- *
-- * Copyright (C) 2002, 2004, 2007 by Ralf Baechle <ralf@linux-mips.org>
-- */
--#ifndef __ASM_MIPS_MACH_LEMOTE_WAR_H
--#define __ASM_MIPS_MACH_LEMOTE_WAR_H
--
--#define R4600_V1_INDEX_ICACHEOP_WAR 0
--#define R4600_V1_HIT_CACHEOP_WAR 0
--#define R4600_V2_HIT_CACHEOP_WAR 0
--#define R5432_CP0_INTERRUPT_WAR 0
--#define BCM1250_M3_WAR 0
--#define SIBYTE_1956_WAR 0
--#define MIPS4K_ICACHE_REFILL_WAR 0
--#define MIPS_CACHE_SYNC_WAR 0
--#define TX49XX_ICACHE_INDEX_INV_WAR 0
--#define RM9000_CDEX_SMP_WAR 0
--#define ICACHE_REFILLS_WORKAROUND_WAR 0
--#define R10000_LLSC_WAR 0
--#define MIPS34K_MISSED_ITLB_WAR 0
--
--#endif /* __ASM_MIPS_MACH_LEMOTE_WAR_H */
-diff -Nur linux-2.6.30.5.orig/arch/mips/include/asm/mach-loongson/clock.h linux-2.6.30.5/arch/mips/include/asm/mach-loongson/clock.h
---- linux-2.6.30.5.orig/arch/mips/include/asm/mach-loongson/clock.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.30.5/arch/mips/include/asm/mach-loongson/clock.h 2009-08-23 19:01:04.000000000 +0200
-@@ -0,0 +1,64 @@
-+#ifndef __ASM_MIPS_CLOCK_H
-+#define __ASM_MIPS_CLOCK_H
-+
-+#include <linux/kref.h>
-+#include <linux/list.h>
-+#include <linux/seq_file.h>
-+#include <linux/clk.h>
-+
-+extern void (*cpu_wait) (void);
-+
-+struct clk;
-+
-+struct clk_ops {
-+ void (*init) (struct clk *clk);
-+ void (*enable) (struct clk *clk);
-+ void (*disable) (struct clk *clk);
-+ void (*recalc) (struct clk *clk);
-+ int (*set_rate) (struct clk *clk, unsigned long rate, int algo_id);
-+ long (*round_rate) (struct clk *clk, unsigned long rate);
-+};
-+
-+struct clk {
-+ struct list_head node;
-+ const char *name;
-+ int id;
-+ struct module *owner;
-+
-+ struct clk *parent;
-+ struct clk_ops *ops;
-+
-+ struct kref kref;
-+
-+ unsigned long rate;
-+ unsigned long flags;
-+};
-+
-+#define CLK_ALWAYS_ENABLED (1 << 0)
-+#define CLK_RATE_PROPAGATES (1 << 1)
-+
-+/* Should be defined by processor-specific code */
-+void arch_init_clk_ops(struct clk_ops **, int type);
-+
-+int clk_init(void);
-+
-+int __clk_enable(struct clk *);
-+void __clk_disable(struct clk *);
-+
-+void clk_recalc_rate(struct clk *);
-+
-+int clk_register(struct clk *);
-+void clk_unregister(struct clk *);
-+
-+/* the exported API, in addition to clk_set_rate */
-+/**
-+ * clk_set_rate_ex - set the clock rate for a clock source, with additional parameter
-+ * @clk: clock source
-+ * @rate: desired clock rate in Hz
-+ * @algo_id: algorithm id to be passed down to ops->set_rate
-+ *
-+ * Returns success (0) or negative errno.
-+ */
-+int clk_set_rate_ex(struct clk *clk, unsigned long rate, int algo_id);
-+
-+#endif /* __ASM_MIPS_CLOCK_H */
-diff -Nur linux-2.6.30.5.orig/arch/mips/include/asm/mach-loongson/cmdline.h linux-2.6.30.5/arch/mips/include/asm/mach-loongson/cmdline.h
---- linux-2.6.30.5.orig/arch/mips/include/asm/mach-loongson/cmdline.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.30.5/arch/mips/include/asm/mach-loongson/cmdline.h 2009-08-23 19:01:04.000000000 +0200
-@@ -0,0 +1,9 @@
-+/* machine-specific command line initialization */
-+#ifdef CONFIG_SYS_HAS_MACH_PROM_INIT_CMDLINE
-+extern void __init mach_prom_init_cmdline(void);
-+#else
-+void __init mach_prom_init_cmdline(void)
-+{
-+}
-+#endif
-+
-diff -Nur linux-2.6.30.5.orig/arch/mips/include/asm/mach-loongson/cpu-feature-overrides.h linux-2.6.30.5/arch/mips/include/asm/mach-loongson/cpu-feature-overrides.h
---- linux-2.6.30.5.orig/arch/mips/include/asm/mach-loongson/cpu-feature-overrides.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.30.5/arch/mips/include/asm/mach-loongson/cpu-feature-overrides.h 2009-08-23 19:01:04.000000000 +0200
-@@ -0,0 +1,59 @@
-+/*
-+ * This file is subject to the terms and conditions of the GNU General Public
-+ * License. See the file "COPYING" in the main directory of this archive
-+ * for more details.
-+ *
-+ * Copyright (C) 2009 Wu Zhangjin <wuzj@lemote.com>
-+ * Copyright (C) 2009 Philippe Vachon <philippe@cowpig.ca>
-+ * Copyright (C) 2009 Zhang Le <r0bertz@gentoo.org>
-+ *
-+ * reference: /proc/cpuinfo,
-+ * arch/mips/kernel/cpu-probe.c(cpu_probe_legacy),
-+ * arch/mips/kernel/proc.c(show_cpuinfo),
-+ * loongson2f user manual.
-+ */
-+
-+#ifndef __ASM_MACH_LEMOTE_CPU_FEATURE_OVERRIDES_H
-+#define __ASM_MACH_LEMOTE_CPU_FEATURE_OVERRIDES_H
-+
-+#define cpu_dcache_line_size() 32
-+#define cpu_icache_line_size() 32
-+#define cpu_scache_line_size() 32
-+
-+
-+#define cpu_has_32fpr 1
-+#define cpu_has_3k_cache 0
-+#define cpu_has_4k_cache 1
-+#define cpu_has_4kex 1
-+#define cpu_has_64bits 1
-+#define cpu_has_cache_cdex_p 0
-+#define cpu_has_cache_cdex_s 0
-+#define cpu_has_counter 1
-+#define cpu_has_dc_aliases 1
-+#define cpu_has_divec 0
-+#define cpu_has_dsp 0
-+#define cpu_has_ejtag 0
-+#define cpu_has_fpu 1
-+#define cpu_has_ic_fills_f_dc 0
-+#define cpu_has_inclusive_pcaches 1
-+#define cpu_has_llsc 1
-+#define cpu_has_mcheck 0
-+#define cpu_has_mdmx 0
-+#define cpu_has_mips16 0
-+#define cpu_has_mips32r1 0
-+#define cpu_has_mips32r2 0
-+#define cpu_has_mips3d 0
-+#define cpu_has_mips64r1 0
-+#define cpu_has_mips64r2 0
-+#define cpu_has_mipsmt 0
-+#define cpu_has_prefetch 0
-+#define cpu_has_smartmips 0
-+#define cpu_has_tlb 1
-+#define cpu_has_tx39_cache 0
-+#define cpu_has_userlocal 0
-+#define cpu_has_vce 0
-+#define cpu_has_vtag_icache 0
-+#define cpu_has_watch 1
-+#define cpu_icache_snoops_remote_store 1
-+
-+#endif /* __ASM_MACH_LEMOTE_CPU_FEATURE_OVERRIDES_H */
-diff -Nur linux-2.6.30.5.orig/arch/mips/include/asm/mach-loongson/cs5536/cs5536.h linux-2.6.30.5/arch/mips/include/asm/mach-loongson/cs5536/cs5536.h
---- linux-2.6.30.5.orig/arch/mips/include/asm/mach-loongson/cs5536/cs5536.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.30.5/arch/mips/include/asm/mach-loongson/cs5536/cs5536.h 2009-08-23 19:01:04.000000000 +0200
-@@ -0,0 +1,382 @@
-+/*
-+ * The header file of cs5536 sourth bridge.
-+ *
-+ * Copyright (C) 2007 Lemote, Inc. & Institute of Computing Technology
-+ * Author : jlliu <liujl@lemote.com>
-+ */
-+
-+#ifndef _CS5536_H
-+#define _CS5536_H
-+
-+#include <linux/types.h>
-+
-+extern void _rdmsr(u32 msr, u32 *hi, u32 *lo);
-+extern void _wrmsr(u32 msr, u32 hi, u32 lo);
-+
-+/*
-+ * MSR module base
-+ */
-+#define CS5536_SB_MSR_BASE (0x00000000)
-+#define CS5536_GLIU_MSR_BASE (0x10000000)
-+#define CS5536_ILLEGAL_MSR_BASE (0x20000000)
-+#define CS5536_USB_MSR_BASE (0x40000000)
-+#define CS5536_IDE_MSR_BASE (0x60000000)
-+#define CS5536_DIVIL_MSR_BASE (0x80000000)
-+#define CS5536_ACC_MSR_BASE (0xa0000000)
-+#define CS5536_UNUSED_MSR_BASE (0xc0000000)
-+#define CS5536_GLCP_MSR_BASE (0xe0000000)
-+
-+#define SB_MSR_REG(offset) (CS5536_SB_MSR_BASE | (offset))
-+#define GLIU_MSR_REG(offset) (CS5536_GLIU_MSR_BASE | (offset))
-+#define ILLEGAL_MSR_REG(offset) (CS5536_ILLEGAL_MSR_BASE | (offset))
-+#define USB_MSR_REG(offset) (CS5536_USB_MSR_BASE | (offset))
-+#define IDE_MSR_REG(offset) (CS5536_IDE_MSR_BASE | (offset))
-+#define DIVIL_MSR_REG(offset) (CS5536_DIVIL_MSR_BASE | (offset))
-+#define ACC_MSR_REG(offset) (CS5536_ACC_MSR_BASE | (offset))
-+#define UNUSED_MSR_REG(offset) (CS5536_UNUSED_MSR_BASE | (offset))
-+#define GLCP_MSR_REG(offset) (CS5536_GLCP_MSR_BASE | (offset))
-+
-+/*
-+ * BAR SPACE OF VIRTUAL PCI :
-+ * range for pci probe use, length is the actual size.
-+ */
-+/* IO space for all DIVIL modules */
-+#define CS5536_IRQ_RANGE 0xffffffe0 /* USERD FOR PCI PROBE */
-+#define CS5536_IRQ_LENGTH 0x20 /* THE REGS ACTUAL LENGTH */
-+#define CS5536_SMB_RANGE 0xfffffff8
-+#define CS5536_SMB_LENGTH 0x08
-+#define CS5536_GPIO_RANGE 0xffffff00
-+#define CS5536_GPIO_LENGTH 0x100
-+#define CS5536_MFGPT_RANGE 0xffffffc0
-+#define CS5536_MFGPT_LENGTH 0x40
-+#define CS5536_ACPI_RANGE 0xffffffe0
-+#define CS5536_ACPI_LENGTH 0x20
-+#define CS5536_PMS_RANGE 0xffffff80
-+#define CS5536_PMS_LENGTH 0x80
-+/* MEM space for 4KB nand flash; IO space for 16B nor flash. */
-+#ifdef CS5536_NOR_FLASH
-+#define CS5536_FLSH_LENGTH 0x10
-+#define CS5536_FLSH_RANGE 0xfffffff0
-+#else
-+#define CS5536_FLSH_RANGE 0xfffff000
-+#define CS5536_FLSH_LENGTH 0x1000
-+#endif
-+/* IO space for IDE */
-+#define CS5536_IDE_RANGE 0xfffffff0
-+#define CS5536_IDE_LENGTH 0x10
-+/* IO space for ACC */
-+#define CS5536_ACC_RANGE 0xffffff80
-+#define CS5536_ACC_LENGTH 0x80
-+/* MEM space for ALL USB modules */
-+#define CS5536_OHCI_RANGE 0xfffff000
-+#define CS5536_OHCI_LENGTH 0x1000
-+#define CS5536_EHCI_RANGE 0xfffff000
-+#define CS5536_EHCI_LENGTH 0x1000
-+#define CS5536_UDC_RANGE 0xffffe000
-+#define CS5536_UDC_LENGTH 0x2000
-+#define CS5536_OTG_RANGE 0xfffff000
-+#define CS5536_OTG_LENGTH 0x1000
-+
-+/*
-+ * PCI MSR ACCESS
-+ */
-+#define PCI_MSR_CTRL 0xF0
-+#define PCI_MSR_ADDR 0xF4
-+#define PCI_MSR_DATA_LO 0xF8
-+#define PCI_MSR_DATA_HI 0xFC
-+
-+/**************** MSR *****************************/
-+
-+/*
-+ * GLIU STANDARD MSR
-+ */
-+#define GLIU_CAP 0x00
-+#define GLIU_CONFIG 0x01
-+#define GLIU_SMI 0x02
-+#define GLIU_ERROR 0x03
-+#define GLIU_PM 0x04
-+#define GLIU_DIAG 0x05
-+
-+/*
-+ * GLIU SPEC. MSR
-+ */
-+#define GLIU_P2D_BM0 0x20
-+#define GLIU_P2D_BM1 0x21
-+#define GLIU_P2D_BM2 0x22
-+#define GLIU_P2D_BMK0 0x23
-+#define GLIU_P2D_BMK1 0x24
-+#define GLIU_P2D_BM3 0x25
-+#define GLIU_P2D_BM4 0x26
-+#define GLIU_COH 0x80
-+#define GLIU_PAE 0x81
-+#define GLIU_ARB 0x82
-+#define GLIU_ASMI 0x83
-+#define GLIU_AERR 0x84
-+#define GLIU_DEBUG 0x85
-+#define GLIU_PHY_CAP 0x86
-+#define GLIU_NOUT_RESP 0x87
-+#define GLIU_NOUT_WDATA 0x88
-+#define GLIU_WHOAMI 0x8B
-+#define GLIU_SLV_DIS 0x8C
-+#define GLIU_IOD_BM0 0xE0
-+#define GLIU_IOD_BM1 0xE1
-+#define GLIU_IOD_BM2 0xE2
-+#define GLIU_IOD_BM3 0xE3
-+#define GLIU_IOD_BM4 0xE4
-+#define GLIU_IOD_BM5 0xE5
-+#define GLIU_IOD_BM6 0xE6
-+#define GLIU_IOD_BM7 0xE7
-+#define GLIU_IOD_BM8 0xE8
-+#define GLIU_IOD_BM9 0xE9
-+#define GLIU_IOD_SC0 0xEA
-+#define GLIU_IOD_SC1 0xEB
-+#define GLIU_IOD_SC2 0xEC
-+#define GLIU_IOD_SC3 0xED
-+#define GLIU_IOD_SC4 0xEE
-+#define GLIU_IOD_SC5 0xEF
-+#define GLIU_IOD_SC6 0xF0
-+#define GLIU_IOD_SC7 0xF1
-+
-+/*
-+ * SB STANDARD
-+ */
-+#define SB_CAP 0x00
-+#define SB_CONFIG 0x01
-+#define SB_SMI 0x02
-+#define SB_ERROR 0x03
-+#define SB_MAR_ERR_EN 0x00000001
-+#define SB_TAR_ERR_EN 0x00000002
-+#define SB_RSVD_BIT1 0x00000004
-+#define SB_EXCEP_ERR_EN 0x00000008
-+#define SB_SYSE_ERR_EN 0x00000010
-+#define SB_PARE_ERR_EN 0x00000020
-+#define SB_TAS_ERR_EN 0x00000040
-+#define SB_MAR_ERR_FLAG 0x00010000
-+#define SB_TAR_ERR_FLAG 0x00020000
-+#define SB_RSVD_BIT2 0x00040000
-+#define SB_EXCEP_ERR_FLAG 0x00080000
-+#define SB_SYSE_ERR_FLAG 0x00100000
-+#define SB_PARE_ERR_FLAG 0x00200000
-+#define SB_TAS_ERR_FLAG 0x00400000
-+#define SB_PM 0x04
-+#define SB_DIAG 0x05
-+
-+/*
-+ * SB SPEC.
-+ */
-+#define SB_CTRL 0x10
-+#define SB_R0 0x20
-+#define SB_R1 0x21
-+#define SB_R2 0x22
-+#define SB_R3 0x23
-+#define SB_R4 0x24
-+#define SB_R5 0x25
-+#define SB_R6 0x26
-+#define SB_R7 0x27
-+#define SB_R8 0x28
-+#define SB_R9 0x29
-+#define SB_R10 0x2A
-+#define SB_R11 0x2B
-+#define SB_R12 0x2C
-+#define SB_R13 0x2D
-+#define SB_R14 0x2E
-+#define SB_R15 0x2F
-+
-+/*
-+ * GLCP STANDARD
-+ */
-+#define GLCP_CAP 0x00
-+#define GLCP_CONFIG 0x01
-+#define GLCP_SMI 0x02
-+#define GLCP_ERROR 0x03
-+#define GLCP_PM 0x04
-+#define GLCP_DIAG 0x05
-+
-+/*
-+ * GLCP SPEC.
-+ */
-+#define GLCP_CLK_DIS_DELAY 0x08
-+#define GLCP_PM_CLK_DISABLE 0x09
-+#define GLCP_GLB_PM 0x0B
-+#define GLCP_DBG_OUT 0x0C
-+#define GLCP_RSVD1 0x0D
-+#define GLCP_SOFT_COM 0x0E
-+#define SOFT_BAR_SMB_FLAG 0x00000001
-+#define SOFT_BAR_GPIO_FLAG 0x00000002
-+#define SOFT_BAR_MFGPT_FLAG 0x00000004
-+#define SOFT_BAR_IRQ_FLAG 0x00000008
-+#define SOFT_BAR_PMS_FLAG 0x00000010
-+#define SOFT_BAR_ACPI_FLAG 0x00000020
-+#define SOFT_BAR_FLSH0_FLAG 0x00000040
-+#define SOFT_BAR_FLSH1_FLAG 0x00000080
-+#define SOFT_BAR_FLSH2_FLAG 0x00000100
-+#define SOFT_BAR_FLSH3_FLAG 0x00000200
-+#define SOFT_BAR_IDE_FLAG 0x00000400
-+#define SOFT_BAR_ACC_FLAG 0x00000800
-+#define SOFT_BAR_OHCI_FLAG 0x00001000
-+#define SOFT_BAR_EHCI_FLAG 0x00002000
-+#define SOFT_BAR_UDC_FLAG 0x00004000
-+#define SOFT_BAR_OTG_FLAG 0x00008000
-+#define GLCP_RSVD2 0x0F
-+#define GLCP_CLK_OFF 0x10
-+#define GLCP_CLK_ACTIVE 0x11
-+#define GLCP_CLK_DISABLE 0x12
-+#define GLCP_CLK4ACK 0x13
-+#define GLCP_SYS_RST 0x14
-+#define GLCP_RSVD3 0x15
-+#define GLCP_DBG_CLK_CTRL 0x16
-+#define GLCP_CHIP_REV_ID 0x17
-+
-+/*
-+ * DIVIL STANDARD
-+ */
-+#define DIVIL_CAP 0x00
-+#define DIVIL_CONFIG 0x01
-+#define DIVIL_SMI 0x02
-+#define DIVIL_ERROR 0x03
-+#define DIVIL_PM 0x04
-+#define DIVIL_DIAG 0x05
-+
-+/*
-+ * DIVIL SPEC.
-+ */
-+#define DIVIL_LBAR_IRQ 0x08
-+#define DIVIL_LBAR_KEL 0x09
-+#define DIVIL_LBAR_SMB 0x0B
-+#define DIVIL_LBAR_GPIO 0x0C
-+#define DIVIL_LBAR_MFGPT 0x0D
-+#define DIVIL_LBAR_ACPI 0x0E
-+#define DIVIL_LBAR_PMS 0x0F
-+#define DIVIL_LBAR_FLSH0 0x10
-+#define DIVIL_LBAR_FLSH1 0x11
-+#define DIVIL_LBAR_FLSH2 0x12
-+#define DIVIL_LBAR_FLSH3 0x13
-+#define DIVIL_LEG_IO 0x14
-+#define DIVIL_BALL_OPTS 0x15
-+#define DIVIL_SOFT_IRQ 0x16
-+#define DIVIL_SOFT_RESET 0x17
-+/* NOR FLASH */
-+#define NORF_CTRL 0x18
-+#define NORF_T01 0x19
-+#define NORF_T23 0x1A
-+/* NAND FLASH */
-+#define NANDF_DATA 0x1B
-+#define NANDF_CTRL 0x1C
-+#define NANDF_RSVD 0x1D
-+/* KEL Keyboard Emulation Logic */
-+#define KEL_CTRL 0x1F
-+/* PIC */
-+#define PIC_YSEL_LOW 0x20
-+#define PIC_YSEL_LOW_USB_SHIFT 8
-+#define PIC_YSEL_LOW_ACC_SHIFT 16
-+#define PIC_YSEL_LOW_FLASH_SHIFT 24
-+#define PIC_YSEL_HIGH 0x21
-+#define PIC_ZSEL_LOW 0x22
-+#define PIC_ZSEL_HIGH 0x23
-+#define PIC_IRQM_PRIM 0x24
-+#define PIC_IRQM_LPC 0x25
-+#define PIC_XIRR_STS_LOW 0x26
-+#define PIC_XIRR_STS_HIGH 0x27
-+#define PCI_SHDW 0x34
-+/* MFGPT */
-+#define MFGPT_IRQ 0x28
-+#define MFGPT_NR 0x29
-+#define MFGPT_RSVD 0x2A
-+#define MFGPT_SETUP 0x2B
-+/* FLOPPY */
-+#define FLPY_3F2_SHDW 0x30
-+#define FLPY_3F7_SHDW 0x31
-+#define FLPY_372_SHDW 0x32
-+#define FLPY_377_SHDW 0x33
-+/* PIT */
-+#define PIT_SHDW 0x36
-+#define PIT_CNTRL 0x37
-+/* UART */
-+#define UART1_MOD 0x38
-+#define UART1_DONG 0x39
-+#define UART1_CONF 0x3A
-+#define UART1_RSVD 0x3B
-+#define UART2_MOD 0x3C
-+#define UART2_DONG 0x3D
-+#define UART2_CONF 0x3E
-+#define UART2_RSVD 0x3F
-+/* DMA */
-+#define DIVIL_AC_DMA 0x1E
-+#define DMA_MAP 0x40
-+#define DMA_SHDW_CH0 0x41
-+#define DMA_SHDW_CH1 0x42
-+#define DMA_SHDW_CH2 0x43
-+#define DMA_SHDW_CH3 0x44
-+#define DMA_SHDW_CH4 0x45
-+#define DMA_SHDW_CH5 0x46
-+#define DMA_SHDW_CH6 0x47
-+#define DMA_SHDW_CH7 0x48
-+#define DMA_MSK_SHDW 0x49
-+/* LPC */
-+#define LPC_EADDR 0x4C
-+#define LPC_ESTAT 0x4D
-+#define LPC_SIRQ 0x4E
-+#define LPC_RSVD 0x4F
-+/* PMC */
-+#define PMC_LTMR 0x50
-+#define PMC_RSVD 0x51
-+/* RTC */
-+#define RTC_RAM_LOCK 0x54
-+#define RTC_DOMA_OFFSET 0x55
-+#define RTC_MONA_OFFSET 0x56
-+#define RTC_CEN_OFFSET 0x57
-+
-+/*
-+ * IDE STANDARD
-+ */
-+#define IDE_CAP 0x00
-+#define IDE_CONFIG 0x01
-+#define IDE_SMI 0x02
-+#define IDE_ERROR 0x03
-+#define IDE_PM 0x04
-+#define IDE_DIAG 0x05
-+
-+/*
-+ * IDE SPEC.
-+ */
-+#define IDE_IO_BAR 0x08
-+#define IDE_CFG 0x10
-+#define IDE_DTC 0x12
-+#define IDE_CAST 0x13
-+#define IDE_ETC 0x14
-+#define IDE_INTERNAL_PM 0x15
-+
-+/*
-+ * ACC STANDARD
-+ */
-+#define ACC_CAP 0x00
-+#define ACC_CONFIG 0x01
-+#define ACC_SMI 0x02
-+#define ACC_ERROR 0x03
-+#define ACC_PM 0x04
-+#define ACC_DIAG 0x05
-+
-+/*
-+ * USB STANDARD
-+ */
-+#define USB_CAP 0x00
-+#define USB_CONFIG 0x01
-+#define USB_SMI 0x02
-+#define USB_ERROR 0x03
-+#define USB_PM 0x04
-+#define USB_DIAG 0x05
-+
-+/*
-+ * USB SPEC.
-+ */
-+#define USB_OHCI 0x08
-+#define USB_EHCI 0x09
-+#define USB_UDC 0x0A
-+#define USB_OTG 0x0B
-+
-+/****************** NATIVE ***************************/
-+/* GPIO : I/O SPACE; REG : 32BITS */
-+#define GPIOL_OUT_VAL 0x00
-+#define GPIOL_OUT_EN 0x04
-+
-+#endif /* _CS5536_H */
-diff -Nur linux-2.6.30.5.orig/arch/mips/include/asm/mach-loongson/cs5536/cs5536_mfgpt.h linux-2.6.30.5/arch/mips/include/asm/mach-loongson/cs5536/cs5536_mfgpt.h
---- linux-2.6.30.5.orig/arch/mips/include/asm/mach-loongson/cs5536/cs5536_mfgpt.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.30.5/arch/mips/include/asm/mach-loongson/cs5536/cs5536_mfgpt.h 2009-08-23 19:01:04.000000000 +0200
-@@ -0,0 +1,27 @@
-+/*
-+ * cs5536 mfgpt header file
-+ */
-+
-+#ifndef _CS5536_MFGPT_H
-+#define _CS5536_MFGPT_H
-+
-+#include <cs5536/cs5536.h>
-+
-+extern u32 mfgpt_base;
-+extern void setup_mfgpt_timer(void);
-+
-+#if 1
-+#define MFGPT_TICK_RATE 14318000
-+#else
-+#define MFGPT_TICK_RATE (14318180 / 8)
-+#endif
-+#define COMPARE ((MFGPT_TICK_RATE + HZ/2) / HZ)
-+
-+#define CS5536_MFGPT_INTR 5
-+
-+#define MFGPT_BASE mfgpt_base
-+#define MFGPT0_CMP2 (MFGPT_BASE + 2)
-+#define MFGPT0_CNT (MFGPT_BASE + 4)
-+#define MFGPT0_SETUP (MFGPT_BASE + 6)
-+
-+#endif /*!_CS5536_MFGPT_H */
-diff -Nur linux-2.6.30.5.orig/arch/mips/include/asm/mach-loongson/cs5536/cs5536_pci.h linux-2.6.30.5/arch/mips/include/asm/mach-loongson/cs5536/cs5536_pci.h
---- linux-2.6.30.5.orig/arch/mips/include/asm/mach-loongson/cs5536/cs5536_pci.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.30.5/arch/mips/include/asm/mach-loongson/cs5536/cs5536_pci.h 2009-08-23 19:01:04.000000000 +0200
-@@ -0,0 +1,174 @@
-+/*
-+ * the definition file of cs5536 Virtual Support Module(VSM).
-+ * pci configuration space can be accessed through the VSM, so
-+ * there is no need of the MSR read/write now, except the spec.
-+ * MSR registers which are not implemented yet.
-+ *
-+ * Copyright (C) 2007 Lemote Inc. & Insititute of Computing Technology
-+ * Author : jlliu, liujl@lemote.com
-+ */
-+
-+#ifndef _CS5536_PCI_H
-+#define _CS5536_PCI_H
-+
-+#include <linux/types.h>
-+#include <linux/pci_regs.h>
-+
-+extern void cs5536_pci_conf_write4(int function, int reg, u32 value);
-+extern u32 cs5536_pci_conf_read4(int function, int reg);
-+
-+#define CS5536_FLASH_INTR 6
-+#define CS5536_ACC_INTR 9
-+#define CS5536_IDE_INTR 14
-+#define CS5536_USB_INTR 11
-+#define CS5536_UART1_INTR 4
-+#define CS5536_UART2_INTR 3
-+
-+/************** PCI BUS DEVICE FUNCTION ***************/
-+
-+/*
-+ * PCI bus device function
-+ */
-+#define PCI_BUS_CS5536 0
-+#define PCI_IDSEL_CS5536 14
-+
-+/********** STANDARD PCI-2.2 EXPANSION ****************/
-+
-+/*
-+ * PCI configuration space
-+ * we have to virtualize the PCI configure space head, so we should
-+ * define the necessary IDs and some others.
-+ */
-+
-+/* CONFIG of PCI VENDOR ID*/
-+#define CFG_PCI_VENDOR_ID(mod_dev_id, sys_vendor_id) \
-+ (((mod_dev_id) << 16) | (sys_vendor_id))
-+
-+/* VENDOR ID */
-+#define CS5536_VENDOR_ID 0x1022
-+
-+/* DEVICE ID */
-+#define CS5536_ISA_DEVICE_ID 0x2090
-+#define CS5536_FLASH_DEVICE_ID 0x2091
-+#define CS5536_IDE_DEVICE_ID 0x209a
-+#define CS5536_ACC_DEVICE_ID 0x2093
-+#define CS5536_OHCI_DEVICE_ID 0x2094
-+#define CS5536_EHCI_DEVICE_ID 0x2095
-+#define CS5536_UDC_DEVICE_ID 0x2096
-+#define CS5536_OTG_DEVICE_ID 0x2097
-+
-+/* CLASS CODE : CLASS SUB-CLASS INTERFACE */
-+#define CS5536_ISA_CLASS_CODE 0x060100
-+#define CS5536_FLASH_CLASS_CODE 0x050100
-+#define CS5536_IDE_CLASS_CODE 0x010180
-+#define CS5536_ACC_CLASS_CODE 0x040100
-+#define CS5536_OHCI_CLASS_CODE 0x0C0310
-+#define CS5536_EHCI_CLASS_CODE 0x0C0320
-+#define CS5536_UDC_CLASS_CODE 0x0C03FE
-+#define CS5536_OTG_CLASS_CODE 0x0C0380
-+
-+/* BHLC : BIST HEADER-TYPE LATENCY-TIMER CACHE-LINE-SIZE */
-+
-+#define CFG_PCI_CACHE_LINE_SIZE(header_type, latency_timer) \
-+ ((PCI_NONE_BIST << 24) | ((header_type) << 16) \
-+ | ((latency_timer) << 8) | PCI_NORMAL_CACHE_LINE_SIZE);
-+
-+#define PCI_NONE_BIST 0x00 /* RO not implemented yet. */
-+#define PCI_BRIDGE_HEADER_TYPE 0x80 /* RO */
-+#define PCI_NORMAL_HEADER_TYPE 0x00
-+#define PCI_NORMAL_LATENCY_TIMER 0x00
-+#define PCI_NORMAL_CACHE_LINE_SIZE 0x08 /* RW */
-+
-+/* BAR */
-+#define PCI_BAR0_REG 0x10
-+#define PCI_BAR1_REG 0x14
-+#define PCI_BAR2_REG 0x18
-+#define PCI_BAR3_REG 0x1c
-+#define PCI_BAR4_REG 0x20
-+#define PCI_BAR5_REG 0x24
-+#define PCI_BAR_COUNT 6
-+#define PCI_BAR_RANGE_MASK 0xFFFFFFFF
-+
-+/* CARDBUS CIS POINTER */
-+#define PCI_CARDBUS_CIS_POINTER 0x00000000
-+
-+/* SUBSYSTEM VENDOR ID */
-+#define CS5536_SUB_VENDOR_ID CS5536_VENDOR_ID
-+
-+/* SUBSYSTEM ID */
-+#define CS5536_ISA_SUB_ID CS5536_ISA_DEVICE_ID
-+#define CS5536_FLASH_SUB_ID CS5536_FLASH_DEVICE_ID
-+#define CS5536_IDE_SUB_ID CS5536_IDE_DEVICE_ID
-+#define CS5536_ACC_SUB_ID CS5536_ACC_DEVICE_ID
-+#define CS5536_OHCI_SUB_ID CS5536_OHCI_DEVICE_ID
-+#define CS5536_EHCI_SUB_ID CS5536_EHCI_DEVICE_ID
-+#define CS5536_UDC_SUB_ID CS5536_UDC_DEVICE_ID
-+#define CS5536_OTG_SUB_ID CS5536_OTG_DEVICE_ID
-+
-+/* EXPANSION ROM BAR */
-+#define PCI_EXPANSION_ROM_BAR 0x00000000
-+
-+/* CAPABILITIES POINTER */
-+#define PCI_CAPLIST_POINTER 0x00000000
-+#define PCI_CAPLIST_USB_POINTER 0x40
-+/* INTERRUPT */
-+
-+#define CFG_PCI_INTERRUPT_LINE(pin, mod_intr) \
-+ ((PCI_MAX_LATENCY << 24) | (PCI_MIN_GRANT << 16) | \
-+ ((pin) << 8) | (mod_intr))
-+
-+#define PCI_MAX_LATENCY 0x40
-+#define PCI_MIN_GRANT 0x00
-+#define PCI_DEFAULT_PIN 0x01
-+
-+/*********** EXPANSION PCI REG ************************/
-+
-+/*
-+ * ISA EXPANSION
-+ */
-+#define PCI_UART1_INT_REG 0x50
-+#define PCI_UART2_INT_REG 0x54
-+#define PCI_ISA_FIXUP_REG 0x58
-+
-+/*
-+ * FLASH EXPANSION
-+ */
-+#define PCI_FLASH_INT_REG 0x50
-+#define PCI_NOR_FLASH_CTRL_REG 0x40
-+#define PCI_NOR_FLASH_T01_REG 0x44
-+#define PCI_NOR_FLASH_T23_REG 0x48
-+#define PCI_NAND_FLASH_TDATA_REG 0x60
-+#define PCI_NAND_FLASH_TCTRL_REG 0x64
-+#define PCI_NAND_FLASH_RSVD_REG 0x68
-+#define PCI_FLASH_SELECT_REG 0x70
-+
-+/*
-+ * IDE EXPANSION
-+ */
-+#define PCI_IDE_CFG_REG 0x40
-+#define CS5536_IDE_FLASH_SIGNATURE 0xDEADBEEF
-+#define PCI_IDE_DTC_REG 0x48
-+#define PCI_IDE_CAST_REG 0x4C
-+#define PCI_IDE_ETC_REG 0x50
-+#define PCI_IDE_PM_REG 0x54
-+#define PCI_IDE_INT_REG 0x60
-+
-+/*
-+ * ACC EXPANSION
-+ */
-+#define PCI_ACC_INT_REG 0x50
-+
-+/*
-+ * OHCI EXPANSION : INTTERUPT IS IMPLEMENTED BY THE OHCI
-+ */
-+#define PCI_OHCI_PM_REG 0x40
-+#define PCI_OHCI_INT_REG 0x50
-+
-+/*
-+ * EHCI EXPANSION
-+ */
-+#define PCI_EHCI_LEGSMIEN_REG 0x50
-+#define PCI_EHCI_LEGSMISTS_REG 0x54
-+#define PCI_EHCI_FLADJ_REG 0x60
-+
-+#endif /* _CS5536_PCI_H_ */
-diff -Nur linux-2.6.30.5.orig/arch/mips/include/asm/mach-loongson/cs5536/cs5536_vsm.h linux-2.6.30.5/arch/mips/include/asm/mach-loongson/cs5536/cs5536_vsm.h
---- linux-2.6.30.5.orig/arch/mips/include/asm/mach-loongson/cs5536/cs5536_vsm.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.30.5/arch/mips/include/asm/mach-loongson/cs5536/cs5536_vsm.h 2009-08-23 19:01:04.000000000 +0200
-@@ -0,0 +1,59 @@
-+/*
-+ * the Virtual Support Module(VSM) read/write interfaces
-+ *
-+ * Copyright (C) 2009 Lemote, Inc. & Institute of Computing Technology
-+ * Author: Wu Zhangjin <wuzj@lemote.com>
-+ */
-+
-+#ifndef _CS5536_VSM_H
-+#define _CS5536_VSM_H
-+
-+#include <linux/types.h>
-+
-+#define DECLARE_CS5536_MODULE(name) \
-+extern void pci_##name##_write_reg(int reg, u32 value); \
-+extern u32 pci_##name##_read_reg(int reg);
-+
-+#define DEFINE_CS5536_MODULE(name) \
-+void pci_##name##_write_reg(int reg, u32 value)\
-+{ \
-+ return; \
-+} \
-+u32 pci_##name##_read_reg(int reg) \
-+{ \
-+ return 0xffffffff; \
-+} \
-+
-+/* core modules of cs5536 */
-+
-+/* ide module */
-+DECLARE_CS5536_MODULE(ide)
-+/* acc module */
-+DECLARE_CS5536_MODULE(acc)
-+/* ohci module */
-+DECLARE_CS5536_MODULE(ohci)
-+/* isa module */
-+DECLARE_CS5536_MODULE(isa)
-+/* ehci module */
-+DECLARE_CS5536_MODULE(ehci)
-+
-+/* selective modules of cs5536 */
-+/* flash(nor or nand flash) module */
-+#ifdef CONFIG_CS5536_FLASH
-+ DECLARE_CS5536_MODULE(flash)
-+#else
-+ DEFINE_CS5536_MODULE(flash)
-+#endif
-+/* otg module */
-+#ifdef CONFIG_CS5536_OTG
-+ DECLARE_CS5536_MODULE(otg)
-+#else
-+ DEFINE_CS5536_MODULE(otg)
-+#endif
-+/* udc module */
-+#ifdef CONFIG_CS5536_UDC
-+ DECLARE_CS5536_MODULE(udc)
-+#else
-+ DEFINE_CS5536_MODULE(udc)
-+#endif
-+#endif /* _CS5536_VSM_H */
-diff -Nur linux-2.6.30.5.orig/arch/mips/include/asm/mach-loongson/dbg.h linux-2.6.30.5/arch/mips/include/asm/mach-loongson/dbg.h
---- linux-2.6.30.5.orig/arch/mips/include/asm/mach-loongson/dbg.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.30.5/arch/mips/include/asm/mach-loongson/dbg.h 2009-08-23 19:01:04.000000000 +0200
-@@ -0,0 +1,17 @@
-+/*
-+ * Copyright (C) 2009 Lemote Inc. & Insititute of Computing Technology
-+ *
-+ * 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.
-+ */
-+
-+#ifndef _ASM_MACH_LOONGSON_DBG_H_
-+#define _ASM_MACH_LOONGSON_DBG_H_
-+
-+/* serial port print support */
-+extern void prom_putchar(char c);
-+extern void prom_printf(char *fmt, ...);
-+
-+#endif /* _ASM_MACH_LOONGSON_DBG_H_ */
-diff -Nur linux-2.6.30.5.orig/arch/mips/include/asm/mach-loongson/dma-coherence.h linux-2.6.30.5/arch/mips/include/asm/mach-loongson/dma-coherence.h
---- linux-2.6.30.5.orig/arch/mips/include/asm/mach-loongson/dma-coherence.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.30.5/arch/mips/include/asm/mach-loongson/dma-coherence.h 2009-08-23 19:01:04.000000000 +0200
-@@ -0,0 +1,70 @@
-+/*
-+ * This file is subject to the terms and conditions of the GNU General Public
-+ * License. See the file "COPYING" in the main directory of this archive
-+ * for more details.
-+ *
-+ * Copyright (C) 2006, 07 Ralf Baechle <ralf@linux-mips.org>
-+ * Copyright (C) 2007 Lemote, Inc. & Institute of Computing Technology
-+ * Author: Fuxin Zhang, zhangfx@lemote.com
-+ *
-+ */
-+#ifndef __ASM_MACH_LOONGSON_DMA_COHERENCE_H
-+#define __ASM_MACH_LOONGSON_DMA_COHERENCE_H
-+
-+struct device;
-+
-+static inline dma_addr_t plat_map_dma_mem(struct device *dev, void *addr,
-+ size_t size)
-+{
-+ return virt_to_phys(addr) | 0x80000000;
-+}
-+
-+static inline dma_addr_t plat_map_dma_mem_page(struct device *dev,
-+ struct page *page)
-+{
-+ return page_to_phys(page) | 0x80000000;
-+}
-+
-+static inline unsigned long plat_dma_addr_to_phys(dma_addr_t dma_addr)
-+{
-+#if defined(CONFIG_CPU_LOONGSON2F) && defined(CONFIG_64BIT)
-+ return (dma_addr > 0x8fffffff) ? dma_addr : (dma_addr & 0x0fffffff);
-+#else
-+ return dma_addr & 0x7fffffff;
-+#endif
-+}
-+
-+static inline void plat_unmap_dma_mem(struct device *dev, dma_addr_t dma_addr)
-+{
-+}
-+
-+static inline int plat_dma_supported(struct device *dev, u64 mask)
-+{
-+ /*
-+ * we fall back to GFP_DMA when the mask isn't all 1s,
-+ * so we can't guarantee allocations that must be
-+ * within a tighter range than GFP_DMA..
-+ */
-+ if (mask < DMA_BIT_MASK(24))
-+ return 0;
-+
-+ return 1;
-+}
-+
-+static inline void plat_extra_sync_for_device(struct device *dev)
-+{
-+ return;
-+}
-+
-+static inline int plat_dma_mapping_error(struct device *dev,
-+ dma_addr_t dma_addr)
-+{
-+ return 0;
-+}
-+
-+static inline int plat_device_is_coherent(struct device *dev)
-+{
-+ return 0;
-+}
-+
-+#endif /* __ASM_MACH_LOONGSON_DMA_COHERENCE_H */
-diff -Nur linux-2.6.30.5.orig/arch/mips/include/asm/mach-loongson/loongson.h linux-2.6.30.5/arch/mips/include/asm/mach-loongson/loongson.h
---- linux-2.6.30.5.orig/arch/mips/include/asm/mach-loongson/loongson.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.30.5/arch/mips/include/asm/mach-loongson/loongson.h 2009-08-23 19:01:04.000000000 +0200
-@@ -0,0 +1,319 @@
-+/*
-+ * Copyright (c) 2009 Philippe Vachon <philippe@cowpig.ca>
-+ *
-+ * Copyright (C) 2009 Lemote, Inc. & Institute of Computing Technology
-+ * Author: Wu Zhangjin <wuzj@lemote.com>
-+ *
-+ * 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.
-+ *
-+ */
-+
-+#ifndef __LOONGSON_H
-+#define __LOONGSON_H
-+
-+#include <linux/io.h>
-+#include <linux/init.h>
-+
-+/* loongson internal northbridge initialization */
-+extern void bonito_irq_init(void);
-+
-+/* environment arguments from bootloader */
-+extern unsigned long bus_clock, cpu_clock_freq;
-+extern unsigned long memsize, highmemsize;
-+
-+/* loongson-based machines specific reboot setup */
-+extern void loongson_reboot_setup(void);
-+
-+/* loongson-specific command line, env and memory initialization */
-+extern void __init prom_init_memory(void);
-+extern void __init prom_init_cmdline(void);
-+extern void __init prom_init_env(void);
-+
-+/* irq operation functions */
-+extern void bonito_irqdispatch(void);
-+extern void i8259_irqdispatch(void);
-+extern void __init bonito_irq_init(void);
-+extern void __init set_irq_trigger_mode(void);
-+extern int mach_i8259_irq(void);
-+extern void mach_irq_dispatch(unsigned int pending);
-+
-+/* machine-specific reboot/halt operation */
-+extern void mach_prepare_reboot(void);
-+extern void mach_prepare_shutdown(void);
-+
-+/* We need this in some places... */
-+#define delay() ({ \
-+ int x; \
-+ for (x = 0; x < 100000; x++) \
-+ __asm__ __volatile__(""); \
-+})
-+
-+/* loongson-specific cpu frequency relative stuff */
-+#ifdef CONFIG_LOONGSON2F_CPU_FREQ
-+#include <linux/cpufreq.h>
-+extern void loongson2f_cpu_wait(void);
-+extern struct cpufreq_frequency_table loongson2f_clockmod_table[];
-+#endif
-+
-+#define LOONGSON_REG(x) \
-+ (*(u32 *)((char *)CKSEG1ADDR(LOONGSON_REG_BASE) + (x)))
-+
-+#define LOONGSON_IRQ_BASE 32
-+#define LOONGSON_PERFCNT_IRQ (MIPS_CPU_IRQ_BASE + 6) /* cpu perf counter */
-+
-+#define LOONGSON_FLASH_BASE 0x1c000000
-+#define LOONGSON_FLASH_SIZE 0x02000000 /* 32M */
-+#define LOONGSON_FLASH_TOP (LOONGSON_FLASH_BASE+LOONGSON_FLASH_SIZE-1)
-+
-+#define LOONGSON_LIO0_BASE 0x1e000000
-+#define LOONGSON_LIO0_SIZE 0x01C00000 /* 28M */
-+#define LOONGSON_LIO0_TOP (LOONGSON_LIO0_BASE+LOONGSON_LIO0_SIZE-1)
-+
-+#define LOONGSON_BOOT_BASE 0x1fc00000
-+#define LOONGSON_BOOT_SIZE 0x00100000 /* 1M */
-+#define LOONGSON_BOOT_TOP (LOONGSON_BOOT_BASE+LOONGSON_BOOT_SIZE-1)
-+#define LOONGSON_REG_BASE 0x1fe00000
-+#define LOONGSON_REG_SIZE 0x00100000 /* 256Bytes + 256Bytes + ??? */
-+#define LOONGSON_REG_TOP (LOONGSON_REG_BASE+LOONGSON_REG_SIZE-1)
-+
-+#define LOONGSON_LIO1_BASE 0x1ff00000
-+#define LOONGSON_LIO1_SIZE 0x00100000 /* 1M */
-+#define LOONGSON_LIO1_TOP (LOONGSON_LIO1_BASE+LOONGSON_LIO1_SIZE-1)
-+
-+#define LOONGSON_PCILO0_BASE 0x10000000
-+#define LOONGSON_PCILO1_BASE 0x14000000
-+#define LOONGSON_PCILO2_BASE 0x18000000
-+#define LOONGSON_PCILO_BASE LOONGSON_PCILO0_BASE
-+#define LOONGSON_PCILO_SIZE 0x0c000000 /* 64M * 3 */
-+#define LOONGSON_PCILO_TOP (LOONGSON_PCILO0_BASE+LOONGSON_PCILO_SIZE-1)
-+
-+#define LOONGSON_PCICFG_BASE 0x1fe80000
-+#define LOONGSON_PCICFG_SIZE 0x00000800 /* 2K */
-+#define LOONGSON_PCICFG_TOP (LOONGSON_PCICFG_BASE+LOONGSON_PCICFG_SIZE-1)
-+#define LOONGSON_PCIIO_BASE 0x1fd00000
-+#define LOONGSON_PCIIO_SIZE 0x00100000 /* 1M */
-+#define LOONGSON_PCIIO_TOP (LOONGSON_PCIIO_BASE+LOONGSON_PCIIO_SIZE-1)
-+
-+/* Loongson Register Bases */
-+
-+#define LOONGSON_PCICONFIGBASE 0x00
-+#define LOONGSON_REGBASE 0x100
-+
-+/* PCI Configuration Registers */
-+
-+#define LOONGSON_PCI_REG(x) LOONGSON_REG(LOONGSON_PCICONFIGBASE + (x))
-+#define LOONGSON_PCIDID LOONGSON_PCI_REG(0x00)
-+#define LOONGSON_PCICMD LOONGSON_PCI_REG(0x04)
-+#define LOONGSON_PCICLASS LOONGSON_PCI_REG(0x08)
-+#define LOONGSON_PCILTIMER LOONGSON_PCI_REG(0x0c)
-+#define LOONGSON_PCIBASE0 LOONGSON_PCI_REG(0x10)
-+#define LOONGSON_PCIBASE1 LOONGSON_PCI_REG(0x14)
-+#define LOONGSON_PCIBASE2 LOONGSON_PCI_REG(0x18)
-+#define LOONGSON_PCIBASE3 LOONGSON_PCI_REG(0x1c)
-+#define LOONGSON_PCIBASE4 LOONGSON_PCI_REG(0x20)
-+#define LOONGSON_PCIEXPRBASE LOONGSON_PCI_REG(0x30)
-+#define LOONGSON_PCIINT LOONGSON_PCI_REG(0x3c)
-+
-+#define LOONGSON_PCI_ISR4C LOONGSON_PCI_REG(0x4c)
-+
-+#define LOONGSON_PCICMD_PERR_CLR 0x80000000
-+#define LOONGSON_PCICMD_SERR_CLR 0x40000000
-+#define LOONGSON_PCICMD_MABORT_CLR 0x20000000
-+#define LOONGSON_PCICMD_MTABORT_CLR 0x10000000
-+#define LOONGSON_PCICMD_TABORT_CLR 0x08000000
-+#define LOONGSON_PCICMD_MPERR_CLR 0x01000000
-+#define LOONGSON_PCICMD_PERRRESPEN 0x00000040
-+#define LOONGSON_PCICMD_ASTEPEN 0x00000080
-+#define LOONGSON_PCICMD_SERREN 0x00000100
-+#define LOONGSON_PCILTIMER_BUSLATENCY 0x0000ff00
-+#define LOONGSON_PCILTIMER_BUSLATENCY_SHIFT 8
-+
-+/* Loongson h/w Configuration */
-+
-+#define LOONGSON_GENCFG_OFFSET 0x4
-+#define LOONGSON_GENCFG LOONGSON_REG(LOONGSON_REGBASE + LOONGSON_GENCFG_OFFSET)
-+
-+#define LOONGSON_GENCFG_DEBUGMODE 0x00000001
-+#define LOONGSON_GENCFG_SNOOPEN 0x00000002
-+#define LOONGSON_GENCFG_CPUSELFRESET 0x00000004
-+
-+#define LOONGSON_GENCFG_FORCE_IRQA 0x00000008
-+#define LOONGSON_GENCFG_IRQA_ISOUT 0x00000010
-+#define LOONGSON_GENCFG_IRQA_FROM_INT1 0x00000020
-+#define LOONGSON_GENCFG_BYTESWAP 0x00000040
-+
-+#define LOONGSON_GENCFG_UNCACHED 0x00000080
-+#define LOONGSON_GENCFG_PREFETCHEN 0x00000100
-+#define LOONGSON_GENCFG_WBEHINDEN 0x00000200
-+#define LOONGSON_GENCFG_CACHEALG 0x00000c00
-+#define LOONGSON_GENCFG_CACHEALG_SHIFT 10
-+#define LOONGSON_GENCFG_PCIQUEUE 0x00001000
-+#define LOONGSON_GENCFG_CACHESTOP 0x00002000
-+#define LOONGSON_GENCFG_MSTRBYTESWAP 0x00004000
-+#define LOONGSON_GENCFG_BUSERREN 0x00008000
-+#define LOONGSON_GENCFG_NORETRYTIMEOUT 0x00010000
-+#define LOONGSON_GENCFG_SHORTCOPYTIMEOUT 0x00020000
-+
-+/* PCI address map control */
-+
-+#define LOONGSON_PCIMAP LOONGSON_REG(LOONGSON_REGBASE + 0x10)
-+#define LOONGSON_PCIMEMBASECFG LOONGSON_REG(LOONGSON_REGBASE + 0x14)
-+#define LOONGSON_PCIMAP_CFG LOONGSON_REG(LOONGSON_REGBASE + 0x18)
-+
-+/* GPIO Regs - r/w */
-+
-+#define LOONGSON_GPIODATA LOONGSON_REG(LOONGSON_REGBASE + 0x1c)
-+#define LOONGSON_GPIOIE LOONGSON_REG(LOONGSON_REGBASE + 0x20)
-+
-+/* ICU Configuration Regs - r/w */
-+
-+#define LOONGSON_INTEDGE LOONGSON_REG(LOONGSON_REGBASE + 0x24)
-+#define LOONGSON_INTSTEER LOONGSON_REG(LOONGSON_REGBASE + 0x28)
-+#define LOONGSON_INTPOL LOONGSON_REG(LOONGSON_REGBASE + 0x2c)
-+
-+/* ICU Enable Regs - IntEn & IntISR are r/o. */
-+
-+#define LOONGSON_INTENSET LOONGSON_REG(LOONGSON_REGBASE + 0x30)
-+#define LOONGSON_INTENCLR LOONGSON_REG(LOONGSON_REGBASE + 0x34)
-+#define LOONGSON_INTEN LOONGSON_REG(LOONGSON_REGBASE + 0x38)
-+#define LOONGSON_INTISR LOONGSON_REG(LOONGSON_REGBASE + 0x3c)
-+
-+/* ICU */
-+#define LOONGSON_ICU_MBOXES 0x0000000f
-+#define LOONGSON_ICU_MBOXES_SHIFT 0
-+#define LOONGSON_ICU_DMARDY 0x00000010
-+#define LOONGSON_ICU_DMAEMPTY 0x00000020
-+#define LOONGSON_ICU_COPYRDY 0x00000040
-+#define LOONGSON_ICU_COPYEMPTY 0x00000080
-+#define LOONGSON_ICU_COPYERR 0x00000100
-+#define LOONGSON_ICU_PCIIRQ 0x00000200
-+#define LOONGSON_ICU_MASTERERR 0x00000400
-+#define LOONGSON_ICU_SYSTEMERR 0x00000800
-+#define LOONGSON_ICU_DRAMPERR 0x00001000
-+#define LOONGSON_ICU_RETRYERR 0x00002000
-+#define LOONGSON_ICU_GPIOS 0x01ff0000
-+#define LOONGSON_ICU_GPIOS_SHIFT 16
-+#define LOONGSON_ICU_GPINS 0x7e000000
-+#define LOONGSON_ICU_GPINS_SHIFT 25
-+#define LOONGSON_ICU_MBOX(N) (1<<(LOONGSON_ICU_MBOXES_SHIFT+(N)))
-+#define LOONGSON_ICU_GPIO(N) (1<<(LOONGSON_ICU_GPIOS_SHIFT+(N)))
-+#define LOONGSON_ICU_GPIN(N) (1<<(LOONGSON_ICU_GPINS_SHIFT+(N)))
-+
-+/* PCI prefetch window base & mask */
-+
-+#define LOONGSON_MEM_WIN_BASE_L LOONGSON_REG(LOONGSON_REGBASE + 0x40)
-+#define LOONGSON_MEM_WIN_BASE_H LOONGSON_REG(LOONGSON_REGBASE + 0x44)
-+#define LOONGSON_MEM_WIN_MASK_L LOONGSON_REG(LOONGSON_REGBASE + 0x48)
-+#define LOONGSON_MEM_WIN_MASK_H LOONGSON_REG(LOONGSON_REGBASE + 0x4c)
-+
-+/* PCI_Hit*_Sel_* */
-+
-+#define LOONGSON_PCI_HIT0_SEL_L LOONGSON_REG(LOONGSON_REGBASE + 0x50)
-+#define LOONGSON_PCI_HIT0_SEL_H LOONGSON_REG(LOONGSON_REGBASE + 0x54)
-+#define LOONGSON_PCI_HIT1_SEL_L LOONGSON_REG(LOONGSON_REGBASE + 0x58)
-+#define LOONGSON_PCI_HIT1_SEL_H LOONGSON_REG(LOONGSON_REGBASE + 0x5c)
-+#define LOONGSON_PCI_HIT2_SEL_L LOONGSON_REG(LOONGSON_REGBASE + 0x60)
-+#define LOONGSON_PCI_HIT2_SEL_H LOONGSON_REG(LOONGSON_REGBASE + 0x64)
-+
-+/* PXArb Config & Status */
-+
-+#define LOONGSON_PXARB_CFG LOONGSON_REG(LOONGSON_REGBASE + 0x68)
-+#define LOONGSON_PXARB_STATUS LOONGSON_REG(LOONGSON_REGBASE + 0x6c)
-+
-+/* Chip Config */
-+#define LOONGSON_CHIPCFG0 LOONGSON_REG(LOONGSON_REGBASE + 0x80)
-+
-+/* pcimap */
-+
-+#define LOONGSON_PCIMAP_PCIMAP_LO0 0x0000003f
-+#define LOONGSON_PCIMAP_PCIMAP_LO0_SHIFT 0
-+#define LOONGSON_PCIMAP_PCIMAP_LO1 0x00000fc0
-+#define LOONGSON_PCIMAP_PCIMAP_LO1_SHIFT 6
-+#define LOONGSON_PCIMAP_PCIMAP_LO2 0x0003f000
-+#define LOONGSON_PCIMAP_PCIMAP_LO2_SHIFT 12
-+#define LOONGSON_PCIMAP_PCIMAP_2 0x00040000
-+#define LOONGSON_PCIMAP_WIN(WIN, ADDR) \
-+ ((((ADDR)>>26) & LOONGSON_PCIMAP_PCIMAP_LO0) << ((WIN)*6))
-+
-+/*
-+ * address windows configuration module
-+ *
-+ * loongson2e do not have this module
-+ */
-+#if defined(CONFIG_CPU_LOONGSON2F) && defined(CONFIG_64BIT)
-+
-+/* address window config module base address */
-+#define LOONGSON_ADDRWINCFG_BASE 0x3ff00000ul
-+#define LOONGSON_ADDRWINCFG_SIZE 0x180
-+
-+extern unsigned long _loongson_addrwincfg_base;
-+#define LOONGSON_ADDRWINCFG(offset) \
-+ (*(u64 *)(_loongson_addrwincfg_base + (offset)))
-+
-+#define CPU_WIN0_BASE LOONGSON_ADDRWINCFG(0x00)
-+#define CPU_WIN1_BASE LOONGSON_ADDRWINCFG(0x08)
-+#define CPU_WIN2_BASE LOONGSON_ADDRWINCFG(0x10)
-+#define CPU_WIN3_BASE LOONGSON_ADDRWINCFG(0x18)
-+
-+#define CPU_WIN0_MASK LOONGSON_ADDRWINCFG(0x20)
-+#define CPU_WIN1_MASK LOONGSON_ADDRWINCFG(0x28)
-+#define CPU_WIN2_MASK LOONGSON_ADDRWINCFG(0x30)
-+#define CPU_WIN3_MASK LOONGSON_ADDRWINCFG(0x38)
-+
-+#define CPU_WIN0_MMAP LOONGSON_ADDRWINCFG(0x40)
-+#define CPU_WIN1_MMAP LOONGSON_ADDRWINCFG(0x48)
-+#define CPU_WIN2_MMAP LOONGSON_ADDRWINCFG(0x50)
-+#define CPU_WIN3_MMAP LOONGSON_ADDRWINCFG(0x58)
-+
-+#define PCIDMA_WIN0_BASE LOONGSON_ADDRWINCFG(0x60)
-+#define PCIDMA_WIN1_BASE LOONGSON_ADDRWINCFG(0x68)
-+#define PCIDMA_WIN2_BASE LOONGSON_ADDRWINCFG(0x70)
-+#define PCIDMA_WIN3_BASE LOONGSON_ADDRWINCFG(0x78)
-+
-+#define PCIDMA_WIN0_MASK LOONGSON_ADDRWINCFG(0x80)
-+#define PCIDMA_WIN1_MASK LOONGSON_ADDRWINCFG(0x88)
-+#define PCIDMA_WIN2_MASK LOONGSON_ADDRWINCFG(0x90)
-+#define PCIDMA_WIN3_MASK LOONGSON_ADDRWINCFG(0x98)
-+
-+#define PCIDMA_WIN0_MMAP LOONGSON_ADDRWINCFG(0xa0)
-+#define PCIDMA_WIN1_MMAP LOONGSON_ADDRWINCFG(0xa8)
-+#define PCIDMA_WIN2_MMAP LOONGSON_ADDRWINCFG(0xb0)
-+#define PCIDMA_WIN3_MMAP LOONGSON_ADDRWINCFG(0xb8)
-+
-+#define ADDRWIN_WIN0 0
-+#define ADDRWIN_WIN1 1
-+#define ADDRWIN_WIN2 2
-+#define ADDRWIN_WIN3 3
-+
-+#define ADDRWIN_MAP_DST_DDR 0
-+#define ADDRWIN_MAP_DST_PCI 1
-+#define ADDRWIN_MAP_DST_LIO 1
-+
-+/*
-+ * s: CPU, PCIDMA
-+ * d: DDR, PCI, LIO
-+ * win: 0, 1, 2, 3
-+ * src: map source
-+ * dst: map destination
-+ * size: ~mask + 1
-+ */
-+#define LOONGSON_ADDRWIN_CFG(s, d, w, src, dst, size) do {\
-+ s##_WIN##w##_BASE = (src); \
-+ s##_WIN##w##_MMAP = (src) | ADDRWIN_MAP_DST_##d; \
-+ s##_WIN##w##_MASK = ~(size-1); \
-+} while (0)
-+
-+#define LOONGSON_ADDRWIN_CPUTOPCI(win, src, dst, size) \
-+ LOONGSON_ADDRWIN_CFG(CPU, PCI, win, src, dst, size)
-+#define LOONGSON_ADDRWIN_CPUTODDR(win, src, dst, size) \
-+ LOONGSON_ADDRWIN_CFG(CPU, DDR, win, src, dst, size)
-+#define LOONGSON_ADDRWIN_PCITODDR(win, src, dst, size) \
-+ LOONGSON_ADDRWIN_CFG(PCIDMA, DDR, win, src, dst, size)
-+
-+#endif /* ! CONFIG_CPU_LOONGSON2F && CONFIG_64BIT */
-+
-+#endif /* __LOONGSON_H */
-+
-diff -Nur linux-2.6.30.5.orig/arch/mips/include/asm/mach-loongson/machine.h linux-2.6.30.5/arch/mips/include/asm/mach-loongson/machine.h
---- linux-2.6.30.5.orig/arch/mips/include/asm/mach-loongson/machine.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.30.5/arch/mips/include/asm/mach-loongson/machine.h 2009-08-23 19:01:04.000000000 +0200
-@@ -0,0 +1,76 @@
-+/*
-+ * board-specific header file
-+ *
-+ * Copyright (c) 2009 Wu Zhangjin <wuzj@lemote.com>
-+ *
-+ * Copyright (C) 2009 Zhang Le
-+ *
-+ * 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.
-+ */
-+
-+#ifndef __MACHINE_H
-+#define __MACHINE_H
-+
-+#ifdef CONFIG_LEMOTE_FULOONG2E
-+
-+#define MACHTYPE MACH_LEMOTE_FL2E
-+
-+#define LOONGSON_UART_BASE (LOONGSON_PCIIO_BASE + 0x3f8)
-+#define LOONGSON_UART_BAUD 1843200
-+#define LOONGSON_UART_IOTYPE UPIO_PORT
-+
-+#define LOONGSON_NORTH_BRIDGE_IRQ (MIPS_CPU_IRQ_BASE + 2)
-+#define LOONGSON_UART_IRQ (MIPS_CPU_IRQ_BASE + 4)
-+#define LOONGSON_SOUTH_BRIDGE_IRQ (MIPS_CPU_IRQ_BASE + 5)
-+#define LOONGSON_TIMER_IRQ (MIPS_CPU_IRQ_BASE + 7)
-+#define LOONGSON_DMATIMEOUT_IRQ (LOONGSON_IRQ_BASE + 10)
-+
-+#elif defined(CONFIG_LEMOTE_FULOONG2F)
-+
-+#define MACHTYPE MACH_LEMOTE_FL2F
-+
-+#define LOONGSON_UART_BASE (LOONGSON_PCIIO_BASE + 0x2f8)
-+#define LOONGSON_UART_BAUD 1843200
-+#define LOONGSON_UART_IOTYPE UPIO_PORT
-+
-+#else /* CONFIG_CPU_YEELOONG2F */
-+
-+#define MACHTYPE MACH_LEMOTE_YL2F89
-+
-+/* yeeloong use the CPU serial port of Loongson2F */
-+#define LOONGSON_UART_BASE (LOONGSON_LIO1_BASE + 0x3f8)
-+#define LOONGSON_UART_BAUD 3686400
-+#define LOONGSON_UART_IOTYPE UPIO_MEM
-+
-+#endif /* !CONFIG_LEMOTE_FULOONG2E */
-+
-+/* fuloong2f and yeeloong2f have the same IRQ control interface */
-+#if defined(CONFIG_LEMOTE_FULOONG2F) || defined(CONFIG_LEMOTE_YEELOONG2F)
-+
-+#define LOONGSON_TIMER_IRQ (MIPS_CPU_IRQ_BASE + 7) /* cpu timer */
-+#define LOONGSON_NORTH_BRIDGE_IRQ (MIPS_CPU_IRQ_BASE + 6) /* bonito */
-+#define LOONGSON_UART_IRQ (MIPS_CPU_IRQ_BASE + 3) /* cpu serial port */
-+#define LOONGSON_SOUTH_BRIDGE_IRQ (MIPS_CPU_IRQ_BASE + 2) /* i8259 */
-+
-+#define LOONGSON_INT_BIT_GPIO1 (1 << 1)
-+#define LOONGSON_INT_BIT_GPIO2 (1 << 2)
-+#define LOONGSON_INT_BIT_GPIO3 (1 << 3)
-+#define LOONGSON_INT_BIT_PCI_INTA (1 << 4)
-+#define LOONGSON_INT_BIT_PCI_INTB (1 << 5)
-+#define LOONGSON_INT_BIT_PCI_INTC (1 << 6)
-+#define LOONGSON_INT_BIT_PCI_INTD (1 << 7)
-+#define LOONGSON_INT_BIT_PCI_PERR (1 << 8)
-+#define LOONGSON_INT_BIT_PCI_SERR (1 << 9)
-+#define LOONGSON_INT_BIT_DDR (1 << 10)
-+#define LOONGSON_INT_BIT_INT0 (1 << 11)
-+#define LOONGSON_INT_BIT_INT1 (1 << 12)
-+#define LOONGSON_INT_BIT_INT2 (1 << 13)
-+#define LOONGSON_INT_BIT_INT3 (1 << 14)
-+
-+#endif
-+
-+#endif /* ! __MACHINE_H */
-diff -Nur linux-2.6.30.5.orig/arch/mips/include/asm/mach-loongson/mc146818rtc.h linux-2.6.30.5/arch/mips/include/asm/mach-loongson/mc146818rtc.h
---- linux-2.6.30.5.orig/arch/mips/include/asm/mach-loongson/mc146818rtc.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.30.5/arch/mips/include/asm/mach-loongson/mc146818rtc.h 2009-08-23 19:01:04.000000000 +0200
-@@ -0,0 +1,36 @@
-+/*
-+ * This file is subject to the terms and conditions of the GNU General Public
-+ * License. See the file "COPYING" in the main directory of this archive
-+ * for more details.
-+ *
-+ * Copyright (C) 1998, 2001, 03, 07 by Ralf Baechle (ralf@linux-mips.org)
-+ *
-+ * RTC routines for PC style attached Dallas chip.
-+ */
-+#ifndef __ASM_MACH_LOONGSON_MC146818RTC_H
-+#define __ASM_MACH_LOONGSON_MC146818RTC_H
-+
-+#include <linux/io.h>
-+
-+#define RTC_PORT(x) (0x70 + (x))
-+#define RTC_IRQ 8
-+
-+static inline unsigned char CMOS_READ(unsigned long addr)
-+{
-+ outb_p(addr, RTC_PORT(0));
-+ return inb_p(RTC_PORT(1));
-+}
-+
-+static inline void CMOS_WRITE(unsigned char data, unsigned long addr)
-+{
-+ outb_p(addr, RTC_PORT(0));
-+ outb_p(data, RTC_PORT(1));
-+}
-+
-+#define RTC_ALWAYS_BCD 0
-+
-+#ifndef mc146818_decode_year
-+#define mc146818_decode_year(year) ((year) < 70 ? (year) + 2000 : (year) + 1970)
-+#endif
-+
-+#endif /* __ASM_MACH_LOONGSON_MC146818RTC_H */
-diff -Nur linux-2.6.30.5.orig/arch/mips/include/asm/mach-loongson/mem.h linux-2.6.30.5/arch/mips/include/asm/mach-loongson/mem.h
---- linux-2.6.30.5.orig/arch/mips/include/asm/mach-loongson/mem.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.30.5/arch/mips/include/asm/mach-loongson/mem.h 2009-08-23 19:01:04.000000000 +0200
-@@ -0,0 +1,31 @@
-+#ifndef __MEM_H
-+#define __MEM_H
-+
-+/*
-+ * high memory space
-+ *
-+ * in loongson2e, starts from 512M
-+ * in loongson2f, starts from 2G + 256M
-+ */
-+#ifdef CONFIG_CPU_LOONGSON2E
-+#define LOONGSON_HIGHMEM_START 0x20000000
-+#else
-+#define LOONGSON_HIGHMEM_START 0x90000000
-+#endif
-+
-+/*
-+ * the peripheral registers(MMIO):
-+ *
-+ * On the Lemote Loongson 2e system, reside between 0x1000:0000 and 0x2000:0000.
-+ * On the Lemote Loongson 2f system, reside between 0x1000:0000 and 0x8000:0000.
-+ */
-+
-+#define LOONGSON_MMIO_MEM_START 0x10000000
-+
-+#ifdef CONFIG_CPU_LOONGSON2E
-+#define LOONGSON_MMIO_MEM_END 0x20000000
-+#else
-+#define LOONGSON_MMIO_MEM_END 0x80000000
-+#endif
-+
-+#endif /* !__MEM_H */
-diff -Nur linux-2.6.30.5.orig/arch/mips/include/asm/mach-loongson/pci.h linux-2.6.30.5/arch/mips/include/asm/mach-loongson/pci.h
---- linux-2.6.30.5.orig/arch/mips/include/asm/mach-loongson/pci.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.30.5/arch/mips/include/asm/mach-loongson/pci.h 2009-08-23 19:01:04.000000000 +0200
-@@ -0,0 +1,59 @@
-+/*
-+ * Copyright (c) 2008 Zhang Le <r0bertz@gentoo.org>
-+ * Copyright (c) 2009 Wu Zhangjin <wuzj@lemote.com>
-+ *
-+ * 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., 675 Mass Ave, Cambridge, MA
-+ * 02139, USA.
-+ */
-+
-+#ifndef _LOONGSON_PCI_H_
-+#define _LOONGSON_PCI_H_
-+
-+extern struct pci_ops loongson_pci_ops;
-+
-+/* this is an offset from mips_io_port_base */
-+#define LOONGSON_PCI_IO_START 0x00004000UL
-+
-+#if defined(CONFIG_CPU_LOONGSON2F) && defined(CONFIG_64BIT)
-+
-+/*
-+ * we use address window2 to map cpu address space to pci space
-+ * window2: cpu [1G, 2G] -> pci [1G, 2G]
-+ * why not use window 0 & 1? because they are used by cpu when booting.
-+ * window0: cpu [0, 256M] -> ddr [0, 256M]
-+ * window1: cpu [256M, 512M] -> pci [256M, 512M]
-+ */
-+
-+/* the smallest LOONGSON_CPU_MEM_SRC can be 512M */
-+#define LOONGSON_CPU_MEM_SRC 0x40000000ul /* 1G */
-+#define LOONGSON_PCI_MEM_DST LOONGSON_CPU_MEM_SRC
-+
-+#define LOONGSON_PCI_MEM_START LOONGSON_PCI_MEM_DST
-+#define LOONGSON_PCI_MEM_END (0x80000000ul-1) /* 2G */
-+
-+#define MMAP_CPUTOPCI_SIZE (LOONGSON_PCI_MEM_END - \
-+ LOONGSON_PCI_MEM_START + 1)
-+
-+#else /* loongson2f/32bit & loongson2e */
-+
-+#define LOONGSON_PCI_MEM_START 0x14000000UL
-+#define LOONGSON_PCI_MEM_END 0x1fffffffUL
-+
-+#endif /* !(defined(CONFIG_CPU_LOONGSON2F) && defined(CONFIG_64BIT))*/
-+
-+
-+#endif /* !_LOONGSON_PCI_H_ */
-diff -Nur linux-2.6.30.5.orig/arch/mips/include/asm/mach-loongson/war.h linux-2.6.30.5/arch/mips/include/asm/mach-loongson/war.h
---- linux-2.6.30.5.orig/arch/mips/include/asm/mach-loongson/war.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.30.5/arch/mips/include/asm/mach-loongson/war.h 2009-08-23 19:01:04.000000000 +0200
-@@ -0,0 +1,25 @@
-+/*
-+ * This file is subject to the terms and conditions of the GNU General Public
-+ * License. See the file "COPYING" in the main directory of this archive
-+ * for more details.
-+ *
-+ * Copyright (C) 2002, 2004, 2007 by Ralf Baechle <ralf@linux-mips.org>
-+ */
-+#ifndef __ASM_MIPS_MACH_LOONGSON_WAR_H
-+#define __ASM_MIPS_MACH_LOONGSON_WAR_H
-+
-+#define R4600_V1_INDEX_ICACHEOP_WAR 0
-+#define R4600_V1_HIT_CACHEOP_WAR 0
-+#define R4600_V2_HIT_CACHEOP_WAR 0
-+#define R5432_CP0_INTERRUPT_WAR 0
-+#define BCM1250_M3_WAR 0
-+#define SIBYTE_1956_WAR 0
-+#define MIPS4K_ICACHE_REFILL_WAR 0
-+#define MIPS_CACHE_SYNC_WAR 0
-+#define TX49XX_ICACHE_INDEX_INV_WAR 0
-+#define RM9000_CDEX_SMP_WAR 0
-+#define ICACHE_REFILLS_WORKAROUND_WAR 0
-+#define R10000_LLSC_WAR 0
-+#define MIPS34K_MISSED_ITLB_WAR 0
-+
-+#endif /* __ASM_MIPS_MACH_LOONGSON_WAR_H */
-diff -Nur linux-2.6.30.5.orig/arch/mips/include/asm/mips-boards/bonito64.h linux-2.6.30.5/arch/mips/include/asm/mips-boards/bonito64.h
---- linux-2.6.30.5.orig/arch/mips/include/asm/mips-boards/bonito64.h 2009-08-16 23:19:38.000000000 +0200
-+++ linux-2.6.30.5/arch/mips/include/asm/mips-boards/bonito64.h 2009-08-23 19:01:04.000000000 +0200
-@@ -26,11 +26,6 @@
- /* offsets from base register */
- #define BONITO(x) (x)
-
--#elif defined(CONFIG_LEMOTE_FULONG)
--
--#define BONITO(x) (*(volatile u32 *)((char *)CKSEG1ADDR(BONITO_REG_BASE) + (x)))
--#define BONITO_IRQ_BASE 32
--
- #else
-
- /*
-diff -Nur linux-2.6.30.5.orig/arch/mips/include/asm/page.h linux-2.6.30.5/arch/mips/include/asm/page.h
---- linux-2.6.30.5.orig/arch/mips/include/asm/page.h 2009-08-16 23:19:38.000000000 +0200
-+++ linux-2.6.30.5/arch/mips/include/asm/page.h 2009-08-23 19:01:04.000000000 +0200
-@@ -179,8 +179,9 @@
-
- #endif
-
--#define virt_to_page(kaddr) pfn_to_page(PFN_DOWN(virt_to_phys(kaddr)))
--#define virt_addr_valid(kaddr) pfn_valid(PFN_DOWN(virt_to_phys(kaddr)))
-+#define virt_to_page(kaddr) \
-+ pfn_to_page(PFN_DOWN(virt_to_phys((void *)kaddr)))
-+#define virt_addr_valid(kaddr) pfn_valid(PFN_DOWN(virt_to_phys((void *)kaddr)))
-
- #define VM_DATA_DEFAULT_FLAGS (VM_READ | VM_WRITE | VM_EXEC | \
- VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC)
-diff -Nur linux-2.6.30.5.orig/arch/mips/include/asm/pci.h linux-2.6.30.5/arch/mips/include/asm/pci.h
---- linux-2.6.30.5.orig/arch/mips/include/asm/pci.h 2009-08-16 23:19:38.000000000 +0200
-+++ linux-2.6.30.5/arch/mips/include/asm/pci.h 2009-08-23 19:01:04.000000000 +0200
-@@ -56,7 +56,7 @@
- /*
- * board supplied pci irq fixup routine
- */
--extern int pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin);
-+extern int pcibios_map_irq(struct pci_dev *dev, u8 slot, u8 pin);
-
-
- /* Can be used to override the logic in pci_scan_bus for skipping
-diff -Nur linux-2.6.30.5.orig/arch/mips/include/asm/pgtable.h linux-2.6.30.5/arch/mips/include/asm/pgtable.h
---- linux-2.6.30.5.orig/arch/mips/include/asm/pgtable.h 2009-08-16 23:19:38.000000000 +0200
-+++ linux-2.6.30.5/arch/mips/include/asm/pgtable.h 2009-08-23 19:01:04.000000000 +0200
-@@ -370,6 +370,19 @@
- #include <asm-generic/pgtable.h>
-
- /*
-+ * uncache accelerate for video memory access
-+ */
-+#ifdef CONFIG_LOONGSON2F
-+#define __HAVE_PHYS_MEM_ACCESS_PROT
-+
-+struct file;
-+pgprot_t phys_mem_access_prot(struct file *file, unsigned long pfn,
-+ unsigned long size, pgprot_t vma_prot);
-+int phys_mem_access_prot_allowed(struct file *file, unsigned long pfn,
-+ unsigned long size, pgprot_t *vma_prot);
-+#endif
-+
-+/*
- * We provide our own get_unmapped area to cope with the virtual aliasing
- * constraints placed on us by the cache architecture.
- */
-diff -Nur linux-2.6.30.5.orig/arch/mips/include/asm/stackframe.h linux-2.6.30.5/arch/mips/include/asm/stackframe.h
---- linux-2.6.30.5.orig/arch/mips/include/asm/stackframe.h 2009-08-16 23:19:38.000000000 +0200
-+++ linux-2.6.30.5/arch/mips/include/asm/stackframe.h 2009-08-23 19:01:04.000000000 +0200
-@@ -117,6 +117,20 @@
- .endm
- #else
- .macro get_saved_sp /* Uniprocessor variation */
-+#ifdef CONFIG_CPU_LOONGSON2
-+ move k0, ra
-+ jal 2008f
-+ nop
-+2008 : jal 2008f
-+ nop
-+2008 : jal 2008f
-+ nop
-+2008 : jal 2008f
-+ nop
-+2008 : move ra, k0
-+ li k0, 3
-+ mtc0 k0, $22
-+#endif
- #if defined(CONFIG_32BIT) || defined(KBUILD_64BIT_SYM32)
- lui k1, %hi(kernelsp)
- #else
-diff -Nur linux-2.6.30.5.orig/arch/mips/include/asm/suspend.h linux-2.6.30.5/arch/mips/include/asm/suspend.h
---- linux-2.6.30.5.orig/arch/mips/include/asm/suspend.h 2009-08-16 23:19:38.000000000 +0200
-+++ linux-2.6.30.5/arch/mips/include/asm/suspend.h 2009-08-23 20:29:58.000000000 +0200
-@@ -1,6 +1,9 @@
- #ifndef __ASM_SUSPEND_H
- #define __ASM_SUSPEND_H
-
--/* Somewhen... Maybe :-) */
-+static inline int arch_prepare_suspend(void) { return 0; }
-+
-+/* References to section boundaries */
-+extern const void __nosave_begin, __nosave_end;
-
- #endif /* __ASM_SUSPEND_H */
-diff -Nur linux-2.6.30.5.orig/arch/mips/Kconfig linux-2.6.30.5/arch/mips/Kconfig
---- linux-2.6.30.5.orig/arch/mips/Kconfig 2009-08-16 23:19:38.000000000 +0200
-+++ linux-2.6.30.5/arch/mips/Kconfig 2009-08-23 19:01:56.000000000 +0200
-@@ -6,7 +6,7 @@
- select HAVE_ARCH_KGDB
- # Horrible source of confusion. Die, die, die ...
- select EMBEDDED
-- select RTC_LIB
-+ select RTC_LIB if !MACH_LOONGSON
-
- mainmenu "Linux/MIPS Kernel Configuration"
-
-@@ -154,30 +154,19 @@
- select SYS_SUPPORTS_64BIT_KERNEL if BROKEN
- select SYS_SUPPORTS_LITTLE_ENDIAN
-
--config LEMOTE_FULONG
-- bool "Lemote Fulong mini-PC"
-- select ARCH_SPARSEMEM_ENABLE
-- select CEVT_R4K
-- select CSRC_R4K
-- select SYS_HAS_CPU_LOONGSON2
-- select DMA_NONCOHERENT
-- select BOOT_ELF32
-- select BOARD_SCACHE
-- select HAVE_STD_PC_SERIAL_PORT
-- select HW_HAS_PCI
-- select I8259
-- select ISA
-- select IRQ_CPU
-- select SYS_SUPPORTS_32BIT_KERNEL
-- select SYS_SUPPORTS_64BIT_KERNEL
-- select SYS_SUPPORTS_LITTLE_ENDIAN
-- select SYS_SUPPORTS_HIGHMEM
-- select SYS_HAS_EARLY_PRINTK
-- select GENERIC_ISA_DMA_SUPPORT_BROKEN
-- select CPU_HAS_WB
-- help
-- Lemote Fulong mini-PC board based on the Chinese Loongson-2E CPU and
-- an FPGA northbridge
-+config MACH_LOONGSON
-+ bool "Loongson family of machines"
-+ select HAVE_KERNEL_GZIP
-+ select HAVE_KERNEL_BZIP2
-+ select HAVE_KERNEL_LZMA
-+ select LOONGSON_PLATFORM_DEVICES
-+ help
-+ This enables the support of Loongson family of machines.
-+
-+ Loongson is a family of general-purpose MIPS-compatible CPUs.
-+ developed at Institute of Computing Technology (ICT),
-+ Chinese Academy of Sciences (CAS) in the People's Republic
-+ of China. The chief architect is Professor Weiwu Hu.
-
- config MIPS_MALTA
- bool "MIPS Malta board"
-@@ -643,6 +632,7 @@
- source "arch/mips/txx9/Kconfig"
- source "arch/mips/vr41xx/Kconfig"
- source "arch/mips/cavium-octeon/Kconfig"
-+source "arch/mips/loongson/Kconfig"
-
- endmenu
-
-@@ -1005,16 +995,29 @@
- prompt "CPU type"
- default CPU_R4X00
-
--config CPU_LOONGSON2
-- bool "Loongson 2"
-- depends on SYS_HAS_CPU_LOONGSON2
-- select CPU_SUPPORTS_32BIT_KERNEL
-- select CPU_SUPPORTS_64BIT_KERNEL
-- select CPU_SUPPORTS_HIGHMEM
-+config CPU_LOONGSON2E
-+ bool "Loongson 2E"
-+ depends on SYS_HAS_CPU_LOONGSON2E
-+ select CPU_LOONGSON2
- help
- The Loongson 2E processor implements the MIPS III instruction set
- with many extensions.
-
-+ It has an internal FPGA northbridge, which is compatiable to
-+ bonito64.
-+
-+config CPU_LOONGSON2F
-+ bool "Loongson 2F"
-+ depends on SYS_HAS_CPU_LOONGSON2F
-+ select CPU_LOONGSON2
-+ help
-+ The Loongson 2F processor implements the MIPS III instruction set
-+ with many extensions.
-+
-+ Loongson2F have built-in DDR2 and PCIX controller. The PCIX controller
-+ have a similar programming interface with FPGA northbridge used in
-+ Loongson2E.
-+
- config CPU_MIPS32_R1
- bool "MIPS32 Release 1"
- depends on SYS_HAS_CPU_MIPS32_R1
-@@ -1253,7 +1256,16 @@
-
- endchoice
-
--config SYS_HAS_CPU_LOONGSON2
-+config CPU_LOONGSON2
-+ bool
-+ select CPU_SUPPORTS_32BIT_KERNEL
-+ select CPU_SUPPORTS_64BIT_KERNEL
-+ select CPU_SUPPORTS_HIGHMEM
-+
-+config SYS_HAS_CPU_LOONGSON2E
-+ bool
-+
-+config SYS_HAS_CPU_LOONGSON2F
- bool
-
- config SYS_HAS_CPU_MIPS32_R1
-@@ -2121,14 +2133,35 @@
-
- menu "Power management options"
-
-+config ARCH_HIBERNATION_POSSIBLE
-+ def_bool y
-+ depends on SYS_SUPPORTS_HOTPLUG_CPU || !SMP
-+
- config ARCH_SUSPEND_POSSIBLE
-- def_bool y
-- depends on !SMP
-+ def_bool y
-+ depends on SYS_SUPPORTS_HOTPLUG_CPU || !SMP
-
- source "kernel/power/Kconfig"
-
- endmenu
-
-+menu "CPU Frequency scaling"
-+
-+source "drivers/cpufreq/Kconfig"
-+
-+config LOONGSON2F_CPU_FREQ
-+ bool "Loongson-2F CPU Frequency driver"
-+ depends on CPU_LOONGSON2F && CPU_FREQ && (CS5536_MFGPT || I8253)
-+ select CPU_FREQ_TABLE
-+ help
-+ This adds the cpufreq driver for Loongson-2F.
-+
-+ For details, take a look at <file:Documentation/cpu-freq>.
-+
-+ If unsure, say N.
-+
-+endmenu
-+
- source "net/Kconfig"
-
- source "drivers/Kconfig"
-diff -Nur linux-2.6.30.5.orig/arch/mips/kernel/asm-offsets.c linux-2.6.30.5/arch/mips/kernel/asm-offsets.c
---- linux-2.6.30.5.orig/arch/mips/kernel/asm-offsets.c 2009-08-16 23:19:38.000000000 +0200
-+++ linux-2.6.30.5/arch/mips/kernel/asm-offsets.c 2009-08-23 21:30:52.000000000 +0200
-@@ -14,6 +14,7 @@
- #include <linux/mm.h>
- #include <linux/interrupt.h>
- #include <linux/kbuild.h>
-+#include <linux/suspend.h>
- #include <asm/ptrace.h>
- #include <asm/processor.h>
-
-@@ -326,3 +327,15 @@
- BLANK();
- }
- #endif
-+
-+#ifdef CONFIG_HIBERNATION
-+void output_pbe_defines(void)
-+{
-+ COMMENT(" Linux struct pbe offsets. ");
-+ OFFSET(PBE_ADDRESS, pbe, address);
-+ OFFSET(PBE_ORIG_ADDRESS, pbe, orig_address);
-+ OFFSET(PBE_NEXT, pbe, next);
-+ DEFINE(PBE_SIZE, sizeof(struct pbe));
-+ BLANK();
-+}
-+#endif
-diff -Nur linux-2.6.30.5.orig/arch/mips/kernel/i8259.c linux-2.6.30.5/arch/mips/kernel/i8259.c
---- linux-2.6.30.5.orig/arch/mips/kernel/i8259.c 2009-08-16 23:19:38.000000000 +0200
-+++ linux-2.6.30.5/arch/mips/kernel/i8259.c 2009-08-23 19:01:04.000000000 +0200
-@@ -177,10 +177,12 @@
- outb(cached_slave_mask, PIC_SLAVE_IMR);
- outb(0x60+(irq&7), PIC_SLAVE_CMD);/* 'Specific EOI' to slave */
- outb(0x60+PIC_CASCADE_IR, PIC_MASTER_CMD); /* 'Specific EOI' to master-IRQ2 */
-+ inb(PIC_MASTER_CMD); /* flush posted write */
- } else {
- inb(PIC_MASTER_IMR); /* DUMMY - (do we need this?) */
- outb(cached_master_mask, PIC_MASTER_IMR);
- outb(0x60+irq, PIC_MASTER_CMD); /* 'Specific EOI to master */
-+ inb(PIC_MASTER_CMD); /* flush posted write */
- }
- smtc_im_ack_irq(irq);
- spin_unlock_irqrestore(&i8259A_lock, flags);
-diff -Nur linux-2.6.30.5.orig/arch/mips/kernel/loongson2f_freq.c linux-2.6.30.5/arch/mips/kernel/loongson2f_freq.c
---- linux-2.6.30.5.orig/arch/mips/kernel/loongson2f_freq.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.30.5/arch/mips/kernel/loongson2f_freq.c 2009-08-23 19:01:04.000000000 +0200
-@@ -0,0 +1,216 @@
-+/*
-+ * arch/mips/kernel/cpufreq.c
-+ *
-+ * cpufreq driver for the loongson-2f processors.
-+ *
-+ * Copyright (C) 2006 - 2008 Lemote Inc. & Insititute of Computing Technology
-+ * Author: Yanhua, yanh@lemote.com
-+ *
-+ * This file is subject to the terms and conditions of the GNU General Public
-+ * License. See the file "COPYING" in the main directory of this archive
-+ * for more details.
-+ */
-+#include <linux/types.h>
-+#include <linux/cpufreq.h>
-+#include <linux/kernel.h>
-+#include <linux/module.h>
-+#include <linux/init.h>
-+#include <linux/err.h>
-+#include <linux/cpumask.h>
-+#include <linux/smp.h>
-+#include <linux/sched.h> /* set_cpus_allowed() */
-+#include <linux/clk.h>
-+#include <linux/delay.h>
-+
-+#include <loongson.h>
-+#include <clock.h>
-+
-+static uint nowait;
-+
-+static struct clk *cpuclk;
-+
-+static void (*saved_cpu_wait) (void);
-+
-+static int loongson2f_cpu_freq_notifier(struct notifier_block *nb,
-+ unsigned long val, void *data);
-+
-+static struct notifier_block loongson2f_cpufreq_notifier_block = {
-+ .notifier_call = loongson2f_cpu_freq_notifier
-+};
-+
-+static int loongson2f_cpu_freq_notifier(struct notifier_block *nb,
-+ unsigned long val, void *data)
-+{
-+ if (val == CPUFREQ_POSTCHANGE)
-+ current_cpu_data.udelay_val = loops_per_jiffy;
-+
-+ return 0;
-+}
-+
-+static unsigned int loongson2f_cpufreq_get(unsigned int cpu)
-+{
-+ return clk_get_rate(cpuclk);
-+}
-+
-+/*
-+ * Here we notify other drivers of the proposed change and the final change.
-+ */
-+static int loongson2f_cpufreq_target(struct cpufreq_policy *policy,
-+ unsigned int target_freq,
-+ unsigned int relation)
-+{
-+ unsigned int cpu = policy->cpu;
-+ unsigned int newstate = 0;
-+ cpumask_t cpus_allowed;
-+ struct cpufreq_freqs freqs;
-+ long freq;
-+
-+ if (!cpu_online(cpu))
-+ return -ENODEV;
-+
-+ cpus_allowed = current->cpus_allowed;
-+ set_cpus_allowed(current, cpumask_of_cpu(cpu));
-+
-+#ifdef CONFIG_SMP
-+ BUG_ON(smp_processor_id() != cpu);
-+#endif
-+
-+ if (cpufreq_frequency_table_target
-+ (policy, &loongson2f_clockmod_table[0], target_freq, relation,
-+ &newstate))
-+ return -EINVAL;
-+
-+ freq =
-+ cpu_clock_freq / 1000 * loongson2f_clockmod_table[newstate].index /
-+ 8;
-+ if (freq < policy->min || freq > policy->max)
-+ return -EINVAL;
-+
-+ pr_debug("cpufreq: requested frequency %u Hz\n", target_freq * 1000);
-+
-+ freqs.cpu = cpu;
-+ freqs.old = loongson2f_cpufreq_get(cpu);
-+ freqs.new = freq;
-+ freqs.flags = 0;
-+
-+ if (freqs.new == freqs.old)
-+ return 0;
-+
-+ /* notifiers */
-+ cpufreq_notify_transition(&freqs, CPUFREQ_PRECHANGE);
-+
-+ set_cpus_allowed(current, cpus_allowed);
-+
-+ /* setting the cpu frequency */
-+ clk_set_rate(cpuclk, freq);
-+
-+ /* notifiers */
-+ cpufreq_notify_transition(&freqs, CPUFREQ_POSTCHANGE);
-+
-+ pr_debug("cpufreq: set frequency %lu kHz\n", freq);
-+
-+ return 0;
-+}
-+
-+static int loongson2f_cpufreq_cpu_init(struct cpufreq_policy *policy)
-+{
-+ int i;
-+ int result;
-+
-+ if (!cpu_online(policy->cpu))
-+ return -ENODEV;
-+
-+ cpuclk = clk_get(NULL, "cpu_clk");
-+ if (IS_ERR(cpuclk)) {
-+ printk(KERN_ERR "cpufreq: couldn't get CPU clk\n");
-+ return PTR_ERR(cpuclk);
-+ }
-+
-+ cpuclk->rate = cpu_clock_freq / 1000;
-+ if (!cpuclk->rate)
-+ return -EINVAL;
-+
-+ /* clock table init */
-+ for (i = 2;
-+ (loongson2f_clockmod_table[i].frequency != CPUFREQ_TABLE_END);
-+ i++) {
-+ loongson2f_clockmod_table[i].frequency = (cpuclk->rate * i) / 8;
-+ }
-+
-+ policy->cur = loongson2f_cpufreq_get(policy->cpu);
-+
-+ cpufreq_frequency_table_get_attr(&loongson2f_clockmod_table[0],
-+ policy->cpu);
-+
-+ result =
-+ cpufreq_frequency_table_cpuinfo(policy,
-+ &loongson2f_clockmod_table[0]);
-+ if (result)
-+ return result;
-+
-+ return 0;
-+}
-+
-+static int loongson2f_cpufreq_verify(struct cpufreq_policy *policy)
-+{
-+ return cpufreq_frequency_table_verify(policy,
-+ &loongson2f_clockmod_table[0]);
-+}
-+
-+static int loongson2f_cpufreq_exit(struct cpufreq_policy *policy)
-+{
-+ clk_put(cpuclk);
-+ return 0;
-+}
-+
-+static struct freq_attr *loongson2f_table_attr[] = {
-+ &cpufreq_freq_attr_scaling_available_freqs,
-+ NULL,
-+};
-+
-+static struct cpufreq_driver loongson2f_cpufreq_driver = {
-+ .owner = THIS_MODULE,
-+ .name = "loongson2f",
-+ .init = loongson2f_cpufreq_cpu_init,
-+ .verify = loongson2f_cpufreq_verify,
-+ .target = loongson2f_cpufreq_target,
-+ .get = loongson2f_cpufreq_get,
-+ .exit = loongson2f_cpufreq_exit,
-+ .attr = loongson2f_table_attr,
-+};
-+
-+static int __init loongson2f_cpufreq_module_init(void)
-+{
-+ int result;
-+
-+ printk(KERN_INFO "cpufreq: Loongson-2F CPU frequency driver.\n");
-+ result = cpufreq_register_driver(&loongson2f_cpufreq_driver);
-+
-+ if (!result && !nowait) {
-+ saved_cpu_wait = cpu_wait;
-+ cpu_wait = loongson2f_cpu_wait;
-+ }
-+
-+ cpufreq_register_notifier(&loongson2f_cpufreq_notifier_block,
-+ CPUFREQ_TRANSITION_NOTIFIER);
-+ return result;
-+}
-+
-+static void __exit loongson2f_cpufreq_module_exit(void)
-+{
-+ if (!nowait && saved_cpu_wait)
-+ cpu_wait = saved_cpu_wait;
-+ cpufreq_unregister_driver(&loongson2f_cpufreq_driver);
-+ cpufreq_unregister_notifier(&loongson2f_cpufreq_notifier_block,
-+ CPUFREQ_TRANSITION_NOTIFIER);
-+}
-+
-+module_init(loongson2f_cpufreq_module_init);
-+module_exit(loongson2f_cpufreq_module_exit);
-+
-+module_param(nowait, uint, 0644);
-+MODULE_PARM_DESC(nowait, "Disable Loongson-2F specific wait");
-+
-+MODULE_AUTHOR("Yanhua <yanh@lemote.com>");
-+MODULE_DESCRIPTION("cpufreq driver for Loongson2F");
-+MODULE_LICENSE("GPL");
-diff -Nur linux-2.6.30.5.orig/arch/mips/kernel/Makefile linux-2.6.30.5/arch/mips/kernel/Makefile
---- linux-2.6.30.5.orig/arch/mips/kernel/Makefile 2009-08-16 23:19:38.000000000 +0200
-+++ linux-2.6.30.5/arch/mips/kernel/Makefile 2009-08-23 19:01:04.000000000 +0200
-@@ -73,6 +73,7 @@
- obj-$(CONFIG_MIPS32_COMPAT) += linux32.o ptrace32.o signal32.o
- obj-$(CONFIG_MIPS32_N32) += binfmt_elfn32.o scall64-n32.o signal_n32.o
- obj-$(CONFIG_MIPS32_O32) += binfmt_elfo32.o scall64-o32.o
-+obj-$(CONFIG_LOONGSON2F_CPU_FREQ) += loongson2f_freq.o
-
- obj-$(CONFIG_KGDB) += kgdb.o
- obj-$(CONFIG_PROC_FS) += proc.o
-diff -Nur linux-2.6.30.5.orig/arch/mips/lemote/lm2e/bonito-irq.c linux-2.6.30.5/arch/mips/lemote/lm2e/bonito-irq.c
---- linux-2.6.30.5.orig/arch/mips/lemote/lm2e/bonito-irq.c 2009-08-16 23:19:38.000000000 +0200
-+++ linux-2.6.30.5/arch/mips/lemote/lm2e/bonito-irq.c 1970-01-01 01:00:00.000000000 +0100
-@@ -1,74 +0,0 @@
--/*
-- * Copyright 2001 MontaVista Software Inc.
-- * Author: Jun Sun, jsun@mvista.com or jsun@junsun.net
-- * Copyright (C) 2000, 2001 Ralf Baechle (ralf@gnu.org)
-- *
-- * Copyright (C) 2007 Lemote Inc. & Insititute of Computing Technology
-- * Author: Fuxin Zhang, zhangfx@lemote.com
-- *
-- * 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 SOFTWARE IS PROVIDED ``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 AUTHOR 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.
-- *
-- * 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.,
-- * 675 Mass Ave, Cambridge, MA 02139, USA.
-- *
-- */
--#include <linux/errno.h>
--#include <linux/init.h>
--#include <linux/io.h>
--#include <linux/types.h>
--#include <linux/interrupt.h>
--#include <linux/irq.h>
--
--#include <asm/mips-boards/bonito64.h>
--
--
--static inline void bonito_irq_enable(unsigned int irq)
--{
-- BONITO_INTENSET = (1 << (irq - BONITO_IRQ_BASE));
-- mmiowb();
--}
--
--static inline void bonito_irq_disable(unsigned int irq)
--{
-- BONITO_INTENCLR = (1 << (irq - BONITO_IRQ_BASE));
-- mmiowb();
--}
--
--static struct irq_chip bonito_irq_type = {
-- .name = "bonito_irq",
-- .ack = bonito_irq_disable,
-- .mask = bonito_irq_disable,
-- .mask_ack = bonito_irq_disable,
-- .unmask = bonito_irq_enable,
--};
--
--static struct irqaction dma_timeout_irqaction = {
-- .handler = no_action,
-- .name = "dma_timeout",
--};
--
--void bonito_irq_init(void)
--{
-- u32 i;
--
-- for (i = BONITO_IRQ_BASE; i < BONITO_IRQ_BASE + 32; i++) {
-- set_irq_chip_and_handler(i, &bonito_irq_type, handle_level_irq);
-- }
--
-- setup_irq(BONITO_IRQ_BASE + 10, &dma_timeout_irqaction);
--}
-diff -Nur linux-2.6.30.5.orig/arch/mips/lemote/lm2e/dbg_io.c linux-2.6.30.5/arch/mips/lemote/lm2e/dbg_io.c
---- linux-2.6.30.5.orig/arch/mips/lemote/lm2e/dbg_io.c 2009-08-16 23:19:38.000000000 +0200
-+++ linux-2.6.30.5/arch/mips/lemote/lm2e/dbg_io.c 1970-01-01 01:00:00.000000000 +0100
-@@ -1,146 +0,0 @@
--/*
-- * Copyright 2001 MontaVista Software Inc.
-- * Author: Jun Sun, jsun@mvista.com or jsun@junsun.net
-- * Copyright (C) 2000, 2001 Ralf Baechle (ralf@gnu.org)
-- *
-- * Copyright (C) 2007 Lemote Inc. & Insititute of Computing Technology
-- * Author: Fuxin Zhang, zhangfx@lemote.com
-- *
-- * 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 SOFTWARE IS PROVIDED ``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 AUTHOR 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.
-- *
-- * 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.,
-- * 675 Mass Ave, Cambridge, MA 02139, USA.
-- *
-- */
--
--#include <linux/io.h>
--#include <linux/init.h>
--#include <linux/types.h>
--
--#include <asm/serial.h>
--
--#define UART16550_BAUD_2400 2400
--#define UART16550_BAUD_4800 4800
--#define UART16550_BAUD_9600 9600
--#define UART16550_BAUD_19200 19200
--#define UART16550_BAUD_38400 38400
--#define UART16550_BAUD_57600 57600
--#define UART16550_BAUD_115200 115200
--
--#define UART16550_PARITY_NONE 0
--#define UART16550_PARITY_ODD 0x08
--#define UART16550_PARITY_EVEN 0x18
--#define UART16550_PARITY_MARK 0x28
--#define UART16550_PARITY_SPACE 0x38
--
--#define UART16550_DATA_5BIT 0x0
--#define UART16550_DATA_6BIT 0x1
--#define UART16550_DATA_7BIT 0x2
--#define UART16550_DATA_8BIT 0x3
--
--#define UART16550_STOP_1BIT 0x0
--#define UART16550_STOP_2BIT 0x4
--
--/* ----------------------------------------------------- */
--
--/* === CONFIG === */
--#ifdef CONFIG_64BIT
--#define BASE (0xffffffffbfd003f8)
--#else
--#define BASE (0xbfd003f8)
--#endif
--
--#define MAX_BAUD BASE_BAUD
--/* === END OF CONFIG === */
--
--#define REG_OFFSET 1
--
--/* register offset */
--#define OFS_RCV_BUFFER 0
--#define OFS_TRANS_HOLD 0
--#define OFS_SEND_BUFFER 0
--#define OFS_INTR_ENABLE (1*REG_OFFSET)
--#define OFS_INTR_ID (2*REG_OFFSET)
--#define OFS_DATA_FORMAT (3*REG_OFFSET)
--#define OFS_LINE_CONTROL (3*REG_OFFSET)
--#define OFS_MODEM_CONTROL (4*REG_OFFSET)
--#define OFS_RS232_OUTPUT (4*REG_OFFSET)
--#define OFS_LINE_STATUS (5*REG_OFFSET)
--#define OFS_MODEM_STATUS (6*REG_OFFSET)
--#define OFS_RS232_INPUT (6*REG_OFFSET)
--#define OFS_SCRATCH_PAD (7*REG_OFFSET)
--
--#define OFS_DIVISOR_LSB (0*REG_OFFSET)
--#define OFS_DIVISOR_MSB (1*REG_OFFSET)
--
--/* memory-mapped read/write of the port */
--#define UART16550_READ(y) readb((char *)BASE + (y))
--#define UART16550_WRITE(y, z) writeb(z, (char *)BASE + (y))
--
--void debugInit(u32 baud, u8 data, u8 parity, u8 stop)
--{
-- u32 divisor;
--
-- /* disable interrupts */
-- UART16550_WRITE(OFS_INTR_ENABLE, 0);
--
-- /* set up buad rate */
-- /* set DIAB bit */
-- UART16550_WRITE(OFS_LINE_CONTROL, 0x80);
--
-- /* set divisor */
-- divisor = MAX_BAUD / baud;
-- UART16550_WRITE(OFS_DIVISOR_LSB, divisor & 0xff);
-- UART16550_WRITE(OFS_DIVISOR_MSB, (divisor & 0xff00) >> 8);
--
-- /* clear DIAB bit */
-- UART16550_WRITE(OFS_LINE_CONTROL, 0x0);
--
-- /* set data format */
-- UART16550_WRITE(OFS_DATA_FORMAT, data | parity | stop);
--}
--
--static int remoteDebugInitialized;
--
--u8 getDebugChar(void)
--{
-- if (!remoteDebugInitialized) {
-- remoteDebugInitialized = 1;
-- debugInit(UART16550_BAUD_115200,
-- UART16550_DATA_8BIT,
-- UART16550_PARITY_NONE, UART16550_STOP_1BIT);
-- }
--
-- while ((UART16550_READ(OFS_LINE_STATUS) & 0x1) == 0) ;
-- return UART16550_READ(OFS_RCV_BUFFER);
--}
--
--int putDebugChar(u8 byte)
--{
-- if (!remoteDebugInitialized) {
-- remoteDebugInitialized = 1;
-- /*
-- debugInit(UART16550_BAUD_115200,
-- UART16550_DATA_8BIT,
-- UART16550_PARITY_NONE, UART16550_STOP_1BIT); */
-- }
--
-- while ((UART16550_READ(OFS_LINE_STATUS) & 0x20) == 0) ;
-- UART16550_WRITE(OFS_SEND_BUFFER, byte);
-- return 1;
--}
-diff -Nur linux-2.6.30.5.orig/arch/mips/lemote/lm2e/irq.c linux-2.6.30.5/arch/mips/lemote/lm2e/irq.c
---- linux-2.6.30.5.orig/arch/mips/lemote/lm2e/irq.c 2009-08-16 23:19:38.000000000 +0200
-+++ linux-2.6.30.5/arch/mips/lemote/lm2e/irq.c 1970-01-01 01:00:00.000000000 +0100
-@@ -1,143 +0,0 @@
--/*
-- * Copyright (C) 2007 Lemote Inc. & Insititute of Computing Technology
-- * Author: Fuxin Zhang, zhangfx@lemote.com
-- *
-- * 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 SOFTWARE IS PROVIDED ``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 AUTHOR 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.
-- *
-- * 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.,
-- * 675 Mass Ave, Cambridge, MA 02139, USA.
-- *
-- */
--#include <linux/delay.h>
--#include <linux/io.h>
--#include <linux/init.h>
--#include <linux/interrupt.h>
--#include <linux/irq.h>
--
--#include <asm/irq_cpu.h>
--#include <asm/i8259.h>
--#include <asm/mipsregs.h>
--#include <asm/mips-boards/bonito64.h>
--
--
--/*
-- * the first level int-handler will jump here if it is a bonito irq
-- */
--static void bonito_irqdispatch(void)
--{
-- u32 int_status;
-- int i;
--
-- /* workaround the IO dma problem: let cpu looping to allow DMA finish */
-- int_status = BONITO_INTISR;
-- if (int_status & (1 << 10)) {
-- while (int_status & (1 << 10)) {
-- udelay(1);
-- int_status = BONITO_INTISR;
-- }
-- }
--
-- /* Get pending sources, masked by current enables */
-- int_status = BONITO_INTISR & BONITO_INTEN;
--
-- if (int_status != 0) {
-- i = __ffs(int_status);
-- int_status &= ~(1 << i);
-- do_IRQ(BONITO_IRQ_BASE + i);
-- }
--}
--
--static void i8259_irqdispatch(void)
--{
-- int irq;
--
-- irq = i8259_irq();
-- if (irq >= 0) {
-- do_IRQ(irq);
-- } else {
-- spurious_interrupt();
-- }
--
--}
--
--asmlinkage void plat_irq_dispatch(void)
--{
-- unsigned int pending = read_c0_cause() & read_c0_status() & ST0_IM;
--
-- if (pending & CAUSEF_IP7) {
-- do_IRQ(MIPS_CPU_IRQ_BASE + 7);
-- } else if (pending & CAUSEF_IP5) {
-- i8259_irqdispatch();
-- } else if (pending & CAUSEF_IP2) {
-- bonito_irqdispatch();
-- } else {
-- spurious_interrupt();
-- }
--}
--
--static struct irqaction cascade_irqaction = {
-- .handler = no_action,
-- .name = "cascade",
--};
--
--void __init arch_init_irq(void)
--{
-- extern void bonito_irq_init(void);
--
-- /*
-- * Clear all of the interrupts while we change the able around a bit.
-- * int-handler is not on bootstrap
-- */
-- clear_c0_status(ST0_IM | ST0_BEV);
-- local_irq_disable();
--
-- /* most bonito irq should be level triggered */
-- BONITO_INTEDGE = BONITO_ICU_SYSTEMERR | BONITO_ICU_MASTERERR |
-- BONITO_ICU_RETRYERR | BONITO_ICU_MBOXES;
-- BONITO_INTSTEER = 0;
--
-- /*
-- * Mask out all interrupt by writing "1" to all bit position in
-- * the interrupt reset reg.
-- */
-- BONITO_INTENCLR = ~0;
--
-- /* init all controller
-- * 0-15 ------> i8259 interrupt
-- * 16-23 ------> mips cpu interrupt
-- * 32-63 ------> bonito irq
-- */
--
-- /* Sets the first-level interrupt dispatcher. */
-- mips_cpu_irq_init();
-- init_i8259_irqs();
-- bonito_irq_init();
--
-- /*
-- printk("GPIODATA=%x, GPIOIE=%x\n", BONITO_GPIODATA, BONITO_GPIOIE);
-- printk("INTEN=%x, INTSET=%x, INTCLR=%x, INTISR=%x\n",
-- BONITO_INTEN, BONITO_INTENSET,
-- BONITO_INTENCLR, BONITO_INTISR);
-- */
--
-- /* bonito irq at IP2 */
-- setup_irq(MIPS_CPU_IRQ_BASE + 2, &cascade_irqaction);
-- /* 8259 irq at IP5 */
-- setup_irq(MIPS_CPU_IRQ_BASE + 5, &cascade_irqaction);
--
--}
-diff -Nur linux-2.6.30.5.orig/arch/mips/lemote/lm2e/Makefile linux-2.6.30.5/arch/mips/lemote/lm2e/Makefile
---- linux-2.6.30.5.orig/arch/mips/lemote/lm2e/Makefile 2009-08-16 23:19:38.000000000 +0200
-+++ linux-2.6.30.5/arch/mips/lemote/lm2e/Makefile 1970-01-01 01:00:00.000000000 +0100
-@@ -1,7 +0,0 @@
--#
--# Makefile for Lemote Fulong mini-PC board.
--#
--
--obj-y += setup.o prom.o reset.o irq.o pci.o bonito-irq.o dbg_io.o mem.o
--
--EXTRA_CFLAGS += -Werror
-diff -Nur linux-2.6.30.5.orig/arch/mips/lemote/lm2e/mem.c linux-2.6.30.5/arch/mips/lemote/lm2e/mem.c
---- linux-2.6.30.5.orig/arch/mips/lemote/lm2e/mem.c 2009-08-16 23:19:38.000000000 +0200
-+++ linux-2.6.30.5/arch/mips/lemote/lm2e/mem.c 1970-01-01 01:00:00.000000000 +0100
-@@ -1,23 +0,0 @@
--/*
-- * 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.
-- */
--#include <linux/fs.h>
--#include <linux/fcntl.h>
--#include <linux/mm.h>
--
--/* override of arch/mips/mm/cache.c: __uncached_access */
--int __uncached_access(struct file *file, unsigned long addr)
--{
-- if (file->f_flags & O_SYNC)
-- return 1;
--
-- /*
-- * On the Lemote Loongson 2e system, the peripheral registers
-- * reside between 0x1000:0000 and 0x2000:0000.
-- */
-- return addr >= __pa(high_memory) ||
-- ((addr >= 0x10000000) && (addr < 0x20000000));
--}
-diff -Nur linux-2.6.30.5.orig/arch/mips/lemote/lm2e/pci.c linux-2.6.30.5/arch/mips/lemote/lm2e/pci.c
---- linux-2.6.30.5.orig/arch/mips/lemote/lm2e/pci.c 2009-08-16 23:19:38.000000000 +0200
-+++ linux-2.6.30.5/arch/mips/lemote/lm2e/pci.c 1970-01-01 01:00:00.000000000 +0100
-@@ -1,97 +0,0 @@
--/*
-- * pci.c
-- *
-- * Copyright (C) 2007 Lemote, Inc. & Institute of Computing Technology
-- * Author: Fuxin Zhang, zhangfx@lemote.com
-- *
-- * 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 SOFTWARE IS PROVIDED ``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 AUTHOR 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.
-- *
-- * 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.,
-- * 675 Mass Ave, Cambridge, MA 02139, USA.
-- *
-- */
--#include <linux/types.h>
--#include <linux/pci.h>
--#include <linux/kernel.h>
--#include <linux/init.h>
--#include <asm/mips-boards/bonito64.h>
--#include <asm/mach-lemote/pci.h>
--
--extern struct pci_ops bonito64_pci_ops;
--
--static struct resource loongson2e_pci_mem_resource = {
-- .name = "LOONGSON2E PCI MEM",
-- .start = LOONGSON2E_PCI_MEM_START,
-- .end = LOONGSON2E_PCI_MEM_END,
-- .flags = IORESOURCE_MEM,
--};
--
--static struct resource loongson2e_pci_io_resource = {
-- .name = "LOONGSON2E PCI IO MEM",
-- .start = LOONGSON2E_PCI_IO_START,
-- .end = IO_SPACE_LIMIT,
-- .flags = IORESOURCE_IO,
--};
--
--static struct pci_controller loongson2e_pci_controller = {
-- .pci_ops = &bonito64_pci_ops,
-- .io_resource = &loongson2e_pci_io_resource,
-- .mem_resource = &loongson2e_pci_mem_resource,
-- .mem_offset = 0x00000000UL,
-- .io_offset = 0x00000000UL,
--};
--
--static void __init ict_pcimap(void)
--{
-- /*
-- * local to PCI mapping: [256M,512M] -> [256M,512M]; differ from PMON
-- *
-- * CPU address space [256M,448M] is window for accessing pci space
-- * we set pcimap_lo[0,1,2] to map it to pci space [256M,448M]
-- * pcimap: bit18,pcimap_2; bit[17-12],lo2;bit[11-6],lo1;bit[5-0],lo0
-- */
-- /* 1,00 0110 ,0001 01,00 0000 */
-- BONITO_PCIMAP = 0x46140;
--
-- /* 1, 00 0010, 0000,01, 00 0000 */
-- /* BONITO_PCIMAP = 0x42040; */
--
-- /*
-- * PCI to local mapping: [2G,2G+256M] -> [0,256M]
-- */
-- BONITO_PCIBASE0 = 0x80000000;
-- BONITO_PCIBASE1 = 0x00800000;
-- BONITO_PCIBASE2 = 0x90000000;
--
--}
--
--static int __init pcibios_init(void)
--{
-- ict_pcimap();
--
-- loongson2e_pci_controller.io_map_base =
-- (unsigned long) ioremap(LOONGSON2E_IO_PORT_BASE,
-- loongson2e_pci_io_resource.end -
-- loongson2e_pci_io_resource.start + 1);
--
-- register_pci_controller(&loongson2e_pci_controller);
--
-- return 0;
--}
--
--arch_initcall(pcibios_init);
-diff -Nur linux-2.6.30.5.orig/arch/mips/lemote/lm2e/prom.c linux-2.6.30.5/arch/mips/lemote/lm2e/prom.c
---- linux-2.6.30.5.orig/arch/mips/lemote/lm2e/prom.c 2009-08-16 23:19:38.000000000 +0200
-+++ linux-2.6.30.5/arch/mips/lemote/lm2e/prom.c 1970-01-01 01:00:00.000000000 +0100
-@@ -1,97 +0,0 @@
--/*
-- * Based on Ocelot Linux port, which is
-- * Copyright 2001 MontaVista Software Inc.
-- * Author: jsun@mvista.com or jsun@junsun.net
-- *
-- * Copyright 2003 ICT CAS
-- * Author: Michael Guo <guoyi@ict.ac.cn>
-- *
-- * Copyright (C) 2007 Lemote Inc. & Insititute of Computing Technology
-- * Author: Fuxin Zhang, zhangfx@lemote.com
-- *
-- * 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.
-- */
--#include <linux/init.h>
--#include <linux/bootmem.h>
--#include <asm/bootinfo.h>
--
--extern unsigned long bus_clock;
--extern unsigned long cpu_clock_freq;
--extern unsigned int memsize, highmemsize;
--extern int putDebugChar(unsigned char byte);
--
--static int argc;
--/* pmon passes arguments in 32bit pointers */
--static int *arg;
--static int *env;
--
--const char *get_system_type(void)
--{
-- return "lemote-fulong";
--}
--
--void __init prom_init_cmdline(void)
--{
-- int i;
-- long l;
--
-- /* arg[0] is "g", the rest is boot parameters */
-- arcs_cmdline[0] = '\0';
-- for (i = 1; i < argc; i++) {
-- l = (long)arg[i];
-- if (strlen(arcs_cmdline) + strlen(((char *)l) + 1)
-- >= sizeof(arcs_cmdline))
-- break;
-- strcat(arcs_cmdline, ((char *)l));
-- strcat(arcs_cmdline, " ");
-- }
--}
--
--void __init prom_init(void)
--{
-- long l;
-- argc = fw_arg0;
-- arg = (int *)fw_arg1;
-- env = (int *)fw_arg2;
--
-- prom_init_cmdline();
--
-- if ((strstr(arcs_cmdline, "console=")) == NULL)
-- strcat(arcs_cmdline, " console=ttyS0,115200");
-- if ((strstr(arcs_cmdline, "root=")) == NULL)
-- strcat(arcs_cmdline, " root=/dev/hda1");
--
--#define parse_even_earlier(res, option, p) \
--do { \
-- if (strncmp(option, (char *)p, strlen(option)) == 0) \
-- res = simple_strtol((char *)p + strlen(option"="), \
-- NULL, 10); \
--} while (0)
--
-- l = (long)*env;
-- while (l != 0) {
-- parse_even_earlier(bus_clock, "busclock", l);
-- parse_even_earlier(cpu_clock_freq, "cpuclock", l);
-- parse_even_earlier(memsize, "memsize", l);
-- parse_even_earlier(highmemsize, "highmemsize", l);
-- env++;
-- l = (long)*env;
-- }
-- if (memsize == 0)
-- memsize = 256;
--
-- pr_info("busclock=%ld, cpuclock=%ld,memsize=%d,highmemsize=%d\n",
-- bus_clock, cpu_clock_freq, memsize, highmemsize);
--}
--
--void __init prom_free_prom_memory(void)
--{
--}
--
--void prom_putchar(char c)
--{
-- putDebugChar(c);
--}
-diff -Nur linux-2.6.30.5.orig/arch/mips/lemote/lm2e/reset.c linux-2.6.30.5/arch/mips/lemote/lm2e/reset.c
---- linux-2.6.30.5.orig/arch/mips/lemote/lm2e/reset.c 2009-08-16 23:19:38.000000000 +0200
-+++ linux-2.6.30.5/arch/mips/lemote/lm2e/reset.c 1970-01-01 01:00:00.000000000 +0100
-@@ -1,41 +0,0 @@
--/*
-- * 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.
-- *
-- * Copyright (C) 2007 Lemote, Inc. & Institute of Computing Technology
-- * Author: Fuxin Zhang, zhangfx@lemote.com
-- */
--#include <linux/pm.h>
--
--#include <asm/reboot.h>
--
--static void loongson2e_restart(char *command)
--{
--#ifdef CONFIG_32BIT
-- *(unsigned long *)0xbfe00104 &= ~(1 << 2);
-- *(unsigned long *)0xbfe00104 |= (1 << 2);
--#else
-- *(unsigned long *)0xffffffffbfe00104 &= ~(1 << 2);
-- *(unsigned long *)0xffffffffbfe00104 |= (1 << 2);
--#endif
-- __asm__ __volatile__("jr\t%0"::"r"(0xbfc00000));
--}
--
--static void loongson2e_halt(void)
--{
-- while (1) ;
--}
--
--static void loongson2e_power_off(void)
--{
-- loongson2e_halt();
--}
--
--void mips_reboot_setup(void)
--{
-- _machine_restart = loongson2e_restart;
-- _machine_halt = loongson2e_halt;
-- pm_power_off = loongson2e_power_off;
--}
-diff -Nur linux-2.6.30.5.orig/arch/mips/lemote/lm2e/setup.c linux-2.6.30.5/arch/mips/lemote/lm2e/setup.c
---- linux-2.6.30.5.orig/arch/mips/lemote/lm2e/setup.c 2009-08-16 23:19:38.000000000 +0200
-+++ linux-2.6.30.5/arch/mips/lemote/lm2e/setup.c 1970-01-01 01:00:00.000000000 +0100
-@@ -1,111 +0,0 @@
--/*
-- * BRIEF MODULE DESCRIPTION
-- * setup.c - board dependent boot routines
-- *
-- * Copyright (C) 2007 Lemote Inc. & Insititute of Computing Technology
-- * Author: Fuxin Zhang, zhangfx@lemote.com
-- *
-- * 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 SOFTWARE IS PROVIDED ``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 AUTHOR 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.
-- *
-- * 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.,
-- * 675 Mass Ave, Cambridge, MA 02139, USA.
-- *
-- */
--#include <linux/bootmem.h>
--#include <linux/init.h>
--#include <linux/irq.h>
--
--#include <asm/bootinfo.h>
--#include <asm/mc146818-time.h>
--#include <asm/time.h>
--#include <asm/wbflush.h>
--#include <asm/mach-lemote/pci.h>
--
--#ifdef CONFIG_VT
--#include <linux/console.h>
--#include <linux/screen_info.h>
--#endif
--
--extern void mips_reboot_setup(void);
--
--unsigned long cpu_clock_freq;
--unsigned long bus_clock;
--unsigned int memsize;
--unsigned int highmemsize = 0;
--
--void __init plat_time_init(void)
--{
-- /* setup mips r4k timer */
-- mips_hpt_frequency = cpu_clock_freq / 2;
--}
--
--unsigned long read_persistent_clock(void)
--{
-- return mc146818_get_cmos_time();
--}
--
--void (*__wbflush)(void);
--EXPORT_SYMBOL(__wbflush);
--
--static void wbflush_loongson2e(void)
--{
-- asm(".set\tpush\n\t"
-- ".set\tnoreorder\n\t"
-- ".set mips3\n\t"
-- "sync\n\t"
-- "nop\n\t"
-- ".set\tpop\n\t"
-- ".set mips0\n\t");
--}
--
--void __init plat_mem_setup(void)
--{
-- set_io_port_base((unsigned long)ioremap(LOONGSON2E_IO_PORT_BASE,
-- IO_SPACE_LIMIT - LOONGSON2E_PCI_IO_START + 1));
-- mips_reboot_setup();
--
-- __wbflush = wbflush_loongson2e;
--
-- add_memory_region(0x0, (memsize << 20), BOOT_MEM_RAM);
--#ifdef CONFIG_64BIT
-- if (highmemsize > 0) {
-- add_memory_region(0x20000000, highmemsize << 20, BOOT_MEM_RAM);
-- }
--#endif
--
--#ifdef CONFIG_VT
--#if defined(CONFIG_VGA_CONSOLE)
-- conswitchp = &vga_con;
--
-- screen_info = (struct screen_info) {
-- 0, 25, /* orig-x, orig-y */
-- 0, /* unused */
-- 0, /* orig-video-page */
-- 0, /* orig-video-mode */
-- 80, /* orig-video-cols */
-- 0, 0, 0, /* ega_ax, ega_bx, ega_cx */
-- 25, /* orig-video-lines */
-- VIDEO_TYPE_VGAC, /* orig-video-isVGA */
-- 16 /* orig-video-points */
-- };
--#elif defined(CONFIG_DUMMY_CONSOLE)
-- conswitchp = &dummy_con;
--#endif
--#endif
--
--}
-diff -Nur linux-2.6.30.5.orig/arch/mips/loongson/common/bonito-irq.c linux-2.6.30.5/arch/mips/loongson/common/bonito-irq.c
---- linux-2.6.30.5.orig/arch/mips/loongson/common/bonito-irq.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.30.5/arch/mips/loongson/common/bonito-irq.c 2009-08-23 19:01:04.000000000 +0200
-@@ -0,0 +1,78 @@
-+/*
-+ * Copyright 2001 MontaVista Software Inc.
-+ * Author: Jun Sun, jsun@mvista.com or jsun@junsun.net
-+ * Copyright (C) 2000, 2001 Ralf Baechle (ralf@gnu.org)
-+ *
-+ * Copyright (C) 2007 Lemote Inc. & Insititute of Computing Technology
-+ * Author: Fuxin Zhang, zhangfx@lemote.com
-+ *
-+ * 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 SOFTWARE IS PROVIDED ``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 AUTHOR 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.
-+ *
-+ * 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.,
-+ * 675 Mass Ave, Cambridge, MA 02139, USA.
-+ *
-+ */
-+
-+#include <linux/interrupt.h>
-+
-+#include <loongson.h>
-+#include <machine.h>
-+
-+static inline void bonito_irq_enable(unsigned int irq)
-+{
-+ LOONGSON_INTENSET = (1 << (irq - LOONGSON_IRQ_BASE));
-+ /* flush posted write */
-+ (void)LOONGSON_INTENSET;
-+ mmiowb();
-+}
-+
-+static inline void bonito_irq_disable(unsigned int irq)
-+{
-+ LOONGSON_INTENCLR = (1 << (irq - LOONGSON_IRQ_BASE));
-+ /* flush posted write */
-+ (void)LOONGSON_INTENCLR;
-+ mmiowb();
-+}
-+
-+static struct irq_chip bonito_irq_type = {
-+ .name = "bonito_irq",
-+ .ack = bonito_irq_disable,
-+ .mask = bonito_irq_disable,
-+ .mask_ack = bonito_irq_disable,
-+ .unmask = bonito_irq_enable,
-+};
-+
-+/* there is no need to handle dma timeout in loongson-2f based machines */
-+#ifdef CONFIG_CPU_LOONGSON2E
-+static struct irqaction dma_timeout_irqaction = {
-+ .handler = no_action,
-+ .name = "dma_timeout",
-+};
-+#endif
-+
-+void bonito_irq_init(void)
-+{
-+ u32 i;
-+
-+ for (i = LOONGSON_IRQ_BASE; i < LOONGSON_IRQ_BASE + 32; i++)
-+ set_irq_chip_and_handler(i, &bonito_irq_type, handle_level_irq);
-+
-+#ifdef CONFIG_CPU_LOONGSON2E
-+ setup_irq(LOONGSON_DMATIMEOUT_IRQ, &dma_timeout_irqaction);
-+#endif
-+}
-diff -Nur linux-2.6.30.5.orig/arch/mips/loongson/common/clock.c linux-2.6.30.5/arch/mips/loongson/common/clock.c
---- linux-2.6.30.5.orig/arch/mips/loongson/common/clock.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.30.5/arch/mips/loongson/common/clock.c 2009-08-23 19:01:04.000000000 +0200
-@@ -0,0 +1,166 @@
-+/*
-+ * arch/mips/loongson/common/clock.c
-+ *
-+ * Copyright (C) 2006 - 2008 Lemote Inc. & Insititute of Computing Technology
-+ * Author: Yanhua, yanh@lemote.com
-+ *
-+ * This file is subject to the terms and conditions of the GNU General Public
-+ * License. See the file "COPYING" in the main directory of this archive
-+ * for more details.
-+ */
-+
-+#include <linux/cpufreq.h>
-+#include <linux/platform_device.h>
-+
-+#include <loongson.h>
-+#include <clock.h>
-+
-+static LIST_HEAD(clock_list);
-+static DEFINE_SPINLOCK(clock_lock);
-+static DEFINE_MUTEX(clock_list_sem);
-+
-+/* Minimum CLK support */
-+enum {
-+ DC_ZERO, DC_25PT = 2, DC_37PT, DC_50PT, DC_62PT, DC_75PT,
-+ DC_87PT, DC_DISABLE, DC_RESV
-+};
-+
-+struct cpufreq_frequency_table loongson2f_clockmod_table[] = {
-+ {DC_RESV, CPUFREQ_ENTRY_INVALID},
-+ {DC_ZERO, CPUFREQ_ENTRY_INVALID},
-+ {DC_25PT, 0},
-+ {DC_37PT, 0},
-+ {DC_50PT, 0},
-+ {DC_62PT, 0},
-+ {DC_75PT, 0},
-+ {DC_87PT, 0},
-+ {DC_DISABLE, 0},
-+ {DC_RESV, CPUFREQ_TABLE_END},
-+};
-+EXPORT_SYMBOL_GPL(loongson2f_clockmod_table);
-+
-+static struct clk cpu_clk = {
-+ .name = "cpu_clk",
-+ .flags = CLK_ALWAYS_ENABLED | CLK_RATE_PROPAGATES,
-+ .rate = 800000000,
-+};
-+
-+struct clk *clk_get(struct device *dev, const char *id)
-+{
-+ return &cpu_clk;
-+}
-+EXPORT_SYMBOL(clk_get);
-+
-+static void propagate_rate(struct clk *clk)
-+{
-+ struct clk *clkp;
-+
-+ list_for_each_entry(clkp, &clock_list, node) {
-+ if (likely(clkp->parent != clk))
-+ continue;
-+ if (likely(clkp->ops && clkp->ops->recalc))
-+ clkp->ops->recalc(clkp);
-+ if (unlikely(clkp->flags & CLK_RATE_PROPAGATES))
-+ propagate_rate(clkp);
-+ }
-+}
-+
-+int clk_enable(struct clk *clk)
-+{
-+ return 0;
-+}
-+EXPORT_SYMBOL(clk_enable);
-+
-+void clk_disable(struct clk *clk)
-+{
-+}
-+EXPORT_SYMBOL(clk_disable);
-+
-+unsigned long clk_get_rate(struct clk *clk)
-+{
-+ return (unsigned long)clk->rate;
-+}
-+EXPORT_SYMBOL(clk_get_rate);
-+
-+void clk_put(struct clk *clk)
-+{
-+}
-+EXPORT_SYMBOL(clk_put);
-+
-+int clk_set_rate(struct clk *clk, unsigned long rate)
-+{
-+ return clk_set_rate_ex(clk, rate, 0);
-+}
-+EXPORT_SYMBOL_GPL(clk_set_rate);
-+
-+int clk_set_rate_ex(struct clk *clk, unsigned long rate, int algo_id)
-+{
-+ int ret = 0;
-+ int regval;
-+ int i;
-+
-+ if (likely(clk->ops && clk->ops->set_rate)) {
-+ unsigned long flags;
-+
-+ spin_lock_irqsave(&clock_lock, flags);
-+ ret = clk->ops->set_rate(clk, rate, algo_id);
-+ spin_unlock_irqrestore(&clock_lock, flags);
-+ }
-+
-+ if (unlikely(clk->flags & CLK_RATE_PROPAGATES))
-+ propagate_rate(clk);
-+
-+ for (i = 0; loongson2f_clockmod_table[i].frequency != CPUFREQ_TABLE_END;
-+ i++) {
-+ if (loongson2f_clockmod_table[i].frequency ==
-+ CPUFREQ_ENTRY_INVALID)
-+ continue;
-+ if (rate == loongson2f_clockmod_table[i].frequency)
-+ break;
-+ }
-+ if (rate != loongson2f_clockmod_table[i].frequency)
-+ return -ENOTSUPP;
-+
-+ clk->rate = rate;
-+
-+ regval = LOONGSON_CHIPCFG0;
-+ regval = (regval & ~0x7) | (loongson2f_clockmod_table[i].index - 1);
-+ LOONGSON_CHIPCFG0 = regval;
-+
-+ return ret;
-+}
-+EXPORT_SYMBOL_GPL(clk_set_rate_ex);
-+
-+long clk_round_rate(struct clk *clk, unsigned long rate)
-+{
-+ if (likely(clk->ops && clk->ops->round_rate)) {
-+ unsigned long flags, rounded;
-+
-+ spin_lock_irqsave(&clock_lock, flags);
-+ rounded = clk->ops->round_rate(clk, rate);
-+ spin_unlock_irqrestore(&clock_lock, flags);
-+
-+ return rounded;
-+ }
-+
-+ return rate;
-+}
-+EXPORT_SYMBOL_GPL(clk_round_rate);
-+
-+/*
-+ * This is the simple version of Loongson-2F wait
-+ * Maybe we need do this in interrupt disabled content
-+ */
-+DEFINE_SPINLOCK(loongson2f_wait_lock);
-+void loongson2f_cpu_wait(void)
-+{
-+ u32 cpu_freq;
-+ unsigned long flags;
-+
-+ spin_lock_irqsave(&loongson2f_wait_lock, flags);
-+ cpu_freq = LOONGSON_CHIPCFG0;
-+ LOONGSON_CHIPCFG0 &= ~0x7; /* Put CPU into wait mode */
-+ LOONGSON_CHIPCFG0 = cpu_freq; /* Restore CPU state */
-+ spin_unlock_irqrestore(&loongson2f_wait_lock, flags);
-+}
-+EXPORT_SYMBOL_GPL(loongson2f_cpu_wait);
-diff -Nur linux-2.6.30.5.orig/arch/mips/loongson/common/cmdline.c linux-2.6.30.5/arch/mips/loongson/common/cmdline.c
---- linux-2.6.30.5.orig/arch/mips/loongson/common/cmdline.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.30.5/arch/mips/loongson/common/cmdline.c 2009-08-23 19:01:04.000000000 +0200
-@@ -0,0 +1,57 @@
-+/*
-+ * Based on Ocelot Linux port, which is
-+ * Copyright 2001 MontaVista Software Inc.
-+ * Author: jsun@mvista.com or jsun@junsun.net
-+ *
-+ * Copyright 2003 ICT CAS
-+ * Author: Michael Guo <guoyi@ict.ac.cn>
-+ *
-+ * Copyright (C) 2007 Lemote Inc. & Insititute of Computing Technology
-+ * Author: Fuxin Zhang, zhangfx@lemote.com
-+ *
-+ * Copyright (C) 2009 Lemote Inc. & Insititute of Computing Technology
-+ * Author: Wu Zhangjin, wuzj@lemote.com
-+ *
-+ * 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.
-+ */
-+
-+#include <asm/bootinfo.h>
-+
-+#include <loongson.h>
-+#include <cmdline.h>
-+
-+int prom_argc;
-+/* pmon passes arguments in 32bit pointers */
-+int *_prom_argv;
-+
-+void __init prom_init_cmdline(void)
-+{
-+ int i;
-+ long l;
-+
-+ /* firmware arguments are initialized in head.S */
-+ prom_argc = fw_arg0;
-+ _prom_argv = (int *)fw_arg1;
-+
-+ /* arg[0] is "g", the rest is boot parameters */
-+ arcs_cmdline[0] = '\0';
-+ for (i = 1; i < prom_argc; i++) {
-+ l = (long)_prom_argv[i];
-+ if (strlen(arcs_cmdline) + strlen(((char *)l) + 1)
-+ >= sizeof(arcs_cmdline))
-+ break;
-+ strcat(arcs_cmdline, ((char *)l));
-+ strcat(arcs_cmdline, " ");
-+ }
-+
-+ /* machine specific prom_init_cmdline */
-+ mach_prom_init_cmdline();
-+
-+ if ((strstr(arcs_cmdline, "console=")) == NULL)
-+ strcat(arcs_cmdline, " console=tty");
-+ if ((strstr(arcs_cmdline, "root=")) == NULL)
-+ strcat(arcs_cmdline, " root=/dev/sda1");
-+}
-diff -Nur linux-2.6.30.5.orig/arch/mips/loongson/common/cs5536/cs5536_acc.c linux-2.6.30.5/arch/mips/loongson/common/cs5536/cs5536_acc.c
---- linux-2.6.30.5.orig/arch/mips/loongson/common/cs5536/cs5536_acc.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.30.5/arch/mips/loongson/common/cs5536/cs5536_acc.c 2009-08-23 19:01:04.000000000 +0200
-@@ -0,0 +1,156 @@
-+/*
-+ * the ACC Virtual Support Module of AMD CS5536
-+ *
-+ * Copyright (C) 2007 Lemote, Inc. & Institute of Computing Technology
-+ * Author : jlliu, liujl@lemote.com
-+ *
-+ * Copyright (C) 2009 Lemote, Inc. & Institute of Computing Technology
-+ * Author: Wu Zhangjin, wuzj@lemote.com
-+ *
-+ * 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.
-+ */
-+
-+#include <cs5536/cs5536.h>
-+#include <cs5536/cs5536_pci.h>
-+
-+/*
-+ * acc_write: acc write transfering
-+ */
-+
-+void pci_acc_write_reg(int reg, u32 value)
-+{
-+ u32 hi = 0, lo = value;
-+
-+ switch (reg) {
-+ case PCI_COMMAND:
-+ _rdmsr(GLIU_MSR_REG(GLIU_PAE), &hi, &lo);
-+ if (value & PCI_COMMAND_MASTER)
-+ lo |= (0x03 << 8);
-+ else
-+ lo &= ~(0x03 << 8);
-+ _wrmsr(GLIU_MSR_REG(GLIU_PAE), hi, lo);
-+ break;
-+ case PCI_STATUS:
-+ if (value & PCI_STATUS_PARITY) {
-+ _rdmsr(SB_MSR_REG(SB_ERROR), &hi, &lo);
-+ if (lo & SB_PARE_ERR_FLAG) {
-+ lo = (lo & 0x0000ffff) | SB_PARE_ERR_FLAG;
-+ _wrmsr(SB_MSR_REG(SB_ERROR), hi, lo);
-+ }
-+ }
-+ break;
-+ case PCI_BAR0_REG:
-+ if (value == PCI_BAR_RANGE_MASK) {
-+ _rdmsr(GLCP_MSR_REG(GLCP_SOFT_COM), &hi, &lo);
-+ lo |= SOFT_BAR_ACC_FLAG;
-+ _wrmsr(GLCP_MSR_REG(GLCP_SOFT_COM), hi, lo);
-+ } else if (value & 0x01) {
-+ value &= 0xfffffffc;
-+ hi = 0xA0000000 | ((value & 0x000ff000) >> 12);
-+ lo = 0x000fff80 | ((value & 0x00000fff) << 20);
-+ _wrmsr(GLIU_MSR_REG(GLIU_IOD_BM1), hi, lo);
-+ }
-+ break;
-+ case PCI_ACC_INT_REG:
-+ _rdmsr(DIVIL_MSR_REG(PIC_YSEL_LOW), &hi, &lo);
-+ /* disable all the usb interrupt in PIC */
-+ lo &= ~(0xf << PIC_YSEL_LOW_ACC_SHIFT);
-+ if (value) /* enable all the acc interrupt in PIC */
-+ lo |= (CS5536_ACC_INTR << PIC_YSEL_LOW_ACC_SHIFT);
-+ _wrmsr(DIVIL_MSR_REG(PIC_YSEL_LOW), hi, lo);
-+ break;
-+ default:
-+ break;
-+ }
-+
-+ return;
-+}
-+
-+/*
-+ * acc_read: acc read transfering
-+ */
-+
-+u32 pci_acc_read_reg(int reg)
-+{
-+ u32 hi, lo;
-+ u32 conf_data = 0;
-+
-+ switch (reg) {
-+ case PCI_VENDOR_ID:
-+ conf_data =
-+ CFG_PCI_VENDOR_ID(CS5536_ACC_DEVICE_ID, CS5536_VENDOR_ID);
-+ break;
-+ case PCI_COMMAND:
-+ _rdmsr(GLIU_MSR_REG(GLIU_IOD_BM1), &hi, &lo);
-+ if (((lo & 0xfff00000) || (hi & 0x000000ff))
-+ && ((hi & 0xf0000000) == 0xa0000000))
-+ conf_data |= PCI_COMMAND_IO;
-+ _rdmsr(GLIU_MSR_REG(GLIU_PAE), &hi, &lo);
-+ if ((lo & 0x300) == 0x300)
-+ conf_data |= PCI_COMMAND_MASTER;
-+ break;
-+ case PCI_STATUS:
-+ conf_data |= PCI_STATUS_66MHZ;
-+ conf_data |= PCI_STATUS_FAST_BACK;
-+ _rdmsr(SB_MSR_REG(SB_ERROR), &hi, &lo);
-+ if (lo & SB_PARE_ERR_FLAG)
-+ conf_data |= PCI_STATUS_PARITY;
-+ conf_data |= PCI_STATUS_DEVSEL_MEDIUM;
-+ break;
-+ case PCI_CLASS_REVISION:
-+ _rdmsr(ACC_MSR_REG(ACC_CAP), &hi, &lo);
-+ conf_data = lo & 0x000000ff;
-+ conf_data |= (CS5536_ACC_CLASS_CODE << 8);
-+ break;
-+ case PCI_CACHE_LINE_SIZE:
-+ conf_data =
-+ CFG_PCI_CACHE_LINE_SIZE(PCI_NORMAL_HEADER_TYPE,
-+ PCI_NORMAL_LATENCY_TIMER);
-+ break;
-+ case PCI_BAR0_REG:
-+ _rdmsr(GLCP_MSR_REG(GLCP_SOFT_COM), &hi, &lo);
-+ if (lo & SOFT_BAR_ACC_FLAG) {
-+ conf_data = CS5536_ACC_RANGE |
-+ PCI_BASE_ADDRESS_SPACE_IO;
-+ lo &= ~SOFT_BAR_ACC_FLAG;
-+ _wrmsr(GLCP_MSR_REG(GLCP_SOFT_COM), hi, lo);
-+ } else {
-+ _rdmsr(GLIU_MSR_REG(GLIU_IOD_BM1), &hi, &lo);
-+ conf_data = (hi & 0x000000ff) << 12;
-+ conf_data |= (lo & 0xfff00000) >> 20;
-+ conf_data |= 0x01;
-+ conf_data &= ~0x02;
-+ }
-+ break;
-+ case PCI_BAR1_REG:
-+ case PCI_BAR2_REG:
-+ case PCI_BAR3_REG:
-+ case PCI_BAR4_REG:
-+ case PCI_BAR5_REG:
-+ break;
-+ case PCI_CARDBUS_CIS:
-+ conf_data = PCI_CARDBUS_CIS_POINTER;
-+ break;
-+ case PCI_SUBSYSTEM_VENDOR_ID:
-+ conf_data =
-+ CFG_PCI_VENDOR_ID(CS5536_ACC_SUB_ID, CS5536_SUB_VENDOR_ID);
-+ break;
-+ case PCI_ROM_ADDRESS:
-+ conf_data = PCI_EXPANSION_ROM_BAR;
-+ break;
-+ case PCI_CAPABILITY_LIST:
-+ conf_data = PCI_CAPLIST_USB_POINTER;
-+ break;
-+ case PCI_INTERRUPT_LINE:
-+ conf_data =
-+ CFG_PCI_INTERRUPT_LINE(PCI_DEFAULT_PIN, CS5536_ACC_INTR);
-+ break;
-+ default:
-+ break;
-+ }
-+
-+ return conf_data;
-+}
-diff -Nur linux-2.6.30.5.orig/arch/mips/loongson/common/cs5536/cs5536_ehci.c linux-2.6.30.5/arch/mips/loongson/common/cs5536/cs5536_ehci.c
---- linux-2.6.30.5.orig/arch/mips/loongson/common/cs5536/cs5536_ehci.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.30.5/arch/mips/loongson/common/cs5536/cs5536_ehci.c 2009-08-23 19:01:04.000000000 +0200
-@@ -0,0 +1,166 @@
-+/*
-+ * the EHCI Virtual Support Module of AMD CS5536
-+ *
-+ * Copyright (C) 2007 Lemote, Inc. & Institute of Computing Technology
-+ * Author : jlliu, liujl@lemote.com
-+ *
-+ * Copyright (C) 2009 Lemote, Inc. & Institute of Computing Technology
-+ * Author: Wu Zhangjin, wuzj@lemote.com
-+ *
-+ * 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.
-+ */
-+
-+#include <cs5536/cs5536.h>
-+#include <cs5536/cs5536_pci.h>
-+
-+void pci_ehci_write_reg(int reg, u32 value)
-+{
-+ u32 hi = 0, lo = value;
-+
-+ switch (reg) {
-+ case PCI_COMMAND:
-+ _rdmsr(USB_MSR_REG(USB_EHCI), &hi, &lo);
-+ if (value & PCI_COMMAND_MASTER)
-+ hi |= PCI_COMMAND_MASTER;
-+ else
-+ hi &= ~PCI_COMMAND_MASTER;
-+
-+ if (value & PCI_COMMAND_MEMORY)
-+ hi |= PCI_COMMAND_MEMORY;
-+ else
-+ hi &= ~PCI_COMMAND_MEMORY;
-+ _wrmsr(USB_MSR_REG(USB_EHCI), hi, lo);
-+ break;
-+ case PCI_STATUS:
-+ if (value & PCI_STATUS_PARITY) {
-+ _rdmsr(SB_MSR_REG(SB_ERROR), &hi, &lo);
-+ if (lo & SB_PARE_ERR_FLAG) {
-+ lo = (lo & 0x0000ffff) | SB_PARE_ERR_FLAG;
-+ _wrmsr(SB_MSR_REG(SB_ERROR), hi, lo);
-+ }
-+ }
-+ break;
-+ case PCI_BAR0_REG:
-+ if (value == PCI_BAR_RANGE_MASK) {
-+ _rdmsr(GLCP_MSR_REG(GLCP_SOFT_COM), &hi, &lo);
-+ lo |= SOFT_BAR_EHCI_FLAG;
-+ _wrmsr(GLCP_MSR_REG(GLCP_SOFT_COM), hi, lo);
-+ } else if ((value & 0x01) == 0x00) {
-+ _wrmsr(USB_MSR_REG(USB_EHCI), hi, lo);
-+
-+ value &= 0xfffffff0;
-+ hi = 0x40000000 | ((value & 0xff000000) >> 24);
-+ lo = 0x000fffff | ((value & 0x00fff000) << 8);
-+ _wrmsr(GLIU_MSR_REG(GLIU_P2D_BM4), hi, lo);
-+ }
-+ break;
-+ case PCI_EHCI_LEGSMIEN_REG:
-+ _rdmsr(USB_MSR_REG(USB_EHCI), &hi, &lo);
-+ hi &= 0x003f0000;
-+ hi |= (value & 0x3f) << 16;
-+ _wrmsr(USB_MSR_REG(USB_EHCI), hi, lo);
-+ break;
-+ case PCI_EHCI_FLADJ_REG:
-+ _rdmsr(USB_MSR_REG(USB_EHCI), &hi, &lo);
-+ hi &= ~0x00003f00;
-+ hi |= value & 0x00003f00;
-+ _wrmsr(USB_MSR_REG(USB_EHCI), hi, lo);
-+ break;
-+ default:
-+ break;
-+ }
-+
-+ return;
-+}
-+
-+u32 pci_ehci_read_reg(int reg)
-+{
-+ u32 conf_data = 0;
-+ u32 hi, lo;
-+
-+ switch (reg) {
-+ case PCI_VENDOR_ID:
-+ conf_data =
-+ CFG_PCI_VENDOR_ID(CS5536_EHCI_DEVICE_ID, CS5536_VENDOR_ID);
-+ break;
-+ case PCI_COMMAND:
-+ _rdmsr(USB_MSR_REG(USB_EHCI), &hi, &lo);
-+ if (hi & PCI_COMMAND_MASTER)
-+ conf_data |= PCI_COMMAND_MASTER;
-+ if (hi & PCI_COMMAND_MEMORY)
-+ conf_data |= PCI_COMMAND_MEMORY;
-+ break;
-+ case PCI_STATUS:
-+ conf_data |= PCI_STATUS_66MHZ;
-+ conf_data |= PCI_STATUS_FAST_BACK;
-+ _rdmsr(SB_MSR_REG(SB_ERROR), &hi, &lo);
-+ if (lo & SB_PARE_ERR_FLAG)
-+ conf_data |= PCI_STATUS_PARITY;
-+ conf_data |= PCI_STATUS_DEVSEL_MEDIUM;
-+ break;
-+ case PCI_CLASS_REVISION:
-+ _rdmsr(USB_MSR_REG(USB_CAP), &hi, &lo);
-+ conf_data = lo & 0x000000ff;
-+ conf_data |= (CS5536_EHCI_CLASS_CODE << 8);
-+ break;
-+ case PCI_CACHE_LINE_SIZE:
-+ conf_data =
-+ CFG_PCI_CACHE_LINE_SIZE(PCI_NORMAL_HEADER_TYPE,
-+ PCI_NORMAL_LATENCY_TIMER);
-+ break;
-+ case PCI_BAR0_REG:
-+ _rdmsr(GLCP_MSR_REG(GLCP_SOFT_COM), &hi, &lo);
-+ if (lo & SOFT_BAR_EHCI_FLAG) {
-+ conf_data = CS5536_EHCI_RANGE |
-+ PCI_BASE_ADDRESS_SPACE_MEMORY;
-+ lo &= ~SOFT_BAR_EHCI_FLAG;
-+ _wrmsr(GLCP_MSR_REG(GLCP_SOFT_COM), hi, lo);
-+ } else {
-+ _rdmsr(USB_MSR_REG(USB_EHCI), &hi, &lo);
-+ conf_data = lo & 0xfffff000;
-+ }
-+ break;
-+ case PCI_BAR1_REG:
-+ case PCI_BAR2_REG:
-+ case PCI_BAR3_REG:
-+ case PCI_BAR4_REG:
-+ case PCI_BAR5_REG:
-+ break;
-+ case PCI_CARDBUS_CIS:
-+ conf_data = PCI_CARDBUS_CIS_POINTER;
-+ break;
-+ case PCI_SUBSYSTEM_VENDOR_ID:
-+ conf_data =
-+ CFG_PCI_VENDOR_ID(CS5536_EHCI_SUB_ID, CS5536_SUB_VENDOR_ID);
-+ break;
-+ case PCI_ROM_ADDRESS:
-+ conf_data = PCI_EXPANSION_ROM_BAR;
-+ break;
-+ case PCI_CAPABILITY_LIST:
-+ conf_data = PCI_CAPLIST_USB_POINTER;
-+ break;
-+ case PCI_INTERRUPT_LINE:
-+ conf_data =
-+ CFG_PCI_INTERRUPT_LINE(PCI_DEFAULT_PIN, CS5536_USB_INTR);
-+ break;
-+ case PCI_EHCI_LEGSMIEN_REG:
-+ _rdmsr(USB_MSR_REG(USB_EHCI), &hi, &lo);
-+ conf_data = (hi & 0x003f0000) >> 16;
-+ break;
-+ case PCI_EHCI_LEGSMISTS_REG:
-+ _rdmsr(USB_MSR_REG(USB_EHCI), &hi, &lo);
-+ conf_data = (hi & 0x3f000000) >> 24;
-+ break;
-+ case PCI_EHCI_FLADJ_REG:
-+ _rdmsr(USB_MSR_REG(USB_EHCI), &hi, &lo);
-+ conf_data = hi & 0x00003f00;
-+ break;
-+ default:
-+ break;
-+ }
-+
-+ return conf_data;
-+}
-diff -Nur linux-2.6.30.5.orig/arch/mips/loongson/common/cs5536/cs5536_flash.c linux-2.6.30.5/arch/mips/loongson/common/cs5536/cs5536_flash.c
---- linux-2.6.30.5.orig/arch/mips/loongson/common/cs5536/cs5536_flash.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.30.5/arch/mips/loongson/common/cs5536/cs5536_flash.c 2009-08-23 19:01:04.000000000 +0200
-@@ -0,0 +1,452 @@
-+/*
-+ * the FLASH Virtual Support Module of AMD CS5536
-+ *
-+ * Copyright (C) 2007 Lemote, Inc. & Institute of Computing Technology
-+ * Author : jlliu, liujl@lemote.com
-+ *
-+ * Copyright (C) 2009 Lemote, Inc. & Institute of Computing Technology
-+ * Author: Wu Zhangjin, wuzj@lemote.com
-+ *
-+ * 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.
-+ */
-+
-+#include <cs5536/cs5536.h>
-+#include <cs5536/cs5536_pci.h>
-+
-+/*
-+ * enable the region of flashs(NOR or NAND)
-+ *
-+ * the same as the DIVIL other modules above, two groups of regs should be
-+ * modified here to control the region. DIVIL flash LBAR and the
-+ * RCONFx(6~9 reserved).
-+ */
-+static void flash_lbar_enable(void)
-+{
-+ u32 hi, lo;
-+ int offset;
-+
-+ for (offset = DIVIL_LBAR_FLSH0; offset <= DIVIL_LBAR_FLSH3; offset++) {
-+ _rdmsr(DIVIL_MSR_REG(offset), &hi, &lo);
-+ hi |= 0x1;
-+ _wrmsr(DIVIL_MSR_REG(offset), hi, lo);
-+ }
-+
-+ for (offset = SB_R6; offset <= SB_R9; offset++) {
-+ _rdmsr(SB_MSR_REG(offset), &hi, &lo);
-+ lo |= 0x1;
-+ _wrmsr(SB_MSR_REG(offset), hi, lo);
-+ }
-+
-+ return;
-+}
-+
-+/*
-+ * disable the region of flashs(NOR or NAND)
-+ */
-+static void flash_lbar_disable(void)
-+{
-+ u32 hi, lo;
-+ int offset;
-+
-+ for (offset = DIVIL_LBAR_FLSH0; offset <= DIVIL_LBAR_FLSH3; offset++) {
-+ _rdmsr(DIVIL_MSR_REG(offset), &hi, &lo);
-+ hi &= ~0x01;
-+ _wrmsr(DIVIL_MSR_REG(offset), hi, lo);
-+ }
-+ for (offset = SB_R6; offset <= SB_R9; offset++) {
-+ _rdmsr(SB_MSR_REG(offset), &hi, &lo);
-+ lo &= ~0x01;
-+ _wrmsr(SB_MSR_REG(offset), hi, lo);
-+ }
-+
-+ return;
-+}
-+
-+#ifndef CONFIG_CS5536_NOR_FLASH /* for nand flash */
-+
-+void pci_flash_write_bar(int n, u32 value)
-+{
-+ u32 hi = 0, lo = value;
-+
-+ if (value == PCI_BAR_RANGE_MASK) {
-+ /* make the flag for reading the bar length. */
-+ _rdmsr(GLCP_MSR_REG(GLCP_SOFT_COM), &hi, &lo);
-+ lo |= (SOFT_BAR_FLSH0_FLAG << n);
-+ _wrmsr(GLCP_MSR_REG(GLCP_SOFT_COM), hi, lo);
-+ } else if ((value & 0x01) == 0x00) {
-+ /* mem space nand flash native reg base addr */
-+ hi = 0xfffff007;
-+ lo &= CS5536_FLSH_RANGE;
-+ _wrmsr(DIVIL_MSR_REG(DIVIL_LBAR_FLSH0 + n), hi, lo);
-+
-+ /* RCONFx is 4KB in units for mem space. */
-+ hi = ((value & 0xfffff000) << 12) |
-+ ((CS5536_FLSH_LENGTH & 0xfffff000) - (1 << 12)) | 0x00;
-+ lo = ((value & 0xfffff000) << 12) | 0x01;
-+ _wrmsr(SB_MSR_REG(SB_R6 + n), hi, lo);
-+ }
-+ return;
-+}
-+
-+void pci_flash_write_reg(int reg, u32 value)
-+{
-+ u32 hi = 0, lo = value;
-+
-+ switch (reg) {
-+ case PCI_COMMAND:
-+ if (value & PCI_COMMAND_MEMORY)
-+ flash_lbar_enable();
-+ else
-+ flash_lbar_disable();
-+ break;
-+ case PCI_STATUS:
-+ if (value & PCI_STATUS_PARITY) {
-+ _rdmsr(SB_MSR_REG(SB_ERROR), &hi, &lo);
-+ if (lo & SB_PARE_ERR_FLAG) {
-+ lo = (lo & 0x0000ffff) | SB_PARE_ERR_FLAG;
-+ _wrmsr(SB_MSR_REG(SB_ERROR), hi, lo);
-+ }
-+ }
-+ break;
-+ case PCI_BAR0_REG:
-+ pci_flash_write_bar(0, value);
-+ break;
-+ case PCI_BAR1_REG:
-+ pci_flash_write_bar(1, value);
-+ break;
-+ case PCI_BAR2_REG:
-+ pci_flash_write_bar(2, value);
-+ break;
-+ case PCI_BAR3_REG:
-+ pci_flash_write_bar(3, value);
-+ break;
-+ case PCI_FLASH_INT_REG:
-+ _rdmsr(DIVIL_MSR_REG(PIC_YSEL_LOW), &hi, &lo);
-+ /* disable all the flash interrupt in PIC */
-+ lo &= ~(0xf << PIC_YSEL_LOW_FLASH_SHIFT);
-+ if (value) /* enable all the flash interrupt in PIC */
-+ lo |= (CS5536_FLASH_INTR << PIC_YSEL_LOW_FLASH_SHIFT);
-+ _wrmsr(DIVIL_MSR_REG(PIC_YSEL_LOW), hi, lo);
-+ break;
-+ case PCI_NAND_FLASH_TDATA_REG:
-+ _wrmsr(DIVIL_MSR_REG(NANDF_DATA), hi, lo);
-+ break;
-+ case PCI_NAND_FLASH_TCTRL_REG:
-+ lo &= 0x00000fff;
-+ _wrmsr(DIVIL_MSR_REG(NANDF_CTRL), hi, lo);
-+ break;
-+ case PCI_NAND_FLASH_RSVD_REG:
-+ _wrmsr(DIVIL_MSR_REG(NANDF_RSVD), hi, lo);
-+ break;
-+ case PCI_FLASH_SELECT_REG:
-+ if (value == CS5536_IDE_FLASH_SIGNATURE) {
-+ _rdmsr(DIVIL_MSR_REG(DIVIL_BALL_OPTS), &hi, &lo);
-+ lo &= ~0x01;
-+ _wrmsr(DIVIL_MSR_REG(DIVIL_BALL_OPTS), hi, lo);
-+ }
-+ break;
-+ default:
-+ break;
-+ }
-+
-+ return;
-+}
-+
-+u32 pci_flash_read_bar(int n)
-+{
-+ u32 hi, lo;
-+ u32 conf_data = 0;
-+
-+ _rdmsr(GLCP_MSR_REG(GLCP_SOFT_COM), &hi, &lo);
-+ if (lo & (SOFT_BAR_FLSH0_FLAG << n)) {
-+ conf_data = CS5536_FLSH_RANGE | PCI_BASE_ADDRESS_SPACE_MEMORY;
-+ lo &= ~(SOFT_BAR_FLSH0_FLAG << n);
-+ _wrmsr(GLCP_MSR_REG(GLCP_SOFT_COM), hi, lo);
-+ } else {
-+ _rdmsr(DIVIL_MSR_REG(DIVIL_LBAR_FLSH0 + n), &hi, &lo);
-+ conf_data = lo;
-+ conf_data &= ~0x0f;
-+ }
-+
-+ return conf_data;
-+}
-+
-+u32 pci_flash_read_reg(int reg)
-+{
-+ u32 conf_data = 0;
-+ u32 hi, lo;
-+
-+ switch (reg) {
-+ case PCI_VENDOR_ID:
-+ conf_data =
-+ CFG_PCI_VENDOR_ID(CS5536_FLASH_DEVICE_ID, CS5536_VENDOR_ID);
-+ break;
-+ case PCI_COMMAND:
-+ /* we just read one lbar for returning. */
-+ _rdmsr(DIVIL_MSR_REG(DIVIL_LBAR_FLSH0), &hi, &lo);
-+ if (hi & 0x1)
-+ conf_data |= PCI_COMMAND_MEMORY;
-+ break;
-+ case PCI_STATUS:
-+ conf_data |= PCI_STATUS_66MHZ;
-+ conf_data |= PCI_STATUS_FAST_BACK;
-+ _rdmsr(SB_MSR_REG(SB_ERROR), &hi, &lo);
-+ if (lo & SB_PARE_ERR_FLAG)
-+ conf_data |= PCI_STATUS_PARITY;
-+ conf_data |= PCI_STATUS_DEVSEL_MEDIUM;
-+ break;
-+ case PCI_CLASS_REVISION:
-+ _rdmsr(DIVIL_MSR_REG(DIVIL_CAP), &hi, &lo);
-+ conf_data = lo & 0x000000ff;
-+ conf_data |= (CS5536_FLASH_CLASS_CODE << 8);
-+ break;
-+ case PCI_CACHE_LINE_SIZE:
-+ conf_data =
-+ CFG_PCI_CACHE_LINE_SIZE(PCI_NORMAL_HEADER_TYPE,
-+ PCI_NORMAL_LATENCY_TIMER);
-+ break;
-+ case PCI_BAR0_REG:
-+ return pci_flash_read_bar(0);
-+ break;
-+ case PCI_BAR1_REG:
-+ return pci_flash_read_bar(1);
-+ break;
-+ case PCI_BAR2_REG:
-+ return pci_flash_read_bar(2);
-+ break;
-+ case PCI_BAR3_REG:
-+ return pci_flash_read_bar(3);
-+ break;
-+ case PCI_CARDBUS_CIS:
-+ conf_data = PCI_CARDBUS_CIS_POINTER;
-+ break;
-+ case PCI_SUBSYSTEM_VENDOR_ID:
-+ conf_data =
-+ CFG_PCI_VENDOR_ID(CS5536_FLASH_SUB_ID,
-+ CS5536_SUB_VENDOR_ID);
-+ break;
-+ case PCI_ROM_ADDRESS:
-+ conf_data = PCI_EXPANSION_ROM_BAR;
-+ break;
-+ case PCI_CAPABILITY_LIST:
-+ conf_data = PCI_CAPLIST_POINTER;
-+ break;
-+ case PCI_INTERRUPT_LINE:
-+ conf_data =
-+ CFG_PCI_INTERRUPT_LINE(PCI_DEFAULT_PIN, CS5536_FLASH_INTR);
-+ break;
-+ case PCI_NAND_FLASH_TDATA_REG:
-+ _rdmsr(DIVIL_MSR_REG(NANDF_DATA), &hi, &lo);
-+ conf_data = lo;
-+ break;
-+ case PCI_NAND_FLASH_TCTRL_REG:
-+ _rdmsr(DIVIL_MSR_REG(NANDF_CTRL), &hi, &lo);
-+ conf_data = lo & 0x00000fff;
-+ break;
-+ case PCI_NAND_FLASH_RSVD_REG:
-+ _rdmsr(DIVIL_MSR_REG(NANDF_RSVD), &hi, &lo);
-+ conf_data = lo;
-+ break;
-+ case PCI_FLASH_SELECT_REG:
-+ _rdmsr(DIVIL_MSR_REG(DIVIL_BALL_OPTS), &hi, &lo);
-+ conf_data = lo & 0x01;
-+ break;
-+ default:
-+ break;
-+ }
-+ return 0;
-+}
-+
-+#else /* CONFIG_CS5536_NOR_FLASH */
-+
-+void pci_flash_write_bar(int n, u32 value)
-+{
-+ u32 hi = 0, lo = value;
-+
-+ if (value == PCI_BAR_RANGE_MASK) {
-+ _rdmsr(GLCP_MSR_REG(GLCP_SOFT_COM), &hi, &lo);
-+ lo |= (SOFT_BAR_FLSH0_FLAG << n);
-+ _wrmsr(GLCP_MSR_REG(GLCP_SOFT_COM), hi, lo);
-+ } else if (value & 0x01) {
-+ /* IO space of 16bytes nor flash */
-+ hi = 0x0000fff1;
-+ lo &= CS5536_FLSH_RANGE;
-+ _wrmsr(DIVIL_MSR_REG(DIVIL_LBAR_FLSH0 + n), hi, lo);
-+
-+ /* RCONFx used for 16bytes reserved. */
-+ hi = ((value & 0x000ffffc) << 12) | ((CS5536_FLSH_LENGTH - 4)
-+ << 12) | 0x01;
-+ lo = ((value & 0x000ffffc) << 12) | 0x01;
-+ _wrmsr(SB_MSR_REG(SB_R6 + n), hi, lo);
-+ }
-+ return;
-+}
-+
-+void pci_flash_write_reg(int reg, u32 value)
-+{
-+ u32 hi = 0, lo = value;
-+
-+ switch (reg) {
-+ case PCI_COMMAND:
-+ if (value & PCI_COMMAND_IO)
-+ flash_lbar_enable();
-+ else
-+ flash_lbar_disable();
-+ break;
-+ case PCI_STATUS:
-+ if (value & PCI_STATUS_PARITY) {
-+ _rdmsr(SB_MSR_REG(SB_ERROR), &hi, &lo);
-+ if (lo & SB_PARE_ERR_FLAG) {
-+ lo = (lo & 0x0000ffff) | SB_PARE_ERR_FLAG;
-+ _wrmsr(SB_MSR_REG(SB_ERROR), hi, lo);
-+ }
-+ }
-+ break;
-+ case PCI_BAR0_REG:
-+ pci_flash_write_bar(0, value);
-+ break;
-+ case PCI_BAR1_REG:
-+ pci_flash_write_bar(1, value);
-+ break;
-+ case PCI_BAR2_REG:
-+ pci_flash_write_bar(2, value);
-+ break;
-+ case PCI_BAR3_REG:
-+ pci_flash_write_bar(3, value);
-+ break;
-+ case PCI_FLASH_INT_REG:
-+ _rdmsr(DIVIL_MSR_REG(PIC_YSEL_LOW), &hi, &lo);
-+ /* disable all the flash interrupt in PIC */
-+ lo &= ~(0xf << PIC_YSEL_LOW_FLASH_SHIFT);
-+ if (value) /* enable all the flash interrupt in PIC */
-+ lo |= (CS5536_FLASH_INTR << PIC_YSEL_LOW_FLASH_SHIFT);
-+ _wrmsr(DIVIL_MSR_REG(PIC_YSEL_LOW), hi, lo);
-+ break;
-+ case PCI_NOR_FLASH_CTRL_REG:
-+ lo &= 0x000000ff;
-+ _wrmsr(DIVIL_MSR_REG(NORF_CTRL), hi, lo);
-+ break;
-+ case PCI_NOR_FLASH_T01_REG:
-+ _wrmsr(DIVIL_MSR_REG(NORF_T01), hi, lo);
-+ break;
-+ case PCI_NOR_FLASH_T23_REG:
-+ _wrmsr(DIVIL_MSR_REG(NORF_T23), hi, lo);
-+ break;
-+ case PCI_FLASH_SELECT_REG:
-+ if (value == CS5536_IDE_FLASH_SIGNATURE) {
-+ _rdmsr(DIVIL_MSR_REG(DIVIL_BALL_OPTS), &hi, &lo);
-+ lo &= ~0x01;
-+ _wrmsr(DIVIL_MSR_REG(DIVIL_BALL_OPTS), hi, lo);
-+ }
-+ break;
-+ default:
-+ break;
-+ }
-+ return;
-+}
-+
-+u32 pci_flash_read_bar(int n)
-+{
-+ u32 hi, lo;
-+ u32 conf_data = 0;
-+
-+ _rdmsr(GLCP_MSR_REG(GLCP_SOFT_COM), &hi, &lo);
-+ if (lo & (SOFT_BAR_FLSH0_FLAG << n)) {
-+ conf_data = CS5536_FLSH_RANGE | PCI_BASE_ADDRESS_SPACE_IO;
-+ lo &= ~(SOFT_BAR_FLSH0_FLAG << n);
-+ _wrmsr(GLCP_MSR_REG(GLCP_SOFT_COM), hi, lo);
-+ } else {
-+ _rdmsr(DIVIL_MSR_REG(DIVIL_LBAR_FLSH0 + n), &hi, &lo);
-+ conf_data = lo & 0x0000ffff;
-+ conf_data |= 0x01;
-+ conf_data &= ~0x02;
-+ }
-+
-+ return conf_data;
-+}
-+
-+u32 pci_flash_read_reg(int reg)
-+{
-+ u32 conf_data = 0;
-+ u32 hi, lo;
-+
-+ switch (reg) {
-+ case PCI_VENDOR_ID:
-+ conf_data =
-+ CFG_PCI_VENDOR_ID(CS5536_FLASH_DEVICE_ID, CS5536_VENDOR_ID);
-+ break;
-+ case PCI_COMMAND:
-+ /* we just check one flash bar for returning. */
-+ _rdmsr(DIVIL_MSR_REG(DIVIL_LBAR_FLSH0), &hi, &lo);
-+ if (hi & PCI_COMMAND_IO)
-+ conf_data |= PCI_COMMAND_IO;
-+ break;
-+ case PCI_STATUS:
-+ conf_data |= PCI_STATUS_66MHZ;
-+ conf_data |= PCI_STATUS_FAST_BACK;
-+ _rdmsr(SB_MSR_REG(SB_ERROR), &hi, &lo);
-+ if (lo & SB_PARE_ERR_FLAG)
-+ conf_data |= PCI_STATUS_PARITY;
-+ conf_data |= PCI_STATUS_DEVSEL_MEDIUM;
-+ break;
-+ case PCI_CLASS_REVISION:
-+ _rdmsr(DIVIL_MSR_REG(DIVIL_CAP), &hi, &lo);
-+ conf_data = lo & 0x000000ff;
-+ conf_data |= (CS5536_FLASH_CLASS_CODE << 8);
-+ break;
-+ case PCI_CACHE_LINE_SIZE:
-+ conf_data =
-+ CFG_PCI_CACHE_LINE_SIZE(PCI_NORMAL_HEADER_TYPE,
-+ PCI_NORMAL_LATENCY_TIMER);
-+ break;
-+ case PCI_BAR0_REG:
-+ return pci_flash_read_bar(0);
-+ break;
-+ case PCI_BAR1_REG:
-+ return pci_flash_read_bar(1);
-+ break;
-+ case PCI_BAR2_REG:
-+ return pci_flash_read_bar(2);
-+ break;
-+ case PCI_BAR3_REG:
-+ return pci_flash_read_bar(3);
-+ break;
-+ case PCI_CARDBUS_CIS:
-+ conf_data = PCI_CARDBUS_CIS_POINTER;
-+ break;
-+ case PCI_SUBSYSTEM_VENDOR_ID:
-+ conf_data =
-+ CFG_PCI_VENDOR_ID(CS5536_FLASH_SUB_ID,
-+ CS5536_SUB_VENDOR_ID);
-+ break;
-+ case PCI_ROM_ADDRESS:
-+ conf_data = PCI_EXPANSION_ROM_BAR;
-+ break;
-+ case PCI_CAPABILITY_LIST:
-+ conf_data = PCI_CAPLIST_POINTER;
-+ break;
-+ case PCI_INTERRUPT_LINE:
-+ conf_data =
-+ CFG_PCI_INTERRUPT_LINE(PCI_DEFAULT_PIN, CS5536_FLASH_INTR);
-+ break;
-+ case PCI_NOR_FLASH_CTRL_REG:
-+ _rdmsr(DIVIL_MSR_REG(NORF_CTRL), &hi, &lo);
-+ conf_data = lo & 0x000000ff;
-+ break;
-+ case PCI_NOR_FLASH_T01_REG:
-+ _rdmsr(DIVIL_MSR_REG(NORF_T01), &hi, &lo);
-+ conf_data = lo;
-+ break;
-+ case PCI_NOR_FLASH_T23_REG:
-+ _rdmsr(DIVIL_MSR_REG(NORF_T23), &hi, &lo);
-+ conf_data = lo;
-+ break;
-+ default:
-+ break;
-+ }
-+ return conf_data;
-+}
-+#endif /* CONFIG_CS5536_NOR_FLASH */
-diff -Nur linux-2.6.30.5.orig/arch/mips/loongson/common/cs5536/cs5536_ide.c linux-2.6.30.5/arch/mips/loongson/common/cs5536/cs5536_ide.c
---- linux-2.6.30.5.orig/arch/mips/loongson/common/cs5536/cs5536_ide.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.30.5/arch/mips/loongson/common/cs5536/cs5536_ide.c 2009-08-23 19:01:04.000000000 +0200
-@@ -0,0 +1,194 @@
-+/*
-+ * the IDE Virtual Support Module of AMD CS5536
-+ *
-+ * Copyright (C) 2007 Lemote, Inc. & Institute of Computing Technology
-+ * Author : jlliu, liujl@lemote.com
-+ *
-+ * Copyright (C) 2009 Lemote, Inc. & Institute of Computing Technology
-+ * Author: Wu Zhangjin, wuzj@lemote.com
-+ *
-+ * 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.
-+ */
-+
-+#include <cs5536/cs5536.h>
-+#include <cs5536/cs5536_pci.h>
-+
-+/*
-+ * ide_write : ide write transfering
-+ */
-+void pci_ide_write_reg(int reg, u32 value)
-+{
-+ u32 hi = 0, lo = value;
-+
-+ switch (reg) {
-+ case PCI_COMMAND:
-+ _rdmsr(GLIU_MSR_REG(GLIU_PAE), &hi, &lo);
-+ if (value & PCI_COMMAND_MASTER)
-+ lo |= (0x03 << 4);
-+ else
-+ lo &= ~(0x03 << 4);
-+ _wrmsr(GLIU_MSR_REG(GLIU_PAE), hi, lo);
-+ break;
-+ case PCI_STATUS:
-+ if (value & PCI_STATUS_PARITY) {
-+ _rdmsr(SB_MSR_REG(SB_ERROR), &hi, &lo);
-+ if (lo & SB_PARE_ERR_FLAG) {
-+ lo = (lo & 0x0000ffff) | SB_PARE_ERR_FLAG;
-+ _wrmsr(SB_MSR_REG(SB_ERROR), hi, lo);
-+ }
-+ }
-+ break;
-+ case PCI_CACHE_LINE_SIZE:
-+ value &= 0x0000ff00;
-+ _rdmsr(SB_MSR_REG(SB_CTRL), &hi, &lo);
-+ hi &= 0xffffff00;
-+ hi |= (value >> 8);
-+ _wrmsr(SB_MSR_REG(SB_CTRL), hi, lo);
-+ break;
-+ case PCI_BAR4_REG:
-+ if (value == PCI_BAR_RANGE_MASK) {
-+ _rdmsr(GLCP_MSR_REG(GLCP_SOFT_COM), &hi, &lo);
-+ lo |= SOFT_BAR_IDE_FLAG;
-+ _wrmsr(GLCP_MSR_REG(GLCP_SOFT_COM), hi, lo);
-+ } else if (value & 0x01) {
-+ lo = (value & 0xfffffff0) | 0x1;
-+ _wrmsr(IDE_MSR_REG(IDE_IO_BAR), hi, lo);
-+
-+ value &= 0xfffffffc;
-+ hi = 0x60000000 | ((value & 0x000ff000) >> 12);
-+ lo = 0x000ffff0 | ((value & 0x00000fff) << 20);
-+ _wrmsr(GLIU_MSR_REG(GLIU_IOD_BM2), hi, lo);
-+ }
-+ break;
-+ case PCI_IDE_CFG_REG:
-+ if (value == CS5536_IDE_FLASH_SIGNATURE) {
-+ _rdmsr(DIVIL_MSR_REG(DIVIL_BALL_OPTS), &hi, &lo);
-+ lo |= 0x01;
-+ _wrmsr(DIVIL_MSR_REG(DIVIL_BALL_OPTS), hi, lo);
-+ } else
-+ _wrmsr(IDE_MSR_REG(IDE_CFG), hi, lo);
-+ break;
-+ case PCI_IDE_DTC_REG:
-+ _wrmsr(IDE_MSR_REG(IDE_DTC), hi, lo);
-+ break;
-+ case PCI_IDE_CAST_REG:
-+ _wrmsr(IDE_MSR_REG(IDE_CAST), hi, lo);
-+ break;
-+ case PCI_IDE_ETC_REG:
-+ _wrmsr(IDE_MSR_REG(IDE_ETC), hi, lo);
-+ break;
-+ case PCI_IDE_PM_REG:
-+ _wrmsr(IDE_MSR_REG(IDE_INTERNAL_PM), hi, lo);
-+ break;
-+ default:
-+ break;
-+ }
-+
-+ return;
-+}
-+
-+/*
-+ * ide_read : ide read tranfering.
-+ */
-+u32 pci_ide_read_reg(int reg)
-+{
-+ u32 conf_data = 0;
-+ u32 hi, lo;
-+
-+ switch (reg) {
-+ case PCI_VENDOR_ID:
-+ conf_data =
-+ CFG_PCI_VENDOR_ID(CS5536_IDE_DEVICE_ID, CS5536_VENDOR_ID);
-+ break;
-+ case PCI_COMMAND:
-+ _rdmsr(IDE_MSR_REG(IDE_IO_BAR), &hi, &lo);
-+ if (lo & 0xfffffff0)
-+ conf_data |= PCI_COMMAND_IO;
-+ _rdmsr(GLIU_MSR_REG(GLIU_PAE), &hi, &lo);
-+ if ((lo & 0x30) == 0x30)
-+ conf_data |= PCI_COMMAND_MASTER;
-+ break;
-+ case PCI_STATUS:
-+ conf_data |= PCI_STATUS_66MHZ;
-+ conf_data |= PCI_STATUS_FAST_BACK;
-+ _rdmsr(SB_MSR_REG(SB_ERROR), &hi, &lo);
-+ if (lo & SB_PARE_ERR_FLAG)
-+ conf_data |= PCI_STATUS_PARITY;
-+ conf_data |= PCI_STATUS_DEVSEL_MEDIUM;
-+ break;
-+ case PCI_CLASS_REVISION:
-+ _rdmsr(IDE_MSR_REG(IDE_CAP), &hi, &lo);
-+ conf_data = lo & 0x000000ff;
-+ conf_data |= (CS5536_IDE_CLASS_CODE << 8);
-+ break;
-+ case PCI_CACHE_LINE_SIZE:
-+ _rdmsr(SB_MSR_REG(SB_CTRL), &hi, &lo);
-+ hi &= 0x000000f8;
-+ conf_data = CFG_PCI_CACHE_LINE_SIZE(PCI_NORMAL_HEADER_TYPE, hi);
-+ break;
-+ case PCI_BAR0_REG:
-+ case PCI_BAR1_REG:
-+ case PCI_BAR2_REG:
-+ case PCI_BAR3_REG:
-+ break;
-+ case PCI_BAR4_REG:
-+ _rdmsr(GLCP_MSR_REG(GLCP_SOFT_COM), &hi, &lo);
-+ if (lo & SOFT_BAR_IDE_FLAG) {
-+ conf_data = CS5536_IDE_RANGE |
-+ PCI_BASE_ADDRESS_SPACE_IO;
-+ lo &= ~SOFT_BAR_IDE_FLAG;
-+ _wrmsr(GLCP_MSR_REG(GLCP_SOFT_COM), hi, lo);
-+ } else {
-+ _rdmsr(IDE_MSR_REG(IDE_IO_BAR), &hi, &lo);
-+ conf_data = lo & 0xfffffff0;
-+ conf_data |= 0x01;
-+ conf_data &= ~0x02;
-+ }
-+ break;
-+ case PCI_BAR5_REG:
-+ break;
-+ case PCI_CARDBUS_CIS:
-+ conf_data = PCI_CARDBUS_CIS_POINTER;
-+ break;
-+ case PCI_SUBSYSTEM_VENDOR_ID:
-+ conf_data =
-+ CFG_PCI_VENDOR_ID(CS5536_IDE_SUB_ID, CS5536_SUB_VENDOR_ID);
-+ break;
-+ case PCI_ROM_ADDRESS:
-+ conf_data = PCI_EXPANSION_ROM_BAR;
-+ break;
-+ case PCI_CAPABILITY_LIST:
-+ conf_data = PCI_CAPLIST_POINTER;
-+ break;
-+ case PCI_INTERRUPT_LINE:
-+ conf_data =
-+ CFG_PCI_INTERRUPT_LINE(PCI_DEFAULT_PIN, CS5536_IDE_INTR);
-+ break;
-+ case PCI_IDE_CFG_REG:
-+ _rdmsr(IDE_MSR_REG(IDE_CFG), &hi, &lo);
-+ conf_data = lo;
-+ break;
-+ case PCI_IDE_DTC_REG:
-+ _rdmsr(IDE_MSR_REG(IDE_DTC), &hi, &lo);
-+ conf_data = lo;
-+ break;
-+ case PCI_IDE_CAST_REG:
-+ _rdmsr(IDE_MSR_REG(IDE_CAST), &hi, &lo);
-+ conf_data = lo;
-+ break;
-+ case PCI_IDE_ETC_REG:
-+ _rdmsr(IDE_MSR_REG(IDE_ETC), &hi, &lo);
-+ conf_data = lo;
-+ case PCI_IDE_PM_REG:
-+ _rdmsr(IDE_MSR_REG(IDE_INTERNAL_PM), &hi, &lo);
-+ conf_data = lo;
-+ break;
-+ default:
-+ break;
-+ }
-+
-+ return conf_data;
-+}
-diff -Nur linux-2.6.30.5.orig/arch/mips/loongson/common/cs5536/cs5536_isa.c linux-2.6.30.5/arch/mips/loongson/common/cs5536/cs5536_isa.c
---- linux-2.6.30.5.orig/arch/mips/loongson/common/cs5536/cs5536_isa.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.30.5/arch/mips/loongson/common/cs5536/cs5536_isa.c 2009-08-23 19:01:04.000000000 +0200
-@@ -0,0 +1,376 @@
-+/*
-+ * the ISA Virtual Support Module of AMD CS5536
-+ *
-+ * Copyright (C) 2007 Lemote, Inc. & Institute of Computing Technology
-+ * Author : jlliu, liujl@lemote.com
-+ *
-+ * Copyright (C) 2009 Lemote, Inc. & Institute of Computing Technology
-+ * Author: Wu Zhangjin, wuzj@lemote.com
-+ *
-+ * 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.
-+ */
-+
-+#include <cs5536/cs5536.h>
-+#include <cs5536/cs5536_pci.h>
-+
-+/* common variables for PCI_ISA_READ/WRITE_BAR */
-+static const u32 divil_msr_reg[6] = {
-+ DIVIL_MSR_REG(DIVIL_LBAR_SMB), DIVIL_MSR_REG(DIVIL_LBAR_GPIO),
-+ DIVIL_MSR_REG(DIVIL_LBAR_MFGPT), DIVIL_MSR_REG(DIVIL_LBAR_IRQ),
-+ DIVIL_MSR_REG(DIVIL_LBAR_PMS), DIVIL_MSR_REG(DIVIL_LBAR_ACPI),
-+};
-+
-+static const u32 soft_bar_flag[6] = {
-+ SOFT_BAR_SMB_FLAG, SOFT_BAR_GPIO_FLAG, SOFT_BAR_MFGPT_FLAG,
-+ SOFT_BAR_IRQ_FLAG, SOFT_BAR_PMS_FLAG, SOFT_BAR_ACPI_FLAG,
-+};
-+
-+static const u32 sb_msr_reg[6] = {
-+ SB_MSR_REG(SB_R0), SB_MSR_REG(SB_R1), SB_MSR_REG(SB_R2),
-+ SB_MSR_REG(SB_R3), SB_MSR_REG(SB_R4), SB_MSR_REG(SB_R5),
-+};
-+
-+static const u32 bar_space_range[6] = {
-+ CS5536_SMB_RANGE, CS5536_GPIO_RANGE, CS5536_MFGPT_RANGE,
-+ CS5536_IRQ_RANGE, CS5536_PMS_RANGE, CS5536_ACPI_RANGE,
-+};
-+
-+static const int bar_space_len[6] = {
-+ CS5536_SMB_LENGTH, CS5536_GPIO_LENGTH, CS5536_MFGPT_LENGTH,
-+ CS5536_IRQ_LENGTH, CS5536_PMS_LENGTH, CS5536_ACPI_LENGTH,
-+};
-+
-+/*
-+ * enable the divil module bar space.
-+ *
-+ * For all the DIVIL module LBAR, you should control the DIVIL LBAR reg
-+ * and the RCONFx(0~5) reg to use the modules.
-+ */
-+static void divil_lbar_enable(void)
-+{
-+ u32 hi, lo;
-+ int offset;
-+
-+ /*
-+ * The DIVIL IRQ is not used yet. and make the RCONF0 reserved.
-+ */
-+
-+ for (offset = DIVIL_LBAR_SMB; offset <= DIVIL_LBAR_PMS; offset++) {
-+ _rdmsr(DIVIL_MSR_REG(offset), &hi, &lo);
-+ hi |= 0x01;
-+ _wrmsr(DIVIL_MSR_REG(DIVIL_LBAR_SMB), hi, lo);
-+ }
-+ return;
-+}
-+
-+/*
-+ * disable the divil module bar space.
-+ */
-+static void divil_lbar_disable(void)
-+{
-+ u32 hi, lo;
-+ int offset;
-+
-+ for (offset = DIVIL_LBAR_SMB; offset <= DIVIL_LBAR_PMS; offset++) {
-+ _rdmsr(DIVIL_MSR_REG(offset), &hi, &lo);
-+ hi &= ~0x01;
-+ _wrmsr(DIVIL_MSR_REG(DIVIL_LBAR_SMB), hi, lo);
-+ }
-+ return;
-+}
-+
-+/*
-+ * BAR write: write value to the n BAR
-+ */
-+
-+void pci_isa_write_bar(int n, u32 value)
-+{
-+ u32 hi = 0, lo = value;
-+
-+ if (value == PCI_BAR_RANGE_MASK) {
-+ _rdmsr(GLCP_MSR_REG(GLCP_SOFT_COM), &hi, &lo);
-+ lo |= soft_bar_flag[n];
-+ _wrmsr(GLCP_MSR_REG(GLCP_SOFT_COM), hi, lo);
-+ } else if (value & 0x01) {
-+ /* NATIVE reg */
-+ hi = 0x0000f001;
-+ lo &= bar_space_range[n];
-+ _wrmsr(divil_msr_reg[n], hi, lo);
-+
-+ /* RCONFx is 4bytes in units for I/O space */
-+ hi = ((value & 0x000ffffc) << 12) |
-+ ((bar_space_len[n] - 4) << 12) | 0x01;
-+ lo = ((value & 0x000ffffc) << 12) | 0x01;
-+ _wrmsr(sb_msr_reg[n], hi, lo);
-+ }
-+
-+ return;
-+}
-+
-+/*
-+ * BAR read: read the n BAR
-+ */
-+
-+u32 pci_isa_read_bar(int n)
-+{
-+ u32 conf_data = 0;
-+ u32 hi, lo;
-+
-+ _rdmsr(GLCP_MSR_REG(GLCP_SOFT_COM), &hi, &lo);
-+ if (lo & soft_bar_flag[n]) {
-+ conf_data = bar_space_range[n] | PCI_BASE_ADDRESS_SPACE_IO;
-+ lo &= ~soft_bar_flag[n];
-+ _wrmsr(GLCP_MSR_REG(GLCP_SOFT_COM), hi, lo);
-+ } else {
-+ _rdmsr(divil_msr_reg[n], &hi, &lo);
-+ conf_data = lo & bar_space_range[n];
-+ conf_data |= 0x01;
-+ conf_data &= ~0x02;
-+ }
-+ return conf_data;
-+}
-+
-+/*
-+ * isa_write : isa write transfering.
-+ * WE assume that the ISA is not the BUS MASTER.!!!
-+ */
-+/* FAST BACK TO BACK '1' for BUS MASTER '0' for BUS SALVE */
-+/* COMMAND :
-+ * bit0 : IO SPACE ENABLE
-+ * bit1 : MEMORY SPACE ENABLE(ignore)
-+ * bit2 : BUS MASTER ENABLE(ignore)
-+ * bit3 : SPECIAL CYCLE(ignore)? default is ignored.
-+ * bit4 : MEMORY WRITE and INVALIDATE(ignore)
-+ * bit5 : VGA PALETTE(ignore)
-+ * bit6 : PARITY ERROR(ignore)? : default is ignored.
-+ * bit7 : WAIT CYCLE CONTROL(ignore)
-+ * bit8 : SYSTEM ERROR(ignore)
-+ * bit9 : FAST BACK TO BACK(ignore)
-+ * bit10-bit15 : RESERVED
-+ * STATUS :
-+ * bit0-bit3 : RESERVED
-+ * bit4 : CAPABILITY LIST(ignore)
-+ * bit5 : 66MHZ CAPABLE
-+ * bit6 : RESERVED
-+ * bit7 : FAST BACK TO BACK(ignore)
-+ * bit8 : DATA PARITY ERROR DETECED(ignore)
-+ * bit9-bit10 : DEVSEL TIMING(ALL MEDIUM)
-+ * bit11: SIGNALED TARGET ABORT
-+ * bit12: RECEIVED TARGET ABORT
-+ * bit13: RECEIVED MASTER ABORT
-+ * bit14: SIGNALED SYSTEM ERROR
-+ * bit15: DETECTED PARITY ERROR
-+ */
-+
-+void pci_isa_write_reg(int reg, u32 value)
-+{
-+ u32 hi = 0, lo = value;
-+ u32 temp;
-+
-+ switch (reg) {
-+ case PCI_COMMAND:
-+ if (value & PCI_COMMAND_IO)
-+ divil_lbar_enable();
-+ else
-+ divil_lbar_disable();
-+ break;
-+ case PCI_STATUS:
-+ _rdmsr(SB_MSR_REG(SB_ERROR), &hi, &lo);
-+ temp = lo & 0x0000ffff;
-+ if ((value & PCI_STATUS_SIG_TARGET_ABORT) &&
-+ (lo & SB_TAS_ERR_EN))
-+ temp |= SB_TAS_ERR_FLAG;
-+
-+ if ((value & PCI_STATUS_REC_TARGET_ABORT) &&
-+ (lo & SB_TAR_ERR_EN))
-+ temp |= SB_TAR_ERR_FLAG;
-+
-+ if ((value & PCI_STATUS_REC_MASTER_ABORT)
-+ && (lo & SB_MAR_ERR_EN))
-+ temp |= SB_MAR_ERR_FLAG;
-+
-+ if ((value & PCI_STATUS_DETECTED_PARITY)
-+ && (lo & SB_PARE_ERR_EN))
-+ temp |= SB_PARE_ERR_FLAG;
-+
-+ lo = temp;
-+ _wrmsr(SB_MSR_REG(SB_ERROR), hi, lo);
-+ break;
-+ case PCI_CACHE_LINE_SIZE:
-+ value &= 0x0000ff00;
-+ _rdmsr(SB_MSR_REG(SB_CTRL), &hi, &lo);
-+ hi &= 0xffffff00;
-+ hi |= (value >> 8);
-+ _wrmsr(SB_MSR_REG(SB_CTRL), hi, lo);
-+ break;
-+ case PCI_BAR0_REG:
-+ pci_isa_write_bar(0, value);
-+ break;
-+ case PCI_BAR1_REG:
-+ pci_isa_write_bar(1, value);
-+ break;
-+ case PCI_BAR2_REG:
-+ pci_isa_write_bar(2, value);
-+ break;
-+ case PCI_BAR3_REG:
-+ pci_isa_write_bar(3, value);
-+ break;
-+ case PCI_BAR4_REG:
-+ pci_isa_write_bar(4, value);
-+ break;
-+ case PCI_BAR5_REG:
-+ pci_isa_write_bar(5, value);
-+ break;
-+ case PCI_UART1_INT_REG:
-+ _rdmsr(DIVIL_MSR_REG(PIC_YSEL_HIGH), &hi, &lo);
-+ /* disable uart1 interrupt in PIC */
-+ lo &= ~(0xf << 24);
-+ if (value) /* enable uart1 interrupt in PIC */
-+ lo |= (CS5536_UART1_INTR << 24);
-+ _wrmsr(DIVIL_MSR_REG(PIC_YSEL_HIGH), hi, lo);
-+ break;
-+ case PCI_UART2_INT_REG:
-+ _rdmsr(DIVIL_MSR_REG(PIC_YSEL_HIGH), &hi, &lo);
-+ /* disable uart2 interrupt in PIC */
-+ lo &= ~(0xf << 28);
-+ if (value) /* enable uart2 interrupt in PIC */
-+ lo |= (CS5536_UART2_INTR << 28);
-+ _wrmsr(DIVIL_MSR_REG(PIC_YSEL_HIGH), hi, lo);
-+ break;
-+ case PCI_ISA_FIXUP_REG:
-+ if (value) {
-+ /* enable the TARGET ABORT/MASTER ABORT etc. */
-+ _rdmsr(SB_MSR_REG(SB_ERROR), &hi, &lo);
-+ lo |= 0x00000063;
-+ _wrmsr(SB_MSR_REG(SB_ERROR), hi, lo);
-+ }
-+
-+ default:
-+ /* ALL OTHER PCI CONFIG SPACE HEADER IS NOT IMPLEMENTED. */
-+ break;
-+ }
-+
-+ return;
-+}
-+
-+/*
-+ * isa_read : isa read transfering.
-+ * we assume that the ISA is not the BUS MASTER.
-+ */
-+
-+ /* COMMAND :
-+ * bit0 : IO SPACE ENABLE
-+ * bit1 : MEMORY SPACE ENABLE(ignore)
-+ * bit2 : BUS MASTER ENABLE(ignore)
-+ * bit3 : SPECIAL CYCLE(ignore)? default is ignored.
-+ * bit4 : MEMORY WRITE and INVALIDATE(ignore)
-+ * bit5 : VGA PALETTE(ignore)
-+ * bit6 : PARITY ERROR(ignore)? : default is ignored.
-+ * bit7 : WAIT CYCLE CONTROL(ignore)
-+ * bit8 : SYSTEM ERROR(ignore)
-+ * bit9 : FAST BACK TO BACK(ignore)
-+ * bit10-bit15 : RESERVED
-+ * STATUS :
-+ * bit0-bit3 : RESERVED
-+ * bit4 : CAPABILITY LIST(ignore)
-+ * bit5 : 66MHZ CAPABLE
-+ * bit6 : RESERVED
-+ * bit7 : FAST BACK TO BACK(ignore)
-+ * bit8 : DATA PARITY ERROR DETECED(ignore)?
-+ * bit9-bit10 : DEVSEL TIMING(ALL MEDIUM)
-+ * bit11: SIGNALED TARGET ABORT
-+ * bit12: RECEIVED TARGET ABORT
-+ * bit13: RECEIVED MASTER ABORT
-+ * bit14: SIGNALED SYSTEM ERROR
-+ * bit15: DETECTED PARITY ERROR(?)
-+ */
-+
-+u32 pci_isa_read_reg(int reg)
-+{
-+ u32 conf_data = 0;
-+ u32 hi, lo;
-+
-+ switch (reg) {
-+ case PCI_VENDOR_ID:
-+ conf_data =
-+ CFG_PCI_VENDOR_ID(CS5536_ISA_DEVICE_ID, CS5536_VENDOR_ID);
-+ break;
-+ case PCI_COMMAND:
-+ /* we just check the first LBAR for the IO enable bit, */
-+ /* maybe we should changed later. */
-+ _rdmsr(DIVIL_MSR_REG(DIVIL_LBAR_SMB), &hi, &lo);
-+ if (hi & 0x01)
-+ conf_data |= PCI_COMMAND_IO;
-+ break;
-+ case PCI_STATUS:
-+ conf_data |= PCI_STATUS_66MHZ;
-+ conf_data |= PCI_STATUS_DEVSEL_MEDIUM;
-+ conf_data |= PCI_STATUS_FAST_BACK;
-+
-+ _rdmsr(SB_MSR_REG(SB_ERROR), &hi, &lo);
-+ if (lo & SB_TAS_ERR_FLAG)
-+ conf_data |= PCI_STATUS_SIG_TARGET_ABORT;
-+ if (lo & SB_TAR_ERR_FLAG)
-+ conf_data |= PCI_STATUS_REC_TARGET_ABORT;
-+ if (lo & SB_MAR_ERR_FLAG)
-+ conf_data |= PCI_STATUS_REC_MASTER_ABORT;
-+ if (lo & SB_PARE_ERR_FLAG)
-+ conf_data |= PCI_STATUS_DETECTED_PARITY;
-+ break;
-+ case PCI_CLASS_REVISION:
-+ _rdmsr(GLCP_MSR_REG(GLCP_CHIP_REV_ID), &hi, &lo);
-+ conf_data = lo & 0x000000ff;
-+ conf_data |= (CS5536_ISA_CLASS_CODE << 8);
-+ break;
-+ case PCI_CACHE_LINE_SIZE:
-+ _rdmsr(SB_MSR_REG(SB_CTRL), &hi, &lo);
-+ hi &= 0x000000f8;
-+ conf_data = CFG_PCI_CACHE_LINE_SIZE(PCI_BRIDGE_HEADER_TYPE, hi);
-+ break;
-+ /*
-+ * we only use the LBAR of DIVIL, no RCONF used.
-+ * all of them are IO space.
-+ */
-+ case PCI_BAR0_REG:
-+ return pci_isa_read_bar(0);
-+ break;
-+ case PCI_BAR1_REG:
-+ return pci_isa_read_bar(1);
-+ break;
-+ case PCI_BAR2_REG:
-+ return pci_isa_read_bar(2);
-+ break;
-+ case PCI_BAR3_REG:
-+ break;
-+ case PCI_BAR4_REG:
-+ return pci_isa_read_bar(4);
-+ break;
-+ case PCI_BAR5_REG:
-+ return pci_isa_read_bar(5);
-+ break;
-+ case PCI_CARDBUS_CIS:
-+ conf_data = PCI_CARDBUS_CIS_POINTER;
-+ break;
-+ case PCI_SUBSYSTEM_VENDOR_ID:
-+ conf_data =
-+ CFG_PCI_VENDOR_ID(CS5536_ISA_SUB_ID, CS5536_SUB_VENDOR_ID);
-+ break;
-+ case PCI_ROM_ADDRESS:
-+ conf_data = PCI_EXPANSION_ROM_BAR;
-+ break;
-+ case PCI_CAPABILITY_LIST:
-+ conf_data = PCI_CAPLIST_POINTER;
-+ break;
-+ case PCI_INTERRUPT_LINE:
-+ /* no interrupt used here */
-+ conf_data = CFG_PCI_INTERRUPT_LINE(0x00, 0x00);
-+ break;
-+ default:
-+ break;
-+ }
-+
-+ return conf_data;
-+}
-diff -Nur linux-2.6.30.5.orig/arch/mips/loongson/common/cs5536/cs5536_mfgpt.c linux-2.6.30.5/arch/mips/loongson/common/cs5536/cs5536_mfgpt.c
---- linux-2.6.30.5.orig/arch/mips/loongson/common/cs5536/cs5536_mfgpt.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.30.5/arch/mips/loongson/common/cs5536/cs5536_mfgpt.c 2009-08-23 19:01:04.000000000 +0200
-@@ -0,0 +1,241 @@
-+/*
-+ * CS5536 General timer functions
-+ *
-+ * Copyright (C) 2007 Lemote Inc. & Insititute of Computing Technology
-+ * Author: Yanhua, yanh@lemote.com
-+ *
-+ * Copyright (C) 2009 Lemote Inc. & Insititute of Computing Technology
-+ * Author: Wu zhangjin, wuzj@lemote.com
-+ *
-+ * Reference: 'AMD Geode(TM) CS5536 Companion Device Data Book'
-+ *
-+ * 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.
-+ */
-+
-+#include <linux/io.h>
-+#include <linux/init.h>
-+#include <linux/module.h>
-+#include <linux/jiffies.h>
-+#include <linux/spinlock.h>
-+#include <linux/interrupt.h>
-+#include <linux/clockchips.h>
-+
-+#include <asm/time.h>
-+
-+#include <cs5536/cs5536_mfgpt.h>
-+
-+DEFINE_SPINLOCK(mfgpt_lock);
-+EXPORT_SYMBOL(mfgpt_lock);
-+
-+u32 mfgpt_base;
-+
-+/*
-+ * Initialize the MFGPT timer.
-+ *
-+ * This is also called after resume to bring the MFGPT into operation again.
-+ */
-+/* setup register bit fields:
-+ * 15: counter enable
-+ * 14: compare2 output status, write 1 to clear when in event mode
-+ * 13: compare1 output status
-+ * 12: setup(ro)
-+ * 11: stop enable, stop on sleep
-+ * 10: external enable
-+ * 9:8 compare2 mode; 00: disable, 01: compare on equal; 10: compare on GE,
-+ * 11 event: GE + irq
-+ * 7:6 compare1 mode
-+ * 5: reverse enable, bit reverse of the counter
-+ * 4: clock select. 0: 32KHz, 1: 14.318MHz
-+ * 3:0 counter prescaler scale factor.
-+ * select the input clock divide-by value. 2^n
-+ * bit 11:0 is write once
-+ */
-+
-+static void init_mfgpt_timer(enum clock_event_mode mode,
-+ struct clock_event_device *evt)
-+{
-+ spin_lock(&mfgpt_lock);
-+
-+ switch (mode) {
-+ case CLOCK_EVT_MODE_PERIODIC:
-+ outw(COMPARE, MFGPT0_CMP2); /* set comparator2 */
-+ outw(0, MFGPT0_CNT); /* set counter to 0 */
-+ /* enable counter, comparator2 to event mode, 14.318MHz clock */
-+ outw(0xe310, MFGPT0_SETUP);
-+ break;
-+
-+ case CLOCK_EVT_MODE_SHUTDOWN:
-+ case CLOCK_EVT_MODE_UNUSED:
-+ if (evt->mode == CLOCK_EVT_MODE_PERIODIC ||
-+ evt->mode == CLOCK_EVT_MODE_ONESHOT) {
-+ /* disable counter */
-+ outw(inw(MFGPT0_SETUP) & 0x7fff, MFGPT0_SETUP);
-+ }
-+ break;
-+
-+ case CLOCK_EVT_MODE_ONESHOT:
-+ /* One shot setup */
-+ outw(0xe300, MFGPT0_SETUP);
-+ break;
-+
-+ case CLOCK_EVT_MODE_RESUME:
-+ /* Nothing to do here */
-+ break;
-+ }
-+ spin_unlock(&mfgpt_lock);
-+}
-+
-+/*
-+ * Program the next event in oneshot mode
-+ *
-+ * Delta is given in MFGPT ticks
-+ */
-+static int mfgpt_next_event(unsigned long delta, struct clock_event_device *evt)
-+{
-+ spin_lock(&mfgpt_lock);
-+ outw(delta & 0xffff, MFGPT0_CMP2); /* set comparator2 */
-+ outw(0, MFGPT0_CNT); /* set counter to 0 */
-+ spin_unlock(&mfgpt_lock);
-+
-+ return 0;
-+}
-+
-+static struct clock_event_device mfgpt_clockevent = {
-+ .name = "mfgpt",
-+ .features = CLOCK_EVT_FEAT_PERIODIC,
-+ .set_mode = init_mfgpt_timer,
-+ .set_next_event = mfgpt_next_event,
-+ .irq = CS5536_MFGPT_INTR,
-+};
-+
-+static irqreturn_t timer_interrupt(int irq, void *dev_id)
-+{
-+ u32 basehi;
-+
-+ /*
-+ * get MFGPT base address
-+ *
-+ * NOTE: do not remove me, it's need for the value of mfgpt_base is
-+ * variable
-+ */
-+ _rdmsr(CS5536_DIVIL_MSR_BASE + DIVIL_LBAR_MFGPT, &basehi, &mfgpt_base);
-+
-+ /* ack */
-+ outw(inw(MFGPT0_SETUP) | 0x4000, MFGPT0_SETUP);
-+
-+ mfgpt_clockevent.event_handler(&mfgpt_clockevent);
-+
-+ return IRQ_HANDLED;
-+}
-+
-+static struct irqaction irq5 = {
-+ .handler = timer_interrupt,
-+ .flags = IRQF_TIMER | IRQF_DISABLED | IRQF_NOBALANCING,
-+ .name = "timer"
-+};
-+
-+/*
-+ * Initialize the conversion factor and the min/max deltas of the clock event
-+ * structure and register the clock event source with the framework.
-+ */
-+void __init setup_mfgpt_timer(void)
-+{
-+ u32 basehi;
-+ struct clock_event_device *cd = &mfgpt_clockevent;
-+ unsigned int cpu = smp_processor_id();
-+
-+ cd->cpumask = cpumask_of(cpu);
-+ clockevent_set_clock(cd, MFGPT_TICK_RATE);
-+ cd->max_delta_ns = clockevent_delta2ns(0xffff, cd);
-+ cd->min_delta_ns = clockevent_delta2ns(0xf, cd);
-+
-+ /* Enable MFGPT0 Comparator 2 Output to the Interrupt Mapper */
-+ _wrmsr(CS5536_DIVIL_MSR_BASE + MFGPT_IRQ, 0, 0x100);
-+
-+ /* Enable Interrupt Gate 5 */
-+ _wrmsr(CS5536_DIVIL_MSR_BASE + PIC_ZSEL_LOW, 0, 0x50000);
-+
-+ /* get MFGPT base address */
-+ _rdmsr(CS5536_DIVIL_MSR_BASE + DIVIL_LBAR_MFGPT, &basehi, &mfgpt_base);
-+
-+ irq5.mask = cpumask_of_cpu(cpu);
-+
-+ clockevents_register_device(cd);
-+
-+ setup_irq(CS5536_MFGPT_INTR, &irq5);
-+}
-+
-+/*
-+ * Since the MFGPT overflows every tick, its not very useful
-+ * to just read by itself. So use jiffies to emulate a free
-+ * running counter:
-+ */
-+static cycle_t mfgpt_read(struct clocksource *cs)
-+{
-+ unsigned long flags;
-+ int count;
-+ u32 jifs;
-+ static int old_count;
-+ static u32 old_jifs;
-+
-+ spin_lock_irqsave(&mfgpt_lock, flags);
-+ /*
-+ * Although our caller may have the read side of xtime_lock,
-+ * this is now a seqlock, and we are cheating in this routine
-+ * by having side effects on state that we cannot undo if
-+ * there is a collision on the seqlock and our caller has to
-+ * retry. (Namely, old_jifs and old_count.) So we must treat
-+ * jiffies as volatile despite the lock. We read jiffies
-+ * before latching the timer count to guarantee that although
-+ * the jiffies value might be older than the count (that is,
-+ * the counter may underflow between the last point where
-+ * jiffies was incremented and the point where we latch the
-+ * count), it cannot be newer.
-+ */
-+ jifs = jiffies;
-+ /* read the count */
-+ count = inw(MFGPT0_CNT);
-+
-+ /*
-+ * It's possible for count to appear to go the wrong way for this
-+ * reason:
-+ *
-+ * The timer counter underflows, but we haven't handled the resulting
-+ * interrupt and incremented jiffies yet.
-+ *
-+ * Previous attempts to handle these cases intelligently were buggy, so
-+ * we just do the simple thing now.
-+ */
-+ if (count < old_count && jifs == old_jifs)
-+ count = old_count;
-+
-+ old_count = count;
-+ old_jifs = jifs;
-+
-+ spin_unlock_irqrestore(&mfgpt_lock, flags);
-+
-+ return (cycle_t) (jifs * COMPARE) + count;
-+}
-+
-+static struct clocksource clocksource_mfgpt = {
-+ .name = "mfgpt",
-+ .rating = 120, /* Functional for real use, but not desired */
-+ .read = mfgpt_read,
-+ .mask = CLOCKSOURCE_MASK(32),
-+ .mult = 0,
-+ .shift = 22,
-+};
-+
-+int __init init_mfgpt_clocksource(void)
-+{
-+ if (num_possible_cpus() > 1) /* MFGPT does not scale! */
-+ return 0;
-+
-+ clocksource_mfgpt.mult = clocksource_hz2mult(MFGPT_TICK_RATE, 22);
-+ return clocksource_register(&clocksource_mfgpt);
-+}
-+
-+arch_initcall(init_mfgpt_clocksource);
-diff -Nur linux-2.6.30.5.orig/arch/mips/loongson/common/cs5536/cs5536_ohci.c linux-2.6.30.5/arch/mips/loongson/common/cs5536/cs5536_ohci.c
---- linux-2.6.30.5.orig/arch/mips/loongson/common/cs5536/cs5536_ohci.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.30.5/arch/mips/loongson/common/cs5536/cs5536_ohci.c 2009-08-23 19:01:04.000000000 +0200
-@@ -0,0 +1,168 @@
-+/*
-+ * the OHCI Virtual Support Module of AMD CS5536
-+ *
-+ * Copyright (C) 2007 Lemote, Inc. & Institute of Computing Technology
-+ * Author : jlliu, liujl@lemote.com
-+ *
-+ * Copyright (C) 2009 Lemote, Inc. & Institute of Computing Technology
-+ * Author: Wu Zhangjin, wuzj@lemote.com
-+ *
-+ * 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.
-+ */
-+
-+#include <cs5536/cs5536.h>
-+#include <cs5536/cs5536_pci.h>
-+
-+/*
-+ * ohci_write : ohci write transfering.
-+ */
-+void pci_ohci_write_reg(int reg, u32 value)
-+{
-+ u32 hi = 0, lo = value;
-+
-+ switch (reg) {
-+ case PCI_COMMAND:
-+ _rdmsr(USB_MSR_REG(USB_OHCI), &hi, &lo);
-+ if (value & PCI_COMMAND_MASTER)
-+ hi |= PCI_COMMAND_MASTER;
-+ else
-+ hi &= ~PCI_COMMAND_MASTER;
-+
-+ if (value & PCI_COMMAND_MEMORY)
-+ hi |= PCI_COMMAND_MEMORY;
-+ else
-+ hi &= ~PCI_COMMAND_MEMORY;
-+ _wrmsr(USB_MSR_REG(USB_OHCI), hi, lo);
-+ break;
-+ case PCI_STATUS:
-+ if (value & PCI_STATUS_PARITY) {
-+ _rdmsr(SB_MSR_REG(SB_ERROR), &hi, &lo);
-+ if (lo & SB_PARE_ERR_FLAG) {
-+ lo = (lo & 0x0000ffff) | SB_PARE_ERR_FLAG;
-+ _wrmsr(SB_MSR_REG(SB_ERROR), hi, lo);
-+ }
-+ }
-+ break;
-+ case PCI_BAR0_REG:
-+ if (value == PCI_BAR_RANGE_MASK) {
-+ _rdmsr(GLCP_MSR_REG(GLCP_SOFT_COM), &hi, &lo);
-+ lo |= SOFT_BAR_OHCI_FLAG;
-+ _wrmsr(GLCP_MSR_REG(GLCP_SOFT_COM), hi, lo);
-+ } else if ((value & 0x01) == 0x00) {
-+ _wrmsr(USB_MSR_REG(USB_OHCI), hi, lo);
-+
-+ value &= 0xfffffff0;
-+ hi = 0x40000000 | ((value & 0xff000000) >> 24);
-+ lo = 0x000fffff | ((value & 0x00fff000) << 8);
-+ _wrmsr(GLIU_MSR_REG(GLIU_P2D_BM3), hi, lo);
-+ }
-+ break;
-+ case PCI_INTERRUPT_LINE:
-+ value &= 0x000000ff;
-+ break;
-+ case PCI_OHCI_PM_REG:
-+ break;
-+ case PCI_OHCI_INT_REG:
-+ _rdmsr(DIVIL_MSR_REG(PIC_YSEL_LOW), &hi, &lo);
-+ lo &= ~(0xf << PIC_YSEL_LOW_USB_SHIFT);
-+ if (value) /* enable all the usb interrupt in PIC */
-+ lo |= (CS5536_USB_INTR << PIC_YSEL_LOW_USB_SHIFT);
-+ _wrmsr(DIVIL_MSR_REG(PIC_YSEL_LOW), hi, lo);
-+ break;
-+ default:
-+ break;
-+ }
-+
-+ return;
-+}
-+
-+/*
-+ * ohci_read : ohci read transfering.
-+ */
-+u32 pci_ohci_read_reg(int reg)
-+{
-+ u32 conf_data = 0;
-+ u32 hi, lo;
-+
-+ switch (reg) {
-+ case PCI_VENDOR_ID:
-+ conf_data =
-+ CFG_PCI_VENDOR_ID(CS5536_OHCI_DEVICE_ID, CS5536_VENDOR_ID);
-+ break;
-+ case PCI_COMMAND:
-+ _rdmsr(USB_MSR_REG(USB_OHCI), &hi, &lo);
-+ if (hi & PCI_COMMAND_MASTER)
-+ conf_data |= PCI_COMMAND_MASTER;
-+ if (hi & PCI_COMMAND_MEMORY)
-+ conf_data |= PCI_COMMAND_MEMORY;
-+ break;
-+ case PCI_STATUS:
-+ conf_data |= PCI_STATUS_66MHZ;
-+ conf_data |= PCI_STATUS_FAST_BACK;
-+ _rdmsr(SB_MSR_REG(SB_ERROR), &hi, &lo);
-+ if (lo & SB_PARE_ERR_FLAG)
-+ conf_data |= PCI_STATUS_PARITY;
-+ conf_data |= PCI_STATUS_DEVSEL_MEDIUM;
-+ break;
-+ case PCI_CLASS_REVISION:
-+ _rdmsr(USB_MSR_REG(USB_CAP), &hi, &lo);
-+ conf_data = lo & 0x000000ff;
-+ conf_data |= (CS5536_OHCI_CLASS_CODE << 8);
-+ break;
-+ case PCI_CACHE_LINE_SIZE:
-+ conf_data =
-+ CFG_PCI_CACHE_LINE_SIZE(PCI_NORMAL_HEADER_TYPE,
-+ PCI_NORMAL_LATENCY_TIMER);
-+ break;
-+ case PCI_BAR0_REG:
-+ _rdmsr(GLCP_MSR_REG(GLCP_SOFT_COM), &hi, &lo);
-+ if (lo & SOFT_BAR_OHCI_FLAG) {
-+ conf_data = CS5536_OHCI_RANGE |
-+ PCI_BASE_ADDRESS_SPACE_MEMORY;
-+ lo &= ~SOFT_BAR_OHCI_FLAG;
-+ _wrmsr(GLCP_MSR_REG(GLCP_SOFT_COM), hi, lo);
-+ } else {
-+ _rdmsr(USB_MSR_REG(USB_OHCI), &hi, &lo);
-+ conf_data = lo & 0xffffff00;
-+ conf_data &= ~0x0000000f; /* 32bit mem */
-+ }
-+ break;
-+ case PCI_BAR1_REG:
-+ case PCI_BAR2_REG:
-+ case PCI_BAR3_REG:
-+ case PCI_BAR4_REG:
-+ case PCI_BAR5_REG:
-+ break;
-+ case PCI_CARDBUS_CIS:
-+ conf_data = PCI_CARDBUS_CIS_POINTER;
-+ break;
-+ case PCI_SUBSYSTEM_VENDOR_ID:
-+ conf_data =
-+ CFG_PCI_VENDOR_ID(CS5536_OHCI_SUB_ID, CS5536_SUB_VENDOR_ID);
-+ break;
-+ case PCI_ROM_ADDRESS:
-+ conf_data = PCI_EXPANSION_ROM_BAR;
-+ break;
-+ case PCI_CAPABILITY_LIST:
-+ conf_data = PCI_CAPLIST_USB_POINTER;
-+ break;
-+ case PCI_INTERRUPT_LINE:
-+ conf_data =
-+ CFG_PCI_INTERRUPT_LINE(PCI_DEFAULT_PIN, CS5536_USB_INTR);
-+ break;
-+ case PCI_OHCI_PM_REG:
-+ break;
-+ case PCI_OHCI_INT_REG:
-+ _rdmsr(DIVIL_MSR_REG(PIC_YSEL_LOW), &hi, &lo);
-+ if ((lo & 0x00000f00) == CS5536_USB_INTR)
-+ conf_data = 1;
-+ break;
-+ default:
-+ break;
-+ }
-+
-+ return conf_data;
-+}
-diff -Nur linux-2.6.30.5.orig/arch/mips/loongson/common/cs5536/cs5536_otg.c linux-2.6.30.5/arch/mips/loongson/common/cs5536/cs5536_otg.c
---- linux-2.6.30.5.orig/arch/mips/loongson/common/cs5536/cs5536_otg.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.30.5/arch/mips/loongson/common/cs5536/cs5536_otg.c 2009-08-23 19:01:04.000000000 +0200
-@@ -0,0 +1,138 @@
-+/*
-+ * the OTG Virtual Support Module of AMD CS5536
-+ *
-+ * Copyright (C) 2007 Lemote, Inc. & Institute of Computing Technology
-+ * Author : jlliu, liujl@lemote.com
-+ *
-+ * Copyright (C) 2009 Lemote, Inc. & Institute of Computing Technology
-+ * Author: Wu Zhangjin, wuzj@lemote.com
-+ *
-+ * 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.
-+ */
-+
-+#include <cs5536/cs5536.h>
-+#include <cs5536/cs5536_pci.h>
-+
-+void pci_otg_write_reg(int reg, u32 value)
-+{
-+ u32 hi = 0, lo = value;
-+
-+ switch (reg) {
-+ case PCI_COMMAND:
-+ _rdmsr(USB_MSR_REG(USB_OTG), &hi, &lo);
-+ if (value & PCI_COMMAND_MEMORY)
-+ hi |= PCI_COMMAND_MEMORY;
-+ else
-+ hi &= ~PCI_COMMAND_MEMORY;
-+ _wrmsr(USB_MSR_REG(USB_OTG), hi, lo);
-+ break;
-+ case PCI_STATUS:
-+ if (value & PCI_STATUS_PARITY) {
-+ _rdmsr(SB_MSR_REG(SB_ERROR), &hi, &lo);
-+ if (lo & SB_PARE_ERR_FLAG) {
-+ lo = (lo & 0x0000ffff) | SB_PARE_ERR_FLAG;
-+ _wrmsr(SB_MSR_REG(SB_ERROR), hi, lo);
-+ }
-+ }
-+ break;
-+ case PCI_BAR0_REG:
-+ if (value == PCI_BAR_RANGE_MASK) {
-+ _rdmsr(GLCP_MSR_REG(GLCP_SOFT_COM), &hi, &lo);
-+ lo |= SOFT_BAR_OTG_FLAG;
-+ _wrmsr(GLCP_MSR_REG(GLCP_SOFT_COM), hi, lo);
-+ } else if ((value & 0x01) == 0x00) {
-+ _rdmsr(USB_MSR_REG(USB_OTG), &hi, &lo);
-+ lo &= 0xffffff00;
-+ _wrmsr(USB_MSR_REG(USB_OTG), hi, lo);
-+
-+ value &= 0xfffffff0;
-+ hi = 0x40000000 | ((value & 0xff000000) >> 24);
-+ lo = 0x000fffff | ((value & 0x00fff000) << 8);
-+ _wrmsr(GLIU_MSR_REG(GLIU_P2D_BM1), hi, lo);
-+ }
-+ break;
-+ default:
-+ break;
-+ }
-+
-+ return;
-+}
-+
-+u32 pci_otg_read_reg(int reg)
-+{
-+ u32 conf_data = 0;
-+ u32 hi, lo;
-+
-+ switch (reg) {
-+ case PCI_VENDOR_ID:
-+ conf_data =
-+ CFG_PCI_VENDOR_ID(CS5536_OTG_DEVICE_ID, CS5536_VENDOR_ID);
-+ break;
-+ case PCI_COMMAND:
-+ _rdmsr(USB_MSR_REG(USB_OTG), &hi, &lo);
-+ if (hi & PCI_COMMAND_MEMORY)
-+ conf_data |= PCI_COMMAND_MEMORY;
-+ break;
-+ case PCI_STATUS:
-+ conf_data |= PCI_STATUS_66MHZ;
-+ conf_data |= PCI_STATUS_FAST_BACK;
-+ _rdmsr(SB_MSR_REG(SB_ERROR), &hi, &lo);
-+ if (lo & SB_PARE_ERR_FLAG)
-+ conf_data |= PCI_STATUS_PARITY;
-+ conf_data |= PCI_STATUS_DEVSEL_MEDIUM;
-+ break;
-+ case PCI_CLASS_REVISION:
-+ _rdmsr(USB_MSR_REG(USB_CAP), &hi, &lo);
-+ conf_data = lo & 0x000000ff;
-+ conf_data |= (CS5536_OTG_CLASS_CODE << 8);
-+ break;
-+ case PCI_CACHE_LINE_SIZE:
-+ conf_data =
-+ CFG_PCI_CACHE_LINE_SIZE(PCI_NORMAL_HEADER_TYPE,
-+ PCI_NORMAL_LATENCY_TIMER);
-+ break;
-+ case PCI_BAR0_REG:
-+ _rdmsr(GLCP_MSR_REG(GLCP_SOFT_COM), &hi, &lo);
-+ if (lo & SOFT_BAR_OTG_FLAG) {
-+ conf_data = CS5536_OTG_RANGE |
-+ PCI_BASE_ADDRESS_SPACE_MEMORY;
-+ lo &= ~SOFT_BAR_OTG_FLAG;
-+ _wrmsr(GLCP_MSR_REG(GLCP_SOFT_COM), hi, lo);
-+ } else {
-+ _rdmsr(USB_MSR_REG(USB_OTG), &hi, &lo);
-+ conf_data = lo & 0xffffff00;
-+ conf_data &= ~0x0000000f;
-+ }
-+ break;
-+ case PCI_BAR1_REG:
-+ case PCI_BAR2_REG:
-+ case PCI_BAR3_REG:
-+ case PCI_BAR4_REG:
-+ case PCI_BAR5_REG:
-+ break;
-+ case PCI_CARDBUS_CIS:
-+ conf_data = PCI_CARDBUS_CIS_POINTER;
-+ break;
-+ case PCI_SUBSYSTEM_VENDOR_ID:
-+ conf_data =
-+ CFG_PCI_VENDOR_ID(CS5536_OTG_SUB_ID, CS5536_SUB_VENDOR_ID);
-+ break;
-+ case PCI_ROM_ADDRESS:
-+ conf_data = PCI_EXPANSION_ROM_BAR;
-+ break;
-+ case PCI_CAPABILITY_LIST:
-+ conf_data = PCI_CAPLIST_USB_POINTER;
-+ break;
-+ case PCI_INTERRUPT_LINE:
-+ conf_data =
-+ CFG_PCI_INTERRUPT_LINE(PCI_DEFAULT_PIN, CS5536_USB_INTR);
-+ break;
-+ default:
-+ break;
-+ }
-+
-+ return conf_data;
-+}
-diff -Nur linux-2.6.30.5.orig/arch/mips/loongson/common/cs5536/cs5536_pci.c linux-2.6.30.5/arch/mips/loongson/common/cs5536/cs5536_pci.c
---- linux-2.6.30.5.orig/arch/mips/loongson/common/cs5536/cs5536_pci.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.30.5/arch/mips/loongson/common/cs5536/cs5536_pci.c 2009-08-23 19:01:04.000000000 +0200
-@@ -0,0 +1,126 @@
-+/*
-+ * read/write operation to the PCI config space of CS5536
-+ *
-+ * Copyright (C) 2007 Lemote, Inc. & Institute of Computing Technology
-+ * Author : jlliu, liujl@lemote.com
-+ *
-+ * Copyright (C) 2009 Lemote, Inc. & Institute of Computing Technology
-+ * Author: Wu Zhangjin, wuzj@lemote.com
-+ *
-+ * 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.
-+ *
-+ * the Virtual Support Module(VSM) for virtulizing the PCI
-+ * configure space are defined in cs5536_modulename.c respectively,
-+ * so you can select modules which have been used in his/her board.
-+ * to archive this, you just need to add a "select CS5536_[MODULE]"
-+ * option in your board in arch/mips/loongson/Kconfig
-+ *
-+ * after this virtulizing, user can access the PCI configure space
-+ * directly as a normal multi-function PCI device which following
-+ * the PCI-2.2 spec.
-+ */
-+
-+#include <linux/types.h>
-+#include <cs5536/cs5536_vsm.h>
-+
-+enum {
-+ CS5536_FUNC_START = -1,
-+ CS5536_ISA_FUNC,
-+ CS5536_FLASH_FUNC,
-+ CS5536_IDE_FUNC,
-+ CS5536_ACC_FUNC,
-+ CS5536_OHCI_FUNC,
-+ CS5536_EHCI_FUNC,
-+ CS5536_UDC_FUNC,
-+ CS5536_OTG_FUNC,
-+ CS5536_FUNC_END,
-+};
-+
-+/*
-+ * write to PCI config space and transfer it to MSR write.
-+ */
-+void cs5536_pci_conf_write4(int function, int reg, u32 value)
-+{
-+ if ((function <= CS5536_FUNC_START) || (function >= CS5536_FUNC_END))
-+ return;
-+ if ((reg < 0) || (reg > 0x100) || ((reg & 0x03) != 0))
-+ return;
-+
-+ switch (function) {
-+ case CS5536_ISA_FUNC:
-+ pci_isa_write_reg(reg, value);
-+ break;
-+ case CS5536_FLASH_FUNC:
-+ pci_flash_write_reg(reg, value);
-+ break;
-+ case CS5536_IDE_FUNC:
-+ pci_ide_write_reg(reg, value);
-+ break;
-+ case CS5536_ACC_FUNC:
-+ pci_acc_write_reg(reg, value);
-+ break;
-+ case CS5536_OHCI_FUNC:
-+ pci_ohci_write_reg(reg, value);
-+ break;
-+ case CS5536_EHCI_FUNC:
-+ pci_ehci_write_reg(reg, value);
-+ break;
-+ case CS5536_UDC_FUNC:
-+ pci_udc_write_reg(reg, value);
-+ break;
-+ case CS5536_OTG_FUNC:
-+ pci_otg_write_reg(reg, value);
-+ break;
-+ default:
-+ break;
-+ }
-+ return;
-+}
-+
-+/*
-+ * read PCI config space and transfer it to MSR access.
-+ */
-+u32 cs5536_pci_conf_read4(int function, int reg)
-+{
-+ u32 data = 0;
-+
-+ if ((function <= CS5536_FUNC_START) || (function >= CS5536_FUNC_END))
-+ return 0;
-+ if ((reg < 0) || ((reg & 0x03) != 0))
-+ return 0;
-+ if (reg > 0x100)
-+ return 0xffffffff;
-+
-+ switch (function) {
-+ case CS5536_ISA_FUNC:
-+ data = pci_isa_read_reg(reg);
-+ break;
-+ case CS5536_FLASH_FUNC:
-+ data = pci_flash_read_reg(reg);
-+ break;
-+ case CS5536_IDE_FUNC:
-+ data = pci_ide_read_reg(reg);
-+ break;
-+ case CS5536_ACC_FUNC:
-+ data = pci_acc_read_reg(reg);
-+ break;
-+ case CS5536_OHCI_FUNC:
-+ data = pci_ohci_read_reg(reg);
-+ break;
-+ case CS5536_EHCI_FUNC:
-+ data = pci_ehci_read_reg(reg);
-+ break;
-+ case CS5536_UDC_FUNC:
-+ data = pci_udc_read_reg(reg);
-+ break;
-+ case CS5536_OTG_FUNC:
-+ data = pci_otg_read_reg(reg);
-+ break;
-+ default:
-+ break;
-+ }
-+ return data;
-+}
-diff -Nur linux-2.6.30.5.orig/arch/mips/loongson/common/cs5536/cs5536_udc.c linux-2.6.30.5/arch/mips/loongson/common/cs5536/cs5536_udc.c
---- linux-2.6.30.5.orig/arch/mips/loongson/common/cs5536/cs5536_udc.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.30.5/arch/mips/loongson/common/cs5536/cs5536_udc.c 2009-08-23 19:01:04.000000000 +0200
-@@ -0,0 +1,143 @@
-+/*
-+ * the UDC Virtual Support Module of AMD CS5536
-+ *
-+ * Copyright (C) 2007 Lemote, Inc. & Institute of Computing Technology
-+ * Author : jlliu, liujl@lemote.com
-+ *
-+ * Copyright (C) 2009 Lemote, Inc. & Institute of Computing Technology
-+ * Author: Wu Zhangjin, wuzj@lemote.com
-+ *
-+ * 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.
-+ */
-+
-+#include <cs5536/cs5536.h>
-+#include <cs5536/cs5536_pci.h>
-+
-+void pci_udc_write_reg(int reg, u32 value)
-+{
-+ u32 hi = 0, lo = value;
-+
-+ switch (reg) {
-+ case PCI_COMMAND:
-+ _rdmsr(USB_MSR_REG(USB_UDC), &hi, &lo);
-+ if (value & PCI_COMMAND_MASTER)
-+ hi |= PCI_COMMAND_MASTER;
-+ else
-+ hi &= ~PCI_COMMAND_MASTER;
-+
-+ if (value & PCI_COMMAND_MEMORY)
-+ hi |= PCI_COMMAND_MEMORY;
-+ else
-+ hi &= ~PCI_COMMAND_MEMORY;
-+ _wrmsr(USB_MSR_REG(USB_UDC), hi, lo);
-+ break;
-+ case PCI_STATUS:
-+ if (value & PCI_STATUS_PARITY) {
-+ _rdmsr(SB_MSR_REG(SB_ERROR), &hi, &lo);
-+ if (lo & SB_PARE_ERR_FLAG) {
-+ lo = (lo & 0x0000ffff) | SB_PARE_ERR_FLAG;
-+ _wrmsr(SB_MSR_REG(SB_ERROR), hi, lo);
-+ }
-+ }
-+ break;
-+ case PCI_BAR0_REG:
-+ if (value == PCI_BAR_RANGE_MASK) {
-+ _rdmsr(GLCP_MSR_REG(GLCP_SOFT_COM), &hi, &lo);
-+ lo |= SOFT_BAR_UDC_FLAG;
-+ _wrmsr(GLCP_MSR_REG(GLCP_SOFT_COM), hi, lo);
-+ } else if ((value & 0x01) == 0x00) {
-+ _wrmsr(USB_MSR_REG(USB_UDC), hi, lo);
-+
-+ value &= 0xfffffff0;
-+ hi = 0x40000000 | ((value & 0xff000000) >> 24);
-+ lo = 0x000fffff | ((value & 0x00fff000) << 8);
-+ _wrmsr(GLIU_MSR_REG(GLIU_P2D_BM0), hi, lo);
-+ }
-+ break;
-+ default:
-+ break;
-+ }
-+
-+ return;
-+}
-+
-+u32 pci_udc_read_reg(int reg)
-+{
-+ u32 conf_data = 0;
-+ u32 hi, lo;
-+
-+ switch (reg) {
-+ case PCI_VENDOR_ID:
-+ conf_data =
-+ CFG_PCI_VENDOR_ID(CS5536_UDC_DEVICE_ID, CS5536_VENDOR_ID);
-+ break;
-+ case PCI_COMMAND:
-+ _rdmsr(USB_MSR_REG(USB_UDC), &hi, &lo);
-+ if (hi & PCI_COMMAND_MASTER)
-+ conf_data |= PCI_COMMAND_MASTER;
-+ if (hi & PCI_COMMAND_MEMORY)
-+ conf_data |= PCI_COMMAND_MEMORY;
-+ break;
-+ case PCI_STATUS:
-+ conf_data |= PCI_STATUS_66MHZ;
-+ conf_data |= PCI_STATUS_FAST_BACK;
-+ _rdmsr(SB_MSR_REG(SB_ERROR), &hi, &lo);
-+ if (lo & SB_PARE_ERR_FLAG)
-+ conf_data |= PCI_STATUS_PARITY;
-+ conf_data |= PCI_STATUS_DEVSEL_MEDIUM;
-+ break;
-+ case PCI_CLASS_REVISION:
-+ _rdmsr(USB_MSR_REG(USB_CAP), &hi, &lo);
-+ conf_data = lo & 0x000000ff;
-+ conf_data |= (CS5536_UDC_CLASS_CODE << 8);
-+ break;
-+ case PCI_CACHE_LINE_SIZE:
-+ conf_data =
-+ CFG_PCI_CACHE_LINE_SIZE(PCI_NORMAL_HEADER_TYPE,
-+ PCI_NORMAL_LATENCY_TIMER);
-+ break;
-+ case PCI_BAR0_REG:
-+ _rdmsr(GLCP_MSR_REG(GLCP_SOFT_COM), &hi, &lo);
-+ if (lo & SOFT_BAR_UDC_FLAG) {
-+ conf_data = CS5536_UDC_RANGE |
-+ PCI_BASE_ADDRESS_SPACE_MEMORY;
-+ lo &= ~SOFT_BAR_UDC_FLAG;
-+ _wrmsr(GLCP_MSR_REG(GLCP_SOFT_COM), hi, lo);
-+ } else {
-+ _rdmsr(USB_MSR_REG(USB_UDC), &hi, &lo);
-+ conf_data = lo & 0xfffff000;
-+ conf_data &= ~0x0000000f; /* 32bit mem */
-+ }
-+ break;
-+ case PCI_BAR1_REG:
-+ case PCI_BAR2_REG:
-+ case PCI_BAR3_REG:
-+ case PCI_BAR4_REG:
-+ case PCI_BAR5_REG:
-+ break;
-+ case PCI_CARDBUS_CIS:
-+ conf_data = PCI_CARDBUS_CIS_POINTER;
-+ break;
-+ case PCI_SUBSYSTEM_VENDOR_ID:
-+ conf_data =
-+ CFG_PCI_VENDOR_ID(CS5536_UDC_SUB_ID, CS5536_SUB_VENDOR_ID);
-+ break;
-+ case PCI_ROM_ADDRESS:
-+ conf_data = PCI_EXPANSION_ROM_BAR;
-+ break;
-+ case PCI_CAPABILITY_LIST:
-+ conf_data = PCI_CAPLIST_USB_POINTER;
-+ break;
-+ case PCI_INTERRUPT_LINE:
-+ conf_data =
-+ CFG_PCI_INTERRUPT_LINE(PCI_DEFAULT_PIN, CS5536_USB_INTR);
-+ break;
-+ default:
-+ break;
-+ }
-+
-+ return conf_data;
-+}
-diff -Nur linux-2.6.30.5.orig/arch/mips/loongson/common/cs5536/Makefile linux-2.6.30.5/arch/mips/loongson/common/cs5536/Makefile
---- linux-2.6.30.5.orig/arch/mips/loongson/common/cs5536/Makefile 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.30.5/arch/mips/loongson/common/cs5536/Makefile 2009-08-23 19:01:04.000000000 +0200
-@@ -0,0 +1,25 @@
-+#
-+# Makefile for CS5536 support.
-+#
-+
-+#
-+# core modules
-+#
-+obj-$(CONFIG_CS5536) += cs5536_pci.o cs5536_ide.o cs5536_acc.o cs5536_ohci.o \
-+ cs5536_isa.o cs5536_ehci.o
-+#
-+# selective modules
-+#
-+# add a CS5536_[MODULE] to your board in arch/mips/loongson/Kconfig
-+#
-+obj-$(CONFIG_CS5536_FLASH) += cs5536_flash.o
-+obj-$(CONFIG_CS5536_NOR_FLASH) += cs5536_flash.o
-+obj-$(CONFIG_CS5536_OTG) += cs5536_otg.o
-+obj-$(CONFIG_CS5536_UDC) += cs5536_udc.o
-+
-+#
-+# Enable cs5536 mfgpt Timer
-+#
-+obj-$(CONFIG_CS5536_MFGPT) += cs5536_mfgpt.o
-+
-+EXTRA_CFLAGS += -Werror
-diff -Nur linux-2.6.30.5.orig/arch/mips/loongson/common/dbg.c linux-2.6.30.5/arch/mips/loongson/common/dbg.c
---- linux-2.6.30.5.orig/arch/mips/loongson/common/dbg.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.30.5/arch/mips/loongson/common/dbg.c 2009-08-23 19:01:04.000000000 +0200
-@@ -0,0 +1,34 @@
-+/*
-+ * Copyright (C) 2009 Lemote Inc. & Insititute of Computing Technology
-+ *
-+ * 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.
-+ */
-+
-+#include <dbg.h>
-+#include <loongson.h>
-+
-+#define PROM_PRINTF_BUF_LEN 1024
-+
-+void prom_printf(char *fmt, ...)
-+{
-+ static char buf[PROM_PRINTF_BUF_LEN];
-+ va_list args;
-+ char *ptr;
-+
-+
-+ va_start(args, fmt);
-+ vscnprintf(buf, sizeof(buf), fmt, args);
-+
-+ ptr = buf;
-+
-+ while (*ptr != 0) {
-+ if (*ptr == '\n')
-+ prom_putchar('\r');
-+
-+ prom_putchar(*ptr++);
-+ }
-+ va_end(args);
-+}
-diff -Nur linux-2.6.30.5.orig/arch/mips/loongson/common/early_printk.c linux-2.6.30.5/arch/mips/loongson/common/early_printk.c
---- linux-2.6.30.5.orig/arch/mips/loongson/common/early_printk.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.30.5/arch/mips/loongson/common/early_printk.c 2009-08-23 19:01:04.000000000 +0200
-@@ -0,0 +1,28 @@
-+/* early printk support
-+ *
-+ * Copyright (c) 2009 Philippe Vachon <philippe@cowpig.ca>
-+ *
-+ * 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.
-+ */
-+
-+#include <linux/types.h>
-+#include <linux/serial_reg.h>
-+
-+#include <loongson.h>
-+#include <machine.h>
-+
-+void prom_putchar(char c)
-+{
-+ int timeout;
-+ phys_addr_t uart_base =
-+ (phys_addr_t) ioremap_nocache(LOONGSON_UART_BASE, 8);
-+ char reg = readb((u8 *) (uart_base + UART_LSR)) & UART_LSR_THRE;
-+
-+ for (timeout = 1024; reg == 0 && timeout > 0; timeout--)
-+ reg = readb((u8 *) (uart_base + UART_LSR)) & UART_LSR_THRE;
-+
-+ writeb(c, (u8 *) (uart_base + UART_TX));
-+}
-diff -Nur linux-2.6.30.5.orig/arch/mips/loongson/common/env.c linux-2.6.30.5/arch/mips/loongson/common/env.c
---- linux-2.6.30.5.orig/arch/mips/loongson/common/env.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.30.5/arch/mips/loongson/common/env.c 2009-08-23 19:01:04.000000000 +0200
-@@ -0,0 +1,59 @@
-+/*
-+ * Based on Ocelot Linux port, which is
-+ * Copyright 2001 MontaVista Software Inc.
-+ * Author: jsun@mvista.com or jsun@junsun.net
-+ *
-+ * Copyright 2003 ICT CAS
-+ * Author: Michael Guo <guoyi@ict.ac.cn>
-+ *
-+ * Copyright (C) 2007 Lemote Inc. & Insititute of Computing Technology
-+ * Author: Fuxin Zhang, zhangfx@lemote.com
-+ *
-+ * Copyright (C) 2009 Lemote Inc. & Insititute of Computing Technology
-+ * Author: Wu Zhangjin, wuzj@lemote.com
-+ *
-+ * 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.
-+ */
-+
-+#include <asm/bootinfo.h>
-+
-+#include <loongson.h>
-+
-+unsigned long bus_clock, cpu_clock_freq;
-+unsigned long memsize, highmemsize;
-+
-+/* pmon passes arguments in 32bit pointers */
-+int *_prom_envp;
-+
-+#define parse_even_earlier(res, option, p) \
-+do { \
-+ if (strncmp(option, (char *)p, strlen(option)) == 0) \
-+ strict_strtol((char *)p + strlen(option"="), \
-+ 10, &res); \
-+} while (0)
-+
-+void __init prom_init_env(void)
-+{
-+ long l;
-+
-+ /* firmware arguments are initialized in head.S */
-+ _prom_envp = (int *)fw_arg2;
-+
-+ l = (long)*_prom_envp;
-+ while (l != 0) {
-+ parse_even_earlier(bus_clock, "busclock", l);
-+ parse_even_earlier(cpu_clock_freq, "cpuclock", l);
-+ parse_even_earlier(memsize, "memsize", l);
-+ parse_even_earlier(highmemsize, "highmemsize", l);
-+ _prom_envp++;
-+ l = (long)*_prom_envp;
-+ }
-+ if (memsize == 0)
-+ memsize = 256;
-+
-+ pr_info("busclock=%ld, cpuclock=%ld, memsize=%ld, highmemsize=%ld\n",
-+ bus_clock, cpu_clock_freq, memsize, highmemsize);
-+}
-diff -Nur linux-2.6.30.5.orig/arch/mips/loongson/common/init.c linux-2.6.30.5/arch/mips/loongson/common/init.c
---- linux-2.6.30.5.orig/arch/mips/loongson/common/init.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.30.5/arch/mips/loongson/common/init.c 2009-08-23 19:01:04.000000000 +0200
-@@ -0,0 +1,65 @@
-+/*
-+ * Based on Ocelot Linux port, which is
-+ * Copyright 2001 MontaVista Software Inc.
-+ * Author: jsun@mvista.com or jsun@junsun.net
-+ *
-+ * Copyright 2003 ICT CAS
-+ * Author: Michael Guo <guoyi@ict.ac.cn>
-+ *
-+ * Copyright (C) 2007 Lemote Inc. & Insititute of Computing Technology
-+ * Author: Fuxin Zhang, zhangfx@lemote.com
-+ *
-+ * 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.
-+ */
-+
-+#include <linux/bootmem.h>
-+
-+#include <asm/bootinfo.h>
-+#include <asm/mipsregs.h>
-+
-+#include <loongson.h>
-+
-+#if defined(CONFIG_CPU_LOONGSON2F) && defined(CONFIG_64BIT)
-+unsigned long _loongson_addrwincfg_base;
-+
-+/* Loongson CPU address windows config space base address */
-+static inline void set_loongson_addrwincfg_base(unsigned long base)
-+{
-+ *(unsigned long *)&_loongson_addrwincfg_base = base;
-+ barrier();
-+}
-+#endif
-+
-+/* stop all perf counters by default
-+ * $24 is the control register of loongson perf counter
-+ */
-+static inline void stop_perf_counters(void)
-+{
-+ __write_64bit_c0_register($24, 0, 0);
-+}
-+
-+void __init prom_init(void)
-+{
-+ /* init several base address */
-+ set_io_port_base((unsigned long)
-+ ioremap(LOONGSON_PCIIO_BASE, LOONGSON_PCIIO_SIZE));
-+
-+#if defined(CONFIG_CPU_LOONGSON2F) && defined(CONFIG_64BIT)
-+ set_loongson_addrwincfg_base((unsigned long)
-+ ioremap(LOONGSON_ADDRWINCFG_BASE,
-+ LOONGSON_ADDRWINCFG_SIZE));
-+#endif
-+ /* stop all perf counters */
-+ stop_perf_counters();
-+
-+ prom_init_cmdline();
-+ prom_init_env();
-+ prom_init_memory();
-+}
-+
-+void __init prom_free_prom_memory(void)
-+{
-+}
-diff -Nur linux-2.6.30.5.orig/arch/mips/loongson/common/irq.c linux-2.6.30.5/arch/mips/loongson/common/irq.c
---- linux-2.6.30.5.orig/arch/mips/loongson/common/irq.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.30.5/arch/mips/loongson/common/irq.c 2009-08-23 19:01:04.000000000 +0200
-@@ -0,0 +1,120 @@
-+/*
-+ * Copyright 2001 MontaVista Software Inc.
-+ * Author: Jun Sun, jsun@mvista.com or jsun@junsun.net
-+ * Copyright (C) 2000, 2001 Ralf Baechle (ralf@gnu.org)
-+ *
-+ * Copyright (C) 2007 Lemote Inc. & Insititute of Computing Technology
-+ * Author: Fuxin Zhang, zhangfx@lemote.com
-+ *
-+ * 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.
-+ */
-+
-+#include <linux/delay.h>
-+#include <linux/interrupt.h>
-+
-+#include <asm/irq_cpu.h>
-+#include <asm/i8259.h>
-+
-+#include <loongson.h>
-+#include <machine.h>
-+
-+/*
-+ * the first level int-handler will jump here if it is a loongson irq
-+ */
-+void bonito_irqdispatch(void)
-+{
-+ u32 int_status;
-+ int i;
-+
-+ /* workaround the IO dma problem: let cpu looping to allow DMA finish */
-+ int_status = LOONGSON_INTISR;
-+ while (int_status & (1 << 10)) {
-+ udelay(1);
-+ int_status = LOONGSON_INTISR;
-+ }
-+
-+ /* Get pending sources, masked by current enables */
-+ int_status = LOONGSON_INTISR & LOONGSON_INTEN;
-+
-+ if (int_status != 0) {
-+ i = __ffs(int_status);
-+ int_status &= ~(1 << i);
-+ do_IRQ(LOONGSON_IRQ_BASE + i);
-+ }
-+}
-+
-+void i8259_irqdispatch(void)
-+{
-+ int irq;
-+
-+ irq = mach_i8259_irq();
-+ if (irq < 0)
-+ spurious_interrupt();
-+ else
-+ do_IRQ(irq);
-+}
-+
-+asmlinkage void plat_irq_dispatch(void)
-+{
-+ unsigned int pending = read_c0_cause() & read_c0_status() & ST0_IM;
-+
-+ mach_irq_dispatch(pending);
-+}
-+
-+
-+static struct irqaction cascade_irqaction = {
-+ .handler = no_action,
-+ .name = "cascade",
-+};
-+
-+irqreturn_t ip6_action(int cpl, void *dev_id)
-+{
-+ return IRQ_HANDLED;
-+}
-+
-+static struct irqaction ip6_irqaction = {
-+ .handler = ip6_action,
-+ .name = "cascade",
-+ .flags = IRQF_SHARED,
-+};
-+
-+void __init arch_init_irq(void)
-+{
-+ /*
-+ * Clear all of the interrupts while we change the able around a bit.
-+ * int-handler is not on bootstrap
-+ */
-+ clear_c0_status(ST0_IM | ST0_BEV);
-+ local_irq_disable();
-+
-+ /* setting irq trigger mode */
-+ set_irq_trigger_mode();
-+
-+ /* no steer */
-+ LOONGSON_INTSTEER = 0;
-+
-+ /*
-+ * Mask out all interrupt by writing "1" to all bit position in
-+ * the interrupt reset reg.
-+ */
-+ LOONGSON_INTENCLR = ~0;
-+
-+ /* init all controller
-+ * 0-15 ------> i8259 interrupt
-+ * 16-23 ------> mips cpu interrupt
-+ * 32-63 ------> bonito irq
-+ */
-+
-+ /* Sets the first-level interrupt dispatcher. */
-+ mips_cpu_irq_init();
-+ init_i8259_irqs();
-+ bonito_irq_init();
-+
-+ /* setup north bridge irq (bonito) */
-+ setup_irq(LOONGSON_NORTH_BRIDGE_IRQ, &ip6_irqaction);
-+ /* setup source bridge irq (i8259) */
-+ setup_irq(LOONGSON_SOUTH_BRIDGE_IRQ, &cascade_irqaction);
-+}
-diff -Nur linux-2.6.30.5.orig/arch/mips/loongson/common/machtype.c linux-2.6.30.5/arch/mips/loongson/common/machtype.c
---- linux-2.6.30.5.orig/arch/mips/loongson/common/machtype.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.30.5/arch/mips/loongson/common/machtype.c 2009-08-23 19:01:04.000000000 +0200
-@@ -0,0 +1,50 @@
-+/*
-+ * Copyright (C) 2009 Lemote Inc. & Insititute of Computing Technology
-+ * Author: Wu Zhangjin, wuzj@lemote.com
-+ *
-+ * Copyright (c) 2009 Zhang Le <r0bertz@gentoo.org>
-+ *
-+ * 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.
-+ */
-+
-+#include <linux/errno.h>
-+#include <asm/bootinfo.h>
-+
-+#include <loongson.h>
-+#include <machine.h>
-+
-+static const char *system_types[] = {
-+ [MACH_LOONGSON_UNKNOWN] "unknown loongson machine",
-+ [MACH_LEMOTE_FL2E] "lemote-fuloong-2e-box",
-+ [MACH_LEMOTE_FL2F] "lemote-fuloong-2f-box",
-+ [MACH_LEMOTE_YL2F89] "lemote-yeeloong-2f-8.9inches",
-+ [MACH_LEMOTE_YL2F7] "lemote-yeeloong-2f-7inches",
-+ [MACH_LOONGSON_END] NULL,
-+};
-+
-+const char *get_system_type(void)
-+{
-+ if (mips_machtype == MACH_UNKNOWN)
-+ mips_machtype = MACHTYPE;
-+
-+ return system_types[mips_machtype];
-+}
-+
-+static __init int machtype_setup(char *str)
-+{
-+ int machtype = MACH_LEMOTE_FL2E;
-+
-+ if (!str)
-+ return -EINVAL;
-+
-+ for (; system_types[machtype]; machtype++)
-+ if (strstr(system_types[machtype], str)) {
-+ mips_machtype = machtype;
-+ break;
-+ }
-+ return 0;
-+}
-+__setup("machtype=", machtype_setup);
-diff -Nur linux-2.6.30.5.orig/arch/mips/loongson/common/Makefile linux-2.6.30.5/arch/mips/loongson/common/Makefile
---- linux-2.6.30.5.orig/arch/mips/loongson/common/Makefile 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.30.5/arch/mips/loongson/common/Makefile 2009-08-23 19:01:04.000000000 +0200
-@@ -0,0 +1,37 @@
-+#
-+# Makefile for loongson based machines.
-+#
-+
-+obj-y += setup.o init.o cmdline.o env.o time.o reset.o irq.o \
-+ pci.o bonito-irq.o mem.o machtype.o
-+
-+#
-+# Early printk support
-+#
-+obj-$(CONFIG_EARLY_PRINTK) += early_printk.o dbg.o
-+
-+#
-+# Enable RTC Class support
-+#
-+# please enable CONFIG_RTC_DRV_CMOS
-+#
-+obj-$(CONFIG_RTC_DRV_CMOS) += rtc.o
-+
-+#
-+# Enable CS5536 Virtual Support Module(VSM) for virtulize the PCI configure
-+# space
-+#
-+obj-$(CONFIG_CS5536) += cs5536/
-+
-+#
-+# Enable fuloong(2f) and yeeloong(2f) cpu frequency scaling support
-+# This is based on CS5536 mfgpt timer
-+#
-+obj-$(CONFIG_LOONGSON2F_CPU_FREQ) += clock.o
-+
-+#
-+# Enable serial port
-+#
-+obj-$(CONFIG_SERIAL_8250) += serial.o
-+
-+EXTRA_CFLAGS += -Werror
-diff -Nur linux-2.6.30.5.orig/arch/mips/loongson/common/mem.c linux-2.6.30.5/arch/mips/loongson/common/mem.c
---- linux-2.6.30.5.orig/arch/mips/loongson/common/mem.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.30.5/arch/mips/loongson/common/mem.c 2009-08-23 19:01:04.000000000 +0200
-@@ -0,0 +1,116 @@
-+/*
-+ * 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.
-+ */
-+
-+#include <linux/fs.h>
-+#include <linux/mm.h>
-+
-+#include <asm/bootinfo.h>
-+
-+#include <loongson.h>
-+#include <mem.h>
-+
-+void __init prom_init_memory(void)
-+{
-+ add_memory_region(0x0, (memsize << 20), BOOT_MEM_RAM);
-+#ifdef CONFIG_64BIT
-+#ifdef CONFIG_CPU_LOONGSON2F
-+ {
-+ int bit;
-+
-+ bit = fls(memsize + highmemsize);
-+ if (bit != ffs(memsize + highmemsize))
-+ bit += 20;
-+ else
-+ bit = bit + 20 - 1;
-+
-+ /* set cpu window3 to map CPU to DDR: 2G -> 2G */
-+ LOONGSON_ADDRWIN_CPUTODDR(ADDRWIN_WIN3, 0x80000000ul,
-+ 0x80000000ul, (1 << bit));
-+ mmiowb();
-+ }
-+#endif /* CONFIG_CPU_LOONGSON2F */
-+
-+ if (highmemsize > 0) {
-+ add_memory_region(LOONGSON_HIGHMEM_START,
-+ highmemsize << 20, BOOT_MEM_RAM);
-+ }
-+#endif /* CONFIG_64BIT */
-+}
-+
-+/* override of arch/mips/mm/cache.c: __uncached_access */
-+int __uncached_access(struct file *file, unsigned long addr)
-+{
-+ if (file->f_flags & O_SYNC)
-+ return 1;
-+
-+ return addr >= __pa(high_memory) ||
-+ ((addr >= LOONGSON_MMIO_MEM_START) && \
-+ (addr < LOONGSON_MMIO_MEM_END));
-+}
-+
-+#if defined(CONFIG_CPU_LOONGSON2F)
-+
-+#include <linux/pci.h>
-+#include <linux/sched.h>
-+#include <asm/current.h>
-+
-+static unsigned long uca_start;
-+static unsigned long uca_size = CONFIG_UCA_SIZE;
-+
-+pgprot_t phys_mem_access_prot(struct file *file, unsigned long pfn,
-+ unsigned long size, pgprot_t vma_prot)
-+{
-+ unsigned long offset = pfn << PAGE_SHIFT;
-+ unsigned long end = offset + size;
-+
-+ if (__uncached_access(file, offset)) {
-+ if (((uca_start && offset) >= uca_start) && \
-+ (end <= (uca_start + uca_size)))
-+ return __pgprot((pgprot_val(vma_prot) & \
-+ ~_CACHE_MASK) | \
-+ _CACHE_UNCACHED_ACCELERATED);
-+ else
-+ return pgprot_noncached(vma_prot);
-+ }
-+ return vma_prot;
-+}
-+
-+static int __init find_vga_mem_init(void)
-+{
-+ struct pci_dev *dev = 0;
-+ struct resource *r;
-+ int idx;
-+
-+ if (uca_start)
-+ return 0;
-+
-+ for_each_pci_dev(dev) {
-+ if ((dev->class >> 8) == PCI_CLASS_DISPLAY_VGA) {
-+ for (idx = 0; idx < PCI_NUM_RESOURCES; idx++) {
-+ r = &dev->resource[idx];
-+ if (!r->start && r->end)
-+ continue;
-+ if (r->flags & IORESOURCE_IO)
-+ continue;
-+ if (r->flags & IORESOURCE_MEM) {
-+ uca_start = r->start;
-+
-+ printk(KERN_INFO
-+ "find the frame buffer:start=%lx\n",
-+ uca_start);
-+
-+ return 0;
-+ }
-+ }
-+
-+ }
-+ }
-+ return 0;
-+}
-+
-+late_initcall(find_vga_mem_init);
-+#endif /* !CONFIG_CPU_LOONGSON2F */
-diff -Nur linux-2.6.30.5.orig/arch/mips/loongson/common/pci.c linux-2.6.30.5/arch/mips/loongson/common/pci.c
---- linux-2.6.30.5.orig/arch/mips/loongson/common/pci.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.30.5/arch/mips/loongson/common/pci.c 2009-08-23 19:01:04.000000000 +0200
-@@ -0,0 +1,109 @@
-+/*
-+ * Copyright (C) 2007 Lemote, Inc. & Institute of Computing Technology
-+ * Author: Fuxin Zhang, zhangfx@lemote.com
-+ *
-+ * 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 SOFTWARE IS PROVIDED ``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 AUTHOR 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.
-+ *
-+ * 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.,
-+ * 675 Mass Ave, Cambridge, MA 02139, USA.
-+ *
-+ */
-+
-+#include <linux/pci.h>
-+
-+#include <loongson.h>
-+#include <pci.h>
-+
-+static struct resource loongson_pci_mem_resource = {
-+ .name = "pci memory space",
-+ .start = LOONGSON_PCI_MEM_START,
-+ .end = LOONGSON_PCI_MEM_END,
-+ .flags = IORESOURCE_MEM,
-+};
-+
-+static struct resource loongson_pci_io_resource = {
-+ .name = "pci io space",
-+ .start = LOONGSON_PCI_IO_START, /* reserve regacy I/O space */
-+ .end = IO_SPACE_LIMIT,
-+ .flags = IORESOURCE_IO,
-+};
-+
-+static struct pci_controller loongson_pci_controller = {
-+ .pci_ops = &loongson_pci_ops,
-+ .io_resource = &loongson_pci_io_resource,
-+ .mem_resource = &loongson_pci_mem_resource,
-+ .mem_offset = 0x00000000UL,
-+ .io_offset = 0x00000000UL,
-+};
-+
-+static void __init ict_pcimap(void)
-+{
-+ /*
-+ * local to PCI mapping for CPU accessing PCI space
-+ *
-+ * CPU address space [256M,448M] is window for accessing pci space
-+ * we set pcimap_lo[0,1,2] to map it to pci space[0M,64M], [320M,448M]
-+ *
-+ * pcimap: PCI_MAP2 PCI_Mem_Lo2 PCI_Mem_Lo1 PCI_Mem_Lo0
-+ * [<2G] [384M,448M] [320M,384M] [0M,64M]
-+ */
-+ LOONGSON_PCIMAP = LOONGSON_PCIMAP_PCIMAP_2 |
-+ LOONGSON_PCIMAP_WIN(2, 0x18000000) |
-+ LOONGSON_PCIMAP_WIN(1, 0x14000000) |
-+ LOONGSON_PCIMAP_WIN(0, 0);
-+
-+ /*
-+ * PCI-DMA to local mapping: [2G,2G+256M] -> [0M,256M]
-+ */
-+ LOONGSON_PCIBASE0 = 0x80000000ul; /* base: 2G -> mmap: 0M */
-+ /* size: 256M, burst transmission, pre-fetch enable, 64bit */
-+ LOONGSON_PCI_HIT0_SEL_L = 0xc000000cul;
-+ LOONGSON_PCI_HIT0_SEL_H = 0xfffffffful;
-+ LOONGSON_PCI_HIT1_SEL_L = 0x00000006ul; /* set this BAR as invalid */
-+ LOONGSON_PCI_HIT1_SEL_H = 0x00000000ul;
-+ LOONGSON_PCI_HIT2_SEL_L = 0x00000006ul; /* set this BAR as invalid */
-+ LOONGSON_PCI_HIT2_SEL_H = 0x00000000ul;
-+
-+ /* avoid deadlock of PCI reading/writing lock operation */
-+ LOONGSON_PCI_ISR4C = 0xd2000001ul;
-+
-+ /* can not change gnt to break pci transfer when device's gnt not
-+ deassert for some broken device */
-+ LOONGSON_PXARB_CFG = 0x00fe0105ul;
-+
-+#if defined(CONFIG_CPU_LOONGSON2F) && defined(CONFIG_64BIT)
-+ /*
-+ * set cpu addr window2 to map CPU address space to PCI address space
-+ */
-+ LOONGSON_ADDRWIN_CPUTOPCI(ADDRWIN_WIN2, LOONGSON_CPU_MEM_SRC,
-+ LOONGSON_PCI_MEM_DST, MMAP_CPUTOPCI_SIZE);
-+#endif
-+}
-+
-+static int __init pcibios_init(void)
-+{
-+ ict_pcimap();
-+
-+ loongson_pci_controller.io_map_base = mips_io_port_base;
-+
-+ register_pci_controller(&loongson_pci_controller);
-+
-+ return 0;
-+}
-+
-+arch_initcall(pcibios_init);
-diff -Nur linux-2.6.30.5.orig/arch/mips/loongson/common/reset.c linux-2.6.30.5/arch/mips/loongson/common/reset.c
---- linux-2.6.30.5.orig/arch/mips/loongson/common/reset.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.30.5/arch/mips/loongson/common/reset.c 2009-08-23 19:01:04.000000000 +0200
-@@ -0,0 +1,38 @@
-+/*
-+ * 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.
-+ *
-+ * Copyright (C) 2007 Lemote, Inc. & Institute of Computing Technology
-+ * Author: Fuxin Zhang, zhangfx@lemote.com
-+ */
-+
-+#include <linux/pm.h>
-+
-+#include <asm/reboot.h>
-+
-+#include <loongson.h>
-+
-+static void loongson_restart(char *command)
-+{
-+ /* perform board-specific pre-reboot operations */
-+ mach_prepare_reboot();
-+
-+ /* reboot via jumping to 0xbfc00000 */
-+ ((void (*)(void))ioremap_nocache(LOONGSON_BOOT_BASE, 4)) ();
-+}
-+
-+static void loongson_halt(void)
-+{
-+ mach_prepare_shutdown();
-+ while (1)
-+ ;
-+}
-+
-+void __init loongson_reboot_setup(void)
-+{
-+ _machine_restart = loongson_restart;
-+ _machine_halt = loongson_halt;
-+ pm_power_off = loongson_halt;
-+}
-diff -Nur linux-2.6.30.5.orig/arch/mips/loongson/common/rtc.c linux-2.6.30.5/arch/mips/loongson/common/rtc.c
---- linux-2.6.30.5.orig/arch/mips/loongson/common/rtc.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.30.5/arch/mips/loongson/common/rtc.c 2009-08-23 19:01:04.000000000 +0200
-@@ -0,0 +1,54 @@
-+/*
-+ * Registration of Cobalt RTC platform device.
-+ *
-+ * Copyright (C) 2007 Yoichi Yuasa <yoichi_yuasa@tripeaks.co.jp>
-+ * Copyright (C) 2009 Wu Zhangjin <wuzj@lemote.com>
-+ *
-+ * 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., 51 Franklin Street, Fifth Floor, Boston,
-+ * MA 02110-1301 USA
-+ */
-+
-+#include <linux/ioport.h>
-+#include <linux/mc146818rtc.h>
-+#include <linux/platform_device.h>
-+
-+static struct resource rtc_cmos_resource[] = {
-+ {
-+ .start = RTC_PORT(0),
-+ .end = RTC_PORT(1),
-+ .flags = IORESOURCE_IO,
-+ },
-+ {
-+ .start = RTC_IRQ,
-+ .end = RTC_IRQ,
-+ .flags = IORESOURCE_IRQ,
-+ },
-+};
-+
-+static struct platform_device rtc_cmos_device = {
-+ .name = "rtc_cmos",
-+ .id = -1,
-+ .num_resources = ARRAY_SIZE(rtc_cmos_resource),
-+ .resource = rtc_cmos_resource
-+};
-+
-+static __init int rtc_cmos_init(void)
-+{
-+ platform_device_register(&rtc_cmos_device);
-+
-+ return 0;
-+}
-+
-+device_initcall(rtc_cmos_init);
-diff -Nur linux-2.6.30.5.orig/arch/mips/loongson/common/serial.c linux-2.6.30.5/arch/mips/loongson/common/serial.c
---- linux-2.6.30.5.orig/arch/mips/loongson/common/serial.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.30.5/arch/mips/loongson/common/serial.c 2009-08-23 19:01:04.000000000 +0200
-@@ -0,0 +1,66 @@
-+/*
-+ * This file is subject to the terms and conditions of the GNU General Public
-+ * License. See the file "COPYING" in the main directory of this archive
-+ * for more details.
-+ *
-+ * Copyright (C) 2007 Ralf Baechle (ralf@linux-mips.org)
-+ *
-+ * Copyright (C) 2009 Lemote, Inc. & Institute of Computing Technology
-+ * Author: yanhua (yanhua@lemote.com)
-+ * Author: Wu Zhangjin (wuzj@lemote.com)
-+ */
-+
-+#include <linux/io.h>
-+#include <linux/init.h>
-+#include <linux/serial_8250.h>
-+
-+#include <loongson.h>
-+#include <machine.h>
-+
-+#define PORT(int, base_baud, io_type) \
-+{ \
-+ .irq = int, \
-+ .uartclk = base_baud, \
-+ .iotype = io_type, \
-+ .flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST, \
-+ .regshift = 0, \
-+}
-+
-+static struct plat_serial8250_port uart8250_data[] = {
-+ PORT(LOONGSON_UART_IRQ, LOONGSON_UART_BAUD, LOONGSON_UART_IOTYPE),
-+ {},
-+};
-+
-+static struct platform_device uart8250_device = {
-+ .name = "serial8250",
-+ .id = PLAT8250_DEV_PLATFORM,
-+ .dev = {
-+ .platform_data = uart8250_data,
-+ },
-+};
-+
-+static inline void uart8250_init(void)
-+{
-+#if (LOONGSON_UART_IOTYPE == UPIO_MEM)
-+ uart8250_data[0].membase =
-+ ioremap_nocache(LOONGSON_UART_BASE, 8);
-+#elif (LOONGSON_UART_IOTYPE == UPIO_PORT)
-+ uart8250_data[0].iobase =
-+ LOONGSON_UART_BASE - LOONGSON_PCIIO_BASE;
-+ uart8250_data[0].irq -= MIPS_CPU_IRQ_BASE;
-+#else
-+#warning currently, no such iotype of uart used in loongson-based machines
-+
-+#endif
-+}
-+
-+static int __init serial_init(void)
-+{
-+ uart8250_init();
-+
-+ platform_device_register(&uart8250_device);
-+
-+ return 0;
-+}
-+
-+device_initcall(serial_init);
-diff -Nur linux-2.6.30.5.orig/arch/mips/loongson/common/setup.c linux-2.6.30.5/arch/mips/loongson/common/setup.c
---- linux-2.6.30.5.orig/arch/mips/loongson/common/setup.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.30.5/arch/mips/loongson/common/setup.c 2009-08-23 19:01:04.000000000 +0200
-@@ -0,0 +1,74 @@
-+/*
-+ * board dependent setup routines
-+ *
-+ * Copyright (C) 2007 Lemote Inc. & Insititute of Computing Technology
-+ * Author: Fuxin Zhang, zhangfx@lemote.com
-+ *
-+ * Copyright (C) 2009 Lemote Inc. & Insititute of Computing Technology
-+ * Author: Wu Zhangjin, wuzj@lemote.com
-+ *
-+ * 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.
-+ */
-+
-+#include <linux/module.h>
-+
-+#include <asm/wbflush.h>
-+
-+#include <loongson.h>
-+
-+void (*__wbflush) (void);
-+EXPORT_SYMBOL(__wbflush);
-+
-+static void loongson_wbflush(void)
-+{
-+ asm(".set\tpush\n\t"
-+ ".set\tnoreorder\n\t"
-+ ".set mips3\n\t"
-+ "sync\n\t"
-+ "nop\n\t"
-+ ".set\tpop\n\t"
-+ ".set mips0\n\t");
-+}
-+
-+void __init loongson_wbflush_setup(void)
-+{
-+ __wbflush = loongson_wbflush;
-+}
-+
-+#if defined(CONFIG_VT) && defined(CONFIG_VGA_CONSOLE)
-+#include <linux/screen_info.h>
-+
-+void __init loongson_screeninfo_setup(void)
-+{
-+ screen_info = (struct screen_info) {
-+ 0, /* orig-x */
-+ 25, /* orig-y */
-+ 0, /* unused */
-+ 0, /* orig-video-page */
-+ 0, /* orig-video-mode */
-+ 80, /* orig-video-cols */
-+ 0, /* ega_ax */
-+ 0, /* ega_bx */
-+ 0, /* ega_cx */
-+ 25, /* orig-video-lines */
-+ VIDEO_TYPE_VGAC, /* orig-video-isVGA */
-+ 16 /* orig-video-points */
-+ };
-+}
-+#else
-+void __init loongson_screeninfo_setup(void)
-+{
-+}
-+#endif
-+
-+void __init plat_mem_setup(void)
-+{
-+ loongson_reboot_setup();
-+
-+ loongson_wbflush_setup();
-+
-+ loongson_screeninfo_setup();
-+}
-diff -Nur linux-2.6.30.5.orig/arch/mips/loongson/common/time.c linux-2.6.30.5/arch/mips/loongson/common/time.c
---- linux-2.6.30.5.orig/arch/mips/loongson/common/time.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.30.5/arch/mips/loongson/common/time.c 2009-08-23 19:01:04.000000000 +0200
-@@ -0,0 +1,34 @@
-+/*
-+ * board dependent boot routines
-+ *
-+ * Copyright (C) 2007 Lemote Inc. & Insititute of Computing Technology
-+ * Author: Fuxin Zhang, zhangfx@lemote.com
-+ *
-+ * 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.
-+ */
-+
-+#include <asm/mc146818-time.h>
-+#include <asm/time.h>
-+
-+#include <loongson.h>
-+#ifdef CONFIG_CS5536_MFGPT
-+#include <cs5536/cs5536_mfgpt.h>
-+#endif
-+
-+unsigned long read_persistent_clock(void)
-+{
-+ return mc146818_get_cmos_time();
-+}
-+
-+void __init plat_time_init(void)
-+{
-+ /* setup mips r4k timer */
-+ mips_hpt_frequency = cpu_clock_freq / 2;
-+
-+#ifdef CONFIG_CS5536_MFGPT
-+ setup_mfgpt_timer();
-+#endif
-+}
-diff -Nur linux-2.6.30.5.orig/arch/mips/loongson/fuloong-2e/irq.c linux-2.6.30.5/arch/mips/loongson/fuloong-2e/irq.c
---- linux-2.6.30.5.orig/arch/mips/loongson/fuloong-2e/irq.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.30.5/arch/mips/loongson/fuloong-2e/irq.c 2009-08-23 19:01:04.000000000 +0200
-@@ -0,0 +1,58 @@
-+/*
-+ * Copyright (C) 2007 Lemote Inc. & Insititute of Computing Technology
-+ * Author: Fuxin Zhang, zhangfx@lemote.com
-+ *
-+ * 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 SOFTWARE IS PROVIDED ``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 AUTHOR 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.
-+ *
-+ * 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.,
-+ * 675 Mass Ave, Cambridge, MA 02139, USA.
-+ *
-+ */
-+
-+#include <linux/interrupt.h>
-+
-+#include <asm/i8259.h>
-+
-+#include <loongson.h>
-+#include <machine.h>
-+
-+int mach_i8259_irq(void)
-+{
-+ return i8259_irq();
-+}
-+
-+void mach_irq_dispatch(unsigned int pending)
-+{
-+ if (pending & CAUSEF_IP7)
-+ do_IRQ(LOONGSON_TIMER_IRQ);
-+ else if (pending & CAUSEF_IP6) /* perf counter loverflow */
-+ do_IRQ(LOONGSON_PERFCNT_IRQ);
-+ else if (pending & CAUSEF_IP5)
-+ i8259_irqdispatch();
-+ else if (pending & CAUSEF_IP2)
-+ bonito_irqdispatch();
-+ else
-+ spurious_interrupt();
-+}
-+
-+void __init set_irq_trigger_mode(void)
-+{
-+ /* most bonito irq should be level triggered */
-+ LOONGSON_INTEDGE = LOONGSON_ICU_SYSTEMERR | LOONGSON_ICU_MASTERERR |
-+ LOONGSON_ICU_RETRYERR | LOONGSON_ICU_MBOXES;
-+}
-diff -Nur linux-2.6.30.5.orig/arch/mips/loongson/fuloong-2e/Makefile linux-2.6.30.5/arch/mips/loongson/fuloong-2e/Makefile
---- linux-2.6.30.5.orig/arch/mips/loongson/fuloong-2e/Makefile 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.30.5/arch/mips/loongson/fuloong-2e/Makefile 2009-08-23 19:01:04.000000000 +0200
-@@ -0,0 +1,7 @@
-+#
-+# Makefile for fuloong-2e
-+#
-+
-+obj-y += irq.o reset.o
-+
-+EXTRA_CFLAGS += -Werror
-diff -Nur linux-2.6.30.5.orig/arch/mips/loongson/fuloong-2e/reset.c linux-2.6.30.5/arch/mips/loongson/fuloong-2e/reset.c
---- linux-2.6.30.5.orig/arch/mips/loongson/fuloong-2e/reset.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.30.5/arch/mips/loongson/fuloong-2e/reset.c 2009-08-23 19:01:04.000000000 +0200
-@@ -0,0 +1,26 @@
-+/* Board-specific reboot/shutdown routines
-+ * Copyright (c) 2009 Philippe Vachon <philippe@cowpig.ca>
-+ *
-+ * Copyright (C) 2009 Lemote Inc. & Insititute of Computing Technology
-+ * Author: Wu Zhangjin, wuzj@lemote.com
-+ *
-+ * 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.
-+ */
-+
-+#include <linux/delay.h>
-+#include <linux/types.h>
-+
-+#include <loongson.h>
-+
-+void mach_prepare_reboot(void)
-+{
-+ LOONGSON_GENCFG &= ~LOONGSON_GENCFG_CPUSELFRESET;
-+ LOONGSON_GENCFG |= LOONGSON_GENCFG_CPUSELFRESET;
-+}
-+
-+void mach_prepare_shutdown(void)
-+{
-+}
-diff -Nur linux-2.6.30.5.orig/arch/mips/loongson/fuloong-2f/irq.c linux-2.6.30.5/arch/mips/loongson/fuloong-2f/irq.c
---- linux-2.6.30.5.orig/arch/mips/loongson/fuloong-2f/irq.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.30.5/arch/mips/loongson/fuloong-2f/irq.c 2009-08-23 19:01:04.000000000 +0200
-@@ -0,0 +1,53 @@
-+/*
-+ * Copyright (C) 2007 Lemote Inc. & Insititute of Computing Technology
-+ * Author: Fuxin Zhang, zhangfx@lemote.com
-+ *
-+ * 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.
-+ */
-+
-+#include <linux/interrupt.h>
-+
-+#include <loongson.h>
-+#include <machine.h>
-+
-+int mach_i8259_irq(void)
-+{
-+ int irq, isr, imr;
-+
-+ irq = -1;
-+
-+ if ((LOONGSON_INTISR & LOONGSON_INTEN) & LOONGSON_INT_BIT_INT0) {
-+ imr = inb(0x21) | (inb(0xa1) << 8);
-+ isr = inb(0x20) | (inb(0xa0) << 8);
-+ isr &= ~0x4; /* irq2 for cascade */
-+ isr &= ~imr;
-+ irq = ffs(isr) - 1;
-+ }
-+
-+ return irq;
-+}
-+
-+void mach_irq_dispatch(unsigned int pending)
-+{
-+ if (pending & CAUSEF_IP7)
-+ do_IRQ(LOONGSON_TIMER_IRQ);
-+ else if (pending & CAUSEF_IP6) {
-+ do_IRQ(LOONGSON_PERFCNT_IRQ); /* Perf counter overflow */
-+ bonito_irqdispatch(); /* North Bridge */
-+ } else if (pending & CAUSEF_IP3) /* CPU UART */
-+ do_IRQ(LOONGSON_UART_IRQ);
-+ else if (pending & CAUSEF_IP2) /* South Bridge */
-+ i8259_irqdispatch();
-+ else
-+ spurious_interrupt();
-+}
-+
-+void __init set_irq_trigger_mode(void)
-+{
-+ /* setup cs5536 as high level trigger */
-+ LOONGSON_INTPOL = LOONGSON_INT_BIT_INT0 | LOONGSON_INT_BIT_INT1;
-+ LOONGSON_INTEDGE &= ~(LOONGSON_INT_BIT_INT0 | LOONGSON_INT_BIT_INT1);
-+}
-diff -Nur linux-2.6.30.5.orig/arch/mips/loongson/fuloong-2f/Makefile linux-2.6.30.5/arch/mips/loongson/fuloong-2f/Makefile
---- linux-2.6.30.5.orig/arch/mips/loongson/fuloong-2f/Makefile 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.30.5/arch/mips/loongson/fuloong-2f/Makefile 2009-08-23 19:01:04.000000000 +0200
-@@ -0,0 +1,5 @@
-+#
-+# Makefile for fuloong-2f
-+#
-+
-+obj-y += irq.o reset.o
-diff -Nur linux-2.6.30.5.orig/arch/mips/loongson/fuloong-2f/reset.c linux-2.6.30.5/arch/mips/loongson/fuloong-2f/reset.c
---- linux-2.6.30.5.orig/arch/mips/loongson/fuloong-2f/reset.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.30.5/arch/mips/loongson/fuloong-2f/reset.c 2009-08-23 19:01:04.000000000 +0200
-@@ -0,0 +1,65 @@
-+/* Board-specific reboot/shutdown routines
-+ *
-+ * Copyright (c) 2009 Philippe Vachon <philippe@cowpig.ca>
-+ *
-+ * Copyright (C) 2009 Lemote Inc. & Insititute of Computing Technology
-+ * Author: Wu Zhangjin, wuzj@lemote.com
-+ *
-+ * 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.
-+ */
-+
-+#include <linux/io.h>
-+#include <linux/delay.h>
-+#include <linux/types.h>
-+
-+#include <loongson.h>
-+
-+/* cs5536 is the south bridge used by fuloong2f mini PC */
-+#include <cs5536/cs5536.h>
-+
-+void mach_prepare_reboot(void)
-+{
-+ /*
-+ * reset cpu to full speed, this is needed when enabling cpu frequency
-+ * scalling
-+ */
-+ LOONGSON_CHIPCFG0 |= 0x7;
-+
-+ /* send a reset signal to south bridge.
-+ *
-+ * NOTE: if enable "Power Management" in kernel, rtl8169 will not reset
-+ * normally with this reset operation and it will not work in PMON, but
-+ * you can type halt command and then reboot, seems the hardware reset
-+ * logic not work normally.
-+ */
-+ {
-+ u32 hi, lo;
-+ _rdmsr(DIVIL_MSR_REG(DIVIL_SOFT_RESET), &hi, &lo);
-+ lo |= 0x00000001;
-+ _wrmsr(DIVIL_MSR_REG(DIVIL_SOFT_RESET), hi, lo);
-+ }
-+}
-+
-+void mach_prepare_shutdown(void)
-+{
-+ u32 hi, lo, val;
-+ phys_addr_t gpio_base;
-+
-+ _rdmsr(DIVIL_MSR_REG(DIVIL_LBAR_GPIO), &hi, &lo);
-+
-+ gpio_base = mips_io_port_base | (lo & 0xff00);
-+
-+ /* make cs5536 gpio13 output enable */
-+ val = (readl((u32 *) (gpio_base + GPIOL_OUT_EN)) & ~(1 << (16 + 13)))
-+ | (1 << 13);
-+ writel(val, (u32 *) (gpio_base + GPIOL_OUT_EN));
-+ mmiowb();
-+ /* make cs5536 gpio13 output low level voltage. */
-+ val = (readl((u32 *) (gpio_base + GPIOL_OUT_VAL)) & ~(1 << (13)))
-+ | (1 << (16 + 13));
-+ writel(val, (u32 *) (gpio_base + GPIOL_OUT_VAL));
-+ mmiowb();
-+}
-diff -Nur linux-2.6.30.5.orig/arch/mips/loongson/image/cache.c linux-2.6.30.5/arch/mips/loongson/image/cache.c
---- linux-2.6.30.5.orig/arch/mips/loongson/image/cache.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.30.5/arch/mips/loongson/image/cache.c 2009-08-23 19:01:04.000000000 +0200
-@@ -0,0 +1,42 @@
-+#include <asm/addrspace.h>
-+
-+#define cache32_unroll32(base, op) \
-+ __asm__ __volatile__( \
-+ " .set push \n" \
-+ " .set noreorder \n" \
-+ " .set mips3 \n" \
-+ " cache %1, 0x000(%0); cache %1, 0x020(%0) \n" \
-+ " cache %1, 0x040(%0); cache %1, 0x060(%0) \n" \
-+ " cache %1, 0x080(%0); cache %1, 0x0a0(%0) \n" \
-+ " cache %1, 0x0c0(%0); cache %1, 0x0e0(%0) \n" \
-+ " cache %1, 0x100(%0); cache %1, 0x120(%0) \n" \
-+ " cache %1, 0x140(%0); cache %1, 0x160(%0) \n" \
-+ " cache %1, 0x180(%0); cache %1, 0x1a0(%0) \n" \
-+ " cache %1, 0x1c0(%0); cache %1, 0x1e0(%0) \n" \
-+ " cache %1, 0x200(%0); cache %1, 0x220(%0) \n" \
-+ " cache %1, 0x240(%0); cache %1, 0x260(%0) \n" \
-+ " cache %1, 0x280(%0); cache %1, 0x2a0(%0) \n" \
-+ " cache %1, 0x2c0(%0); cache %1, 0x2e0(%0) \n" \
-+ " cache %1, 0x300(%0); cache %1, 0x320(%0) \n" \
-+ " cache %1, 0x340(%0); cache %1, 0x360(%0) \n" \
-+ " cache %1, 0x380(%0); cache %1, 0x3a0(%0) \n" \
-+ " cache %1, 0x3c0(%0); cache %1, 0x3e0(%0) \n" \
-+ " .set pop \n" \
-+ : \
-+ : "r" (base), \
-+ "i" (op));
-+
-+void flush_cache_all(void)
-+{
-+ unsigned long start = CKSEG0ADDR(0x80000000);
-+ unsigned long end = start + MEM_SIZE_M * 1024 / 4;
-+ unsigned long lsize = 32;
-+ unsigned long addr;
-+
-+ int i;
-+
-+ for (i = 0; i < 4; i++) {
-+ for (addr = start; addr < end; addr += lsize * 32)
-+ cache32_unroll32(addr | i, 0x03); /* Index Writeback scache */
-+ }
-+}
-diff -Nur linux-2.6.30.5.orig/arch/mips/loongson/image/dbg.c linux-2.6.30.5/arch/mips/loongson/image/dbg.c
---- linux-2.6.30.5.orig/arch/mips/loongson/image/dbg.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.30.5/arch/mips/loongson/image/dbg.c 2009-08-23 19:01:04.000000000 +0200
-@@ -0,0 +1,61 @@
-+/* serial port debug support */
-+
-+#ifdef SERIAL_PORT_DEBUG
-+
-+#include <linux/types.h>
-+#include <linux/serial_reg.h>
-+
-+#include <asm/addrspace.h>
-+
-+#include <loongson.h>
-+#include <machine.h>
-+
-+#define UART_BASE CKSEG1ADDR(LOONGSON_UART_BASE)
-+
-+void putc(char c)
-+{
-+ int timeout;
-+ char reg;
-+
-+ reg = *((char *)(UART_BASE + UART_LSR)) & UART_LSR_THRE;
-+ for (timeout = 1024; reg == 0 && timeout > 0; timeout--)
-+ reg = (*((char *)(UART_BASE + UART_LSR))) & UART_LSR_THRE;
-+
-+ *((char *)(UART_BASE + UART_TX)) = c;
-+}
-+
-+void puts(const char *s)
-+{
-+ char c;
-+ while ((c = *s++) != '\0') {
-+ putc(c);
-+ if (c == '\n')
-+ putc('\r');
-+ }
-+}
-+
-+void puthex(unsigned long val)
-+{
-+
-+ unsigned char buf[10];
-+ int i;
-+ for (i = 7; i >= 0; i--) {
-+ buf[i] = "0123456789ABCDEF"[val & 0x0F];
-+ val >>= 4;
-+ }
-+ buf[8] = '\0';
-+ puts(buf);
-+}
-+#else
-+void putc(char c)
-+{
-+}
-+
-+void puts(const char *s)
-+{
-+}
-+
-+void puthex(unsigned long val)
-+{
-+}
-+#endif
-diff -Nur linux-2.6.30.5.orig/arch/mips/loongson/image/decompress.c linux-2.6.30.5/arch/mips/loongson/image/decompress.c
---- linux-2.6.30.5.orig/arch/mips/loongson/image/decompress.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.30.5/arch/mips/loongson/image/decompress.c 2009-08-23 19:01:04.000000000 +0200
-@@ -0,0 +1,134 @@
-+/*
-+ * Misc. bootloader code for many machines.
-+ *
-+ * Copyright 2001 MontaVista Software Inc.
-+ * Author: Matt Porter <mporter@mvista.com> Derived from
-+ * arch/ppc/boot/prep/misc.c
-+ *
-+ * Copyright (C) 2009 Lemote, Inc. & Institute of Computing Technology
-+ * Author: Wu Zhangjin <wuzj@lemote.com>
-+ *
-+ * 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.
-+ */
-+
-+#include <asm/addrspace.h>
-+#include <linux/types.h>
-+#include <linux/kernel.h>
-+
-+/* These two variables specify the free mem region
-+ * that can be used for temporary malloc area
-+ *
-+ * Here is toally 15M
-+ */
-+#define FREE_MEM_START CKSEG0ADDR(0x83000000)
-+#define FREE_MEM_END CKSEG0ADDR(0x83f00000)
-+
-+unsigned long free_mem_ptr;
-+unsigned long free_mem_end_ptr;
-+char *zimage_start;
-+
-+/* The linker tells us where the image is. */
-+extern unsigned char __image_begin, __image_end;
-+extern unsigned char __ramdisk_begin, __ramdisk_end;
-+unsigned long initrd_size;
-+
-+/* debug interface via searil port */
-+extern void puts(const char *s);
-+extern void puthex(unsigned long val);
-+void error(char *x)
-+{
-+ puts("\n\n");
-+ puts(x);
-+ puts("\n\n -- System halted");
-+
-+ while (1)
-+ ; /* Halt */
-+}
-+
-+/* cache fulshing support */
-+extern void flush_cache_all(void);
-+
-+/* gunzip declarations */
-+#define STATIC static
-+
-+#ifdef CONFIG_KERNEL_GZIP
-+#include "../../../../lib/decompress_inflate.c"
-+#elif defined(CONFIG_KERNEL_BZIP2)
-+#include "../../../../lib/decompress_bunzip2.c"
-+#elif defined(CONFIG_KERNEL_LZMA)
-+#include "../../../../lib/decompress_unlzma.c"
-+#endif
-+
-+void decompress_kernel(unsigned long load_addr, int num_words,
-+ unsigned long cksum, unsigned long *sp)
-+{
-+ extern unsigned long start;
-+ int zimage_size;
-+
-+ initrd_size = (unsigned long)(&__ramdisk_end) -
-+ (unsigned long)(&__ramdisk_begin);
-+
-+ /*
-+ * Reveal where we were loaded at and where we
-+ * were relocated to.
-+ */
-+ puts("loaded at: ");
-+ puthex(load_addr);
-+ puts(" ");
-+ puthex((unsigned long)(load_addr + (4 * num_words)));
-+ puts("\n");
-+ if ((unsigned long)load_addr != (unsigned long)&start) {
-+ puts("relocated to: ");
-+ puthex((unsigned long)&start);
-+ puts(" ");
-+ puthex((unsigned long)((unsigned long)&start +
-+ (4 * num_words)));
-+ puts("\n");
-+ }
-+
-+ /*
-+ * We link ourself to an arbitrary low address. When we run, we
-+ * relocate outself to that address. __image_beign points to
-+ * the part of the image where the zImage is. -- Tom
-+ */
-+ zimage_start = (char *)(unsigned long)(&__image_begin);
-+ zimage_size = (unsigned long)(&__image_end) -
-+ (unsigned long)(&__image_begin);
-+
-+ /*
-+ * The zImage and initrd will be between start and _end, so they've
-+ * already been moved once. We're good to go now. -- Tom
-+ */
-+ puts("zimage at: ");
-+ puthex((unsigned long)zimage_start);
-+ puts(" ");
-+ puthex((unsigned long)(zimage_size + zimage_start));
-+ puts("\n");
-+
-+ if (initrd_size) {
-+ puts("initrd at: ");
-+ puthex((unsigned long)(&__ramdisk_begin));
-+ puts(" ");
-+ puthex((unsigned long)(&__ramdisk_end));
-+ puts("\n");
-+ }
-+
-+ /* assume the chunk below 8M is free */
-+ free_mem_ptr = FREE_MEM_START;
-+ free_mem_end_ptr = FREE_MEM_END;
-+
-+ /* Display standard Linux/MIPS boot prompt for kernel args */
-+ puts("Uncompressing Linux at load address ");
-+ puthex(VMLINUX_LOAD_ADDRESS);
-+ puts("\n");
-+ /* I don't like this hard coded gunzip size (fixme) */
-+ decompress(zimage_start, zimage_size, 0, 0,
-+ (void *)VMLINUX_LOAD_ADDRESS, 0, error);
-+#if 1
-+ flush_cache_all();
-+#endif
-+ puts("Now, booting the kernel...\n");
-+}
-diff -Nur linux-2.6.30.5.orig/arch/mips/loongson/image/dummy.c linux-2.6.30.5/arch/mips/loongson/image/dummy.c
---- linux-2.6.30.5.orig/arch/mips/loongson/image/dummy.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.30.5/arch/mips/loongson/image/dummy.c 2009-08-23 19:01:04.000000000 +0200
-@@ -0,0 +1,4 @@
-+int main(void)
-+{
-+ return 0;
-+}
-diff -Nur linux-2.6.30.5.orig/arch/mips/loongson/image/head.S linux-2.6.30.5/arch/mips/loongson/image/head.S
---- linux-2.6.30.5.orig/arch/mips/loongson/image/head.S 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.30.5/arch/mips/loongson/image/head.S 2009-08-23 19:01:04.000000000 +0200
-@@ -0,0 +1,100 @@
-+/*
-+ * arch/mips/kernel/head.S
-+ *
-+ * This file is subject to the terms and conditions of the GNU General Public
-+ * License. See the file "COPYING" in the main directory of this archive
-+ * for more details.
-+ *
-+ * Copyright (C) 1994, 1995 Waldorf Electronics
-+ * Written by Ralf Baechle and Andreas Busse
-+ * Copyright (C) 1995 - 1999 Ralf Baechle
-+ * Copyright (C) 1996 Paul M. Antoine
-+ * Modified for DECStation and hence R3000 support by Paul M. Antoine
-+ * Further modifications by David S. Miller and Harald Koerfgen
-+ * Copyright (C) 1999 Silicon Graphics, Inc.
-+ *
-+ * Head.S contains the MIPS exception handler and startup code.
-+ *
-+ **************************************************************************
-+ * 9 Nov, 2000.
-+ * Added Cache Error exception handler and SBDDP EJTAG debug exception.
-+ *
-+ * Kevin Kissell, kevink@mips.com and Carsten Langgaard, carstenl@mips.com
-+ * Copyright (C) 2000 MIPS Technologies, Inc. All rights reserved.
-+ **************************************************************************
-+ */
-+#include <linux/autoconf.h>
-+#include <linux/threads.h>
-+
-+#include <asm/asm.h>
-+#include <asm/cacheops.h>
-+#include <asm/mipsregs.h>
-+#include <asm/asm-offsets.h>
-+#include <asm/cachectl.h>
-+#include <asm/regdef.h>
-+
-+#define IndexInvalidate_I 0x00
-+#define IndexWriteBack_D 0x01
-+
-+ .set noreorder
-+ .cprestore
-+ LEAF(start)
-+start:
-+ bal locate
-+ nop
-+locate:
-+ subu s8, ra, 8 /* Where we were loaded */
-+ PTR_LA sp, (.stack + 8192)
-+
-+ move s0, a0 /* Save boot rom start args */
-+ move s1, a1
-+ move s2, a2
-+ move s3, a3
-+
-+ PTR_LA a0, start /* Where we were linked to run */
-+
-+ move a1, s8
-+ PTR_LA a2, _edata
-+ subu t1, a2, a0
-+ srl t1, t1, 2
-+
-+ /* copy text section */
-+ li t0, 0
-+1: lw v0, 0(a1)
-+ nop
-+ sw v0, 0(a0)
-+ xor t0, t0, v0
-+ addu a0, 4
-+ bne a2, a0, 1b
-+ addu a1, 4
-+
-+ /* Clear BSS */
-+ PTR_LA a0, _edata
-+ PTR_LA a2, _end
-+2: sw zero, 0(a0)
-+ bne a2, a0, 2b
-+ addu a0, 4
-+
-+ move a0, s8 /* load address */
-+ move a1, t1 /* length in words */
-+ move a2, t0 /* checksum */
-+ move a3, sp
-+
-+ PTR_LA ra, 1f
-+ PTR_LA k0, decompress_kernel
-+ jr k0
-+ nop
-+1:
-+
-+ move a0, s0
-+ move a1, s1
-+ move a2, s2
-+ move a3, s3
-+ li k0, KERNEL_ENTRY
-+ jr k0
-+ nop
-+3:
-+ b 3b
-+ END(start)
-+
-+ .comm .stack,4096*2,4
-diff -Nur linux-2.6.30.5.orig/arch/mips/loongson/image/ld.script linux-2.6.30.5/arch/mips/loongson/image/ld.script
---- linux-2.6.30.5.orig/arch/mips/loongson/image/ld.script 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.30.5/arch/mips/loongson/image/ld.script 2009-08-23 19:01:04.000000000 +0200
-@@ -0,0 +1,152 @@
-+OUTPUT_ARCH(mips)
-+ENTRY(start)
-+SECTIONS
-+{
-+ /* Read-only sections, merged into text segment: */
-+ /* . = 0x81000000; */ /* 32bit */
-+ /* . = 0xffffffff81000000; */ /* 64bit */
-+ .init : { *(.init) } =0
-+ .text :
-+ {
-+ _ftext = . ;
-+ *(.text)
-+ *(.rodata)
-+ *(.rodata1)
-+ /* .gnu.warning sections are handled specially by elf32.em. */
-+ *(.gnu.warning)
-+ } =0
-+ .kstrtab : { *(.kstrtab) }
-+
-+ . = ALIGN(16); /* Exception table */
-+ __start___ex_table = .;
-+ __ex_table : { *(__ex_table) }
-+ __stop___ex_table = .;
-+
-+ __start___dbe_table = .; /* Exception table for data bus errors */
-+ __dbe_table : { *(__dbe_table) }
-+ __stop___dbe_table = .;
-+
-+ __start___ksymtab = .; /* Kernel symbol table */
-+ __ksymtab : { *(__ksymtab) }
-+ __stop___ksymtab = .;
-+
-+ _etext = .;
-+
-+ . = ALIGN(8192);
-+ .data.init_task : { *(.data.init_task) }
-+
-+ /* Startup code */
-+ . = ALIGN(4096);
-+ __init_begin = .;
-+ .text.init : { *(.text.init) }
-+ .data.init : { *(.data.init) }
-+ . = ALIGN(16);
-+ __setup_start = .;
-+ .setup.init : { *(.setup.init) }
-+ __setup_end = .;
-+ __initcall_start = .;
-+ .initcall.init : { *(.initcall.init) }
-+ __initcall_end = .;
-+ . = ALIGN(4096); /* Align double page for init_task_union */
-+ __init_end = .;
-+
-+ . = ALIGN(4096);
-+ .data.page_aligned : { *(.data.idt) }
-+
-+ . = ALIGN(32);
-+ .data.cacheline_aligned : { *(.data.cacheline_aligned) }
-+
-+ .fini : { *(.fini) } =0
-+ .reginfo : { *(.reginfo) }
-+ /* Adjust the address for the data segment. We want to adjust up to
-+ the same address within the page on the next page up. It would
-+ be more correct to do this:
-+ . = .;
-+ The current expression does not correctly handle the case of a
-+ text segment ending precisely at the end of a page; it causes the
-+ data segment to skip a page. The above expression does not have
-+ this problem, but it will currently (2/95) cause BFD to allocate
-+ a single segment, combining both text and data, for this case.
-+ This will prevent the text segment from being shared among
-+ multiple executions of the program; I think that is more
-+ important than losing a page of the virtual address space (note
-+ that no actual memory is lost; the page which is skipped can not
-+ be referenced). */
-+ . = .;
-+ .data :
-+ {
-+ _fdata = . ;
-+ *(.data)
-+
-+ /* Put the compressed image here, so bss is on the end. */
-+ __image_begin = .;
-+ *(.image)
-+ __image_end = .;
-+ /* Align the initial ramdisk image (INITRD) on page boundaries. */
-+ . = ALIGN(4096);
-+ __ramdisk_begin = .;
-+ *(.initrd)
-+ __ramdisk_end = .;
-+ . = ALIGN(4096);
-+
-+ CONSTRUCTORS
-+ }
-+ .data1 : { *(.data1) }
-+ _gp = . + 0x8000;
-+ .lit8 : { *(.lit8) }
-+ .lit4 : { *(.lit4) }
-+ .ctors : { *(.ctors) }
-+ .dtors : { *(.dtors) }
-+ .got : { *(.got.plt) *(.got) }
-+ .dynamic : { *(.dynamic) }
-+ /* We want the small data sections together, so single-instruction offsets
-+ can access them all, and initialized data all before uninitialized, so
-+ we can shorten the on-disk segment size. */
-+ .sdata : { *(.sdata) }
-+ . = ALIGN(4);
-+ _edata = .;
-+ PROVIDE (edata = .);
-+
-+ __bss_start = .;
-+ _fbss = .;
-+ .sbss : { *(.sbss) *(.scommon) }
-+ .bss :
-+ {
-+ *(.dynbss)
-+ *(.bss)
-+ *(COMMON)
-+ . = ALIGN(4);
-+ _end = . ;
-+ PROVIDE (end = .);
-+ }
-+
-+ /* Sections to be discarded */
-+ /DISCARD/ :
-+ {
-+ *(.text.exit)
-+ *(.data.exit)
-+ *(.exitcall.exit)
-+ }
-+
-+ /* This is the MIPS specific mdebug section. */
-+ .mdebug : { *(.mdebug) }
-+ /* These are needed for ELF backends which have not yet been
-+ converted to the new style linker. */
-+ .stab 0 : { *(.stab) }
-+ .stabstr 0 : { *(.stabstr) }
-+ /* DWARF debug sections.
-+ Symbols in the .debug DWARF section are relative to the beginning of the
-+ section so we begin .debug at 0. It's not clear yet what needs to happen
-+ for the others. */
-+ .debug 0 : { *(.debug) }
-+ .debug_srcinfo 0 : { *(.debug_srcinfo) }
-+ .debug_aranges 0 : { *(.debug_aranges) }
-+ .debug_pubnames 0 : { *(.debug_pubnames) }
-+ .debug_sfnames 0 : { *(.debug_sfnames) }
-+ .line 0 : { *(.line) }
-+ /* These must appear regardless of . */
-+ .gptab.sdata : { *(.gptab.data) *(.gptab.sdata) }
-+ .gptab.sbss : { *(.gptab.bss) *(.gptab.sbss) }
-+ .comment : { *(.comment) }
-+ .note : { *(.note) }
-+}
-diff -Nur linux-2.6.30.5.orig/arch/mips/loongson/image/Makefile linux-2.6.30.5/arch/mips/loongson/image/Makefile
---- linux-2.6.30.5.orig/arch/mips/loongson/image/Makefile 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.30.5/arch/mips/loongson/image/Makefile 2009-08-23 19:01:04.000000000 +0200
-@@ -0,0 +1,61 @@
-+#
-+# arch/mips/zboot/Makefile
-+#
-+# This file is subject to the terms and conditions of the GNU General Public
-+# License. See the file "COPYING" in the main directory of this archive
-+# for more details.
-+
-+# Adapted for MIPS Pete Popov, Dan Malek
-+#
-+# Copyright (C) 1994 by Linus Torvalds
-+# Adapted for PowerPC by Gary Thomas
-+# modified by Cort (cort@cs.nmt.edu)
-+#
-+# Copyright (C) 2009 Lemote Inc. & Insititute of Computing Technology
-+# Author: Wu Zhangjin <wuzj@lemote.com>
-+#
-+
-+# Assume you have at least a 256M memory, this is used in cache.c
-+KBUILD_CFLAGS := $(LINUXINCLUDE) $(KBUILD_CFLAGS) -D__KERNEL__ -DMEM_SIZE_M=256 -DSERIAL_PORT_DEBUG
-+KBUILD_AFLAGS := $(LINUXINCLUDE) $(KBUILD_AFLAGS) -D__ASSEMBLY__ \
-+ -DKERNEL_ENTRY=0x$(shell $(NM) $(objtree)/$(KBUILD_IMAGE) | grep kernel_entry | cut -f1 -d \ )
-+
-+OBJECTS := $(obj)/head.o $(obj)/decompress.o $(obj)/mem.o $(obj)/cache.o $(obj)/dbg.o
-+
-+OBJCOPYFLAGS_vmlinux.bin := $(OBJCOPYFLAGS) -O binary -R .comment -S
-+$(obj)/vmlinux.bin: $(KBUILD_IMAGE)
-+ $(call if_changed,objcopy)
-+
-+suffix_$(CONFIG_KERNEL_GZIP) = gz
-+suffix_$(CONFIG_KERNEL_BZIP2) = bz2
-+suffix_$(CONFIG_KERNEL_LZMA) = lzma
-+tool_$(CONFIG_KERNEL_GZIP) = gzip
-+tool_$(CONFIG_KERNEL_BZIP2) = bzip2
-+tool_$(CONFIG_KERNEL_LZMA) = lzma
-+$(obj)/vmlinux.$(suffix_y): $(obj)/vmlinux.bin
-+ $(call if_changed,$(tool_y))
-+
-+$(obj)/piggy.o: $(obj)/vmlinux.$(suffix_y) $(obj)/dummy.o
-+ $(Q)$(OBJCOPY) $(OBJCOPYFLAGS) \
-+ --add-section=.image=$< \
-+ --set-section-flags=.image=contents,alloc,load,readonly,data \
-+ $(obj)/dummy.o $@
-+
-+# The start address of the compressed kernel, Z_KERNEL_START > KERNEL_START + KERNEL_SIZE
-+LDFLAGS_vmlinuz := $(LDFLAGS) -Ttext 0x$(if $(CONFIG_64BIT),ffffffff,)81000000 -T
-+$(obj)/vmlinuz: $(src)/ld.script $(OBJECTS) $(obj)/piggy.o
-+ $(call if_changed,ld)
-+
-+OBJCOPYFLAGS_zImage := $(OBJCOPYFLAGS) -R .comment -R .stab -R .stabstr -R .initrd -R .sysmap
-+$(obj)/zImage: $(obj)/vmlinuz
-+ $(call if_changed,objcopy)
-+
-+zImage: $(obj)/zImage
-+ $(Q)ln -sf $< $(objtree)/vmlinuz
-+ $(Q)echo " SYMLINK $(objtree)/"vmlinuz
-+
-+clean:
-+clean-files += *.o \
-+ zImage* \
-+ vmlinu* \
-+ $(objtree)/vmlinuz
-diff -Nur linux-2.6.30.5.orig/arch/mips/loongson/image/mem.c linux-2.6.30.5/arch/mips/loongson/image/mem.c
---- linux-2.6.30.5.orig/arch/mips/loongson/image/mem.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.30.5/arch/mips/loongson/image/mem.c 2009-08-23 19:01:04.000000000 +0200
-@@ -0,0 +1,24 @@
-+/* memory opernation support */
-+
-+#include <linux/types.h>
-+
-+void *memset(void *s, int c, size_t n)
-+{
-+ int i;
-+ char *ss = s;
-+
-+ for (i = 0; i < n; i++)
-+ ss[i] = c;
-+ return s;
-+}
-+
-+void *memcpy(void *dest, const void *src, size_t n)
-+{
-+ int i;
-+ const char *s = src;
-+ char *d = dest;
-+
-+ for (i = 0; i < n; i++)
-+ d[i] = s[i];
-+ return dest;
-+}
-diff -Nur linux-2.6.30.5.orig/arch/mips/loongson/Kconfig linux-2.6.30.5/arch/mips/loongson/Kconfig
---- linux-2.6.30.5.orig/arch/mips/loongson/Kconfig 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.30.5/arch/mips/loongson/Kconfig 2009-08-23 19:01:04.000000000 +0200
-@@ -0,0 +1,136 @@
-+choice
-+ prompt "Machine Type"
-+ depends on MACH_LOONGSON
-+
-+config LEMOTE_FULOONG2E
-+ bool "Lemote Fuloong(2e) mini-PC"
-+ select ARCH_SPARSEMEM_ENABLE
-+ select CEVT_R4K
-+ select CSRC_R4K
-+ select SYS_HAS_CPU_LOONGSON2E
-+ select DMA_NONCOHERENT
-+ select BOOT_ELF32
-+ select BOARD_SCACHE
-+ select HW_HAS_PCI
-+ select I8259
-+ select ISA
-+ select IRQ_CPU
-+ select SYS_SUPPORTS_32BIT_KERNEL
-+ select SYS_SUPPORTS_64BIT_KERNEL
-+ select SYS_SUPPORTS_LITTLE_ENDIAN
-+ select SYS_SUPPORTS_HIGHMEM
-+ select SYS_HAS_EARLY_PRINTK
-+ select GENERIC_HARDIRQS_NO__DO_IRQ
-+ select GENERIC_ISA_DMA_SUPPORT_BROKEN
-+ select CPU_HAS_WB
-+ help
-+ Lemote Fuloong(2e) mini-PC board based on the Chinese Loongson-2E CPU and
-+ an FPGA northbridge
-+
-+ Lemote Fuloong(2e) mini PC have a VIA686B south bridge.
-+
-+config LEMOTE_FULOONG2F
-+ bool "Lemote Fuloong(2f) mini-PC"
-+ select ARCH_SPARSEMEM_ENABLE
-+ select CEVT_R4K if !CS5536_MFGPT
-+ select CSRC_R4K if !CS5536_MFGPT
-+ select SYS_HAS_CPU_LOONGSON2F
-+ select DMA_NONCOHERENT
-+ select BOOT_ELF32
-+ select BOARD_SCACHE
-+ select HW_HAS_PCI
-+ select I8259
-+ select ISA
-+ select IRQ_CPU
-+ select SYS_SUPPORTS_32BIT_KERNEL
-+ select SYS_SUPPORTS_64BIT_KERNEL
-+ select SYS_SUPPORTS_LITTLE_ENDIAN
-+ select SYS_SUPPORTS_HIGHMEM
-+ select SYS_HAS_EARLY_PRINTK
-+ select GENERIC_HARDIRQS_NO__DO_IRQ
-+ select GENERIC_ISA_DMA_SUPPORT_BROKEN
-+ select CPU_HAS_WB
-+ select CS5536
-+ help
-+ Lemote Fuloong(2f) mini-PC board based on the Chinese Loongson-2F
-+ CPU, which has an internal DDR and PCIX controller. the PCIX
-+ controller have the similiar programming interface of the FPGA north
-+ bridge of LOONGSON2E.
-+
-+ Lemote Fuloong(2f) mini PC have an AMD CS5536 south bridge.
-+
-+config LEMOTE_YEELOONG2F
-+ bool "Lemote Yeeloong(2f) mini Notebook"
-+ select ARCH_SPARSEMEM_ENABLE
-+ select CEVT_R4K if !CS5536_MFGPT
-+ select CSRC_R4K if !CS5536_MFGPT
-+ select SYS_HAS_CPU_LOONGSON2F
-+ select DMA_NONCOHERENT
-+ select BOOT_ELF32
-+ select BOARD_SCACHE
-+ select HW_HAS_PCI
-+ select I8259
-+ select ISA
-+ select IRQ_CPU
-+ select SYS_SUPPORTS_32BIT_KERNEL
-+ select SYS_SUPPORTS_64BIT_KERNEL
-+ select SYS_SUPPORTS_LITTLE_ENDIAN
-+ select SYS_SUPPORTS_HIGHMEM
-+ select SYS_HAS_EARLY_PRINTK
-+ select SYS_HAS_MACH_PROM_INIT_CMDLINE
-+ select GENERIC_HARDIRQS_NO__DO_IRQ
-+ select GENERIC_ISA_DMA_SUPPORT_BROKEN
-+ select EC_KB3310B if PM
-+ select CPU_HAS_WB
-+ select CS5536
-+ help
-+ Lemote Laptop based on the Chinese Loongson-2F CPU, which has an
-+ internal DDR and PCIX controller. the PCIX controller have the
-+ similiar programming interface of the FPGA north bridge of
-+ LOONGSON2E.
-+
-+ Lemote Yeeloong(2f) laptop have an AMD CS5536 south bridge and an EC
-+ controller.
-+
-+endchoice
-+
-+config CS5536
-+ bool
-+
-+config CS5536_FLASH
-+ bool
-+ depends on CS5536
-+
-+config CS5536_NOR_FLASH
-+ bool
-+ depends on CS5536_FLASH
-+
-+config CS5536_OTG
-+ bool
-+ depends on CS5536
-+
-+config CS5536_UDC
-+ bool
-+ depends on CS5536
-+
-+config SYS_HAS_MACH_PROM_INIT_CMDLINE
-+ bool
-+
-+config CS5536_MFGPT
-+ bool "Using cs5536's MFGPT as system clock"
-+ depends on CS5536
-+ help
-+ This is needed if cpufreq and oprofile is enabled in Loongson2(F)
-+ machines
-+
-+config UCA_SIZE
-+ hex "Uncache Accelerated Region size"
-+ depends on CPU_LOONGSON2F
-+ default 0x400000 if LEMOTE_YEELOONG2F
-+ default 0x2000000 if LEMOTE_FULOONG2F
-+ help
-+ Uncached Acceleration(UCA) can greatly improve video performance.
-+ Normally the Video memory can be accessed in Uncached Accelerated mode,
-+ other peripheral spaces not.
-+
-+ Specify a zeroed size to disable this feature.
-diff -Nur linux-2.6.30.5.orig/arch/mips/loongson/Makefile linux-2.6.30.5/arch/mips/loongson/Makefile
---- linux-2.6.30.5.orig/arch/mips/loongson/Makefile 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.30.5/arch/mips/loongson/Makefile 2009-08-23 19:01:04.000000000 +0200
-@@ -0,0 +1,23 @@
-+#
-+# Common code for all Loongson based systems
-+#
-+
-+obj-$(CONFIG_MACH_LOONGSON) += common/
-+
-+#
-+# Lemote Fuloong mini-PC (Loongson 2E-based)
-+#
-+
-+obj-$(CONFIG_LEMOTE_FULOONG2E) += fuloong-2e/
-+
-+#
-+# Lemote Fuloong mini-PC (Loongson 2F-based)
-+#
-+
-+obj-$(CONFIG_LEMOTE_FULOONG2F) += fuloong-2f/
-+
-+#
-+# Lemote Yeeloong mini-PC (Loongson 2F-based)
-+#
-+
-+obj-$(CONFIG_LEMOTE_YEELOONG2F) += yeeloong-2f/
-diff -Nur linux-2.6.30.5.orig/arch/mips/loongson/yeeloong-2f/init.c linux-2.6.30.5/arch/mips/loongson/yeeloong-2f/init.c
---- linux-2.6.30.5.orig/arch/mips/loongson/yeeloong-2f/init.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.30.5/arch/mips/loongson/yeeloong-2f/init.c 2009-08-23 19:01:04.000000000 +0200
-@@ -0,0 +1,80 @@
-+/*
-+ * board specific init routines
-+ *
-+ * Copyright (C) 2007 Lemote Inc. & Insititute of Computing Technology
-+ * Author: Fuxin Zhang, zhangfx@lemote.com
-+ *
-+ * Copyright (C) 2009 Lemote Inc. & Insititute of Computing Technology
-+ * Author: Wu Zhangjin, wuzj@lemote.com
-+ *
-+ * 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.
-+ */
-+
-+#include <linux/bootmem.h>
-+
-+#include <asm/bootinfo.h>
-+
-+#include <cs5536/cs5536.h>
-+
-+void __init mach_prom_init_cmdline(void)
-+{
-+ /* set lpc irq to quiet mode */
-+ _wrmsr(DIVIL_MSR_REG(DIVIL_LEG_IO), 0x00, 0x16000003);
-+
-+ /*Emulate post for usb */
-+ _wrmsr(USB_MSR_REG(USB_CONFIG), 0x4, 0xBF000);
-+
-+ if (strstr(arcs_cmdline, "no_auto_cmd") == NULL) {
-+ unsigned char default_root[50] = "/dev/sda1";
-+ char *pmon_ver, *ec_ver, *p, version[60], ec_version[64];
-+
-+ p = arcs_cmdline;
-+
-+ pmon_ver = strstr(arcs_cmdline, "PMON_VER");
-+ if (pmon_ver) {
-+ p = strstr(pmon_ver, " ");
-+ if (p)
-+ *p++ = '\0';
-+ strncpy(version, pmon_ver, 60);
-+ } else
-+ strncpy(version, "PMON_VER=Unknown", 60);
-+
-+ ec_ver = strstr(p, "EC_VER");
-+ if (ec_ver) {
-+ p = strstr(ec_ver, " ");
-+ if (p)
-+ *p = '\0';
-+ strncpy(ec_version, ec_ver, 64);
-+ } else
-+ strncpy(ec_version, "EC_VER=Unknown", 64);
-+
-+ p = strstr(arcs_cmdline, "root=");
-+ if (p) {
-+ strncpy(default_root, p, sizeof(default_root));
-+ p = strstr(default_root, " ");
-+ if (p)
-+ *p = '\0';
-+ }
-+
-+ memset(arcs_cmdline, 0, sizeof(arcs_cmdline));
-+ strcat(arcs_cmdline, version);
-+ strcat(arcs_cmdline, " ");
-+ strcat(arcs_cmdline, ec_version);
-+ strcat(arcs_cmdline, " ");
-+ strcat(arcs_cmdline, default_root);
-+ strcat(arcs_cmdline, " console=tty");
-+ }
-+
-+ /*
-+ * automatically pass the vga argument via machtype argument if
-+ * vga is not passed: yeeloong-7inch's vga mode is 800x480x24
-+ */
-+
-+ if ((strstr(arcs_cmdline, "vga") == NULL)
-+ && (strstr(arcs_cmdline, "machtype") != NULL)
-+ && (strstr(arcs_cmdline, "7inch") != NULL))
-+ strcat(arcs_cmdline, " vga=800x480x16");
-+}
-diff -Nur linux-2.6.30.5.orig/arch/mips/loongson/yeeloong-2f/irq.c linux-2.6.30.5/arch/mips/loongson/yeeloong-2f/irq.c
---- linux-2.6.30.5.orig/arch/mips/loongson/yeeloong-2f/irq.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.30.5/arch/mips/loongson/yeeloong-2f/irq.c 2009-08-23 19:01:04.000000000 +0200
-@@ -0,0 +1,53 @@
-+/*
-+ * Copyright (C) 2007 Lemote Inc. & Insititute of Computing Technology
-+ * Author: Fuxin Zhang, zhangfx@lemote.com
-+ *
-+ * 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.
-+ */
-+
-+#include <linux/interrupt.h>
-+
-+#include <loongson.h>
-+#include <machine.h>
-+
-+int mach_i8259_irq(void)
-+{
-+ int irq, isr, imr;
-+
-+ irq = -1;
-+
-+ if ((LOONGSON_INTISR & LOONGSON_INTEN) & LOONGSON_INT_BIT_INT0) {
-+ imr = inb(0x21) | (inb(0xa1) << 8);
-+ isr = inb(0x20) | (inb(0xa0) << 8);
-+ isr &= ~0x4; /* irq2 for cascade */
-+ isr &= ~imr;
-+ irq = ffs(isr) - 1;
-+ }
-+
-+ return irq;
-+}
-+
-+void mach_irq_dispatch(unsigned int pending)
-+{
-+ if (pending & CAUSEF_IP7)
-+ do_IRQ(LOONGSON_TIMER_IRQ);
-+ else if (pending & CAUSEF_IP6) {
-+ do_IRQ(LOONGSON_PERFCNT_IRQ); /* Perf counter overflow */
-+ bonito_irqdispatch(); /* North Bridge */
-+ } else if (pending & CAUSEF_IP3) /* CPU UART */
-+ do_IRQ(LOONGSON_UART_IRQ);
-+ else if (pending & CAUSEF_IP2) /* South Bridge */
-+ i8259_irqdispatch();
-+ else
-+ spurious_interrupt();
-+}
-+
-+void __init set_irq_trigger_mode(void)
-+{
-+ /* setup cs5536 as high level trigger */
-+ LOONGSON_INTPOL = LOONGSON_INT_BIT_INT0 | LOONGSON_INT_BIT_INT1;
-+ LOONGSON_INTEDGE &= ~(LOONGSON_INT_BIT_INT0 | LOONGSON_INT_BIT_INT1);
-+}
-diff -Nur linux-2.6.30.5.orig/arch/mips/loongson/yeeloong-2f/Makefile linux-2.6.30.5/arch/mips/loongson/yeeloong-2f/Makefile
---- linux-2.6.30.5.orig/arch/mips/loongson/yeeloong-2f/Makefile 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.30.5/arch/mips/loongson/yeeloong-2f/Makefile 2009-08-23 19:01:04.000000000 +0200
-@@ -0,0 +1,11 @@
-+#
-+# Makefile for fuloong-2f
-+#
-+
-+obj-y += init.o irq.o reset.o
-+
-+#
-+# Power Management Support
-+#
-+
-+obj-$(CONFIG_PM) += pm.o
-diff -Nur linux-2.6.30.5.orig/arch/mips/loongson/yeeloong-2f/pm.c linux-2.6.30.5/arch/mips/loongson/yeeloong-2f/pm.c
---- linux-2.6.30.5.orig/arch/mips/loongson/yeeloong-2f/pm.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.30.5/arch/mips/loongson/yeeloong-2f/pm.c 2009-08-23 19:01:04.000000000 +0200
-@@ -0,0 +1,321 @@
-+/*
-+ * loongson-specific STR/Standby
-+ *
-+ * Copyright (C) 2009 Lemote Inc. & Insititute of Computing Technology
-+ * Author: Wu Zhangjin <wuzj@lemote.com>
-+ *
-+ * 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.
-+ */
-+
-+#include <linux/suspend.h>
-+#include <linux/interrupt.h>
-+#include <linux/pm.h>
-+
-+#include <asm/i8259.h>
-+#include <asm/delay.h>
-+#include <asm/mipsregs.h>
-+
-+#include <loongson.h>
-+
-+#ifdef CONFIG_CS5536_MFGPT
-+#include <cs5536/cs5536_mfgpt.h>
-+#endif
-+
-+#include "../../../../drivers/platform/loongson/ec_kb3310b/ec.h"
-+#include "../../../../drivers/platform/loongson/ec_kb3310b/ec_misc_fn.h"
-+
-+/* debug functions */
-+extern void prom_printf(char *fmt, ...);
-+
-+/* i8042 keyboard operations: drivers/input/serio/i8042.c */
-+extern int i8042_enable_kbd_port(void);
-+extern void i8042_flush(void);
-+
-+static unsigned int cached_master_mask; /* i8259A */
-+static unsigned int cached_slave_mask;
-+static unsigned int cached_bonito_irq_mask; /* bonito */
-+
-+void arch_suspend_enable_irqs(void)
-+{
-+ /* enable all mips interrupts */
-+ local_irq_enable();
-+
-+ /* only enable the cached interrupts of i8259A */
-+ outb(cached_slave_mask, PIC_SLAVE_IMR);
-+ outb(cached_master_mask, PIC_MASTER_IMR);
-+
-+ /* enable all cached interrupts of bonito */
-+ LOONGSON_INTENSET = cached_bonito_irq_mask;
-+ (void)LOONGSON_INTENSET;
-+ mmiowb();
-+}
-+
-+void arch_suspend_disable_irqs(void)
-+{
-+ /* disable all mips interrupts */
-+ local_irq_disable();
-+
-+ /* disable all interrupts of i8259A */
-+ cached_slave_mask = inb(PIC_SLAVE_IMR);
-+ cached_master_mask = inb(PIC_MASTER_IMR);
-+
-+ outb(0xff, PIC_SLAVE_IMR);
-+ inb(PIC_SLAVE_IMR);
-+ outb(0xff, PIC_MASTER_IMR);
-+ inb(PIC_MASTER_IMR);
-+
-+ /* disable all interrupts of bonito */
-+ cached_bonito_irq_mask = LOONGSON_INTEN;
-+ LOONGSON_INTENCLR = 0xffff;
-+ (void)LOONGSON_INTENCLR;
-+ mmiowb();
-+}
-+
-+#define I8042_KBD_IRQ 1
-+#define SCI_IRQ_NUM 0x0A /* system control interface */
-+
-+/* i8042, sci are connnectted to i8259A */
-+static void setup_wakeup_interrupt(void)
-+{
-+ int irq_mask;
-+
-+ /* open the keyboard irq in i8259A */
-+ outb((0xff & ~(1 << I8042_KBD_IRQ)), PIC_MASTER_IMR);
-+ irq_mask = inb(PIC_MASTER_IMR);
-+ /* enable keyboard port */
-+ i8042_enable_kbd_port();
-+
-+ /* there is a need to wakeup the cpu via sci interrupt with relative
-+ * lid openning event
-+ */
-+ outb(irq_mask & ~(1 << (SCI_IRQ_NUM - 8)), PIC_MASTER_IMR);
-+ inb(PIC_MASTER_IMR);
-+ outb(0xff & ~(1 << (SCI_IRQ_NUM - 8)), PIC_SLAVE_IMR);
-+ inb(PIC_SLAVE_IMR);
-+}
-+
-+extern int ec_query_seq(unsigned char cmd);
-+extern int sci_get_event_num(void);
-+
-+static int wakeup_loongson(void)
-+{
-+ int irq;
-+
-+ /* query the interrupt number */
-+ irq = mach_i8259_irq();
-+ if (irq < 0)
-+ return 0;
-+ prom_printf("irq = %d\n", irq);
-+
-+ if (irq == I8042_KBD_IRQ)
-+ return 1;
-+ else if (irq == SCI_IRQ_NUM) {
-+ int ret, sci_event;
-+ /* query the event number */
-+ ret = ec_query_seq(CMD_GET_EVENT_NUM);
-+ if (ret < 0)
-+ return 0;
-+ sci_event = sci_get_event_num();
-+ prom_printf("sci event = %d\n", sci_event);
-+ if (sci_event < 0)
-+ return 0;
-+ if (sci_event == SCI_EVENT_NUM_LID) {
-+ int lid_status;
-+ /* check the LID status */
-+ lid_status = ec_read(REG_LID_DETECT);
-+ prom_printf("lid status = %d\n", lid_status);
-+ /* wakeup cpu when people open the LID */
-+ if (lid_status == BIT_LID_DETECT_ON)
-+ return 1;
-+ }
-+ }
-+ return 0;
-+}
-+
-+static void wait_for_wakeup_events(void)
-+{
-+wait:
-+ if (!wakeup_loongson()) {
-+ LOONGSON_CHIPCFG0 &= ~0x7;
-+ goto wait;
-+ }
-+}
-+
-+/* stop all perf counters by default
-+ * $24 is the control register of loongson perf counter
-+ */
-+static inline void stop_perf_counters(void)
-+{
-+ __write_64bit_c0_register($24, 0, 0);
-+}
-+
-+
-+static void loongson_suspend_enter(void)
-+{
-+ static unsigned int cached_cpu_freq;
-+
-+ prom_printf("suspend: try to setup the wakeup interrupt (keyboard interrupt)\n");
-+ setup_wakeup_interrupt();
-+
-+ /* stop all perf counters */
-+ stop_perf_counters();
-+
-+ cached_cpu_freq = LOONGSON_CHIPCFG0;
-+
-+ /* handle the old delayed kbd interrupt */
-+ LOONGSON_CHIPCFG0 &= ~0x7; /* Put CPU into wait mode */
-+ i8042_flush();
-+
-+ /* handle the real wakeup interrupt */
-+ LOONGSON_CHIPCFG0 &= ~0x7;
-+ mmiowb();
-+
-+ /* if the events are really what we want to wakeup cpu, wake up it,
-+ * otherwise, we Put CPU into wait mode again.
-+ */
-+ prom_printf("suspend: here we wait for several events to wake up cpu\n");
-+ wait_for_wakeup_events();
-+
-+ LOONGSON_CHIPCFG0 = cached_cpu_freq;
-+ mmiowb();
-+}
-+
-+static unsigned int cached_camera_status;
-+static unsigned int cached_mute_status;
-+
-+static void mach_suspend(void)
-+{
-+ unsigned int value;
-+
-+ /* LCD backlight off */
-+ ec_write(REG_BACKLIGHT_CTRL, BIT_BACKLIGHT_OFF);
-+
-+ /* close lcd output */
-+ outb(0x31, 0x3c4);
-+ value = inb(0x3c5);
-+ value = (value & 0xf8) | 0x02;
-+ outb(0x31, 0x3c4);
-+ outb(value, 0x3c5);
-+
-+ /* close vga output */
-+ outb(0x21, 0x3c4);
-+ value = inb(0x3c5);
-+ value |= (1 << 7);
-+ outb(0x21, 0x3c4);
-+ outb(value, 0x3c5);
-+
-+ /* poweroff three usb ports */
-+ ec_write(0xf461, 0x00);
-+ ec_write(0xf462, 0x00);
-+ ec_write(0xf463, 0x00);
-+
-+ /* poweroff camera */
-+ cached_camera_status = ec_read(REG_CAMERA_STATUS);
-+ if (cached_camera_status) {
-+ value = ec_read(REG_CAMERA_CONTROL);
-+ ec_write(REG_CAMERA_CONTROL, value | (1 << 1));
-+ }
-+
-+ /* MUTE */
-+ cached_mute_status = ec_read(REG_AUDIO_MUTE);
-+ ec_write(REG_AUDIO_MUTE, BIT_AUDIO_MUTE_ON);
-+
-+ /* minimize the speed of FAN */
-+ ec_write(0xf459, 1); /* change the fan to manual mode */
-+ ec_write(0xf4cc, 1); /* change the speed to the lowest one, not turn it off */
-+
-+#ifdef CONFIG_CS5536_MFGPT
-+ /* stop counting of cs5536 mfgpt timer */
-+ outw(inw(MFGPT0_SETUP) | (1 << 11) , MFGPT0_SETUP);
-+#endif
-+}
-+
-+static void mach_resume(void)
-+{
-+ unsigned int value;
-+
-+ /* LCD backlight on */
-+ ec_write(REG_BACKLIGHT_CTRL, BIT_BACKLIGHT_ON);
-+
-+ /* open lcd output */
-+ outb(0x31, 0x3c4);
-+ value = inb(0x3c5);
-+ value = (value & 0xf8) | 0x03;
-+ outb(0x31, 0x3c4);
-+ outb(value, 0x3c5);
-+
-+ /* open vga output */
-+ outb(0x21, 0x3c4);
-+ value = inb(0x3c5);
-+ value &= ~(1 << 7);
-+ outb(0x21, 0x3c4);
-+ outb(value, 0x3c5);
-+
-+ /* there is a need to enable the bonito interrupt here to fix the
-+ * problem of powering on usb ports */
-+ LOONGSON_INTENSET = cached_bonito_irq_mask;
-+ (void)LOONGSON_INTENSET;
-+ mmiowb();
-+ /* power on three usb ports */
-+ ec_write(0xf461, 0x01);
-+ ec_write(0xf462, 0x01);
-+ ec_write(0xf463, 0x01);
-+
-+ /* resume camera */
-+ ec_write(REG_CAMERA_CONTROL, cached_camera_status);
-+
-+ /* resume the status of mute */
-+ ec_write(REG_AUDIO_MUTE, cached_mute_status);
-+
-+ /* resume FAN */
-+ ec_write(0xf459, 0); /* change the fan to auto mode */
-+
-+#ifdef CONFIG_CS5536_MFGPT
-+ /* enable counting of cs5536 mfgpt timer */
-+ outw(inw(MFGPT0_SETUP) & ~(1 << 11) , MFGPT0_SETUP);
-+#endif
-+}
-+
-+static int loongson_pm_enter(suspend_state_t state)
-+{
-+ prom_printf("suspend: try to call mach specific suspend\n");
-+ mach_suspend();
-+
-+ prom_printf("suspend: Enter into the wait mode of loongson cpu\n");
-+ loongson_suspend_enter();
-+ prom_printf("resume: waked up from wait mode of loongson cpu\n");
-+
-+ mach_resume();
-+ prom_printf("resume: return from mach specific resume\n");
-+
-+ return 0;
-+}
-+
-+static int loongson_pm_valid_state(suspend_state_t state)
-+{
-+ switch (state) {
-+ case PM_SUSPEND_ON:
-+ case PM_SUSPEND_STANDBY:
-+ case PM_SUSPEND_MEM:
-+ return 1;
-+
-+ default:
-+ return 0;
-+ }
-+}
-+
-+static struct platform_suspend_ops loongson_pm_ops = {
-+ .valid = loongson_pm_valid_state,
-+ .enter = loongson_pm_enter,
-+};
-+
-+static int __init loongson_pm_init(void)
-+{
-+ suspend_set_ops(&loongson_pm_ops);
-+
-+ return 0;
-+}
-+arch_initcall(loongson_pm_init);
-diff -Nur linux-2.6.30.5.orig/arch/mips/loongson/yeeloong-2f/reset.c linux-2.6.30.5/arch/mips/loongson/yeeloong-2f/reset.c
---- linux-2.6.30.5.orig/arch/mips/loongson/yeeloong-2f/reset.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.30.5/arch/mips/loongson/yeeloong-2f/reset.c 2009-08-23 19:01:04.000000000 +0200
-@@ -0,0 +1,91 @@
-+/* Board-specific reboot/shutdown routines
-+ * Copyright (c) 2009 Philippe Vachon <philippe@cowpig.ca>
-+ *
-+ * Copyright (C) 2009 Lemote Inc. & Insititute of Computing Technology
-+ * Author: Wu Zhangjin, wuzj@lemote.com
-+ *
-+ * 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.
-+ */
-+
-+#include <linux/types.h>
-+#include <asm/bootinfo.h>
-+
-+#include <loongson.h>
-+#include <machine.h>
-+
-+/*
-+ * The following registers are determined by the EC index configuration.
-+ * 1, fill the PORT_HIGH as EC register high part.
-+ * 2, fill the PORT_LOW as EC register low part.
-+ * 3, fill the PORT_DATA as EC register write data or get the data from it.
-+ */
-+#define EC_RESET_IO_PORT_HIGH 0x0381
-+#define EC_RESET_IO_PORT_LOW 0x0382
-+#define EC_RESET_IO_PORT_DATA 0x0383
-+#define REG_RESET_HIGH 0xF4 /* reset the machine auto-clear : rd/wr */
-+#define REG_RESET_LOW 0xEC
-+#define BIT_RESET_ON (1 << 0)
-+
-+/* 7inch yeeloong have the different shutdown hardware logic from 8.9inch */
-+#define EC_SHUTDOWN_IO_PORT_HIGH 0xff2d
-+#define EC_SHUTDOWN_IO_PORT_LOW 0xff2e
-+#define EC_SHUTDOWN_IO_PORT_DATA 0xff2f
-+#define REG_SHUTDOWN_HIGH 0xFC
-+#define REG_SHUTDOWN_LOW 0x29
-+#define BIT_SHUTDOWN_ON (1 << 1)
-+
-+void mach_prepare_reboot(void)
-+{
-+ /*
-+ * reset cpu to full speed, this is needed when enabling cpu frequency
-+ * scalling
-+ */
-+ LOONGSON_CHIPCFG0 |= 0x7;
-+
-+ /* sending an reset signal to EC(embedded controller) */
-+ writeb(REG_RESET_HIGH,
-+ (u8 *) (mips_io_port_base + EC_RESET_IO_PORT_HIGH));
-+ writeb(REG_RESET_LOW,
-+ (u8 *) (mips_io_port_base + EC_RESET_IO_PORT_LOW));
-+ mmiowb();
-+ writeb(BIT_RESET_ON,
-+ (u8 *) (mips_io_port_base + EC_RESET_IO_PORT_DATA));
-+ mmiowb();
-+}
-+
-+void mach_prepare_shutdown(void)
-+{
-+ const char *system_type = get_system_type();
-+
-+ if (strstr(system_type, "8.9inch") != NULL) {
-+ /* cpu-gpio0 output low */
-+ LOONGSON_GPIODATA &= ~0x00000001;
-+ /* cpu-gpio0 as output */
-+ LOONGSON_GPIOIE &= ~0x00000001;
-+ } else if (strstr(system_type, "7inch") != NULL) {
-+ u8 val;
-+ u64 i;
-+
-+ writeb(REG_SHUTDOWN_HIGH,
-+ (u8 *) (mips_io_port_base + EC_SHUTDOWN_IO_PORT_HIGH));
-+ writeb(REG_SHUTDOWN_LOW,
-+ (u8 *) (mips_io_port_base + EC_SHUTDOWN_IO_PORT_LOW));
-+ mmiowb();
-+ val =
-+ readb((u8 *) (mips_io_port_base +
-+ EC_SHUTDOWN_IO_PORT_DATA));
-+ writeb(val & (~BIT_SHUTDOWN_ON),
-+ (u8 *) (mips_io_port_base + EC_SHUTDOWN_IO_PORT_DATA));
-+ mmiowb();
-+ /* need enough wait here... how many microseconds needs? */
-+ for (i = 0; i < 0x10000; i++)
-+ delay();
-+ writeb(val | BIT_SHUTDOWN_ON,
-+ (u8 *) (mips_io_port_base + EC_SHUTDOWN_IO_PORT_DATA));
-+ mmiowb();
-+ } else
-+ printk(KERN_INFO "you can shutdown the power safely now!\n");
-+}
-diff -Nur linux-2.6.30.5.orig/arch/mips/Makefile linux-2.6.30.5/arch/mips/Makefile
---- linux-2.6.30.5.orig/arch/mips/Makefile 2009-08-16 23:19:38.000000000 +0200
-+++ linux-2.6.30.5/arch/mips/Makefile 2009-08-23 20:58:41.000000000 +0200
-@@ -120,7 +120,14 @@
- cflags-$(CONFIG_CPU_VR41XX) += -march=r4100 -Wa,--trap
- cflags-$(CONFIG_CPU_R4X00) += -march=r4600 -Wa,--trap
- cflags-$(CONFIG_CPU_TX49XX) += -march=r4600 -Wa,--trap
--cflags-$(CONFIG_CPU_LOONGSON2) += -march=r4600 -Wa,--trap
-+
-+# only gcc >= 4.4 have the loongson-specific support
-+cflags-$(CONFIG_CPU_LOONGSON2) += -Wa,--trap
-+cflags-$(CONFIG_CPU_LOONGSON2E) += \
-+ $(call cc-option,-march=loongson2e,-march=r4600)
-+cflags-$(CONFIG_CPU_LOONGSON2F) += \
-+ $(call cc-option,-march=loongson2f,-march=r4600)
-+
- cflags-$(CONFIG_CPU_MIPS32_R1) += $(call cc-option,-march=mips32,-mips32 -U_MIPS_ISA -D_MIPS_ISA=_MIPS_ISA_MIPS32) \
- -Wa,-mips32 -Wa,--trap
- cflags-$(CONFIG_CPU_MIPS32_R2) += $(call cc-option,-march=mips32r2,-mips32r2 -U_MIPS_ISA -D_MIPS_ISA=_MIPS_ISA_MIPS32) \
-@@ -305,11 +312,15 @@
- load-$(CONFIG_WR_PPMC) += 0xffffffff80100000
-
- #
--# lemote fulong mini-PC board
-+# loongson family machines
- #
--core-$(CONFIG_LEMOTE_FULONG) +=arch/mips/lemote/lm2e/
--load-$(CONFIG_LEMOTE_FULONG) +=0xffffffff80100000
--cflags-$(CONFIG_LEMOTE_FULONG) += -I$(srctree)/arch/mips/include/asm/mach-lemote
-+all-$(CONFIG_MACH_LOONGSON) += zImage
-+core-$(CONFIG_MACH_LOONGSON) +=arch/mips/loongson/
-+cflags-$(CONFIG_MACH_LOONGSON) += -I$(srctree)/arch/mips/include/asm/mach-loongson \
-+ -mno-branch-likely
-+load-$(CONFIG_LEMOTE_FULOONG2E) +=0xffffffff80100000
-+load-$(CONFIG_LEMOTE_FULOONG2F) +=0xffffffff80200000
-+load-$(CONFIG_LEMOTE_YEELOONG2F) +=0xffffffff80200000
-
- #
- # MIPS Malta board
-@@ -675,11 +686,19 @@
-
- drivers-$(CONFIG_OPROFILE) += arch/mips/oprofile/
-
-+# suspend and hibernation support
-+drivers-$(CONFIG_PM) += arch/mips/power/
-+
- ifdef CONFIG_LASAT
- rom.bin rom.sw: vmlinux
- $(Q)$(MAKE) $(build)=arch/mips/lasat/image $@
- endif
-
-+ifdef CONFIG_MACH_LOONGSON
-+zImage: vmlinux
-+ $(Q)$(MAKE) $(build)=arch/mips/loongson/image $@
-+endif
-+
- #
- # Some machines like the Indy need 32-bit ELF binaries for booting purposes.
- # Other need ECOFF, so we build a 32-bit ELF binary for them which we then
-@@ -728,6 +747,7 @@
-
- archclean:
- @$(MAKE) $(clean)=arch/mips/boot
-+ @$(MAKE) $(clean)=arch/mips/loongson/image
- @$(MAKE) $(clean)=arch/mips/lasat
-
- define archhelp
-diff -Nur linux-2.6.30.5.orig/arch/mips/mm/uasm.c linux-2.6.30.5/arch/mips/mm/uasm.c
---- linux-2.6.30.5.orig/arch/mips/mm/uasm.c 2009-08-16 23:19:38.000000000 +0200
-+++ linux-2.6.30.5/arch/mips/mm/uasm.c 2009-08-23 19:01:04.000000000 +0200
-@@ -15,6 +15,7 @@
- #include <linux/kernel.h>
- #include <linux/types.h>
- #include <linux/init.h>
-+#include <linux/string.h>
-
- #include <asm/inst.h>
- #include <asm/elf.h>
-diff -Nur linux-2.6.30.5.orig/arch/mips/oprofile/common.c linux-2.6.30.5/arch/mips/oprofile/common.c
---- linux-2.6.30.5.orig/arch/mips/oprofile/common.c 2009-08-16 23:19:38.000000000 +0200
-+++ linux-2.6.30.5/arch/mips/oprofile/common.c 2009-08-23 19:01:04.000000000 +0200
-@@ -16,6 +16,7 @@
-
- extern struct op_mips_model op_model_mipsxx_ops __attribute__((weak));
- extern struct op_mips_model op_model_rm9000_ops __attribute__((weak));
-+extern struct op_mips_model op_model_loongson2_ops __attribute__((weak));
-
- static struct op_mips_model *model;
-
-@@ -93,6 +94,10 @@
- case CPU_RM9000:
- lmodel = &op_model_rm9000_ops;
- break;
-+
-+ case CPU_LOONGSON2:
-+ lmodel = &op_model_loongson2_ops;
-+ break;
- };
-
- if (!lmodel)
-diff -Nur linux-2.6.30.5.orig/arch/mips/oprofile/Makefile linux-2.6.30.5/arch/mips/oprofile/Makefile
---- linux-2.6.30.5.orig/arch/mips/oprofile/Makefile 2009-08-16 23:19:38.000000000 +0200
-+++ linux-2.6.30.5/arch/mips/oprofile/Makefile 2009-08-23 19:01:04.000000000 +0200
-@@ -15,3 +15,4 @@
- oprofile-$(CONFIG_CPU_R10000) += op_model_mipsxx.o
- oprofile-$(CONFIG_CPU_SB1) += op_model_mipsxx.o
- oprofile-$(CONFIG_CPU_RM9000) += op_model_rm9000.o
-+oprofile-$(CONFIG_CPU_LOONGSON2) += op_model_loongson2.o
-diff -Nur linux-2.6.30.5.orig/arch/mips/oprofile/op_model_loongson2.c linux-2.6.30.5/arch/mips/oprofile/op_model_loongson2.c
---- linux-2.6.30.5.orig/arch/mips/oprofile/op_model_loongson2.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.30.5/arch/mips/oprofile/op_model_loongson2.c 2009-08-23 19:01:04.000000000 +0200
-@@ -0,0 +1,186 @@
-+/*
-+ * Loongson2 performance counter driver for oprofile
-+ *
-+ * Copyright (C) 2009 Lemote Inc. & Insititute of Computing Technology
-+ * Author: Yanhua <yanh@lemote.com>
-+ *
-+ * This file is subject to the terms and conditions of the GNU General Public
-+ * License. See the file "COPYING" in the main directory of this archive
-+ * for more details.
-+ *
-+ */
-+#include <linux/init.h>
-+#include <linux/oprofile.h>
-+#include <linux/interrupt.h>
-+#include <linux/smp.h>
-+#include <linux/spinlock.h>
-+#include <linux/proc_fs.h>
-+#include <linux/uaccess.h>
-+
-+#include <irq.h>
-+#include <loongson.h> /* LOONGSON_PERFCNT_IRQ */
-+#include "op_impl.h"
-+
-+/*
-+ * a patch should be sent to oprofile with the loongson-specific support.
-+ * otherwise, the oprofile tool will not recognize this and complain about
-+ * "cpu_type 'unset' is not valid".
-+ */
-+#define LOONGSON_CPU_TYPE "mips/loongson2"
-+
-+#define LOONGSON_COUNTER1_EVENT(event) ((event & 0x0f) << 5)
-+#define LOONGSON_COUNTER2_EVENT(event) ((event & 0x0f) << 9)
-+
-+#define LOONGSON_PERFCNT_EXL (1UL << 0)
-+#define LOONGSON_PERFCNT_KERNEL (1UL << 1)
-+#define LOONGSON_PERFCNT_SUPERVISOR (1UL << 2)
-+#define LOONGSON_PERFCNT_USER (1UL << 3)
-+#define LOONGSON_PERFCNT_INT_EN (1UL << 4)
-+#define LOONGSON_PERFCNT_OVERFLOW (1ULL << 31)
-+
-+/* Loongson2 performance counter register */
-+#define read_c0_perflo() __read_64bit_c0_register($24, 0)
-+#define write_c0_perflo(val) __write_64bit_c0_register($24, 0, val)
-+#define read_c0_perfhi() __read_64bit_c0_register($25, 0)
-+#define write_c0_perfhi(val) __write_64bit_c0_register($25, 0, val)
-+
-+static struct loongson2_register_config {
-+ unsigned int ctrl;
-+ unsigned long long reset_counter1;
-+ unsigned long long reset_counter2;
-+ int cnt1_enable, cnt2_enable;
-+} reg;
-+
-+DEFINE_SPINLOCK(sample_lock);
-+
-+static char *oprofid = "LoongsonPerf";
-+static irqreturn_t loongson2_perfcount_handler(int irq, void *dev_id);
-+/* Compute all of the registers in preparation for enabling profiling. */
-+
-+static void loongson2_reg_setup(struct op_counter_config *cfg)
-+{
-+ unsigned int ctrl = 0;
-+
-+ reg.reset_counter1 = 0;
-+ reg.reset_counter2 = 0;
-+ /* Compute the performance counter ctrl word. */
-+ /* For now count kernel and user mode */
-+ if (cfg[0].enabled) {
-+ ctrl |= LOONGSON_COUNTER1_EVENT(cfg[0].event) |
-+ LOONGSON_PERFCNT_INT_EN;
-+ if (cfg[0].kernel)
-+ ctrl |= LOONGSON_PERFCNT_KERNEL;
-+ if (cfg[0].user)
-+ ctrl |= LOONGSON_PERFCNT_USER;
-+ reg.reset_counter1 = 0x80000000ULL - cfg[0].count;
-+ }
-+
-+ if (cfg[1].enabled) {
-+ ctrl |= LOONGSON_COUNTER2_EVENT(cfg[1].event) |
-+ LOONGSON_PERFCNT_INT_EN;
-+ if (cfg[1].kernel)
-+ ctrl |= LOONGSON_PERFCNT_KERNEL;
-+ if (cfg[1].user)
-+ ctrl |= LOONGSON_PERFCNT_USER;
-+ reg.reset_counter2 = (0x80000000ULL - cfg[1].count);
-+ }
-+
-+ if (cfg[0].enabled || cfg[1].enabled)
-+ ctrl |= LOONGSON_PERFCNT_EXL;
-+
-+ reg.ctrl = ctrl;
-+
-+ reg.cnt1_enable = cfg[0].enabled;
-+ reg.cnt2_enable = cfg[1].enabled;
-+
-+}
-+
-+/* Program all of the registers in preparation for enabling profiling. */
-+
-+static void loongson2_cpu_setup(void *args)
-+{
-+ uint64_t perfcount;
-+
-+ perfcount = (reg.reset_counter2 << 32) | reg.reset_counter1;
-+ write_c0_perfhi(perfcount);
-+}
-+
-+static void loongson2_cpu_start(void *args)
-+{
-+ /* Start all counters on current CPU */
-+ if (reg.cnt1_enable || reg.cnt2_enable)
-+ write_c0_perflo(reg.ctrl);
-+}
-+
-+static void loongson2_cpu_stop(void *args)
-+{
-+ /* Stop all counters on current CPU */
-+ write_c0_perflo(0);
-+ memset(&reg, 0, sizeof(reg));
-+}
-+
-+static irqreturn_t loongson2_perfcount_handler(int irq, void *dev_id)
-+{
-+ uint64_t counter, counter1, counter2;
-+ struct pt_regs *regs = get_irq_regs();
-+ int enabled;
-+ unsigned long flags;
-+
-+ /*
-+ * LOONGSON2 defines two 32-bit performance counters.
-+ * To avoid a race updating the registers we need to stop the counters
-+ * while we're messing with
-+ * them ...
-+ */
-+
-+ /* Check whether the irq belongs to me */
-+ enabled = reg.cnt1_enable | reg.cnt2_enable;
-+ if (!enabled)
-+ return IRQ_NONE;
-+
-+ counter = read_c0_perfhi();
-+ counter1 = counter & 0xffffffff;
-+ counter2 = counter >> 32;
-+
-+ spin_lock_irqsave(&sample_lock, flags);
-+
-+ if (counter1 & LOONGSON_PERFCNT_OVERFLOW) {
-+ if (reg.cnt1_enable)
-+ oprofile_add_sample(regs, 0);
-+ counter1 = reg.reset_counter1;
-+ }
-+ if (counter2 & LOONGSON_PERFCNT_OVERFLOW) {
-+ if (reg.cnt2_enable)
-+ oprofile_add_sample(regs, 1);
-+ counter2 = reg.reset_counter2;
-+ }
-+
-+ spin_unlock_irqrestore(&sample_lock, flags);
-+
-+ write_c0_perfhi((counter2 << 32) | counter1);
-+
-+ return IRQ_HANDLED;
-+}
-+
-+static int __init loongson2_init(void)
-+{
-+ return request_irq(LOONGSON_PERFCNT_IRQ, loongson2_perfcount_handler,
-+ IRQF_SHARED, "Perfcounter", oprofid);
-+}
-+
-+static void loongson2_exit(void)
-+{
-+ write_c0_perflo(0);
-+ free_irq(LOONGSON_PERFCNT_IRQ, oprofid);
-+}
-+
-+struct op_mips_model op_model_loongson2_ops = {
-+ .reg_setup = loongson2_reg_setup,
-+ .cpu_setup = loongson2_cpu_setup,
-+ .init = loongson2_init,
-+ .exit = loongson2_exit,
-+ .cpu_start = loongson2_cpu_start,
-+ .cpu_stop = loongson2_cpu_stop,
-+ .cpu_type = LOONGSON_CPU_TYPE,
-+ .num_counters = 2
-+};
-diff -Nur linux-2.6.30.5.orig/arch/mips/pci/fixup-fuloong2e.c linux-2.6.30.5/arch/mips/pci/fixup-fuloong2e.c
---- linux-2.6.30.5.orig/arch/mips/pci/fixup-fuloong2e.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.30.5/arch/mips/pci/fixup-fuloong2e.c 2009-08-23 19:01:04.000000000 +0200
-@@ -0,0 +1,243 @@
-+/*
-+ * fixup-fuloong2e.c
-+ *
-+ * Copyright (C) 2004 ICT CAS
-+ * Author: Li xiaoyu, ICT CAS
-+ * lixy@ict.ac.cn
-+ *
-+ * Copyright (C) 2007 Lemote, Inc. & Institute of Computing Technology
-+ * Author: Fuxin Zhang, zhangfx@lemote.com
-+ *
-+ * 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 SOFTWARE IS PROVIDED ``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 AUTHOR 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.
-+ *
-+ * 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.,
-+ * 675 Mass Ave, Cambridge, MA 02139, USA.
-+ *
-+ */
-+#include <linux/init.h>
-+#include <linux/pci.h>
-+
-+#include <loongson.h>
-+
-+/* South bridge slot number is set by the pci probe process */
-+static u8 sb_slot = 5;
-+
-+int __init pcibios_map_irq(struct pci_dev *dev, u8 slot, u8 pin)
-+{
-+ int irq = 0;
-+
-+ if (slot == sb_slot) {
-+ switch (PCI_FUNC(dev->devfn)) {
-+ case 2:
-+ irq = 10;
-+ break;
-+ case 3:
-+ irq = 11;
-+ break;
-+ case 5:
-+ irq = 9;
-+ break;
-+ }
-+ } else {
-+ irq = LOONGSON_IRQ_BASE + 25 + pin;
-+ }
-+ return irq;
-+
-+}
-+
-+/* Do platform specific device initialization at pci_enable_device() time */
-+int pcibios_plat_dev_init(struct pci_dev *dev)
-+{
-+ return 0;
-+}
-+
-+static void __init fuloong2e_nec_fixup(struct pci_dev *pdev)
-+{
-+ unsigned int val;
-+
-+ /* Configues port 1, 2, 3, 4 to be validate*/
-+ pci_read_config_dword(pdev, 0xe0, &val);
-+ pci_write_config_dword(pdev, 0xe0, (val & ~7) | 0x4);
-+
-+ /* System clock is 48-MHz Oscillator. */
-+ pci_write_config_dword(pdev, 0xe4, 1 << 5);
-+}
-+
-+static void __init fuloong2e_686b_func0_fixup(struct pci_dev *pdev)
-+{
-+ unsigned char c;
-+
-+ sb_slot = PCI_SLOT(pdev->devfn);
-+
-+ printk(KERN_INFO "via686b fix: ISA bridge\n");
-+
-+ /* Enable I/O Recovery time */
-+ pci_write_config_byte(pdev, 0x40, 0x08);
-+
-+ /* Enable ISA refresh */
-+ pci_write_config_byte(pdev, 0x41, 0x01);
-+
-+ /* disable ISA line buffer */
-+ pci_write_config_byte(pdev, 0x45, 0x00);
-+
-+ /* Gate INTR, and flush line buffer */
-+ pci_write_config_byte(pdev, 0x46, 0xe0);
-+
-+ /* Disable PCI Delay Transaction, Enable EISA ports 4D0/4D1. */
-+ /* pci_write_config_byte(pdev, 0x47, 0x20); */
-+
-+ /*
-+ * enable PCI Delay Transaction, Enable EISA ports 4D0/4D1.
-+ * enable time-out timer
-+ */
-+ pci_write_config_byte(pdev, 0x47, 0xe6);
-+
-+ /*
-+ * enable level trigger on pci irqs: 9,10,11,13
-+ * important! without this PCI interrupts won't work
-+ */
-+ outb(0x2e, 0x4d1);
-+
-+ /* 512 K PCI Decode */
-+ pci_write_config_byte(pdev, 0x48, 0x01);
-+
-+ /* Wait for PGNT before grant to ISA Master/DMA */
-+ pci_write_config_byte(pdev, 0x4a, 0x84);
-+
-+ /*
-+ * Plug'n'Play
-+ *
-+ * Parallel DRQ 3, Floppy DRQ 2 (default)
-+ */
-+ pci_write_config_byte(pdev, 0x50, 0x0e);
-+
-+ /*
-+ * IRQ Routing for Floppy and Parallel port
-+ *
-+ * IRQ 6 for floppy, IRQ 7 for parallel port
-+ */
-+ pci_write_config_byte(pdev, 0x51, 0x76);
-+
-+ /* IRQ Routing for serial ports (take IRQ 3 and 4) */
-+ pci_write_config_byte(pdev, 0x52, 0x34);
-+
-+ /* All IRQ's level triggered. */
-+ pci_write_config_byte(pdev, 0x54, 0x00);
-+
-+ /* route PIRQA-D irq */
-+ pci_write_config_byte(pdev, 0x55, 0x90); /* bit 7-4, PIRQA */
-+ pci_write_config_byte(pdev, 0x56, 0xba); /* bit 7-4, PIRQC; */
-+ /* 3-0, PIRQB */
-+ pci_write_config_byte(pdev, 0x57, 0xd0); /* bit 7-4, PIRQD */
-+
-+ /* enable function 5/6, audio/modem */
-+ pci_read_config_byte(pdev, 0x85, &c);
-+ c &= ~(0x3 << 2);
-+ pci_write_config_byte(pdev, 0x85, c);
-+
-+ printk(KERN_INFO"via686b fix: ISA bridge done\n");
-+}
-+
-+static void __init fuloong2e_686b_func1_fixup(struct pci_dev *pdev)
-+{
-+ printk(KERN_INFO"via686b fix: IDE\n");
-+
-+ /* Modify IDE controller setup */
-+ pci_write_config_byte(pdev, PCI_LATENCY_TIMER, 48);
-+ pci_write_config_byte(pdev, PCI_COMMAND,
-+ PCI_COMMAND_IO | PCI_COMMAND_MEMORY |
-+ PCI_COMMAND_MASTER);
-+ pci_write_config_byte(pdev, 0x40, 0x0b);
-+ /* legacy mode */
-+ pci_write_config_byte(pdev, 0x42, 0x09);
-+
-+#if 1/* play safe, otherwise we may see notebook's usb keyboard lockup */
-+ /* disable read prefetch/write post buffers */
-+ pci_write_config_byte(pdev, 0x41, 0x02);
-+
-+ /* use 3/4 as fifo thresh hold */
-+ pci_write_config_byte(pdev, 0x43, 0x0a);
-+ pci_write_config_byte(pdev, 0x44, 0x00);
-+
-+ pci_write_config_byte(pdev, 0x45, 0x00);
-+#else
-+ pci_write_config_byte(pdev, 0x41, 0xc2);
-+ pci_write_config_byte(pdev, 0x43, 0x35);
-+ pci_write_config_byte(pdev, 0x44, 0x1c);
-+
-+ pci_write_config_byte(pdev, 0x45, 0x10);
-+#endif
-+
-+ printk(KERN_INFO"via686b fix: IDE done\n");
-+}
-+
-+static void __init fuloong2e_686b_func2_fixup(struct pci_dev *pdev)
-+{
-+ /* irq routing */
-+ pci_write_config_byte(pdev, PCI_INTERRUPT_LINE, 10);
-+}
-+
-+static void __init fuloong2e_686b_func3_fixup(struct pci_dev *pdev)
-+{
-+ /* irq routing */
-+ pci_write_config_byte(pdev, PCI_INTERRUPT_LINE, 11);
-+}
-+
-+static void __init fuloong2e_686b_func5_fixup(struct pci_dev *pdev)
-+{
-+ unsigned int val;
-+ unsigned char c;
-+
-+ /* enable IO */
-+ pci_write_config_byte(pdev, PCI_COMMAND,
-+ PCI_COMMAND_IO | PCI_COMMAND_MEMORY |
-+ PCI_COMMAND_MASTER);
-+ pci_read_config_dword(pdev, 0x4, &val);
-+ pci_write_config_dword(pdev, 0x4, val | 1);
-+
-+ /* route ac97 IRQ */
-+ pci_write_config_byte(pdev, 0x3c, 9);
-+
-+ pci_read_config_byte(pdev, 0x8, &c);
-+
-+ /* link control: enable link & SGD PCM output */
-+ pci_write_config_byte(pdev, 0x41, 0xcc);
-+
-+ /* disable game port, FM, midi, sb, enable write to reg2c-2f */
-+ pci_write_config_byte(pdev, 0x42, 0x20);
-+
-+ /* we are using Avance logic codec */
-+ pci_write_config_word(pdev, 0x2c, 0x1005);
-+ pci_write_config_word(pdev, 0x2e, 0x4710);
-+ pci_read_config_dword(pdev, 0x2c, &val);
-+
-+ pci_write_config_byte(pdev, 0x42, 0x0);
-+}
-+
-+DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C686,
-+ fuloong2e_686b_func0_fixup);
-+DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C586_1,
-+ fuloong2e_686b_func1_fixup);
-+DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C586_2,
-+ fuloong2e_686b_func2_fixup);
-+DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C586_3,
-+ fuloong2e_686b_func3_fixup);
-+DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C686_5,
-+ fuloong2e_686b_func5_fixup);
-+DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_NEC, PCI_DEVICE_ID_NEC_USB,
-+ fuloong2e_nec_fixup);
-diff -Nur linux-2.6.30.5.orig/arch/mips/pci/fixup-lemote2f.c linux-2.6.30.5/arch/mips/pci/fixup-lemote2f.c
---- linux-2.6.30.5.orig/arch/mips/pci/fixup-lemote2f.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.30.5/arch/mips/pci/fixup-lemote2f.c 2009-08-23 19:01:04.000000000 +0200
-@@ -0,0 +1,171 @@
-+/*
-+ * Copyright (C) 2008 Lemote Technology
-+ * Copyright (C) 2004 ICT CAS
-+ * Author: Li xiaoyu, lixy@ict.ac.cn
-+ *
-+ * Copyright (C) 2007 Lemote, Inc. & Institute of Computing Technology
-+ * Author: Fuxin Zhang, zhangfx@lemote.com
-+ *
-+ * 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.
-+ */
-+#include <linux/init.h>
-+#include <linux/pci.h>
-+
-+#include <loongson.h>
-+#include <cs5536/cs5536.h>
-+#include <cs5536/cs5536_pci.h>
-+
-+/* PCI interrupt pins
-+ *
-+ * These should not be changed, or you should consider loongson2f interrupt
-+ * register and your pci card dispatch
-+ */
-+
-+#define PCIA 4
-+#define PCIB 5
-+#define PCIC 6
-+#define PCID 7
-+
-+/* all the pci device has the PCIA pin, check the datasheet. */
-+static char irq_tab[][5] __initdata = {
-+ /* INTA INTB INTC INTD */
-+ {0, 0, 0, 0, 0}, /* 11: Unused */
-+ {0, 0, 0, 0, 0}, /* 12: Unused */
-+ {0, 0, 0, 0, 0}, /* 13: Unused */
-+ {0, 0, 0, 0, 0}, /* 14: Unused */
-+ {0, 0, 0, 0, 0}, /* 15: Unused */
-+ {0, 0, 0, 0, 0}, /* 16: Unused */
-+ {0, PCIA, 0, 0, 0}, /* 17: RTL8110-0 */
-+ {0, PCIB, 0, 0, 0}, /* 18: RTL8110-1 */
-+ {0, PCIC, 0, 0, 0}, /* 19: SiI3114 */
-+ {0, PCID, 0, 0, 0}, /* 20: 3-ports nec usb */
-+ {0, PCIA, PCIB, PCIC, PCID}, /* 21: PCI-SLOT */
-+ {0, 0, 0, 0, 0}, /* 22: Unused */
-+ {0, 0, 0, 0, 0}, /* 23: Unused */
-+ {0, 0, 0, 0, 0}, /* 24: Unused */
-+ {0, 0, 0, 0, 0}, /* 25: Unused */
-+ {0, 0, 0, 0, 0}, /* 26: Unused */
-+ {0, 0, 0, 0, 0}, /* 27: Unused */
-+};
-+
-+int __init pcibios_map_irq(struct pci_dev *dev, u8 slot, u8 pin)
-+{
-+ int virq;
-+
-+ if ((PCI_SLOT(dev->devfn) != PCI_IDSEL_CS5536)
-+ && (PCI_SLOT(dev->devfn) < 32)) {
-+ virq = irq_tab[slot][pin];
-+ printk(KERN_INFO "slot: %d, pin: %d, irq: %d\n", slot, pin,
-+ virq + LOONGSON_IRQ_BASE);
-+ if (virq != 0)
-+ return LOONGSON_IRQ_BASE + virq;
-+ else
-+ return 0;
-+ } else if (PCI_SLOT(dev->devfn) == PCI_IDSEL_CS5536) { /* cs5536 */
-+ switch (PCI_FUNC(dev->devfn)) {
-+ case 2:
-+ pci_write_config_byte(dev, PCI_INTERRUPT_LINE,
-+ CS5536_IDE_INTR);
-+ return 14; /* for IDE */
-+ case 3:
-+ pci_write_config_byte(dev, PCI_INTERRUPT_LINE,
-+ CS5536_ACC_INTR);
-+ return 9; /* for AUDIO */
-+ case 4: /* for OHCI */
-+ case 5: /* for EHCI */
-+ case 6: /* for UDC */
-+ case 7: /* for OTG */
-+ pci_write_config_byte(dev, PCI_INTERRUPT_LINE,
-+ CS5536_USB_INTR);
-+ return 11;
-+ }
-+ return dev->irq;
-+ } else {
-+ printk(KERN_INFO " strange pci slot number.\n");
-+ return 0;
-+ }
-+}
-+
-+/* Do platform specific device initialization at pci_enable_device() time */
-+int pcibios_plat_dev_init(struct pci_dev *dev)
-+{
-+ return 0;
-+}
-+
-+/* CS5536 SPEC. fixup */
-+static void __init loongson_cs5536_isa_fixup(struct pci_dev *pdev)
-+{
-+ /* the uart1 and uart2 interrupt in PIC is enabled as default */
-+ pci_write_config_dword(pdev, PCI_UART1_INT_REG, 1);
-+ pci_write_config_dword(pdev, PCI_UART2_INT_REG, 1);
-+ return;
-+}
-+
-+static void __init loongson_cs5536_ide_fixup(struct pci_dev *pdev)
-+{
-+ /* setting the mutex pin as IDE function */
-+ pci_write_config_dword(pdev, PCI_IDE_CFG_REG,
-+ CS5536_IDE_FLASH_SIGNATURE);
-+ return;
-+}
-+
-+static void __init loongson_cs5536_acc_fixup(struct pci_dev *pdev)
-+{
-+ u8 val;
-+
-+ /* enable the AUDIO interrupt in PIC */
-+ pci_write_config_dword(pdev, PCI_ACC_INT_REG, 1);
-+
-+#if 1
-+ pci_read_config_byte(pdev, PCI_LATENCY_TIMER, &val);
-+ printk(KERN_INFO "cs5536 acc latency 0x%x\n", val);
-+ pci_write_config_byte(pdev, PCI_LATENCY_TIMER, 0xc0);
-+#endif
-+ return;
-+}
-+
-+static void __init loongson_cs5536_ohci_fixup(struct pci_dev *pdev)
-+{
-+ /* enable the OHCI interrupt in PIC */
-+ /* THE OHCI, EHCI, UDC, OTG are shared with interrupt in PIC */
-+ pci_write_config_dword(pdev, PCI_OHCI_INT_REG, 1);
-+ return;
-+}
-+
-+static void __init loongson_cs5536_ehci_fixup(struct pci_dev *pdev)
-+{
-+ u32 hi, lo;
-+
-+ /* Serial short detect enable */
-+ _rdmsr(USB_MSR_REG(USB_CONFIG), &hi, &lo);
-+ _wrmsr(USB_MSR_REG(USB_CONFIG), (1 << 1) | (1 << 2) | (1 << 3), lo);
-+
-+ /* setting the USB2.0 micro frame length */
-+ pci_write_config_dword(pdev, PCI_EHCI_FLADJ_REG, 0x2000);
-+ return;
-+}
-+
-+static void __init loongson_nec_fixup(struct pci_dev *pdev)
-+{
-+ unsigned int val;
-+
-+ pci_read_config_dword(pdev, 0xe0, &val);
-+ /* Only 2 port be used */
-+ pci_write_config_dword(pdev, 0xe0, (val & ~3) | 0x2);
-+}
-+
-+DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_CS5536_ISA,
-+ loongson_cs5536_isa_fixup);
-+DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_CS5536_OHC,
-+ loongson_cs5536_ohci_fixup);
-+DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_CS5536_EHC,
-+ loongson_cs5536_ehci_fixup);
-+DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_CS5536_AUDIO,
-+ loongson_cs5536_acc_fixup);
-+DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_CS5536_IDE,
-+ loongson_cs5536_ide_fixup);
-+DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_NEC, PCI_DEVICE_ID_NEC_USB,
-+ loongson_nec_fixup);
-diff -Nur linux-2.6.30.5.orig/arch/mips/pci/fixup-lm2e.c linux-2.6.30.5/arch/mips/pci/fixup-lm2e.c
---- linux-2.6.30.5.orig/arch/mips/pci/fixup-lm2e.c 2009-08-16 23:19:38.000000000 +0200
-+++ linux-2.6.30.5/arch/mips/pci/fixup-lm2e.c 1970-01-01 01:00:00.000000000 +0100
-@@ -1,242 +0,0 @@
--/*
-- * fixup-lm2e.c
-- *
-- * Copyright (C) 2004 ICT CAS
-- * Author: Li xiaoyu, ICT CAS
-- * lixy@ict.ac.cn
-- *
-- * Copyright (C) 2007 Lemote, Inc. & Institute of Computing Technology
-- * Author: Fuxin Zhang, zhangfx@lemote.com
-- *
-- * 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 SOFTWARE IS PROVIDED ``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 AUTHOR 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.
-- *
-- * 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.,
-- * 675 Mass Ave, Cambridge, MA 02139, USA.
-- *
-- */
--#include <linux/init.h>
--#include <linux/pci.h>
--#include <asm/mips-boards/bonito64.h>
--
--/* South bridge slot number is set by the pci probe process */
--static u8 sb_slot = 5;
--
--int __init pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
--{
-- int irq = 0;
--
-- if (slot == sb_slot) {
-- switch (PCI_FUNC(dev->devfn)) {
-- case 2:
-- irq = 10;
-- break;
-- case 3:
-- irq = 11;
-- break;
-- case 5:
-- irq = 9;
-- break;
-- }
-- } else {
-- irq = BONITO_IRQ_BASE + 25 + pin;
-- }
-- return irq;
--
--}
--
--/* Do platform specific device initialization at pci_enable_device() time */
--int pcibios_plat_dev_init(struct pci_dev *dev)
--{
-- return 0;
--}
--
--static void __init loongson2e_nec_fixup(struct pci_dev *pdev)
--{
-- unsigned int val;
--
-- /* Configues port 1, 2, 3, 4 to be validate*/
-- pci_read_config_dword(pdev, 0xe0, &val);
-- pci_write_config_dword(pdev, 0xe0, (val & ~7) | 0x4);
--
-- /* System clock is 48-MHz Oscillator. */
-- pci_write_config_dword(pdev, 0xe4, 1 << 5);
--}
--
--static void __init loongson2e_686b_func0_fixup(struct pci_dev *pdev)
--{
-- unsigned char c;
--
-- sb_slot = PCI_SLOT(pdev->devfn);
--
-- printk(KERN_INFO "via686b fix: ISA bridge\n");
--
-- /* Enable I/O Recovery time */
-- pci_write_config_byte(pdev, 0x40, 0x08);
--
-- /* Enable ISA refresh */
-- pci_write_config_byte(pdev, 0x41, 0x01);
--
-- /* disable ISA line buffer */
-- pci_write_config_byte(pdev, 0x45, 0x00);
--
-- /* Gate INTR, and flush line buffer */
-- pci_write_config_byte(pdev, 0x46, 0xe0);
--
-- /* Disable PCI Delay Transaction, Enable EISA ports 4D0/4D1. */
-- /* pci_write_config_byte(pdev, 0x47, 0x20); */
--
-- /*
-- * enable PCI Delay Transaction, Enable EISA ports 4D0/4D1.
-- * enable time-out timer
-- */
-- pci_write_config_byte(pdev, 0x47, 0xe6);
--
-- /*
-- * enable level trigger on pci irqs: 9,10,11,13
-- * important! without this PCI interrupts won't work
-- */
-- outb(0x2e, 0x4d1);
--
-- /* 512 K PCI Decode */
-- pci_write_config_byte(pdev, 0x48, 0x01);
--
-- /* Wait for PGNT before grant to ISA Master/DMA */
-- pci_write_config_byte(pdev, 0x4a, 0x84);
--
-- /*
-- * Plug'n'Play
-- *
-- * Parallel DRQ 3, Floppy DRQ 2 (default)
-- */
-- pci_write_config_byte(pdev, 0x50, 0x0e);
--
-- /*
-- * IRQ Routing for Floppy and Parallel port
-- *
-- * IRQ 6 for floppy, IRQ 7 for parallel port
-- */
-- pci_write_config_byte(pdev, 0x51, 0x76);
--
-- /* IRQ Routing for serial ports (take IRQ 3 and 4) */
-- pci_write_config_byte(pdev, 0x52, 0x34);
--
-- /* All IRQ's level triggered. */
-- pci_write_config_byte(pdev, 0x54, 0x00);
--
-- /* route PIRQA-D irq */
-- pci_write_config_byte(pdev, 0x55, 0x90); /* bit 7-4, PIRQA */
-- pci_write_config_byte(pdev, 0x56, 0xba); /* bit 7-4, PIRQC; */
-- /* 3-0, PIRQB */
-- pci_write_config_byte(pdev, 0x57, 0xd0); /* bit 7-4, PIRQD */
--
-- /* enable function 5/6, audio/modem */
-- pci_read_config_byte(pdev, 0x85, &c);
-- c &= ~(0x3 << 2);
-- pci_write_config_byte(pdev, 0x85, c);
--
-- printk(KERN_INFO"via686b fix: ISA bridge done\n");
--}
--
--static void __init loongson2e_686b_func1_fixup(struct pci_dev *pdev)
--{
-- printk(KERN_INFO"via686b fix: IDE\n");
--
-- /* Modify IDE controller setup */
-- pci_write_config_byte(pdev, PCI_LATENCY_TIMER, 48);
-- pci_write_config_byte(pdev, PCI_COMMAND,
-- PCI_COMMAND_IO | PCI_COMMAND_MEMORY |
-- PCI_COMMAND_MASTER);
-- pci_write_config_byte(pdev, 0x40, 0x0b);
-- /* legacy mode */
-- pci_write_config_byte(pdev, 0x42, 0x09);
--
--#if 1/* play safe, otherwise we may see notebook's usb keyboard lockup */
-- /* disable read prefetch/write post buffers */
-- pci_write_config_byte(pdev, 0x41, 0x02);
--
-- /* use 3/4 as fifo thresh hold */
-- pci_write_config_byte(pdev, 0x43, 0x0a);
-- pci_write_config_byte(pdev, 0x44, 0x00);
--
-- pci_write_config_byte(pdev, 0x45, 0x00);
--#else
-- pci_write_config_byte(pdev, 0x41, 0xc2);
-- pci_write_config_byte(pdev, 0x43, 0x35);
-- pci_write_config_byte(pdev, 0x44, 0x1c);
--
-- pci_write_config_byte(pdev, 0x45, 0x10);
--#endif
--
-- printk(KERN_INFO"via686b fix: IDE done\n");
--}
--
--static void __init loongson2e_686b_func2_fixup(struct pci_dev *pdev)
--{
-- /* irq routing */
-- pci_write_config_byte(pdev, PCI_INTERRUPT_LINE, 10);
--}
--
--static void __init loongson2e_686b_func3_fixup(struct pci_dev *pdev)
--{
-- /* irq routing */
-- pci_write_config_byte(pdev, PCI_INTERRUPT_LINE, 11);
--}
--
--static void __init loongson2e_686b_func5_fixup(struct pci_dev *pdev)
--{
-- unsigned int val;
-- unsigned char c;
--
-- /* enable IO */
-- pci_write_config_byte(pdev, PCI_COMMAND,
-- PCI_COMMAND_IO | PCI_COMMAND_MEMORY |
-- PCI_COMMAND_MASTER);
-- pci_read_config_dword(pdev, 0x4, &val);
-- pci_write_config_dword(pdev, 0x4, val | 1);
--
-- /* route ac97 IRQ */
-- pci_write_config_byte(pdev, 0x3c, 9);
--
-- pci_read_config_byte(pdev, 0x8, &c);
--
-- /* link control: enable link & SGD PCM output */
-- pci_write_config_byte(pdev, 0x41, 0xcc);
--
-- /* disable game port, FM, midi, sb, enable write to reg2c-2f */
-- pci_write_config_byte(pdev, 0x42, 0x20);
--
-- /* we are using Avance logic codec */
-- pci_write_config_word(pdev, 0x2c, 0x1005);
-- pci_write_config_word(pdev, 0x2e, 0x4710);
-- pci_read_config_dword(pdev, 0x2c, &val);
--
-- pci_write_config_byte(pdev, 0x42, 0x0);
--}
--
--DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C686,
-- loongson2e_686b_func0_fixup);
--DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C586_1,
-- loongson2e_686b_func1_fixup);
--DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C586_2,
-- loongson2e_686b_func2_fixup);
--DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C586_3,
-- loongson2e_686b_func3_fixup);
--DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C686_5,
-- loongson2e_686b_func5_fixup);
--DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_NEC, PCI_DEVICE_ID_NEC_USB,
-- loongson2e_nec_fixup);
-diff -Nur linux-2.6.30.5.orig/arch/mips/pci/Makefile linux-2.6.30.5/arch/mips/pci/Makefile
---- linux-2.6.30.5.orig/arch/mips/pci/Makefile 2009-08-16 23:19:38.000000000 +0200
-+++ linux-2.6.30.5/arch/mips/pci/Makefile 2009-08-23 19:01:04.000000000 +0200
-@@ -26,7 +26,9 @@
- obj-$(CONFIG_SOC_AU1500) += fixup-au1000.o ops-au1000.o
- obj-$(CONFIG_SOC_AU1550) += fixup-au1000.o ops-au1000.o
- obj-$(CONFIG_SOC_PNX8550) += fixup-pnx8550.o ops-pnx8550.o
--obj-$(CONFIG_LEMOTE_FULONG) += fixup-lm2e.o ops-bonito64.o
-+obj-$(CONFIG_LEMOTE_FULOONG2E) += fixup-fuloong2e.o ops-loongson2.o
-+obj-$(CONFIG_LEMOTE_FULOONG2F) += fixup-lemote2f.o ops-loongson2.o
-+obj-$(CONFIG_LEMOTE_YEELOONG2F) += fixup-lemote2f.o ops-loongson2.o
- obj-$(CONFIG_MIPS_MALTA) += fixup-malta.o
- obj-$(CONFIG_PMC_MSP7120_GW) += fixup-pmcmsp.o ops-pmcmsp.o
- obj-$(CONFIG_PMC_MSP7120_EVAL) += fixup-pmcmsp.o ops-pmcmsp.o
-diff -Nur linux-2.6.30.5.orig/arch/mips/pci/ops-bonito64.c linux-2.6.30.5/arch/mips/pci/ops-bonito64.c
---- linux-2.6.30.5.orig/arch/mips/pci/ops-bonito64.c 2009-08-16 23:19:38.000000000 +0200
-+++ linux-2.6.30.5/arch/mips/pci/ops-bonito64.c 2009-08-23 19:01:04.000000000 +0200
-@@ -29,20 +29,16 @@
- #define PCI_ACCESS_READ 0
- #define PCI_ACCESS_WRITE 1
-
--#ifdef CONFIG_LEMOTE_FULONG
--#define CFG_SPACE_REG(offset) (void *)CKSEG1ADDR(BONITO_PCICFG_BASE | (offset))
--#define ID_SEL_BEGIN 11
--#else
--#define CFG_SPACE_REG(offset) (void *)CKSEG1ADDR(_pcictrl_bonito_pcicfg + (offset))
-+#define CFG_SPACE_REG(offset) \
-+ (void *)CKSEG1ADDR(_pcictrl_bonito_pcicfg + (offset))
- #define ID_SEL_BEGIN 10
--#endif
- #define MAX_DEV_NUM (31 - ID_SEL_BEGIN)
-
-
- static int bonito64_pcibios_config_access(unsigned char access_type,
- struct pci_bus *bus,
- unsigned int devfn, int where,
-- u32 * data)
-+ u32 *data)
- {
- u32 busnum = bus->number;
- u32 addr, type;
-@@ -77,10 +73,9 @@
- addrp = CFG_SPACE_REG(addr & 0xffff);
- if (access_type == PCI_ACCESS_WRITE) {
- writel(cpu_to_le32(*data), addrp);
--#ifndef CONFIG_LEMOTE_FULONG
- /* Wait till done */
-- while (BONITO_PCIMSTAT & 0xF);
--#endif
-+ while (BONITO_PCIMSTAT & 0xF)
-+ ;
- } else {
- *data = le32_to_cpu(readl(addrp));
- }
-@@ -107,7 +102,7 @@
- * read/write a 32bit word and mask/modify the data we actually want.
- */
- static int bonito64_pcibios_read(struct pci_bus *bus, unsigned int devfn,
-- int where, int size, u32 * val)
-+ int where, int size, u32 *val)
- {
- u32 data = 0;
-
-@@ -144,7 +139,7 @@
- data = val;
- else {
- if (bonito64_pcibios_config_access(PCI_ACCESS_READ, bus, devfn,
-- where, &data))
-+ where, &data))
- return -1;
-
- if (size == 1)
-diff -Nur linux-2.6.30.5.orig/arch/mips/pci/ops-loongson2.c linux-2.6.30.5/arch/mips/pci/ops-loongson2.c
---- linux-2.6.30.5.orig/arch/mips/pci/ops-loongson2.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.30.5/arch/mips/pci/ops-loongson2.c 2009-08-23 19:01:04.000000000 +0200
-@@ -0,0 +1,213 @@
-+/*
-+ * Copyright (C) 1999, 2000, 2004 MIPS Technologies, Inc.
-+ * All rights reserved.
-+ * Authors: Carsten Langgaard <carstenl@mips.com>
-+ * Maciej W. Rozycki <macro@mips.com>
-+ *
-+ * This program is free software; you can distribute it and/or modify it
-+ * under the terms of the GNU General Public License (Version 2) as
-+ * published by the Free Software Foundation.
-+ *
-+ * This program is distributed in the hope 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.
-+ *
-+ * MIPS boards specific PCI support.
-+ */
-+#include <linux/types.h>
-+#include <linux/pci.h>
-+#include <linux/kernel.h>
-+#include <linux/init.h>
-+
-+#include <loongson.h>
-+
-+#ifdef CONFIG_CS5536
-+#include <cs5536/cs5536_pci.h>
-+#include <cs5536/cs5536.h>
-+#endif
-+
-+#define PCI_ACCESS_READ 0
-+#define PCI_ACCESS_WRITE 1
-+
-+#define CFG_SPACE_REG(offset) \
-+ (void *)CKSEG1ADDR(LOONGSON_PCICFG_BASE | (offset))
-+#define ID_SEL_BEGIN 11
-+#define MAX_DEV_NUM (31 - ID_SEL_BEGIN)
-+
-+
-+static int loongson_pcibios_config_access(unsigned char access_type,
-+ struct pci_bus *bus,
-+ unsigned int devfn, int where,
-+ u32 *data)
-+{
-+ u32 busnum = bus->number;
-+ u32 addr, type;
-+ u32 dummy;
-+ void *addrp;
-+ int device = PCI_SLOT(devfn);
-+ int function = PCI_FUNC(devfn);
-+ int reg = where & ~3;
-+
-+ if (busnum == 0) {
-+ /* board-specific part,currently,only fuloong2f,yeeloong2f
-+ * use CS5536, fuloong2e use via686b, gdium has no
-+ * south bridge
-+ */
-+#ifdef CONFIG_CS5536
-+ /* cs5536_pci_conf_read4/write4() will call _rdmsr/_wrmsr()
-+ * to access the regsters 0xf4,0xf8,0xfc, which is bigger than
-+ * 0xf0, so, it will not go this branch, but the others. so,
-+ * no calling dead loop here.
-+ */
-+ if ((PCI_IDSEL_CS5536 == device) && (reg < 0xF0)) {
-+ switch (access_type) {
-+ case PCI_ACCESS_READ:
-+ *data = cs5536_pci_conf_read4(function, reg);
-+ break;
-+ case PCI_ACCESS_WRITE:
-+ cs5536_pci_conf_write4(function, reg, *data);
-+ break;
-+ }
-+ return 0;
-+ }
-+#endif
-+ /* Type 0 configuration for onboard PCI bus */
-+ if (device > MAX_DEV_NUM)
-+ return -1;
-+
-+ addr = (1 << (device + ID_SEL_BEGIN)) | (function << 8) | reg;
-+ type = 0;
-+ } else {
-+ /* Type 1 configuration for offboard PCI bus */
-+ addr = (busnum << 16) | (device << 11) | (function << 8) | reg;
-+ type = 0x10000;
-+ }
-+
-+ /* Clear aborts */
-+ LOONGSON_PCICMD |= LOONGSON_PCICMD_MABORT_CLR | \
-+ LOONGSON_PCICMD_MTABORT_CLR;
-+
-+ LOONGSON_PCIMAP_CFG = (addr >> 16) | type;
-+
-+ /* Flush Bonito register block */
-+ dummy = LOONGSON_PCIMAP_CFG;
-+ mmiowb();
-+
-+ addrp = CFG_SPACE_REG(addr & 0xffff);
-+ if (access_type == PCI_ACCESS_WRITE)
-+ writel(cpu_to_le32(*data), addrp);
-+ else
-+ *data = le32_to_cpu(readl(addrp));
-+
-+ /* Detect Master/Target abort */
-+ if (LOONGSON_PCICMD & (LOONGSON_PCICMD_MABORT_CLR |
-+ LOONGSON_PCICMD_MTABORT_CLR)) {
-+ /* Error occurred */
-+
-+ /* Clear bits */
-+ LOONGSON_PCICMD |= (LOONGSON_PCICMD_MABORT_CLR |
-+ LOONGSON_PCICMD_MTABORT_CLR);
-+
-+ return -1;
-+ }
-+
-+ return 0;
-+
-+}
-+
-+
-+/*
-+ * We can't address 8 and 16 bit words directly. Instead we have to
-+ * read/write a 32bit word and mask/modify the data we actually want.
-+ */
-+static int loongson_pcibios_read(struct pci_bus *bus, unsigned int devfn,
-+ int where, int size, u32 *val)
-+{
-+ u32 data = 0;
-+
-+ if ((size == 2) && (where & 1))
-+ return PCIBIOS_BAD_REGISTER_NUMBER;
-+ else if ((size == 4) && (where & 3))
-+ return PCIBIOS_BAD_REGISTER_NUMBER;
-+
-+ if (loongson_pcibios_config_access(PCI_ACCESS_READ, bus, devfn, where,
-+ &data))
-+ return -1;
-+
-+ if (size == 1)
-+ *val = (data >> ((where & 3) << 3)) & 0xff;
-+ else if (size == 2)
-+ *val = (data >> ((where & 3) << 3)) & 0xffff;
-+ else
-+ *val = data;
-+
-+ return PCIBIOS_SUCCESSFUL;
-+}
-+
-+static int loongson_pcibios_write(struct pci_bus *bus, unsigned int devfn,
-+ int where, int size, u32 val)
-+{
-+ u32 data = 0;
-+
-+ if ((size == 2) && (where & 1))
-+ return PCIBIOS_BAD_REGISTER_NUMBER;
-+ else if ((size == 4) && (where & 3))
-+ return PCIBIOS_BAD_REGISTER_NUMBER;
-+
-+ if (size == 4)
-+ data = val;
-+ else {
-+ if (loongson_pcibios_config_access(PCI_ACCESS_READ, bus, devfn,
-+ where, &data))
-+ return -1;
-+
-+ if (size == 1)
-+ data = (data & ~(0xff << ((where & 3) << 3))) |
-+ (val << ((where & 3) << 3));
-+ else if (size == 2)
-+ data = (data & ~(0xffff << ((where & 3) << 3))) |
-+ (val << ((where & 3) << 3));
-+ }
-+
-+ if (loongson_pcibios_config_access(PCI_ACCESS_WRITE, bus, devfn, where,
-+ &data))
-+ return -1;
-+
-+ return PCIBIOS_SUCCESSFUL;
-+}
-+
-+struct pci_ops loongson_pci_ops = {
-+ .read = loongson_pcibios_read,
-+ .write = loongson_pcibios_write
-+};
-+
-+#ifdef CONFIG_CS5536
-+void _rdmsr(u32 msr, u32 *hi, u32 *lo)
-+{
-+ struct pci_bus bus = {
-+ .number = PCI_BUS_CS5536
-+ };
-+ u32 devfn = PCI_DEVFN(PCI_IDSEL_CS5536, 0);
-+ loongson_pcibios_write(&bus, devfn, PCI_MSR_ADDR, 4, msr);
-+ loongson_pcibios_read(&bus, devfn, PCI_MSR_DATA_LO, 4, lo);
-+ loongson_pcibios_read(&bus, devfn, PCI_MSR_DATA_HI, 4, hi);
-+}
-+EXPORT_SYMBOL(_rdmsr);
-+
-+void _wrmsr(u32 msr, u32 hi, u32 lo)
-+{
-+ struct pci_bus bus = {
-+ .number = PCI_BUS_CS5536
-+ };
-+ u32 devfn = PCI_DEVFN(PCI_IDSEL_CS5536, 0);
-+ loongson_pcibios_write(&bus, devfn, PCI_MSR_ADDR, 4, msr);
-+ loongson_pcibios_write(&bus, devfn, PCI_MSR_DATA_LO, 4, lo);
-+ loongson_pcibios_write(&bus, devfn, PCI_MSR_DATA_HI, 4, hi);
-+}
-+EXPORT_SYMBOL(_wrmsr);
-+#endif
-diff -Nur linux-2.6.30.5.orig/arch/mips/power/cpu.c linux-2.6.30.5/arch/mips/power/cpu.c
---- linux-2.6.30.5.orig/arch/mips/power/cpu.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.30.5/arch/mips/power/cpu.c 2009-08-23 19:01:04.000000000 +0200
-@@ -0,0 +1,60 @@
-+/*
-+ * Suspend support specific for mips.
-+ *
-+ * Licensed under the GPLv2
-+ *
-+ * Copyright (C) 2009 Lemote Inc. & Insititute of Computing Technology
-+ * Author: Hu Hongbing <huhb@lemote.com>
-+ * Wu Zhangjin <wuzj@lemote.com>
-+ */
-+#include <asm/suspend.h>
-+#include <asm/fpu.h>
-+#include <asm/dsp.h>
-+#include <asm/bootinfo.h>
-+
-+static u32 saved_status;
-+struct pt_regs saved_regs;
-+
-+void save_processor_state(void)
-+{
-+ saved_status = read_c0_status();
-+
-+ if (is_fpu_owner())
-+ save_fp(current);
-+ if (cpu_has_dsp)
-+ save_dsp(current);
-+}
-+
-+void restore_processor_state(void)
-+{
-+ write_c0_status(saved_status);
-+
-+ if (is_fpu_owner())
-+ restore_fp(current);
-+ if (cpu_has_dsp)
-+ restore_dsp(current);
-+}
-+
-+int pfn_in_system_ram(unsigned long pfn)
-+{
-+ int i;
-+
-+ for (i = 0; i < boot_mem_map.nr_map; i++) {
-+ if (boot_mem_map.map[i].type == BOOT_MEM_RAM) {
-+ if ((pfn >= (boot_mem_map.map[i].addr >> PAGE_SHIFT)) &&
-+ ((pfn) < ((boot_mem_map.map[i].addr +
-+ boot_mem_map.map[i].size) >> PAGE_SHIFT)))
-+ return 1;
-+ }
-+ }
-+ return 0;
-+}
-+
-+int pfn_is_nosave(unsigned long pfn)
-+{
-+ unsigned long nosave_begin_pfn = PFN_DOWN(__pa(&__nosave_begin));
-+ unsigned long nosave_end_pfn = PFN_UP(__pa(&__nosave_end));
-+
-+ return ((pfn >= nosave_begin_pfn) && (pfn < nosave_end_pfn))
-+ || !pfn_in_system_ram(pfn);
-+}
-diff -Nur linux-2.6.30.5.orig/arch/mips/power/hibernate.S linux-2.6.30.5/arch/mips/power/hibernate.S
---- linux-2.6.30.5.orig/arch/mips/power/hibernate.S 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.30.5/arch/mips/power/hibernate.S 2009-08-23 19:01:04.000000000 +0200
-@@ -0,0 +1,61 @@
-+/*
-+ * Hibernation support specific for mips - temporary page tables
-+ *
-+ * Licensed under the GPLv2
-+ *
-+ * Copyright (C) 2009 Lemote Inc. & Insititute of Computing Technology
-+ * Author: Hu Hongbing <huhb@lemote.com>
-+ * Wu Zhangjin <wuzj@lemote.com>
-+ */
-+#include <asm/asm-offsets.h>
-+#include <asm/regdef.h>
-+#include <asm/asm.h>
-+
-+.text
-+LEAF(swsusp_arch_suspend)
-+ PTR_LA t0, saved_regs
-+ PTR_S ra, PT_R31(t0)
-+ PTR_S sp, PT_R29(t0)
-+ PTR_S fp, PT_R30(t0)
-+ PTR_S gp, PT_R28(t0)
-+ PTR_S s0, PT_R16(t0)
-+ PTR_S s1, PT_R17(t0)
-+ PTR_S s2, PT_R18(t0)
-+ PTR_S s3, PT_R19(t0)
-+ PTR_S s4, PT_R20(t0)
-+ PTR_S s5, PT_R21(t0)
-+ PTR_S s6, PT_R22(t0)
-+ PTR_S s7, PT_R23(t0)
-+ j swsusp_save
-+END(swsusp_arch_suspend)
-+
-+LEAF(swsusp_arch_resume)
-+ PTR_L t0, restore_pblist
-+0:
-+ PTR_L t1, PBE_ADDRESS(t0) /* source */
-+ PTR_L t2, PBE_ORIG_ADDRESS(t0) /* destination */
-+ PTR_ADDIU t3, t1, _PAGE_SIZE
-+1:
-+ REG_L t8, (t1)
-+ REG_S t8, (t2)
-+ PTR_ADDIU t1, t1, SZREG
-+ PTR_ADDIU t2, t2, SZREG
-+ bne t1, t3, 1b
-+ PTR_L t0, PBE_NEXT(t0)
-+ bnez t0, 0b
-+ PTR_LA t0, saved_regs
-+ PTR_L ra, PT_R31(t0)
-+ PTR_L sp, PT_R29(t0)
-+ PTR_L fp, PT_R30(t0)
-+ PTR_L gp, PT_R28(t0)
-+ PTR_L s0, PT_R16(t0)
-+ PTR_L s1, PT_R17(t0)
-+ PTR_L s2, PT_R18(t0)
-+ PTR_L s3, PT_R19(t0)
-+ PTR_L s4, PT_R20(t0)
-+ PTR_L s5, PT_R21(t0)
-+ PTR_L s6, PT_R22(t0)
-+ PTR_L s7, PT_R23(t0)
-+ PTR_LI v0, 0x0
-+ jr ra
-+END(swsusp_arch_resume)
-diff -Nur linux-2.6.30.5.orig/arch/mips/power/Makefile linux-2.6.30.5/arch/mips/power/Makefile
---- linux-2.6.30.5.orig/arch/mips/power/Makefile 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.30.5/arch/mips/power/Makefile 2009-08-23 19:01:04.000000000 +0200
-@@ -0,0 +1 @@
-+obj-$(CONFIG_HIBERNATION) += cpu.o hibernate.o
-diff -Nur linux-2.6.30.5.orig/drivers/input/serio/i8042.c linux-2.6.30.5/drivers/input/serio/i8042.c
---- linux-2.6.30.5.orig/drivers/input/serio/i8042.c 2009-08-16 23:19:38.000000000 +0200
-+++ linux-2.6.30.5/drivers/input/serio/i8042.c 2009-08-23 19:01:04.000000000 +0200
-@@ -143,7 +143,7 @@
- * of the i8042 down the toilet.
- */
-
--static int i8042_flush(void)
-+int i8042_flush(void)
- {
- unsigned long flags;
- unsigned char data, str;
-@@ -390,10 +390,10 @@
- }
-
- /*
-- * i8042_enable_kbd_port enables keybaord port on chip
-+ * i8042_enable_kbd_port enables keyboard port on chip
- */
-
--static int i8042_enable_kbd_port(void)
-+int i8042_enable_kbd_port(void)
- {
- i8042_ctr &= ~I8042_CTR_KBDDIS;
- i8042_ctr |= I8042_CTR_KBDINT;
-diff -Nur linux-2.6.30.5.orig/drivers/net/wireless/Kconfig linux-2.6.30.5/drivers/net/wireless/Kconfig
---- linux-2.6.30.5.orig/drivers/net/wireless/Kconfig 2009-08-16 23:19:38.000000000 +0200
-+++ linux-2.6.30.5/drivers/net/wireless/Kconfig 2009-08-23 19:01:04.000000000 +0200
-@@ -416,7 +416,7 @@
-
- config RTL8187
- tristate "Realtek 8187 and 8187B USB support"
-- depends on MAC80211 && USB && WLAN_80211
-+ depends on MAC80211 && USB && WLAN_80211 && !LEMOTE_YEELOONG2F
- select EEPROM_93CX6
- ---help---
- This is a driver for RTL8187 and RTL8187B based cards.
-@@ -434,6 +434,16 @@
-
- Thanks to Realtek for their support!
-
-+config RTL8187B
-+ tristate "Realtek 8187B wifi support for yeeloong2f laptop"
-+ depends on MAC80211 && USB && WLAN_80211 && LEMOTE_YEELOONG2F
-+ select EEPROM_93CX6
-+ ---help---
-+ This is a driver for RTL8187B based cards, this driver is especially
-+ for yeeloon2f laptop.
-+
-+ Thanks to Realtek for their support!
-+
- config ADM8211
- tristate "ADMtek ADM8211 support"
- depends on MAC80211 && PCI && WLAN_80211 && EXPERIMENTAL
-diff -Nur linux-2.6.30.5.orig/drivers/net/wireless/Makefile linux-2.6.30.5/drivers/net/wireless/Makefile
---- linux-2.6.30.5.orig/drivers/net/wireless/Makefile 2009-08-16 23:19:38.000000000 +0200
-+++ linux-2.6.30.5/drivers/net/wireless/Makefile 2009-08-23 19:01:04.000000000 +0200
-@@ -34,6 +34,7 @@
- obj-$(CONFIG_ZD1211RW) += zd1211rw/
- obj-$(CONFIG_RTL8180) += rtl818x/
- obj-$(CONFIG_RTL8187) += rtl818x/
-+obj-$(CONFIG_RTL8187B) += rtl8187b/
-
- # 16-bit wireless PCMCIA client drivers
- obj-$(CONFIG_PCMCIA_RAYCS) += ray_cs.o
-diff -Nur linux-2.6.30.5.orig/drivers/net/wireless/rtl8187b/dot11d.h linux-2.6.30.5/drivers/net/wireless/rtl8187b/dot11d.h
---- linux-2.6.30.5.orig/drivers/net/wireless/rtl8187b/dot11d.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.30.5/drivers/net/wireless/rtl8187b/dot11d.h 2009-08-23 19:01:04.000000000 +0200
-@@ -0,0 +1,102 @@
-+#ifndef __INC_DOT11D_H
-+#define __INC_DOT11D_H
-+
-+#include "ieee80211/ieee80211.h"
-+
-+//#define ENABLE_DOT11D
-+
-+//#define DOT11D_MAX_CHNL_NUM 83
-+
-+typedef struct _CHNL_TXPOWER_TRIPLE {
-+ u8 FirstChnl;
-+ u8 NumChnls;
-+ u8 MaxTxPowerInDbm;
-+}CHNL_TXPOWER_TRIPLE, *PCHNL_TXPOWER_TRIPLE;
-+
-+typedef enum _DOT11D_STATE {
-+ DOT11D_STATE_NONE = 0,
-+ DOT11D_STATE_LEARNED,
-+ DOT11D_STATE_DONE,
-+}DOT11D_STATE;
-+
-+typedef struct _RT_DOT11D_INFO {
-+ //DECLARE_RT_OBJECT(RT_DOT11D_INFO);
-+
-+ bool bEnabled; // dot11MultiDomainCapabilityEnabled
-+
-+ u16 CountryIeLen; // > 0 if CountryIeBuf[] contains valid country information element.
-+ u8 CountryIeBuf[MAX_IE_LEN];
-+ u8 CountryIeSrcAddr[6]; // Source AP of the country IE.
-+ u8 CountryIeWatchdog;
-+
-+ u8 channel_map[MAX_CHANNEL_NUMBER+1]; //!!!Value 0: Invalid, 1: Valid (active scan), 2: Valid (passive scan)
-+ //u8 ChnlListLen; // #Bytes valid in ChnlList[].
-+ //u8 ChnlList[DOT11D_MAX_CHNL_NUM];
-+ u8 MaxTxPwrDbmList[MAX_CHANNEL_NUMBER+1];
-+
-+ DOT11D_STATE State;
-+}RT_DOT11D_INFO, *PRT_DOT11D_INFO;
-+#define eqMacAddr(a,b) ( ((a)[0]==(b)[0] && (a)[1]==(b)[1] && (a)[2]==(b)[2] && (a)[3]==(b)[3] && (a)[4]==(b)[4] && (a)[5]==(b)[5]) ? 1:0 )
-+#define cpMacAddr(des,src) ((des)[0]=(src)[0],(des)[1]=(src)[1],(des)[2]=(src)[2],(des)[3]=(src)[3],(des)[4]=(src)[4],(des)[5]=(src)[5])
-+#define GET_DOT11D_INFO(__pIeeeDev) ((PRT_DOT11D_INFO)((__pIeeeDev)->pDot11dInfo))
-+
-+#define IS_DOT11D_ENABLE(__pIeeeDev) GET_DOT11D_INFO(__pIeeeDev)->bEnabled
-+#define IS_COUNTRY_IE_VALID(__pIeeeDev) (GET_DOT11D_INFO(__pIeeeDev)->CountryIeLen > 0)
-+
-+#define IS_EQUAL_CIE_SRC(__pIeeeDev, __pTa) eqMacAddr(GET_DOT11D_INFO(__pIeeeDev)->CountryIeSrcAddr, __pTa)
-+#define UPDATE_CIE_SRC(__pIeeeDev, __pTa) cpMacAddr(GET_DOT11D_INFO(__pIeeeDev)->CountryIeSrcAddr, __pTa)
-+
-+#define IS_COUNTRY_IE_CHANGED(__pIeeeDev, __Ie) \
-+ (((__Ie).Length == 0 || (__Ie).Length != GET_DOT11D_INFO(__pIeeeDev)->CountryIeLen) ? \
-+ FALSE : \
-+ (!memcmp(GET_DOT11D_INFO(__pIeeeDev)->CountryIeBuf, (__Ie).Octet, (__Ie).Length)))
-+
-+#define CIE_WATCHDOG_TH 1
-+#define GET_CIE_WATCHDOG(__pIeeeDev) GET_DOT11D_INFO(__pIeeeDev)->CountryIeWatchdog
-+#define RESET_CIE_WATCHDOG(__pIeeeDev) GET_CIE_WATCHDOG(__pIeeeDev) = 0
-+#define UPDATE_CIE_WATCHDOG(__pIeeeDev) ++GET_CIE_WATCHDOG(__pIeeeDev)
-+
-+#define IS_DOT11D_STATE_DONE(__pIeeeDev) (GET_DOT11D_INFO(__pIeeeDev)->State == DOT11D_STATE_DONE)
-+
-+
-+void
-+Dot11d_Init(
-+ struct ieee80211_device *dev
-+ );
-+
-+void
-+Dot11d_Reset(
-+ struct ieee80211_device *dev
-+ );
-+
-+void
-+Dot11d_UpdateCountryIe(
-+ struct ieee80211_device *dev,
-+ u8 * pTaddr,
-+ u16 CoutryIeLen,
-+ u8 * pCoutryIe
-+ );
-+
-+u8
-+DOT11D_GetMaxTxPwrInDbm(
-+ struct ieee80211_device *dev,
-+ u8 Channel
-+ );
-+
-+void
-+DOT11D_ScanComplete(
-+ struct ieee80211_device * dev
-+ );
-+
-+int IsLegalChannel(
-+ struct ieee80211_device * dev,
-+ u8 channel
-+);
-+
-+int ToLegalChannel(
-+ struct ieee80211_device * dev,
-+ u8 channel
-+);
-+
-+void dump_chnl_map(u8 * channel_map);
-+#endif // #ifndef __INC_DOT11D_H
-diff -Nur linux-2.6.30.5.orig/drivers/net/wireless/rtl8187b/ieee80211/arc4.c linux-2.6.30.5/drivers/net/wireless/rtl8187b/ieee80211/arc4.c
---- linux-2.6.30.5.orig/drivers/net/wireless/rtl8187b/ieee80211/arc4.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.30.5/drivers/net/wireless/rtl8187b/ieee80211/arc4.c 2009-08-23 19:01:04.000000000 +0200
-@@ -0,0 +1,103 @@
-+/*
-+ * Cryptographic API
-+ *
-+ * ARC4 Cipher Algorithm
-+ *
-+ * Jon Oberheide <jon@oberheide.org>
-+ *
-+ * 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.
-+ *
-+ */
-+#include <linux/module.h>
-+#include <linux/init.h>
-+#include "rtl_crypto.h"
-+
-+#define ARC4_MIN_KEY_SIZE 1
-+#define ARC4_MAX_KEY_SIZE 256
-+#define ARC4_BLOCK_SIZE 1
-+
-+struct arc4_ctx {
-+ u8 S[256];
-+ u8 x, y;
-+};
-+
-+static int arc4_set_key(void *ctx_arg, const u8 *in_key, unsigned int key_len, u32 *flags)
-+{
-+ struct arc4_ctx *ctx = ctx_arg;
-+ int i, j = 0, k = 0;
-+
-+ ctx->x = 1;
-+ ctx->y = 0;
-+
-+ for(i = 0; i < 256; i++)
-+ ctx->S[i] = i;
-+
-+ for(i = 0; i < 256; i++)
-+ {
-+ u8 a = ctx->S[i];
-+ j = (j + in_key[k] + a) & 0xff;
-+ ctx->S[i] = ctx->S[j];
-+ ctx->S[j] = a;
-+ if(++k >= key_len)
-+ k = 0;
-+ }
-+
-+ return 0;
-+}
-+
-+static void arc4_crypt(void *ctx_arg, u8 *out, const u8 *in)
-+{
-+ struct arc4_ctx *ctx = ctx_arg;
-+
-+ u8 *const S = ctx->S;
-+ u8 x = ctx->x;
-+ u8 y = ctx->y;
-+ u8 a, b;
-+
-+ a = S[x];
-+ y = (y + a) & 0xff;
-+ b = S[y];
-+ S[x] = b;
-+ S[y] = a;
-+ x = (x + 1) & 0xff;
-+ *out++ = *in ^ S[(a + b) & 0xff];
-+
-+ ctx->x = x;
-+ ctx->y = y;
-+}
-+
-+static struct crypto_alg arc4_alg = {
-+ .cra_name = "arc4",
-+ .cra_flags = CRYPTO_ALG_TYPE_CIPHER,
-+ .cra_blocksize = ARC4_BLOCK_SIZE,
-+ .cra_ctxsize = sizeof(struct arc4_ctx),
-+ .cra_module = THIS_MODULE,
-+ .cra_list = LIST_HEAD_INIT(arc4_alg.cra_list),
-+ .cra_u = { .cipher = {
-+ .cia_min_keysize = ARC4_MIN_KEY_SIZE,
-+ .cia_max_keysize = ARC4_MAX_KEY_SIZE,
-+ .cia_setkey = arc4_set_key,
-+ .cia_encrypt = arc4_crypt,
-+ .cia_decrypt = arc4_crypt } }
-+};
-+
-+static int __init arc4_init(void)
-+{
-+ return crypto_register_alg(&arc4_alg);
-+}
-+
-+
-+static void __exit arc4_exit(void)
-+{
-+ crypto_unregister_alg(&arc4_alg);
-+}
-+
-+module_init(arc4_init);
-+module_exit(arc4_exit);
-+
-+MODULE_LICENSE("GPL");
-+MODULE_DESCRIPTION("ARC4 Cipher Algorithm");
-+MODULE_AUTHOR("Jon Oberheide <jon@oberheide.org>");
-diff -Nur linux-2.6.30.5.orig/drivers/net/wireless/rtl8187b/ieee80211/dot11d.c linux-2.6.30.5/drivers/net/wireless/rtl8187b/ieee80211/dot11d.c
---- linux-2.6.30.5.orig/drivers/net/wireless/rtl8187b/ieee80211/dot11d.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.30.5/drivers/net/wireless/rtl8187b/ieee80211/dot11d.c 2009-08-23 19:01:04.000000000 +0200
-@@ -0,0 +1,245 @@
-+#ifdef ENABLE_DOT11D
-+//-----------------------------------------------------------------------------
-+// File:
-+// Dot11d.c
-+//
-+// Description:
-+// Implement 802.11d.
-+//
-+//-----------------------------------------------------------------------------
-+
-+#include "dot11d.h"
-+
-+void
-+Dot11d_Init(struct ieee80211_device *ieee)
-+{
-+ PRT_DOT11D_INFO pDot11dInfo = GET_DOT11D_INFO(ieee);
-+
-+ pDot11dInfo->bEnabled = 0;
-+
-+ pDot11dInfo->State = DOT11D_STATE_NONE;
-+ pDot11dInfo->CountryIeLen = 0;
-+ memset(pDot11dInfo->channel_map, 0, MAX_CHANNEL_NUMBER+1);
-+ memset(pDot11dInfo->MaxTxPwrDbmList, 0xFF, MAX_CHANNEL_NUMBER+1);
-+ RESET_CIE_WATCHDOG(ieee);
-+
-+ //printk("Dot11d_Init()\n");
-+}
-+
-+//
-+// Description:
-+// Reset to the state as we are just entering a regulatory domain.
-+//
-+void
-+Dot11d_Reset(struct ieee80211_device *ieee)
-+{
-+ u32 i;
-+ PRT_DOT11D_INFO pDot11dInfo = GET_DOT11D_INFO(ieee);
-+
-+ // Clear old channel map
-+ memset(pDot11dInfo->channel_map, 0, MAX_CHANNEL_NUMBER+1);
-+ memset(pDot11dInfo->MaxTxPwrDbmList, 0xFF, MAX_CHANNEL_NUMBER+1);
-+ // Set new channel map
-+ for (i=1; i<=11; i++) {
-+ (pDot11dInfo->channel_map)[i] = 1;
-+ }
-+ for (i=12; i<=14; i++) {
-+ (pDot11dInfo->channel_map)[i] = 2;
-+ }
-+
-+ pDot11dInfo->State = DOT11D_STATE_NONE;
-+ pDot11dInfo->CountryIeLen = 0;
-+ RESET_CIE_WATCHDOG(ieee);
-+
-+ //printk("Dot11d_Reset()\n");
-+}
-+
-+//
-+// Description:
-+// Update country IE from Beacon or Probe Resopnse
-+// and configure PHY for operation in the regulatory domain.
-+//
-+// TODO:
-+// Configure Tx power.
-+//
-+// Assumption:
-+// 1. IS_DOT11D_ENABLE() is TRUE.
-+// 2. Input IE is an valid one.
-+//
-+void
-+Dot11d_UpdateCountryIe(
-+ struct ieee80211_device *dev,
-+ u8 * pTaddr,
-+ u16 CoutryIeLen,
-+ u8 * pCoutryIe
-+ )
-+{
-+ PRT_DOT11D_INFO pDot11dInfo = GET_DOT11D_INFO(dev);
-+ u8 i, j, NumTriples, MaxChnlNum;
-+ PCHNL_TXPOWER_TRIPLE pTriple;
-+
-+ if((CoutryIeLen - 3)%3 != 0)
-+ {
-+ printk("Dot11d_UpdateCountryIe(): Invalid country IE, skip it........1\n");
-+ Dot11d_Reset(dev);
-+ return;
-+ }
-+
-+ memset(pDot11dInfo->channel_map, 0, MAX_CHANNEL_NUMBER+1);
-+ memset(pDot11dInfo->MaxTxPwrDbmList, 0xFF, MAX_CHANNEL_NUMBER+1);
-+ MaxChnlNum = 0;
-+ NumTriples = (CoutryIeLen - 3) / 3; // skip 3-byte country string.
-+ pTriple = (PCHNL_TXPOWER_TRIPLE)(pCoutryIe + 3);
-+ for(i = 0; i < NumTriples; i++)
-+ {
-+ if(MaxChnlNum >= pTriple->FirstChnl)
-+ { // It is not in a monotonically increasing order, so stop processing.
-+ printk("Dot11d_UpdateCountryIe(): Invalid country IE, skip it........1\n");
-+ Dot11d_Reset(dev);
-+ return;
-+ }
-+ if(MAX_CHANNEL_NUMBER < (pTriple->FirstChnl + pTriple->NumChnls))
-+ { // It is not a valid set of channel id, so stop processing.
-+ printk("Dot11d_UpdateCountryIe(): Invalid country IE, skip it........2\n");
-+ Dot11d_Reset(dev);
-+ return;
-+ }
-+
-+ for(j = 0 ; j < pTriple->NumChnls; j++)
-+ {
-+ pDot11dInfo->channel_map[pTriple->FirstChnl + j] = 1;
-+ pDot11dInfo->MaxTxPwrDbmList[pTriple->FirstChnl + j] = pTriple->MaxTxPowerInDbm;
-+ MaxChnlNum = pTriple->FirstChnl + j;
-+ }
-+
-+ pTriple = (PCHNL_TXPOWER_TRIPLE)((u8*)pTriple + 3);
-+ }
-+#if 1
-+ //printk("Dot11d_UpdateCountryIe(): Channel List:\n");
-+ printk("Channel List:");
-+ for(i=1; i<= MAX_CHANNEL_NUMBER; i++)
-+ if(pDot11dInfo->channel_map[i] > 0)
-+ printk(" %d", i);
-+ printk("\n");
-+#endif
-+
-+ UPDATE_CIE_SRC(dev, pTaddr);
-+
-+ pDot11dInfo->CountryIeLen = CoutryIeLen;
-+ memcpy(pDot11dInfo->CountryIeBuf, pCoutryIe,CoutryIeLen);
-+ pDot11dInfo->State = DOT11D_STATE_LEARNED;
-+}
-+
-+void dump_chnl_map(u8 * channel_map)
-+{
-+ int i;
-+ printk("Channel List:");
-+ for(i=1; i<= MAX_CHANNEL_NUMBER; i++)
-+ if(channel_map[i] > 0)
-+ printk(" %d(%d)", i, channel_map[i]);
-+ printk("\n");
-+}
-+
-+u8
-+DOT11D_GetMaxTxPwrInDbm(
-+ struct ieee80211_device *dev,
-+ u8 Channel
-+ )
-+{
-+ PRT_DOT11D_INFO pDot11dInfo = GET_DOT11D_INFO(dev);
-+ u8 MaxTxPwrInDbm = 255;
-+
-+ if(MAX_CHANNEL_NUMBER < Channel)
-+ {
-+ printk("DOT11D_GetMaxTxPwrInDbm(): Invalid Channel\n");
-+ return MaxTxPwrInDbm;
-+ }
-+ if(pDot11dInfo->channel_map[Channel])
-+ {
-+ MaxTxPwrInDbm = pDot11dInfo->MaxTxPwrDbmList[Channel];
-+ }
-+
-+ return MaxTxPwrInDbm;
-+}
-+
-+
-+void
-+DOT11D_ScanComplete(
-+ struct ieee80211_device * dev
-+ )
-+{
-+ PRT_DOT11D_INFO pDot11dInfo = GET_DOT11D_INFO(dev);
-+
-+ switch(pDot11dInfo->State)
-+ {
-+ case DOT11D_STATE_LEARNED:
-+ pDot11dInfo->State = DOT11D_STATE_DONE;
-+ break;
-+
-+ case DOT11D_STATE_DONE:
-+ if( GET_CIE_WATCHDOG(dev) == 0 )
-+ { // Reset country IE if previous one is gone.
-+ Dot11d_Reset(dev);
-+ }
-+ break;
-+ case DOT11D_STATE_NONE:
-+ break;
-+ }
-+}
-+
-+int IsLegalChannel(
-+ struct ieee80211_device * dev,
-+ u8 channel
-+)
-+{
-+ PRT_DOT11D_INFO pDot11dInfo = GET_DOT11D_INFO(dev);
-+
-+ if(MAX_CHANNEL_NUMBER < channel)
-+ {
-+ printk("IsLegalChannel(): Invalid Channel\n");
-+ return 0;
-+ }
-+ if(pDot11dInfo->channel_map[channel] > 0)
-+ return 1;
-+ return 0;
-+}
-+
-+int ToLegalChannel(
-+ struct ieee80211_device * dev,
-+ u8 channel
-+)
-+{
-+ PRT_DOT11D_INFO pDot11dInfo = GET_DOT11D_INFO(dev);
-+ u8 default_chn = 0;
-+ u32 i = 0;
-+
-+ for (i=1; i<= MAX_CHANNEL_NUMBER; i++)
-+ {
-+ if(pDot11dInfo->channel_map[i] > 0)
-+ {
-+ default_chn = i;
-+ break;
-+ }
-+ }
-+
-+ if(MAX_CHANNEL_NUMBER < channel)
-+ {
-+ printk("IsLegalChannel(): Invalid Channel\n");
-+ return default_chn;
-+ }
-+
-+ if(pDot11dInfo->channel_map[channel] > 0)
-+ return channel;
-+
-+ return default_chn;
-+}
-+
-+EXPORT_SYMBOL(Dot11d_Init);
-+EXPORT_SYMBOL(Dot11d_Reset);
-+EXPORT_SYMBOL(Dot11d_UpdateCountryIe);
-+EXPORT_SYMBOL(DOT11D_GetMaxTxPwrInDbm);
-+EXPORT_SYMBOL(DOT11D_ScanComplete);
-+EXPORT_SYMBOL(IsLegalChannel);
-+EXPORT_SYMBOL(ToLegalChannel);
-+#endif
-+
-diff -Nur linux-2.6.30.5.orig/drivers/net/wireless/rtl8187b/ieee80211/dot11d.h linux-2.6.30.5/drivers/net/wireless/rtl8187b/ieee80211/dot11d.h
---- linux-2.6.30.5.orig/drivers/net/wireless/rtl8187b/ieee80211/dot11d.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.30.5/drivers/net/wireless/rtl8187b/ieee80211/dot11d.h 2009-08-23 19:01:04.000000000 +0200
-@@ -0,0 +1,102 @@
-+#ifndef __INC_DOT11D_H
-+#define __INC_DOT11D_H
-+
-+#include "ieee80211.h"
-+
-+//#define ENABLE_DOT11D
-+
-+//#define DOT11D_MAX_CHNL_NUM 83
-+
-+typedef struct _CHNL_TXPOWER_TRIPLE {
-+ u8 FirstChnl;
-+ u8 NumChnls;
-+ u8 MaxTxPowerInDbm;
-+}CHNL_TXPOWER_TRIPLE, *PCHNL_TXPOWER_TRIPLE;
-+
-+typedef enum _DOT11D_STATE {
-+ DOT11D_STATE_NONE = 0,
-+ DOT11D_STATE_LEARNED,
-+ DOT11D_STATE_DONE,
-+}DOT11D_STATE;
-+
-+typedef struct _RT_DOT11D_INFO {
-+ //DECLARE_RT_OBJECT(RT_DOT11D_INFO);
-+
-+ bool bEnabled; // dot11MultiDomainCapabilityEnabled
-+
-+ u16 CountryIeLen; // > 0 if CountryIeBuf[] contains valid country information element.
-+ u8 CountryIeBuf[MAX_IE_LEN];
-+ u8 CountryIeSrcAddr[6]; // Source AP of the country IE.
-+ u8 CountryIeWatchdog;
-+
-+ u8 channel_map[MAX_CHANNEL_NUMBER+1]; //!!!Value 0: Invalid, 1: Valid (active scan), 2: Valid (passive scan)
-+ //u8 ChnlListLen; // #Bytes valid in ChnlList[].
-+ //u8 ChnlList[DOT11D_MAX_CHNL_NUM];
-+ u8 MaxTxPwrDbmList[MAX_CHANNEL_NUMBER+1];
-+
-+ DOT11D_STATE State;
-+}RT_DOT11D_INFO, *PRT_DOT11D_INFO;
-+#define eqMacAddr(a,b) ( ((a)[0]==(b)[0] && (a)[1]==(b)[1] && (a)[2]==(b)[2] && (a)[3]==(b)[3] && (a)[4]==(b)[4] && (a)[5]==(b)[5]) ? 1:0 )
-+#define cpMacAddr(des,src) ((des)[0]=(src)[0],(des)[1]=(src)[1],(des)[2]=(src)[2],(des)[3]=(src)[3],(des)[4]=(src)[4],(des)[5]=(src)[5])
-+#define GET_DOT11D_INFO(__pIeeeDev) ((PRT_DOT11D_INFO)((__pIeeeDev)->pDot11dInfo))
-+
-+#define IS_DOT11D_ENABLE(__pIeeeDev) GET_DOT11D_INFO(__pIeeeDev)->bEnabled
-+#define IS_COUNTRY_IE_VALID(__pIeeeDev) (GET_DOT11D_INFO(__pIeeeDev)->CountryIeLen > 0)
-+
-+#define IS_EQUAL_CIE_SRC(__pIeeeDev, __pTa) eqMacAddr(GET_DOT11D_INFO(__pIeeeDev)->CountryIeSrcAddr, __pTa)
-+#define UPDATE_CIE_SRC(__pIeeeDev, __pTa) cpMacAddr(GET_DOT11D_INFO(__pIeeeDev)->CountryIeSrcAddr, __pTa)
-+
-+#define IS_COUNTRY_IE_CHANGED(__pIeeeDev, __Ie) \
-+ (((__Ie).Length == 0 || (__Ie).Length != GET_DOT11D_INFO(__pIeeeDev)->CountryIeLen) ? \
-+ FALSE : \
-+ (!memcmp(GET_DOT11D_INFO(__pIeeeDev)->CountryIeBuf, (__Ie).Octet, (__Ie).Length)))
-+
-+#define CIE_WATCHDOG_TH 1
-+#define GET_CIE_WATCHDOG(__pIeeeDev) GET_DOT11D_INFO(__pIeeeDev)->CountryIeWatchdog
-+#define RESET_CIE_WATCHDOG(__pIeeeDev) GET_CIE_WATCHDOG(__pIeeeDev) = 0
-+#define UPDATE_CIE_WATCHDOG(__pIeeeDev) ++GET_CIE_WATCHDOG(__pIeeeDev)
-+
-+#define IS_DOT11D_STATE_DONE(__pIeeeDev) (GET_DOT11D_INFO(__pIeeeDev)->State == DOT11D_STATE_DONE)
-+
-+
-+void
-+Dot11d_Init(
-+ struct ieee80211_device *dev
-+ );
-+
-+void
-+Dot11d_Reset(
-+ struct ieee80211_device *dev
-+ );
-+
-+void
-+Dot11d_UpdateCountryIe(
-+ struct ieee80211_device *dev,
-+ u8 * pTaddr,
-+ u16 CoutryIeLen,
-+ u8 * pCoutryIe
-+ );
-+
-+u8
-+DOT11D_GetMaxTxPwrInDbm(
-+ struct ieee80211_device *dev,
-+ u8 Channel
-+ );
-+
-+void
-+DOT11D_ScanComplete(
-+ struct ieee80211_device * dev
-+ );
-+
-+int IsLegalChannel(
-+ struct ieee80211_device * dev,
-+ u8 channel
-+);
-+
-+int ToLegalChannel(
-+ struct ieee80211_device * dev,
-+ u8 channel
-+);
-+
-+void dump_chnl_map(u8 * channel_map);
-+#endif // #ifndef __INC_DOT11D_H
-diff -Nur linux-2.6.30.5.orig/drivers/net/wireless/rtl8187b/ieee80211/ieee80211_crypt.c linux-2.6.30.5/drivers/net/wireless/rtl8187b/ieee80211/ieee80211_crypt.c
---- linux-2.6.30.5.orig/drivers/net/wireless/rtl8187b/ieee80211/ieee80211_crypt.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.30.5/drivers/net/wireless/rtl8187b/ieee80211/ieee80211_crypt.c 2009-08-23 19:01:04.000000000 +0200
-@@ -0,0 +1,275 @@
-+/*
-+ * Host AP crypto routines
-+ *
-+ * Copyright (c) 2002-2003, Jouni Malinen <jkmaline@cc.hut.fi>
-+ * Portions Copyright (C) 2004, Intel Corporation <jketreno@linux.intel.com>
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License version 2 as
-+ * published by the Free Software Foundation. See README and COPYING for
-+ * more details.
-+ *
-+ */
-+
-+//#include <linux/config.h>
-+#include <linux/version.h>
-+#include <linux/module.h>
-+#include <linux/init.h>
-+#include <linux/slab.h>
-+#include <asm/string.h>
-+#include <asm/errno.h>
-+
-+#include "ieee80211.h"
-+
-+MODULE_AUTHOR("Jouni Malinen");
-+MODULE_DESCRIPTION("HostAP crypto");
-+MODULE_LICENSE("GPL");
-+
-+struct ieee80211_crypto_alg {
-+ struct list_head list;
-+ struct ieee80211_crypto_ops *ops;
-+};
-+
-+
-+struct ieee80211_crypto {
-+ struct list_head algs;
-+ spinlock_t lock;
-+};
-+
-+static struct ieee80211_crypto *hcrypt;
-+
-+void ieee80211_crypt_deinit_entries(struct ieee80211_device *ieee,
-+ int force)
-+{
-+ struct list_head *ptr, *n;
-+ struct ieee80211_crypt_data *entry;
-+
-+ for (ptr = ieee->crypt_deinit_list.next, n = ptr->next;
-+ ptr != &ieee->crypt_deinit_list; ptr = n, n = ptr->next) {
-+ entry = list_entry(ptr, struct ieee80211_crypt_data, list);
-+
-+ if (atomic_read(&entry->refcnt) != 0 && !force)
-+ continue;
-+
-+ list_del(ptr);
-+
-+ if (entry->ops) {
-+ entry->ops->deinit(entry->priv);
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
-+ module_put(entry->ops->owner);
-+#else
-+ __MOD_DEC_USE_COUNT(entry->ops->owner);
-+#endif
-+ }
-+ kfree(entry);
-+ }
-+}
-+
-+void ieee80211_crypt_deinit_handler(unsigned long data)
-+{
-+ struct ieee80211_device *ieee = (struct ieee80211_device *)data;
-+ unsigned long flags;
-+
-+ spin_lock_irqsave(&ieee->lock, flags);
-+ ieee80211_crypt_deinit_entries(ieee, 0);
-+ if (!list_empty(&ieee->crypt_deinit_list)) {
-+ printk(KERN_DEBUG "%s: entries remaining in delayed crypt "
-+ "deletion list\n", ieee->dev->name);
-+ ieee->crypt_deinit_timer.expires = jiffies + HZ;
-+ add_timer(&ieee->crypt_deinit_timer);
-+ }
-+ spin_unlock_irqrestore(&ieee->lock, flags);
-+
-+}
-+
-+void ieee80211_crypt_delayed_deinit(struct ieee80211_device *ieee,
-+ struct ieee80211_crypt_data **crypt)
-+{
-+ struct ieee80211_crypt_data *tmp;
-+ unsigned long flags;
-+
-+ if (*crypt == NULL)
-+ return;
-+
-+ tmp = *crypt;
-+ *crypt = NULL;
-+
-+ /* must not run ops->deinit() while there may be pending encrypt or
-+ * decrypt operations. Use a list of delayed deinits to avoid needing
-+ * locking. */
-+
-+ spin_lock_irqsave(&ieee->lock, flags);
-+ list_add(&tmp->list, &ieee->crypt_deinit_list);
-+ if (!timer_pending(&ieee->crypt_deinit_timer)) {
-+ ieee->crypt_deinit_timer.expires = jiffies + HZ;
-+ add_timer(&ieee->crypt_deinit_timer);
-+ }
-+ spin_unlock_irqrestore(&ieee->lock, flags);
-+}
-+
-+int ieee80211_register_crypto_ops(struct ieee80211_crypto_ops *ops)
-+{
-+ unsigned long flags;
-+ struct ieee80211_crypto_alg *alg;
-+
-+ if (hcrypt == NULL)
-+ return -1;
-+
-+ alg = kmalloc(sizeof(*alg), GFP_KERNEL);
-+ if (alg == NULL)
-+ return -ENOMEM;
-+
-+ memset(alg, 0, sizeof(*alg));
-+ alg->ops = ops;
-+
-+ spin_lock_irqsave(&hcrypt->lock, flags);
-+ list_add(&alg->list, &hcrypt->algs);
-+ spin_unlock_irqrestore(&hcrypt->lock, flags);
-+
-+ printk(KERN_DEBUG "ieee80211_crypt: registered algorithm '%s'\n",
-+ ops->name);
-+
-+ return 0;
-+}
-+
-+int ieee80211_unregister_crypto_ops(struct ieee80211_crypto_ops *ops)
-+{
-+ unsigned long flags;
-+ struct list_head *ptr;
-+ struct ieee80211_crypto_alg *del_alg = NULL;
-+
-+ if (hcrypt == NULL)
-+ return -1;
-+
-+ spin_lock_irqsave(&hcrypt->lock, flags);
-+ for (ptr = hcrypt->algs.next; ptr != &hcrypt->algs; ptr = ptr->next) {
-+ struct ieee80211_crypto_alg *alg =
-+ (struct ieee80211_crypto_alg *) ptr;
-+ if (alg->ops == ops) {
-+ list_del(&alg->list);
-+ del_alg = alg;
-+ break;
-+ }
-+ }
-+ spin_unlock_irqrestore(&hcrypt->lock, flags);
-+
-+ if (del_alg) {
-+ printk(KERN_DEBUG "ieee80211_crypt: unregistered algorithm "
-+ "'%s'\n", ops->name);
-+ kfree(del_alg);
-+ }
-+
-+ return del_alg ? 0 : -1;
-+}
-+
-+
-+struct ieee80211_crypto_ops * ieee80211_get_crypto_ops(const char *name)
-+{
-+ unsigned long flags;
-+ struct list_head *ptr;
-+ struct ieee80211_crypto_alg *found_alg = NULL;
-+
-+ if (hcrypt == NULL)
-+ return NULL;
-+
-+ spin_lock_irqsave(&hcrypt->lock, flags);
-+ for (ptr = hcrypt->algs.next; ptr != &hcrypt->algs; ptr = ptr->next) {
-+ struct ieee80211_crypto_alg *alg =
-+ (struct ieee80211_crypto_alg *) ptr;
-+ if (strcmp(alg->ops->name, name) == 0) {
-+ found_alg = alg;
-+ break;
-+ }
-+ }
-+ spin_unlock_irqrestore(&hcrypt->lock, flags);
-+
-+ if (found_alg)
-+ return found_alg->ops;
-+ else
-+ return NULL;
-+}
-+
-+
-+static void * ieee80211_crypt_null_init(int keyidx) { return (void *) 1; }
-+static void ieee80211_crypt_null_deinit(void *priv) {}
-+
-+static struct ieee80211_crypto_ops ieee80211_crypt_null = {
-+ .name = "NULL",
-+ .init = ieee80211_crypt_null_init,
-+ .deinit = ieee80211_crypt_null_deinit,
-+ .encrypt_mpdu = NULL,
-+ .decrypt_mpdu = NULL,
-+ .encrypt_msdu = NULL,
-+ .decrypt_msdu = NULL,
-+ .set_key = NULL,
-+ .get_key = NULL,
-+ .extra_prefix_len = 0,
-+ .extra_postfix_len = 0,
-+ .owner = THIS_MODULE,
-+};
-+
-+
-+int __init ieee80211_crypto_init(void)
-+{
-+ int ret = -ENOMEM;
-+
-+ hcrypt = kmalloc(sizeof(*hcrypt), GFP_KERNEL);
-+ if (!hcrypt)
-+ goto out;
-+
-+ memset(hcrypt, 0, sizeof(*hcrypt));
-+ INIT_LIST_HEAD(&hcrypt->algs);
-+ spin_lock_init(&hcrypt->lock);
-+
-+ ret = ieee80211_register_crypto_ops(&ieee80211_crypt_null);
-+ if (ret < 0) {
-+ kfree(hcrypt);
-+ hcrypt = NULL;
-+ }
-+out:
-+ return ret;
-+}
-+
-+
-+void __exit ieee80211_crypto_deinit(void)
-+{
-+ struct list_head *ptr, *n;
-+
-+ if (hcrypt == NULL)
-+ return;
-+
-+ for (ptr = hcrypt->algs.next, n = ptr->next; ptr != &hcrypt->algs;
-+ ptr = n, n = ptr->next) {
-+ struct ieee80211_crypto_alg *alg =
-+ (struct ieee80211_crypto_alg *) ptr;
-+ list_del(ptr);
-+ printk(KERN_DEBUG "ieee80211_crypt: unregistered algorithm "
-+ "'%s' (deinit)\n", alg->ops->name);
-+ kfree(alg);
-+ }
-+
-+ kfree(hcrypt);
-+}
-+
-+#if 0
-+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0))
-+EXPORT_SYMBOL(ieee80211_crypt_deinit_entries);
-+EXPORT_SYMBOL(ieee80211_crypt_deinit_handler);
-+EXPORT_SYMBOL(ieee80211_crypt_delayed_deinit);
-+
-+EXPORT_SYMBOL(ieee80211_register_crypto_ops);
-+EXPORT_SYMBOL(ieee80211_unregister_crypto_ops);
-+EXPORT_SYMBOL(ieee80211_get_crypto_ops);
-+#else
-+EXPORT_SYMBOL_NOVERS(ieee80211_crypt_deinit_entries);
-+EXPORT_SYMBOL_NOVERS(ieee80211_crypt_deinit_handler);
-+EXPORT_SYMBOL_NOVERS(ieee80211_crypt_delayed_deinit);
-+
-+EXPORT_SYMBOL_NOVERS(ieee80211_register_crypto_ops);
-+EXPORT_SYMBOL_NOVERS(ieee80211_unregister_crypto_ops);
-+EXPORT_SYMBOL_NOVERS(ieee80211_get_crypto_ops);
-+#endif
-+
-+module_init(ieee80211_crypto_init);
-+module_exit(ieee80211_crypto_deinit);
-+#endif
-diff -Nur linux-2.6.30.5.orig/drivers/net/wireless/rtl8187b/ieee80211/ieee80211_crypt_ccmp.c linux-2.6.30.5/drivers/net/wireless/rtl8187b/ieee80211/ieee80211_crypt_ccmp.c
---- linux-2.6.30.5.orig/drivers/net/wireless/rtl8187b/ieee80211/ieee80211_crypt_ccmp.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.30.5/drivers/net/wireless/rtl8187b/ieee80211/ieee80211_crypt_ccmp.c 2009-08-23 19:01:04.000000000 +0200
-@@ -0,0 +1,524 @@
-+/*
-+ * Host AP crypt: host-based CCMP encryption implementation for Host AP driver
-+ *
-+ * Copyright (c) 2003-2004, Jouni Malinen <jkmaline@cc.hut.fi>
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License version 2 as
-+ * published by the Free Software Foundation. See README and COPYING for
-+ * more details.
-+ */
-+
-+//#include <linux/config.h>
-+#include <linux/version.h>
-+#include <linux/module.h>
-+#include <linux/init.h>
-+#include <linux/slab.h>
-+#include <linux/random.h>
-+#include <linux/skbuff.h>
-+#include <linux/netdevice.h>
-+#include <linux/if_ether.h>
-+#include <linux/if_arp.h>
-+#include <asm/string.h>
-+#include <linux/wireless.h>
-+
-+#include "ieee80211.h"
-+
-+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0))
-+#include "rtl_crypto.h"
-+#else
-+#include <linux/crypto.h>
-+#endif
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20)
-+ #include <asm/scatterlist.h>
-+#else
-+ #include <linux/scatterlist.h>
-+#endif
-+
-+//#include <asm/scatterlist.h>
-+
-+MODULE_AUTHOR("Jouni Malinen");
-+MODULE_DESCRIPTION("Host AP crypt: CCMP");
-+MODULE_LICENSE("GPL");
-+
-+#define AES_BLOCK_LEN 16
-+#define CCMP_HDR_LEN 8
-+#define CCMP_MIC_LEN 8
-+#define CCMP_TK_LEN 16
-+#define CCMP_PN_LEN 6
-+
-+struct ieee80211_ccmp_data {
-+ u8 key[CCMP_TK_LEN];
-+ int key_set;
-+
-+ u8 tx_pn[CCMP_PN_LEN];
-+ u8 rx_pn[CCMP_PN_LEN];
-+
-+ u32 dot11RSNAStatsCCMPFormatErrors;
-+ u32 dot11RSNAStatsCCMPReplays;
-+ u32 dot11RSNAStatsCCMPDecryptErrors;
-+
-+ int key_idx;
-+
-+ struct crypto_tfm *tfm;
-+
-+ /* scratch buffers for virt_to_page() (crypto API) */
-+ u8 tx_b0[AES_BLOCK_LEN], tx_b[AES_BLOCK_LEN],
-+ tx_e[AES_BLOCK_LEN], tx_s0[AES_BLOCK_LEN];
-+ u8 rx_b0[AES_BLOCK_LEN], rx_b[AES_BLOCK_LEN], rx_a[AES_BLOCK_LEN];
-+};
-+
-+void ieee80211_ccmp_aes_encrypt(struct crypto_tfm *tfm,
-+ const u8 pt[16], u8 ct[16])
-+{
-+ #if(LINUX_VERSION_CODE < KERNEL_VERSION(2,6,21))
-+ struct scatterlist src, dst;
-+
-+ src.page = virt_to_page(pt);
-+ src.offset = offset_in_page(pt);
-+ src.length = AES_BLOCK_LEN;
-+
-+ dst.page = virt_to_page(ct);
-+ dst.offset = offset_in_page(ct);
-+ dst.length = AES_BLOCK_LEN;
-+
-+ crypto_cipher_encrypt(tfm, &dst, &src, AES_BLOCK_LEN);
-+ #else
-+ crypto_cipher_encrypt_one((void*)tfm, ct, pt);
-+ #endif
-+}
-+
-+static void * ieee80211_ccmp_init(int key_idx)
-+{
-+ struct ieee80211_ccmp_data *priv;
-+
-+ priv = kmalloc(sizeof(*priv), GFP_ATOMIC);
-+ if (priv == NULL)
-+ goto fail;
-+ memset(priv, 0, sizeof(*priv));
-+ priv->key_idx = key_idx;
-+
-+ #if(LINUX_VERSION_CODE < KERNEL_VERSION(2,6,21))
-+ priv->tfm = crypto_alloc_tfm("aes", 0);
-+ if (priv->tfm == NULL) {
-+ printk(KERN_DEBUG "ieee80211_crypt_ccmp: could not allocate "
-+ "crypto API aes\n");
-+ goto fail;
-+ }
-+ #else
-+ priv->tfm = (void*)crypto_alloc_cipher("aes", 0, CRYPTO_ALG_ASYNC);
-+ if (IS_ERR(priv->tfm)) {
-+ printk(KERN_DEBUG "ieee80211_crypt_ccmp: could not allocate "
-+ "crypto API aes\n");
-+ priv->tfm = NULL;
-+ goto fail;
-+ }
-+ #endif
-+ return priv;
-+
-+fail:
-+ if (priv) {
-+ if (priv->tfm)
-+ #if(LINUX_VERSION_CODE < KERNEL_VERSION(2,6,21))
-+ crypto_free_tfm(priv->tfm);
-+ #else
-+ crypto_free_cipher((void*)priv->tfm);
-+ #endif
-+ kfree(priv);
-+ }
-+
-+ return NULL;
-+}
-+
-+
-+static void ieee80211_ccmp_deinit(void *priv)
-+{
-+ struct ieee80211_ccmp_data *_priv = priv;
-+ if (_priv && _priv->tfm)
-+ #if(LINUX_VERSION_CODE < KERNEL_VERSION(2,6,21))
-+ crypto_free_tfm(_priv->tfm);
-+ #else
-+ crypto_free_cipher((void*)_priv->tfm);
-+ #endif
-+ kfree(priv);
-+}
-+
-+
-+static inline void xor_block(u8 *b, u8 *a, size_t len)
-+{
-+ int i;
-+ for (i = 0; i < len; i++)
-+ b[i] ^= a[i];
-+}
-+
-+#ifndef JOHN_CCMP
-+static void ccmp_init_blocks(struct crypto_tfm *tfm,
-+ struct ieee80211_hdr *hdr,
-+ u8 *pn, size_t dlen, u8 *b0, u8 *auth,
-+ u8 *s0)
-+{
-+ u8 *pos, qc = 0;
-+ size_t aad_len;
-+ u16 fc;
-+ int a4_included, qc_included;
-+ u8 aad[2 * AES_BLOCK_LEN];
-+
-+ fc = le16_to_cpu(hdr->frame_ctl);
-+ a4_included = ((fc & (IEEE80211_FCTL_TODS | IEEE80211_FCTL_FROMDS)) ==
-+ (IEEE80211_FCTL_TODS | IEEE80211_FCTL_FROMDS));
-+ /*
-+ qc_included = ((WLAN_FC_GET_TYPE(fc) == IEEE80211_FTYPE_DATA) &&
-+ (WLAN_FC_GET_STYPE(fc) & 0x08));
-+ */
-+ // fixed by David :2006.9.6
-+ qc_included = ((WLAN_FC_GET_TYPE(fc) == IEEE80211_FTYPE_DATA) &&
-+ (WLAN_FC_GET_STYPE(fc) & 0x80));
-+ aad_len = 22;
-+ if (a4_included)
-+ aad_len += 6;
-+ if (qc_included) {
-+ pos = (u8 *) &hdr->addr4;
-+ if (a4_included)
-+ pos += 6;
-+ qc = *pos & 0x0f;
-+ aad_len += 2;
-+ }
-+ /* CCM Initial Block:
-+ * Flag (Include authentication header, M=3 (8-octet MIC),
-+ * L=1 (2-octet Dlen))
-+ * Nonce: 0x00 | A2 | PN
-+ * Dlen */
-+ b0[0] = 0x59;
-+ b0[1] = qc;
-+ memcpy(b0 + 2, hdr->addr2, ETH_ALEN);
-+ memcpy(b0 + 8, pn, CCMP_PN_LEN);
-+ b0[14] = (dlen >> 8) & 0xff;
-+ b0[15] = dlen & 0xff;
-+
-+ /* AAD:
-+ * FC with bits 4..6 and 11..13 masked to zero; 14 is always one
-+ * A1 | A2 | A3
-+ * SC with bits 4..15 (seq#) masked to zero
-+ * A4 (if present)
-+ * QC (if present)
-+ */
-+ pos = (u8 *) hdr;
-+ aad[0] = 0; /* aad_len >> 8 */
-+ aad[1] = aad_len & 0xff;
-+ aad[2] = pos[0] & 0x8f;
-+ aad[3] = pos[1] & 0xc7;
-+ memcpy(aad + 4, hdr->addr1, 3 * ETH_ALEN);
-+ pos = (u8 *) &hdr->seq_ctl;
-+ aad[22] = pos[0] & 0x0f;
-+ aad[23] = 0; /* all bits masked */
-+ memset(aad + 24, 0, 8);
-+ if (a4_included)
-+ memcpy(aad + 24, hdr->addr4, ETH_ALEN);
-+ if (qc_included) {
-+ aad[a4_included ? 30 : 24] = qc;
-+ /* rest of QC masked */
-+ }
-+
-+ /* Start with the first block and AAD */
-+ ieee80211_ccmp_aes_encrypt(tfm, b0, auth);
-+ xor_block(auth, aad, AES_BLOCK_LEN);
-+ ieee80211_ccmp_aes_encrypt(tfm, auth, auth);
-+ xor_block(auth, &aad[AES_BLOCK_LEN], AES_BLOCK_LEN);
-+ ieee80211_ccmp_aes_encrypt(tfm, auth, auth);
-+ b0[0] &= 0x07;
-+ b0[14] = b0[15] = 0;
-+ ieee80211_ccmp_aes_encrypt(tfm, b0, s0);
-+}
-+#endif
-+
-+static int ieee80211_ccmp_encrypt(struct sk_buff *skb, int hdr_len, void *priv)
-+{
-+ struct ieee80211_ccmp_data *key = priv;
-+ int data_len, i;
-+ u8 *pos;
-+ struct ieee80211_hdr *hdr;
-+#ifndef JOHN_CCMP
-+ int blocks, last, len;
-+ u8 *mic;
-+ u8 *b0 = key->tx_b0;
-+ u8 *b = key->tx_b;
-+ u8 *e = key->tx_e;
-+ u8 *s0 = key->tx_s0;
-+#endif
-+ if (skb_headroom(skb) < CCMP_HDR_LEN ||
-+ skb_tailroom(skb) < CCMP_MIC_LEN ||
-+ skb->len < hdr_len)
-+ return -1;
-+
-+ data_len = skb->len - hdr_len;
-+ pos = skb_push(skb, CCMP_HDR_LEN);
-+ memmove(pos, pos + CCMP_HDR_LEN, hdr_len);
-+ pos += hdr_len;
-+// mic = skb_put(skb, CCMP_MIC_LEN);
-+
-+ i = CCMP_PN_LEN - 1;
-+ while (i >= 0) {
-+ key->tx_pn[i]++;
-+ if (key->tx_pn[i] != 0)
-+ break;
-+ i--;
-+ }
-+
-+ *pos++ = key->tx_pn[5];
-+ *pos++ = key->tx_pn[4];
-+ *pos++ = 0;
-+ *pos++ = (key->key_idx << 6) | (1 << 5) /* Ext IV included */;
-+ *pos++ = key->tx_pn[3];
-+ *pos++ = key->tx_pn[2];
-+ *pos++ = key->tx_pn[1];
-+ *pos++ = key->tx_pn[0];
-+
-+ hdr = (struct ieee80211_hdr *) skb->data;
-+#ifndef JOHN_CCMP
-+ //mic is moved to here by john
-+ mic = skb_put(skb, CCMP_MIC_LEN);
-+
-+ ccmp_init_blocks(key->tfm, hdr, key->tx_pn, data_len, b0, b, s0);
-+
-+ blocks = (data_len + AES_BLOCK_LEN - 1) / AES_BLOCK_LEN;
-+ last = data_len % AES_BLOCK_LEN;
-+
-+ for (i = 1; i <= blocks; i++) {
-+ len = (i == blocks && last) ? last : AES_BLOCK_LEN;
-+ /* Authentication */
-+ xor_block(b, pos, len);
-+ ieee80211_ccmp_aes_encrypt(key->tfm, b, b);
-+ /* Encryption, with counter */
-+ b0[14] = (i >> 8) & 0xff;
-+ b0[15] = i & 0xff;
-+ ieee80211_ccmp_aes_encrypt(key->tfm, b0, e);
-+ xor_block(pos, e, len);
-+ pos += len;
-+ }
-+
-+ for (i = 0; i < CCMP_MIC_LEN; i++)
-+ mic[i] = b[i] ^ s0[i];
-+#endif
-+ return 0;
-+}
-+
-+
-+static int ieee80211_ccmp_decrypt(struct sk_buff *skb, int hdr_len, void *priv)
-+{
-+ struct ieee80211_ccmp_data *key = priv;
-+ u8 keyidx, *pos;
-+ struct ieee80211_hdr *hdr;
-+ u8 pn[6];
-+#ifndef JOHN_CCMP
-+ size_t data_len = skb->len - hdr_len - CCMP_HDR_LEN - CCMP_MIC_LEN;
-+ u8 *mic = skb->data + skb->len - CCMP_MIC_LEN;
-+ u8 *b0 = key->rx_b0;
-+ u8 *b = key->rx_b;
-+ u8 *a = key->rx_a;
-+ int i, blocks, last, len;
-+#endif
-+ if (skb->len < hdr_len + CCMP_HDR_LEN + CCMP_MIC_LEN) {
-+ key->dot11RSNAStatsCCMPFormatErrors++;
-+ return -1;
-+ }
-+
-+ hdr = (struct ieee80211_hdr *) skb->data;
-+ pos = skb->data + hdr_len;
-+ keyidx = pos[3];
-+ if (!(keyidx & (1 << 5))) {
-+ if (net_ratelimit()) {
-+ printk(KERN_DEBUG "CCMP: received packet without ExtIV"
-+ " flag from " MAC_FMT "\n", MAC_ARG(hdr->addr2));
-+ }
-+ key->dot11RSNAStatsCCMPFormatErrors++;
-+ return -2;
-+ }
-+ keyidx >>= 6;
-+ if (key->key_idx != keyidx) {
-+ printk(KERN_DEBUG "CCMP: RX tkey->key_idx=%d frame "
-+ "keyidx=%d priv=%p\n", key->key_idx, keyidx, priv);
-+ return -6;
-+ }
-+ if (!key->key_set) {
-+ if (net_ratelimit()) {
-+ printk(KERN_DEBUG "CCMP: received packet from " MAC_FMT
-+ " with keyid=%d that does not have a configured"
-+ " key\n", MAC_ARG(hdr->addr2), keyidx);
-+ }
-+ return -3;
-+ }
-+
-+ pn[0] = pos[7];
-+ pn[1] = pos[6];
-+ pn[2] = pos[5];
-+ pn[3] = pos[4];
-+ pn[4] = pos[1];
-+ pn[5] = pos[0];
-+ pos += 8;
-+#if 0
-+ if (memcmp(pn, key->rx_pn, CCMP_PN_LEN) <= 0) {
-+ if (net_ratelimit()) {
-+ printk(KERN_DEBUG "CCMP: replay detected: STA=" MAC_FMT
-+ " previous PN %02x%02x%02x%02x%02x%02x "
-+ "received PN %02x%02x%02x%02x%02x%02x\n",
-+ MAC_ARG(hdr->addr2), MAC_ARG(key->rx_pn),
-+ MAC_ARG(pn));
-+ }
-+ key->dot11RSNAStatsCCMPReplays++;
-+ return -4;
-+ }
-+#endif
-+#ifndef JOHN_CCMP
-+ ccmp_init_blocks(key->tfm, hdr, pn, data_len, b0, a, b);
-+ xor_block(mic, b, CCMP_MIC_LEN);
-+
-+ blocks = (data_len + AES_BLOCK_LEN - 1) / AES_BLOCK_LEN;
-+ last = data_len % AES_BLOCK_LEN;
-+
-+ for (i = 1; i <= blocks; i++) {
-+ len = (i == blocks && last) ? last : AES_BLOCK_LEN;
-+ /* Decrypt, with counter */
-+ b0[14] = (i >> 8) & 0xff;
-+ b0[15] = i & 0xff;
-+ ieee80211_ccmp_aes_encrypt(key->tfm, b0, b);
-+ xor_block(pos, b, len);
-+ /* Authentication */
-+ xor_block(a, pos, len);
-+ ieee80211_ccmp_aes_encrypt(key->tfm, a, a);
-+ pos += len;
-+ }
-+
-+ if (memcmp(mic, a, CCMP_MIC_LEN) != 0) {
-+ if (net_ratelimit()) {
-+ printk(KERN_DEBUG "CCMP: decrypt failed: STA="
-+ MAC_FMT "\n", MAC_ARG(hdr->addr2));
-+ }
-+ key->dot11RSNAStatsCCMPDecryptErrors++;
-+ return -5;
-+ }
-+
-+ memcpy(key->rx_pn, pn, CCMP_PN_LEN);
-+
-+#endif
-+ /* Remove hdr and MIC */
-+ memmove(skb->data + CCMP_HDR_LEN, skb->data, hdr_len);
-+ skb_pull(skb, CCMP_HDR_LEN);
-+ skb_trim(skb, skb->len - CCMP_MIC_LEN);
-+
-+ return keyidx;
-+}
-+
-+
-+static int ieee80211_ccmp_set_key(void *key, int len, u8 *seq, void *priv)
-+{
-+ struct ieee80211_ccmp_data *data = priv;
-+ int keyidx;
-+ struct crypto_tfm *tfm = data->tfm;
-+
-+ keyidx = data->key_idx;
-+ memset(data, 0, sizeof(*data));
-+ data->key_idx = keyidx;
-+ data->tfm = tfm;
-+ if (len == CCMP_TK_LEN) {
-+ memcpy(data->key, key, CCMP_TK_LEN);
-+ data->key_set = 1;
-+ if (seq) {
-+ data->rx_pn[0] = seq[5];
-+ data->rx_pn[1] = seq[4];
-+ data->rx_pn[2] = seq[3];
-+ data->rx_pn[3] = seq[2];
-+ data->rx_pn[4] = seq[1];
-+ data->rx_pn[5] = seq[0];
-+ }
-+ crypto_cipher_setkey((void*)data->tfm, data->key, CCMP_TK_LEN);
-+ } else if (len == 0)
-+ data->key_set = 0;
-+ else
-+ return -1;
-+
-+ return 0;
-+}
-+
-+
-+static int ieee80211_ccmp_get_key(void *key, int len, u8 *seq, void *priv)
-+{
-+ struct ieee80211_ccmp_data *data = priv;
-+
-+ if (len < CCMP_TK_LEN)
-+ return -1;
-+
-+ if (!data->key_set)
-+ return 0;
-+ memcpy(key, data->key, CCMP_TK_LEN);
-+
-+ if (seq) {
-+ seq[0] = data->tx_pn[5];
-+ seq[1] = data->tx_pn[4];
-+ seq[2] = data->tx_pn[3];
-+ seq[3] = data->tx_pn[2];
-+ seq[4] = data->tx_pn[1];
-+ seq[5] = data->tx_pn[0];
-+ }
-+
-+ return CCMP_TK_LEN;
-+}
-+
-+
-+static char * ieee80211_ccmp_print_stats(char *p, void *priv)
-+{
-+ struct ieee80211_ccmp_data *ccmp = priv;
-+ p += sprintf(p, "key[%d] alg=CCMP key_set=%d "
-+ "tx_pn=%02x%02x%02x%02x%02x%02x "
-+ "rx_pn=%02x%02x%02x%02x%02x%02x "
-+ "format_errors=%d replays=%d decrypt_errors=%d\n",
-+ ccmp->key_idx, ccmp->key_set,
-+ MAC_ARG(ccmp->tx_pn), MAC_ARG(ccmp->rx_pn),
-+ ccmp->dot11RSNAStatsCCMPFormatErrors,
-+ ccmp->dot11RSNAStatsCCMPReplays,
-+ ccmp->dot11RSNAStatsCCMPDecryptErrors);
-+
-+ return p;
-+}
-+
-+void ieee80211_ccmp_null(void)
-+{
-+ // printk("============>%s()\n", __FUNCTION__);
-+ return;
-+}
-+static struct ieee80211_crypto_ops ieee80211_crypt_ccmp = {
-+ .name = "CCMP",
-+ .init = ieee80211_ccmp_init,
-+ .deinit = ieee80211_ccmp_deinit,
-+ .encrypt_mpdu = ieee80211_ccmp_encrypt,
-+ .decrypt_mpdu = ieee80211_ccmp_decrypt,
-+ .encrypt_msdu = NULL,
-+ .decrypt_msdu = NULL,
-+ .set_key = ieee80211_ccmp_set_key,
-+ .get_key = ieee80211_ccmp_get_key,
-+ .print_stats = ieee80211_ccmp_print_stats,
-+ .extra_prefix_len = CCMP_HDR_LEN,
-+ .extra_postfix_len = CCMP_MIC_LEN,
-+ .owner = THIS_MODULE,
-+};
-+
-+
-+int __init ieee80211_crypto_ccmp_init(void)
-+{
-+ return ieee80211_register_crypto_ops(&ieee80211_crypt_ccmp);
-+}
-+
-+
-+void __exit ieee80211_crypto_ccmp_exit(void)
-+{
-+ ieee80211_unregister_crypto_ops(&ieee80211_crypt_ccmp);
-+}
-+#if 0
-+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0))
-+EXPORT_SYMBOL(ieee80211_ccmp_null);
-+#else
-+EXPORT_SYMBOL_NOVERS(ieee80211_ccmp_null);
-+#endif
-+
-+module_init(ieee80211_crypto_ccmp_init);
-+module_exit(ieee80211_crypto_ccmp_exit);
-+#endif
-diff -Nur linux-2.6.30.5.orig/drivers/net/wireless/rtl8187b/ieee80211/ieee80211_crypt.h linux-2.6.30.5/drivers/net/wireless/rtl8187b/ieee80211/ieee80211_crypt.h
---- linux-2.6.30.5.orig/drivers/net/wireless/rtl8187b/ieee80211/ieee80211_crypt.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.30.5/drivers/net/wireless/rtl8187b/ieee80211/ieee80211_crypt.h 2009-08-23 19:01:04.000000000 +0200
-@@ -0,0 +1,91 @@
-+/*
-+ * Original code based on Host AP (software wireless LAN access point) driver
-+ * for Intersil Prism2/2.5/3.
-+ *
-+ * Copyright (c) 2001-2002, SSH Communications Security Corp and Jouni Malinen
-+ * <jkmaline@cc.hut.fi>
-+ * Copyright (c) 2002-2003, Jouni Malinen <jkmaline@cc.hut.fi>
-+ *
-+ * Adaption to a generic IEEE 802.11 stack by James Ketrenos
-+ * <jketreno@linux.intel.com>
-+ *
-+ * Copyright (c) 2004, Intel Corporation
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License version 2 as
-+ * published by the Free Software Foundation. See README and COPYING for
-+ * more details.
-+ */
-+
-+/*
-+ * This file defines the interface to the ieee80211 crypto module.
-+ */
-+#ifndef IEEE80211_CRYPT_H
-+#define IEEE80211_CRYPT_H
-+
-+#include <linux/skbuff.h>
-+
-+struct ieee80211_crypto_ops {
-+ const char *name;
-+
-+ /* init new crypto context (e.g., allocate private data space,
-+ * select IV, etc.); returns NULL on failure or pointer to allocated
-+ * private data on success */
-+ void * (*init)(int keyidx);
-+
-+ /* deinitialize crypto context and free allocated private data */
-+ void (*deinit)(void *priv);
-+
-+ /* encrypt/decrypt return < 0 on error or >= 0 on success. The return
-+ * value from decrypt_mpdu is passed as the keyidx value for
-+ * decrypt_msdu. skb must have enough head and tail room for the
-+ * encryption; if not, error will be returned; these functions are
-+ * called for all MPDUs (i.e., fragments).
-+ */
-+ int (*encrypt_mpdu)(struct sk_buff *skb, int hdr_len, void *priv);
-+ int (*decrypt_mpdu)(struct sk_buff *skb, int hdr_len, void *priv);
-+
-+ /* These functions are called for full MSDUs, i.e. full frames.
-+ * These can be NULL if full MSDU operations are not needed. */
-+ int (*encrypt_msdu)(struct sk_buff *skb, int hdr_len, void *priv);
-+ int (*decrypt_msdu)(struct sk_buff *skb, int keyidx, int hdr_len,
-+ void *priv);
-+
-+ int (*set_key)(void *key, int len, u8 *seq, void *priv);
-+ int (*get_key)(void *key, int len, u8 *seq, void *priv);
-+
-+ /* procfs handler for printing out key information and possible
-+ * statistics */
-+ char * (*print_stats)(char *p, void *priv);
-+
-+ /* maximum number of bytes added by encryption; encrypt buf is
-+ * allocated with extra_prefix_len bytes, copy of in_buf, and
-+ * extra_postfix_len; encrypt need not use all this space, but
-+ * the result must start at the beginning of the buffer and correct
-+ * length must be returned */
-+ int extra_prefix_len, extra_postfix_len;
-+
-+ struct module *owner;
-+};
-+
-+struct ieee80211_crypt_data {
-+ struct list_head list; /* delayed deletion list */
-+ struct ieee80211_crypto_ops *ops;
-+ void *priv;
-+ atomic_t refcnt;
-+};
-+
-+int ieee80211_register_crypto_ops(struct ieee80211_crypto_ops *ops);
-+int ieee80211_unregister_crypto_ops(struct ieee80211_crypto_ops *ops);
-+struct ieee80211_crypto_ops * ieee80211_get_crypto_ops(const char *name);
-+void ieee80211_crypt_deinit_entries(struct ieee80211_device *, int);
-+void ieee80211_crypt_deinit_handler(unsigned long);
-+void ieee80211_crypt_delayed_deinit(struct ieee80211_device *ieee,
-+ struct ieee80211_crypt_data **crypt);
-+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0))
-+#define offset_in_page(p) ((unsigned long)(p) & ~PAGE_MASK)
-+#define crypto_alloc_tfm crypto_alloc_tfm_rtl
-+#define crypto_free_tfm crypto_free_tfm_rtl
-+#endif
-+
-+#endif
-diff -Nur linux-2.6.30.5.orig/drivers/net/wireless/rtl8187b/ieee80211/ieee80211_crypt_tkip.c linux-2.6.30.5/drivers/net/wireless/rtl8187b/ieee80211/ieee80211_crypt_tkip.c
---- linux-2.6.30.5.orig/drivers/net/wireless/rtl8187b/ieee80211/ieee80211_crypt_tkip.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.30.5/drivers/net/wireless/rtl8187b/ieee80211/ieee80211_crypt_tkip.c 2009-08-23 19:01:04.000000000 +0200
-@@ -0,0 +1,996 @@
-+/*
-+ * Host AP crypt: host-based TKIP encryption implementation for Host AP driver
-+ *
-+ * Copyright (c) 2003-2004, Jouni Malinen <jkmaline@cc.hut.fi>
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License version 2 as
-+ * published by the Free Software Foundation. See README and COPYING for
-+ * more details.
-+ */
-+
-+//#include <linux/config.h>
-+#include <linux/version.h>
-+#include <linux/module.h>
-+#include <linux/init.h>
-+#include <linux/slab.h>
-+#include <linux/random.h>
-+#include <linux/skbuff.h>
-+#include <linux/netdevice.h>
-+#include <linux/if_ether.h>
-+#include <linux/if_arp.h>
-+#include <asm/string.h>
-+
-+#include "ieee80211.h"
-+
-+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0))
-+#include "rtl_crypto.h"
-+#else
-+#include <linux/crypto.h>
-+#endif
-+//#include <asm/scatterlist.h>
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20)
-+ #include <asm/scatterlist.h>
-+#else
-+ #include <linux/scatterlist.h>
-+#endif
-+
-+#include <linux/crc32.h>
-+
-+MODULE_AUTHOR("Jouni Malinen");
-+MODULE_DESCRIPTION("Host AP crypt: TKIP");
-+MODULE_LICENSE("GPL");
-+
-+struct ieee80211_tkip_data {
-+#define TKIP_KEY_LEN 32
-+ u8 key[TKIP_KEY_LEN];
-+ int key_set;
-+
-+ u32 tx_iv32;
-+ u16 tx_iv16;
-+ u16 tx_ttak[5];
-+ int tx_phase1_done;
-+
-+ u32 rx_iv32;
-+ u16 rx_iv16;
-+ u16 rx_ttak[5];
-+ int rx_phase1_done;
-+ u32 rx_iv32_new;
-+ u16 rx_iv16_new;
-+
-+ u32 dot11RSNAStatsTKIPReplays;
-+ u32 dot11RSNAStatsTKIPICVErrors;
-+ u32 dot11RSNAStatsTKIPLocalMICFailures;
-+
-+ int key_idx;
-+
-+ #if(LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,21))
-+ struct crypto_blkcipher *rx_tfm_arc4;
-+ struct crypto_hash *rx_tfm_michael;
-+ struct crypto_blkcipher *tx_tfm_arc4;
-+ struct crypto_hash *tx_tfm_michael;
-+ #endif
-+
-+ struct crypto_tfm *tfm_arc4;
-+ struct crypto_tfm *tfm_michael;
-+
-+ /* scratch buffers for virt_to_page() (crypto API) */
-+ u8 rx_hdr[16], tx_hdr[16];
-+};
-+
-+static void * ieee80211_tkip_init(int key_idx)
-+{
-+ struct ieee80211_tkip_data *priv;
-+
-+ priv = kmalloc(sizeof(*priv), GFP_ATOMIC);
-+ if (priv == NULL)
-+ goto fail;
-+ memset(priv, 0, sizeof(*priv));
-+ priv->key_idx = key_idx;
-+
-+ #if(LINUX_VERSION_CODE < KERNEL_VERSION(2,6,21))
-+ priv->tfm_arc4 = crypto_alloc_tfm("arc4", 0);
-+ if (priv->tfm_arc4 == NULL) {
-+ printk(KERN_DEBUG "ieee80211_crypt_tkip: could not allocate "
-+ "crypto API arc4\n");
-+ goto fail;
-+ }
-+
-+ priv->tfm_michael = crypto_alloc_tfm("michael_mic", 0);
-+ if (priv->tfm_michael == NULL) {
-+ printk(KERN_DEBUG "ieee80211_crypt_tkip: could not allocate "
-+ "crypto API michael_mic\n");
-+ goto fail;
-+ }
-+
-+ #else
-+ priv->tx_tfm_arc4 = crypto_alloc_blkcipher("ecb(arc4)", 0,
-+ CRYPTO_ALG_ASYNC);
-+ if (IS_ERR(priv->tx_tfm_arc4)) {
-+ printk(KERN_DEBUG "ieee80211_crypt_tkip: could not allocate "
-+ "crypto API arc4\n");
-+ priv->tx_tfm_arc4 = NULL;
-+ goto fail;
-+ }
-+
-+ priv->tx_tfm_michael = crypto_alloc_hash("michael_mic", 0,
-+ CRYPTO_ALG_ASYNC);
-+ if (IS_ERR(priv->tx_tfm_michael)) {
-+ printk(KERN_DEBUG "ieee80211_crypt_tkip: could not allocate "
-+ "crypto API michael_mic\n");
-+ priv->tx_tfm_michael = NULL;
-+ goto fail;
-+ }
-+
-+ priv->rx_tfm_arc4 = crypto_alloc_blkcipher("ecb(arc4)", 0,
-+ CRYPTO_ALG_ASYNC);
-+ if (IS_ERR(priv->rx_tfm_arc4)) {
-+ printk(KERN_DEBUG "ieee80211_crypt_tkip: could not allocate "
-+ "crypto API arc4\n");
-+ priv->rx_tfm_arc4 = NULL;
-+ goto fail;
-+ }
-+
-+ priv->rx_tfm_michael = crypto_alloc_hash("michael_mic", 0,
-+ CRYPTO_ALG_ASYNC);
-+ if (IS_ERR(priv->rx_tfm_michael)) {
-+ printk(KERN_DEBUG "ieee80211_crypt_tkip: could not allocate "
-+ "crypto API michael_mic\n");
-+ priv->rx_tfm_michael = NULL;
-+ goto fail;
-+ }
-+ #endif
-+ return priv;
-+
-+fail:
-+ if (priv) {
-+ #if(LINUX_VERSION_CODE < KERNEL_VERSION(2,6,21))
-+ if (priv->tfm_michael)
-+ crypto_free_tfm(priv->tfm_michael);
-+ if (priv->tfm_arc4)
-+ crypto_free_tfm(priv->tfm_arc4);
-+ #else
-+ if (priv->tx_tfm_michael)
-+ crypto_free_hash(priv->tx_tfm_michael);
-+ if (priv->tx_tfm_arc4)
-+ crypto_free_blkcipher(priv->tx_tfm_arc4);
-+ if (priv->rx_tfm_michael)
-+ crypto_free_hash(priv->rx_tfm_michael);
-+ if (priv->rx_tfm_arc4)
-+ crypto_free_blkcipher(priv->rx_tfm_arc4);
-+ #endif
-+ kfree(priv);
-+ }
-+
-+ return NULL;
-+}
-+
-+
-+static void ieee80211_tkip_deinit(void *priv)
-+{
-+ struct ieee80211_tkip_data *_priv = priv;
-+ #if(LINUX_VERSION_CODE < KERNEL_VERSION(2,6,21))
-+ if (_priv && _priv->tfm_michael)
-+ crypto_free_tfm(_priv->tfm_michael);
-+ if (_priv && _priv->tfm_arc4)
-+ crypto_free_tfm(_priv->tfm_arc4);
-+ #else
-+ if (_priv) {
-+ if (_priv->tx_tfm_michael)
-+ crypto_free_hash(_priv->tx_tfm_michael);
-+ if (_priv->tx_tfm_arc4)
-+ crypto_free_blkcipher(_priv->tx_tfm_arc4);
-+ if (_priv->rx_tfm_michael)
-+ crypto_free_hash(_priv->rx_tfm_michael);
-+ if (_priv->rx_tfm_arc4)
-+ crypto_free_blkcipher(_priv->rx_tfm_arc4);
-+ }
-+ #endif
-+ kfree(priv);
-+}
-+
-+
-+static inline u16 RotR1(u16 val)
-+{
-+ return (val >> 1) | (val << 15);
-+}
-+
-+
-+static inline u8 Lo8(u16 val)
-+{
-+ return val & 0xff;
-+}
-+
-+
-+static inline u8 Hi8(u16 val)
-+{
-+ return val >> 8;
-+}
-+
-+
-+static inline u16 Lo16(u32 val)
-+{
-+ return val & 0xffff;
-+}
-+
-+
-+static inline u16 Hi16(u32 val)
-+{
-+ return val >> 16;
-+}
-+
-+
-+static inline u16 Mk16(u8 hi, u8 lo)
-+{
-+ return lo | (((u16) hi) << 8);
-+}
-+
-+
-+static inline u16 Mk16_le(u16 *v)
-+{
-+ return le16_to_cpu(*v);
-+}
-+
-+
-+static const u16 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,
-+};
-+
-+
-+static inline u16 _S_(u16 v)
-+{
-+ u16 t = Sbox[Hi8(v)];
-+ return Sbox[Lo8(v)] ^ ((t << 8) | (t >> 8));
-+}
-+
-+#ifndef JOHN_TKIP
-+#define PHASE1_LOOP_COUNT 8
-+
-+static void tkip_mixing_phase1(u16 *TTAK, const u8 *TK, const u8 *TA, u32 IV32)
-+{
-+ int i, j;
-+
-+ /* Initialize the 80-bit TTAK from TSC (IV32) and TA[0..5] */
-+ TTAK[0] = Lo16(IV32);
-+ TTAK[1] = Hi16(IV32);
-+ TTAK[2] = Mk16(TA[1], TA[0]);
-+ TTAK[3] = Mk16(TA[3], TA[2]);
-+ TTAK[4] = Mk16(TA[5], TA[4]);
-+
-+ for (i = 0; i < PHASE1_LOOP_COUNT; i++) {
-+ j = 2 * (i & 1);
-+ TTAK[0] += _S_(TTAK[4] ^ Mk16(TK[1 + j], TK[0 + j]));
-+ TTAK[1] += _S_(TTAK[0] ^ Mk16(TK[5 + j], TK[4 + j]));
-+ TTAK[2] += _S_(TTAK[1] ^ Mk16(TK[9 + j], TK[8 + j]));
-+ TTAK[3] += _S_(TTAK[2] ^ Mk16(TK[13 + j], TK[12 + j]));
-+ TTAK[4] += _S_(TTAK[3] ^ Mk16(TK[1 + j], TK[0 + j])) + i;
-+ }
-+}
-+
-+
-+static void tkip_mixing_phase2(u8 *WEPSeed, const u8 *TK, const u16 *TTAK,
-+ u16 IV16)
-+{
-+ /* Make temporary area overlap WEP seed so that the final copy can be
-+ * avoided on little endian hosts. */
-+ u16 *PPK = (u16 *) &WEPSeed[4];
-+
-+ /* Step 1 - make copy of TTAK and bring in TSC */
-+ PPK[0] = TTAK[0];
-+ PPK[1] = TTAK[1];
-+ PPK[2] = TTAK[2];
-+ PPK[3] = TTAK[3];
-+ PPK[4] = TTAK[4];
-+ PPK[5] = TTAK[4] + IV16;
-+
-+ /* Step 2 - 96-bit bijective mixing using S-box */
-+ PPK[0] += _S_(PPK[5] ^ Mk16_le((u16 *) &TK[0]));
-+ PPK[1] += _S_(PPK[0] ^ Mk16_le((u16 *) &TK[2]));
-+ PPK[2] += _S_(PPK[1] ^ Mk16_le((u16 *) &TK[4]));
-+ PPK[3] += _S_(PPK[2] ^ Mk16_le((u16 *) &TK[6]));
-+ PPK[4] += _S_(PPK[3] ^ Mk16_le((u16 *) &TK[8]));
-+ PPK[5] += _S_(PPK[4] ^ Mk16_le((u16 *) &TK[10]));
-+
-+ PPK[0] += RotR1(PPK[5] ^ Mk16_le((u16 *) &TK[12]));
-+ PPK[1] += RotR1(PPK[0] ^ Mk16_le((u16 *) &TK[14]));
-+ PPK[2] += RotR1(PPK[1]);
-+ PPK[3] += RotR1(PPK[2]);
-+ PPK[4] += RotR1(PPK[3]);
-+ PPK[5] += RotR1(PPK[4]);
-+
-+ /* Step 3 - bring in last of TK bits, assign 24-bit WEP IV value
-+ * WEPSeed[0..2] is transmitted as WEP IV */
-+ WEPSeed[0] = Hi8(IV16);
-+ WEPSeed[1] = (Hi8(IV16) | 0x20) & 0x7F;
-+ WEPSeed[2] = Lo8(IV16);
-+ WEPSeed[3] = Lo8((PPK[5] ^ Mk16_le((u16 *) &TK[0])) >> 1);
-+
-+#ifdef __BIG_ENDIAN
-+ {
-+ int i;
-+ for (i = 0; i < 6; i++)
-+ PPK[i] = (PPK[i] << 8) | (PPK[i] >> 8);
-+ }
-+#endif
-+}
-+#endif
-+static int ieee80211_tkip_encrypt(struct sk_buff *skb, int hdr_len, void *priv)
-+{
-+ struct ieee80211_tkip_data *tkey = priv;
-+ #if(LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,21))
-+ struct blkcipher_desc desc = {.tfm = tkey->tx_tfm_arc4};
-+ #endif
-+ int len;
-+ u8 *pos;
-+ struct ieee80211_hdr *hdr;
-+#ifndef JOHN_TKIP
-+ u8 rc4key[16],*icv;
-+ u32 crc;
-+ struct scatterlist sg;
-+#endif
-+ #if(LINUX_VERSION_CODE >=KERNEL_VERSION(2,6,21))
-+ int ret;
-+ #endif
-+
-+ if (skb_headroom(skb) < 8 || skb_tailroom(skb) < 4 ||
-+ skb->len < hdr_len)
-+ return -1;
-+
-+ hdr = (struct ieee80211_hdr *) skb->data;
-+#if 0
-+printk("@@ tkey\n");
-+printk("%x|", ((u32*)tkey->key)[0]);
-+printk("%x|", ((u32*)tkey->key)[1]);
-+printk("%x|", ((u32*)tkey->key)[2]);
-+printk("%x|", ((u32*)tkey->key)[3]);
-+printk("%x|", ((u32*)tkey->key)[4]);
-+printk("%x|", ((u32*)tkey->key)[5]);
-+printk("%x|", ((u32*)tkey->key)[6]);
-+printk("%x\n", ((u32*)tkey->key)[7]);
-+#endif
-+
-+#ifndef JOHN_TKIP
-+ if (!tkey->tx_phase1_done) {
-+ tkip_mixing_phase1(tkey->tx_ttak, tkey->key, hdr->addr2,
-+ tkey->tx_iv32);
-+ tkey->tx_phase1_done = 1;
-+ }
-+ tkip_mixing_phase2(rc4key, tkey->key, tkey->tx_ttak, tkey->tx_iv16);
-+
-+#else
-+ tkey->tx_phase1_done = 1;
-+#endif /*JOHN_TKIP*/
-+
-+ len = skb->len - hdr_len;
-+ pos = skb_push(skb, 8);
-+ memmove(pos, pos + 8, hdr_len);
-+ pos += hdr_len;
-+
-+#ifdef JOHN_TKIP
-+ *pos++ = Hi8(tkey->tx_iv16);
-+ *pos++ = (Hi8(tkey->tx_iv16) | 0x20) & 0x7F;
-+ *pos++ = Lo8(tkey->tx_iv16);
-+#else
-+ *pos++ = rc4key[0];
-+ *pos++ = rc4key[1];
-+ *pos++ = rc4key[2];
-+#endif
-+ *pos++ = (tkey->key_idx << 6) | (1 << 5) /* Ext IV included */;
-+ *pos++ = tkey->tx_iv32 & 0xff;
-+ *pos++ = (tkey->tx_iv32 >> 8) & 0xff;
-+ *pos++ = (tkey->tx_iv32 >> 16) & 0xff;
-+ *pos++ = (tkey->tx_iv32 >> 24) & 0xff;
-+#ifndef JOHN_TKIP
-+ icv = skb_put(skb, 4);
-+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0))
-+ crc = ~crc32_le(~0, pos, len);
-+#else
-+ crc = ~ether_crc_le(len, pos);
-+#endif
-+ icv[0] = crc;
-+ icv[1] = crc >> 8;
-+ icv[2] = crc >> 16;
-+ icv[3] = crc >> 24;
-+ #if(LINUX_VERSION_CODE < KERNEL_VERSION(2,6,21))
-+ crypto_cipher_setkey(tkey->tfm_arc4, rc4key, 16);
-+ sg.page = virt_to_page(pos);
-+ sg.offset = offset_in_page(pos);
-+ sg.length = len + 4;
-+ crypto_cipher_encrypt(tkey->tfm_arc4, &sg, &sg, len + 4);
-+ #else
-+ crypto_blkcipher_setkey(tkey->tx_tfm_arc4, rc4key, 16);
-+ #if(LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24))
-+ sg.page = virt_to_page(pos);
-+ sg.offset = offset_in_page(pos);
-+ sg.length = len + 4;
-+ #else
-+ sg_init_one(&sg, pos, len + 4);
-+ #endif
-+ ret= crypto_blkcipher_encrypt(&desc, &sg, &sg, len + 4);
-+ #endif
-+#endif
-+ tkey->tx_iv16++;
-+ if (tkey->tx_iv16 == 0) {
-+ tkey->tx_phase1_done = 0;
-+ tkey->tx_iv32++;
-+ }
-+#ifndef JOHN_TKIP
-+ #if(LINUX_VERSION_CODE <KERNEL_VERSION(2,6,21))
-+ return 0;
-+ #else
-+ return ret;
-+ #endif
-+#else
-+ return 0;
-+#endif
-+}
-+
-+static int ieee80211_tkip_decrypt(struct sk_buff *skb, int hdr_len, void *priv)
-+{
-+ struct ieee80211_tkip_data *tkey = priv;
-+ #if(LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,21))
-+ struct blkcipher_desc desc = {.tfm = tkey->rx_tfm_arc4};
-+ #endif
-+ u8 keyidx, *pos;
-+ u32 iv32;
-+ u16 iv16;
-+ struct ieee80211_hdr *hdr;
-+#ifndef JOHN_TKIP
-+ u8 icv[4];
-+ u32 crc;
-+ struct scatterlist sg;
-+ u8 rc4key[16];
-+ int plen;
-+#endif
-+ if (skb->len < hdr_len + 8 + 4)
-+ return -1;
-+
-+ hdr = (struct ieee80211_hdr *) skb->data;
-+ pos = skb->data + hdr_len;
-+ keyidx = pos[3];
-+ if (!(keyidx & (1 << 5))) {
-+ if (net_ratelimit()) {
-+ printk(KERN_DEBUG "TKIP: received packet without ExtIV"
-+ " flag from " MAC_FMT "\n", MAC_ARG(hdr->addr2));
-+ }
-+ return -2;
-+ }
-+ keyidx >>= 6;
-+ if (tkey->key_idx != keyidx) {
-+ printk(KERN_DEBUG "TKIP: RX tkey->key_idx=%d frame "
-+ "keyidx=%d priv=%p\n", tkey->key_idx, keyidx, priv);
-+ return -6;
-+ }
-+ if (!tkey->key_set) {
-+ if (net_ratelimit()) {
-+ printk(KERN_DEBUG "TKIP: received packet from " MAC_FMT
-+ " with keyid=%d that does not have a configured"
-+ " key\n", MAC_ARG(hdr->addr2), keyidx);
-+ }
-+ return -3;
-+ }
-+ iv16 = (pos[0] << 8) | pos[2];
-+ iv32 = pos[4] | (pos[5] << 8) | (pos[6] << 16) | (pos[7] << 24);
-+ pos += 8;
-+#ifndef JOHN_TKIP
-+#if 0
-+ if (iv32 < tkey->rx_iv32 ||
-+ (iv32 == tkey->rx_iv32 && iv16 <= tkey->rx_iv16)) {
-+ if (net_ratelimit()) {
-+ printk(KERN_DEBUG "TKIP: replay detected: STA=" MAC_FMT
-+ " previous TSC %08x%04x received TSC "
-+ "%08x%04x\n", MAC_ARG(hdr->addr2),
-+ tkey->rx_iv32, tkey->rx_iv16, iv32, iv16);
-+ }
-+ tkey->dot11RSNAStatsTKIPReplays++;
-+ return -4;
-+ }
-+#endif
-+ if (iv32 != tkey->rx_iv32 || !tkey->rx_phase1_done) {
-+ tkip_mixing_phase1(tkey->rx_ttak, tkey->key, hdr->addr2, iv32);
-+ tkey->rx_phase1_done = 1;
-+ }
-+ tkip_mixing_phase2(rc4key, tkey->key, tkey->rx_ttak, iv16);
-+
-+ plen = skb->len - hdr_len - 12;
-+ #if(LINUX_VERSION_CODE <KERNEL_VERSION(2,6,21))
-+ crypto_cipher_setkey(tkey->tfm_arc4, rc4key, 16);
-+ sg.page = virt_to_page(pos);
-+ sg.offset = offset_in_page(pos);
-+ sg.length = plen + 4;
-+ crypto_cipher_decrypt(tkey->tfm_arc4, &sg, &sg, plen + 4);
-+ #else
-+ crypto_blkcipher_setkey(tkey->rx_tfm_arc4, rc4key, 16);
-+ #if (LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 24))
-+ sg.page = virt_to_page(pos);
-+ sg.offset = offset_in_page(pos);
-+ sg.length = plen + 4;
-+ #else
-+ sg_init_one(&sg, pos, plen + 4);
-+ #endif
-+ if (crypto_blkcipher_decrypt(&desc, &sg, &sg, plen + 4)) {
-+ if (net_ratelimit()) {
-+ printk(KERN_DEBUG ": TKIP: failed to decrypt "
-+ "received packet from " MAC_FMT "\n",
-+ MAC_ARG(hdr->addr2));
-+ }
-+ return -7;
-+ }
-+ #endif
-+
-+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0))
-+ crc = ~crc32_le(~0, pos, plen);
-+#else
-+ crc = ~ether_crc_le(plen, pos);
-+#endif
-+ icv[0] = crc;
-+ icv[1] = crc >> 8;
-+ icv[2] = crc >> 16;
-+ icv[3] = crc >> 24;
-+ if (memcmp(icv, pos + plen, 4) != 0) {
-+ if (iv32 != tkey->rx_iv32) {
-+ /* Previously cached Phase1 result was already lost, so
-+ * it needs to be recalculated for the next packet. */
-+ tkey->rx_phase1_done = 0;
-+ }
-+ if (net_ratelimit()) {
-+ printk(KERN_DEBUG "TKIP: ICV error detected: STA="
-+ MAC_FMT "\n", MAC_ARG(hdr->addr2));
-+ }
-+ tkey->dot11RSNAStatsTKIPICVErrors++;
-+ return -5;
-+ }
-+
-+#endif /* JOHN_TKIP */
-+
-+ /* Update real counters only after Michael MIC verification has
-+ * completed */
-+ tkey->rx_iv32_new = iv32;
-+ tkey->rx_iv16_new = iv16;
-+
-+ /* Remove IV and ICV */
-+ memmove(skb->data + 8, skb->data, hdr_len);
-+ skb_pull(skb, 8);
-+ skb_trim(skb, skb->len - 4);
-+
-+//john's test
-+#ifdef JOHN_DUMP
-+if( ((u16*)skb->data)[0] & 0x4000){
-+ printk("@@ rx decrypted skb->data");
-+ int i;
-+ for(i=0;i<skb->len;i++){
-+ if( (i%24)==0 ) printk("\n");
-+ printk("%2x ", ((u8*)skb->data)[i]);
-+ }
-+ printk("\n");
-+}
-+#endif /*JOHN_DUMP*/
-+ return keyidx;
-+}
-+
-+#if(LINUX_VERSION_CODE < KERNEL_VERSION(2,6,21))
-+static int michael_mic(struct ieee80211_tkip_data *tkey, u8 *key, u8 *hdr,
-+ u8 *data, size_t data_len, u8 *mic)
-+{
-+ struct scatterlist sg[2];
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)
-+ struct hash_desc desc;
-+ int ret=0;
-+#endif
-+ if (tkey->tfm_michael == NULL) {
-+ printk(KERN_WARNING "michael_mic: tfm_michael == NULL\n");
-+ return -1;
-+ }
-+ sg[0].page = virt_to_page(hdr);
-+ sg[0].offset = offset_in_page(hdr);
-+ sg[0].length = 16;
-+
-+ sg[1].page = virt_to_page(data);
-+ sg[1].offset = offset_in_page(data);
-+ sg[1].length = data_len;
-+
-+ //crypto_digest_init(tkey->tfm_michael);
-+ //crypto_digest_setkey(tkey->tfm_michael, key, 8);
-+ //crypto_digest_update(tkey->tfm_michael, sg, 2);
-+ //crypto_digest_final(tkey->tfm_michael, mic);
-+
-+ //return 0;
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20)
-+ crypto_digest_init(tkey->tfm_michael);
-+ crypto_digest_setkey(tkey->tfm_michael, key, 8);
-+ crypto_digest_update(tkey->tfm_michael, sg, 2);
-+ crypto_digest_final(tkey->tfm_michael, mic);
-+
-+ return 0;
-+#else
-+if (crypto_hash_setkey(tkey->tfm_michael, key, 8))
-+ return -1;
-+
-+// return 0;
-+ desc.tfm = tkey->tfm_michael;
-+ desc.flags = 0;
-+ ret = crypto_hash_digest(&desc, sg, data_len + 16, mic);
-+ return ret;
-+#endif
-+}
-+#else
-+static int michael_mic(struct crypto_hash *tfm_michael, u8 * key, u8 * hdr,
-+ u8 * data, size_t data_len, u8 * mic)
-+{
-+ struct hash_desc desc;
-+ struct scatterlist sg[2];
-+
-+ if (tfm_michael == NULL) {
-+ printk(KERN_WARNING "michael_mic: tfm_michael == NULL\n");
-+ return -1;
-+ }
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24)
-+ sg[0].page = virt_to_page(hdr);
-+ sg[0].offset = offset_in_page(hdr);
-+ sg[0].length = 16;
-+
-+ sg[1].page = virt_to_page(data);
-+ sg[1].offset = offset_in_page(data);
-+ sg[1].length = data_len;
-+#else
-+ sg_init_table(sg, 2);
-+ sg_set_buf(&sg[0], hdr, 16);
-+ sg_set_buf(&sg[1], data, data_len);
-+#endif
-+ if (crypto_hash_setkey(tfm_michael, key, 8))
-+ return -1;
-+
-+ desc.tfm = tfm_michael;
-+ desc.flags = 0;
-+ return crypto_hash_digest(&desc, sg, data_len + 16, mic);
-+}
-+#endif
-+
-+
-+
-+static void michael_mic_hdr(struct sk_buff *skb, u8 *hdr)
-+{
-+ struct ieee80211_hdr *hdr11;
-+
-+ hdr11 = (struct ieee80211_hdr *) skb->data;
-+ switch (le16_to_cpu(hdr11->frame_ctl) &
-+ (IEEE80211_FCTL_FROMDS | IEEE80211_FCTL_TODS)) {
-+ case IEEE80211_FCTL_TODS:
-+ memcpy(hdr, hdr11->addr3, ETH_ALEN); /* DA */
-+ memcpy(hdr + ETH_ALEN, hdr11->addr2, ETH_ALEN); /* SA */
-+ break;
-+ case IEEE80211_FCTL_FROMDS:
-+ memcpy(hdr, hdr11->addr1, ETH_ALEN); /* DA */
-+ memcpy(hdr + ETH_ALEN, hdr11->addr3, ETH_ALEN); /* SA */
-+ break;
-+ case IEEE80211_FCTL_FROMDS | IEEE80211_FCTL_TODS:
-+ memcpy(hdr, hdr11->addr3, ETH_ALEN); /* DA */
-+ memcpy(hdr + ETH_ALEN, hdr11->addr4, ETH_ALEN); /* SA */
-+ break;
-+ case 0:
-+ memcpy(hdr, hdr11->addr1, ETH_ALEN); /* DA */
-+ memcpy(hdr + ETH_ALEN, hdr11->addr2, ETH_ALEN); /* SA */
-+ break;
-+ }
-+
-+ hdr[12] = 0; /* priority */
-+
-+ hdr[13] = hdr[14] = hdr[15] = 0; /* reserved */
-+}
-+
-+
-+static int ieee80211_michael_mic_add(struct sk_buff *skb, int hdr_len, void *priv)
-+{
-+ struct ieee80211_tkip_data *tkey = priv;
-+ u8 *pos;
-+ struct ieee80211_hdr *hdr;
-+
-+ hdr = (struct ieee80211_hdr *) skb->data;
-+
-+ if (skb_tailroom(skb) < 8 || skb->len < hdr_len) {
-+ printk(KERN_DEBUG "Invalid packet for Michael MIC add "
-+ "(tailroom=%d hdr_len=%d skb->len=%d)\n",
-+ skb_tailroom(skb), hdr_len, skb->len);
-+ return -1;
-+ }
-+
-+ michael_mic_hdr(skb, tkey->tx_hdr);
-+
-+ // { david, 2006.9.1
-+ // fix the wpa process with wmm enabled.
-+ if(IEEE80211_QOS_HAS_SEQ(le16_to_cpu(hdr->frame_ctl))) {
-+ tkey->tx_hdr[12] = *(skb->data + hdr_len - 2) & 0x07;
-+ }
-+ // }
-+ pos = skb_put(skb, 8);
-+ #if(LINUX_VERSION_CODE < KERNEL_VERSION(2,6,21))
-+ if (michael_mic(tkey, &tkey->key[16], tkey->tx_hdr,
-+ skb->data + hdr_len, skb->len - 8 - hdr_len, pos))
-+ #else
-+ if (michael_mic(tkey->tx_tfm_michael, &tkey->key[16], tkey->tx_hdr,
-+ skb->data + hdr_len, skb->len - 8 - hdr_len, pos))
-+ #endif
-+ return -1;
-+
-+ return 0;
-+}
-+
-+
-+#if WIRELESS_EXT >= 18
-+static void ieee80211_michael_mic_failure(struct net_device *dev,
-+ struct ieee80211_hdr *hdr,
-+ int keyidx)
-+{
-+ union iwreq_data wrqu;
-+ struct iw_michaelmicfailure ev;
-+
-+ /* TODO: needed parameters: count, keyid, key type, TSC */
-+ memset(&ev, 0, sizeof(ev));
-+ ev.flags = keyidx & IW_MICFAILURE_KEY_ID;
-+ if (hdr->addr1[0] & 0x01)
-+ ev.flags |= IW_MICFAILURE_GROUP;
-+ else
-+ ev.flags |= IW_MICFAILURE_PAIRWISE;
-+ ev.src_addr.sa_family = ARPHRD_ETHER;
-+ memcpy(ev.src_addr.sa_data, hdr->addr2, ETH_ALEN);
-+ memset(&wrqu, 0, sizeof(wrqu));
-+ wrqu.data.length = sizeof(ev);
-+ wireless_send_event(dev, IWEVMICHAELMICFAILURE, &wrqu, (char *) &ev);
-+}
-+#elif WIRELESS_EXT >= 15
-+static void ieee80211_michael_mic_failure(struct net_device *dev,
-+ struct ieee80211_hdr *hdr,
-+ int keyidx)
-+{
-+ union iwreq_data wrqu;
-+ char buf[128];
-+
-+ /* TODO: needed parameters: count, keyid, key type, TSC */
-+ sprintf(buf, "MLME-MICHAELMICFAILURE.indication(keyid=%d %scast addr="
-+ MAC_FMT ")", keyidx, hdr->addr1[0] & 0x01 ? "broad" : "uni",
-+ MAC_ARG(hdr->addr2));
-+ memset(&wrqu, 0, sizeof(wrqu));
-+ wrqu.data.length = strlen(buf);
-+ wireless_send_event(dev, IWEVCUSTOM, &wrqu, buf);
-+}
-+#else /* WIRELESS_EXT >= 15 */
-+static inline void ieee80211_michael_mic_failure(struct net_device *dev,
-+ struct ieee80211_hdr *hdr,
-+ int keyidx)
-+{
-+}
-+#endif /* WIRELESS_EXT >= 15 */
-+
-+
-+static int ieee80211_michael_mic_verify(struct sk_buff *skb, int keyidx,
-+ int hdr_len, void *priv)
-+{
-+ struct ieee80211_tkip_data *tkey = priv;
-+ u8 mic[8];
-+ struct ieee80211_hdr *hdr;
-+
-+ hdr = (struct ieee80211_hdr *) skb->data;
-+
-+ if (!tkey->key_set)
-+ return -1;
-+
-+ michael_mic_hdr(skb, tkey->rx_hdr);
-+ // { david, 2006.9.1
-+ // fix the wpa process with wmm enabled.
-+ if(IEEE80211_QOS_HAS_SEQ(le16_to_cpu(hdr->frame_ctl))) {
-+ tkey->rx_hdr[12] = *(skb->data + hdr_len - 2) & 0x07;
-+ }
-+ // }
-+ #if(LINUX_VERSION_CODE < KERNEL_VERSION(2,6,21))
-+ if (michael_mic(tkey, &tkey->key[24], tkey->rx_hdr,
-+ skb->data + hdr_len, skb->len - 8 - hdr_len, mic))
-+ #else
-+ if (michael_mic(tkey->rx_tfm_michael, &tkey->key[24], tkey->rx_hdr,
-+ skb->data + hdr_len, skb->len - 8 - hdr_len, mic))
-+ #endif
-+ return -1;
-+ if (memcmp(mic, skb->data + skb->len - 8, 8) != 0) {
-+ struct ieee80211_hdr *hdr;
-+ hdr = (struct ieee80211_hdr *) skb->data;
-+ printk(KERN_DEBUG "%s: Michael MIC verification failed for "
-+ "MSDU from " MAC_FMT " keyidx=%d\n",
-+ skb->dev ? skb->dev->name : "N/A", MAC_ARG(hdr->addr2),
-+ keyidx);
-+ if (skb->dev)
-+ ieee80211_michael_mic_failure(skb->dev, hdr, keyidx);
-+ tkey->dot11RSNAStatsTKIPLocalMICFailures++;
-+ return -1;
-+ }
-+
-+ /* Update TSC counters for RX now that the packet verification has
-+ * completed. */
-+ tkey->rx_iv32 = tkey->rx_iv32_new;
-+ tkey->rx_iv16 = tkey->rx_iv16_new;
-+
-+ skb_trim(skb, skb->len - 8);
-+
-+ return 0;
-+}
-+
-+
-+static int ieee80211_tkip_set_key(void *key, int len, u8 *seq, void *priv)
-+{
-+ struct ieee80211_tkip_data *tkey = priv;
-+ int keyidx;
-+ #if(LINUX_VERSION_CODE < KERNEL_VERSION(2,6,21))
-+ struct crypto_tfm *tfm = tkey->tfm_michael;
-+ struct crypto_tfm *tfm2 = tkey->tfm_arc4;
-+ #else
-+ struct crypto_hash *tfm = tkey->tx_tfm_michael;
-+ struct crypto_blkcipher *tfm2 = tkey->tx_tfm_arc4;
-+ struct crypto_hash *tfm3 = tkey->rx_tfm_michael;
-+ struct crypto_blkcipher *tfm4 = tkey->rx_tfm_arc4;
-+ #endif
-+
-+ keyidx = tkey->key_idx;
-+ memset(tkey, 0, sizeof(*tkey));
-+ tkey->key_idx = keyidx;
-+
-+ #if(LINUX_VERSION_CODE < KERNEL_VERSION(2,6,21))
-+ tkey->tfm_michael = tfm;
-+ tkey->tfm_arc4 = tfm2;
-+ #else
-+ tkey->tx_tfm_michael = tfm;
-+ tkey->tx_tfm_arc4 = tfm2;
-+ tkey->rx_tfm_michael = tfm3;
-+ tkey->rx_tfm_arc4 = tfm4;
-+ #endif
-+
-+ if (len == TKIP_KEY_LEN) {
-+ memcpy(tkey->key, key, TKIP_KEY_LEN);
-+ tkey->key_set = 1;
-+ tkey->tx_iv16 = 1; /* TSC is initialized to 1 */
-+ if (seq) {
-+ tkey->rx_iv32 = (seq[5] << 24) | (seq[4] << 16) |
-+ (seq[3] << 8) | seq[2];
-+ tkey->rx_iv16 = (seq[1] << 8) | seq[0];
-+ }
-+ } else if (len == 0)
-+ tkey->key_set = 0;
-+ else
-+ return -1;
-+
-+ return 0;
-+}
-+
-+
-+static int ieee80211_tkip_get_key(void *key, int len, u8 *seq, void *priv)
-+{
-+ struct ieee80211_tkip_data *tkey = priv;
-+
-+ if (len < TKIP_KEY_LEN)
-+ return -1;
-+
-+ if (!tkey->key_set)
-+ return 0;
-+ memcpy(key, tkey->key, TKIP_KEY_LEN);
-+
-+ if (seq) {
-+ /* Return the sequence number of the last transmitted frame. */
-+ u16 iv16 = tkey->tx_iv16;
-+ u32 iv32 = tkey->tx_iv32;
-+ if (iv16 == 0)
-+ iv32--;
-+ iv16--;
-+ seq[0] = tkey->tx_iv16;
-+ seq[1] = tkey->tx_iv16 >> 8;
-+ seq[2] = tkey->tx_iv32;
-+ seq[3] = tkey->tx_iv32 >> 8;
-+ seq[4] = tkey->tx_iv32 >> 16;
-+ seq[5] = tkey->tx_iv32 >> 24;
-+ }
-+
-+ return TKIP_KEY_LEN;
-+}
-+
-+
-+static char * ieee80211_tkip_print_stats(char *p, void *priv)
-+{
-+ struct ieee80211_tkip_data *tkip = priv;
-+ p += sprintf(p, "key[%d] alg=TKIP key_set=%d "
-+ "tx_pn=%02x%02x%02x%02x%02x%02x "
-+ "rx_pn=%02x%02x%02x%02x%02x%02x "
-+ "replays=%d icv_errors=%d local_mic_failures=%d\n",
-+ tkip->key_idx, tkip->key_set,
-+ (tkip->tx_iv32 >> 24) & 0xff,
-+ (tkip->tx_iv32 >> 16) & 0xff,
-+ (tkip->tx_iv32 >> 8) & 0xff,
-+ tkip->tx_iv32 & 0xff,
-+ (tkip->tx_iv16 >> 8) & 0xff,
-+ tkip->tx_iv16 & 0xff,
-+ (tkip->rx_iv32 >> 24) & 0xff,
-+ (tkip->rx_iv32 >> 16) & 0xff,
-+ (tkip->rx_iv32 >> 8) & 0xff,
-+ tkip->rx_iv32 & 0xff,
-+ (tkip->rx_iv16 >> 8) & 0xff,
-+ tkip->rx_iv16 & 0xff,
-+ tkip->dot11RSNAStatsTKIPReplays,
-+ tkip->dot11RSNAStatsTKIPICVErrors,
-+ tkip->dot11RSNAStatsTKIPLocalMICFailures);
-+ return p;
-+}
-+
-+
-+static struct ieee80211_crypto_ops ieee80211_crypt_tkip = {
-+ .name = "TKIP",
-+ .init = ieee80211_tkip_init,
-+ .deinit = ieee80211_tkip_deinit,
-+ .encrypt_mpdu = ieee80211_tkip_encrypt,
-+ .decrypt_mpdu = ieee80211_tkip_decrypt,
-+ .encrypt_msdu = ieee80211_michael_mic_add,
-+ .decrypt_msdu = ieee80211_michael_mic_verify,
-+ .set_key = ieee80211_tkip_set_key,
-+ .get_key = ieee80211_tkip_get_key,
-+ .print_stats = ieee80211_tkip_print_stats,
-+ .extra_prefix_len = 4 + 4, /* IV + ExtIV */
-+ .extra_postfix_len = 8 + 4, /* MIC + ICV */
-+ .owner = THIS_MODULE,
-+};
-+
-+
-+int __init ieee80211_crypto_tkip_init(void)
-+{
-+ return ieee80211_register_crypto_ops(&ieee80211_crypt_tkip);
-+}
-+
-+
-+void __exit ieee80211_crypto_tkip_exit(void)
-+{
-+ ieee80211_unregister_crypto_ops(&ieee80211_crypt_tkip);
-+}
-+
-+
-+void ieee80211_tkip_null(void)
-+{
-+// printk("============>%s()\n", __FUNCTION__);
-+ return;
-+}
-+
-+#if 0
-+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0))
-+EXPORT_SYMBOL(ieee80211_tkip_null);
-+#else
-+EXPORT_SYMBOL_NOVERS(ieee80211_tkip_null);
-+#endif
-+
-+
-+module_init(ieee80211_crypto_tkip_init);
-+module_exit(ieee80211_crypto_tkip_exit);
-+#endif
-diff -Nur linux-2.6.30.5.orig/drivers/net/wireless/rtl8187b/ieee80211/ieee80211_crypt_wep.c linux-2.6.30.5/drivers/net/wireless/rtl8187b/ieee80211/ieee80211_crypt_wep.c
---- linux-2.6.30.5.orig/drivers/net/wireless/rtl8187b/ieee80211/ieee80211_crypt_wep.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.30.5/drivers/net/wireless/rtl8187b/ieee80211/ieee80211_crypt_wep.c 2009-08-23 19:01:04.000000000 +0200
-@@ -0,0 +1,383 @@
-+/*
-+ * Host AP crypt: host-based WEP encryption implementation for Host AP driver
-+ *
-+ * Copyright (c) 2002-2004, Jouni Malinen <jkmaline@cc.hut.fi>
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License version 2 as
-+ * published by the Free Software Foundation. See README and COPYING for
-+ * more details.
-+ */
-+
-+//#include <linux/config.h>
-+#include <linux/version.h>
-+#include <linux/module.h>
-+#include <linux/init.h>
-+#include <linux/slab.h>
-+#include <linux/random.h>
-+#include <linux/skbuff.h>
-+#include <asm/string.h>
-+
-+#include "ieee80211.h"
-+
-+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0))
-+#include "rtl_crypto.h"
-+#else
-+#include <linux/crypto.h>
-+#endif
-+
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20)
-+ #include <asm/scatterlist.h>
-+#else
-+ #include <linux/scatterlist.h>
-+#endif
-+//#include <asm/scatterlist.h>
-+#include <linux/crc32.h>
-+
-+MODULE_AUTHOR("Jouni Malinen");
-+MODULE_DESCRIPTION("Host AP crypt: WEP");
-+MODULE_LICENSE("GPL");
-+
-+
-+struct prism2_wep_data {
-+ u32 iv;
-+#define WEP_KEY_LEN 13
-+ u8 key[WEP_KEY_LEN + 1];
-+ u8 key_len;
-+ u8 key_idx;
-+ #if(LINUX_VERSION_CODE < KERNEL_VERSION(2,6,21))
-+ struct crypto_tfm *tfm;
-+ #else
-+ struct crypto_blkcipher *tx_tfm;
-+ struct crypto_blkcipher *rx_tfm;
-+ #endif
-+};
-+
-+
-+static void * prism2_wep_init(int keyidx)
-+{
-+ struct prism2_wep_data *priv;
-+
-+ priv = kmalloc(sizeof(*priv), GFP_ATOMIC);
-+ if (priv == NULL)
-+ goto fail;
-+ memset(priv, 0, sizeof(*priv));
-+ priv->key_idx = keyidx;
-+ #if(LINUX_VERSION_CODE < KERNEL_VERSION(2,6,21))
-+ priv->tfm = crypto_alloc_tfm("arc4", 0);
-+ if (priv->tfm == NULL) {
-+ printk(KERN_DEBUG "ieee80211_crypt_wep: could not allocate "
-+ "crypto API arc4\n");
-+ goto fail;
-+ }
-+ #else
-+ priv->tx_tfm = crypto_alloc_blkcipher("ecb(arc4)", 0, CRYPTO_ALG_ASYNC);
-+ if (IS_ERR(priv->tx_tfm)) {
-+ printk(KERN_DEBUG "ieee80211_crypt_wep: could not allocate "
-+ "crypto API arc4\n");
-+ priv->tx_tfm = NULL;
-+ goto fail;
-+ }
-+ priv->rx_tfm = crypto_alloc_blkcipher("ecb(arc4)", 0, CRYPTO_ALG_ASYNC);
-+ if (IS_ERR(priv->rx_tfm)) {
-+ printk(KERN_DEBUG "ieee80211_crypt_wep: could not allocate "
-+ "crypto API arc4\n");
-+ priv->rx_tfm = NULL;
-+ goto fail;
-+ }
-+ #endif
-+
-+ /* start WEP IV from a random value */
-+ get_random_bytes(&priv->iv, 4);
-+
-+ return priv;
-+
-+fail:
-+ #if(LINUX_VERSION_CODE < KERNEL_VERSION(2,6,21))
-+ if (priv) {
-+ if (priv->tfm)
-+ crypto_free_tfm(priv->tfm);
-+ kfree(priv);
-+ }
-+ #else
-+ if (priv) {
-+ if (priv->tx_tfm)
-+ crypto_free_blkcipher(priv->tx_tfm);
-+ if (priv->rx_tfm)
-+ crypto_free_blkcipher(priv->rx_tfm);
-+ kfree(priv);
-+ }
-+ #endif
-+ return NULL;
-+}
-+
-+
-+static void prism2_wep_deinit(void *priv)
-+{
-+ struct prism2_wep_data *_priv = priv;
-+ #if(LINUX_VERSION_CODE < KERNEL_VERSION(2,6,21))
-+ if (_priv && _priv->tfm)
-+ crypto_free_tfm(_priv->tfm);
-+ #else
-+ if (_priv) {
-+ if (_priv->tx_tfm)
-+ crypto_free_blkcipher(_priv->tx_tfm);
-+ if (_priv->rx_tfm)
-+ crypto_free_blkcipher(_priv->rx_tfm);
-+ }
-+ #endif
-+ kfree(priv);
-+}
-+
-+
-+/* Perform WEP encryption on given skb that has at least 4 bytes of headroom
-+ * for IV and 4 bytes of tailroom for ICV. Both IV and ICV will be transmitted,
-+ * so the payload length increases with 8 bytes.
-+ *
-+ * WEP frame payload: IV + TX key idx, RC4(data), ICV = RC4(CRC32(data))
-+ */
-+static int prism2_wep_encrypt(struct sk_buff *skb, int hdr_len, void *priv)
-+{
-+ struct prism2_wep_data *wep = priv;
-+#if(LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,21))
-+ struct blkcipher_desc desc = {.tfm = wep->tx_tfm};
-+#endif
-+ u32 klen, len;
-+ u8 key[WEP_KEY_LEN + 3];
-+ u8 *pos;
-+#ifndef JOHN_HWSEC
-+ u32 crc;
-+ u8 *icv;
-+ struct scatterlist sg;
-+#endif
-+ if (skb_headroom(skb) < 4 || skb_tailroom(skb) < 4 ||
-+ skb->len < hdr_len)
-+ return -1;
-+
-+ len = skb->len - hdr_len;
-+ pos = skb_push(skb, 4);
-+ memmove(pos, pos + 4, hdr_len);
-+ pos += hdr_len;
-+
-+ klen = 3 + wep->key_len;
-+
-+ wep->iv++;
-+
-+ /* Fluhrer, Mantin, and Shamir have reported weaknesses in the key
-+ * scheduling algorithm of RC4. At least IVs (KeyByte + 3, 0xff, N)
-+ * can be used to speedup attacks, so avoid using them. */
-+ if ((wep->iv & 0xff00) == 0xff00) {
-+ u8 B = (wep->iv >> 16) & 0xff;
-+ if (B >= 3 && B < klen)
-+ wep->iv += 0x0100;
-+ }
-+
-+ /* Prepend 24-bit IV to RC4 key and TX frame */
-+ *pos++ = key[0] = (wep->iv >> 16) & 0xff;
-+ *pos++ = key[1] = (wep->iv >> 8) & 0xff;
-+ *pos++ = key[2] = wep->iv & 0xff;
-+ *pos++ = wep->key_idx << 6;
-+
-+ /* Copy rest of the WEP key (the secret part) */
-+ memcpy(key + 3, wep->key, wep->key_len);
-+
-+#ifndef JOHN_HWSEC
-+ /* Append little-endian CRC32 and encrypt it to produce ICV */
-+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0))
-+ crc = ~crc32_le(~0, pos, len);
-+#else
-+ crc = ~ether_crc_le(len, pos);
-+#endif
-+ icv = skb_put(skb, 4);
-+ icv[0] = crc;
-+ icv[1] = crc >> 8;
-+ icv[2] = crc >> 16;
-+ icv[3] = crc >> 24;
-+
-+ #if(LINUX_VERSION_CODE < KERNEL_VERSION(2,6,21))
-+ crypto_cipher_setkey(wep->tfm, key, klen);
-+ sg.page = virt_to_page(pos);
-+ sg.offset = offset_in_page(pos);
-+ sg.length = len + 4;
-+ crypto_cipher_encrypt(wep->tfm, &sg, &sg, len + 4);
-+
-+ return 0;
-+ #else
-+ crypto_blkcipher_setkey(wep->tx_tfm, key, klen);
-+ #if (LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 24))
-+ sg.page = virt_to_page(pos);
-+ sg.offset = offset_in_page(pos);
-+ sg.length = len + 4;
-+ #else
-+ sg_init_one(&sg, pos, len + 4);
-+ #endif
-+ return crypto_blkcipher_encrypt(&desc, &sg, &sg, len + 4);
-+ #endif
-+#endif /* JOHN_HWSEC */
-+ return 0;
-+}
-+
-+
-+/* Perform WEP decryption on given buffer. Buffer includes whole WEP part of
-+ * the frame: IV (4 bytes), encrypted payload (including SNAP header),
-+ * ICV (4 bytes). len includes both IV and ICV.
-+ *
-+ * Returns 0 if frame was decrypted successfully and ICV was correct and -1 on
-+ * failure. If frame is OK, IV and ICV will be removed.
-+ */
-+static int prism2_wep_decrypt(struct sk_buff *skb, int hdr_len, void *priv)
-+{
-+ struct prism2_wep_data *wep = priv;
-+ #if(LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,21))
-+ struct blkcipher_desc desc = {.tfm = wep->rx_tfm};
-+ #endif
-+ u32 klen, plen;
-+ u8 key[WEP_KEY_LEN + 3];
-+ u8 keyidx, *pos;
-+#ifndef JOHN_HWSEC
-+ u32 crc;
-+ u8 icv[4];
-+ struct scatterlist sg;
-+#endif
-+ if (skb->len < hdr_len + 8)
-+ return -1;
-+
-+ pos = skb->data + hdr_len;
-+ key[0] = *pos++;
-+ key[1] = *pos++;
-+ key[2] = *pos++;
-+ keyidx = *pos++ >> 6;
-+ if (keyidx != wep->key_idx)
-+ return -1;
-+
-+ klen = 3 + wep->key_len;
-+
-+ /* Copy rest of the WEP key (the secret part) */
-+ memcpy(key + 3, wep->key, wep->key_len);
-+
-+ /* Apply RC4 to data and compute CRC32 over decrypted data */
-+ plen = skb->len - hdr_len - 8;
-+#ifndef JOHN_HWSEC
-+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,21))
-+ crypto_cipher_setkey(wep->tfm, key, klen);
-+ sg.page = virt_to_page(pos);
-+ sg.offset = offset_in_page(pos);
-+ sg.length = plen + 4;
-+ crypto_cipher_decrypt(wep->tfm, &sg, &sg, plen + 4);
-+#else
-+ crypto_blkcipher_setkey(wep->rx_tfm, key, klen);
-+ #if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24))
-+ sg.page = virt_to_page(pos);
-+ sg.offset = offset_in_page(pos);
-+ sg.length = plen + 4;
-+ #else
-+ sg_init_one(&sg, pos, plen + 4);
-+ #endif
-+ if (crypto_blkcipher_decrypt(&desc, &sg, &sg, plen + 4))
-+ return -7;
-+#endif
-+
-+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0))
-+ crc = ~crc32_le(~0, pos, plen);
-+#else
-+ crc = ~ether_crc_le(plen, pos);
-+#endif
-+ icv[0] = crc;
-+ icv[1] = crc >> 8;
-+ icv[2] = crc >> 16;
-+ icv[3] = crc >> 24;
-+
-+ if (memcmp(icv, pos + plen, 4) != 0) {
-+ /* ICV mismatch - drop frame */
-+ return -2;
-+ }
-+#endif /* JOHN_HWSEC */
-+
-+ /* Remove IV and ICV */
-+ memmove(skb->data + 4, skb->data, hdr_len);
-+ skb_pull(skb, 4);
-+ skb_trim(skb, skb->len - 4);
-+ return 0;
-+}
-+
-+
-+static int prism2_wep_set_key(void *key, int len, u8 *seq, void *priv)
-+{
-+ struct prism2_wep_data *wep = priv;
-+
-+ if (len < 0 || len > WEP_KEY_LEN)
-+ return -1;
-+
-+ memcpy(wep->key, key, len);
-+ wep->key_len = len;
-+
-+ return 0;
-+}
-+
-+
-+static int prism2_wep_get_key(void *key, int len, u8 *seq, void *priv)
-+{
-+ struct prism2_wep_data *wep = priv;
-+
-+ if (len < wep->key_len)
-+ return -1;
-+
-+ memcpy(key, wep->key, wep->key_len);
-+
-+ return wep->key_len;
-+}
-+
-+
-+static char * prism2_wep_print_stats(char *p, void *priv)
-+{
-+ struct prism2_wep_data *wep = priv;
-+ p += sprintf(p, "key[%d] alg=WEP len=%d\n",
-+ wep->key_idx, wep->key_len);
-+ return p;
-+}
-+
-+
-+static struct ieee80211_crypto_ops ieee80211_crypt_wep = {
-+ .name = "WEP",
-+ .init = prism2_wep_init,
-+ .deinit = prism2_wep_deinit,
-+ .encrypt_mpdu = prism2_wep_encrypt,
-+ .decrypt_mpdu = prism2_wep_decrypt,
-+ .encrypt_msdu = NULL,
-+ .decrypt_msdu = NULL,
-+ .set_key = prism2_wep_set_key,
-+ .get_key = prism2_wep_get_key,
-+ .print_stats = prism2_wep_print_stats,
-+ .extra_prefix_len = 4, /* IV */
-+ .extra_postfix_len = 4, /* ICV */
-+ .owner = THIS_MODULE,
-+};
-+
-+
-+int __init ieee80211_crypto_wep_init(void)
-+{
-+ return ieee80211_register_crypto_ops(&ieee80211_crypt_wep);
-+}
-+
-+
-+void __exit ieee80211_crypto_wep_exit(void)
-+{
-+ ieee80211_unregister_crypto_ops(&ieee80211_crypt_wep);
-+}
-+
-+
-+void ieee80211_wep_null(void)
-+{
-+// printk("============>%s()\n", __FUNCTION__);
-+ return;
-+}
-+#if 0
-+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0))
-+EXPORT_SYMBOL(ieee80211_wep_null);
-+#else
-+EXPORT_SYMBOL_NOVERS(ieee80211_wep_null);
-+#endif
-+
-+module_init(ieee80211_crypto_wep_init);
-+module_exit(ieee80211_crypto_wep_exit);
-+#endif
-diff -Nur linux-2.6.30.5.orig/drivers/net/wireless/rtl8187b/ieee80211/ieee80211.h linux-2.6.30.5/drivers/net/wireless/rtl8187b/ieee80211/ieee80211.h
---- linux-2.6.30.5.orig/drivers/net/wireless/rtl8187b/ieee80211/ieee80211.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.30.5/drivers/net/wireless/rtl8187b/ieee80211/ieee80211.h 2009-08-23 19:01:04.000000000 +0200
-@@ -0,0 +1,1913 @@
-+/*
-+ * Merged with mainline ieee80211.h in Aug 2004. Original ieee802_11
-+ * remains copyright by the original authors
-+ *
-+ * Portions of the merged code are based on Host AP (software wireless
-+ * LAN access point) driver for Intersil Prism2/2.5/3.
-+ *
-+ * Copyright (c) 2001-2002, SSH Communications Security Corp and Jouni Malinen
-+ * <jkmaline@cc.hut.fi>
-+ * Copyright (c) 2002-2003, Jouni Malinen <jkmaline@cc.hut.fi>
-+ *
-+ * Adaption to a generic IEEE 802.11 stack by James Ketrenos
-+ * <jketreno@linux.intel.com>
-+ * Copyright (c) 2004, Intel Corporation
-+ *
-+ * Modified for Realtek's wi-fi cards by Andrea Merello
-+ * <andreamrl@tiscali.it>
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License version 2 as
-+ * published by the Free Software Foundation. See README and COPYING for
-+ * more details.
-+ */
-+#ifndef IEEE80211_H
-+#define IEEE80211_H
-+#include <linux/if_ether.h> /* ETH_ALEN */
-+#include <linux/kernel.h> /* ARRAY_SIZE */
-+#include <linux/version.h>
-+#include <linux/module.h>
-+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0))
-+#include <linux/jiffies.h>
-+#else
-+#include <linux/jffs.h>
-+#include <linux/tqueue.h>
-+#endif
-+#include <linux/timer.h>
-+#include <linux/sched.h>
-+
-+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,13))
-+#include <linux/wireless.h>
-+#endif
-+/*
-+#ifndef bool
-+#define bool int
-+#endif
-+
-+#ifndef true
-+#define true 1
-+#endif
-+
-+#ifndef false
-+#define false 0
-+#endif
-+*/
-+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20))
-+#ifndef bool
-+typedef enum{false = 0, true} bool;
-+#endif
-+#endif
-+//#ifdef JOHN_HWSEC
-+#define KEY_TYPE_NA 0x0
-+#define KEY_TYPE_WEP40 0x1
-+#define KEY_TYPE_TKIP 0x2
-+#define KEY_TYPE_CCMP 0x4
-+#define KEY_TYPE_WEP104 0x5
-+//#endif
-+
-+
-+#define aSifsTime 10
-+
-+#define MGMT_QUEUE_NUM 5
-+
-+
-+#define IEEE_CMD_SET_WPA_PARAM 1
-+#define IEEE_CMD_SET_WPA_IE 2
-+#define IEEE_CMD_SET_ENCRYPTION 3
-+#define IEEE_CMD_MLME 4
-+
-+#define IEEE_PARAM_WPA_ENABLED 1
-+#define IEEE_PARAM_TKIP_COUNTERMEASURES 2
-+#define IEEE_PARAM_DROP_UNENCRYPTED 3
-+#define IEEE_PARAM_PRIVACY_INVOKED 4
-+#define IEEE_PARAM_AUTH_ALGS 5
-+#define IEEE_PARAM_IEEE_802_1X 6
-+//It should consistent with the driver_XXX.c
-+// David, 2006.9.26
-+#define IEEE_PARAM_WPAX_SELECT 7
-+//Added for notify the encryption type selection
-+// David, 2006.9.26
-+#define IEEE_PROTO_WPA 1
-+#define IEEE_PROTO_RSN 2
-+//Added for notify the encryption type selection
-+// David, 2006.9.26
-+#define IEEE_WPAX_USEGROUP 0
-+#define IEEE_WPAX_WEP40 1
-+#define IEEE_WPAX_TKIP 2
-+#define IEEE_WPAX_WRAP 3
-+#define IEEE_WPAX_CCMP 4
-+#define IEEE_WPAX_WEP104 5
-+
-+#define IEEE_KEY_MGMT_IEEE8021X 1
-+#define IEEE_KEY_MGMT_PSK 2
-+
-+
-+
-+#define IEEE_MLME_STA_DEAUTH 1
-+#define IEEE_MLME_STA_DISASSOC 2
-+
-+
-+#define IEEE_CRYPT_ERR_UNKNOWN_ALG 2
-+#define IEEE_CRYPT_ERR_UNKNOWN_ADDR 3
-+#define IEEE_CRYPT_ERR_CRYPT_INIT_FAILED 4
-+#define IEEE_CRYPT_ERR_KEY_SET_FAILED 5
-+#define IEEE_CRYPT_ERR_TX_KEY_SET_FAILED 6
-+#define IEEE_CRYPT_ERR_CARD_CONF_FAILED 7
-+
-+
-+#define IEEE_CRYPT_ALG_NAME_LEN 16
-+
-+//#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,10))
-+#define ieee80211_wx_get_scan ieee80211_wx_get_scan_rtl
-+#define ieee80211_wx_set_encode ieee80211_wx_set_encode_rtl
-+#define ieee80211_wx_get_encode ieee80211_wx_get_encode_rtl
-+////////////////////////////////
-+// added for kernel conflict under FC5
-+#define ieee80211_wx_get_name ieee80211_wx_get_name_rtl
-+#define free_ieee80211 free_ieee80211_rtl
-+#define alloc_ieee80211 alloc_ieee80211_rtl
-+///////////////////////////////
-+//#endif
-+#define ieee80211_rx ieee80211_rx_rtl
-+#define ieee80211_wake_queue ieee80211_wake_queue_rtl
-+#define ieee80211_stop_queue ieee80211_stop_queue_rtl
-+#define ieee80211_wx_set_auth ieee80211_wx_set_auth_rtl
-+#define ieee80211_get_crypto_ops ieee80211_get_crypto_ops_rtl
-+#define ieee80211_crypt_delayed_deinit ieee80211_crypt_delayed_deinit_rtl
-+
-+#define ieee80211_start_scan ieee80211_start_scan_rtl
-+#define ieee80211_register_crypto_ops ieee80211_register_crypto_ops_rtl
-+#define ieee80211_unregister_crypto_ops ieee80211_unregister_crypto_ops_rtl
-+#define ieee80211_crypt_deinit_entries ieee80211_crypt_deinit_entries_rtl
-+#define ieee80211_crypt_deinit_handler ieee80211_crypt_deinit_handler_rtl
-+typedef struct ieee_param {
-+ u32 cmd;
-+ u8 sta_addr[ETH_ALEN];
-+ union {
-+ struct {
-+ u8 name;
-+ u32 value;
-+ } wpa_param;
-+ struct {
-+ u32 len;
-+ u8 reserved[32];
-+ u8 data[0];
-+ } wpa_ie;
-+ struct{
-+ int command;
-+ int reason_code;
-+ } mlme;
-+ struct {
-+ u8 alg[IEEE_CRYPT_ALG_NAME_LEN];
-+ u8 set_tx;
-+ u32 err;
-+ u8 idx;
-+ u8 seq[8]; /* sequence counter (set: RX, get: TX) */
-+ u16 key_len;
-+ u8 key[0];
-+ } crypt;
-+
-+ } u;
-+}ieee_param;
-+
-+
-+#if WIRELESS_EXT < 17
-+#define IW_QUAL_QUAL_INVALID 0x10
-+#define IW_QUAL_LEVEL_INVALID 0x20
-+#define IW_QUAL_NOISE_INVALID 0x40
-+#define IW_QUAL_QUAL_UPDATED 0x1
-+#define IW_QUAL_LEVEL_UPDATED 0x2
-+#define IW_QUAL_NOISE_UPDATED 0x4
-+#endif
-+
-+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0))
-+static inline void tq_init(struct tq_struct * task, void(*func)(void *), void *data)
-+{
-+ task->routine = func;
-+ task->data = data;
-+ //task->next = NULL;
-+ INIT_LIST_HEAD(&task->list);
-+ task->sync = 0;
-+}
-+#endif
-+
-+// linux under 2.6.9 release may not support it, so modify it for common use
-+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,9))
-+//#define MSECS(t) (1000 * ((t) / HZ) + 1000 * ((t) % HZ) / HZ)
-+#define MSECS(t) (HZ * ((t) / 1000) + (HZ * ((t) % 1000)) / 1000)
-+static inline unsigned long msleep_interruptible_rtl(unsigned int msecs)
-+{
-+ unsigned long timeout = MSECS(msecs) + 1;
-+
-+ while (timeout) {
-+ set_current_state(TASK_UNINTERRUPTIBLE);
-+ timeout = schedule_timeout(timeout);
-+ }
-+ return timeout;
-+}
-+#else
-+#define MSECS(t) msecs_to_jiffies(t)
-+#define msleep_interruptible_rtl msleep_interruptible
-+#endif
-+
-+#define IEEE80211_DATA_LEN 2304
-+/* Maximum size for the MA-UNITDATA primitive, 802.11 standard section
-+ 6.2.1.1.2.
-+
-+ The figure in section 7.1.2 suggests a body size of up to 2312
-+ bytes is allowed, which is a bit confusing, I suspect this
-+ represents the 2304 bytes of real data, plus a possible 8 bytes of
-+ WEP IV and ICV. (this interpretation suggested by Ramiro Barreiro) */
-+
-+
-+#define IEEE80211_HLEN 30
-+#define IEEE80211_FRAME_LEN (IEEE80211_DATA_LEN + IEEE80211_HLEN)
-+
-+/* this is stolen and modified from the madwifi driver*/
-+#define IEEE80211_FC0_TYPE_MASK 0x0c
-+#define IEEE80211_FC0_TYPE_DATA 0x08
-+#define IEEE80211_FC0_SUBTYPE_MASK 0xB0
-+#define IEEE80211_FC0_SUBTYPE_QOS 0x80
-+
-+#define IEEE80211_QOS_HAS_SEQ(fc) \
-+ (((fc) & (IEEE80211_FC0_TYPE_MASK | IEEE80211_FC0_SUBTYPE_MASK)) == \
-+ (IEEE80211_FC0_TYPE_DATA | IEEE80211_FC0_SUBTYPE_QOS))
-+
-+/* this is stolen from ipw2200 driver */
-+#define IEEE_IBSS_MAC_HASH_SIZE 31
-+#define IEEE_MESH_MAC_HASH_SIZE 31
-+struct ieee_ibss_seq {
-+ u8 mac[ETH_ALEN];
-+ u16 seq_num[17];
-+ u16 frag_num[17];
-+ unsigned long packet_time[17];
-+ struct list_head list;
-+};
-+
-+struct ieee_mesh_seq {
-+ u8 mac[ETH_ALEN];
-+ u16 seq_num;
-+ u16 frag_num;
-+ unsigned long packet_time;
-+ struct list_head list;
-+};
-+
-+struct ieee80211_hdr {
-+ u16 frame_ctl;
-+ u16 duration_id;
-+ u8 addr1[ETH_ALEN];
-+ u8 addr2[ETH_ALEN];
-+ u8 addr3[ETH_ALEN];
-+ u16 seq_ctl;
-+ u8 addr4[ETH_ALEN];
-+} __attribute__ ((packed));
-+
-+struct ieee80211_hdr_QOS {
-+ u16 frame_ctl;
-+ u16 duration_id;
-+ u8 addr1[ETH_ALEN];
-+ u8 addr2[ETH_ALEN];
-+ u8 addr3[ETH_ALEN];
-+ u16 seq_ctl;
-+ u8 addr4[ETH_ALEN];
-+ u16 QOS_ctl;
-+} __attribute__ ((packed));
-+
-+struct ieee80211_hdr_3addr {
-+ u16 frame_ctl;
-+ u16 duration_id;
-+ u8 addr1[ETH_ALEN];
-+ u8 addr2[ETH_ALEN];
-+ u8 addr3[ETH_ALEN];
-+ u16 seq_ctl;
-+} __attribute__ ((packed));
-+
-+struct ieee80211_hdr_3addr_QOS {
-+ u16 frame_ctl;
-+ u16 duration_id;
-+ u8 addr1[ETH_ALEN];
-+ u8 addr2[ETH_ALEN];
-+ u8 addr3[ETH_ALEN];
-+ u16 seq_ctl;
-+ u16 QOS_ctl;
-+} __attribute__ ((packed));
-+
-+enum eap_type {
-+ EAP_PACKET = 0,
-+ EAPOL_START,
-+ EAPOL_LOGOFF,
-+ EAPOL_KEY,
-+ EAPOL_ENCAP_ASF_ALERT
-+};
-+
-+//by lizhaoming for LED 2008.6.23 from r8187_led.h
-+#ifdef LED
-+typedef enum _LED_CTL_MODE {
-+ LED_CTL_POWER_ON,
-+ LED_CTL_POWER_OFF,
-+ LED_CTL_LINK,
-+ LED_CTL_NO_LINK,
-+ LED_CTL_TX,
-+ LED_CTL_RX,
-+ LED_CTL_SITE_SURVEY,
-+} LED_CTL_MODE;
-+#endif
-+
-+static const char *eap_types[] = {
-+ [EAP_PACKET] = "EAP-Packet",
-+ [EAPOL_START] = "EAPOL-Start",
-+ [EAPOL_LOGOFF] = "EAPOL-Logoff",
-+ [EAPOL_KEY] = "EAPOL-Key",
-+ [EAPOL_ENCAP_ASF_ALERT] = "EAPOL-Encap-ASF-Alert"
-+};
-+
-+static inline const char *eap_get_type(int type)
-+{
-+ return (type >= ARRAY_SIZE(eap_types)) ? "Unknown" : eap_types[type];
-+}
-+
-+struct eapol {
-+ u8 snap[6];
-+ u16 ethertype;
-+ u8 version;
-+ u8 type;
-+ u16 length;
-+} __attribute__ ((packed));
-+
-+#define IEEE80211_3ADDR_LEN 24
-+#define IEEE80211_4ADDR_LEN 30
-+#define IEEE80211_FCS_LEN 4
-+
-+#define MIN_FRAG_THRESHOLD 256U
-+#define MAX_FRAG_THRESHOLD 2346U
-+
-+/* Frame control field constants */
-+#define IEEE80211_FCTL_VERS 0x0002
-+#define IEEE80211_FCTL_FTYPE 0x000c
-+#define IEEE80211_FCTL_STYPE 0x00f0
-+#define IEEE80211_FCTL_TODS 0x0100
-+#define IEEE80211_FCTL_FROMDS 0x0200
-+#define IEEE80211_FCTL_DSTODS 0x0300 //added by david
-+#define IEEE80211_FCTL_MOREFRAGS 0x0400
-+#define IEEE80211_FCTL_RETRY 0x0800
-+#define IEEE80211_FCTL_PM 0x1000
-+#define IEEE80211_FCTL_MOREDATA 0x2000
-+#define IEEE80211_FCTL_WEP 0x4000
-+#define IEEE80211_FCTL_ORDER 0x8000
-+
-+#define IEEE80211_FTYPE_MGMT 0x0000
-+#define IEEE80211_FTYPE_CTL 0x0004
-+#define IEEE80211_FTYPE_DATA 0x0008
-+
-+/* management */
-+#define IEEE80211_STYPE_ASSOC_REQ 0x0000
-+#define IEEE80211_STYPE_ASSOC_RESP 0x0010
-+#define IEEE80211_STYPE_REASSOC_REQ 0x0020
-+#define IEEE80211_STYPE_REASSOC_RESP 0x0030
-+#define IEEE80211_STYPE_PROBE_REQ 0x0040
-+#define IEEE80211_STYPE_PROBE_RESP 0x0050
-+#define IEEE80211_STYPE_BEACON 0x0080
-+#define IEEE80211_STYPE_ATIM 0x0090
-+#define IEEE80211_STYPE_DISASSOC 0x00A0
-+#define IEEE80211_STYPE_AUTH 0x00B0
-+#define IEEE80211_STYPE_DEAUTH 0x00C0
-+#define IEEE80211_STYPE_MANAGE_ACT 0x00D0
-+
-+/* control */
-+#define IEEE80211_STYPE_PSPOLL 0x00A0
-+#define IEEE80211_STYPE_RTS 0x00B0
-+#define IEEE80211_STYPE_CTS 0x00C0
-+#define IEEE80211_STYPE_ACK 0x00D0
-+#define IEEE80211_STYPE_CFEND 0x00E0
-+#define IEEE80211_STYPE_CFENDACK 0x00F0
-+
-+/* data */
-+#define IEEE80211_STYPE_DATA 0x0000
-+#define IEEE80211_STYPE_DATA_CFACK 0x0010
-+#define IEEE80211_STYPE_DATA_CFPOLL 0x0020
-+#define IEEE80211_STYPE_DATA_CFACKPOLL 0x0030
-+#define IEEE80211_STYPE_NULLFUNC 0x0040
-+#define IEEE80211_STYPE_CFACK 0x0050
-+#define IEEE80211_STYPE_CFPOLL 0x0060
-+#define IEEE80211_STYPE_CFACKPOLL 0x0070
-+#define IEEE80211_STYPE_QOS_DATA 0x0080 //added for WMM 2006/8/2
-+#define IEEE80211_STYPE_QOS_NULL 0x00C0
-+
-+
-+#define IEEE80211_SCTL_FRAG 0x000F
-+#define IEEE80211_SCTL_SEQ 0xFFF0
-+
-+
-+/* debug macros */
-+
-+#ifdef CONFIG_IEEE80211_DEBUG
-+extern u32 ieee80211_debug_level;
-+#define IEEE80211_DEBUG(level, fmt, args...) \
-+do { if (ieee80211_debug_level & (level)) \
-+ printk(KERN_DEBUG "ieee80211: %c %s " fmt, \
-+ in_interrupt() ? 'I' : 'U', __FUNCTION__ , ## args); } while (0)
-+#else
-+#define IEEE80211_DEBUG(level, fmt, args...) do {} while (0)
-+#endif /* CONFIG_IEEE80211_DEBUG */
-+
-+/*
-+ * To use the debug system;
-+ *
-+ * If you are defining a new debug classification, simply add it to the #define
-+ * list here in the form of:
-+ *
-+ * #define IEEE80211_DL_xxxx VALUE
-+ *
-+ * shifting value to the left one bit from the previous entry. xxxx should be
-+ * the name of the classification (for example, WEP)
-+ *
-+ * You then need to either add a IEEE80211_xxxx_DEBUG() macro definition for your
-+ * classification, or use IEEE80211_DEBUG(IEEE80211_DL_xxxx, ...) whenever you want
-+ * to send output to that classification.
-+ *
-+ * To add your debug level to the list of levels seen when you perform
-+ *
-+ * % cat /proc/net/ipw/debug_level
-+ *
-+ * you simply need to add your entry to the ipw_debug_levels array.
-+ *
-+ * If you do not see debug_level in /proc/net/ipw then you do not have
-+ * CONFIG_IEEE80211_DEBUG defined in your kernel configuration
-+ *
-+ */
-+
-+#define IEEE80211_DL_INFO (1<<0)
-+#define IEEE80211_DL_WX (1<<1)
-+#define IEEE80211_DL_SCAN (1<<2)
-+#define IEEE80211_DL_STATE (1<<3)
-+#define IEEE80211_DL_MGMT (1<<4)
-+#define IEEE80211_DL_FRAG (1<<5)
-+#define IEEE80211_DL_EAP (1<<6)
-+#define IEEE80211_DL_DROP (1<<7)
-+
-+#define IEEE80211_DL_TX (1<<8)
-+#define IEEE80211_DL_RX (1<<9)
-+
-+#define IEEE80211_ERROR(f, a...) printk(KERN_ERR "ieee80211: " f, ## a)
-+#define IEEE80211_WARNING(f, a...) printk(KERN_WARNING "ieee80211: " f, ## a)
-+#define IEEE80211_DEBUG_INFO(f, a...) IEEE80211_DEBUG(IEEE80211_DL_INFO, f, ## a)
-+
-+#define IEEE80211_DEBUG_WX(f, a...) IEEE80211_DEBUG(IEEE80211_DL_WX, f, ## a)
-+#define IEEE80211_DEBUG_SCAN(f, a...) IEEE80211_DEBUG(IEEE80211_DL_SCAN, f, ## a)
-+#define IEEE80211_DEBUG_STATE(f, a...) IEEE80211_DEBUG(IEEE80211_DL_STATE, f, ## a)
-+#define IEEE80211_DEBUG_MGMT(f, a...) IEEE80211_DEBUG(IEEE80211_DL_MGMT, f, ## a)
-+#define IEEE80211_DEBUG_FRAG(f, a...) IEEE80211_DEBUG(IEEE80211_DL_FRAG, f, ## a)
-+#define IEEE80211_DEBUG_EAP(f, a...) IEEE80211_DEBUG(IEEE80211_DL_EAP, f, ## a)
-+#define IEEE80211_DEBUG_DROP(f, a...) IEEE80211_DEBUG(IEEE80211_DL_DROP, f, ## a)
-+#define IEEE80211_DEBUG_TX(f, a...) IEEE80211_DEBUG(IEEE80211_DL_TX, f, ## a)
-+#define IEEE80211_DEBUG_RX(f, a...) IEEE80211_DEBUG(IEEE80211_DL_RX, f, ## a)
-+#include <linux/netdevice.h>
-+#include <linux/wireless.h>
-+#include <linux/if_arp.h> /* ARPHRD_ETHER */
-+
-+#ifndef WIRELESS_SPY
-+#define WIRELESS_SPY // enable iwspy support
-+#endif
-+#include <net/iw_handler.h> // new driver API
-+
-+#ifndef ETH_P_PAE
-+#define ETH_P_PAE 0x888E /* Port Access Entity (IEEE 802.1X) */
-+#endif /* ETH_P_PAE */
-+
-+#define ETH_P_PREAUTH 0x88C7 /* IEEE 802.11i pre-authentication */
-+
-+#ifndef ETH_P_80211_RAW
-+#define ETH_P_80211_RAW (ETH_P_ECONET + 1)
-+#endif
-+
-+/* IEEE 802.11 defines */
-+
-+#define P80211_OUI_LEN 3
-+
-+struct ieee80211_snap_hdr {
-+
-+ u8 dsap; /* always 0xAA */
-+ u8 ssap; /* always 0xAA */
-+ u8 ctrl; /* always 0x03 */
-+ u8 oui[P80211_OUI_LEN]; /* organizational universal id */
-+
-+} __attribute__ ((packed));
-+
-+#define SNAP_SIZE sizeof(struct ieee80211_snap_hdr)
-+
-+#define WLAN_FC_GET_TYPE(fc) ((fc) & IEEE80211_FCTL_FTYPE)
-+#define WLAN_FC_GET_STYPE(fc) ((fc) & IEEE80211_FCTL_STYPE)
-+
-+#define WLAN_GET_SEQ_FRAG(seq) ((seq) & IEEE80211_SCTL_FRAG)
-+#define WLAN_GET_SEQ_SEQ(seq) ((seq) & IEEE80211_SCTL_SEQ)
-+
-+/* Authentication algorithms */
-+#define WLAN_AUTH_OPEN 0
-+#define WLAN_AUTH_SHARED_KEY 1
-+
-+#define WLAN_AUTH_CHALLENGE_LEN 128
-+
-+#define WLAN_CAPABILITY_BSS (1<<0)
-+#define WLAN_CAPABILITY_IBSS (1<<1)
-+#define WLAN_CAPABILITY_CF_POLLABLE (1<<2)
-+#define WLAN_CAPABILITY_CF_POLL_REQUEST (1<<3)
-+#define WLAN_CAPABILITY_PRIVACY (1<<4)
-+#define WLAN_CAPABILITY_SHORT_PREAMBLE (1<<5)
-+#define WLAN_CAPABILITY_PBCC (1<<6)
-+#define WLAN_CAPABILITY_CHANNEL_AGILITY (1<<7)
-+#define WLAN_CAPABILITY_SHORT_SLOT (1<<10)
-+
-+/* Status codes */
-+#define WLAN_STATUS_SUCCESS 0
-+#define WLAN_STATUS_UNSPECIFIED_FAILURE 1
-+#define WLAN_STATUS_CAPS_UNSUPPORTED 10
-+#define WLAN_STATUS_REASSOC_NO_ASSOC 11
-+#define WLAN_STATUS_ASSOC_DENIED_UNSPEC 12
-+#define WLAN_STATUS_NOT_SUPPORTED_AUTH_ALG 13
-+#define WLAN_STATUS_UNKNOWN_AUTH_TRANSACTION 14
-+#define WLAN_STATUS_CHALLENGE_FAIL 15
-+#define WLAN_STATUS_AUTH_TIMEOUT 16
-+#define WLAN_STATUS_AP_UNABLE_TO_HANDLE_NEW_STA 17
-+#define WLAN_STATUS_ASSOC_DENIED_RATES 18
-+/* 802.11b */
-+#define WLAN_STATUS_ASSOC_DENIED_NOSHORT 19
-+#define WLAN_STATUS_ASSOC_DENIED_NOPBCC 20
-+#define WLAN_STATUS_ASSOC_DENIED_NOAGILITY 21
-+
-+/* Reason codes */
-+#define WLAN_REASON_UNSPECIFIED 1
-+#define WLAN_REASON_PREV_AUTH_NOT_VALID 2
-+#define WLAN_REASON_DEAUTH_LEAVING 3
-+#define WLAN_REASON_DISASSOC_DUE_TO_INACTIVITY 4
-+#define WLAN_REASON_DISASSOC_AP_BUSY 5
-+#define WLAN_REASON_CLASS2_FRAME_FROM_NONAUTH_STA 6
-+#define WLAN_REASON_CLASS3_FRAME_FROM_NONASSOC_STA 7
-+#define WLAN_REASON_DISASSOC_STA_HAS_LEFT 8
-+#define WLAN_REASON_STA_REQ_ASSOC_WITHOUT_AUTH 9
-+
-+
-+/* Information Element IDs */
-+#define WLAN_EID_SSID 0
-+#define WLAN_EID_SUPP_RATES 1
-+#define WLAN_EID_FH_PARAMS 2
-+#define WLAN_EID_DS_PARAMS 3
-+#define WLAN_EID_CF_PARAMS 4
-+#define WLAN_EID_TIM 5
-+#define WLAN_EID_IBSS_PARAMS 6
-+#define WLAN_EID_CHALLENGE 16
-+#define WLAN_EID_RSN 48
-+#define WLAN_EID_GENERIC 221
-+
-+#define IEEE80211_MGMT_HDR_LEN 24
-+#define IEEE80211_DATA_HDR3_LEN 24
-+#define IEEE80211_DATA_HDR4_LEN 30
-+
-+
-+#define IEEE80211_STATMASK_SIGNAL (1<<0)
-+#define IEEE80211_STATMASK_RSSI (1<<1)
-+#define IEEE80211_STATMASK_NOISE (1<<2)
-+#define IEEE80211_STATMASK_RATE (1<<3)
-+#define IEEE80211_STATMASK_WEMASK 0x7
-+
-+
-+#define IEEE80211_CCK_MODULATION (1<<0)
-+#define IEEE80211_OFDM_MODULATION (1<<1)
-+
-+#define IEEE80211_24GHZ_BAND (1<<0)
-+#define IEEE80211_52GHZ_BAND (1<<1)
-+
-+#define IEEE80211_CCK_RATE_LEN 4
-+#define IEEE80211_CCK_RATE_1MB 0x02
-+#define IEEE80211_CCK_RATE_2MB 0x04
-+#define IEEE80211_CCK_RATE_5MB 0x0B
-+#define IEEE80211_CCK_RATE_11MB 0x16
-+#define IEEE80211_OFDM_RATE_LEN 8
-+#define IEEE80211_OFDM_RATE_6MB 0x0C
-+#define IEEE80211_OFDM_RATE_9MB 0x12
-+#define IEEE80211_OFDM_RATE_12MB 0x18
-+#define IEEE80211_OFDM_RATE_18MB 0x24
-+#define IEEE80211_OFDM_RATE_24MB 0x30
-+#define IEEE80211_OFDM_RATE_36MB 0x48
-+#define IEEE80211_OFDM_RATE_48MB 0x60
-+#define IEEE80211_OFDM_RATE_54MB 0x6C
-+#define IEEE80211_BASIC_RATE_MASK 0x80
-+
-+#define IEEE80211_CCK_RATE_1MB_MASK (1<<0)
-+#define IEEE80211_CCK_RATE_2MB_MASK (1<<1)
-+#define IEEE80211_CCK_RATE_5MB_MASK (1<<2)
-+#define IEEE80211_CCK_RATE_11MB_MASK (1<<3)
-+#define IEEE80211_OFDM_RATE_6MB_MASK (1<<4)
-+#define IEEE80211_OFDM_RATE_9MB_MASK (1<<5)
-+#define IEEE80211_OFDM_RATE_12MB_MASK (1<<6)
-+#define IEEE80211_OFDM_RATE_18MB_MASK (1<<7)
-+#define IEEE80211_OFDM_RATE_24MB_MASK (1<<8)
-+#define IEEE80211_OFDM_RATE_36MB_MASK (1<<9)
-+#define IEEE80211_OFDM_RATE_48MB_MASK (1<<10)
-+#define IEEE80211_OFDM_RATE_54MB_MASK (1<<11)
-+
-+#define IEEE80211_CCK_RATES_MASK 0x0000000F
-+#define IEEE80211_CCK_BASIC_RATES_MASK (IEEE80211_CCK_RATE_1MB_MASK | \
-+ IEEE80211_CCK_RATE_2MB_MASK)
-+#define IEEE80211_CCK_DEFAULT_RATES_MASK (IEEE80211_CCK_BASIC_RATES_MASK | \
-+ IEEE80211_CCK_RATE_5MB_MASK | \
-+ IEEE80211_CCK_RATE_11MB_MASK)
-+
-+#define IEEE80211_OFDM_RATES_MASK 0x00000FF0
-+#define IEEE80211_OFDM_BASIC_RATES_MASK (IEEE80211_OFDM_RATE_6MB_MASK | \
-+ IEEE80211_OFDM_RATE_12MB_MASK | \
-+ IEEE80211_OFDM_RATE_24MB_MASK)
-+#define IEEE80211_OFDM_DEFAULT_RATES_MASK (IEEE80211_OFDM_BASIC_RATES_MASK | \
-+ IEEE80211_OFDM_RATE_9MB_MASK | \
-+ IEEE80211_OFDM_RATE_18MB_MASK | \
-+ IEEE80211_OFDM_RATE_36MB_MASK | \
-+ IEEE80211_OFDM_RATE_48MB_MASK | \
-+ IEEE80211_OFDM_RATE_54MB_MASK)
-+#define IEEE80211_DEFAULT_RATES_MASK (IEEE80211_OFDM_DEFAULT_RATES_MASK | \
-+ IEEE80211_CCK_DEFAULT_RATES_MASK)
-+
-+#define IEEE80211_NUM_OFDM_RATES 8
-+#define IEEE80211_NUM_CCK_RATES 4
-+#define IEEE80211_OFDM_SHIFT_MASK_A 4
-+
-+
-+
-+
-+/* NOTE: This data is for statistical purposes; not all hardware provides this
-+ * information for frames received. Not setting these will not cause
-+ * any adverse affects. */
-+struct ieee80211_rx_stats {
-+ u32 mac_time[2];
-+ u8 signalstrength;
-+ s8 rssi;
-+ u8 signal;
-+ u8 noise;
-+ u16 rate; /* in 100 kbps */
-+ u8 received_channel;
-+ u8 control;
-+ u8 mask;
-+ u8 freq;
-+ u16 len;
-+ u8 nic_type;
-+};
-+
-+/* IEEE 802.11 requires that STA supports concurrent reception of at least
-+ * three fragmented frames. This define can be increased to support more
-+ * concurrent frames, but it should be noted that each entry can consume about
-+ * 2 kB of RAM and increasing cache size will slow down frame reassembly. */
-+#define IEEE80211_FRAG_CACHE_LEN 4
-+
-+struct ieee80211_frag_entry {
-+ unsigned long first_frag_time;
-+ unsigned int seq;
-+ unsigned int last_frag;
-+ struct sk_buff *skb;
-+ u8 src_addr[ETH_ALEN];
-+ u8 dst_addr[ETH_ALEN];
-+};
-+
-+struct ieee80211_stats {
-+ unsigned int tx_unicast_frames;
-+ unsigned int tx_multicast_frames;
-+ unsigned int tx_fragments;
-+ unsigned int tx_unicast_octets;
-+ unsigned int tx_multicast_octets;
-+ unsigned int tx_deferred_transmissions;
-+ unsigned int tx_single_retry_frames;
-+ unsigned int tx_multiple_retry_frames;
-+ unsigned int tx_retry_limit_exceeded;
-+ unsigned int tx_discards;
-+ unsigned int rx_unicast_frames;
-+ unsigned int rx_multicast_frames;
-+ unsigned int rx_fragments;
-+ unsigned int rx_unicast_octets;
-+ unsigned int rx_multicast_octets;
-+ unsigned int rx_fcs_errors;
-+ unsigned int rx_discards_no_buffer;
-+ unsigned int tx_discards_wrong_sa;
-+ unsigned int rx_discards_undecryptable;
-+ unsigned int rx_message_in_msg_fragments;
-+ unsigned int rx_message_in_bad_msg_fragments;
-+};
-+
-+struct ieee80211_softmac_stats{
-+ unsigned int rx_ass_ok;
-+ unsigned int rx_ass_err;
-+ unsigned int rx_probe_rq;
-+ unsigned int tx_probe_rs;
-+ unsigned int tx_beacons;
-+ unsigned int rx_auth_rq;
-+ unsigned int rx_auth_rs_ok;
-+ unsigned int rx_auth_rs_err;
-+ unsigned int tx_auth_rq;
-+ unsigned int no_auth_rs;
-+ unsigned int no_ass_rs;
-+ unsigned int tx_ass_rq;
-+ unsigned int rx_ass_rq;
-+ unsigned int tx_probe_rq;
-+ unsigned int reassoc;
-+ unsigned int swtxstop;
-+ unsigned int swtxawake;
-+};
-+
-+struct ieee80211_device;
-+
-+#include "ieee80211_crypt.h"
-+
-+#define SEC_KEY_1 (1<<0)
-+#define SEC_KEY_2 (1<<1)
-+#define SEC_KEY_3 (1<<2)
-+#define SEC_KEY_4 (1<<3)
-+#define SEC_ACTIVE_KEY (1<<4)
-+#define SEC_AUTH_MODE (1<<5)
-+#define SEC_UNICAST_GROUP (1<<6)
-+#define SEC_LEVEL (1<<7)
-+#define SEC_ENABLED (1<<8)
-+
-+#define SEC_LEVEL_0 0 /* None */
-+#define SEC_LEVEL_1 1 /* WEP 40 and 104 bit */
-+#define SEC_LEVEL_2 2 /* Level 1 + TKIP */
-+#define SEC_LEVEL_2_CKIP 3 /* Level 1 + CKIP */
-+#define SEC_LEVEL_3 4 /* Level 2 + CCMP */
-+
-+#define WEP_KEYS 4
-+#define WEP_KEY_LEN 13
-+#define ALG_KEY_LEN 32
-+
-+#ifdef _RTL8187_EXT_PATCH_
-+#define MAX_MP 16
-+#endif
-+struct ieee80211_security {
-+ u16 active_key:2,
-+ enabled:1,
-+ auth_mode:2,
-+ auth_algo:4,
-+ unicast_uses_group:1;
-+ u8 key_sizes[WEP_KEYS];
-+ u8 keys[WEP_KEYS][ALG_KEY_LEN];
-+ u8 level;
-+ u16 flags;
-+} __attribute__ ((packed));
-+
-+
-+/*
-+
-+ 802.11 data frame from AP
-+
-+ ,-------------------------------------------------------------------.
-+Bytes | 2 | 2 | 6 | 6 | 6 | 2 | 0..2312 | 4 |
-+ |------|------|---------|---------|---------|------|---------|------|
-+Desc. | ctrl | dura | DA/RA | TA | SA | Sequ | frame | fcs |
-+ | | tion | (BSSID) | | | ence | data | |
-+ `-------------------------------------------------------------------'
-+
-+Total: 28-2340 bytes
-+
-+*/
-+
-+struct ieee80211_header_data {
-+ u16 frame_ctl;
-+ u16 duration_id;
-+ u8 addr1[6];
-+ u8 addr2[6];
-+ u8 addr3[6];
-+ u16 seq_ctrl;
-+};
-+
-+#define BEACON_PROBE_SSID_ID_POSITION 12
-+
-+/* Management Frame Information Element Types */
-+#define MFIE_TYPE_SSID 0
-+#define MFIE_TYPE_RATES 1
-+#define MFIE_TYPE_FH_SET 2
-+#define MFIE_TYPE_DS_SET 3
-+#define MFIE_TYPE_CF_SET 4
-+#define MFIE_TYPE_TIM 5
-+#define MFIE_TYPE_IBSS_SET 6
-+#define MFIE_TYPE_COUNTRY 7
-+#define MFIE_TYPE_CHALLENGE 16
-+#define MFIE_TYPE_ERP 42
-+#define MFIE_TYPE_RSN 48
-+#define MFIE_TYPE_RATES_EX 50
-+#define MFIE_TYPE_GENERIC 221
-+
-+#ifdef ENABLE_DOT11D
-+typedef enum
-+{
-+ COUNTRY_CODE_FCC = 0,
-+ COUNTRY_CODE_IC = 1,
-+ COUNTRY_CODE_ETSI = 2,
-+ COUNTRY_CODE_SPAIN = 3,
-+ COUNTRY_CODE_FRANCE = 4,
-+ COUNTRY_CODE_MKK = 5,
-+ COUNTRY_CODE_MKK1 = 6,
-+ COUNTRY_CODE_ISRAEL = 7,
-+ COUNTRY_CODE_TELEC = 8,
-+ COUNTRY_CODE_GLOBAL_DOMAIN = 9,
-+ COUNTRY_CODE_WORLD_WIDE_13_INDEX = 10
-+}country_code_type_t;
-+#endif
-+
-+
-+struct ieee80211_info_element_hdr {
-+ u8 id;
-+ u8 len;
-+} __attribute__ ((packed));
-+
-+struct ieee80211_info_element {
-+ u8 id;
-+ u8 len;
-+ u8 data[0];
-+} __attribute__ ((packed));
-+
-+/*
-+ * These are the data types that can make up management packets
-+ *
-+ u16 auth_algorithm;
-+ u16 auth_sequence;
-+ u16 beacon_interval;
-+ u16 capability;
-+ u8 current_ap[ETH_ALEN];
-+ u16 listen_interval;
-+ struct {
-+ u16 association_id:14, reserved:2;
-+ } __attribute__ ((packed));
-+ u32 time_stamp[2];
-+ u16 reason;
-+ u16 status;
-+*/
-+
-+#define IEEE80211_DEFAULT_TX_ESSID "Penguin"
-+#define IEEE80211_DEFAULT_BASIC_RATE 10
-+#define IEEE80211_DEFAULT_MESHID "802.11s"
-+#define IEEE80211_DEFAULT_MESH_CHAN 1
-+
-+struct ieee80211_authentication {
-+ struct ieee80211_header_data header;
-+ u16 algorithm;
-+ u16 transaction;
-+ u16 status;
-+ //struct ieee80211_info_element_hdr info_element;
-+} __attribute__ ((packed));
-+
-+
-+struct ieee80211_probe_response {
-+ struct ieee80211_header_data header;
-+ u32 time_stamp[2];
-+ u16 beacon_interval;
-+ u16 capability;
-+ struct ieee80211_info_element info_element;
-+} __attribute__ ((packed));
-+
-+struct ieee80211_probe_request {
-+ struct ieee80211_header_data header;
-+ /*struct ieee80211_info_element info_element;*/
-+} __attribute__ ((packed));
-+
-+struct ieee80211_assoc_request_frame {
-+ struct ieee80211_hdr_3addr header;
-+ u16 capability;
-+ u16 listen_interval;
-+ //u8 current_ap[ETH_ALEN];
-+ struct ieee80211_info_element_hdr info_element;
-+} __attribute__ ((packed));
-+
-+struct ieee80211_assoc_response_frame {
-+ struct ieee80211_hdr_3addr header;
-+ u16 capability;
-+ u16 status;
-+ u16 aid;
-+ struct ieee80211_info_element info_element; /* supported rates */
-+} __attribute__ ((packed));
-+
-+
-+struct ieee80211_txb {
-+ u8 nr_frags;
-+ u8 encrypted;
-+ u16 reserved;
-+ u16 frag_size;
-+ u16 payload_size;
-+ struct sk_buff *fragments[0];
-+};
-+
-+struct ieee80211_wmm_ac_param {
-+ u8 ac_aci_acm_aifsn;
-+ u8 ac_ecwmin_ecwmax;
-+ u16 ac_txop_limit;
-+};
-+
-+struct ieee80211_wmm_ts_info {
-+ u8 ac_dir_tid;
-+ u8 ac_up_psb;
-+ u8 reserved;
-+} __attribute__ ((packed));
-+
-+struct ieee80211_wmm_tspec_elem {
-+ struct ieee80211_wmm_ts_info ts_info;
-+ u16 norm_msdu_size;
-+ u16 max_msdu_size;
-+ u32 min_serv_inter;
-+ u32 max_serv_inter;
-+ u32 inact_inter;
-+ u32 suspen_inter;
-+ u32 serv_start_time;
-+ u32 min_data_rate;
-+ u32 mean_data_rate;
-+ u32 peak_data_rate;
-+ u32 max_burst_size;
-+ u32 delay_bound;
-+ u32 min_phy_rate;
-+ u16 surp_band_allow;
-+ u16 medium_time;
-+}__attribute__((packed));
-+
-+enum {WMM_all_frame, WMM_two_frame, WMM_four_frame, WMM_six_frame};
-+#define MAX_SP_Len (WMM_all_frame << 4)
-+#define IEEE80211_QOS_TID 0x0f
-+#define QOS_CTL_NOTCONTAIN_ACK (0x01 << 5)
-+
-+/* SWEEP TABLE ENTRIES NUMBER*/
-+#define MAX_SWEEP_TAB_ENTRIES 42
-+#define MAX_SWEEP_TAB_ENTRIES_PER_PACKET 7
-+/* MAX_RATES_LENGTH needs to be 12. The spec says 8, and many APs
-+ * only use 8, and then use extended rates for the remaining supported
-+ * rates. Other APs, however, stick all of their supported rates on the
-+ * main rates information element... */
-+#define MAX_RATES_LENGTH ((u8)12)
-+#define MAX_RATES_EX_LENGTH ((u8)16)
-+#define MAX_NETWORK_COUNT 128
-+#ifdef ENABLE_DOT11D
-+#define MAX_CHANNEL_NUMBER 165 //YJ,modified,080625
-+#define MAX_IE_LEN 0xFF //+YJ,080625
-+#else
-+#define MAX_CHANNEL_NUMBER 161
-+#endif
-+
-+//#define IEEE80211_SOFTMAC_SCAN_TIME 400
-+#define IEEE80211_SOFTMAC_SCAN_TIME 100//lzm mod 081209
-+//(HZ / 2)
-+#define IEEE80211_SOFTMAC_ASSOC_RETRY_TIME (HZ * 2)
-+
-+#define CRC_LENGTH 4U
-+
-+#define MAX_WPA_IE_LEN 64
-+
-+#define NETWORK_EMPTY_ESSID (1<<0)
-+#define NETWORK_HAS_OFDM (1<<1)
-+#define NETWORK_HAS_CCK (1<<2)
-+
-+#define IEEE80211_DTIM_MBCAST 4
-+#define IEEE80211_DTIM_UCAST 2
-+#define IEEE80211_DTIM_VALID 1
-+#define IEEE80211_DTIM_INVALID 0
-+
-+#define IEEE80211_PS_DISABLED 0
-+#define IEEE80211_PS_UNICAST IEEE80211_DTIM_UCAST
-+#define IEEE80211_PS_MBCAST IEEE80211_DTIM_MBCAST
-+
-+//added by David for QoS 2006/6/30
-+//#define WMM_Hang_8187
-+#ifdef WMM_Hang_8187
-+#undef WMM_Hang_8187
-+#endif
-+
-+#define WME_AC_BE 0x00
-+#define WME_AC_BK 0x01
-+#define WME_AC_VI 0x02
-+#define WME_AC_VO 0x03
-+#define WME_ACI_MASK 0x03
-+#define WME_AIFSN_MASK 0x03
-+#define WME_AC_PRAM_LEN 16
-+
-+//UP Mapping to AC, using in MgntQuery_SequenceNumber() and maybe for DSCP
-+//#define UP2AC(up) ((up<3) ? ((up==0)?1:0) : (up>>1))
-+#define UP2AC(up) ( \
-+ ((up) < 1) ? WME_AC_BE : \
-+ ((up) < 3) ? WME_AC_BK : \
-+ ((up) < 4) ? WME_AC_BE : \
-+ ((up) < 6) ? WME_AC_VI : \
-+ WME_AC_VO)
-+//AC Mapping to UP, using in Tx part for selecting the corresponding TX queue
-+#define AC2UP(_ac) ( \
-+ ((_ac) == WME_AC_VO) ? 6 : \
-+ ((_ac) == WME_AC_VI) ? 5 : \
-+ ((_ac) == WME_AC_BK) ? 1 : \
-+ 0)
-+
-+#define ETHER_ADDR_LEN 6 /* length of an Ethernet address */
-+struct ether_header {
-+ u8 ether_dhost[ETHER_ADDR_LEN];
-+ u8 ether_shost[ETHER_ADDR_LEN];
-+ u16 ether_type;
-+} __attribute__((packed));
-+
-+#ifndef ETHERTYPE_PAE
-+#define ETHERTYPE_PAE 0x888e /* EAPOL PAE/802.1x */
-+#endif
-+#ifndef ETHERTYPE_IP
-+#define ETHERTYPE_IP 0x0800 /* IP protocol */
-+#endif
-+
-+struct ieee80211_network {
-+ /* These entries are used to identify a unique network */
-+ u8 bssid[ETH_ALEN];
-+ u8 channel;
-+ /* Ensure null-terminated for any debug msgs */
-+ u8 ssid[IW_ESSID_MAX_SIZE + 1];
-+ u8 ssid_len;
-+
-+ /* These are network statistics */
-+ struct ieee80211_rx_stats stats;
-+ u16 capability;
-+ u8 rates[MAX_RATES_LENGTH];
-+ u8 rates_len;
-+ u8 rates_ex[MAX_RATES_EX_LENGTH];
-+ u8 rates_ex_len;
-+ unsigned long last_scanned;
-+ u8 mode;
-+ u8 flags;
-+ u32 last_associate;
-+ u32 time_stamp[2];
-+ u16 beacon_interval;
-+ u16 listen_interval;
-+ u16 atim_window;
-+ u8 wpa_ie[MAX_WPA_IE_LEN];
-+ size_t wpa_ie_len;
-+ u8 rsn_ie[MAX_WPA_IE_LEN];
-+ size_t rsn_ie_len;
-+ u8 dtim_period;
-+ u8 dtim_data;
-+ u32 last_dtim_sta_time[2];
-+#ifdef _RTL8187_EXT_PATCH_
-+ void *ext_entry;
-+#endif
-+ struct list_head list;
-+ //appeded for QoS
-+ u8 wmm_info;
-+ struct ieee80211_wmm_ac_param wmm_param[4];
-+ u8 QoS_Enable;
-+ u8 SignalStrength;
-+#ifdef THOMAS_TURBO
-+ u8 Turbo_Enable;//enable turbo mode, added by thomas
-+#endif
-+
-+#ifdef ENABLE_DOT11D
-+ u16 CountryIeLen;
-+ u8 CountryIeBuf[MAX_IE_LEN];
-+#endif
-+
-+};
-+
-+enum ieee80211_state {
-+
-+ /* the card is not linked at all */
-+ IEEE80211_NOLINK = 0,
-+
-+ /* IEEE80211_ASSOCIATING* are for BSS client mode
-+ * the driver shall not perform RX filtering unless
-+ * the state is LINKED.
-+ * The driver shall just check for the state LINKED and
-+ * defaults to NOLINK for ALL the other states (including
-+ * LINKED_SCANNING)
-+ */
-+
-+ /* the association procedure will start (wq scheduling)*/
-+ IEEE80211_ASSOCIATING,
-+ IEEE80211_ASSOCIATING_RETRY,
-+
-+ /* the association procedure is sending AUTH request*/
-+ IEEE80211_ASSOCIATING_AUTHENTICATING,
-+
-+ /* the association procedure has successfully authentcated
-+ * and is sending association request
-+ */
-+ IEEE80211_ASSOCIATING_AUTHENTICATED,
-+
-+ /* the link is ok. the card associated to a BSS or linked
-+ * to a ibss cell or acting as an AP and creating the bss
-+ */
-+ IEEE80211_LINKED,
-+
-+ /* same as LINKED, but the driver shall apply RX filter
-+ * rules as we are in NO_LINK mode. As the card is still
-+ * logically linked, but it is doing a syncro site survey
-+ * then it will be back to LINKED state.
-+ */
-+ IEEE80211_LINKED_SCANNING,
-+//by amy for mesh
-+ IEEE80211_MESH_SCANNING,
-+ IEEE80211_MESH_LINKED,
-+//by amy for mesh
-+
-+};
-+
-+#define DEFAULT_MAX_SCAN_AGE (15 * HZ)
-+#define DEFAULT_FTS 2346
-+#define MAC_FMT "%02x:%02x:%02x:%02x:%02x:%02x"
-+#define MAC_ARG(x) ((u8*)(x))[0],((u8*)(x))[1],((u8*)(x))[2],((u8*)(x))[3],((u8*)(x))[4],((u8*)(x))[5]
-+
-+
-+#if (LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,11))
-+extern inline int is_multicast_ether_addr(const u8 *addr)
-+{
-+ return ((addr[0] != 0xff) && (0x01 & addr[0]));
-+}
-+#endif
-+
-+#if (LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,13))
-+extern inline int is_broadcast_ether_addr(const u8 *addr)
-+{
-+ return ((addr[0] == 0xff) && (addr[1] == 0xff) && (addr[2] == 0xff) && \
-+ (addr[3] == 0xff) && (addr[4] == 0xff) && (addr[5] == 0xff));
-+}
-+#endif
-+
-+#define CFG_IEEE80211_RESERVE_FCS (1<<0)
-+#define CFG_IEEE80211_COMPUTE_FCS (1<<1)
-+
-+typedef struct tx_pending_t{
-+ int frag;
-+ struct ieee80211_txb *txb;
-+}tx_pending_t;
-+
-+#ifdef _RTL8187_EXT_PATCH_
-+struct ieee80211_crypt_data_list{
-+ u8 used;
-+ u8 mac_addr[ETH_ALEN]; //record mac_add
-+ struct ieee80211_crypt_data *crypt[WEP_KEYS];
-+}__attribute__((packed));
-+
-+#endif
-+
-+struct ieee80211_device {
-+ struct net_device *dev;
-+
-+ /* Bookkeeping structures */
-+ struct net_device_stats stats;
-+ struct ieee80211_stats ieee_stats;
-+ struct ieee80211_softmac_stats softmac_stats;
-+
-+ /* Probe / Beacon management */
-+ struct list_head network_free_list;
-+ struct list_head network_list;
-+ struct ieee80211_network *networks;
-+ int scans;
-+ int scan_age;
-+
-+ int iw_mode; /* operating mode (IW_MODE_*) */
-+#ifdef _RTL8187_EXT_PATCH_
-+ int iw_ext_mode; // if iw_mode == iw_ext_mode, do ext_patch_**();
-+#endif
-+
-+ spinlock_t lock;
-+ spinlock_t wpax_suitlist_lock;
-+
-+ int tx_headroom; /* Set to size of any additional room needed at front
-+ * of allocated Tx SKBs */
-+ u32 config;
-+
-+ /* WEP and other encryption related settings at the device level */
-+ int open_wep; /* Set to 1 to allow unencrypted frames */
-+
-+ int reset_on_keychange; /* Set to 1 if the HW needs to be reset on
-+ * WEP key changes */
-+
-+ /* If the host performs {en,de}cryption, then set to 1 */
-+ int host_encrypt;
-+ int host_decrypt;
-+ int ieee802_1x; /* is IEEE 802.1X used */
-+
-+ /* WPA data */
-+ int wpa_enabled;
-+ int drop_unencrypted;
-+ int tkip_countermeasures;
-+ int privacy_invoked;
-+ size_t wpa_ie_len;
-+ u8 *wpa_ie;
-+
-+//#ifdef JOHN_TKIP
-+ u8 ap_mac_addr[6];
-+ u16 pairwise_key_type;
-+ u16 broadcast_key_type;
-+//#endif
-+ struct list_head crypt_deinit_list;
-+#ifdef _RTL8187_EXT_PATCH_
-+ struct ieee80211_crypt_data_list* cryptlist[MAX_MP];
-+#else
-+ struct ieee80211_crypt_data *crypt[WEP_KEYS];
-+#endif
-+ int tx_keyidx; /* default TX key index (crypt[tx_keyidx]) */
-+ struct timer_list crypt_deinit_timer;
-+
-+ int bcrx_sta_key; /* use individual keys to override default keys even
-+ * with RX of broad/multicast frames */
-+
-+ /* Fragmentation structures */
-+ // each streaming contain a entry
-+ struct ieee80211_frag_entry frag_cache[17][IEEE80211_FRAG_CACHE_LEN];
-+ unsigned int frag_next_idx[17];
-+ u16 fts; /* Fragmentation Threshold */
-+
-+ /* This stores infos for the current network.
-+ * Either the network we are associated in INFRASTRUCTURE
-+ * or the network that we are creating in MASTER mode.
-+ * ad-hoc is a mixture ;-).
-+ * Note that in infrastructure mode, even when not associated,
-+ * fields bssid and essid may be valid (if wpa_set and essid_set
-+ * are true) as thy carry the value set by the user via iwconfig
-+ */
-+ struct ieee80211_network current_network;
-+
-+
-+ enum ieee80211_state state;
-+
-+ int short_slot;
-+ int mode; /* A, B, G */
-+ int modulation; /* CCK, OFDM */
-+ int freq_band; /* 2.4Ghz, 5.2Ghz, Mixed */
-+ int abg_true; /* ABG flag */
-+
-+ /* used for forcing the ibss workqueue to terminate
-+ * without wait for the syncro scan to terminate
-+ */
-+ short sync_scan_hurryup;
-+
-+#ifdef ENABLE_DOT11D
-+ void * pDot11dInfo;
-+ bool bGlobalDomain;
-+ bool bWorldWide13;//lzm add 20081205
-+
-+ // For Liteon Ch12~13 passive scan
-+ u8 MinPassiveChnlNum;
-+ u8 IbssStartChnl;
-+#else
-+ /* map of allowed channels. 0 is dummy */
-+ // FIXME: remeber to default to a basic channel plan depending of the PHY type
-+ int channel_map[MAX_CHANNEL_NUMBER+1];
-+#endif
-+
-+ int rate; /* current rate */
-+ int basic_rate;
-+ //FIXME: pleace callback, see if redundant with softmac_features
-+ short active_scan;
-+
-+#ifdef _RTL8187_EXT_PATCH_
-+// short ch_lock;
-+ short meshScanMode;
-+#endif
-+ /* this contains flags for selectively enable softmac support */
-+ u16 softmac_features;
-+
-+ /* if the sequence control field is not filled by HW */
-+ u16 seq_ctrl[5];
-+
-+ /* association procedure transaction sequence number */
-+ u16 associate_seq;
-+
-+ /* AID for RTXed association responses */
-+ u16 assoc_id;
-+
-+ /* power save mode related*/
-+ short ps;
-+ short sta_sleep;
-+ int ps_timeout;
-+ struct tasklet_struct ps_task;
-+ u32 ps_th;
-+ u32 ps_tl;
-+
-+ short raw_tx;
-+ /* used if IEEE_SOFTMAC_TX_QUEUE is set */
-+ short queue_stop;
-+ short scanning;
-+ short scan_watchdog;//lzm add 081215 for roaming
-+ short proto_started;
-+
-+ struct semaphore wx_sem;
-+ struct semaphore scan_sem;
-+ struct semaphore ips_sem;
-+ spinlock_t mgmt_tx_lock;
-+ spinlock_t beacon_lock;
-+ spinlock_t beaconflag_lock;
-+ short beacon_txing;
-+
-+ short wap_set;
-+ short ssid_set;
-+
-+ u8 wpax_type_set; //{added by David, 2006.9.28}
-+ u32 wpax_type_notify; //{added by David, 2006.9.26}
-+
-+ /* QoS related flag */
-+ char init_wmmparam_flag;
-+
-+ /* for discarding duplicated packets in IBSS */
-+ struct list_head ibss_mac_hash[IEEE_IBSS_MAC_HASH_SIZE];
-+
-+ /* for discarding duplicated packets in Mesh */ //added by david 2008.2.28/
-+ struct list_head mesh_mac_hash[IEEE_MESH_MAC_HASH_SIZE];
-+
-+ /* for discarding duplicated packets in BSS */
-+ u16 last_rxseq_num[17]; /* rx seq previous per-tid */
-+ u16 last_rxfrag_num[17];/* tx frag previous per-tid */
-+ unsigned long last_packet_time[17];
-+
-+ /* for PS mode */
-+ unsigned long last_rx_ps_time;
-+
-+ /* used if IEEE_SOFTMAC_SINGLE_QUEUE is set */
-+ struct sk_buff *mgmt_queue_ring[MGMT_QUEUE_NUM];
-+ int mgmt_queue_head;
-+ int mgmt_queue_tail;
-+//by amy for ps
-+ bool bInactivePs;
-+ bool actscanning;
-+ u16 ListenInterval;
-+ u32 NumRxData;
-+ unsigned long NumRxDataInPeriod; //YJ,add,080828
-+ unsigned long NumRxBcnInPeriod; //YJ,add,080828
-+//by amy for ps
-+ short meshid_set;
-+ /* used if IEEE_SOFTMAC_TX_QUEUE is set */
-+ struct tx_pending_t tx_pending;
-+
-+ /* used if IEEE_SOFTMAC_ASSOCIATE is set */
-+ struct timer_list associate_timer;
-+
-+ /* used if IEEE_SOFTMAC_BEACONS is set */
-+ struct timer_list beacon_timer;
-+#if LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0)
-+ struct work_struct associate_complete_wq;
-+// struct work_struct associate_retry_wq;
-+// struct work_struct start_ibss_wq;
-+ struct work_struct associate_procedure_wq;
-+ struct work_struct ips_leave_wq; //YJ,add,081230,for IPS
-+ bool bHwRadioOff;//by lizhaoming
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)
-+ struct delayed_work softmac_scan_wq;
-+ struct delayed_work start_ibss_wq;
-+ struct delayed_work associate_retry_wq;
-+//by amy for rate adaptive
-+ struct delayed_work rate_adapter_wq;
-+//by amy for rate adaptive
-+ struct delayed_work watch_dog_wq;
-+ struct delayed_work hw_dig_wq;
-+ struct delayed_work tx_pw_wq;
-+
-+//Added for RF power on power off by lizhaoming 080512
-+#ifdef POLLING_METHOD_FOR_RADIO
-+ struct delayed_work GPIOChangeRFWorkItem;
-+#endif
-+
-+#ifdef SW_ANTE_DIVERSITY
-+ struct delayed_work SwAntennaWorkItem;
-+#endif
-+
-+#else
-+ struct work_struct softmac_scan_wq;
-+ struct work_struct start_ibss_wq;
-+ struct work_struct associate_retry_wq;
-+//by amy for rate adaptive
-+ struct work_struct rate_adapter_wq;
-+//by amy for rate adaptive
-+ struct work_struct watch_dog_wq;
-+ struct work_struct hw_dig_wq;
-+ struct work_struct tx_pw_wq;
-+
-+//Added for RF power on power off by lizhaoming 080512
-+#ifdef POLLING_METHOD_FOR_RADIO
-+ struct work_struct GPIOChangeRFWorkItem;
-+#endif
-+
-+#ifdef SW_ANTE_DIVERSITY
-+ struct work_struct SwAntennaWorkItem;
-+#endif
-+
-+#endif
-+
-+//struct work_struct softmac_scan_wq;
-+ struct work_struct wx_sync_scan_wq;
-+ struct work_struct wmm_param_update_wq;
-+#ifdef _RTL8187_EXT_PATCH_
-+ struct work_struct ext_stop_scan_wq;
-+ struct work_struct ext_send_beacon_wq;
-+#endif
-+ struct workqueue_struct *wq;
-+#else
-+ /* used for periodly scan */
-+ struct timer_list scan_timer;
-+
-+ struct tq_struct associate_complete_wq;
-+ struct tq_struct associate_retry_wq;
-+ struct tq_struct start_ibss_wq;
-+ struct tq_struct associate_procedure_wq;
-+ struct tq_struct ips_leave_wq; //YJ,add,081230,for IPS
-+ struct tq_struct softmac_scan_wq;
-+ struct tq_struct wx_sync_scan_wq;
-+ struct tq_struct wmm_param_update_wq;
-+#ifdef _RTL8187_EXT_PATCH_
-+ struct tq_struct ext_stop_scan_wq;
-+ struct tq_struct ext_send_beacon_wq;
-+#endif
-+#endif
-+
-+ /* Callback functions */
-+ void (*set_security)(struct net_device *dev,
-+ struct ieee80211_security *sec);
-+
-+ /* Used to TX data frame by using txb structs.
-+ * this is not used if in the softmac_features
-+ * is set the flag IEEE_SOFTMAC_TX_QUEUE
-+ */
-+ int (*hard_start_xmit)(struct ieee80211_txb *txb,
-+ struct net_device *dev);
-+
-+ int (*reset_port)(struct net_device *dev);
-+
-+ /* Softmac-generated frames (mamagement) are TXed via this
-+ * callback if the flag IEEE_SOFTMAC_SINGLE_QUEUE is
-+ * not set. As some cards may have different HW queues that
-+ * one might want to use for data and management frames
-+ * the option to have two callbacks might be useful.
-+ * This fucntion can't sleep.
-+ */
-+ int (*softmac_hard_start_xmit)(struct sk_buff *skb,
-+ struct net_device *dev);
-+
-+ /* used instead of hard_start_xmit (not softmac_hard_start_xmit)
-+ * if the IEEE_SOFTMAC_TX_QUEUE feature is used to TX data
-+ * frames. I the option IEEE_SOFTMAC_SINGLE_QUEUE is also set
-+ * then also management frames are sent via this callback.
-+ * This function can't sleep.
-+ */
-+ void (*softmac_data_hard_start_xmit)(struct sk_buff *skb,
-+ struct net_device *dev,int rate);
-+
-+ /* stops the HW queue for DATA frames. Useful to avoid
-+ * waste time to TX data frame when we are reassociating
-+ * This function can sleep.
-+ */
-+ void (*data_hard_stop)(struct net_device *dev);
-+
-+ /* OK this is complementar to data_poll_hard_stop */
-+ void (*data_hard_resume)(struct net_device *dev);
-+
-+ /* ask to the driver to retune the radio .
-+ * This function can sleep. the driver should ensure
-+ * the radio has been swithced before return.
-+ */
-+ void (*set_chan)(struct net_device *dev,short ch);
-+
-+ /* These are not used if the ieee stack takes care of
-+ * scanning (IEEE_SOFTMAC_SCAN feature set).
-+ * In this case only the set_chan is used.
-+ *
-+ * The syncro version is similar to the start_scan but
-+ * does not return until all channels has been scanned.
-+ * this is called in user context and should sleep,
-+ * it is called in a work_queue when swithcing to ad-hoc mode
-+ * or in behalf of iwlist scan when the card is associated
-+ * and root user ask for a scan.
-+ * the fucntion stop_scan should stop both the syncro and
-+ * background scanning and can sleep.
-+ * The fucntion start_scan should initiate the background
-+ * scanning and can't sleep.
-+ */
-+ void (*scan_syncro)(struct net_device *dev);
-+ void (*start_scan)(struct net_device *dev);
-+ void (*stop_scan)(struct net_device *dev);
-+
-+ /* indicate the driver that the link state is changed
-+ * for example it may indicate the card is associated now.
-+ * Driver might be interested in this to apply RX filter
-+ * rules or simply light the LINK led
-+ */
-+ void (*link_change)(struct net_device *dev);
-+
-+ /* these two function indicates to the HW when to start
-+ * and stop to send beacons. This is used when the
-+ * IEEE_SOFTMAC_BEACONS is not set. For now the
-+ * stop_send_bacons is NOT guaranteed to be called only
-+ * after start_send_beacons.
-+ */
-+ void (*start_send_beacons) (struct net_device *dev);
-+ void (*stop_send_beacons) (struct net_device *dev);
-+
-+ /* power save mode related */
-+ void (*sta_wake_up) (struct net_device *dev);
-+ void (*ps_request_tx_ack) (struct net_device *dev);
-+ void (*enter_sleep_state) (struct net_device *dev, u32 th, u32 tl);
-+ short (*ps_is_queue_empty) (struct net_device *dev);
-+
-+//by lizhaoming for LED 2008.6.23
-+#ifdef LED
-+ void (*ieee80211_led_contorl) (struct net_device *dev, LED_CTL_MODE LedAction);
-+#endif
-+#ifdef CONFIG_IPS
-+ void (*ieee80211_ips_leave) (struct net_device *dev);
-+#endif
-+ /* QoS related */
-+ //void (*wmm_param_update) (struct net_device *dev, u8 *ac_param);
-+ //void (*wmm_param_update) (struct ieee80211_device *ieee);
-+
-+
-+#ifdef _RTL8187_EXT_PATCH_
-+
-+ /// ieee80211_softmac.c
-+ int (*ext_patch_ieee80211_start_protocol) (struct ieee80211_device *ieee); // start special mode
-+
-+ short (*ext_patch_ieee80211_probe_req_1) (struct ieee80211_device *ieee); // return = 0: no more phases, >0: another phase
-+ u8* (*ext_patch_ieee80211_probe_req_2) (struct ieee80211_device *ieee, struct sk_buff *skb, u8 *tag); // return tag
-+
-+ void (*ext_patch_ieee80211_stop_protocol) (struct ieee80211_device *ieee); // stop timer
-+
-+ void (*ext_patch_ieee80211_association_req_1) (struct ieee80211_assoc_request_frame *hdr);
-+ u8* (*ext_patch_ieee80211_association_req_2) (struct ieee80211_device *ieee, struct ieee80211_network *pstat, struct sk_buff *skb);
-+
-+ int (*ext_patch_ieee80211_rx_frame_softmac_on_assoc_req) (struct ieee80211_device *ieee, struct sk_buff *skb);
-+ int (*ext_patch_ieee80211_rx_frame_softmac_on_assoc_rsp) (struct ieee80211_device *ieee, struct sk_buff *skb);
-+
-+ void (*ext_patch_ieee80211_assoc_resp_by_net_1) (struct ieee80211_assoc_response_frame *assoc);
-+ u8* (*ext_patch_ieee80211_assoc_resp_by_net_2) (struct ieee80211_device *ieee, struct ieee80211_network *pstat, int pkt_type, struct sk_buff *skb);
-+
-+ int (*ext_patch_ieee80211_ext_stop_scan_wq_set_channel) (struct ieee80211_device *ieee);
-+
-+ int (*ext_patch_ieee80211_softmac_xmit_get_rate) (struct ieee80211_device *ieee, struct sk_buff *skb);
-+
-+ int (*ext_patch_ieee80211_rx_frame_softmac_on_auth)(struct ieee80211_device *ieee, struct sk_buff *skb, struct ieee80211_rx_stats *rx_stats);
-+ int (*ext_patch_ieee80211_rx_frame_softmac_on_deauth)(struct ieee80211_device *ieee, struct sk_buff *skb, struct ieee80211_rx_stats *rx_stats);
-+//by amy for mesh
-+ void (*ext_patch_ieee80211_start_mesh)(struct ieee80211_device *ieee);
-+//by amy for mesh
-+ // ieee80211_rx.c
-+ // rz
-+ void (*ext_patch_ieee80211_rx_mgt_on_probe_req) ( struct ieee80211_device *ieee, struct ieee80211_probe_request *beacon, struct ieee80211_rx_stats *stats);
-+ unsigned int(*ext_patch_ieee80211_process_probe_response_1)(struct ieee80211_device *ieee, struct ieee80211_probe_response *beacon, struct ieee80211_rx_stats *stats);
-+
-+ void (*ext_patch_ieee80211_rx_mgt_update_expire) ( struct ieee80211_device *ieee, struct sk_buff *skb);
-+ struct sk_buff* (*ext_patch_get_beacon_get_probersp)(struct ieee80211_device *ieee, u8 *dest, struct ieee80211_network *net);
-+
-+ // success(return 0) is responsible to free skb
-+ int (*ext_patch_ieee80211_rx_on_rx) (struct ieee80211_device *ieee, struct sk_buff *skb, struct ieee80211_rx_stats *rx_stats, u16 type, u16 stype);
-+
-+ int (*ext_patch_ieee80211_rx_frame_get_hdrlen) (struct ieee80211_device *ieee, struct sk_buff *skb);
-+
-+ // Check whether or not accept the incoming frame. return 0: not accept, >0: accept
-+ int (*ext_patch_ieee80211_rx_is_valid_framectl) (struct ieee80211_device *ieee, u16 fc, u16 type, u16 stype);
-+
-+ // return > 0 is success. 0 when failed
-+ // success(return >0) is responsible to free skb
-+ int (*ext_patch_ieee80211_rx_process_dataframe) (struct ieee80211_device *ieee, struct sk_buff *skb, struct ieee80211_rx_stats *rx_stats);
-+
-+ /* added by david for setting acl dynamically */
-+ u8 (*ext_patch_ieee80211_acl_query) (struct ieee80211_device *ieee, u8 *sa);
-+
-+ // int (*ext_patch_is_duplicate_packet) (struct ieee80211_device *ieee, struct ieee80211_hdr *header, u16 type, u16 stype);
-+
-+ // ieee80211_tx.c
-+
-+ // locked by ieee->lock. Call ieee80211_softmac_xmit afterward
-+ struct ieee80211_txb* (*ext_patch_ieee80211_xmit) (struct sk_buff *skb, struct net_device *dev);
-+
-+
-+#endif // _RTL8187_EXT_PATCH_
-+
-+ /* This must be the last item so that it points to the data
-+ * allocated beyond this structure by alloc_ieee80211 */
-+ u8 priv[0];
-+};
-+
-+#define IEEE_A (1<<0)
-+#define IEEE_B (1<<1)
-+#define IEEE_G (1<<2)
-+#define IEEE_MODE_MASK (IEEE_A|IEEE_B|IEEE_G)
-+
-+/* Generate a 802.11 header */
-+
-+/* Uses the channel change callback directly
-+ * instead of [start/stop] scan callbacks
-+ */
-+#define IEEE_SOFTMAC_SCAN (1<<2)
-+
-+/* Perform authentication and association handshake */
-+#define IEEE_SOFTMAC_ASSOCIATE (1<<3)
-+
-+/* Generate probe requests */
-+#define IEEE_SOFTMAC_PROBERQ (1<<4)
-+
-+/* Generate respones to probe requests */
-+#define IEEE_SOFTMAC_PROBERS (1<<5)
-+
-+/* The ieee802.11 stack will manages the netif queue
-+ * wake/stop for the driver, taking care of 802.11
-+ * fragmentation. See softmac.c for details. */
-+#define IEEE_SOFTMAC_TX_QUEUE (1<<7)
-+
-+/* Uses only the softmac_data_hard_start_xmit
-+ * even for TX management frames.
-+ */
-+#define IEEE_SOFTMAC_SINGLE_QUEUE (1<<8)
-+
-+/* Generate beacons. The stack will enqueue beacons
-+ * to the card
-+ */
-+#define IEEE_SOFTMAC_BEACONS (1<<6)
-+#ifdef _RTL8187_EXT_PATCH_
-+extern inline int ieee80211_find_MP(struct ieee80211_device* ieee, const u8* addr, u8 set)
-+{
-+ int i=0;
-+ for (i=1; i<MAX_MP; i++)
-+ {
-+ if ((ieee->cryptlist[i]->used == 0)&&set)
-+ {//entry is empty
-+ memcpy(ieee->cryptlist[i]->mac_addr, addr, ETH_ALEN);
-+ ieee->cryptlist[i]->used = 1;
-+ return i;
-+ }
-+ else if (0 == memcmp(ieee->cryptlist[i]->mac_addr, addr, ETH_ALEN)) //find matched entry
-+ {
-+ return i;
-+ }
-+ }
-+ return -1;
-+}
-+#endif
-+
-+
-+
-+static inline void *ieee80211_priv(struct net_device *dev)
-+{
-+#if LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0)
-+ return ((struct ieee80211_device *)netdev_priv(dev))->priv;
-+#else
-+ return ((struct ieee80211_device *)dev->priv)->priv;
-+#endif
-+}
-+
-+extern inline int ieee80211_is_empty_essid(const char *essid, int essid_len)
-+{
-+ /* Single white space is for Linksys APs */
-+ if (essid_len == 1 && essid[0] == ' ')
-+ return 1;
-+
-+ /* Otherwise, if the entire essid is 0, we assume it is hidden */
-+ while (essid_len) {
-+ essid_len--;
-+ if (essid[essid_len] != '\0')
-+ return 0;
-+ }
-+
-+ return 1;
-+}
-+
-+extern inline int ieee80211_is_valid_mode(struct ieee80211_device *ieee, int mode)
-+{
-+ /*
-+ * It is possible for both access points and our device to support
-+ * combinations of modes, so as long as there is one valid combination
-+ * of ap/device supported modes, then return success
-+ *
-+ */
-+ if ((mode & IEEE_A) &&
-+ (ieee->modulation & IEEE80211_OFDM_MODULATION) &&
-+ (ieee->freq_band & IEEE80211_52GHZ_BAND))
-+ return 1;
-+
-+ if ((mode & IEEE_G) &&
-+ (ieee->modulation & IEEE80211_OFDM_MODULATION) &&
-+ (ieee->freq_band & IEEE80211_24GHZ_BAND))
-+ return 1;
-+
-+ if ((mode & IEEE_B) &&
-+ (ieee->modulation & IEEE80211_CCK_MODULATION) &&
-+ (ieee->freq_band & IEEE80211_24GHZ_BAND))
-+ return 1;
-+
-+ return 0;
-+}
-+
-+extern inline int ieee80211_get_hdrlen(u16 fc)
-+{
-+ int hdrlen = 24;
-+
-+ switch (WLAN_FC_GET_TYPE(fc)) {
-+ case IEEE80211_FTYPE_DATA:
-+ if ((fc & IEEE80211_FCTL_FROMDS) && (fc & IEEE80211_FCTL_TODS))
-+ hdrlen = 30; /* Addr4 */
-+ if(IEEE80211_QOS_HAS_SEQ(fc))
-+ hdrlen += 2; /* QOS ctrl*/
-+ break;
-+ case IEEE80211_FTYPE_CTL:
-+ switch (WLAN_FC_GET_STYPE(fc)) {
-+ case IEEE80211_STYPE_CTS:
-+ case IEEE80211_STYPE_ACK:
-+ hdrlen = 10;
-+ break;
-+ default:
-+ hdrlen = 16;
-+ break;
-+ }
-+ break;
-+ }
-+
-+ return hdrlen;
-+}
-+
-+
-+
-+/* ieee80211.c */
-+extern void free_ieee80211(struct net_device *dev);
-+extern struct net_device *alloc_ieee80211(int sizeof_priv);
-+
-+extern int ieee80211_set_encryption(struct ieee80211_device *ieee);
-+
-+/* ieee80211_tx.c */
-+
-+extern int ieee80211_encrypt_fragment(
-+ struct ieee80211_device *ieee,
-+ struct sk_buff *frag,
-+ int hdr_len);
-+
-+extern int ieee80211_xmit(struct sk_buff *skb,
-+ struct net_device *dev);
-+extern void ieee80211_txb_free(struct ieee80211_txb *);
-+
-+
-+/* ieee80211_rx.c */
-+extern int ieee80211_rx(struct ieee80211_device *ieee, struct sk_buff *skb,
-+ struct ieee80211_rx_stats *rx_stats);
-+extern void ieee80211_rx_mgt(struct ieee80211_device *ieee,
-+ struct ieee80211_hdr *header,
-+ struct ieee80211_rx_stats *stats);
-+
-+/* ieee80211_wx.c */
-+extern int ieee80211_wx_get_scan(struct ieee80211_device *ieee,
-+ struct iw_request_info *info,
-+ union iwreq_data *wrqu, char *key);
-+extern int ieee80211_wx_set_encode(struct ieee80211_device *ieee,
-+ struct iw_request_info *info,
-+ union iwreq_data *wrqu, char *key);
-+extern int ieee80211_wx_get_encode(struct ieee80211_device *ieee,
-+ struct iw_request_info *info,
-+ union iwreq_data *wrqu, char *key);
-+extern int ieee80211_wx_set_encode_ext(struct ieee80211_device *ieee,
-+ struct iw_request_info *info,
-+ union iwreq_data* wrqu, char *extra);
-+int ieee80211_wx_set_auth(struct ieee80211_device *ieee,
-+ struct iw_request_info *info,
-+ struct iw_param *data, char *extra);
-+int ieee80211_wx_set_mlme(struct ieee80211_device *ieee,
-+ struct iw_request_info *info,
-+ union iwreq_data *wrqu, char *extra);
-+
-+int ieee80211_wx_set_gen_ie(struct ieee80211_device *ieee, u8 *ie, size_t len);
-+/* ieee80211_softmac.c */
-+extern short ieee80211_is_54g(struct ieee80211_network net);
-+extern short ieee80211_is_shortslot(struct ieee80211_network net);
-+extern int ieee80211_rx_frame_softmac(struct ieee80211_device *ieee, struct sk_buff *skb,
-+ struct ieee80211_rx_stats *rx_stats, u16 type,
-+ u16 stype);
-+extern void ieee80211_softmac_new_net(struct ieee80211_device *ieee, struct ieee80211_network *net);
-+
-+extern void ieee80211_softmac_xmit(struct ieee80211_txb *txb, struct ieee80211_device *ieee);
-+extern void ieee80211_softmac_check_all_nets(struct ieee80211_device *ieee);
-+extern void ieee80211_start_bss(struct ieee80211_device *ieee);
-+extern void ieee80211_start_master_bss(struct ieee80211_device *ieee);
-+extern void ieee80211_start_ibss(struct ieee80211_device *ieee);
-+extern void ieee80211_softmac_init(struct ieee80211_device *ieee);
-+extern void ieee80211_softmac_free(struct ieee80211_device *ieee);
-+extern void ieee80211_associate_abort(struct ieee80211_device *ieee);
-+extern void ieee80211_disassociate(struct ieee80211_device *ieee);
-+extern void ieee80211_stop_scan(struct ieee80211_device *ieee);
-+extern void ieee80211_start_scan_syncro(struct ieee80211_device *ieee);
-+extern void ieee80211_check_all_nets(struct ieee80211_device *ieee);
-+extern void ieee80211_start_protocol(struct ieee80211_device *ieee);
-+extern void ieee80211_stop_protocol(struct ieee80211_device *ieee);
-+extern void ieee80211_softmac_start_protocol(struct ieee80211_device *ieee);
-+extern void ieee80211_softmac_stop_protocol(struct ieee80211_device *ieee);
-+extern void ieee80211_reset_queue(struct ieee80211_device *ieee);
-+extern void ieee80211_wake_queue(struct ieee80211_device *ieee);
-+extern void ieee80211_stop_queue(struct ieee80211_device *ieee);
-+extern struct sk_buff *ieee80211_get_beacon(struct ieee80211_device *ieee);
-+extern void ieee80211_start_send_beacons(struct ieee80211_device *ieee);
-+extern void ieee80211_stop_send_beacons(struct ieee80211_device *ieee);
-+extern int ieee80211_wpa_supplicant_ioctl(struct ieee80211_device *ieee, struct iw_point *p);
-+extern void notify_wx_assoc_event(struct ieee80211_device *ieee);
-+extern void ieee80211_ps_tx_ack(struct ieee80211_device *ieee, short success);
-+extern void ieee80211_start_scan(struct ieee80211_device *ieee);
-+
-+#ifdef _RTL8187_EXT_PATCH_
-+extern void ieee80211_rx_auth_rq(struct ieee80211_device *ieee, struct sk_buff *skb);
-+extern void ieee80211_ext_issue_assoc_req(struct ieee80211_device *ieee, struct ieee80211_network *pstat);
-+extern void ieee80211_associate_step1(struct ieee80211_device *ieee);
-+extern void ieee80211_ext_issue_disassoc(struct ieee80211_device *ieee, struct ieee80211_network *pstat, int reason, unsigned char extReason);
-+extern void ieee80211_ext_issue_assoc_rsp(struct ieee80211_device *ieee, u8 *dest, unsigned short status, struct ieee80211_network *pstat, int pkt_type);
-+extern void softmac_mgmt_xmit(struct sk_buff *skb, struct ieee80211_device *ieee);
-+extern struct sk_buff* ieee80211_ext_probe_resp_by_net(struct ieee80211_device *ieee, u8 *dest, struct ieee80211_network *net);
-+extern int ieee80211_network_init(struct ieee80211_device *ieee, struct ieee80211_probe_response *beacon, struct ieee80211_network *network, struct ieee80211_rx_stats *stats);
-+extern struct ieee80211_txb *ieee80211_alloc_txb(int nr_frags, int txb_size, int gfp_mask);
-+extern void ieee80211_ext_send_11s_beacon(struct ieee80211_device *ieee);
-+extern struct ieee80211_txb *ieee80211_ext_alloc_txb(struct sk_buff *skb, struct net_device *dev, struct ieee80211_hdr_3addr *header, int hdr_len, u8 isQoS, u16 *pQOS_ctl, int isEncrypt, struct ieee80211_crypt_data* crypt);
-+extern struct ieee80211_txb *ieee80211_ext_reuse_txb(struct sk_buff *skb, struct net_device *dev, struct ieee80211_hdr_3addr *header, int hdr_len, u8 isQoS, u16 *pQOS_ctl, int isEncrypt, struct ieee80211_crypt_data* crypt);
-+extern int ieee_ext_skb_p80211_to_ether(struct sk_buff *skb, int hdrlen, u8 *dst, u8 *src);
-+#endif
-+
-+/* ieee80211_crypt_ccmp&tkip&wep.c */
-+extern void ieee80211_tkip_null(void);
-+extern void ieee80211_wep_null(void);
-+extern void ieee80211_ccmp_null(void);
-+/* ieee80211_softmac_wx.c */
-+
-+extern int ieee80211_wx_get_wap(struct ieee80211_device *ieee,
-+ struct iw_request_info *info,
-+ union iwreq_data *wrqu, char *ext);
-+
-+extern int ieee80211_wx_set_wap(struct ieee80211_device *ieee,
-+ struct iw_request_info *info,
-+ union iwreq_data *awrq,
-+ char *extra);
-+
-+extern int ieee80211_wx_get_essid(struct ieee80211_device *ieee, struct iw_request_info *a,union iwreq_data *wrqu,char *b);
-+
-+extern int ieee80211_wx_set_rate(struct ieee80211_device *ieee,
-+ struct iw_request_info *info,
-+ union iwreq_data *wrqu, char *extra);
-+
-+extern int ieee80211_wx_get_rate(struct ieee80211_device *ieee,
-+ struct iw_request_info *info,
-+ union iwreq_data *wrqu, char *extra);
-+
-+extern int ieee80211_wx_set_mode(struct ieee80211_device *ieee, struct iw_request_info *a,
-+ union iwreq_data *wrqu, char *b);
-+
-+extern int ieee80211_wx_set_scan(struct ieee80211_device *ieee, struct iw_request_info *a,
-+ union iwreq_data *wrqu, char *b);
-+
-+extern int ieee80211_wx_set_essid(struct ieee80211_device *ieee,
-+ struct iw_request_info *a,
-+ union iwreq_data *wrqu, char *extra);
-+
-+extern int ieee80211_wx_get_mode(struct ieee80211_device *ieee, struct iw_request_info *a,
-+ union iwreq_data *wrqu, char *b);
-+
-+extern int ieee80211_wx_set_freq(struct ieee80211_device *ieee, struct iw_request_info *a,
-+ union iwreq_data *wrqu, char *b);
-+
-+extern int ieee80211_wx_get_freq(struct ieee80211_device *ieee, struct iw_request_info *a,
-+ union iwreq_data *wrqu, char *b);
-+
-+//extern void ieee80211_wx_sync_scan_wq(struct ieee80211_device *ieee);
-+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20))
-+extern void ieee80211_wx_sync_scan_wq(struct work_struct *work);
-+#else
-+ extern void ieee80211_wx_sync_scan_wq(struct ieee80211_device *ieee);
-+#endif
-+extern int ieee80211_wx_set_rawtx(struct ieee80211_device *ieee,
-+ struct iw_request_info *info,
-+ union iwreq_data *wrqu, char *extra);
-+
-+extern int ieee80211_wx_get_name(struct ieee80211_device *ieee,
-+ struct iw_request_info *info,
-+ union iwreq_data *wrqu, char *extra);
-+
-+extern int ieee80211_wx_set_power(struct ieee80211_device *ieee,
-+ struct iw_request_info *info,
-+ union iwreq_data *wrqu, char *extra);
-+
-+extern int ieee80211_wx_get_power(struct ieee80211_device *ieee,
-+ struct iw_request_info *info,
-+ union iwreq_data *wrqu, char *extra);
-+
-+extern const long ieee80211_wlan_frequencies[];
-+
-+extern inline void ieee80211_increment_scans(struct ieee80211_device *ieee)
-+{
-+ ieee->scans++;
-+}
-+
-+extern inline int ieee80211_get_scans(struct ieee80211_device *ieee)
-+{
-+ return ieee->scans;
-+}
-+
-+static inline const char *escape_essid(const char *essid, u8 essid_len) {
-+ static char escaped[IW_ESSID_MAX_SIZE * 2 + 1];
-+ const char *s = essid;
-+ char *d = escaped;
-+
-+ if (ieee80211_is_empty_essid(essid, essid_len)) {
-+ memcpy(escaped, "<hidden>", sizeof("<hidden>"));
-+ return escaped;
-+ }
-+
-+ essid_len = min(essid_len, (u8)IW_ESSID_MAX_SIZE);
-+ while (essid_len--) {
-+ if (*s == '\0') {
-+ *d++ = '\\';
-+ *d++ = '0';
-+ s++;
-+ } else {
-+ *d++ = *s++;
-+ }
-+ }
-+ *d = '\0';
-+ return escaped;
-+}
-+#endif /* IEEE80211_H */
-diff -Nur linux-2.6.30.5.orig/drivers/net/wireless/rtl8187b/ieee80211/ieee80211_module.c linux-2.6.30.5/drivers/net/wireless/rtl8187b/ieee80211/ieee80211_module.c
---- linux-2.6.30.5.orig/drivers/net/wireless/rtl8187b/ieee80211/ieee80211_module.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.30.5/drivers/net/wireless/rtl8187b/ieee80211/ieee80211_module.c 2009-08-23 19:01:04.000000000 +0200
-@@ -0,0 +1,385 @@
-+/*******************************************************************************
-+
-+ Copyright(c) 2004 Intel Corporation. All rights reserved.
-+
-+ Portions of this file are based on the WEP enablement code provided by the
-+ Host AP project hostap-drivers v0.1.3
-+ Copyright (c) 2001-2002, SSH Communications Security Corp and Jouni Malinen
-+ <jkmaline@cc.hut.fi>
-+ Copyright (c) 2002-2003, Jouni Malinen <jkmaline@cc.hut.fi>
-+
-+ This program is free software; you can redistribute it and/or modify it
-+ under the terms of version 2 of the GNU General Public License as
-+ published by the Free Software Foundation.
-+
-+ 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.
-+
-+ The full GNU General Public License is included in this distribution in the
-+ file called LICENSE.
-+
-+ Contact Information:
-+ James P. Ketrenos <ipw2100-admin@linux.intel.com>
-+ Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
-+
-+*******************************************************************************/
-+
-+#include <linux/compiler.h>
-+//#include <linux/config.h>
-+#include <linux/errno.h>
-+#include <linux/if_arp.h>
-+#include <linux/in6.h>
-+#include <linux/in.h>
-+#include <linux/ip.h>
-+#include <linux/kernel.h>
-+#include <linux/module.h>
-+#include <linux/netdevice.h>
-+#include <linux/pci.h>
-+#include <linux/proc_fs.h>
-+#include <linux/skbuff.h>
-+#include <linux/slab.h>
-+#include <linux/tcp.h>
-+#include <linux/types.h>
-+#include <linux/version.h>
-+#include <linux/wireless.h>
-+#include <linux/etherdevice.h>
-+#include <asm/uaccess.h>
-+#include <net/arp.h>
-+
-+#include "ieee80211.h"
-+
-+MODULE_DESCRIPTION("802.11 data/management/control stack");
-+MODULE_AUTHOR("Copyright (C) 2004 Intel Corporation <jketreno@linux.intel.com>");
-+MODULE_LICENSE("GPL");
-+
-+#define DRV_NAME "ieee80211"
-+
-+static inline int ieee80211_networks_allocate(struct ieee80211_device *ieee)
-+{
-+ if (ieee->networks)
-+ return 0;
-+
-+ ieee->networks = kmalloc(
-+ MAX_NETWORK_COUNT * sizeof(struct ieee80211_network),
-+ GFP_KERNEL);
-+ if (!ieee->networks) {
-+ printk(KERN_WARNING "%s: Out of memory allocating beacons\n",
-+ ieee->dev->name);
-+ return -ENOMEM;
-+ }
-+
-+ memset(ieee->networks, 0,
-+ MAX_NETWORK_COUNT * sizeof(struct ieee80211_network));
-+
-+ return 0;
-+}
-+
-+static inline void ieee80211_networks_free(struct ieee80211_device *ieee)
-+{
-+ if (!ieee->networks)
-+ return;
-+ kfree(ieee->networks);
-+ ieee->networks = NULL;
-+}
-+
-+static inline void ieee80211_networks_initialize(struct ieee80211_device *ieee)
-+{
-+ int i;
-+
-+ INIT_LIST_HEAD(&ieee->network_free_list);
-+ INIT_LIST_HEAD(&ieee->network_list);
-+ for (i = 0; i < MAX_NETWORK_COUNT; i++)
-+ list_add_tail(&ieee->networks[i].list, &ieee->network_free_list);
-+}
-+
-+
-+struct net_device *alloc_ieee80211(int sizeof_priv)
-+{
-+ struct ieee80211_device *ieee;
-+ struct net_device *dev;
-+ int i,err;
-+
-+ IEEE80211_DEBUG_INFO("Initializing...\n");
-+
-+ dev = alloc_etherdev(sizeof(struct ieee80211_device) + sizeof_priv);
-+ if (!dev) {
-+ IEEE80211_ERROR("Unable to network device.\n");
-+ goto failed;
-+ }
-+
-+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0))
-+ ieee = netdev_priv(dev);
-+#else
-+ ieee = (struct ieee80211_device *)dev->priv;
-+#endif
-+
-+ ieee->dev = dev;
-+
-+ err = ieee80211_networks_allocate(ieee);
-+ if (err) {
-+ IEEE80211_ERROR("Unable to allocate beacon storage: %d\n",
-+ err);
-+ goto failed;
-+ }
-+ ieee80211_networks_initialize(ieee);
-+
-+ /* Default fragmentation threshold is maximum payload size */
-+ ieee->fts = DEFAULT_FTS;
-+ ieee->scan_age = DEFAULT_MAX_SCAN_AGE;
-+ ieee->open_wep = 1;
-+
-+ /* Default to enabling full open WEP with host based encrypt/decrypt */
-+ ieee->host_encrypt = 1;
-+ ieee->host_decrypt = 1;
-+ ieee->ieee802_1x = 1; /* Default to supporting 802.1x */
-+
-+ INIT_LIST_HEAD(&ieee->crypt_deinit_list);
-+ init_timer(&ieee->crypt_deinit_timer);
-+ ieee->crypt_deinit_timer.data = (unsigned long)ieee;
-+ ieee->crypt_deinit_timer.function = ieee80211_crypt_deinit_handler;
-+
-+ spin_lock_init(&ieee->lock);
-+ spin_lock_init(&ieee->wpax_suitlist_lock);
-+
-+ ieee->wpax_type_set = 0;
-+ ieee->wpa_enabled = 0;
-+ ieee->tkip_countermeasures = 0;
-+ ieee->drop_unencrypted = 0;
-+ ieee->privacy_invoked = 0;
-+ ieee->ieee802_1x = 1;
-+ ieee->raw_tx = 0;
-+#ifdef _RTL8187_EXT_PATCH_
-+ for (i=0; i<MAX_MP; i++)
-+ {
-+ ieee->cryptlist[i] = (struct ieee80211_crypt_data_list*) kmalloc(sizeof(struct ieee80211_crypt_data_list), GFP_KERNEL);
-+ if (NULL == ieee->cryptlist[i])
-+ {
-+ printk("error kmalloc cryptlist\n");
-+ goto failed;
-+ }
-+ memset(ieee->cryptlist[i], 0, sizeof(struct ieee80211_crypt_data_list));
-+
-+ }
-+#endif
-+ ieee80211_softmac_init(ieee);
-+
-+ for (i = 0; i < IEEE_IBSS_MAC_HASH_SIZE; i++)
-+ INIT_LIST_HEAD(&ieee->ibss_mac_hash[i]);
-+
-+ for (i = 0; i < IEEE_MESH_MAC_HASH_SIZE; i++)
-+ INIT_LIST_HEAD(&ieee->mesh_mac_hash[i]);
-+
-+ for (i = 0; i < 17; i++) {
-+ ieee->last_rxseq_num[i] = -1;
-+ ieee->last_rxfrag_num[i] = -1;
-+ ieee->last_packet_time[i] = 0;
-+ }
-+#if 1 //added these to autoload encryption module. WB
-+ ieee80211_tkip_null();
-+ ieee80211_wep_null();
-+ ieee80211_ccmp_null();
-+#endif
-+ return dev;
-+
-+ failed:
-+#ifdef _RTL8187_EXT_PATCH_
-+ for (i=0; i<MAX_MP; i++)
-+ {
-+ if (ieee->cryptlist[i]==NULL){
-+ continue;
-+ }
-+ kfree(ieee->cryptlist[i]);
-+ ieee->cryptlist[i] = NULL;
-+
-+ }
-+#endif
-+ if (dev)
-+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0))
-+ free_netdev(dev);
-+#else
-+ kfree(dev);
-+#endif
-+ return NULL;
-+}
-+
-+
-+void free_ieee80211(struct net_device *dev)
-+{
-+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0))
-+ struct ieee80211_device *ieee = netdev_priv(dev);
-+#else
-+ struct ieee80211_device *ieee = (struct ieee80211_device *)dev->priv;
-+#endif
-+ int i;//,j;
-+ struct list_head *p, *q;
-+
-+
-+ ieee80211_softmac_free(ieee);
-+ del_timer_sync(&ieee->crypt_deinit_timer);
-+ ieee80211_crypt_deinit_entries(ieee, 1);
-+#if 1
-+ ieee80211_tkip_null();
-+ ieee80211_wep_null();
-+ ieee80211_ccmp_null();
-+#endif
-+ for (i = 0; i < WEP_KEYS; i++) {
-+#ifdef _RTL8187_EXT_PATCH_
-+{
-+ // int j;
-+ for (j=0;j<MAX_MP; j++){
-+ if (ieee->cryptlist[j] == NULL)
-+ continue;
-+ struct ieee80211_crypt_data *crypt = ieee->cryptlist[j]->crypt[i];
-+#else
-+ struct ieee80211_crypt_data *crypt = ieee->crypt[i];
-+#endif
-+ if (crypt) {
-+ if (crypt->ops) {
-+ crypt->ops->deinit(crypt->priv);
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
-+ module_put(crypt->ops->owner);
-+#else
-+ __MOD_DEC_USE_COUNT(crypt->ops->owner);
-+#endif
-+ }
-+ kfree(crypt);
-+#ifdef _RTL8187_EXT_PATCH_
-+ ieee->cryptlist[j]->crypt[i] = NULL;
-+ //kfree(ieee->cryptlist[j]);
-+ //ieee->cryptlist[j] = NULL;
-+#else
-+ ieee->crypt[i] = NULL;
-+#endif
-+ }
-+#ifdef _RTL8187_EXT_PATCH_
-+ }
-+ }
-+#endif
-+}
-+#ifdef _RTL8187_EXT_PATCH_
-+for(j=0;j<MAX_MP;j++)
-+ {
-+ if (ieee->cryptlist[j])
-+ {
-+ kfree(ieee->cryptlist[j]);
-+ ieee->cryptlist[j] = NULL;
-+ }
-+ }
-+
-+ for (i = 0; i < IEEE_MESH_MAC_HASH_SIZE; i++) {
-+ list_for_each_safe(p, q, &ieee->mesh_mac_hash[i]) {
-+ kfree(list_entry(p, struct ieee_mesh_seq, list));
-+ list_del(p);
-+ }
-+ }
-+#endif
-+ ieee80211_networks_free(ieee);
-+
-+ for (i = 0; i < IEEE_IBSS_MAC_HASH_SIZE; i++) {
-+ list_for_each_safe(p, q, &ieee->ibss_mac_hash[i]) {
-+ kfree(list_entry(p, struct ieee_ibss_seq, list));
-+ list_del(p);
-+ }
-+ }
-+
-+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0))
-+ free_netdev(dev);
-+#else
-+ kfree(dev);
-+#endif
-+}
-+
-+#ifdef CONFIG_IEEE80211_DEBUG
-+
-+static int debug = 0;
-+u32 ieee80211_debug_level = 0;
-+struct proc_dir_entry *ieee80211_proc = NULL;
-+
-+static int show_debug_level(char *page, char **start, off_t offset,
-+ int count, int *eof, void *data)
-+{
-+ return snprintf(page, count, "0x%08X\n", ieee80211_debug_level);
-+}
-+
-+static int store_debug_level(struct file *file, const char *buffer,
-+ unsigned long count, void *data)
-+{
-+ char buf[] = "0x00000000";
-+ unsigned long len = min(sizeof(buf) - 1, (u32)count);
-+ char *p = (char *)buf;
-+ unsigned long val;
-+
-+ if (copy_from_user(buf, buffer, len))
-+ return count;
-+ buf[len] = 0;
-+ if (p[1] == 'x' || p[1] == 'X' || p[0] == 'x' || p[0] == 'X') {
-+ p++;
-+ if (p[0] == 'x' || p[0] == 'X')
-+ p++;
-+ val = simple_strtoul(p, &p, 16);
-+ } else
-+ val = simple_strtoul(p, &p, 10);
-+ if (p == buf)
-+ printk(KERN_INFO DRV_NAME
-+ ": %s is not in hex or decimal form.\n", buf);
-+ else
-+ ieee80211_debug_level = val;
-+
-+ return strnlen(buf, count);
-+}
-+
-+static int __init ieee80211_init(void)
-+{
-+ struct proc_dir_entry *e;
-+
-+ ieee80211_debug_level = debug;
-+ ieee80211_proc = create_proc_entry(DRV_NAME, S_IFDIR, proc_net);
-+ if (ieee80211_proc == NULL) {
-+ IEEE80211_ERROR("Unable to create " DRV_NAME
-+ " proc directory\n");
-+ return -EIO;
-+ }
-+ e = create_proc_entry("debug_level", S_IFREG | S_IRUGO | S_IWUSR,
-+ ieee80211_proc);
-+ if (!e) {
-+ remove_proc_entry(DRV_NAME, proc_net);
-+ ieee80211_proc = NULL;
-+ return -EIO;
-+ }
-+ e->read_proc = show_debug_level;
-+ e->write_proc = store_debug_level;
-+ e->data = NULL;
-+
-+ return 0;
-+}
-+
-+static void __exit ieee80211_exit(void)
-+{
-+ if (ieee80211_proc) {
-+ remove_proc_entry("debug_level", ieee80211_proc);
-+ remove_proc_entry(DRV_NAME, proc_net);
-+ ieee80211_proc = NULL;
-+ }
-+}
-+
-+#include <linux/moduleparam.h>
-+module_param(debug, int, 0444);
-+MODULE_PARM_DESC(debug, "debug output mask");
-+
-+
-+module_exit(ieee80211_exit);
-+module_init(ieee80211_init);
-+#endif
-+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0))
-+EXPORT_SYMBOL(alloc_ieee80211);
-+EXPORT_SYMBOL(free_ieee80211);
-+#else
-+EXPORT_SYMBOL_NOVERS(alloc_ieee80211);
-+EXPORT_SYMBOL_NOVERS(free_ieee80211);
-+#endif
-diff -Nur linux-2.6.30.5.orig/drivers/net/wireless/rtl8187b/ieee80211/ieee80211_rx.c linux-2.6.30.5/drivers/net/wireless/rtl8187b/ieee80211/ieee80211_rx.c
---- linux-2.6.30.5.orig/drivers/net/wireless/rtl8187b/ieee80211/ieee80211_rx.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.30.5/drivers/net/wireless/rtl8187b/ieee80211/ieee80211_rx.c 2009-08-23 19:01:04.000000000 +0200
-@@ -0,0 +1,2074 @@
-+/*
-+ * Original code based Host AP (software wireless LAN access point) driver
-+ * for Intersil Prism2/2.5/3 - hostap.o module, common routines
-+ *
-+ * Copyright (c) 2001-2002, SSH Communications Security Corp and Jouni Malinen
-+ * <jkmaline@cc.hut.fi>
-+ * Copyright (c) 2002-2003, Jouni Malinen <jkmaline@cc.hut.fi>
-+ * Copyright (c) 2004, Intel Corporation
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License version 2 as
-+ * published by the Free Software Foundation. See README and COPYING for
-+ * more details.
-+ ******************************************************************************
-+
-+ Few modifications for Realtek's Wi-Fi drivers by
-+ Andrea Merello <andreamrl@tiscali.it>
-+
-+ A special thanks goes to Realtek for their support !
-+
-+******************************************************************************/
-+
-+
-+#include <linux/compiler.h>
-+//#include <linux/config.h>
-+#include <linux/errno.h>
-+#include <linux/if_arp.h>
-+#include <linux/in6.h>
-+#include <linux/in.h>
-+#include <linux/ip.h>
-+#include <linux/kernel.h>
-+#include <linux/module.h>
-+#include <linux/netdevice.h>
-+#include <linux/pci.h>
-+#include <linux/proc_fs.h>
-+#include <linux/skbuff.h>
-+#include <linux/slab.h>
-+#include <linux/tcp.h>
-+#include <linux/types.h>
-+#include <linux/version.h>
-+#include <linux/wireless.h>
-+#include <linux/etherdevice.h>
-+#include <asm/uaccess.h>
-+#include <linux/ctype.h>
-+
-+#include "ieee80211.h"
-+#ifdef ENABLE_DOT11D
-+#include "dot11d.h"
-+#endif
-+
-+static inline void ieee80211_monitor_rx(struct ieee80211_device *ieee,
-+ struct sk_buff *skb,
-+ struct ieee80211_rx_stats *rx_stats)
-+{
-+ struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
-+ u16 fc = le16_to_cpu(hdr->frame_ctl);
-+
-+ skb->dev = ieee->dev;
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22)
-+ skb_reset_mac_header(skb);
-+#else
-+ skb->mac.raw = skb->data;
-+#endif
-+
-+ //skb->mac.raw = skb->data;
-+ skb_pull(skb, ieee80211_get_hdrlen(fc));
-+ skb->pkt_type = PACKET_OTHERHOST;
-+ skb->protocol = __constant_htons(ETH_P_80211_RAW);
-+ memset(skb->cb, 0, sizeof(skb->cb));
-+ netif_rx(skb);
-+}
-+
-+
-+/* Called only as a tasklet (software IRQ) */
-+static struct ieee80211_frag_entry *
-+ieee80211_frag_cache_find(struct ieee80211_device *ieee, unsigned int seq,
-+ unsigned int frag, u8 tid,u8 *src, u8 *dst)
-+{
-+ struct ieee80211_frag_entry *entry;
-+ int i;
-+
-+ for (i = 0; i < IEEE80211_FRAG_CACHE_LEN; i++) {
-+ entry = &ieee->frag_cache[tid][i];
-+ if (entry->skb != NULL &&
-+ time_after(jiffies, entry->first_frag_time + 2 * HZ)) {
-+ IEEE80211_DEBUG_FRAG(
-+ "expiring fragment cache entry "
-+ "seq=%u last_frag=%u\n",
-+ entry->seq, entry->last_frag);
-+ dev_kfree_skb_any(entry->skb);
-+ entry->skb = NULL;
-+ }
-+
-+ if (entry->skb != NULL && entry->seq == seq &&
-+ (entry->last_frag + 1 == frag || frag == -1) &&
-+ memcmp(entry->src_addr, src, ETH_ALEN) == 0 &&
-+ memcmp(entry->dst_addr, dst, ETH_ALEN) == 0)
-+ return entry;
-+ }
-+
-+ return NULL;
-+}
-+
-+/* Called only as a tasklet (software IRQ) */
-+static struct sk_buff *
-+ieee80211_frag_cache_get(struct ieee80211_device *ieee,
-+ struct ieee80211_hdr *hdr)
-+{
-+ struct sk_buff *skb = NULL;
-+ u16 fc = le16_to_cpu(hdr->frame_ctl);
-+ u16 sc = le16_to_cpu(hdr->seq_ctl);
-+ unsigned int frag = WLAN_GET_SEQ_FRAG(sc);
-+ unsigned int seq = WLAN_GET_SEQ_SEQ(sc);
-+ struct ieee80211_frag_entry *entry;
-+ struct ieee80211_hdr_3addr_QOS *hdr_3addr_QoS;
-+ struct ieee80211_hdr_QOS *hdr_4addr_QoS;
-+ u8 tid;
-+
-+#ifdef _RTL8187_EXT_PATCH_
-+ if(ieee->iw_mode == ieee->iw_ext_mode)
-+ {
-+ tid = (hdr->addr2[ETH_ALEN-2] ^ hdr->addr2[ETH_ALEN-1]) & IEEE80211_QOS_TID;
-+ }
-+ else
-+#endif
-+ if (((fc & IEEE80211_FCTL_DSTODS) == IEEE80211_FCTL_DSTODS)&&IEEE80211_QOS_HAS_SEQ(fc)) {
-+ hdr_4addr_QoS = (struct ieee80211_hdr_QOS *)hdr;
-+ tid = le16_to_cpu(hdr_4addr_QoS->QOS_ctl) & IEEE80211_QOS_TID;
-+ tid = UP2AC(tid);
-+ tid ++;
-+ } else if (IEEE80211_QOS_HAS_SEQ(fc)) {
-+ hdr_3addr_QoS = (struct ieee80211_hdr_3addr_QOS *)hdr;
-+ tid = le16_to_cpu(hdr_3addr_QoS->QOS_ctl) & IEEE80211_QOS_TID;
-+ tid = UP2AC(tid);
-+ tid ++;
-+ } else {
-+ tid = 0;
-+ }
-+
-+ if (frag == 0) {
-+ /* Reserve enough space to fit maximum frame length */
-+ skb = dev_alloc_skb(ieee->dev->mtu +
-+ sizeof(struct ieee80211_hdr) +
-+ 8 /* LLC */ +
-+ 2 /* alignment */ +
-+ 8 /* WEP */ +
-+ ETH_ALEN /* WDS */ +
-+ (IEEE80211_QOS_HAS_SEQ(fc)?2:0) /* QOS Control */);
-+ if (skb == NULL)
-+ return NULL;
-+
-+ entry = &ieee->frag_cache[tid][ieee->frag_next_idx[tid]];
-+ ieee->frag_next_idx[tid]++;
-+ if (ieee->frag_next_idx[tid] >= IEEE80211_FRAG_CACHE_LEN)
-+ ieee->frag_next_idx[tid] = 0;
-+
-+ if (entry->skb != NULL)
-+ dev_kfree_skb_any(entry->skb);
-+
-+ entry->first_frag_time = jiffies;
-+ entry->seq = seq;
-+ entry->last_frag = frag;
-+ entry->skb = skb;
-+ memcpy(entry->src_addr, hdr->addr2, ETH_ALEN);
-+ memcpy(entry->dst_addr, hdr->addr1, ETH_ALEN);
-+ } else {
-+ /* received a fragment of a frame for which the head fragment
-+ * should have already been received */
-+ entry = ieee80211_frag_cache_find(ieee, seq, frag, tid,hdr->addr2,
-+ hdr->addr1);
-+ if (entry != NULL) {
-+ entry->last_frag = frag;
-+ skb = entry->skb;
-+ }
-+ }
-+
-+ return skb;
-+}
-+
-+
-+/* Called only as a tasklet (software IRQ) */
-+static int ieee80211_frag_cache_invalidate(struct ieee80211_device *ieee,
-+ struct ieee80211_hdr *hdr)
-+{
-+ u16 fc = le16_to_cpu(hdr->frame_ctl);
-+ u16 sc = le16_to_cpu(hdr->seq_ctl);
-+ unsigned int seq = WLAN_GET_SEQ_SEQ(sc);
-+ struct ieee80211_frag_entry *entry;
-+ struct ieee80211_hdr_3addr_QOS *hdr_3addr_QoS;
-+ struct ieee80211_hdr_QOS *hdr_4addr_QoS;
-+ u8 tid;
-+
-+#ifdef _RTL8187_EXT_PATCH_
-+ if(ieee->iw_mode == ieee->iw_ext_mode)
-+ {
-+ tid = (hdr->addr2[ETH_ALEN-2] ^ hdr->addr2[ETH_ALEN-1]) & IEEE80211_QOS_TID;
-+ }
-+ else
-+#endif
-+ if(((fc & IEEE80211_FCTL_DSTODS) == IEEE80211_FCTL_DSTODS)&&IEEE80211_QOS_HAS_SEQ(fc)) {
-+ hdr_4addr_QoS = (struct ieee80211_hdr_QOS *)hdr;
-+ tid = le16_to_cpu(hdr_4addr_QoS->QOS_ctl) & IEEE80211_QOS_TID;
-+ tid = UP2AC(tid);
-+ tid ++;
-+ } else if (IEEE80211_QOS_HAS_SEQ(fc)) {
-+ hdr_3addr_QoS = (struct ieee80211_hdr_3addr_QOS *)hdr;
-+ tid = le16_to_cpu(hdr_3addr_QoS->QOS_ctl) & IEEE80211_QOS_TID;
-+ tid = UP2AC(tid);
-+ tid ++;
-+ } else {
-+ tid = 0;
-+ }
-+
-+ entry = ieee80211_frag_cache_find(ieee, seq, -1, tid,hdr->addr2,
-+ hdr->addr1);
-+
-+ if (entry == NULL) {
-+ IEEE80211_DEBUG_FRAG(
-+ "could not invalidate fragment cache "
-+ "entry (seq=%u)\n", seq);
-+ return -1;
-+ }
-+
-+ entry->skb = NULL;
-+ return 0;
-+}
-+
-+
-+
-+/* ieee80211_rx_frame_mgtmt
-+ *
-+ * Responsible for handling management control frames
-+ *
-+ * Called by ieee80211_rx */
-+static inline int
-+ieee80211_rx_frame_mgmt(struct ieee80211_device *ieee, struct sk_buff *skb,
-+ struct ieee80211_rx_stats *rx_stats, u16 type,
-+ u16 stype)
-+{
-+ /* On the struct stats definition there is written that
-+ * this is not mandatory.... but seems that the probe
-+ * response parser uses it
-+ */
-+ struct ieee80211_hdr * hdr = (struct ieee80211_hdr*)skb->data;
-+ rx_stats->len = skb->len;
-+ ieee80211_rx_mgt(ieee,(struct ieee80211_hdr *)skb->data,rx_stats);
-+
-+ if ((ieee->state == IEEE80211_LINKED) && (memcmp(hdr->addr3, ieee->current_network.bssid, ETH_ALEN)))
-+ {
-+ dev_kfree_skb_any(skb);
-+ return 0;
-+ }
-+
-+ ieee80211_rx_frame_softmac(ieee, skb, rx_stats, type, stype);
-+
-+ dev_kfree_skb_any(skb);
-+
-+ return 0;
-+
-+ #ifdef NOT_YET
-+ if (ieee->iw_mode == IW_MODE_MASTER) {
-+ printk(KERN_DEBUG "%s: Master mode not yet suppported.\n",
-+ ieee->dev->name);
-+ return 0;
-+/*
-+ hostap_update_sta_ps(ieee, (struct hostap_ieee80211_hdr *)
-+ skb->data);*/
-+ }
-+
-+ if (ieee->hostapd && type == IEEE80211_TYPE_MGMT) {
-+ if (stype == WLAN_FC_STYPE_BEACON &&
-+ ieee->iw_mode == IW_MODE_MASTER) {
-+ struct sk_buff *skb2;
-+ /* Process beacon frames also in kernel driver to
-+ * update STA(AP) table statistics */
-+ skb2 = skb_clone(skb, GFP_ATOMIC);
-+ if (skb2)
-+ hostap_rx(skb2->dev, skb2, rx_stats);
-+ }
-+
-+ /* send management frames to the user space daemon for
-+ * processing */
-+ ieee->apdevstats.rx_packets++;
-+ ieee->apdevstats.rx_bytes += skb->len;
-+ prism2_rx_80211(ieee->apdev, skb, rx_stats, PRISM2_RX_MGMT);
-+ return 0;
-+ }
-+
-+ if (ieee->iw_mode == IW_MODE_MASTER) {
-+ if (type != WLAN_FC_TYPE_MGMT && type != WLAN_FC_TYPE_CTRL) {
-+ printk(KERN_DEBUG "%s: unknown management frame "
-+ "(type=0x%02x, stype=0x%02x) dropped\n",
-+ skb->dev->name, type, stype);
-+ return -1;
-+ }
-+
-+ hostap_rx(skb->dev, skb, rx_stats);
-+ return 0;
-+ }
-+
-+ printk(KERN_DEBUG "%s: hostap_rx_frame_mgmt: management frame "
-+ "received in non-Host AP mode\n", skb->dev->name);
-+ return -1;
-+ #endif
-+}
-+
-+
-+
-+/* See IEEE 802.1H for LLC/SNAP encapsulation/decapsulation */
-+/* Ethernet-II snap header (RFC1042 for most EtherTypes) */
-+static unsigned char rfc1042_header[] =
-+{ 0xaa, 0xaa, 0x03, 0x00, 0x00, 0x00 };
-+/* Bridge-Tunnel header (for EtherTypes ETH_P_AARP and ETH_P_IPX) */
-+static unsigned char bridge_tunnel_header[] =
-+{ 0xaa, 0xaa, 0x03, 0x00, 0x00, 0xf8 };
-+/* No encapsulation header if EtherType < 0x600 (=length) */
-+
-+/* Called by ieee80211_rx_frame_decrypt */
-+static int ieee80211_is_eapol_frame(struct ieee80211_device *ieee,
-+ struct sk_buff *skb, size_t hdrlen)
-+{
-+ struct net_device *dev = ieee->dev;
-+ u16 fc, ethertype;
-+ struct ieee80211_hdr *hdr;
-+ u8 *pos;
-+
-+ if (skb->len < 24)
-+ return 0;
-+
-+ hdr = (struct ieee80211_hdr *) skb->data;
-+ fc = le16_to_cpu(hdr->frame_ctl);
-+
-+ /* check that the frame is unicast frame to us */
-+ if ((fc & (IEEE80211_FCTL_TODS | IEEE80211_FCTL_FROMDS)) ==
-+ IEEE80211_FCTL_TODS &&
-+ memcmp(hdr->addr1, dev->dev_addr, ETH_ALEN) == 0 &&
-+ memcmp(hdr->addr3, dev->dev_addr, ETH_ALEN) == 0) {
-+ /* ToDS frame with own addr BSSID and DA */
-+ } else if ((fc & (IEEE80211_FCTL_TODS | IEEE80211_FCTL_FROMDS)) ==
-+ IEEE80211_FCTL_FROMDS &&
-+ memcmp(hdr->addr1, dev->dev_addr, ETH_ALEN) == 0) {
-+ /* FromDS frame with own addr as DA */
-+ } else
-+ return 0;
-+
-+ if (skb->len < 24 + 8)
-+ return 0;
-+
-+ /* check for port access entity Ethernet type */
-+// pos = skb->data + 24;
-+ pos = skb->data + hdrlen;
-+ ethertype = (pos[6] << 8) | pos[7];
-+ if (ethertype == ETH_P_PAE)
-+ return 1;
-+
-+ return 0;
-+}
-+
-+/* Called only as a tasklet (software IRQ), by ieee80211_rx */
-+static inline int
-+ieee80211_rx_frame_decrypt(struct ieee80211_device* ieee, struct sk_buff *skb,
-+ struct ieee80211_crypt_data *crypt)
-+{
-+ struct ieee80211_hdr *hdr;
-+ int res, hdrlen;
-+
-+ if (crypt == NULL || crypt->ops->decrypt_mpdu == NULL)
-+ return 0;
-+
-+ hdr = (struct ieee80211_hdr *) skb->data;
-+#ifdef _RTL8187_EXT_PATCH_
-+ if((ieee->iw_mode == ieee->iw_ext_mode) && (ieee->ext_patch_ieee80211_rx_frame_get_hdrlen))
-+ {
-+ hdrlen = ieee->ext_patch_ieee80211_rx_frame_get_hdrlen(ieee, skb);
-+ }
-+ else
-+#endif
-+ hdrlen = ieee80211_get_hdrlen(le16_to_cpu(hdr->frame_ctl));
-+
-+#ifdef CONFIG_IEEE80211_CRYPT_TKIP
-+ if (ieee->tkip_countermeasures &&
-+ strcmp(crypt->ops->name, "TKIP") == 0) {
-+ if (net_ratelimit()) {
-+ printk(KERN_DEBUG "%s: TKIP countermeasures: dropped "
-+ "received packet from " MAC_FMT "\n",
-+ ieee->dev->name, MAC_ARG(hdr->addr2));
-+ }
-+ return -1;
-+ }
-+#endif
-+
-+ atomic_inc(&crypt->refcnt);
-+ res = crypt->ops->decrypt_mpdu(skb, hdrlen, crypt->priv);
-+ atomic_dec(&crypt->refcnt);
-+ if (res < 0) {
-+ IEEE80211_DEBUG_DROP(
-+ "decryption failed (SA=" MAC_FMT
-+ ") res=%d\n", MAC_ARG(hdr->addr2), res);
-+ if (res == -2)
-+ IEEE80211_DEBUG_DROP("Decryption failed ICV "
-+ "mismatch (key %d)\n",
-+ skb->data[hdrlen + 3] >> 6);
-+ ieee->ieee_stats.rx_discards_undecryptable++;
-+ return -1;
-+ }
-+
-+ return res;
-+}
-+
-+
-+/* Called only as a tasklet (software IRQ), by ieee80211_rx */
-+static inline int
-+ieee80211_rx_frame_decrypt_msdu(struct ieee80211_device* ieee, struct sk_buff *skb,
-+ int keyidx, struct ieee80211_crypt_data *crypt)
-+{
-+ struct ieee80211_hdr *hdr;
-+ int res, hdrlen;
-+
-+ if (crypt == NULL || crypt->ops->decrypt_msdu == NULL)
-+ return 0;
-+
-+ hdr = (struct ieee80211_hdr *) skb->data;
-+#ifdef _RTL8187_EXT_PATCH_
-+ if((ieee->iw_mode == ieee->iw_ext_mode) && (ieee->ext_patch_ieee80211_rx_frame_get_hdrlen))
-+ {
-+ hdrlen = ieee->ext_patch_ieee80211_rx_frame_get_hdrlen(ieee, skb);
-+ }
-+ else
-+#endif
-+ hdrlen = ieee80211_get_hdrlen(le16_to_cpu(hdr->frame_ctl));
-+
-+ atomic_inc(&crypt->refcnt);
-+ res = crypt->ops->decrypt_msdu(skb, keyidx, hdrlen, crypt->priv);
-+ atomic_dec(&crypt->refcnt);
-+ if (res < 0) {
-+ printk(KERN_DEBUG "%s: MSDU decryption/MIC verification failed"
-+ " (SA=" MAC_FMT " keyidx=%d)\n",
-+ ieee->dev->name, MAC_ARG(hdr->addr2), keyidx);
-+ return -1;
-+ }
-+
-+ return 0;
-+}
-+
-+
-+/* this function is stolen from ipw2200 driver*/
-+#define IEEE_PACKET_RETRY_TIME (5*HZ)
-+static int is_duplicate_packet(struct ieee80211_device *ieee,
-+ struct ieee80211_hdr *header)
-+{
-+ u16 fc = le16_to_cpu(header->frame_ctl);
-+ u16 sc = le16_to_cpu(header->seq_ctl);
-+ u16 seq = WLAN_GET_SEQ_SEQ(sc);
-+ u16 frag = WLAN_GET_SEQ_FRAG(sc);
-+ u16 *last_seq, *last_frag;
-+ unsigned long *last_time;
-+ struct ieee80211_hdr_3addr_QOS *hdr_3addr_QoS;
-+ struct ieee80211_hdr_QOS *hdr_4addr_QoS;
-+ u8 tid;
-+
-+#ifdef _RTL8187_EXT_PATCH_
-+ if(ieee->iw_mode == ieee->iw_ext_mode)
-+ {
-+ tid = (header->addr2[ETH_ALEN-2] ^ header->addr2[ETH_ALEN-1]) & IEEE80211_QOS_TID;
-+ }
-+ else
-+#endif
-+ //TO2DS and QoS
-+ if(((fc & IEEE80211_FCTL_DSTODS) == IEEE80211_FCTL_DSTODS)&&IEEE80211_QOS_HAS_SEQ(fc)) {
-+ hdr_4addr_QoS = (struct ieee80211_hdr_QOS *)header;
-+ tid = le16_to_cpu(hdr_4addr_QoS->QOS_ctl) & IEEE80211_QOS_TID;
-+ tid = UP2AC(tid);
-+ tid ++;
-+ } else if(IEEE80211_QOS_HAS_SEQ(fc)) { //QoS
-+ hdr_3addr_QoS = (struct ieee80211_hdr_3addr_QOS*)header;
-+ tid = le16_to_cpu(hdr_3addr_QoS->QOS_ctl) & IEEE80211_QOS_TID;
-+ tid = UP2AC(tid);
-+ tid ++;
-+ } else { // no QoS
-+ tid = 0;
-+ }
-+
-+ switch (ieee->iw_mode) {
-+ case IW_MODE_ADHOC:
-+ {
-+ struct list_head *p;
-+ struct ieee_ibss_seq *entry = NULL;
-+ u8 *mac = header->addr2;
-+ int index = mac[5] % IEEE_IBSS_MAC_HASH_SIZE;
-+ //for (pos = (head)->next; pos != (head); pos = pos->next)
-+ __list_for_each(p, &ieee->ibss_mac_hash[index]) {
-+ entry = list_entry(p, struct ieee_ibss_seq, list);
-+ if (!memcmp(entry->mac, mac, ETH_ALEN))
-+ break;
-+ }
-+ // if (memcmp(entry->mac, mac, ETH_ALEN)){
-+ if (p == &ieee->ibss_mac_hash[index]) {
-+ entry = kmalloc(sizeof(struct ieee_ibss_seq), GFP_ATOMIC);
-+ if (!entry) {
-+ printk(KERN_WARNING "Cannot malloc new mac entry\n");
-+ return 0;
-+ }
-+ memcpy(entry->mac, mac, ETH_ALEN);
-+ entry->seq_num[tid] = seq;
-+ entry->frag_num[tid] = frag;
-+ entry->packet_time[tid] = jiffies;
-+ list_add(&entry->list, &ieee->ibss_mac_hash[index]);
-+ return 0;
-+ }
-+ last_seq = &entry->seq_num[tid];
-+ last_frag = &entry->frag_num[tid];
-+ last_time = &entry->packet_time[tid];
-+ break;
-+ }
-+
-+ case IW_MODE_INFRA:
-+ last_seq = &ieee->last_rxseq_num[tid];
-+ last_frag = &ieee->last_rxfrag_num[tid];
-+ last_time = &ieee->last_packet_time[tid];
-+
-+ break;
-+ default:
-+#ifdef _RTL8187_EXT_PATCH_
-+ if(ieee->iw_mode == ieee->iw_ext_mode)
-+ {
-+#if 0
-+ printk("==============> tid = %d\n", tid);
-+ last_seq = &ieee->last_rxseq_num[tid];
-+ last_frag = &ieee->last_rxfrag_num[tid];
-+ last_time = &ieee->last_packet_time[tid];
-+#else
-+ struct list_head *p;
-+ struct ieee_mesh_seq *entry = NULL;
-+ u8 *mac = header->addr2;
-+ int index = mac[5] % IEEE_IBSS_MAC_HASH_SIZE;
-+
-+ __list_for_each(p, &ieee->mesh_mac_hash[index]) {
-+ entry = list_entry(p, struct ieee_mesh_seq, list);
-+ if (!memcmp(entry->mac, mac, ETH_ALEN))
-+ break;
-+ }
-+ if (p == &ieee->mesh_mac_hash[index]) {
-+ entry = kmalloc(sizeof(struct ieee_mesh_seq), GFP_ATOMIC);
-+ if (!entry) {
-+ printk(KERN_WARNING "Cannot malloc new mac entry for mesh\n");
-+ return 0;
-+ }
-+ memcpy(entry->mac, mac, ETH_ALEN);
-+ entry->seq_num = seq;
-+ entry->frag_num = frag;
-+ entry->packet_time = jiffies;
-+ list_add(&entry->list, &ieee->mesh_mac_hash[index]);
-+ return 0;
-+ }
-+ last_seq = &entry->seq_num;
-+ last_frag = &entry->frag_num;
-+ last_time = &entry->packet_time;
-+#endif
-+ break;
-+ }
-+ else
-+#endif
-+ return 0;
-+ }
-+
-+// if(tid != 0) {
-+// printk(KERN_WARNING ":)))))))))))%x %x %x, fc(%x)\n", tid, *last_seq, seq, header->frame_ctl);
-+// }
-+ if ((*last_seq == seq) &&
-+ time_after(*last_time + IEEE_PACKET_RETRY_TIME, jiffies)) {
-+ if (*last_frag == frag){
-+ //printk(KERN_WARNING "[1] go drop!\n");
-+ goto drop;
-+
-+ }
-+ if (*last_frag + 1 != frag)
-+ /* out-of-order fragment */
-+ //printk(KERN_WARNING "[2] go drop!\n");
-+ goto drop;
-+ } else
-+ *last_seq = seq;
-+
-+ *last_frag = frag;
-+ *last_time = jiffies;
-+ return 0;
-+
-+drop:
-+// BUG_ON(!(fc & IEEE80211_FCTL_RETRY));
-+// printk("DUP\n");
-+
-+ return 1;
-+}
-+#ifdef JUST_FOR_87SEMESH
-+#define ActionHeadLen 30
-+#define WIFI_MESH_TYPE IEEE80211_FTYPE_DATA
-+#define WIFI_11S_MESH_ACTION 0x00A0
-+#endif
-+
-+/* All received frames are sent to this function. @skb contains the frame in
-+ * IEEE 802.11 format, i.e., in the format it was sent over air.
-+ * This function is called only as a tasklet (software IRQ). */
-+int ieee80211_rx(struct ieee80211_device *ieee, struct sk_buff *skb,
-+ struct ieee80211_rx_stats *rx_stats)
-+{
-+ struct net_device *dev = ieee->dev;
-+ struct ieee80211_hdr *hdr;
-+ //struct ieee80211_hdr_3addr_QOS *hdr;
-+
-+ size_t hdrlen;
-+ u16 fc, type, stype, sc;
-+ struct net_device_stats *stats;
-+ unsigned int frag;
-+ u8 *payload;
-+ u16 ethertype;
-+#ifdef NOT_YET
-+ struct net_device *wds = NULL;
-+ struct sk_buff *skb2 = NULL;
-+ struct net_device *wds = NULL;
-+ int frame_authorized = 0;
-+ int from_assoc_ap = 0;
-+ void *sta = NULL;
-+#endif
-+// u16 QOS_ctl = 0;
-+ u8 dst[ETH_ALEN];
-+ u8 src[ETH_ALEN];
-+ u8 bssid[ETH_ALEN];
-+ struct ieee80211_crypt_data *crypt = NULL;
-+ int keyidx = 0;
-+
-+ //Added for mesh by Lawrence.
-+ //u8 status;
-+ //u32 flags;
-+
-+ // cheat the the hdr type
-+ hdr = (struct ieee80211_hdr *)skb->data;
-+ stats = &ieee->stats;
-+
-+ if (skb->len < 10) {
-+ printk(KERN_INFO "%s: SKB length < 10\n",
-+ dev->name);
-+ goto rx_dropped;
-+ }
-+#if 0
-+//{added by david for filter the packet listed in the filter table
-+#ifdef _RTL8187_EXT_PATCH_
-+ if((ieee->iw_mode == ieee->iw_ext_mode) && (ieee->ext_patch_ieee80211_acl_query))
-+ {
-+ if(!ieee->ext_patch_ieee80211_acl_query(ieee, hdr->addr2))
-+ goto rx_dropped;
-+ }
-+#endif
-+//}
-+#endif
-+ fc = le16_to_cpu(hdr->frame_ctl);
-+ type = WLAN_FC_GET_TYPE(fc);
-+ stype = WLAN_FC_GET_STYPE(fc);
-+
-+ //Because 87se's bad feature,do more handle.
-+#ifdef JUST_FOR_87SEMESH
-+
-+u8 tmphead[ActionHeadLen];
-+ if(type ==WIFI_MESH_TYPE && stype== WIFI_11S_MESH_ACTION )
-+ //head=sizeof(struct ieee80211_hdr)=30
-+ {
-+ memset(tmphead,0,ActionHeadLen);
-+ memcpy(tmphead,skb->data,ActionHeadLen);
-+
-+ skb_pull(skb,ActionHeadLen+2);
-+ memcpy(skb_push(skb,ActionHeadLen),tmphead,ActionHeadLen);
-+ hdr = (struct ieee80211_hdr *)skb->data;
-+ }
-+
-+#endif
-+ sc = le16_to_cpu(hdr->seq_ctl);
-+
-+ frag = WLAN_GET_SEQ_FRAG(sc);
-+#ifdef _RTL8187_EXT_PATCH_
-+ if((ieee->iw_mode == ieee->iw_ext_mode) && (ieee->ext_patch_ieee80211_rx_frame_get_hdrlen))
-+ {
-+ hdrlen = ieee->ext_patch_ieee80211_rx_frame_get_hdrlen(ieee, skb);
-+ if(skb->len < hdrlen)
-+ goto rx_dropped;
-+ }
-+ else
-+#endif
-+ hdrlen = ieee80211_get_hdrlen(fc);
-+
-+#ifdef NOT_YET
-+#if WIRELESS_EXT > 15
-+ /* Put this code here so that we avoid duplicating it in all
-+ * Rx paths. - Jean II */
-+#ifdef IW_WIRELESS_SPY /* defined in iw_handler.h */
-+ /* If spy monitoring on */
-+ if (iface->spy_data.spy_number > 0) {
-+ struct iw_quality wstats;
-+ wstats.level = rx_stats->signal;
-+ wstats.noise = rx_stats->noise;
-+ wstats.updated = 6; /* No qual value */
-+ /* Update spy records */
-+ wireless_spy_update(dev, hdr->addr2, &wstats);
-+ }
-+#endif /* IW_WIRELESS_SPY */
-+#endif /* WIRELESS_EXT > 15 */
-+ hostap_update_rx_stats(local->ap, hdr, rx_stats);
-+#endif
-+
-+#if WIRELESS_EXT > 15
-+ if (ieee->iw_mode == IW_MODE_MONITOR) {
-+ ieee80211_monitor_rx(ieee, skb, rx_stats);
-+ stats->rx_packets++;
-+ stats->rx_bytes += skb->len;
-+ return 1;
-+ }
-+#endif
-+ if (ieee->host_decrypt) {
-+ int idx = 0;
-+ if (skb->len >= hdrlen + 3)
-+ idx = skb->data[hdrlen + 3] >> 6;
-+#ifdef _RTL8187_EXT_PATCH_
-+
-+ crypt = ieee->cryptlist[0]->crypt[idx];
-+#if 0
-+ {
-+ int i = ieee80211_find_MP(ieee, ((struct ieee80211_hdr*)skb->data)->addr2);
-+ if (i == -1)
-+ {
-+ printk("error find entry in entry list\n");
-+ goto rx_dropped;
-+ }
-+ //printk("%s():"MAC_FMT", find in index:%d", __FUNCTION__, MAC_ARG(((struct ieee80211_hdr*)skb->data)->addr2), i);
-+ crypt = ieee->cryptlist[i]->crypt[idx];
-+ }
-+#endif
-+#else
-+ crypt = ieee->crypt[idx];
-+#endif
-+
-+#ifdef NOT_YET
-+ sta = NULL;
-+
-+ /* Use station specific key to override default keys if the
-+ * receiver address is a unicast address ("individual RA"). If
-+ * bcrx_sta_key parameter is set, station specific key is used
-+ * even with broad/multicast targets (this is against IEEE
-+ * 802.11, but makes it easier to use different keys with
-+ * stations that do not support WEP key mapping). */
-+
-+ if (!(hdr->addr1[0] & 0x01) || local->bcrx_sta_key)
-+ (void) hostap_handle_sta_crypto(local, hdr, &crypt,
-+ &sta);
-+#endif
-+
-+ /* allow NULL decrypt to indicate an station specific override
-+ * for default encryption */
-+ if (crypt && (crypt->ops == NULL ||
-+ crypt->ops->decrypt_mpdu == NULL))
-+ crypt = NULL;
-+
-+ if (!crypt && (fc & IEEE80211_FCTL_WEP)) {
-+ /* This seems to be triggered by some (multicast?)
-+ * frames from other than current BSS, so just drop the
-+ * frames silently instead of filling system log with
-+ * these reports. */
-+ IEEE80211_DEBUG_DROP("Decryption failed (not set)"
-+ " (SA=" MAC_FMT ")\n",
-+ MAC_ARG(hdr->addr2));
-+ ieee->ieee_stats.rx_discards_undecryptable++;
-+ goto rx_dropped;
-+ }
-+ }
-+
-+ if (skb->len < IEEE80211_DATA_HDR3_LEN)
-+ goto rx_dropped;
-+
-+ // if QoS enabled, should check the sequence for each of the AC
-+ if (is_duplicate_packet(ieee, hdr))
-+ goto rx_dropped;
-+
-+#ifdef _RTL8187_EXT_PATCH_
-+ if( ieee->iw_mode == ieee->iw_ext_mode && ieee->ext_patch_ieee80211_rx_mgt_update_expire )
-+ ieee->ext_patch_ieee80211_rx_mgt_update_expire( ieee, skb );
-+#endif
-+
-+ if (type == IEEE80211_FTYPE_MGMT) {
-+
-+ #if 0
-+ if ( stype == IEEE80211_STYPE_AUTH &&
-+ fc & IEEE80211_FCTL_WEP && ieee->host_decrypt &&
-+ (keyidx = hostap_rx_frame_decrypt(ieee, skb, crypt)) < 0)
-+ {
-+ printk(KERN_DEBUG "%s: failed to decrypt mgmt::auth "
-+ "from " MAC_FMT "\n", dev->name,
-+ MAC_ARG(hdr->addr2));
-+ /* TODO: could inform hostapd about this so that it
-+ * could send auth failure report */
-+ goto rx_dropped;
-+ }
-+ #endif
-+
-+
-+ if (ieee80211_rx_frame_mgmt(ieee, skb, rx_stats, type, stype))
-+ goto rx_dropped;
-+ else
-+ goto rx_exit;
-+ }
-+
-+#ifdef _RTL8187_EXT_PATCH_
-+ if((ieee->iw_mode == ieee->iw_ext_mode) && ieee->ext_patch_ieee80211_rx_on_rx)
-+ {
-+ if(ieee->ext_patch_ieee80211_rx_on_rx(ieee, skb, rx_stats, type, stype)==0)
-+ {
-+ goto rx_exit;
-+ }
-+ }
-+#endif
-+
-+ /* Data frame - extract src/dst addresses */
-+ switch (fc & (IEEE80211_FCTL_FROMDS | IEEE80211_FCTL_TODS)) {
-+ case IEEE80211_FCTL_FROMDS:
-+ memcpy(dst, hdr->addr1, ETH_ALEN);
-+ memcpy(src, hdr->addr3, ETH_ALEN);
-+ memcpy(bssid, hdr->addr2, ETH_ALEN);
-+ break;
-+ case IEEE80211_FCTL_TODS:
-+ memcpy(dst, hdr->addr3, ETH_ALEN);
-+ memcpy(src, hdr->addr2, ETH_ALEN);
-+ memcpy(bssid, hdr->addr1, ETH_ALEN);
-+ break;
-+ case IEEE80211_FCTL_FROMDS | IEEE80211_FCTL_TODS:
-+ if (skb->len < IEEE80211_DATA_HDR4_LEN)
-+ goto rx_dropped;
-+ memcpy(dst, hdr->addr3, ETH_ALEN);
-+ memcpy(src, hdr->addr4, ETH_ALEN);
-+ memcpy(bssid, ieee->current_network.bssid, ETH_ALEN);
-+ break;
-+ case 0:
-+ memcpy(dst, hdr->addr1, ETH_ALEN);
-+ memcpy(src, hdr->addr2, ETH_ALEN);
-+ memcpy(bssid, hdr->addr3, ETH_ALEN);
-+ break;
-+ }
-+
-+#ifdef NOT_YET
-+ if (hostap_rx_frame_wds(ieee, hdr, fc, &wds))
-+ goto rx_dropped;
-+ if (wds) {
-+ skb->dev = dev = wds;
-+ stats = hostap_get_stats(dev);
-+ }
-+
-+ if (ieee->iw_mode == IW_MODE_MASTER && !wds &&
-+ (fc & (IEEE80211_FCTL_TODS | IEEE80211_FCTL_FROMDS)) == IEEE80211_FCTL_FROMDS &&
-+ ieee->stadev &&
-+ memcmp(hdr->addr2, ieee->assoc_ap_addr, ETH_ALEN) == 0) {
-+ /* Frame from BSSID of the AP for which we are a client */
-+ skb->dev = dev = ieee->stadev;
-+ stats = hostap_get_stats(dev);
-+ from_assoc_ap = 1;
-+ }
-+#endif
-+
-+ dev->last_rx = jiffies;
-+
-+#ifdef NOT_YET
-+ if ((ieee->iw_mode == IW_MODE_MASTER ||
-+ ieee->iw_mode == IW_MODE_REPEAT) &&
-+ !from_assoc_ap) {
-+ switch (hostap_handle_sta_rx(ieee, dev, skb, rx_stats,
-+ wds != NULL)) {
-+ case AP_RX_CONTINUE_NOT_AUTHORIZED:
-+ frame_authorized = 0;
-+ break;
-+ case AP_RX_CONTINUE:
-+ frame_authorized = 1;
-+ break;
-+ case AP_RX_DROP:
-+ goto rx_dropped;
-+ case AP_RX_EXIT:
-+ goto rx_exit;
-+ }
-+ }
-+#endif
-+
-+#ifdef _RTL8187_EXT_PATCH_
-+ if((ieee->iw_mode == ieee->iw_ext_mode) && ieee->ext_patch_ieee80211_rx_is_valid_framectl)
-+ {
-+ if(ieee->ext_patch_ieee80211_rx_is_valid_framectl(ieee, fc, type, stype)==0)
-+ goto rx_dropped;
-+ }
-+ else
-+#endif
-+ /* Nullfunc frames may have PS-bit set, so they must be passed to
-+ * hostap_handle_sta_rx() before being dropped here. */
-+ if (stype != IEEE80211_STYPE_DATA &&
-+ stype != IEEE80211_STYPE_DATA_CFACK &&
-+ stype != IEEE80211_STYPE_DATA_CFPOLL &&
-+ stype != IEEE80211_STYPE_DATA_CFACKPOLL&&
-+ stype != IEEE80211_STYPE_QOS_DATA//add by David,2006.8.4
-+ ) {
-+ if (stype != IEEE80211_STYPE_NULLFUNC)
-+ IEEE80211_DEBUG_DROP(
-+ "RX: dropped data frame "
-+ "with no data (type=0x%02x, "
-+ "subtype=0x%02x, len=%d)\n",
-+ type, stype, skb->len);
-+ goto rx_dropped;
-+ }
-+
-+ if (memcmp(bssid, ieee->current_network.bssid, ETH_ALEN))
-+ goto rx_dropped;
-+
-+ /* skb: hdr + (possibly fragmented, possibly encrypted) payload */
-+#ifdef _RTL8187_EXT_PATCH_
-+ if (ieee->host_decrypt && crypt) {
-+ int idx = 0;
-+ if (skb->len >= hdrlen + 3)
-+ idx = skb->data[hdrlen + 3] >> 6;
-+ if (ieee->iw_ext_mode == ieee->iw_mode) //if in mesh mode
-+ {
-+ int i = ieee80211_find_MP(ieee, ((struct ieee80211_hdr*)skb->data)->addr2, 0);
-+ if (i == -1)
-+ {
-+ printk("error find entry in entry list\n");
-+ goto rx_dropped;
-+ }
-+ // printk("%s():"MAC_FMT", find in index:%d\n", __FUNCTION__, MAC_ARG(((struct ieee80211_hdr*)skb->data)->addr2), i);
-+ if (ieee->cryptlist[i]&&ieee->cryptlist[i]->crypt[idx])
-+ crypt = ieee->cryptlist[i]->crypt[idx];
-+
-+ else
-+ crypt = NULL;
-+ }
-+ else
-+ crypt = ieee->cryptlist[0]->crypt[idx];
-+ }
-+#endif
-+
-+ if (ieee->host_decrypt && (fc & IEEE80211_FCTL_WEP) &&
-+ (keyidx = ieee80211_rx_frame_decrypt(ieee, skb, crypt)) < 0)
-+ goto rx_dropped;
-+
-+ hdr = (struct ieee80211_hdr *) skb->data;
-+
-+ /* skb: hdr + (possibly fragmented) plaintext payload */
-+ // PR: FIXME: hostap has additional conditions in the "if" below:
-+ // ieee->host_decrypt && (fc & IEEE80211_FCTL_WEP) &&
-+ if ((frag != 0 || (fc & IEEE80211_FCTL_MOREFRAGS))) {
-+ int flen;
-+ struct sk_buff *frag_skb = ieee80211_frag_cache_get(ieee, hdr);
-+ IEEE80211_DEBUG_FRAG("Rx Fragment received (%u)\n", frag);
-+
-+ if (!frag_skb) {
-+ IEEE80211_DEBUG(IEEE80211_DL_RX | IEEE80211_DL_FRAG,
-+ "Rx cannot get skb from fragment "
-+ "cache (morefrag=%d seq=%u frag=%u)\n",
-+ (fc & IEEE80211_FCTL_MOREFRAGS) != 0,
-+ WLAN_GET_SEQ_SEQ(sc), frag);
-+ goto rx_dropped;
-+ }
-+ flen = skb->len;
-+ if (frag != 0)
-+ flen -= hdrlen;
-+
-+ if (frag_skb->tail + flen > frag_skb->end) {
-+ printk(KERN_WARNING "%s: host decrypted and "
-+ "reassembled frame did not fit skb\n",
-+ dev->name);
-+ ieee80211_frag_cache_invalidate(ieee, hdr);
-+ goto rx_dropped;
-+ }
-+
-+ if (frag == 0) {
-+ /* copy first fragment (including full headers) into
-+ * beginning of the fragment cache skb */
-+ memcpy(skb_put(frag_skb, flen), skb->data, flen);
-+ } else {
-+ /* append frame payload to the end of the fragment
-+ * cache skb */
-+ memcpy(skb_put(frag_skb, flen), skb->data + hdrlen,
-+ flen);
-+ }
-+ dev_kfree_skb_any(skb);
-+ skb = NULL;
-+
-+ if (fc & IEEE80211_FCTL_MOREFRAGS) {
-+ /* more fragments expected - leave the skb in fragment
-+ * cache for now; it will be delivered to upper layers
-+ * after all fragments have been received */
-+ goto rx_exit;
-+ }
-+
-+ /* this was the last fragment and the frame will be
-+ * delivered, so remove skb from fragment cache */
-+ skb = frag_skb;
-+ hdr = (struct ieee80211_hdr *) skb->data;
-+ ieee80211_frag_cache_invalidate(ieee, hdr);
-+ }
-+
-+ /* skb: hdr + (possible reassembled) full MSDU payload; possibly still
-+ * encrypted/authenticated */
-+ if (ieee->host_decrypt && (fc & IEEE80211_FCTL_WEP) &&
-+ ieee80211_rx_frame_decrypt_msdu(ieee, skb, keyidx, crypt))
-+ goto rx_dropped;
-+
-+ hdr = (struct ieee80211_hdr *) skb->data;
-+ if (crypt && !(fc & IEEE80211_FCTL_WEP) && !ieee->open_wep) {
-+ if (/*ieee->ieee802_1x &&*/
-+ ieee80211_is_eapol_frame(ieee, skb, hdrlen)) {
-+
-+#ifdef CONFIG_IEEE80211_DEBUG
-+ /* pass unencrypted EAPOL frames even if encryption is
-+ * configured */
-+ struct eapol *eap = (struct eapol *)(skb->data +
-+ 24);
-+ IEEE80211_DEBUG_EAP("RX: IEEE 802.1X EAPOL frame: %s\n",
-+ eap_get_type(eap->type));
-+#endif
-+ } else {
-+ IEEE80211_DEBUG_DROP(
-+ "encryption configured, but RX "
-+ "frame not encrypted (SA=" MAC_FMT ")\n",
-+ MAC_ARG(hdr->addr2));
-+ goto rx_dropped;
-+ }
-+ }
-+
-+#ifdef CONFIG_IEEE80211_DEBUG
-+ if (crypt && !(fc & IEEE80211_FCTL_WEP) &&
-+ ieee80211_is_eapol_frame(ieee, skb)) {
-+ struct eapol *eap = (struct eapol *)(skb->data +
-+ 24);
-+ IEEE80211_DEBUG_EAP("RX: IEEE 802.1X EAPOL frame: %s\n",
-+ eap_get_type(eap->type));
-+ }
-+#endif
-+
-+ if (crypt && !(fc & IEEE80211_FCTL_WEP) && !ieee->open_wep &&
-+ !ieee80211_is_eapol_frame(ieee, skb, hdrlen)) {
-+ IEEE80211_DEBUG_DROP(
-+ "dropped unencrypted RX data "
-+ "frame from " MAC_FMT
-+ " (drop_unencrypted=1)\n",
-+ MAC_ARG(hdr->addr2));
-+ goto rx_dropped;
-+ }
-+/*
-+ if(ieee80211_is_eapol_frame(ieee, skb, hdrlen)) {
-+ printk(KERN_WARNING "RX: IEEE802.1X EPAOL frame!\n");
-+ }
-+*/
-+ /* skb: hdr + (possible reassembled) full plaintext payload */
-+ payload = skb->data + hdrlen;
-+ ethertype = (payload[6] << 8) | payload[7];
-+
-+#ifdef NOT_YET
-+ /* If IEEE 802.1X is used, check whether the port is authorized to send
-+ * the received frame. */
-+ if (ieee->ieee802_1x && ieee->iw_mode == IW_MODE_MASTER) {
-+ if (ethertype == ETH_P_PAE) {
-+ printk(KERN_DEBUG "%s: RX: IEEE 802.1X frame\n",
-+ dev->name);
-+ if (ieee->hostapd && ieee->apdev) {
-+ /* Send IEEE 802.1X frames to the user
-+ * space daemon for processing */
-+ prism2_rx_80211(ieee->apdev, skb, rx_stats,
-+ PRISM2_RX_MGMT);
-+ ieee->apdevstats.rx_packets++;
-+ ieee->apdevstats.rx_bytes += skb->len;
-+ goto rx_exit;
-+ }
-+ } else if (!frame_authorized) {
-+ printk(KERN_DEBUG "%s: dropped frame from "
-+ "unauthorized port (IEEE 802.1X): "
-+ "ethertype=0x%04x\n",
-+ dev->name, ethertype);
-+ goto rx_dropped;
-+ }
-+ }
-+#endif
-+
-+#ifdef _RTL8187_EXT_PATCH_
-+ if((ieee->iw_mode == ieee->iw_ext_mode) && ieee->ext_patch_ieee80211_rx_process_dataframe)
-+ {
-+ if(ieee->ext_patch_ieee80211_rx_process_dataframe(ieee, skb, rx_stats))
-+ {
-+ stats->rx_packets++;
-+ stats->rx_bytes += skb->len;
-+ goto rx_exit;
-+ }
-+ else
-+ goto rx_dropped;
-+ }
-+#endif
-+ ieee->NumRxDataInPeriod++;
-+// ieee->NumRxOkTotal++;
-+ /* convert hdr + possible LLC headers into Ethernet header */
-+ if (skb->len - hdrlen >= 8 &&
-+ ((memcmp(payload, rfc1042_header, SNAP_SIZE) == 0 &&
-+ ethertype != ETH_P_AARP && ethertype != ETH_P_IPX) ||
-+ memcmp(payload, bridge_tunnel_header, SNAP_SIZE) == 0)) {
-+ /* remove RFC1042 or Bridge-Tunnel encapsulation and
-+ * replace EtherType */
-+ skb_pull(skb, hdrlen + SNAP_SIZE);
-+ memcpy(skb_push(skb, ETH_ALEN), src, ETH_ALEN);
-+ memcpy(skb_push(skb, ETH_ALEN), dst, ETH_ALEN);
-+ } else {
-+ u16 len;
-+ /* Leave Ethernet header part of hdr and full payload */
-+ skb_pull(skb, hdrlen);
-+ len = htons(skb->len);
-+ memcpy(skb_push(skb, 2), &len, 2);
-+ memcpy(skb_push(skb, ETH_ALEN), src, ETH_ALEN);
-+ memcpy(skb_push(skb, ETH_ALEN), dst, ETH_ALEN);
-+ }
-+
-+#ifdef NOT_YET
-+ if (wds && ((fc & (IEEE80211_FCTL_TODS | IEEE80211_FCTL_FROMDS)) ==
-+ IEEE80211_FCTL_TODS) &&
-+ skb->len >= ETH_HLEN + ETH_ALEN) {
-+ /* Non-standard frame: get addr4 from its bogus location after
-+ * the payload */
-+ memcpy(skb->data + ETH_ALEN,
-+ skb->data + skb->len - ETH_ALEN, ETH_ALEN);
-+ skb_trim(skb, skb->len - ETH_ALEN);
-+ }
-+#endif
-+
-+ stats->rx_packets++;
-+ stats->rx_bytes += skb->len;
-+
-+#ifdef NOT_YET
-+ if (ieee->iw_mode == IW_MODE_MASTER && !wds &&
-+ ieee->ap->bridge_packets) {
-+ if (dst[0] & 0x01) {
-+ /* copy multicast frame both to the higher layers and
-+ * to the wireless media */
-+ ieee->ap->bridged_multicast++;
-+ skb2 = skb_clone(skb, GFP_ATOMIC);
-+ if (skb2 == NULL)
-+ printk(KERN_DEBUG "%s: skb_clone failed for "
-+ "multicast frame\n", dev->name);
-+ } else if (hostap_is_sta_assoc(ieee->ap, dst)) {
-+ /* send frame directly to the associated STA using
-+ * wireless media and not passing to higher layers */
-+ ieee->ap->bridged_unicast++;
-+ skb2 = skb;
-+ skb = NULL;
-+ }
-+ }
-+
-+ if (skb2 != NULL) {
-+ /* send to wireless media */
-+ skb2->protocol = __constant_htons(ETH_P_802_3);
-+ skb2->mac.raw = skb2->nh.raw = skb2->data;
-+ /* skb2->nh.raw = skb2->data + ETH_HLEN; */
-+ skb2->dev = dev;
-+ dev_queue_xmit(skb2);
-+ }
-+
-+#endif
-+ if (skb) {
-+ //printk("0skb_len(%d)\n", skb->len);
-+ skb->protocol = eth_type_trans(skb, dev);
-+ memset(skb->cb, 0, sizeof(skb->cb));
-+ skb->dev = dev;
-+ skb->ip_summed = CHECKSUM_NONE; /* 802.11 crc not sufficient */
-+ //skb->ip_summed = CHECKSUM_UNNECESSARY; /* 802.11 crc not sufficient */
-+ ieee->last_rx_ps_time = jiffies;
-+ //printk("1skb_len(%d)\n", skb->len);
-+ netif_rx(skb);
-+ }
-+
-+//by lizhaoming for LED_RX 2008.6.23
-+#ifdef LED_SHIN
-+// printk("==================>data rcvd\n");
-+ ieee->ieee80211_led_contorl(dev,LED_CTL_RX);
-+#endif
-+
-+ rx_exit:
-+#ifdef NOT_YET
-+ if (sta)
-+ hostap_handle_sta_release(sta);
-+#endif
-+ return 1;
-+
-+ rx_dropped:
-+ stats->rx_dropped++;
-+#if 0
-+ int i;
-+ printk("======>dropped: %s():addr2:"MAC_FMT",addr1:"MAC_FMT",skb->len:%d, hdrlen:%d\n", __FUNCTION__, MAC_ARG(((struct ieee80211_hdr*)skb->data)->addr2), MAC_ARG(((struct ieee80211_hdr*)skb->data)->addr1), skb->len, hdrlen);
-+ for (i = 0; i < skb->len; i++) {
-+ if (i % 16 == 0) printk("\n\t");
-+ printk("%2x ", *(skb->data+i));
-+ }
-+
-+ printk("\n");
-+#endif
-+ /* Returning 0 indicates to caller that we have not handled the SKB--
-+ * so it is still allocated and can be used again by underlying
-+ * hardware as a DMA target */
-+ return 0;
-+}
-+
-+#ifdef _RTL8187_EXT_PATCH_
-+int ieee_ext_skb_p80211_to_ether(struct sk_buff *skb, int hdrlen, u8 *dst, u8 *src)
-+{
-+ u8 *payload;
-+ u16 ethertype;
-+
-+ /* skb: hdr + (possible reassembled) full plaintext payload */
-+ payload = skb->data + hdrlen;
-+ ethertype = (payload[6] << 8) | payload[7];
-+
-+ /* convert hdr + possible LLC headers into Ethernet header */
-+ if (skb->len - hdrlen >= 8 &&
-+ ((memcmp(payload, rfc1042_header, SNAP_SIZE) == 0 &&
-+ ethertype != ETH_P_AARP && ethertype != ETH_P_IPX) ||
-+ memcmp(payload, bridge_tunnel_header, SNAP_SIZE) == 0)) {
-+ /* remove RFC1042 or Bridge-Tunnel encapsulation and
-+ * replace EtherType */
-+ skb_pull(skb, hdrlen + SNAP_SIZE);
-+ memcpy(skb_push(skb, ETH_ALEN), src, ETH_ALEN);
-+ memcpy(skb_push(skb, ETH_ALEN), dst, ETH_ALEN);
-+ } else {
-+ u16 len;
-+ /* Leave Ethernet header part of hdr and full payload */
-+ skb_pull(skb, hdrlen);
-+ len = htons(skb->len);
-+ memcpy(skb_push(skb, 2), &len, 2);
-+ memcpy(skb_push(skb, ETH_ALEN), src, ETH_ALEN);
-+ memcpy(skb_push(skb, ETH_ALEN), dst, ETH_ALEN);
-+ }
-+
-+ return 1;
-+}
-+#endif // _RTL8187_EXT_PATCH_
-+
-+
-+#define MGMT_FRAME_FIXED_PART_LENGTH 0x24
-+
-+static inline int ieee80211_is_ofdm_rate(u8 rate)
-+{
-+ switch (rate & ~IEEE80211_BASIC_RATE_MASK) {
-+ case IEEE80211_OFDM_RATE_6MB:
-+ case IEEE80211_OFDM_RATE_9MB:
-+ case IEEE80211_OFDM_RATE_12MB:
-+ case IEEE80211_OFDM_RATE_18MB:
-+ case IEEE80211_OFDM_RATE_24MB:
-+ case IEEE80211_OFDM_RATE_36MB:
-+ case IEEE80211_OFDM_RATE_48MB:
-+ case IEEE80211_OFDM_RATE_54MB:
-+ return 1;
-+ }
-+ return 0;
-+}
-+
-+
-+//
-+// Description:
-+// Translate 0-100 signal strength index into dBm.
-+//
-+int
-+TranslateToDbm8187(
-+ unsigned char SignalStrengthIndex // 0-100 index.
-+ )
-+{
-+ unsigned char SignalPower; // in dBm.
-+
-+ // Translate to dBm (x=0.5y-95).
-+ //SignalPower = (int)((SignalStrengthIndex + 1) >> 1);
-+ SignalPower = (int)SignalStrengthIndex * 7 / 10;
-+ SignalPower -= 95;
-+// printk("==>SignalPower:%d\n", SignalPower);
-+ return SignalPower;
-+}
-+
-+static inline int ieee80211_SignalStrengthTranslate(
-+ int CurrSS
-+ )
-+{
-+ int RetSS;
-+
-+ // Step 1. Scale mapping.
-+ if(CurrSS >= 71 && CurrSS <= 100)
-+ {
-+ RetSS = 95 + (((CurrSS - 70) / 6 == 5) ? 5 : ((CurrSS - 70) / 6 + 1));
-+ }
-+ else if(CurrSS >= 41 && CurrSS <= 70)
-+ {
-+ RetSS = 83 + ((CurrSS - 40) / 3);
-+ }
-+ else if(CurrSS >= 31 && CurrSS <= 40)
-+ {
-+ RetSS = 71 + (CurrSS - 30);
-+ }
-+ else if(CurrSS >= 21 && CurrSS <= 30)
-+ {
-+ RetSS = 59 + (CurrSS - 20);
-+ }
-+ else if(CurrSS >= 5 && CurrSS <= 20)
-+ {
-+ RetSS = 47 + (((CurrSS - 5) * 2) / 3);
-+ }
-+ else if(CurrSS == 4)
-+ {
-+ RetSS = 37;
-+ }
-+ else if(CurrSS == 3)
-+ {
-+ RetSS = 27;
-+ }
-+ else if(CurrSS == 2)
-+ {
-+ RetSS = 18;
-+ }
-+ else if(CurrSS == 1)
-+ {
-+ RetSS = 9;
-+ }
-+ else
-+ {
-+ RetSS = CurrSS;
-+ }
-+ //RT_TRACE(COMP_DBG, DBG_LOUD, ("##### After Mapping: LastSS: %d, CurrSS: %d, RetSS: %d\n", LastSS, CurrSS, RetSS));
-+
-+ // Step 2. Smoothing.
-+
-+ //RT_TRACE(COMP_DBG, DBG_LOUD, ("$$$$$ After Smoothing: LastSS: %d, CurrSS: %d, RetSS: %d\n", LastSS, CurrSS, RetSS));
-+
-+ return RetSS;
-+}
-+
-+#ifdef ENABLE_DOT11D
-+static inline void ieee80211_extract_country_ie(
-+ struct ieee80211_device *ieee,
-+ struct ieee80211_info_element *info_element,
-+ struct ieee80211_network *network,
-+ u8 * addr2
-+)
-+{
-+#if 0
-+ u32 i = 0;
-+ u8 * p = (u8*)info_element->data;
-+ printk("-----------------------\n");
-+ printk("%s Country IE:", network->ssid);
-+ for(i=0; i<info_element->len; i++)
-+ printk("\t%2.2x", *(p+i));
-+ printk("\n-----------------------\n");
-+#endif
-+ if(IS_DOT11D_ENABLE(ieee))
-+ {
-+ if(info_element->len!= 0)
-+ {
-+ memcpy(network->CountryIeBuf, info_element->data, info_element->len);
-+ network->CountryIeLen = info_element->len;
-+
-+ if(!IS_COUNTRY_IE_VALID(ieee))
-+ {
-+ Dot11d_UpdateCountryIe(ieee, addr2, info_element->len, info_element->data);
-+ }
-+ }
-+
-+ //
-+ // 070305, rcnjko: I update country IE watch dog here because
-+ // some AP (e.g. Cisco 1242) don't include country IE in their
-+ // probe response frame.
-+ //
-+ if(IS_EQUAL_CIE_SRC(ieee, addr2) )
-+ {
-+ UPDATE_CIE_WATCHDOG(ieee);
-+ }
-+ }
-+
-+}
-+#endif
-+
-+
-+ inline int ieee80211_network_init(
-+ struct ieee80211_device *ieee,
-+ struct ieee80211_probe_response *beacon,
-+ struct ieee80211_network *network,
-+ struct ieee80211_rx_stats *stats)
-+{
-+#ifdef CONFIG_IEEE80211_DEBUG
-+ char rates_str[64];
-+ char *p;
-+#endif
-+ struct ieee80211_info_element *info_element;
-+ u16 left;
-+ u8 i;
-+ short offset;
-+
-+ /* Pull out fixed field data */
-+ memcpy(network->bssid, beacon->header.addr3, ETH_ALEN);
-+ network->capability = beacon->capability;
-+ network->last_scanned = jiffies;
-+ network->time_stamp[0] = beacon->time_stamp[0];
-+ network->time_stamp[1] = beacon->time_stamp[1];
-+ network->beacon_interval = beacon->beacon_interval;
-+ /* Where to pull this? beacon->listen_interval;*/
-+ network->listen_interval = 0x0A;
-+ network->rates_len = network->rates_ex_len = 0;
-+ network->last_associate = 0;
-+ network->ssid_len = 0;
-+ network->flags = 0;
-+ network->atim_window = 0;
-+ network->QoS_Enable = 0;
-+#ifdef THOMAS_TURBO
-+ network->Turbo_Enable = 0;
-+#endif
-+#ifdef ENABLE_DOT11D
-+ network->CountryIeLen = 0;
-+ memset(network->CountryIeBuf, 0, MAX_IE_LEN);
-+#endif
-+
-+ if (stats->freq == IEEE80211_52GHZ_BAND) {
-+ /* for A band (No DS info) */
-+ network->channel = stats->received_channel;
-+ } else
-+ network->flags |= NETWORK_HAS_CCK;
-+
-+ network->wpa_ie_len = 0;
-+ network->rsn_ie_len = 0;
-+
-+ info_element = &beacon->info_element;
-+ left = stats->len - ((void *)info_element - (void *)beacon);
-+ while (left >= sizeof(struct ieee80211_info_element_hdr)) {
-+ if (sizeof(struct ieee80211_info_element_hdr) + info_element->len > left) {
-+ IEEE80211_DEBUG_SCAN("SCAN: parse failed: info_element->len + 2 > left : info_element->len+2=%d left=%d.\n",
-+ info_element->len + sizeof(struct ieee80211_info_element),
-+ left);
-+ return 1;
-+ }
-+
-+ switch (info_element->id) {
-+ case MFIE_TYPE_SSID:
-+ if (ieee80211_is_empty_essid(info_element->data,
-+ info_element->len)) {
-+ network->flags |= NETWORK_EMPTY_ESSID;
-+ break;
-+ }
-+
-+ network->ssid_len = min(info_element->len,
-+ (u8)IW_ESSID_MAX_SIZE);
-+ memcpy(network->ssid, info_element->data, network->ssid_len);
-+ if (network->ssid_len < IW_ESSID_MAX_SIZE)
-+ memset(network->ssid + network->ssid_len, 0,
-+ IW_ESSID_MAX_SIZE - network->ssid_len);
-+
-+ IEEE80211_DEBUG_SCAN("MFIE_TYPE_SSID: '%s' len=%d.\n",
-+ network->ssid, network->ssid_len);
-+ break;
-+
-+ case MFIE_TYPE_RATES:
-+#ifdef CONFIG_IEEE80211_DEBUG
-+ p = rates_str;
-+#endif
-+ network->rates_len = min(info_element->len, MAX_RATES_LENGTH);
-+ for (i = 0; i < network->rates_len; i++) {
-+ network->rates[i] = info_element->data[i];
-+#ifdef CONFIG_IEEE80211_DEBUG
-+ p += snprintf(p, sizeof(rates_str) - (p - rates_str), "%02X ", network->rates[i]);
-+#endif
-+ if (ieee80211_is_ofdm_rate(info_element->data[i])) {
-+ network->flags |= NETWORK_HAS_OFDM;
-+ if (info_element->data[i] &
-+ IEEE80211_BASIC_RATE_MASK)
-+ network->flags &=
-+ ~NETWORK_HAS_CCK;
-+ }
-+ }
-+
-+ IEEE80211_DEBUG_SCAN("MFIE_TYPE_RATES: '%s' (%d)\n",
-+ rates_str, network->rates_len);
-+ break;
-+
-+ case MFIE_TYPE_RATES_EX:
-+#ifdef CONFIG_IEEE80211_DEBUG
-+ p = rates_str;
-+#endif
-+ network->rates_ex_len = min(info_element->len, MAX_RATES_EX_LENGTH);
-+ for (i = 0; i < network->rates_ex_len; i++) {
-+ network->rates_ex[i] = info_element->data[i];
-+#ifdef CONFIG_IEEE80211_DEBUG
-+ p += snprintf(p, sizeof(rates_str) - (p - rates_str), "%02X ", network->rates[i]);
-+#endif
-+ if (ieee80211_is_ofdm_rate(info_element->data[i])) {
-+ network->flags |= NETWORK_HAS_OFDM;
-+ if (info_element->data[i] &
-+ IEEE80211_BASIC_RATE_MASK)
-+ network->flags &=
-+ ~NETWORK_HAS_CCK;
-+ }
-+ }
-+
-+ IEEE80211_DEBUG_SCAN("MFIE_TYPE_RATES_EX: '%s' (%d)\n",
-+ rates_str, network->rates_ex_len);
-+ break;
-+
-+ case MFIE_TYPE_DS_SET:
-+ IEEE80211_DEBUG_SCAN("MFIE_TYPE_DS_SET: %d\n",
-+ info_element->data[0]);
-+ if (stats->freq == IEEE80211_24GHZ_BAND)
-+ network->channel = info_element->data[0];
-+ break;
-+
-+ case MFIE_TYPE_FH_SET:
-+ IEEE80211_DEBUG_SCAN("MFIE_TYPE_FH_SET: ignored\n");
-+ break;
-+
-+ case MFIE_TYPE_CF_SET:
-+ IEEE80211_DEBUG_SCAN("MFIE_TYPE_CF_SET: ignored\n");
-+ break;
-+
-+ case MFIE_TYPE_TIM:
-+
-+ if(info_element->len < 4)
-+ break;
-+
-+ network->dtim_period = info_element->data[1];
-+
-+ if(ieee->state != IEEE80211_LINKED)
-+ break;
-+
-+ network->last_dtim_sta_time[0] = stats->mac_time[0];
-+ network->last_dtim_sta_time[1] = stats->mac_time[1];
-+
-+ network->dtim_data = IEEE80211_DTIM_VALID;
-+
-+ if(info_element->data[0] != 0)
-+ break;
-+
-+ if(info_element->data[2] & 1)
-+ network->dtim_data |= IEEE80211_DTIM_MBCAST;
-+
-+ offset = (info_element->data[2] >> 1)*2;
-+
-+ //printk("offset1:%x aid:%x\n",offset, ieee->assoc_id);
-+
-+ if(ieee->assoc_id < offset ||
-+ ieee->assoc_id > 8*(offset + info_element->len -3))
-+
-+ break;
-+
-+
-+ offset = offset + ieee->assoc_id / 8;// + ((aid % 8)? 0 : 1) ;
-+
-+ // printk("offset:%x data:%x, ucast:%d\n", offset,
-+ // info_element->data[3+offset] ,
-+ // info_element->data[3+offset] & (1<<(ieee->assoc_id%8)));
-+
-+ if(info_element->data[3+offset] & (1<<(ieee->assoc_id%8)))
-+ network->dtim_data |= IEEE80211_DTIM_UCAST;
-+
-+ break;
-+
-+ case MFIE_TYPE_IBSS_SET:
-+ IEEE80211_DEBUG_SCAN("MFIE_TYPE_IBSS_SET: ignored\n");
-+ break;
-+
-+ case MFIE_TYPE_CHALLENGE:
-+ IEEE80211_DEBUG_SCAN("MFIE_TYPE_CHALLENGE: ignored\n");
-+ break;
-+
-+ case MFIE_TYPE_GENERIC:
-+ //nic is 87B
-+ IEEE80211_DEBUG_SCAN("MFIE_TYPE_GENERIC: %d bytes\n",
-+ info_element->len);
-+ if (info_element->len >= 4 &&
-+ info_element->data[0] == 0x00 &&
-+ info_element->data[1] == 0x50 &&
-+ info_element->data[2] == 0xf2 &&
-+ info_element->data[3] == 0x01) {
-+ network->wpa_ie_len = min(info_element->len + 2,
-+ MAX_WPA_IE_LEN);
-+ memcpy(network->wpa_ie, info_element,
-+ network->wpa_ie_len);
-+ }
-+
-+#ifdef THOMAS_TURBO
-+ if (info_element->len == 7 &&
-+ info_element->data[0] == 0x00 &&
-+ info_element->data[1] == 0xe0 &&
-+ info_element->data[2] == 0x4c &&
-+ info_element->data[3] == 0x01 &&
-+ info_element->data[4] == 0x02) {
-+ network->Turbo_Enable = 1;
-+ }
-+#endif
-+ if (1 == stats->nic_type) {//nic 87
-+ break;
-+ }
-+
-+ if (info_element->len >= 5 &&
-+ info_element->data[0] == 0x00 &&
-+ info_element->data[1] == 0x50 &&
-+ info_element->data[2] == 0xf2 &&
-+ info_element->data[3] == 0x02 &&
-+ info_element->data[4] == 0x00) {
-+ //printk(KERN_WARNING "wmm info updated: %x\n", info_element->data[6]);
-+ //WMM Information Element
-+ network->wmm_info = info_element->data[6];
-+ network->QoS_Enable = 1;
-+ }
-+
-+ if (info_element->len >= 8 &&
-+ info_element->data[0] == 0x00 &&
-+ info_element->data[1] == 0x50 &&
-+ info_element->data[2] == 0xf2 &&
-+ info_element->data[3] == 0x02 &&
-+ info_element->data[4] == 0x01) {
-+ // Not care about version at present.
-+ //WMM Information Element
-+ //printk(KERN_WARNING "wmm info&param updated: %x\n", info_element->data[6]);
-+ network->wmm_info = info_element->data[6];
-+ //WMM Parameter Element
-+ memcpy(network->wmm_param, (u8 *)(info_element->data + 8),(info_element->len - 8));
-+ network->QoS_Enable = 1;
-+ }
-+ break;
-+
-+ case MFIE_TYPE_RSN:
-+ IEEE80211_DEBUG_SCAN("MFIE_TYPE_RSN: %d bytes\n",
-+ info_element->len);
-+ network->rsn_ie_len = min(info_element->len + 2,
-+ MAX_WPA_IE_LEN);
-+ memcpy(network->rsn_ie, info_element,
-+ network->rsn_ie_len);
-+ break;
-+
-+#ifdef ENABLE_DOT11D
-+ case MFIE_TYPE_COUNTRY:
-+ IEEE80211_DEBUG_SCAN("MFIE_TYPE_COUNTRY: %d bytes\n",
-+ info_element->len);
-+// printk("=====>Receive <%s> Country IE\n",network->ssid);
-+ ieee80211_extract_country_ie(ieee, info_element, network, beacon->header.addr2);
-+ break;
-+#endif
-+
-+ default:
-+ IEEE80211_DEBUG_SCAN("unsupported IE %d\n",
-+ info_element->id);
-+ break;
-+ }
-+
-+ left -= sizeof(struct ieee80211_info_element_hdr) +
-+ info_element->len;
-+ info_element = (struct ieee80211_info_element *)
-+ &info_element->data[info_element->len];
-+ }
-+
-+ network->mode = 0;
-+ if (stats->freq == IEEE80211_52GHZ_BAND)
-+ network->mode = IEEE_A;
-+ else {
-+ if (network->flags & NETWORK_HAS_OFDM)
-+ network->mode |= IEEE_G;
-+ if (network->flags & NETWORK_HAS_CCK)
-+ network->mode |= IEEE_B;
-+ }
-+
-+ if (network->mode == 0) {
-+ IEEE80211_DEBUG_SCAN("Filtered out '%s (" MAC_FMT ")' "
-+ "network.\n",
-+ escape_essid(network->ssid,
-+ network->ssid_len),
-+ MAC_ARG(network->bssid));
-+ return 1;
-+ }
-+
-+ if (ieee80211_is_empty_essid(network->ssid, network->ssid_len))
-+ network->flags |= NETWORK_EMPTY_ESSID;
-+
-+#if 1
-+ //if(strcmp(network->ssid, "linksys_lzm000") == 0)
-+ // printk("----signalstrength = %d ", stats->signalstrength);
-+ stats->signal = TranslateToDbm8187(stats->signalstrength);
-+ //stats->noise = stats->signal - stats->noise;
-+ stats->noise = TranslateToDbm8187(100 - stats->signalstrength) - 25;
-+#endif
-+ memcpy(&network->stats, stats, sizeof(network->stats));
-+
-+ //YJ,test,080611
-+ //if(strcmp(network->ssid, "ZyXEL") == 0)
-+ // IEEE_NET_DUMP(network);
-+
-+ return 0;
-+}
-+
-+static inline int is_same_network(struct ieee80211_network *src,
-+ struct ieee80211_network *dst,
-+ struct ieee80211_device * ieee)
-+{
-+ /* A network is only a duplicate if the channel, BSSID, ESSID
-+ * and the capability field (in particular IBSS and BSS) all match.
-+ * We treat all <hidden> with the same BSSID and channel
-+ * as one network */
-+ return (((src->ssid_len == dst->ssid_len) || (ieee->iw_mode == IW_MODE_INFRA)) && //YJ,mod,080819,for hidden ap
-+ //((src->ssid_len == dst->ssid_len) &&
-+ (src->channel == dst->channel) &&
-+ !memcmp(src->bssid, dst->bssid, ETH_ALEN) &&
-+ (!memcmp(src->ssid, dst->ssid, src->ssid_len) || (ieee->iw_mode == IW_MODE_INFRA)) && //YJ,mod,080819,for hidden ap
-+ //!memcmp(src->ssid, dst->ssid, src->ssid_len) &&
-+ ((src->capability & WLAN_CAPABILITY_IBSS) ==
-+ (dst->capability & WLAN_CAPABILITY_IBSS)) &&
-+ ((src->capability & WLAN_CAPABILITY_BSS) ==
-+ (dst->capability & WLAN_CAPABILITY_BSS)));
-+}
-+
-+inline void update_network(struct ieee80211_network *dst,
-+ struct ieee80211_network *src)
-+{
-+ unsigned char quality = src->stats.signalstrength;
-+ unsigned char signal = 0;
-+ unsigned char noise = 0;
-+ if(dst->stats.signalstrength > 0) {
-+ quality = (dst->stats.signalstrength * 5 + src->stats.signalstrength + 5)/6;
-+ }
-+ signal = TranslateToDbm8187(quality);
-+ //noise = signal - src->stats.noise;
-+ if(dst->stats.noise > 0)
-+ noise = (dst->stats.noise * 5 + src->stats.noise)/6;
-+ //if(strcmp(dst->ssid, "linksys_lzm000") == 0)
-+// printk("ssid:%s, quality:%d, signal:%d\n", dst->ssid, quality, signal);
-+ memcpy(&dst->stats, &src->stats, sizeof(struct ieee80211_rx_stats));
-+ dst->stats.signalstrength = quality;
-+ dst->stats.signal = signal;
-+ dst->stats.noise = noise;
-+ dst->capability = src->capability;
-+ memcpy(dst->rates, src->rates, src->rates_len);
-+ dst->rates_len = src->rates_len;
-+ memcpy(dst->rates_ex, src->rates_ex, src->rates_ex_len);
-+ dst->rates_ex_len = src->rates_ex_len;
-+
-+ //YJ,add,080819,for hidden ap
-+ if(src->ssid_len > 0)
-+ {
-+ //if(src->ssid_len == 13)
-+ // printk("=====================>>>>>>>> Dst ssid: %s Src ssid: %s\n", dst->ssid, src->ssid);
-+ memset(dst->ssid, 0, dst->ssid_len);
-+ dst->ssid_len = src->ssid_len;
-+ memcpy(dst->ssid, src->ssid, src->ssid_len);
-+ }
-+ //YJ,add,080819,for hidden ap,end
-+ dst->channel = src->channel;
-+ dst->mode = src->mode;
-+ dst->flags = src->flags;
-+ dst->time_stamp[0] = src->time_stamp[0];
-+ dst->time_stamp[1] = src->time_stamp[1];
-+
-+ dst->beacon_interval = src->beacon_interval;
-+ dst->listen_interval = src->listen_interval;
-+ dst->atim_window = src->atim_window;
-+ dst->dtim_period = src->dtim_period;
-+ dst->dtim_data = src->dtim_data;
-+ dst->last_dtim_sta_time[0] = src->last_dtim_sta_time[0];
-+ dst->last_dtim_sta_time[1] = src->last_dtim_sta_time[1];
-+
-+ memcpy(dst->wpa_ie, src->wpa_ie, src->wpa_ie_len);
-+ dst->wpa_ie_len = src->wpa_ie_len;
-+ memcpy(dst->rsn_ie, src->rsn_ie, src->rsn_ie_len);
-+ dst->rsn_ie_len = src->rsn_ie_len;
-+
-+ dst->last_scanned = jiffies;
-+ /* dst->last_associate is not overwritten */
-+#if 1
-+ dst->wmm_info = src->wmm_info; //sure to exist in beacon or probe response frame.
-+/*
-+ if((dst->wmm_info^src->wmm_info)&0x0f) {//Param Set Count change, update Parameter
-+ memcpy(dst->wmm_param, src->wmm_param, IEEE80211_AC_PRAM_LEN);
-+ }
-+*/
-+ if(src->wmm_param[0].ac_aci_acm_aifsn|| \
-+ src->wmm_param[1].ac_aci_acm_aifsn|| \
-+ src->wmm_param[2].ac_aci_acm_aifsn|| \
-+ src->wmm_param[1].ac_aci_acm_aifsn) {
-+ memcpy(dst->wmm_param, src->wmm_param, WME_AC_PRAM_LEN);
-+ }
-+ dst->QoS_Enable = src->QoS_Enable;
-+#else
-+ dst->QoS_Enable = 1;//for Rtl8187 simulation
-+#endif
-+ dst->SignalStrength = src->SignalStrength;
-+#ifdef THOMAS_TURBO
-+ dst->Turbo_Enable = src->Turbo_Enable;
-+#endif
-+#ifdef ENABLE_DOT11D
-+ dst->CountryIeLen = src->CountryIeLen;
-+ memcpy(dst->CountryIeBuf, src->CountryIeBuf, src->CountryIeLen);
-+#endif
-+
-+}
-+
-+inline void ieee80211_process_probe_response(
-+ struct ieee80211_device *ieee,
-+ struct ieee80211_probe_response *beacon,
-+ struct ieee80211_rx_stats *stats)
-+{
-+ struct ieee80211_network network;
-+ struct ieee80211_network *target;
-+ struct ieee80211_network *oldest = NULL;
-+#ifdef CONFIG_IEEE80211_DEBUG
-+ struct ieee80211_info_element *info_element = &beacon->info_element;
-+#endif
-+ unsigned long flags;
-+ short renew;
-+ u8 wmm_info;
-+ u8 is_beacon = (WLAN_FC_GET_STYPE(beacon->header.frame_ctl) == IEEE80211_STYPE_BEACON)? 1:0;
-+
-+ memset(&network, 0, sizeof(struct ieee80211_network));
-+//rz
-+#ifdef _RTL8187_EXT_PATCH_
-+ if((ieee->iw_mode == ieee->iw_ext_mode) && ieee->ext_patch_ieee80211_process_probe_response_1) {
-+ ieee->ext_patch_ieee80211_process_probe_response_1(ieee, beacon, stats);
-+ return;
-+ }
-+#endif
-+ IEEE80211_DEBUG_SCAN(
-+ "'%s' (" MAC_FMT "): %c%c%c%c %c%c%c%c-%c%c%c%c %c%c%c%c\n",
-+ escape_essid(info_element->data, info_element->len),
-+ MAC_ARG(beacon->header.addr3),
-+ (beacon->capability & (1<<0xf)) ? '1' : '0',
-+ (beacon->capability & (1<<0xe)) ? '1' : '0',
-+ (beacon->capability & (1<<0xd)) ? '1' : '0',
-+ (beacon->capability & (1<<0xc)) ? '1' : '0',
-+ (beacon->capability & (1<<0xb)) ? '1' : '0',
-+ (beacon->capability & (1<<0xa)) ? '1' : '0',
-+ (beacon->capability & (1<<0x9)) ? '1' : '0',
-+ (beacon->capability & (1<<0x8)) ? '1' : '0',
-+ (beacon->capability & (1<<0x7)) ? '1' : '0',
-+ (beacon->capability & (1<<0x6)) ? '1' : '0',
-+ (beacon->capability & (1<<0x5)) ? '1' : '0',
-+ (beacon->capability & (1<<0x4)) ? '1' : '0',
-+ (beacon->capability & (1<<0x3)) ? '1' : '0',
-+ (beacon->capability & (1<<0x2)) ? '1' : '0',
-+ (beacon->capability & (1<<0x1)) ? '1' : '0',
-+ (beacon->capability & (1<<0x0)) ? '1' : '0');
-+
-+ if (ieee80211_network_init(ieee, beacon, &network, stats)) {
-+ IEEE80211_DEBUG_SCAN("Dropped '%s' (" MAC_FMT ") via %s.\n",
-+ escape_essid(info_element->data,
-+ info_element->len),
-+ MAC_ARG(beacon->header.addr3),
-+ WLAN_FC_GET_STYPE(beacon->header.frame_ctl) ==
-+ IEEE80211_STYPE_PROBE_RESP ?
-+ "PROBE RESPONSE" : "BEACON");
-+ return;
-+ }
-+
-+#ifdef ENABLE_DOT11D
-+ // For Asus EeePc request,
-+ // (1) if wireless adapter receive get any 802.11d country code in AP beacon,
-+ // wireless adapter should follow the country code.
-+ // (2) If there is no any country code in beacon,
-+ // then wireless adapter should do active scan from ch1~11 and
-+ // passive scan from ch12~14
-+ if(ieee->bGlobalDomain)
-+ {
-+ if (WLAN_FC_GET_STYPE(beacon->header.frame_ctl) == IEEE80211_STYPE_PROBE_RESP)
-+ {
-+ // Case 1: Country code
-+ if(IS_COUNTRY_IE_VALID(ieee) )
-+ {
-+ if( !IsLegalChannel(ieee, network.channel) )
-+ {
-+ printk("GetScanInfo(): For Country code, filter probe response at channel(%d).\n", network.channel);
-+ return;
-+ }
-+ }
-+ // Case 2: No any country code.
-+ else
-+ {
-+ // Filter over channel ch12~14
-+ if(network.channel > 11)
-+ {
-+ printk("GetScanInfo(): For Global Domain, filter probe response at channel(%d).\n", network.channel);
-+ return;
-+ }
-+ }
-+ }
-+ else
-+ {
-+ // Case 1: Country code
-+ if(IS_COUNTRY_IE_VALID(ieee) )
-+ {
-+ if( !IsLegalChannel(ieee, network.channel) )
-+ {
-+ printk("GetScanInfo(): For Country code, filter beacon at channel(%d).\n",network.channel);
-+ return;
-+ }
-+ }
-+ // Case 2: No any country code.
-+ else
-+ {
-+ // Filter over channel ch12~14
-+ if(network.channel > 14)
-+ {
-+ printk("GetScanInfo(): For Global Domain, filter beacon at channel(%d).\n",network.channel);
-+ return;
-+ }
-+ }
-+ }
-+ }
-+
-+ //lzm add 081205
-+ // for Toshiba request, we use channel_plan COUNTRY_CODE_WORLD_WIDE_13_INDEX,
-+ // For Liteon "World Wide 13" Domain name:ch1~11 active scan & ch12~13 passive scan
-+ // So we shoud only rcv beacon in 12-13, and filter probe resp in 12-13.
-+ if(ieee->MinPassiveChnlNum != MAX_CHANNEL_NUMBER+1)
-+ {
-+ if (WLAN_FC_GET_STYPE(beacon->header.frame_ctl) == IEEE80211_STYPE_PROBE_RESP)
-+ {
-+ // Filter over channel ch12~13
-+ if(network.channel >= ieee->MinPassiveChnlNum)
-+ {
-+ printk("GetScanInfo(): passive scan, filter probe resp at channel(%d).\n", network.channel);
-+ return;
-+ }
-+ }
-+ }
-+#endif
-+
-+
-+ /* The network parsed correctly -- so now we scan our known networks
-+ * to see if we can find it in our list.
-+ *
-+ * NOTE: This search is definitely not optimized. Once its doing
-+ * the "right thing" we'll optimize it for efficiency if
-+ * necessary */
-+
-+ /* Search for this entry in the list and update it if it is
-+ * already there. */
-+
-+ spin_lock_irqsave(&ieee->lock, flags);
-+
-+ if(is_same_network(&ieee->current_network, &network, ieee)) {
-+ //YJ,add,080819,for hidden ap
-+ if(is_beacon == 0)
-+ network.flags = (~NETWORK_EMPTY_ESSID & network.flags)|(NETWORK_EMPTY_ESSID & ieee->current_network.flags);
-+ if ((ieee->state == IEEE80211_LINKED) && is_beacon)
-+ ieee->NumRxBcnInPeriod++;
-+ wmm_info = ieee->current_network.wmm_info;
-+ update_network(&ieee->current_network, &network);
-+ }
-+
-+ list_for_each_entry(target, &ieee->network_list, list) {
-+ if (is_same_network(target, &network, ieee))
-+ break;
-+ if ((oldest == NULL) ||
-+ (target->last_scanned < oldest->last_scanned))
-+ oldest = target;
-+ }
-+
-+ /* If we didn't find a match, then get a new network slot to initialize
-+ * with this beacon's information */
-+ if (&target->list == &ieee->network_list) {
-+ if (list_empty(&ieee->network_free_list)) {
-+ /* If there are no more slots, expire the oldest */
-+ list_del(&oldest->list);
-+ target = oldest;
-+ IEEE80211_DEBUG_SCAN("Expired '%s' (" MAC_FMT ") from "
-+ "network list.\n",
-+ escape_essid(target->ssid,
-+ target->ssid_len),
-+ MAC_ARG(target->bssid));
-+ } else {
-+ /* Otherwise just pull from the free list */
-+ target = list_entry(ieee->network_free_list.next,
-+ struct ieee80211_network, list);
-+ list_del(ieee->network_free_list.next);
-+ }
-+
-+
-+#ifdef CONFIG_IEEE80211_DEBUG
-+ IEEE80211_DEBUG_SCAN("Adding '%s' (" MAC_FMT ") via %s.\n",
-+ escape_essid(network.ssid,
-+ network.ssid_len),
-+ MAC_ARG(network.bssid),
-+ WLAN_FC_GET_STYPE(beacon->header.frame_ctl) ==
-+ IEEE80211_STYPE_PROBE_RESP ?
-+ "PROBE RESPONSE" : "BEACON");
-+#endif
-+
-+#ifdef _RTL8187_EXT_PATCH_
-+ network.ext_entry = target->ext_entry;
-+#endif
-+ memcpy(target, &network, sizeof(*target));
-+ list_add_tail(&target->list, &ieee->network_list);
-+ if(ieee->softmac_features & IEEE_SOFTMAC_ASSOCIATE)
-+ ieee80211_softmac_new_net(ieee,&network);
-+ } else {
-+ IEEE80211_DEBUG_SCAN("Updating '%s' (" MAC_FMT ") via %s.\n",
-+ escape_essid(target->ssid,
-+ target->ssid_len),
-+ MAC_ARG(target->bssid),
-+ WLAN_FC_GET_STYPE(beacon->header.frame_ctl) ==
-+ IEEE80211_STYPE_PROBE_RESP ?
-+ "PROBE RESPONSE" : "BEACON");
-+
-+ /* we have an entry and we are going to update it. But this entry may
-+ * be already expired. In this case we do the same as we found a new
-+ * net and call the new_net handler
-+ */
-+ renew = !time_after(target->last_scanned + ieee->scan_age, jiffies);
-+ //YJ,add,080819,for hidden ap
-+ if(is_beacon == 0)
-+ network.flags = (~NETWORK_EMPTY_ESSID & network.flags)|(NETWORK_EMPTY_ESSID & target->flags);
-+ //if(strncmp(network.ssid, "linksys-c",9) == 0)
-+ // printk("====>2 network.ssid=%s FLAG=%d target.ssid=%s FLAG=%d\n", network.ssid, network.flags, target->ssid, target->flags);
-+ if(((network.flags & NETWORK_EMPTY_ESSID) == NETWORK_EMPTY_ESSID) \
-+ && (((network.ssid_len > 0) && (strncmp(target->ssid, network.ssid, network.ssid_len)))\
-+ ||((ieee->current_network.ssid_len == network.ssid_len)&&(strncmp(ieee->current_network.ssid, network.ssid, network.ssid_len) == 0)&&(ieee->state == IEEE80211_NOLINK))))
-+ renew = 1;
-+ //YJ,add,080819,for hidden ap,end
-+ update_network(target, &network);
-+ if(renew && (ieee->softmac_features & IEEE_SOFTMAC_ASSOCIATE))
-+ ieee80211_softmac_new_net(ieee,&network);
-+ }
-+
-+ spin_unlock_irqrestore(&ieee->lock, flags);
-+}
-+
-+void ieee80211_rx_mgt(struct ieee80211_device *ieee,
-+ struct ieee80211_hdr *header,
-+ struct ieee80211_rx_stats *stats)
-+{
-+ switch (WLAN_FC_GET_STYPE(header->frame_ctl)) {
-+
-+ case IEEE80211_STYPE_BEACON:
-+ IEEE80211_DEBUG_MGMT("received BEACON (%d)\n",
-+ WLAN_FC_GET_STYPE(header->frame_ctl));
-+ IEEE80211_DEBUG_SCAN("Beacon\n");
-+ ieee80211_process_probe_response(
-+ ieee, (struct ieee80211_probe_response *)header, stats);
-+ break;
-+
-+ case IEEE80211_STYPE_PROBE_RESP:
-+ IEEE80211_DEBUG_MGMT("received PROBE RESPONSE (%d)\n",
-+ WLAN_FC_GET_STYPE(header->frame_ctl));
-+ IEEE80211_DEBUG_SCAN("Probe response\n");
-+ ieee80211_process_probe_response(
-+ ieee, (struct ieee80211_probe_response *)header, stats);
-+ break;
-+//rz
-+#ifdef _RTL8187_EXT_PATCH_
-+ case IEEE80211_STYPE_PROBE_REQ:
-+ IEEE80211_DEBUG_MGMT("received PROBE REQUEST (%d)\n",
-+ WLAN_FC_GET_STYPE(header->frame_ctl));
-+ IEEE80211_DEBUG_SCAN("Probe request\n");
-+ ///
-+ //printk("Probe request\n");
-+ if( ieee->iw_mode == ieee->iw_ext_mode && ieee->ext_patch_ieee80211_rx_mgt_on_probe_req )
-+ ieee->ext_patch_ieee80211_rx_mgt_on_probe_req( ieee, (struct ieee80211_probe_request *)header, stats);
-+ break;
-+#endif // _RTL8187_EXT_PATCH_
-+
-+ }
-+}
-+
-+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0))
-+EXPORT_SYMBOL(ieee80211_rx_mgt);
-+EXPORT_SYMBOL(ieee80211_rx);
-+EXPORT_SYMBOL(ieee80211_network_init);
-+#ifdef _RTL8187_EXT_PATCH_
-+EXPORT_SYMBOL(ieee_ext_skb_p80211_to_ether);
-+#endif
-+#else
-+EXPORT_SYMBOL_NOVERS(ieee80211_rx_mgt);
-+EXPORT_SYMBOL_NOVERS(ieee80211_rx);
-+EXPORT_SYMBOL_NOVERS(ieee80211_network_init);
-+#ifdef _RTL8187_EXT_PATCH_
-+EXPORT_SYMBOL_NOVERS(ieee_ext_skb_p80211_to_ether);
-+#endif
-+#endif
-diff -Nur linux-2.6.30.5.orig/drivers/net/wireless/rtl8187b/ieee80211/ieee80211_softmac.c linux-2.6.30.5/drivers/net/wireless/rtl8187b/ieee80211/ieee80211_softmac.c
---- linux-2.6.30.5.orig/drivers/net/wireless/rtl8187b/ieee80211/ieee80211_softmac.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.30.5/drivers/net/wireless/rtl8187b/ieee80211/ieee80211_softmac.c 2009-08-23 19:01:04.000000000 +0200
-@@ -0,0 +1,4083 @@
-+/* IEEE 802.11 SoftMAC layer
-+ * Copyright (c) 2005 Andrea Merello <andreamrl@tiscali.it>
-+ *
-+ * Mostly extracted from the rtl8180-sa2400 driver for the
-+ * in-kernel generic ieee802.11 stack.
-+ *
-+ * Few lines might be stolen from other part of the ieee80211
-+ * stack. Copyright who own it's copyright
-+ *
-+ * WPA code stolen from the ipw2200 driver.
-+ * Copyright who own it's copyright.
-+ *
-+ * released under the GPL
-+ */
-+
-+
-+#include "ieee80211.h"
-+
-+#include <linux/random.h>
-+#include <linux/delay.h>
-+#include <linux/version.h>
-+#include <asm/uaccess.h>
-+
-+#ifdef ENABLE_DOT11D
-+#include "dot11d.h"
-+#endif
-+
-+
-+u8 rsn_authen_cipher_suite[16][4] = {
-+ {0x00,0x0F,0xAC,0x00}, //Use group key, //Reserved
-+ {0x00,0x0F,0xAC,0x01}, //WEP-40 //RSNA default
-+ {0x00,0x0F,0xAC,0x02}, //TKIP //NONE //{used just as default}
-+ {0x00,0x0F,0xAC,0x03}, //WRAP-historical
-+ {0x00,0x0F,0xAC,0x04}, //CCMP
-+ {0x00,0x0F,0xAC,0x05}, //WEP-104
-+};
-+
-+short ieee80211_is_54g(struct ieee80211_network net)
-+{
-+ return ((net.rates_ex_len > 0) || (net.rates_len > 4));
-+}
-+
-+short ieee80211_is_shortslot(struct ieee80211_network net)
-+{
-+ return (net.capability & WLAN_CAPABILITY_SHORT_SLOT);
-+}
-+
-+/* returns the total length needed for pleacing the RATE MFIE
-+ * tag and the EXTENDED RATE MFIE tag if needed.
-+ * It encludes two bytes per tag for the tag itself and its len
-+ */
-+unsigned int ieee80211_MFIE_rate_len(struct ieee80211_device *ieee)
-+{
-+ unsigned int rate_len = 0;
-+
-+ if (ieee->modulation & IEEE80211_CCK_MODULATION)
-+ rate_len = IEEE80211_CCK_RATE_LEN + 2;
-+
-+ if (ieee->modulation & IEEE80211_OFDM_MODULATION)
-+
-+ rate_len += IEEE80211_OFDM_RATE_LEN + 2;
-+
-+ return rate_len;
-+}
-+
-+/* pleace the MFIE rate, tag to the memory (double) poined.
-+ * Then it updates the pointer so that
-+ * it points after the new MFIE tag added.
-+ */
-+void ieee80211_MFIE_Brate(struct ieee80211_device *ieee, u8 **tag_p)
-+{
-+ u8 *tag = *tag_p;
-+
-+ if (ieee->modulation & IEEE80211_CCK_MODULATION){
-+ *tag++ = MFIE_TYPE_RATES;
-+ *tag++ = 7;
-+ *tag++ = IEEE80211_BASIC_RATE_MASK | IEEE80211_CCK_RATE_1MB;
-+ *tag++ = IEEE80211_BASIC_RATE_MASK | IEEE80211_CCK_RATE_2MB;
-+ *tag++ = IEEE80211_BASIC_RATE_MASK | IEEE80211_CCK_RATE_5MB;
-+ *tag++ = IEEE80211_BASIC_RATE_MASK | IEEE80211_CCK_RATE_11MB;
-+ //added for basic rate set
-+ *tag++ = IEEE80211_BASIC_RATE_MASK | IEEE80211_OFDM_RATE_6MB;
-+ *tag++ = IEEE80211_BASIC_RATE_MASK | IEEE80211_OFDM_RATE_12MB;
-+ *tag++ = IEEE80211_BASIC_RATE_MASK | IEEE80211_OFDM_RATE_24MB;
-+ }
-+
-+ /* We may add an option for custom rates that specific HW might support */
-+ *tag_p = tag;
-+}
-+
-+void ieee80211_MFIE_Grate(struct ieee80211_device *ieee, u8 **tag_p)
-+{
-+ u8 *tag = *tag_p;
-+
-+ if (ieee->modulation & IEEE80211_OFDM_MODULATION){
-+
-+ *tag++ = MFIE_TYPE_RATES_EX;
-+ *tag++ = 5;
-+ *tag++ = IEEE80211_OFDM_RATE_9MB;
-+ *tag++ = IEEE80211_OFDM_RATE_18MB;
-+ *tag++ = IEEE80211_OFDM_RATE_36MB;
-+ *tag++ = IEEE80211_OFDM_RATE_48MB;
-+ *tag++ = IEEE80211_OFDM_RATE_54MB;
-+
-+ }
-+
-+ /* We may add an option for custom rates that specific HW might support */
-+ *tag_p = tag;
-+}
-+
-+
-+void ieee80211_WMM_Info(struct ieee80211_device *ieee, u8 **tag_p) {
-+ u8 *tag = *tag_p;
-+
-+ *tag++ = MFIE_TYPE_GENERIC; //0
-+ *tag++ = 7;
-+ *tag++ = 0x00;
-+ *tag++ = 0x50;
-+ *tag++ = 0xf2;
-+ *tag++ = 0x02;//5
-+ *tag++ = 0x00;
-+ *tag++ = 0x01;
-+#ifdef SUPPORT_USPD
-+ if(ieee->current_network.wmm_info & 0x80) {
-+ *tag++ = 0x0f|MAX_SP_Len;
-+ } else {
-+ *tag++ = MAX_SP_Len;
-+ }
-+#else
-+ *tag++ = MAX_SP_Len;
-+#endif
-+ *tag_p = tag;
-+}
-+
-+#ifdef THOMAS_TURBO
-+void ieee80211_TURBO_Info(struct ieee80211_device *ieee, u8 **tag_p) {
-+ u8 *tag = *tag_p;
-+
-+ *tag++ = MFIE_TYPE_GENERIC; //0
-+ *tag++ = 7;
-+ *tag++ = 0x00;
-+ *tag++ = 0xe0;
-+ *tag++ = 0x4c;
-+ *tag++ = 0x01;//5
-+ *tag++ = 0x02;
-+ *tag++ = 0x11;
-+ *tag++ = 0x00;
-+
-+ *tag_p = tag;
-+ printk(KERN_ALERT "This is enable turbo mode IE process\n");
-+}
-+#endif
-+
-+void enqueue_mgmt(struct ieee80211_device *ieee, struct sk_buff *skb)
-+{
-+ int nh;
-+ nh = (ieee->mgmt_queue_head +1) % MGMT_QUEUE_NUM;
-+
-+/*
-+ * if the queue is full but we have newer frames then
-+ * just overwrites the oldest.
-+ *
-+ * if (nh == ieee->mgmt_queue_tail)
-+ * return -1;
-+ */
-+ ieee->mgmt_queue_head = nh;
-+ ieee->mgmt_queue_ring[nh] = skb;
-+
-+ //return 0;
-+}
-+
-+struct sk_buff *dequeue_mgmt(struct ieee80211_device *ieee)
-+{
-+ struct sk_buff *ret;
-+
-+ if(ieee->mgmt_queue_tail == ieee->mgmt_queue_head)
-+ return NULL;
-+
-+ ret = ieee->mgmt_queue_ring[ieee->mgmt_queue_tail];
-+
-+ ieee->mgmt_queue_tail =
-+ (ieee->mgmt_queue_tail+1) % MGMT_QUEUE_NUM;
-+
-+ return ret;
-+}
-+
-+void init_mgmt_queue(struct ieee80211_device *ieee)
-+{
-+ ieee->mgmt_queue_tail = ieee->mgmt_queue_head = 0;
-+}
-+
-+
-+void ieee80211_sta_wakeup(struct ieee80211_device *ieee, short nl);
-+
-+inline void softmac_mgmt_xmit(struct sk_buff *skb, struct ieee80211_device *ieee)
-+{
-+ unsigned long flags;
-+ short single = ieee->softmac_features & IEEE_SOFTMAC_SINGLE_QUEUE;
-+ struct ieee80211_hdr_3addr *header=
-+ (struct ieee80211_hdr_3addr *) skb->data;
-+
-+
-+ spin_lock_irqsave(&ieee->lock, flags);
-+
-+ /* called with 2nd param 0, no mgmt lock required */
-+ ieee80211_sta_wakeup(ieee,0);
-+
-+ if(single){
-+ if(ieee->queue_stop){
-+
-+ enqueue_mgmt(ieee,skb);
-+ }else{
-+ header->seq_ctl = cpu_to_le16(ieee->seq_ctrl[0]<<4);
-+
-+ if (ieee->seq_ctrl[0] == 0xFFF)
-+ ieee->seq_ctrl[0] = 0;
-+ else
-+ ieee->seq_ctrl[0]++;
-+
-+ /* avoid watchdog triggers */
-+ ieee->dev->trans_start = jiffies;
-+ ieee->softmac_data_hard_start_xmit(skb,ieee->dev,ieee->basic_rate);
-+#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,0)
-+// dev_kfree_skb_any(skb);//edit by thomas //'cause this function will cause Oops called in interrupt context in old version 101907
-+#endif
-+ }
-+
-+ spin_unlock_irqrestore(&ieee->lock, flags);
-+ }else{
-+ spin_unlock_irqrestore(&ieee->lock, flags);
-+ spin_lock_irqsave(&ieee->mgmt_tx_lock, flags);
-+
-+ header->seq_ctl = cpu_to_le16(ieee->seq_ctrl[0] << 4);
-+
-+ if (ieee->seq_ctrl[0] == 0xFFF)
-+ ieee->seq_ctrl[0] = 0;
-+ else
-+ ieee->seq_ctrl[0]++;
-+
-+ ieee->softmac_hard_start_xmit(skb,ieee->dev);
-+#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,0)
-+// dev_kfree_skb_any(skb);//edit by thomas
-+#endif
-+ spin_unlock_irqrestore(&ieee->mgmt_tx_lock, flags);
-+ }
-+}
-+
-+
-+inline void softmac_ps_mgmt_xmit(struct sk_buff *skb, struct ieee80211_device *ieee)
-+{
-+
-+ short single = ieee->softmac_features & IEEE_SOFTMAC_SINGLE_QUEUE;
-+ struct ieee80211_hdr_3addr *header =
-+ (struct ieee80211_hdr_3addr *) skb->data;
-+
-+
-+ if(single){
-+
-+ header->seq_ctl = cpu_to_le16(ieee->seq_ctrl[0] << 4);
-+
-+ if (ieee->seq_ctrl[0] == 0xFFF)
-+ ieee->seq_ctrl[0] = 0;
-+ else
-+ ieee->seq_ctrl[0]++;
-+
-+ /* avoid watchdog triggers */
-+ ieee->dev->trans_start = jiffies;
-+ ieee->softmac_data_hard_start_xmit(skb,ieee->dev,ieee->basic_rate);
-+
-+ }else{
-+
-+ header->seq_ctl = cpu_to_le16(ieee->seq_ctrl[0] << 4);
-+
-+ if (ieee->seq_ctrl[0] == 0xFFF)
-+ ieee->seq_ctrl[0] = 0;
-+ else
-+ ieee->seq_ctrl[0]++;
-+
-+ ieee->softmac_hard_start_xmit(skb,ieee->dev);
-+
-+ }
-+ dev_kfree_skb_any(skb);//edit by thomas
-+}
-+
-+inline struct sk_buff *ieee80211_probe_req(struct ieee80211_device *ieee)
-+{
-+ unsigned int len,rate_len;
-+ u8 *tag;
-+ struct sk_buff *skb;
-+ struct ieee80211_probe_request *req;
-+
-+#ifdef _RTL8187_EXT_PATCH_
-+ short extMore = 0;
-+ if(ieee->ext_patch_ieee80211_probe_req_1)
-+ extMore = ieee->ext_patch_ieee80211_probe_req_1(ieee);
-+#endif
-+
-+ len = ieee->current_network.ssid_len;
-+
-+ rate_len = ieee80211_MFIE_rate_len(ieee);
-+
-+#ifdef _RTL8187_EXT_PATCH_
-+ if(!extMore)
-+#endif
-+ skb = dev_alloc_skb(sizeof(struct ieee80211_probe_request) +
-+ 2 + len + rate_len);
-+#ifdef _RTL8187_EXT_PATCH_
-+ else
-+ skb = dev_alloc_skb(sizeof(struct ieee80211_probe_request) +
-+ 2 + len + rate_len+128); // MESHID + CAP
-+#endif
-+
-+ if (!skb)
-+ return NULL;
-+
-+ req = (struct ieee80211_probe_request *) skb_put(skb,sizeof(struct ieee80211_probe_request));
-+ req->header.frame_ctl = cpu_to_le16(IEEE80211_STYPE_PROBE_REQ);
-+ req->header.duration_id = 0; //FIXME: is this OK ?
-+
-+ memset(req->header.addr1, 0xff, ETH_ALEN);
-+ memcpy(req->header.addr2, ieee->dev->dev_addr, ETH_ALEN);
-+ memset(req->header.addr3, 0xff, ETH_ALEN);
-+
-+ tag = (u8 *) skb_put(skb,len+2+rate_len);
-+
-+ *tag++ = MFIE_TYPE_SSID;
-+ *tag++ = len;
-+ memcpy(tag, ieee->current_network.ssid, len);
-+ tag += len;
-+
-+ ieee80211_MFIE_Brate(ieee,&tag);
-+ ieee80211_MFIE_Grate(ieee,&tag);
-+
-+#ifdef _RTL8187_EXT_PATCH_
-+ if(extMore)
-+ ieee->ext_patch_ieee80211_probe_req_2(ieee, skb, tag);
-+#endif
-+ return skb;
-+}
-+
-+struct sk_buff *ieee80211_get_beacon_(struct ieee80211_device *ieee);
-+
-+#ifdef _RTL8187_EXT_PATCH_
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)
-+void ext_ieee80211_send_beacon_wq(struct work_struct *work)
-+{
-+ struct ieee80211_device *ieee = container_of(work, struct ieee80211_device, ext_send_beacon_wq);
-+#else
-+void ext_ieee80211_send_beacon_wq(struct ieee80211_device *ieee)
-+{
-+#endif
-+
-+ struct sk_buff *skb;
-+
-+ //unsigned long flags;
-+// printk("=========>%s()\n", __FUNCTION__);
-+ skb = ieee80211_get_beacon_(ieee);
-+
-+ if (skb){
-+ softmac_mgmt_xmit(skb, ieee);
-+ ieee->softmac_stats.tx_beacons++;
-+ dev_kfree_skb_any(skb);//edit by thomas
-+ }
-+
-+
-+ //printk(KERN_WARNING "[1] beacon sending!\n");
-+// ieee->beacon_timer.expires = jiffies +
-+// (MSECS( ieee->current_network.beacon_interval -5));
-+
-+ //spin_lock_irqsave(&ieee->beacon_lock,flags);
-+// if(ieee->beacon_txing)
-+// add_timer(&ieee->beacon_timer);
-+ //spin_unlock_irqrestore(&ieee->beacon_lock,flags);
-+}
-+#endif
-+
-+void ieee80211_send_beacon(struct ieee80211_device *ieee)
-+{
-+ struct sk_buff *skb;
-+
-+ //unsigned long flags;
-+// printk("=========>%s()\n", __FUNCTION__);
-+ skb = ieee80211_get_beacon_(ieee);
-+
-+ if (skb){
-+ softmac_mgmt_xmit(skb, ieee);
-+ ieee->softmac_stats.tx_beacons++;
-+ dev_kfree_skb_any(skb);//edit by thomas
-+ }
-+
-+
-+ //printk(KERN_WARNING "[1] beacon sending!\n");
-+ ieee->beacon_timer.expires = jiffies +
-+ (MSECS( ieee->current_network.beacon_interval -5));
-+
-+ //spin_lock_irqsave(&ieee->beacon_lock,flags);
-+ if(ieee->beacon_txing)
-+ add_timer(&ieee->beacon_timer);
-+ //spin_unlock_irqrestore(&ieee->beacon_lock,flags);
-+}
-+
-+
-+void ieee80211_send_beacon_cb(unsigned long _ieee)
-+{
-+ struct ieee80211_device *ieee =
-+ (struct ieee80211_device *) _ieee;
-+ unsigned long flags;
-+
-+ spin_lock_irqsave(&ieee->beacon_lock, flags);
-+ ieee80211_send_beacon(ieee);
-+ spin_unlock_irqrestore(&ieee->beacon_lock, flags);
-+}
-+
-+#ifdef _RTL8187_EXT_PATCH_
-+
-+inline struct sk_buff *ieee80211_probe_req_with_SSID(struct ieee80211_device *ieee, char *ssid, int len_ssid)
-+{
-+ unsigned int len,rate_len;
-+ u8 *tag;
-+ struct sk_buff *skb;
-+ struct ieee80211_probe_request *req;
-+
-+#ifdef _RTL8187_EXT_PATCH_
-+ short extMore = 0;
-+ if(ieee->ext_patch_ieee80211_probe_req_1)
-+ extMore = ieee->ext_patch_ieee80211_probe_req_1(ieee);
-+#endif
-+
-+ len = len_ssid;
-+
-+ rate_len = ieee80211_MFIE_rate_len(ieee);
-+
-+#ifdef _RTL8187_EXT_PATCH_
-+ if(!extMore)
-+#endif
-+ skb = dev_alloc_skb(sizeof(struct ieee80211_probe_request) +
-+ 2 + len + rate_len);
-+#ifdef _RTL8187_EXT_PATCH_
-+ else
-+ skb = dev_alloc_skb(sizeof(struct ieee80211_probe_request) +
-+ 2 + len + rate_len+128); // MESHID + CAP
-+#endif
-+
-+ if (!skb)
-+ return NULL;
-+
-+ req = (struct ieee80211_probe_request *) skb_put(skb,sizeof(struct ieee80211_probe_request));
-+ req->header.frame_ctl = cpu_to_le16(IEEE80211_STYPE_PROBE_REQ);
-+ req->header.duration_id = 0; //FIXME: is this OK ?
-+
-+ memset(req->header.addr1, 0xff, ETH_ALEN);
-+ memcpy(req->header.addr2, ieee->dev->dev_addr, ETH_ALEN);
-+ memset(req->header.addr3, 0xff, ETH_ALEN);
-+
-+ tag = (u8 *) skb_put(skb,len+2+rate_len);
-+
-+ *tag++ = MFIE_TYPE_SSID;
-+ *tag++ = len;
-+ if(len)
-+ {
-+ memcpy(tag, ssid, len);
-+ tag += len;
-+ }
-+
-+ ieee80211_MFIE_Brate(ieee,&tag);
-+ ieee80211_MFIE_Grate(ieee,&tag);
-+
-+#ifdef _RTL8187_EXT_PATCH_
-+ if(extMore)
-+ ieee->ext_patch_ieee80211_probe_req_2(ieee, skb, tag);
-+#endif
-+ return skb;
-+}
-+
-+#endif // _RTL8187_EXT_PATCH_
-+
-+
-+void ieee80211_send_probe(struct ieee80211_device *ieee)
-+{
-+ struct sk_buff *skb;
-+
-+#ifdef _RTL8187_EXT_PATCH_
-+ if(ieee->iw_mode == ieee->iw_ext_mode)
-+ skb = ieee80211_probe_req_with_SSID(ieee, NULL, 0);
-+ else
-+#endif
-+ skb = ieee80211_probe_req(ieee);
-+ if (skb){
-+ softmac_mgmt_xmit(skb, ieee);
-+ ieee->softmac_stats.tx_probe_rq++;
-+ dev_kfree_skb_any(skb);//edit by thomas
-+ }
-+}
-+
-+void ieee80211_send_probe_requests(struct ieee80211_device *ieee)
-+{
-+ if (ieee->active_scan && (ieee->softmac_features & IEEE_SOFTMAC_PROBERQ)){
-+ ieee80211_send_probe(ieee);
-+ ieee80211_send_probe(ieee);
-+ }
-+}
-+
-+/* this performs syncro scan blocking the caller until all channels
-+ * in the allowed channel map has been checked.
-+ */
-+void ieee80211_softmac_scan_syncro(struct ieee80211_device *ieee)
-+{
-+ short ch = 0;
-+#ifdef ENABLE_DOT11D
-+ u8 channel_map[MAX_CHANNEL_NUMBER+1];
-+ memcpy(channel_map, GET_DOT11D_INFO(ieee)->channel_map, MAX_CHANNEL_NUMBER+1);
-+#endif
-+
-+
-+ down(&ieee->scan_sem);
-+
-+ while(1)
-+ {
-+
-+ do{
-+ ch++;
-+ if (ch > MAX_CHANNEL_NUMBER)
-+ goto out; /* scan completed */
-+
-+#ifdef ENABLE_DOT11D
-+ }while(!channel_map[ch]);
-+#else
-+ }while(!ieee->channel_map[ch]);
-+#endif
-+
-+ //printk("=>current channel is %d\n",ch);
-+
-+ /* this fuction can be called in two situations
-+ * 1- We have switched to ad-hoc mode and we are
-+ * performing a complete syncro scan before conclude
-+ * there are no interesting cell and to create a
-+ * new one. In this case the link state is
-+ * IEEE80211_NOLINK until we found an interesting cell.
-+ * If so the ieee8021_new_net, called by the RX path
-+ * will set the state to IEEE80211_LINKED, so we stop
-+ * scanning
-+ * 2- We are linked and the root uses run iwlist scan.
-+ * So we switch to IEEE80211_LINKED_SCANNING to remember
-+ * that we are still logically linked (not interested in
-+ * new network events, despite for updating the net list,
-+ * but we are temporarly 'unlinked' as the driver shall
-+ * not filter RX frames and the channel is changing.
-+ * So the only situation in witch are interested is to check
-+ * if the state become LINKED because of the #1 situation
-+ */
-+
-+ if (ieee->state == IEEE80211_LINKED)
-+ goto out;
-+
-+ //printk("---->%s: chan %d\n", __func__, ch);
-+ ieee->set_chan(ieee->dev, ch);
-+#ifdef ENABLE_DOT11D
-+ if(channel_map[ch] == 1)
-+#endif
-+ {
-+ ieee80211_send_probe_requests(ieee);
-+ }
-+
-+ /* this prevent excessive time wait when we
-+ * need to wait for a syncro scan to end..
-+ */
-+ if (ieee->sync_scan_hurryup)
-+ goto out;
-+
-+
-+ msleep_interruptible_rtl(IEEE80211_SOFTMAC_SCAN_TIME);
-+
-+ }
-+out:
-+ ieee->sync_scan_hurryup = 0;
-+ up(&ieee->scan_sem);
-+#ifdef ENABLE_DOT11D
-+ if(IS_DOT11D_ENABLE(ieee))
-+ DOT11D_ScanComplete(ieee);
-+#endif
-+
-+}
-+
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
-+/* called both by wq with ieee->lock held */
-+void ieee80211_softmac_scan(struct ieee80211_device *ieee)
-+{
-+#if 0
-+ short watchdog = 0;
-+ do{
-+ ieee->current_network.channel =
-+ (ieee->current_network.channel + 1) % MAX_CHANNEL_NUMBER;
-+ if (watchdog++ > MAX_CHANNEL_NUMBER)
-+ return; /* no good chans */
-+
-+ }while(!ieee->channel_map[ieee->current_network.channel]);
-+#endif
-+
-+ schedule_task(&ieee->softmac_scan_wq);
-+}
-+#endif
-+
-+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20))
-+void ieee80211_softmac_scan_wq(struct work_struct *work)
-+{
-+ struct delayed_work *dwork = container_of(work, struct delayed_work, work);
-+ struct ieee80211_device *ieee = container_of(dwork, struct ieee80211_device, softmac_scan_wq);
-+#else
-+void ieee80211_softmac_scan_wq(struct ieee80211_device *ieee)
-+{
-+#endif
-+ //static short watchdog = 0;
-+ //short watchdog = 0;//lzm move into ieee->scan_watchdog 081215 for roaming
-+ u8 channel_bak = ieee->current_network.channel;//lzm for channel+1
-+#ifdef ENABLE_DOT11D
-+ u8 channel_map[MAX_CHANNEL_NUMBER+1];
-+ memcpy(channel_map, GET_DOT11D_INFO(ieee)->channel_map, MAX_CHANNEL_NUMBER+1);
-+#endif
-+ down(&ieee->scan_sem);
-+
-+ do{
-+ ieee->current_network.channel =
-+ (ieee->current_network.channel + 1) % MAX_CHANNEL_NUMBER;
-+ if (ieee->scan_watchdog++ > MAX_CHANNEL_NUMBER)
-+ goto out; /* no good chans */
-+#ifdef ENABLE_DOT11D
-+ }while(!channel_map[ieee->current_network.channel]);
-+#else
-+ }while(!ieee->channel_map[ieee->current_network.channel]);
-+#endif
-+
-+ if (ieee->scanning == 0 )
-+ goto out;
-+
-+ //printk("current channel is %d\n",ieee->current_network.channel);
-+ ieee->set_chan(ieee->dev, ieee->current_network.channel);
-+#ifdef ENABLE_DOT11D
-+ if(channel_map[ieee->current_network.channel] == 1)
-+#endif
-+ {
-+ ieee80211_send_probe_requests(ieee);
-+ }
-+
-+
-+#if LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0)
-+ queue_delayed_work(ieee->wq, &ieee->softmac_scan_wq, IEEE80211_SOFTMAC_SCAN_TIME);
-+#else
-+ ieee->scan_timer.expires = jiffies + (IEEE80211_SOFTMAC_SCAN_TIME);
-+ if (ieee->scanning == 1)
-+ add_timer(&ieee->scan_timer);
-+#endif
-+
-+ up(&ieee->scan_sem);
-+ return;
-+out:
-+ //printk("%s():Stop scan now\n",__FUNCTION__);
-+ ieee->actscanning = false;
-+ ieee->scan_watchdog = 0;
-+ ieee->scanning = 0;
-+ ieee->current_network.channel = channel_bak;
-+ up(&ieee->scan_sem);
-+#ifdef ENABLE_DOT11D
-+ if(IS_DOT11D_ENABLE(ieee))
-+ DOT11D_ScanComplete(ieee);
-+#endif
-+
-+ return;
-+}
-+
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
-+void ieee80211_softmac_scan_cb(unsigned long _dev)
-+{
-+ unsigned long flags;
-+ struct ieee80211_device *ieee = (struct ieee80211_device *)_dev;
-+
-+ spin_lock_irqsave(&ieee->lock, flags);
-+ ieee80211_softmac_scan(ieee);
-+ spin_unlock_irqrestore(&ieee->lock, flags);
-+}
-+#endif
-+
-+
-+void ieee80211_beacons_start(struct ieee80211_device *ieee)
-+{
-+ unsigned long flags;
-+
-+ spin_lock_irqsave(&ieee->beacon_lock,flags);
-+
-+ ieee->beacon_txing = 1;
-+ ieee80211_send_beacon(ieee);
-+
-+ spin_unlock_irqrestore(&ieee->beacon_lock,flags);
-+}
-+
-+void ieee80211_beacons_stop(struct ieee80211_device *ieee)
-+{
-+ unsigned long flags;
-+
-+ spin_lock_irqsave(&ieee->beacon_lock,flags);
-+
-+ ieee->beacon_txing = 0;
-+ del_timer_sync(&ieee->beacon_timer);
-+
-+ spin_unlock_irqrestore(&ieee->beacon_lock,flags);
-+
-+}
-+
-+
-+void ieee80211_stop_send_beacons(struct ieee80211_device *ieee)
-+{
-+ if(ieee->stop_send_beacons)
-+ ieee->stop_send_beacons(ieee->dev);
-+ if (ieee->softmac_features & IEEE_SOFTMAC_BEACONS)
-+ ieee80211_beacons_stop(ieee);
-+}
-+
-+
-+void ieee80211_start_send_beacons(struct ieee80211_device *ieee)
-+{
-+ if(ieee->start_send_beacons)
-+ ieee->start_send_beacons(ieee->dev);
-+ if(ieee->softmac_features & IEEE_SOFTMAC_BEACONS)
-+ ieee80211_beacons_start(ieee);
-+}
-+
-+
-+void ieee80211_softmac_stop_scan(struct ieee80211_device *ieee)
-+{
-+// unsigned long flags;
-+
-+ ieee->sync_scan_hurryup = 1;
-+
-+ down(&ieee->scan_sem);
-+// spin_lock_irqsave(&ieee->lock, flags);
-+
-+ if (ieee->scanning == 1){
-+ //printk("%s():Stop scan now\n",__FUNCTION__);
-+ ieee->scanning = 0;
-+ //lzm add for softmac_scan_wq can't return from out
-+ //example: rcv probe_response
-+ ieee->scan_watchdog = 0;//lzm add 081215 for roaming
-+ ieee->actscanning = false;
-+
-+#if LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0)
-+ cancel_delayed_work(&ieee->softmac_scan_wq);
-+#else
-+ del_timer_sync(&ieee->scan_timer);
-+#endif
-+ }
-+
-+// spin_unlock_irqrestore(&ieee->lock, flags);
-+ up(&ieee->scan_sem);
-+}
-+
-+void ieee80211_stop_scan(struct ieee80211_device *ieee)
-+{
-+ if (ieee->softmac_features & IEEE_SOFTMAC_SCAN)
-+ ieee80211_softmac_stop_scan(ieee);
-+ else
-+ ieee->stop_scan(ieee->dev);
-+}
-+
-+/* called with ieee->lock held */
-+void ieee80211_start_scan(struct ieee80211_device *ieee)
-+{
-+ ieee->actscanning = true;
-+#ifdef CONFIG_IPS
-+ ieee->ieee80211_ips_leave(ieee->dev);
-+#endif
-+
-+#ifdef ENABLE_DOT11D
-+ if(IS_DOT11D_ENABLE(ieee) )
-+ {
-+ if(IS_COUNTRY_IE_VALID(ieee))
-+ {
-+ RESET_CIE_WATCHDOG(ieee);
-+ }
-+ }
-+#endif
-+
-+ if (ieee->softmac_features & IEEE_SOFTMAC_SCAN){
-+ if (ieee->scanning == 0){
-+ ieee->scanning = 1;
-+#if LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0)
-+ queue_delayed_work(ieee->wq, &ieee->softmac_scan_wq,0);
-+#else
-+ ieee80211_softmac_scan(ieee);
-+#endif
-+ }
-+ }else
-+ ieee->start_scan(ieee->dev);
-+
-+}
-+
-+/* called with wx_sem held */
-+void ieee80211_start_scan_syncro(struct ieee80211_device *ieee)
-+{
-+ //printk("====>%s()\n", __func__);
-+#ifdef CONFIG_IPS
-+ ieee->ieee80211_ips_leave(ieee->dev);
-+#endif
-+ ieee->actscanning = true;
-+
-+#ifdef ENABLE_DOT11D
-+ if(IS_DOT11D_ENABLE(ieee) )
-+ {
-+ if(IS_COUNTRY_IE_VALID(ieee))
-+ {
-+ RESET_CIE_WATCHDOG(ieee);
-+ }
-+ }
-+#endif
-+
-+ ieee->sync_scan_hurryup = 0;
-+
-+ if (ieee->softmac_features & IEEE_SOFTMAC_SCAN)
-+ ieee80211_softmac_scan_syncro(ieee);
-+ else
-+ ieee->scan_syncro(ieee->dev);
-+
-+ ieee->actscanning = false;
-+ //printk("<====%s()\n", __func__);
-+}
-+
-+inline struct sk_buff *ieee80211_authentication_req(struct ieee80211_network *beacon,
-+ struct ieee80211_device *ieee, int challengelen)
-+{
-+ struct sk_buff *skb;
-+ struct ieee80211_authentication *auth;
-+
-+ skb = dev_alloc_skb(sizeof(struct ieee80211_authentication) + challengelen);
-+
-+ if (!skb) return NULL;
-+
-+ auth = (struct ieee80211_authentication *)
-+ skb_put(skb, sizeof(struct ieee80211_authentication));
-+
-+ auth->header.frame_ctl = IEEE80211_STYPE_AUTH;
-+ if (challengelen) auth->header.frame_ctl |= IEEE80211_FCTL_WEP;
-+
-+ auth->header.duration_id = 0x013a; //FIXME
-+
-+ memcpy(auth->header.addr1, beacon->bssid, ETH_ALEN);
-+ memcpy(auth->header.addr2, ieee->dev->dev_addr, ETH_ALEN);
-+ memcpy(auth->header.addr3, beacon->bssid, ETH_ALEN);
-+
-+ auth->algorithm = ieee->open_wep ? WLAN_AUTH_OPEN : WLAN_AUTH_SHARED_KEY;
-+
-+ auth->transaction = cpu_to_le16(ieee->associate_seq);
-+ ieee->associate_seq++;
-+
-+ auth->status = cpu_to_le16(WLAN_STATUS_SUCCESS);
-+
-+ return skb;
-+
-+}
-+
-+u8 WPA_OUI[3] = {0x00, 0x50, 0xf2};
-+
-+static struct sk_buff* ieee80211_probe_resp(struct ieee80211_device *ieee, u8 *dest)
-+{
-+ u8 *tag;
-+ int beacon_size;
-+ struct ieee80211_probe_response *beacon_buf;
-+ struct sk_buff *skb;
-+ int encrypt;
-+ int atim_len,erp_len;
-+ struct ieee80211_crypt_data* crypt;
-+
-+ char *ssid = ieee->current_network.ssid;
-+ int ssid_len = ieee->current_network.ssid_len;
-+ int rate_len = ieee->current_network.rates_len+2;
-+ int rate_ex_len = ieee->current_network.rates_ex_len;
-+
-+ int wpa_ie_len = 0, wpa_type=0;
-+ if(rate_ex_len > 0) rate_ex_len+=2;
-+
-+ if(ieee->current_network.capability & WLAN_CAPABILITY_IBSS)
-+ atim_len = 4;
-+ else
-+ atim_len = 0;
-+
-+ if(ieee80211_is_54g(ieee->current_network))
-+ erp_len = 3;
-+ else
-+ erp_len = 0;
-+ if (ieee->wpa_enabled)
-+ {
-+ // printk("hoho wpa_enalbe\n");
-+ wpa_ie_len = ieee->wpa_ie_len; //24-2
-+ }
-+ beacon_size = sizeof(struct ieee80211_probe_response)+
-+ ssid_len
-+ +3 //channel
-+ +rate_len
-+ +rate_ex_len
-+ +atim_len
-+ +erp_len
-+ +wpa_ie_len;
-+
-+ skb = dev_alloc_skb(beacon_size);
-+
-+ if (!skb)
-+ return NULL;
-+
-+ beacon_buf = (struct ieee80211_probe_response*) skb_put(skb, beacon_size);
-+
-+ memcpy (beacon_buf->header.addr1, dest,ETH_ALEN);
-+ memcpy (beacon_buf->header.addr2, ieee->dev->dev_addr, ETH_ALEN);
-+ memcpy (beacon_buf->header.addr3, ieee->current_network.bssid, ETH_ALEN);
-+
-+ beacon_buf->header.duration_id = 0; //FIXME
-+ beacon_buf->beacon_interval =
-+ cpu_to_le16(ieee->current_network.beacon_interval);
-+ beacon_buf->capability =
-+ cpu_to_le16(ieee->current_network.capability & WLAN_CAPABILITY_IBSS);
-+
-+ if(ieee->short_slot && (ieee->current_network.capability & WLAN_CAPABILITY_SHORT_SLOT))
-+ cpu_to_le16((beacon_buf->capability |= WLAN_CAPABILITY_SHORT_SLOT));
-+#ifdef _RTL8187_EXT_PATCH_
-+{
-+/* struct ieee80211_crypt_data_list* cryptlist = ieee->cryptlist[1];
-+ u8 i = cryptlist->used;
-+ crypt = cryptlist ->crypt[ieee->tx_keyidx];
-+*/
-+ crypt = ieee->cryptlist[0]->crypt[ieee->tx_keyidx];
-+}
-+#else
-+
-+ crypt = ieee->crypt[ieee->tx_keyidx];
-+#endif
-+ if (crypt)
-+ wpa_type = strcmp(crypt->ops->name, "TKIP");
-+
-+
-+ encrypt = ieee->host_encrypt && crypt && crypt->ops &&
-+ ((0 == strcmp(crypt->ops->name, "WEP")||wpa_ie_len));
-+
-+ if (encrypt)
-+ beacon_buf->capability |= cpu_to_le16(WLAN_CAPABILITY_PRIVACY);
-+
-+
-+ beacon_buf->header.frame_ctl = cpu_to_le16(IEEE80211_STYPE_PROBE_RESP);
-+
-+ beacon_buf->info_element.id = MFIE_TYPE_SSID;
-+ beacon_buf->info_element.len = ssid_len;
-+
-+ tag = (u8*) beacon_buf->info_element.data;
-+
-+ memcpy(tag, ssid, ssid_len);
-+
-+ tag += ssid_len;
-+
-+ *(tag++) = MFIE_TYPE_RATES;
-+ *(tag++) = rate_len-2;
-+ memcpy(tag,ieee->current_network.rates,rate_len-2);
-+ tag+=rate_len-2;
-+
-+ *(tag++) = MFIE_TYPE_DS_SET;
-+ *(tag++) = 1;
-+ *(tag++) = ieee->current_network.channel;
-+
-+ if(atim_len){
-+ u16 val16;
-+ *(tag++) = MFIE_TYPE_IBSS_SET;
-+ *(tag++) = 2;
-+ val16 = cpu_to_le16(ieee->current_network.atim_window);
-+ //*((u16*)(tag)) = cpu_to_le16(ieee->current_network.atim_window);
-+ memcpy((u8 *)tag,(u8 *)&val16,2);
-+ tag+=2;
-+ }
-+
-+ if(erp_len){
-+ *(tag++) = MFIE_TYPE_ERP;
-+ *(tag++) = 1;
-+ *(tag++) = 0;
-+ }
-+
-+ if(rate_ex_len){
-+ *(tag++) = MFIE_TYPE_RATES_EX;
-+ *(tag++) = rate_ex_len-2;
-+ memcpy(tag,ieee->current_network.rates_ex,rate_ex_len-2);
-+ tag+=rate_ex_len-2;
-+ }
-+ if (wpa_ie_len)
-+ {
-+#if 0
-+ *(tag++) = 0xdd;
-+ *(tag++) = wpa_ie_len-2;
-+ memcpy(tag, WPA_OUI, 3);
-+ tag += 3;
-+ *(tag++) = 1;
-+ *(tag++) = 1;
-+ *(tag++) = 0;
-+
-+ memcpy(tag, WPA_OUI, 3);
-+ tag += 3;
-+ *(tag++) = wpa_type ? 4:2;
-+ *(tag++) = 1;
-+ *(tag++) = 0;
-+
-+
-+ memcpy(tag, WPA_OUI, 3);
-+ tag += 3;
-+ *(tag++) = wpa_type ? 4:0;
-+ *(tag++) = 1;
-+ *(tag++) = 0;
-+
-+ memcpy(tag, WPA_OUI, 3);
-+ tag += 3;
-+ *(tag++) = 0;
-+#else
-+ if (ieee->iw_mode == IW_MODE_ADHOC)
-+ {//as Windows will set pairwise key same as the group key which is not allowed in Linux, so set this for IOT issue. WB 2008.07.07
-+ memcpy(&ieee->wpa_ie[14], &ieee->wpa_ie[8], 4);
-+ }
-+
-+ memcpy(tag, ieee->wpa_ie, ieee->wpa_ie_len);
-+
-+#endif
-+ }
-+
-+
-+ skb->dev = ieee->dev;
-+ return skb;
-+}
-+
-+
-+#ifdef _RTL8187_EXT_PATCH_
-+struct sk_buff* ieee80211_ext_probe_resp_by_net(struct ieee80211_device *ieee, u8 *dest, struct ieee80211_network *net)
-+{
-+ u8 *tag;
-+ int beacon_size;
-+ struct ieee80211_probe_response *beacon_buf;
-+ struct sk_buff *skb;
-+ int encrypt;
-+ int atim_len,erp_len;
-+ struct ieee80211_crypt_data* crypt;
-+ u8 broadcast_addr[] = {0xff,0xff,0xff,0xff,0xff,0xff};
-+
-+ char *ssid = net->ssid;
-+ int ssid_len = net->ssid_len;
-+
-+ int rate_len = ieee->current_network.rates_len+2;
-+ int rate_ex_len = ieee->current_network.rates_ex_len;
-+ int wpa_ie_len = 0, wpa_type=0;
-+ if(rate_ex_len > 0) rate_ex_len+=2;
-+
-+ if( ieee->meshScanMode&4)
-+ ieee->current_network.channel = ieee->ext_patch_ieee80211_ext_stop_scan_wq_set_channel(ieee);
-+ if( ieee->meshScanMode&6)
-+ {
-+
-+#if LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0)
-+ queue_work(ieee->wq, &ieee->ext_stop_scan_wq);
-+#else
-+ schedule_task(&ieee->ext_stop_scan_wq);
-+#endif
-+ }
-+ if(ieee->current_network.capability & WLAN_CAPABILITY_IBSS) // use current_network here
-+ atim_len = 4;
-+ else
-+ atim_len = 0;
-+
-+ if(ieee80211_is_54g(*net))
-+ erp_len = 3;
-+ else
-+ erp_len = 0;
-+
-+ if (ieee->wpa_enabled &&(ieee->iw_ext_mode==ieee->iw_mode))
-+ {
-+// printk("hoho wpa_enalbe\n");
-+ wpa_ie_len = ieee->wpa_ie_len; //24-2
-+ }
-+
-+ beacon_size = sizeof(struct ieee80211_probe_response)+
-+ ssid_len
-+ +3 //channel
-+ +rate_len
-+ +rate_ex_len
-+ +atim_len
-+ +erp_len
-+ +wpa_ie_len;
-+//b
-+ skb = dev_alloc_skb(beacon_size+196);
-+
-+ if (!skb)
-+ return NULL;
-+
-+ beacon_buf = (struct ieee80211_probe_response*) skb_put(skb, beacon_size);
-+
-+ memcpy (beacon_buf->header.addr1, dest,ETH_ALEN);
-+ memcpy (beacon_buf->header.addr2, ieee->dev->dev_addr, ETH_ALEN);
-+ memcpy (beacon_buf->header.addr3, ieee->current_network.bssid, ETH_ALEN);
-+
-+ beacon_buf->header.duration_id = 0; //FIXME
-+
-+ beacon_buf->beacon_interval =
-+ cpu_to_le16(ieee->current_network.beacon_interval); // use current_network here
-+ beacon_buf->capability =
-+ cpu_to_le16(ieee->current_network.capability & WLAN_CAPABILITY_IBSS);
-+
-+ if(ieee->short_slot && (ieee->current_network.capability & WLAN_CAPABILITY_SHORT_SLOT))
-+ cpu_to_le16((beacon_buf->capability |= WLAN_CAPABILITY_SHORT_SLOT));
-+#ifdef _RTL8187_EXT_PATCH_
-+
-+ crypt = ieee->cryptlist[0]->crypt[ieee->tx_keyidx];
-+#else
-+
-+ crypt = ieee->crypt[ieee->tx_keyidx];
-+#endif
-+
-+// crypt = ieee->crypt[ieee->tx_keyidx];
-+ if (crypt)
-+ wpa_type = strcmp(crypt->ops->name, "TKIP");
-+
-+ encrypt = ieee->host_encrypt && crypt && crypt->ops &&
-+ ((0 == strcmp(crypt->ops->name, "WEP")||wpa_ie_len));
-+
-+ if (encrypt)
-+ beacon_buf->capability |= cpu_to_le16(WLAN_CAPABILITY_PRIVACY);
-+
-+
-+ beacon_buf->header.frame_ctl = cpu_to_le16(IEEE80211_STYPE_PROBE_RESP);
-+
-+ beacon_buf->info_element.id = MFIE_TYPE_SSID;
-+ beacon_buf->info_element.len = ssid_len;
-+
-+ tag = (u8*) beacon_buf->info_element.data;
-+
-+ // brocad cast / probe rsp
-+ if(memcmp(dest, broadcast_addr, ETH_ALEN ))
-+ memcpy(tag, ssid, ssid_len);
-+ else
-+ ssid_len=0;
-+
-+ tag += ssid_len;
-+
-+//get_bssrate_set(priv, _SUPPORTEDRATES_IE_, &pbssrate, &bssrate_len);
-+//pbuf = set_ie(pbuf, _SUPPORTEDRATES_IE_, bssrate_len, pbssrate, &frlen);
-+
-+ *(tag++) = MFIE_TYPE_RATES;
-+ *(tag++) = rate_len-2;
-+ memcpy(tag,ieee->current_network.rates,rate_len-2);
-+ tag+=rate_len-2;
-+
-+ *(tag++) = MFIE_TYPE_DS_SET;
-+ *(tag++) = 1;
-+ *(tag++) = ieee->current_network.channel; // use current_network here
-+
-+
-+ if(atim_len){
-+ *(tag++) = MFIE_TYPE_IBSS_SET;
-+ *(tag++) = 2;
-+ *((u16*)(tag)) = cpu_to_le16(ieee->current_network.atim_window); // use current_network here
-+ tag+=2;
-+ }
-+
-+ if(erp_len){
-+ *(tag++) = MFIE_TYPE_ERP;
-+ *(tag++) = 1;
-+ *(tag++) = 0;
-+ }
-+
-+ if(rate_ex_len){
-+ *(tag++) = MFIE_TYPE_RATES_EX;
-+ *(tag++) = rate_ex_len-2;
-+ memcpy(tag,ieee->current_network.rates_ex,rate_ex_len-2);
-+ tag+=rate_ex_len-2;
-+ }
-+
-+ if (wpa_ie_len)
-+ {
-+#if 0
-+ *(tag++) = 0xdd;
-+ *(tag++) = wpa_ie_len-2;
-+ memcpy(tag, WPA_OUI, 3);
-+ tag += 3;
-+ *(tag++) = 1;
-+ *(tag++) = 1;
-+ *(tag++) = 0;
-+
-+ memcpy(tag, WPA_OUI, 3);
-+ tag += 3;
-+ *(tag++) = wpa_type ? 4:2;
-+ *(tag++) = 1;
-+ *(tag++) = 0;
-+
-+
-+ memcpy(tag, WPA_OUI, 3);
-+ tag += 3;
-+ *(tag++) = wpa_type ? 4:0;
-+ *(tag++) = 1;
-+ *(tag++) = 0;
-+
-+ memcpy(tag, WPA_OUI, 3);
-+ tag += 3;
-+ *(tag++) = 0;
-+#else
-+ memcpy(tag, ieee->wpa_ie, ieee->wpa_ie_len);
-+#endif
-+ }
-+
-+
-+ skb->dev = ieee->dev;
-+ return skb;
-+}
-+#endif // _RTL8187_EXT_PATCH_
-+
-+
-+struct sk_buff* ieee80211_assoc_resp(struct ieee80211_device *ieee, u8 *dest)
-+{
-+ struct sk_buff *skb;
-+ u8* tag;
-+
-+ struct ieee80211_crypt_data* crypt;
-+ struct ieee80211_assoc_response_frame *assoc;
-+ short encrypt;
-+
-+ unsigned int rate_len = ieee80211_MFIE_rate_len(ieee);
-+ int len = sizeof(struct ieee80211_assoc_response_frame) + rate_len;
-+
-+ skb = dev_alloc_skb(len);
-+
-+ if (!skb)
-+ return NULL;
-+
-+ assoc = (struct ieee80211_assoc_response_frame *)
-+ skb_put(skb,sizeof(struct ieee80211_assoc_response_frame));
-+
-+ assoc->header.frame_ctl = cpu_to_le16(IEEE80211_STYPE_ASSOC_RESP);
-+ memcpy(assoc->header.addr1, dest,ETH_ALEN);
-+ memcpy(assoc->header.addr3, ieee->dev->dev_addr, ETH_ALEN);
-+ memcpy(assoc->header.addr2, ieee->dev->dev_addr, ETH_ALEN);
-+ assoc->capability = cpu_to_le16(ieee->iw_mode == IW_MODE_MASTER ?
-+ WLAN_CAPABILITY_BSS : WLAN_CAPABILITY_IBSS);
-+
-+
-+ if(ieee->short_slot)
-+ assoc->capability |= cpu_to_le16(WLAN_CAPABILITY_SHORT_SLOT);
-+
-+ if (ieee->host_encrypt){
-+#ifdef _RTL8187_EXT_PATCH_
-+ crypt = ieee->cryptlist[0]->crypt[ieee->tx_keyidx];
-+#else
-+ crypt = ieee->crypt[ieee->tx_keyidx];
-+#endif
-+ }
-+ else crypt = NULL;
-+
-+ encrypt = ( crypt && crypt->ops);
-+
-+ if (encrypt)
-+ assoc->capability |= cpu_to_le16(WLAN_CAPABILITY_PRIVACY);
-+
-+ assoc->status = 0;
-+ assoc->aid = cpu_to_le16(ieee->assoc_id);
-+ if (ieee->assoc_id == 0x2007) ieee->assoc_id=0;
-+ else ieee->assoc_id++;
-+
-+ tag = (u8*) skb_put(skb, rate_len);
-+
-+ ieee80211_MFIE_Brate(ieee, &tag);
-+ ieee80211_MFIE_Grate(ieee, &tag);
-+
-+ return skb;
-+}
-+
-+struct sk_buff* ieee80211_auth_resp(struct ieee80211_device *ieee,int status, u8 *dest)
-+{
-+ struct sk_buff *skb;
-+ struct ieee80211_authentication *auth;
-+
-+ skb = dev_alloc_skb(sizeof(struct ieee80211_authentication)+1);
-+
-+ if (!skb)
-+ return NULL;
-+
-+ skb->len = sizeof(struct ieee80211_authentication);
-+
-+ auth = (struct ieee80211_authentication *)skb->data;
-+
-+ auth->status = cpu_to_le16(status);
-+ auth->transaction = cpu_to_le16(2);
-+ auth->algorithm = cpu_to_le16(WLAN_AUTH_OPEN);
-+
-+#ifdef _RTL8187_EXT_PATCH_
-+ if(ieee->iw_mode == ieee->iw_ext_mode)
-+ memcpy(auth->header.addr3, dest, ETH_ALEN);
-+#else
-+ memcpy(auth->header.addr3, ieee->dev->dev_addr, ETH_ALEN);
-+#endif
-+ memcpy(auth->header.addr2, ieee->dev->dev_addr, ETH_ALEN);
-+ memcpy(auth->header.addr1, dest, ETH_ALEN);
-+ auth->header.frame_ctl = cpu_to_le16(IEEE80211_STYPE_AUTH);
-+ return skb;
-+
-+
-+}
-+
-+struct sk_buff* ieee80211_null_func(struct ieee80211_device *ieee,short pwr)
-+{
-+ struct sk_buff *skb;
-+ struct ieee80211_hdr_3addr* hdr;
-+
-+ skb = dev_alloc_skb(sizeof(struct ieee80211_hdr_3addr));
-+
-+ if (!skb)
-+ return NULL;
-+
-+ hdr = (struct ieee80211_hdr_3addr*)skb_put(skb,sizeof(struct ieee80211_hdr_3addr));
-+
-+ memcpy(hdr->addr1, ieee->current_network.bssid, ETH_ALEN);
-+ memcpy(hdr->addr2, ieee->dev->dev_addr, ETH_ALEN);
-+ memcpy(hdr->addr3, ieee->current_network.bssid, ETH_ALEN);
-+
-+ hdr->frame_ctl = cpu_to_le16(IEEE80211_FTYPE_DATA |
-+ IEEE80211_STYPE_NULLFUNC | IEEE80211_FCTL_TODS |
-+ (pwr ? IEEE80211_FCTL_PM:0));
-+
-+ return skb;
-+
-+
-+}
-+
-+
-+void ieee80211_resp_to_assoc_rq(struct ieee80211_device *ieee, u8* dest)
-+{
-+ struct sk_buff *buf = ieee80211_assoc_resp(ieee, dest);
-+
-+ if (buf){
-+ softmac_mgmt_xmit(buf, ieee);
-+ dev_kfree_skb_any(buf);//edit by thomas
-+ }
-+}
-+
-+
-+void ieee80211_resp_to_auth(struct ieee80211_device *ieee, int s, u8* dest)
-+{
-+ struct sk_buff *buf = ieee80211_auth_resp(ieee, s, dest);
-+
-+ if (buf){
-+ softmac_mgmt_xmit(buf, ieee);
-+ dev_kfree_skb_any(buf);//edit by thomas
-+ }
-+}
-+
-+
-+void ieee80211_resp_to_probe(struct ieee80211_device *ieee, u8 *dest)
-+{
-+
-+ struct sk_buff *buf = ieee80211_probe_resp(ieee, dest);
-+
-+ if (buf) {
-+ softmac_mgmt_xmit(buf, ieee);
-+ dev_kfree_skb_any(buf);//edit by thomas
-+ }
-+}
-+
-+
-+inline struct sk_buff *ieee80211_association_req(struct ieee80211_network *beacon,struct ieee80211_device *ieee)
-+{
-+ struct sk_buff *skb;
-+
-+ struct ieee80211_assoc_request_frame *hdr;
-+ u8 *tag;
-+ //int i;
-+ unsigned int wpa_len = beacon->wpa_ie_len;
-+#if 1
-+ // for testing purpose
-+ unsigned int rsn_len = beacon->rsn_ie_len;
-+#else
-+ unsigned int rsn_len = beacon->rsn_ie_len - 4;
-+#endif
-+ unsigned int rate_len = ieee80211_MFIE_rate_len(ieee);
-+ unsigned int wmm_info_len = beacon->QoS_Enable?9:0;
-+#ifdef THOMAS_TURBO
-+ unsigned int turbo_info_len = beacon->Turbo_Enable?9:0;
-+#endif
-+
-+ u8 encry_proto = ieee->wpax_type_notify & 0xff;
-+
-+
-+ int len = 0;
-+
-+ //[0] Notify type of encryption: WPA/WPA2
-+ //[1] pair wise type
-+ //[2] authen type
-+ if(ieee->wpax_type_set) {
-+ if (IEEE_PROTO_WPA == encry_proto) {
-+ rsn_len = 0;
-+ } else if (IEEE_PROTO_RSN == encry_proto) {
-+ wpa_len = 0;
-+ }
-+ }
-+#ifdef THOMAS_TURBO
-+ len = sizeof(struct ieee80211_assoc_request_frame)+
-+ + beacon->ssid_len//essid tagged val
-+ + rate_len//rates tagged val
-+ + wpa_len
-+ + rsn_len
-+ + wmm_info_len
-+ + turbo_info_len;
-+#else
-+ len = sizeof(struct ieee80211_assoc_request_frame)+
-+ + beacon->ssid_len//essid tagged val
-+ + rate_len//rates tagged val
-+ + wpa_len
-+ + rsn_len
-+ + wmm_info_len;
-+#endif
-+
-+#ifdef _RTL8187_EXT_PATCH_
-+ if(ieee->iw_mode == ieee->iw_ext_mode)
-+ skb = dev_alloc_skb(len+256); // stanley
-+ else
-+#endif
-+ skb = dev_alloc_skb(len);
-+
-+ if (!skb)
-+ return NULL;
-+
-+ hdr = (struct ieee80211_assoc_request_frame *)
-+ skb_put(skb, sizeof(struct ieee80211_assoc_request_frame));
-+
-+
-+ hdr->header.frame_ctl = IEEE80211_STYPE_ASSOC_REQ;
-+ hdr->header.duration_id= 37; //FIXME
-+ memcpy(hdr->header.addr1, beacon->bssid, ETH_ALEN);
-+ memcpy(hdr->header.addr2, ieee->dev->dev_addr, ETH_ALEN);
-+ memcpy(hdr->header.addr3, beacon->bssid, ETH_ALEN);
-+ memcpy(ieee->ap_mac_addr, beacon->bssid, ETH_ALEN);//for HW security, John
-+
-+ hdr->capability = cpu_to_le16(WLAN_CAPABILITY_BSS);
-+ if (beacon->capability & WLAN_CAPABILITY_PRIVACY )
-+ hdr->capability |= cpu_to_le16(WLAN_CAPABILITY_PRIVACY);
-+
-+ if (beacon->capability & WLAN_CAPABILITY_SHORT_PREAMBLE )
-+ hdr->capability |= cpu_to_le16(WLAN_CAPABILITY_SHORT_PREAMBLE);
-+
-+ if(ieee->short_slot)
-+ hdr->capability |= cpu_to_le16(WLAN_CAPABILITY_SHORT_SLOT);
-+
-+#ifdef _RTL8187_EXT_PATCH_
-+ if((ieee->iw_mode == ieee->iw_ext_mode) && ieee->ext_patch_ieee80211_association_req_1)
-+ ieee->ext_patch_ieee80211_association_req_1(hdr);
-+#endif
-+
-+ hdr->listen_interval = 0xa; //FIXME
-+
-+ hdr->info_element.id = MFIE_TYPE_SSID;
-+
-+ hdr->info_element.len = beacon->ssid_len;
-+ tag = skb_put(skb, beacon->ssid_len);
-+ memcpy(tag, beacon->ssid, beacon->ssid_len);
-+
-+ tag = skb_put(skb, rate_len);
-+
-+ ieee80211_MFIE_Brate(ieee, &tag);
-+ ieee80211_MFIE_Grate(ieee, &tag);
-+
-+ //add rsn==0 condition for ap's mix security mode(wpa+wpa2), john2007.8.9
-+ //choose AES encryption as default algorithm while using mixed mode
-+#if 0
-+ if(rsn_len == 0){
-+
-+ tag = skb_put(skb,wpa_len);
-+
-+ if(wpa_len) {
-+
-+
-+ //{add by david. 2006.8.31
-+ //fix linksys compatibility bug
-+ //}
-+ if(wpa_len > 24) {//22+2, mean include the capability
-+ beacon->wpa_ie[wpa_len - 2] = 0;
-+ }
-+ //multicast cipher OUI
-+ if( beacon->wpa_ie[11]==0x2 ){ //0x0050f202 is the oui of tkip
-+ ieee->broadcast_key_type = KEY_TYPE_TKIP;
-+ }
-+ else if( beacon->wpa_ie[11]==0x4 ){//0x0050f204 is the oui of ccmp
-+ ieee->broadcast_key_type = KEY_TYPE_CCMP;
-+ }
-+ //unicast cipher OUI
-+ if( beacon->wpa_ie[14]==0
-+ && beacon->wpa_ie[15]==0x50
-+ && beacon->wpa_ie[16]==0xf2
-+ && beacon->wpa_ie[17]==0x2 ){ //0x0050f202 is the oui of tkip
-+ ieee->pairwise_key_type = KEY_TYPE_TKIP;
-+ }
-+
-+ else if( beacon->wpa_ie[14]==0
-+ && beacon->wpa_ie[15]==0x50
-+ && beacon->wpa_ie[16]==0xf2
-+ && beacon->wpa_ie[17]==0x4 ){//0x0050f204 is the oui of ccmp
-+ ieee->pairwise_key_type = KEY_TYPE_CCMP;
-+ }
-+ //indicate the wpa_ie content to WPA_SUPPLICANT
-+ buff = kmalloc(IW_CUSTOM_MAX, GFP_ATOMIC);
-+ memset(buff, 0, IW_CUSTOM_MAX);
-+ p=buff;
-+ p += sprintf(p, "ASSOCINFO(ReqIEs=");
-+ for(i=0;i<wpa_len;i++){
-+ p += sprintf(p, "%02x", beacon->wpa_ie[i]);
-+ }
-+ p += sprintf(p, ")");
-+ memset(&wrqu, 0, sizeof(wrqu) );
-+ wrqu.data.length = p - buff;
-+
-+ wireless_send_event(dev, IWEVCUSTOM, &wrqu, buff);
-+ memcpy(tag,beacon->wpa_ie,wpa_len);
-+ }
-+
-+ }
-+
-+ if(rsn_len > 22) {
-+
-+ if( beacon->rsn_ie[4]==0x0 &&
-+ beacon->rsn_ie[5]==0xf &&
-+ beacon->rsn_ie[6]==0xac){
-+
-+ switch(beacon->rsn_ie[7]){
-+ case 0x1:
-+ ieee->broadcast_key_type = KEY_TYPE_WEP40;
-+ break;
-+ case 0x2:
-+ ieee->broadcast_key_type = KEY_TYPE_TKIP;
-+ break;
-+ case 0x4:
-+ ieee->broadcast_key_type = KEY_TYPE_CCMP;
-+ break;
-+ case 0x5:
-+ ieee->broadcast_key_type = KEY_TYPE_WEP104;
-+ break;
-+ default:
-+ printk("fault suite type in RSN broadcast key\n");
-+ break;
-+ }
-+ }
-+
-+ if( beacon->rsn_ie[10]==0x0 &&
-+ beacon->rsn_ie[11]==0xf &&
-+ beacon->rsn_ie[12]==0xac){
-+ if(beacon->rsn_ie[8]==1){//not mixed mode
-+ switch(beacon->rsn_ie[13]){
-+ case 0x2:
-+ ieee->pairwise_key_type = KEY_TYPE_TKIP;
-+ break;
-+ case 0x4:
-+ ieee->pairwise_key_type = KEY_TYPE_CCMP;
-+ break;
-+ default:
-+ printk("fault suite type in RSN pairwise key\n");
-+ break;
-+ }
-+ }
-+ else if(beacon->rsn_ie[8]==2){//mixed mode
-+ ieee->pairwise_key_type = KEY_TYPE_CCMP;
-+ }
-+ }
-+
-+
-+
-+ tag = skb_put(skb,22);
-+ memcpy(tag,(beacon->rsn_ie + info_addr),8);
-+ tag[1] = 20;
-+ tag += 8;
-+ info_addr += 8;
-+
-+ spin_lock_irqsave(&ieee->wpax_suitlist_lock,flags);
-+ for (i = 0; i < 2; i++) {
-+ tag[0] = 1;
-+ tag[1] = 0;
-+ tag += 2;
-+ suite_count = beacon->rsn_ie[info_addr] + \
-+ (beacon->rsn_ie[info_addr + 1] << 8);
-+ info_addr += 2;
-+ if(1 == suite_count) {
-+ memcpy(tag,(beacon->rsn_ie + info_addr),4);
-+ info_addr += 4;
-+ } else {
-+ // if the wpax_type_notify has been set by the application,
-+ // just use it, otherwise just use the default one.
-+ if(ieee->wpax_type_set) {
-+ suit_select = ((0 == i) ? pairwise_type:authen_type)&0x0f ;
-+ memcpy(tag,rsn_authen_cipher_suite[suit_select],4);
-+ } else {
-+ //default set as ccmp, or none authentication
-+ if(i == 0) {
-+ memcpy(tag,rsn_authen_cipher_suite[4],4);
-+ } else {
-+ memcpy(tag,rsn_authen_cipher_suite[2],4);
-+ }
-+
-+ }
-+
-+ info_addr += (suite_count * 4);
-+ }
-+ tag += 4;
-+ }
-+ spin_unlock_irqrestore(&ieee->wpax_suitlist_lock,flags);
-+
-+ tag[0] = 0;
-+ tag[1] = beacon->rsn_ie[info_addr+1];
-+
-+
-+
-+ } else {
-+ tag = skb_put(skb,rsn_len);
-+ if(rsn_len) {
-+
-+
-+ if( beacon->rsn_ie[4]==0x0 &&
-+ beacon->rsn_ie[5]==0xf &&
-+ beacon->rsn_ie[6]==0xac){
-+ switch(beacon->rsn_ie[7]){
-+ case 0x1:
-+ ieee->broadcast_key_type = KEY_TYPE_WEP40;
-+ break;
-+ case 0x2:
-+ ieee->broadcast_key_type = KEY_TYPE_TKIP;
-+ break;
-+ case 0x4:
-+ ieee->broadcast_key_type = KEY_TYPE_CCMP;
-+ break;
-+ case 0x5:
-+ ieee->broadcast_key_type = KEY_TYPE_WEP104;
-+ break;
-+ default:
-+ printk("fault suite type in RSN broadcast key\n");
-+ break;
-+ }
-+ }
-+ if( beacon->rsn_ie[10]==0x0 &&
-+ beacon->rsn_ie[11]==0xf &&
-+ beacon->rsn_ie[12]==0xac){
-+ if(beacon->rsn_ie[8]==1){//not mixed mode
-+ switch(beacon->rsn_ie[13]){
-+ case 0x2:
-+ ieee->pairwise_key_type = KEY_TYPE_TKIP;
-+ break;
-+ case 0x4:
-+ ieee->pairwise_key_type = KEY_TYPE_CCMP;
-+ break;
-+ default:
-+ printk("fault suite type in RSN pairwise key\n");
-+ break;
-+ }
-+
-+ }
-+ else if(beacon->rsn_ie[8]==2){//mixed mode
-+ ieee->pairwise_key_type = KEY_TYPE_CCMP;
-+ }
-+ }
-+
-+
-+ beacon->rsn_ie[rsn_len - 2] = 0;
-+ memcpy(tag,beacon->rsn_ie,rsn_len);
-+ }
-+ }
-+#else
-+ if (ieee->wpa_ie){
-+ tag = skb_put(skb,ieee->wpa_ie_len);
-+ memcpy(tag,ieee->wpa_ie,ieee->wpa_ie_len);
-+ }
-+#endif
-+ tag = skb_put(skb,wmm_info_len);
-+ if(wmm_info_len) {
-+ ieee80211_WMM_Info(ieee, &tag);
-+ }
-+#ifdef THOMAS_TURBO
-+ tag = skb_put(skb,turbo_info_len);
-+ if(turbo_info_len) {
-+ ieee80211_TURBO_Info(ieee, &tag);
-+ }
-+#endif
-+
-+#ifdef _RTL8187_EXT_PATCH_
-+ if((ieee->iw_mode == ieee->iw_ext_mode) && ieee->ext_patch_ieee80211_association_req_2)
-+ ieee->ext_patch_ieee80211_association_req_2(ieee, beacon, skb);
-+#endif
-+
-+ return skb;
-+}
-+
-+void ieee80211_associate_abort(struct ieee80211_device *ieee)
-+{
-+
-+ unsigned long flags;
-+ spin_lock_irqsave(&ieee->lock, flags);
-+
-+ ieee->associate_seq++;
-+
-+ /* don't scan, and avoid to have the RX path possibily
-+ * try again to associate. Even do not react to AUTH or
-+ * ASSOC response. Just wait for the retry wq to be scheduled.
-+ * Here we will check if there are good nets to associate
-+ * with, so we retry or just get back to NO_LINK and scanning
-+ */
-+ if (ieee->state == IEEE80211_ASSOCIATING_AUTHENTICATING){
-+ IEEE80211_DEBUG_MGMT("Authentication failed\n");
-+ ieee->softmac_stats.no_auth_rs++;
-+ }else{
-+ IEEE80211_DEBUG_MGMT("Association failed\n");
-+ ieee->softmac_stats.no_ass_rs++;
-+ }
-+
-+ ieee->state = IEEE80211_ASSOCIATING_RETRY;
-+
-+#if LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0)
-+ queue_delayed_work(ieee->wq, &ieee->associate_retry_wq, \
-+ IEEE80211_SOFTMAC_ASSOC_RETRY_TIME);
-+#else
-+ schedule_task(&ieee->associate_retry_wq);
-+#endif
-+
-+ spin_unlock_irqrestore(&ieee->lock, flags);
-+}
-+
-+void ieee80211_associate_abort_cb(unsigned long dev)
-+{
-+ ieee80211_associate_abort((struct ieee80211_device *) dev);
-+}
-+
-+
-+void ieee80211_associate_step1(struct ieee80211_device *ieee)
-+{
-+ struct ieee80211_network *beacon = &ieee->current_network;
-+ struct sk_buff *skb;
-+
-+ IEEE80211_DEBUG_MGMT("Stopping scan\n");
-+
-+ ieee->softmac_stats.tx_auth_rq++;
-+ skb=ieee80211_authentication_req(beacon, ieee, 0);
-+
-+#ifdef _RTL8187_EXT_PATCH_
-+ if(ieee->iw_mode == ieee->iw_ext_mode ) {
-+ if(skb)
-+ softmac_mgmt_xmit(skb, ieee);
-+ return;
-+ }else
-+#endif
-+ if (!skb)
-+ ieee80211_associate_abort(ieee);
-+ else{
-+ ieee->state = IEEE80211_ASSOCIATING_AUTHENTICATING ;
-+ IEEE80211_DEBUG_MGMT("Sending authentication request\n");
-+ //printk(KERN_WARNING "Sending authentication request\n");
-+ softmac_mgmt_xmit(skb, ieee);
-+ //BUGON when you try to add_timer twice, using mod_timer may be better, john0709
-+ if(!timer_pending(&ieee->associate_timer)){
-+ ieee->associate_timer.expires = jiffies + (HZ / 2);
-+ add_timer(&ieee->associate_timer);
-+ }
-+ dev_kfree_skb_any(skb);//edit by thomas
-+ }
-+}
-+
-+void ieee80211_auth_challenge(struct ieee80211_device *ieee, u8 *challenge, int chlen)
-+{
-+ u8 *c;
-+ struct sk_buff *skb;
-+ struct ieee80211_network *beacon = &ieee->current_network;
-+// int hlen = sizeof(struct ieee80211_authentication);
-+
-+ ieee->associate_seq++;
-+ ieee->softmac_stats.tx_auth_rq++;
-+
-+ skb = ieee80211_authentication_req(beacon, ieee, chlen+2);
-+ if (!skb)
-+ ieee80211_associate_abort(ieee);
-+ else{
-+ c = skb_put(skb, chlen+2);
-+ *(c++) = MFIE_TYPE_CHALLENGE;
-+ *(c++) = chlen;
-+ memcpy(c, challenge, chlen);
-+
-+ IEEE80211_DEBUG_MGMT("Sending authentication challenge response\n");
-+
-+ ieee80211_encrypt_fragment(ieee, skb, sizeof(struct ieee80211_hdr_3addr ));
-+
-+ softmac_mgmt_xmit(skb, ieee);
-+
-+ if(!timer_pending(&ieee->associate_timer)){
-+ ieee->associate_timer.expires = jiffies + (HZ / 2);
-+ add_timer(&ieee->associate_timer);
-+ }
-+ dev_kfree_skb_any(skb);//edit by thomas
-+ }
-+ kfree(challenge);
-+}
-+
-+#ifdef _RTL8187_EXT_PATCH_
-+
-+// based on ieee80211_assoc_resp
-+struct sk_buff* ieee80211_assoc_resp_by_net(struct ieee80211_device *ieee, u8 *dest, unsigned short status, struct ieee80211_network *pstat, int pkt_type)
-+{
-+ struct sk_buff *skb;
-+ u8* tag;
-+
-+ struct ieee80211_crypt_data* crypt;
-+ struct ieee80211_assoc_response_frame *assoc;
-+ short encrypt;
-+
-+ unsigned int rate_len = ieee80211_MFIE_rate_len(ieee);
-+ int len = sizeof(struct ieee80211_assoc_response_frame) + rate_len;
-+
-+ if(ieee->iw_mode == ieee->iw_ext_mode)
-+ skb = dev_alloc_skb(len+256); // stanley
-+ else
-+ skb = dev_alloc_skb(len);
-+
-+ if (!skb)
-+ return NULL;
-+
-+ assoc = (struct ieee80211_assoc_response_frame *)
-+ skb_put(skb,sizeof(struct ieee80211_assoc_response_frame));
-+
-+ assoc->header.frame_ctl = cpu_to_le16(pkt_type);
-+
-+ memcpy(assoc->header.addr1, dest,ETH_ALEN);
-+ memcpy(assoc->header.addr3, ieee->dev->dev_addr, ETH_ALEN);
-+ memcpy(assoc->header.addr2, ieee->dev->dev_addr, ETH_ALEN);
-+ assoc->capability = cpu_to_le16(ieee->iw_mode == IW_MODE_MASTER ?
-+ WLAN_CAPABILITY_BSS : WLAN_CAPABILITY_IBSS);
-+
-+ if((ieee->iw_mode == ieee->iw_ext_mode) && ieee->ext_patch_ieee80211_assoc_resp_by_net_1)
-+ ieee->ext_patch_ieee80211_assoc_resp_by_net_1(assoc);
-+
-+ if(ieee->short_slot)
-+ assoc->capability |= cpu_to_le16(WLAN_CAPABILITY_SHORT_SLOT);
-+
-+ if (ieee->host_encrypt)
-+#ifdef _RTL8187_EXT_PATCH_
-+ crypt = ieee->cryptlist[0]->crypt[ieee->tx_keyidx];
-+#else
-+ crypt = ieee->crypt[ieee->tx_keyidx];
-+#endif
-+
-+ else crypt = NULL;
-+
-+ encrypt = ( crypt && crypt->ops);
-+
-+ if (encrypt)
-+ assoc->capability |= cpu_to_le16(WLAN_CAPABILITY_PRIVACY);
-+
-+ assoc->status = 0;
-+ assoc->aid = cpu_to_le16(ieee->assoc_id);
-+ if (ieee->assoc_id == 0x2007) ieee->assoc_id=0;
-+ else ieee->assoc_id++;
-+
-+ assoc->info_element.id = 230; // Stanley, an unused id (just a hot fix)
-+ assoc->info_element.len = 0;
-+
-+ tag = (u8*) skb_put(skb, rate_len);
-+
-+ ieee80211_MFIE_Brate(ieee, &tag);
-+ ieee80211_MFIE_Grate(ieee, &tag);
-+
-+ if((ieee->iw_mode == ieee->iw_ext_mode) && ieee->ext_patch_ieee80211_assoc_resp_by_net_2)
-+ ieee->ext_patch_ieee80211_assoc_resp_by_net_2(ieee, pstat, pkt_type, skb);
-+
-+ return skb;
-+}
-+
-+// based on ieee80211_resp_to_assoc_rq
-+void ieee80211_ext_issue_assoc_rsp(struct ieee80211_device *ieee, u8 *dest, unsigned short status, struct ieee80211_network *pstat, int pkt_type)
-+{
-+ struct sk_buff *buf = ieee80211_assoc_resp_by_net(ieee, dest, status, pstat, pkt_type);
-+
-+ if (buf)
-+ softmac_mgmt_xmit(buf, ieee);
-+}
-+
-+// based on ieee80211_associate_step2
-+void ieee80211_ext_issue_assoc_req(struct ieee80211_device *ieee, struct ieee80211_network *pstat)
-+{
-+
-+ struct sk_buff* skb;
-+
-+ // printk("@@@@@ ieee80211_ext_issue_assoc_req on channel: %d\n", ieee->current_network.channel);
-+
-+ ieee->softmac_stats.tx_ass_rq++;
-+ skb=ieee80211_association_req(pstat, ieee);
-+ if (skb)
-+ softmac_mgmt_xmit(skb, ieee);
-+}
-+
-+void ieee80211_ext_issue_disassoc(struct ieee80211_device *ieee, struct ieee80211_network *pstat, int reason, unsigned char extReason)
-+{
-+ // do nothing
-+ // printk("@@@@@ ieee80211_ext_issue_disassoc\n");
-+ return;
-+}
-+#endif // _RTL8187_EXT_PATCH_
-+
-+void ieee80211_associate_step2(struct ieee80211_device *ieee)
-+{
-+ struct sk_buff* skb;
-+ struct ieee80211_network *beacon = &ieee->current_network;
-+
-+// del_timer_sync(&ieee->associate_timer);
-+
-+ IEEE80211_DEBUG_MGMT("Sending association request\n");
-+
-+ ieee->softmac_stats.tx_ass_rq++;
-+ skb=ieee80211_association_req(beacon, ieee);
-+ if (!skb)
-+ ieee80211_associate_abort(ieee);
-+ else{
-+ softmac_mgmt_xmit(skb, ieee);
-+ if(!timer_pending(&ieee->associate_timer)){
-+ ieee->associate_timer.expires = jiffies + (HZ / 2);
-+ add_timer(&ieee->associate_timer);
-+ }
-+ dev_kfree_skb_any(skb);//edit by thomas
-+ }
-+}
-+
-+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20))
-+void ieee80211_associate_complete_wq(struct work_struct *work)
-+{
-+ struct ieee80211_device *ieee = container_of(work, struct ieee80211_device, associate_complete_wq);
-+#else
-+void ieee80211_associate_complete_wq(struct ieee80211_device *ieee)
-+{
-+#endif
-+ printk(KERN_INFO "Associated successfully\n");
-+ if(ieee80211_is_54g(ieee->current_network) &&
-+ (ieee->modulation & IEEE80211_OFDM_MODULATION)){
-+
-+ ieee->rate = 540;
-+ printk(KERN_INFO"Using G rates\n");
-+ }else{
-+ ieee->rate = 110;
-+ printk(KERN_INFO"Using B rates\n");
-+ }
-+
-+//by lizhaoming for LED LINK
-+#ifdef LED_SHIN
-+ {
-+ struct net_device *dev = ieee->dev;
-+ ieee->ieee80211_led_contorl(dev, LED_CTL_LINK);
-+ }
-+#endif
-+
-+ ieee->link_change(ieee->dev);
-+ notify_wx_assoc_event(ieee);
-+ if (ieee->data_hard_resume)
-+ ieee->data_hard_resume(ieee->dev);
-+ netif_carrier_on(ieee->dev);
-+}
-+
-+void ieee80211_associate_complete(struct ieee80211_device *ieee)
-+{
-+ int i;
-+// struct net_device *dev = ieee->dev;
-+ del_timer_sync(&ieee->associate_timer);
-+
-+ for(i = 0; i < 6; i++) {
-+// ieee->seq_ctrl[i] = 0;
-+ }
-+ ieee->state = IEEE80211_LINKED;
-+ IEEE80211_DEBUG_MGMT("Successfully associated\n");
-+
-+ //by lizhaoming for LED LINK
-+ //ieee->ieee80211_led_contorl(dev, LED_CTL_LINK);
-+
-+#if LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0)
-+ queue_work(ieee->wq, &ieee->associate_complete_wq);
-+#else
-+ schedule_task(&ieee->associate_complete_wq);
-+#endif
-+}
-+
-+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20))
-+void ieee80211_associate_procedure_wq(struct work_struct *work)
-+{
-+ struct ieee80211_device *ieee = container_of(work, struct ieee80211_device, associate_procedure_wq);
-+#else
-+void ieee80211_associate_procedure_wq(struct ieee80211_device *ieee)
-+{
-+#endif
-+ ieee->sync_scan_hurryup = 1;
-+ down(&ieee->wx_sem);
-+
-+ if (ieee->data_hard_stop)
-+ ieee->data_hard_stop(ieee->dev);
-+
-+ ieee80211_stop_scan(ieee);
-+ //printk("=======>%s set chan:%d\n", __func__, ieee->current_network.channel);
-+ ieee->set_chan(ieee->dev, ieee->current_network.channel);
-+
-+ ieee->associate_seq = 1;
-+ ieee80211_associate_step1(ieee);
-+
-+ up(&ieee->wx_sem);
-+}
-+#ifdef _RTL8187_EXT_PATCH_
-+// based on ieee80211_associate_procedure_wq
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)
-+void ieee80211_ext_stop_scan_wq(struct work_struct *work)
-+{
-+ struct ieee80211_device *ieee = container_of(work, struct ieee80211_device, ext_stop_scan_wq);
-+#else
-+void ieee80211_ext_stop_scan_wq(struct ieee80211_device *ieee)
-+{
-+#endif
-+/*
-+ if (ieee->scanning == 0)
-+ {
-+ if((ieee->iw_mode == ieee->iw_ext_mode) && ieee->ext_patch_ieee80211_ext_stop_scan_wq_set_channel
-+ && ( ieee->current_network.channel == ieee->ext_patch_ieee80211_ext_stop_scan_wq_set_channel(ieee) ) )
-+ return;
-+ }
-+*/
-+ ieee->sync_scan_hurryup = 1;
-+
-+ down(&ieee->wx_sem);
-+
-+ // printk("@@@@@@@@@@ ieee80211_ext_stop_scan_wq\n");
-+ if (ieee->data_hard_stop)
-+ ieee->data_hard_stop(ieee->dev);
-+
-+ ieee80211_stop_scan(ieee);
-+
-+ // set channel
-+ if((ieee->iw_mode == ieee->iw_ext_mode) && ieee->ext_patch_ieee80211_ext_stop_scan_wq_set_channel)
-+ {
-+ int ch = ieee->ext_patch_ieee80211_ext_stop_scan_wq_set_channel(ieee);
-+ ieee->current_network.channel = ch;
-+ ieee->set_chan(ieee->dev, ch);
-+ }
-+ else
-+ {
-+ ieee->set_chan(ieee->dev, ieee->current_network.channel);
-+ }
-+ //
-+ up(&ieee->wx_sem);
-+}
-+
-+
-+void ieee80211_ext_send_11s_beacon(struct ieee80211_device *ieee)
-+{
-+ #if LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0)
-+ queue_work(ieee->wq, &ieee->ext_send_beacon_wq);
-+ #else
-+ schedule_task(&ieee->ext_send_beacon_wq);
-+ #endif
-+
-+}
-+
-+#endif // _RTL8187_EXT_PATCH_
-+
-+inline void ieee80211_softmac_new_net(struct ieee80211_device *ieee, struct ieee80211_network *net)
-+{
-+ u8 tmp_ssid[IW_ESSID_MAX_SIZE+1];
-+ int tmp_ssid_len = 0;
-+
-+ short apset,ssidset,ssidbroad,apmatch,ssidmatch;
-+// printk("===============>%s()\n",__FUNCTION__);
-+ /* we are interested in new new only if we are not associated
-+ * and we are not associating / authenticating
-+ */
-+ if (ieee->state != IEEE80211_NOLINK)
-+ return;
-+
-+ if ((ieee->iw_mode == IW_MODE_INFRA) && !(net->capability & WLAN_CAPABILITY_BSS))
-+ return;
-+
-+ if ((ieee->iw_mode == IW_MODE_ADHOC) && !(net->capability & WLAN_CAPABILITY_IBSS))
-+ return;
-+
-+
-+ if (ieee->iw_mode == IW_MODE_INFRA || ieee->iw_mode == IW_MODE_ADHOC){
-+ /* if the user specified the AP MAC, we need also the essid
-+ * This could be obtained by beacons or, if the network does not
-+ * broadcast it, it can be put manually.
-+ */
-+ apset = ieee->wap_set;//(memcmp(ieee->current_network.bssid, zero,ETH_ALEN)!=0 );
-+ ssidset = ieee->ssid_set;//ieee->current_network.ssid[0] != '\0';
-+ ssidbroad = !(net->ssid_len == 0 || net->ssid[0]== '\0');
-+ apmatch = (memcmp(ieee->current_network.bssid, net->bssid, ETH_ALEN)==0);
-+ if(ieee->current_network.ssid_len != net->ssid_len)
-+ ssidmatch = 0;
-+ else
-+ ssidmatch = (0==strncmp(ieee->current_network.ssid, net->ssid, net->ssid_len));
-+
-+
-+
-+ if ( /* if the user set the AP check if match.
-+ * if the network does not broadcast essid we check the user supplyed ANY essid
-+ * if the network does broadcast and the user does not set essid it is OK
-+ * if the network does broadcast and the user did set essid chech if essid match
-+ */
-+ ( apset && apmatch &&
-+ //((ssidset && ssidbroad && ssidmatch) || (ssidbroad && !ssidset) || (!ssidbroad && ssidset)) ) ||
-+ ((ssidset && ssidbroad && ssidmatch) || (!ssidbroad && ssidset)) ) ||
-+ /* if the ap is not set, check that the user set the bssid
-+ * and the network does bradcast and that those two bssid matches
-+ */
-+ (!apset && ssidset && ssidbroad && ssidmatch)
-+ ){
-+ /* if the essid is hidden replace it with the
-+ * essid provided by the user.
-+ */
-+ if (!ssidbroad){
-+ strncpy(tmp_ssid, ieee->current_network.ssid, IW_ESSID_MAX_SIZE);
-+ tmp_ssid_len = ieee->current_network.ssid_len;
-+ }
-+ memcpy(&ieee->current_network, net, sizeof(struct ieee80211_network));
-+
-+ if (!ssidbroad){
-+ strncpy(ieee->current_network.ssid, tmp_ssid, IW_ESSID_MAX_SIZE);
-+ ieee->current_network.ssid_len = tmp_ssid_len;
-+ }
-+ printk(KERN_INFO"Linking with %s, channel:%d\n",ieee->current_network.ssid, ieee->current_network.channel);
-+
-+#ifdef CONFIG_IPS
-+ ieee->ieee80211_ips_leave(ieee->dev);
-+#endif
-+
-+ if (ieee->iw_mode == IW_MODE_INFRA){
-+ ieee->state = IEEE80211_ASSOCIATING;
-+#if LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0)
-+ queue_work(ieee->wq, &ieee->associate_procedure_wq);
-+#else
-+ schedule_task(&ieee->associate_procedure_wq);
-+#endif
-+ }else{
-+ ieee->state = IEEE80211_LINKED;
-+ if(ieee80211_is_54g(ieee->current_network) &&
-+ (ieee->modulation & IEEE80211_OFDM_MODULATION)){
-+ ieee->rate = 540;
-+ printk(KERN_INFO"Using G rates\n");
-+ }else{
-+ ieee->rate = 110;
-+ printk(KERN_INFO"Using B rates\n");
-+ }
-+ }
-+
-+ }
-+ }
-+
-+}
-+
-+void ieee80211_softmac_check_all_nets(struct ieee80211_device *ieee)
-+{
-+ unsigned long flags;
-+ struct ieee80211_network *target;
-+
-+ spin_lock_irqsave(&ieee->lock, flags);
-+#if 0
-+ list_for_each_entry(target, &ieee->network_list, list) {
-+ printk(KERN_INFO"check network list SSID: %s, channel: %d\n",target->ssid,target->channel);
-+ }
-+#endif
-+ list_for_each_entry(target, &ieee->network_list, list) {
-+
-+ /* if the state become different that NOLINK means
-+ * we had found what we are searching for
-+ */
-+
-+ if (ieee->state != IEEE80211_NOLINK)
-+ break;
-+
-+ if (ieee->scan_age == 0 || time_after(target->last_scanned + ieee->scan_age, jiffies))
-+ ieee80211_softmac_new_net(ieee, target);
-+ }
-+
-+ spin_unlock_irqrestore(&ieee->lock, flags);
-+
-+ //printk("<=====%s\n", __func__);
-+}
-+
-+
-+static inline u16 auth_parse(struct sk_buff *skb, u8** challenge, int *chlen)
-+{
-+ struct ieee80211_authentication *a;
-+ u8 *t;
-+ if (skb->len < (sizeof(struct ieee80211_authentication)-sizeof(struct ieee80211_info_element))){
-+ IEEE80211_DEBUG_MGMT("invalid len in auth resp: %d\n",skb->len);
-+ return 0xcafe;
-+ }
-+ *challenge = NULL;
-+ a = (struct ieee80211_authentication*) skb->data;
-+ if(skb->len > (sizeof(struct ieee80211_authentication) +3)){
-+ t = skb->data + sizeof(struct ieee80211_authentication);
-+
-+ if(*(t++) == MFIE_TYPE_CHALLENGE){
-+ *chlen = *(t++);
-+ *challenge = (u8*)kmalloc(*chlen, GFP_ATOMIC);
-+ memcpy(*challenge, t, *chlen);
-+ }
-+ }
-+
-+ return cpu_to_le16(a->status);
-+
-+}
-+
-+
-+int auth_rq_parse(struct sk_buff *skb,u8* dest)
-+{
-+ struct ieee80211_authentication *a;
-+
-+ if (skb->len < (sizeof(struct ieee80211_authentication)-sizeof(struct ieee80211_info_element))){
-+ IEEE80211_DEBUG_MGMT("invalid len in auth request: %d\n",skb->len);
-+ return -1;
-+ }
-+ a = (struct ieee80211_authentication*) skb->data;
-+
-+ memcpy(dest,a->header.addr2, ETH_ALEN);
-+
-+ if (le16_to_cpu(a->algorithm) != WLAN_AUTH_OPEN)
-+ return WLAN_STATUS_NOT_SUPPORTED_AUTH_ALG;
-+
-+ return WLAN_STATUS_SUCCESS;
-+}
-+
-+static short probe_rq_parse(struct ieee80211_device *ieee, struct sk_buff *skb, u8 *src)
-+{
-+ u8 *tag;
-+ u8 *skbend;
-+ u8 *ssid=NULL;
-+ u8 ssidlen = 0;
-+
-+ struct ieee80211_hdr_3addr *header =
-+ (struct ieee80211_hdr_3addr *) skb->data;
-+
-+ if (skb->len < sizeof (struct ieee80211_hdr_3addr ))
-+ return -1; /* corrupted */
-+
-+ memcpy(src,header->addr2, ETH_ALEN);
-+
-+ skbend = (u8*)skb->data + skb->len;
-+
-+ tag = skb->data + sizeof (struct ieee80211_hdr_3addr );
-+
-+ while (tag+1 < skbend){
-+ if (*tag == 0){
-+ ssid = tag+2;
-+ ssidlen = *(tag+1);
-+ break;
-+ }
-+ tag++; /* point to the len field */
-+ tag = tag + *(tag); /* point to the last data byte of the tag */
-+ tag++; /* point to the next tag */
-+ }
-+
-+ //IEEE80211DMESG("Card MAC address is "MACSTR, MAC2STR(src));
-+ if (ssidlen == 0) return 1;
-+
-+ if (!ssid) return 1; /* ssid not found in tagged param */
-+ return (!strncmp(ssid, ieee->current_network.ssid, ssidlen));
-+
-+}
-+
-+int assoc_rq_parse(struct sk_buff *skb,u8* dest)
-+{
-+ struct ieee80211_assoc_request_frame *a;
-+
-+ if (skb->len < (sizeof(struct ieee80211_assoc_request_frame) -
-+ sizeof(struct ieee80211_info_element))) {
-+
-+ IEEE80211_DEBUG_MGMT("invalid len in auth request:%d \n", skb->len);
-+ return -1;
-+ }
-+
-+ a = (struct ieee80211_assoc_request_frame*) skb->data;
-+
-+ memcpy(dest,a->header.addr2,ETH_ALEN);
-+
-+ return 0;
-+}
-+
-+static inline u16 assoc_parse(struct sk_buff *skb, int *aid)
-+{
-+ struct ieee80211_assoc_response_frame *a;
-+ if (skb->len < sizeof(struct ieee80211_assoc_response_frame)){
-+ IEEE80211_DEBUG_MGMT("invalid len in auth resp: %d\n", skb->len);
-+ return 0xcafe;
-+ }
-+
-+ a = (struct ieee80211_assoc_response_frame*) skb->data;
-+ *aid = le16_to_cpu(a->aid) & 0x3fff;
-+ return le16_to_cpu(a->status);
-+}
-+
-+static inline void
-+ieee80211_rx_probe_rq(struct ieee80211_device *ieee, struct sk_buff *skb)
-+{
-+ u8 dest[ETH_ALEN];
-+
-+ //IEEE80211DMESG("Rx probe");
-+ ieee->softmac_stats.rx_probe_rq++;
-+ //DMESG("Dest is "MACSTR, MAC2STR(dest));
-+ if (probe_rq_parse(ieee, skb, dest)){
-+ //IEEE80211DMESG("Was for me!");
-+ ieee->softmac_stats.tx_probe_rs++;
-+ ieee80211_resp_to_probe(ieee, dest);
-+ }
-+}
-+
-+//static inline void
-+inline void ieee80211_rx_auth_rq(struct ieee80211_device *ieee, struct sk_buff *skb)
-+{
-+ u8 dest[ETH_ALEN];
-+ int status;
-+ //IEEE80211DMESG("Rx probe");
-+ ieee->softmac_stats.rx_auth_rq++;
-+
-+ if ((status = auth_rq_parse(skb, dest))!= -1){
-+ ieee80211_resp_to_auth(ieee, status, dest);
-+ }
-+ //DMESG("Dest is "MACSTR, MAC2STR(dest));
-+
-+}
-+
-+//static inline void
-+inline void
-+ieee80211_rx_assoc_rq(struct ieee80211_device *ieee, struct sk_buff *skb)
-+{
-+
-+ u8 dest[ETH_ALEN];
-+ //unsigned long flags;
-+
-+ ieee->softmac_stats.rx_ass_rq++;
-+ if (assoc_rq_parse(skb,dest) != -1){
-+ ieee80211_resp_to_assoc_rq(ieee, dest);
-+ }
-+
-+ printk(KERN_INFO"New client associated: "MAC_FMT"\n", MAC_ARG(dest));
-+ //FIXME
-+ #if 0
-+ spin_lock_irqsave(&ieee->lock,flags);
-+ add_associate(ieee,dest);
-+ spin_unlock_irqrestore(&ieee->lock,flags);
-+ #endif
-+}
-+
-+
-+
-+void ieee80211_sta_ps_send_null_frame(struct ieee80211_device *ieee, short pwr)
-+{
-+
-+ struct sk_buff *buf = ieee80211_null_func(ieee, pwr);
-+
-+ printk(KERN_ALERT "ieee80211_sta_ps_send_null_frame \n");
-+ if (buf)
-+ softmac_ps_mgmt_xmit(buf, ieee);
-+
-+}
-+
-+
-+short ieee80211_sta_ps_sleep(struct ieee80211_device *ieee, u32 *time_h, u32 *time_l)
-+{
-+ int timeout = ieee->ps_timeout;
-+ u8 dtim;
-+ /*if(ieee->ps == IEEE80211_PS_DISABLED ||
-+ ieee->iw_mode != IW_MODE_INFRA ||
-+ ieee->state != IEEE80211_LINKED)
-+
-+ return 0;
-+ */
-+ dtim = ieee->current_network.dtim_data;
-+ //printk("DTIM\n");
-+ if(!(dtim & IEEE80211_DTIM_VALID))
-+ return 0;
-+ //printk("VALID\n");
-+ ieee->current_network.dtim_data = IEEE80211_DTIM_INVALID;
-+
-+ if(dtim & ((IEEE80211_DTIM_UCAST | IEEE80211_DTIM_MBCAST)& ieee->ps))
-+ return 2;
-+
-+ if(!time_after(jiffies, ieee->dev->trans_start + MSECS(timeout)))
-+ return 0;
-+
-+ if(!time_after(jiffies, ieee->last_rx_ps_time + MSECS(timeout)))
-+ return 0;
-+
-+ if((ieee->softmac_features & IEEE_SOFTMAC_SINGLE_QUEUE ) &&
-+ (ieee->mgmt_queue_tail != ieee->mgmt_queue_head))
-+ return 0;
-+
-+ if(time_l){
-+ *time_l = ieee->current_network.last_dtim_sta_time[0]
-+ + (ieee->current_network.beacon_interval
-+ * ieee->current_network.dtim_period) * 1000;
-+ }
-+
-+ if(time_h){
-+ *time_h = ieee->current_network.last_dtim_sta_time[1];
-+ if(time_l && *time_l < ieee->current_network.last_dtim_sta_time[0])
-+ *time_h += 1;
-+ }
-+
-+ return 1;
-+
-+
-+}
-+
-+inline void ieee80211_sta_ps(struct ieee80211_device *ieee)
-+{
-+
-+ u32 th,tl;
-+ short sleep;
-+
-+ unsigned long flags,flags2;
-+
-+ spin_lock_irqsave(&ieee->lock, flags);
-+
-+ if((ieee->ps == IEEE80211_PS_DISABLED ||
-+ ieee->iw_mode != IW_MODE_INFRA ||
-+ ieee->state != IEEE80211_LINKED)){
-+
-+ // #warning CHECK_LOCK_HERE
-+ spin_lock_irqsave(&ieee->mgmt_tx_lock, flags2);
-+
-+ ieee80211_sta_wakeup(ieee, 1);
-+
-+ spin_unlock_irqrestore(&ieee->mgmt_tx_lock, flags2);
-+ }
-+
-+ sleep = ieee80211_sta_ps_sleep(ieee,&th, &tl);
-+ /* 2 wake, 1 sleep, 0 do nothing */
-+ if(sleep == 0)
-+ goto out;
-+
-+ if(sleep == 1){
-+
-+ if(ieee->sta_sleep == 1)
-+ ieee->enter_sleep_state(ieee->dev,th,tl);
-+
-+ else if(ieee->sta_sleep == 0){
-+ // printk("send null 1\n");
-+ spin_lock_irqsave(&ieee->mgmt_tx_lock, flags2);
-+
-+ if(ieee->ps_is_queue_empty(ieee->dev)){
-+
-+
-+ ieee->sta_sleep = 2;
-+
-+ ieee->ps_request_tx_ack(ieee->dev);
-+
-+ ieee80211_sta_ps_send_null_frame(ieee,1);
-+
-+ ieee->ps_th = th;
-+ ieee->ps_tl = tl;
-+ }
-+ spin_unlock_irqrestore(&ieee->mgmt_tx_lock, flags2);
-+
-+ }
-+
-+
-+ }else if(sleep == 2){
-+//#warning CHECK_LOCK_HERE
-+ spin_lock_irqsave(&ieee->mgmt_tx_lock, flags2);
-+
-+ ieee80211_sta_wakeup(ieee,1);
-+
-+ spin_unlock_irqrestore(&ieee->mgmt_tx_lock, flags2);
-+ }
-+
-+out:
-+ spin_unlock_irqrestore(&ieee->lock, flags);
-+
-+}
-+
-+void ieee80211_sta_wakeup(struct ieee80211_device *ieee, short nl)
-+{
-+ if(ieee->sta_sleep == 0){
-+ if(nl){
-+ printk("Warning: driver is probably failing to report TX ps error\n");
-+ ieee->ps_request_tx_ack(ieee->dev);
-+ ieee80211_sta_ps_send_null_frame(ieee, 0);
-+ }
-+ return;
-+
-+ }
-+
-+ if(ieee->sta_sleep == 1)
-+ ieee->sta_wake_up(ieee->dev);
-+
-+ ieee->sta_sleep = 0;
-+
-+ if(nl){
-+ ieee->ps_request_tx_ack(ieee->dev);
-+ ieee80211_sta_ps_send_null_frame(ieee, 0);
-+ }
-+}
-+
-+void ieee80211_ps_tx_ack(struct ieee80211_device *ieee, short success)
-+{
-+ unsigned long flags,flags2;
-+
-+ spin_lock_irqsave(&ieee->lock, flags);
-+
-+ if(ieee->sta_sleep == 2){
-+ /* Null frame with PS bit set */
-+ if(success){
-+ ieee->sta_sleep = 1;
-+ ieee->enter_sleep_state(ieee->dev,ieee->ps_th,ieee->ps_tl);
-+ }
-+ /* if the card report not success we can't be sure the AP
-+ * has not RXed so we can't assume the AP believe us awake
-+ */
-+ }
-+ /* 21112005 - tx again null without PS bit if lost */
-+ else {
-+
-+ if((ieee->sta_sleep == 0) && !success){
-+ spin_lock_irqsave(&ieee->mgmt_tx_lock, flags2);
-+ ieee80211_sta_ps_send_null_frame(ieee, 0);
-+ spin_unlock_irqrestore(&ieee->mgmt_tx_lock, flags2);
-+ }
-+ }
-+ spin_unlock_irqrestore(&ieee->lock, flags);
-+}
-+
-+inline int
-+ieee80211_rx_frame_softmac(struct ieee80211_device *ieee, struct sk_buff *skb,
-+ struct ieee80211_rx_stats *rx_stats, u16 type,
-+ u16 stype)
-+{
-+ struct ieee80211_hdr_3addr *header = (struct ieee80211_hdr_3addr *) skb->data;
-+ u16 errcode;
-+ u8* challenge=NULL;
-+ int chlen=0;
-+ int aid=0;
-+ struct ieee80211_assoc_response_frame *assoc_resp;
-+ struct ieee80211_info_element *info_element;
-+
-+ if(!ieee->proto_started)
-+ return 0;
-+
-+ if(ieee->sta_sleep || (ieee->ps != IEEE80211_PS_DISABLED &&
-+ ieee->iw_mode == IW_MODE_INFRA &&
-+ ieee->state == IEEE80211_LINKED))
-+
-+ tasklet_schedule(&ieee->ps_task);
-+
-+ if(WLAN_FC_GET_STYPE(header->frame_ctl) != IEEE80211_STYPE_PROBE_RESP &&
-+ WLAN_FC_GET_STYPE(header->frame_ctl) != IEEE80211_STYPE_BEACON)
-+ ieee->last_rx_ps_time = jiffies;
-+
-+ switch (WLAN_FC_GET_STYPE(header->frame_ctl)) {
-+ case IEEE80211_STYPE_ASSOC_RESP:
-+ case IEEE80211_STYPE_REASSOC_RESP:
-+
-+ IEEE80211_DEBUG_MGMT("received [RE]ASSOCIATION RESPONSE (%d)\n",
-+ WLAN_FC_GET_STYPE(header->frame_ctl));
-+ //printk(KERN_WARNING "Received association response\n");
-+ if ((ieee->softmac_features & IEEE_SOFTMAC_ASSOCIATE) &&
-+ ieee->state == IEEE80211_ASSOCIATING_AUTHENTICATED &&
-+ ieee->iw_mode == IW_MODE_INFRA){
-+ if (0 == (errcode=assoc_parse(skb, &aid))){
-+ u16 left;
-+
-+ ieee->state=IEEE80211_LINKED;
-+ ieee->assoc_id = aid;
-+ ieee->softmac_stats.rx_ass_ok++;
-+
-+ //printk(KERN_WARNING "nic_type = %s", (rx_stats->nic_type == 1)?"rtl8187":"rtl8187B");
-+ if(1 == rx_stats->nic_type) //card type is 8187
-+ {
-+ goto associate_complete;
-+ }
-+ assoc_resp = (struct ieee80211_assoc_response_frame*)skb->data;
-+ info_element = &assoc_resp->info_element;
-+ left = skb->len - ((void*)info_element - (void*)assoc_resp);
-+
-+ while (left >= sizeof(struct ieee80211_info_element_hdr)) {
-+ if (sizeof(struct ieee80211_info_element_hdr) + info_element->len > left) {
-+ printk(KERN_WARNING "[re]associate reeponse error!");
-+ return 1;
-+ }
-+ switch (info_element->id) {
-+ case MFIE_TYPE_GENERIC:
-+ IEEE80211_DEBUG_SCAN("MFIE_TYPE_GENERIC: %d bytes\n", info_element->len);
-+ if (info_element->len >= 8 &&
-+ info_element->data[0] == 0x00 &&
-+ info_element->data[1] == 0x50 &&
-+ info_element->data[2] == 0xf2 &&
-+ info_element->data[3] == 0x02 &&
-+ info_element->data[4] == 0x01) {
-+ // Not care about version at present.
-+ //WMM Parameter Element
-+ memcpy(ieee->current_network.wmm_param,(u8*)(info_element->data\
-+ + 8),(info_element->len - 8));
-+
-+ if (((ieee->current_network.wmm_info^info_element->data[6])& \
-+ 0x0f)||(!ieee->init_wmmparam_flag)) {
-+ //refresh paramete element for current network
-+ // update the register parameter for hardware
-+ ieee->init_wmmparam_flag = 1;
-+ //ieee->wmm_param_update(ieee);
-+ //schedule_work(&ieee->wmm_param_update_wq);
-+#if LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0)
-+ queue_work(ieee->wq, &ieee->wmm_param_update_wq);
-+#else
-+ schedule_task(&ieee->wmm_param_update_wq);
-+#endif
-+
-+ }
-+ //update info_element for current network
-+ ieee->current_network.wmm_info = info_element->data[6];
-+ }
-+ break;
-+ default:
-+ //nothing to do at present!!!
-+ break;
-+ }
-+
-+ left -= sizeof(struct ieee80211_info_element_hdr) +
-+ info_element->len;
-+ info_element = (struct ieee80211_info_element *)
-+ &info_element->data[info_element->len];
-+ }
-+ if(!ieee->init_wmmparam_flag) //legacy AP, reset the AC_xx_param register
-+ {
-+#if LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0)
-+ queue_work(ieee->wq,&ieee->wmm_param_update_wq);
-+#else
-+ schedule_task(&ieee->wmm_param_update_wq);
-+#endif
-+ ieee->init_wmmparam_flag = 1;//indicate AC_xx_param upated since last associate
-+ }
-+associate_complete:
-+ ieee80211_associate_complete(ieee);
-+ }else{
-+ ieee->softmac_stats.rx_ass_err++;
-+ IEEE80211_DEBUG_MGMT(
-+ "Association response status code 0x%x\n",
-+ errcode);
-+ printk(KERN_WARNING "Association response status code 0x%x\n",
-+ errcode);
-+ ieee80211_associate_abort(ieee);
-+ }
-+ }
-+#ifdef _RTL8187_EXT_PATCH_
-+ else if ((ieee->iw_mode == ieee->iw_ext_mode) && ieee->ext_patch_ieee80211_rx_frame_softmac_on_assoc_rsp)
-+ {
-+ ieee->ext_patch_ieee80211_rx_frame_softmac_on_assoc_rsp(ieee, skb);
-+ }
-+#endif
-+ break;
-+
-+ case IEEE80211_STYPE_ASSOC_REQ:
-+ case IEEE80211_STYPE_REASSOC_REQ:
-+ //printk("Received IEEE80211_STYPE_ASSOC_REQ\n");
-+
-+ if ((ieee->softmac_features & IEEE_SOFTMAC_ASSOCIATE) &&
-+ ieee->iw_mode == IW_MODE_MASTER)
-+
-+ ieee80211_rx_assoc_rq(ieee, skb);
-+#ifdef _RTL8187_EXT_PATCH_
-+ else if ((ieee->iw_mode == ieee->iw_ext_mode) && ieee->ext_patch_ieee80211_rx_frame_softmac_on_assoc_req)
-+ {
-+ ieee->ext_patch_ieee80211_rx_frame_softmac_on_assoc_req(ieee, skb);
-+ }
-+#endif
-+ break;
-+
-+ case IEEE80211_STYPE_AUTH:
-+ //printk("Received authentication response\n");
-+
-+#ifdef _RTL8187_EXT_PATCH_
-+//printk("IEEE80211_STYPE_AUTH\n");
-+ if((ieee->iw_mode == ieee->iw_ext_mode) && ieee->ext_patch_ieee80211_rx_frame_softmac_on_auth)
-+ if( ieee->ext_patch_ieee80211_rx_frame_softmac_on_auth(ieee, skb, rx_stats) );
-+#endif
-+ if (ieee->softmac_features & IEEE_SOFTMAC_ASSOCIATE){
-+ if (ieee->state == IEEE80211_ASSOCIATING_AUTHENTICATING &&
-+ ieee->iw_mode == IW_MODE_INFRA){
-+
-+ IEEE80211_DEBUG_MGMT("Received authentication response");
-+
-+ if (0 == (errcode=auth_parse(skb, &challenge, &chlen))){
-+ if(ieee->open_wep || !challenge){
-+ ieee->state = IEEE80211_ASSOCIATING_AUTHENTICATED;
-+ ieee->softmac_stats.rx_auth_rs_ok++;
-+
-+ ieee80211_associate_step2(ieee);
-+ }else{
-+ ieee80211_auth_challenge(ieee, challenge, chlen);
-+ }
-+ }else{
-+ ieee->softmac_stats.rx_auth_rs_err++;
-+ IEEE80211_DEBUG_MGMT("Authentication respose status code 0x%x",errcode);
-+ ieee80211_associate_abort(ieee);
-+ }
-+
-+ }else if (ieee->iw_mode == IW_MODE_MASTER){
-+ ieee80211_rx_auth_rq(ieee, skb);
-+ }
-+ }
-+ break;
-+
-+ case IEEE80211_STYPE_PROBE_REQ:
-+ //printk("Received IEEE80211_STYPE_PROBE_REQ\n");
-+
-+ if ((ieee->softmac_features & IEEE_SOFTMAC_PROBERS) &&
-+ ((ieee->iw_mode == IW_MODE_ADHOC ||
-+ ieee->iw_mode == IW_MODE_MASTER) &&
-+ ieee->state == IEEE80211_LINKED))
-+
-+ ieee80211_rx_probe_rq(ieee, skb);
-+ break;
-+
-+ case IEEE80211_STYPE_DISASSOC:
-+ case IEEE80211_STYPE_DEAUTH:
-+ //printk("Received IEEE80211_STYPE_DISASSOC\n");
-+#ifdef _RTL8187_EXT_PATCH_
-+//printk("IEEE80211_STYPE_DEAUTH\n");
-+ if((ieee->iw_mode == ieee->iw_ext_mode) && ieee->ext_patch_ieee80211_rx_frame_softmac_on_deauth)
-+ if( ieee->ext_patch_ieee80211_rx_frame_softmac_on_deauth(ieee, skb, rx_stats) ) ;
-+#endif
-+ /* FIXME for now repeat all the association procedure
-+ * both for disassociation and deauthentication
-+ */
-+ if ((ieee->softmac_features & IEEE_SOFTMAC_ASSOCIATE) &&
-+ ieee->state == IEEE80211_LINKED &&
-+ ieee->iw_mode == IW_MODE_INFRA){
-+
-+ ieee->state = IEEE80211_ASSOCIATING;
-+ ieee->softmac_stats.reassoc++;
-+
-+ notify_wx_assoc_event(ieee);
-+#if LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0)
-+ queue_work(ieee->wq, &ieee->associate_procedure_wq);
-+#else
-+ schedule_task(&ieee->associate_procedure_wq);
-+#endif
-+ }
-+
-+ break;
-+
-+ default:
-+ return -1;
-+ break;
-+ }
-+
-+ //dev_kfree_skb_any(skb);
-+ return 0;
-+}
-+
-+
-+
-+/* following are for a simplier TX queue management.
-+ * Instead of using netif_[stop/wake]_queue the driver
-+ * will uses these two function (plus a reset one), that
-+ * will internally uses the kernel netif_* and takes
-+ * care of the ieee802.11 fragmentation.
-+ * So the driver receives a fragment per time and might
-+ * call the stop function when it want without take care
-+ * to have enought room to TX an entire packet.
-+ * This might be useful if each fragment need it's own
-+ * descriptor, thus just keep a total free memory > than
-+ * the max fragmentation treshold is not enought.. If the
-+ * ieee802.11 stack passed a TXB struct then you needed
-+ * to keep N free descriptors where
-+ * N = MAX_PACKET_SIZE / MIN_FRAG_TRESHOLD
-+ * In this way you need just one and the 802.11 stack
-+ * will take care of buffering fragments and pass them to
-+ * to the driver later, when it wakes the queue.
-+ */
-+
-+void ieee80211_softmac_xmit(struct ieee80211_txb *txb, struct ieee80211_device *ieee)
-+{
-+
-+
-+ unsigned long flags;
-+ int i;
-+#ifdef _RTL8187_EXT_PATCH_
-+ int rate = ieee->rate;
-+#endif
-+
-+ spin_lock_irqsave(&ieee->lock,flags);
-+ #if 0
-+ if(ieee->queue_stop){
-+ IEEE80211DMESG("EE: IEEE hard_start_xmit invoked when kernel queue should be stopped");
-+ netif_stop_queue(ieee->dev);
-+ ieee->ieee_stats.swtxstop++;
-+ //dev_kfree_skb_any(skb);
-+ err = 1;
-+ goto exit;
-+ }
-+
-+ ieee->stats.tx_bytes+=skb->len;
-+
-+
-+ txb=ieee80211_skb_to_txb(ieee,skb);
-+
-+
-+ if(txb==NULL){
-+ IEEE80211DMESG("WW: IEEE stack failed to provide txb");
-+ //dev_kfree_skb_any(skb);
-+ err = 1;
-+ goto exit;
-+ }
-+ #endif
-+
-+#ifdef _RTL8187_EXT_PATCH_
-+ if((ieee->iw_mode == ieee->iw_ext_mode) && ieee->ext_patch_ieee80211_softmac_xmit_get_rate && txb->nr_frags)
-+ {
-+ rate = ieee->ext_patch_ieee80211_softmac_xmit_get_rate(ieee, txb->fragments[0]);
-+ }
-+#endif
-+ /* called with 2nd parm 0, no tx mgmt lock required */
-+ ieee80211_sta_wakeup(ieee,0);
-+
-+ for(i = 0; i < txb->nr_frags; i++) {
-+
-+ if (ieee->queue_stop){
-+ ieee->tx_pending.txb = txb;
-+ ieee->tx_pending.frag = i;
-+ goto exit;
-+ }else{
-+ ieee->softmac_data_hard_start_xmit(
-+ txb->fragments[i],
-+#ifdef _RTL8187_EXT_PATCH_
-+ ieee->dev, rate);
-+#else
-+ ieee->dev,ieee->rate);
-+#endif
-+ //(i+1)<txb->nr_frags);
-+ ieee->stats.tx_packets++;
-+ ieee->stats.tx_bytes += txb->fragments[i]->len;
-+ ieee->dev->trans_start = jiffies;
-+ }
-+ }
-+
-+ ieee80211_txb_free(txb);
-+
-+ exit:
-+ spin_unlock_irqrestore(&ieee->lock,flags);
-+
-+}
-+
-+/* called with ieee->lock acquired */
-+void ieee80211_resume_tx(struct ieee80211_device *ieee)
-+{
-+ int i;
-+ for(i = ieee->tx_pending.frag; i < ieee->tx_pending.txb->nr_frags; i++) {
-+
-+ if (ieee->queue_stop){
-+ ieee->tx_pending.frag = i;
-+ return;
-+ }else{
-+
-+ ieee->softmac_data_hard_start_xmit(
-+ ieee->tx_pending.txb->fragments[i],
-+ ieee->dev,ieee->rate);
-+ //(i+1)<ieee->tx_pending.txb->nr_frags);
-+ ieee->stats.tx_packets++;
-+ ieee->dev->trans_start = jiffies;
-+ }
-+ }
-+
-+
-+ ieee80211_txb_free(ieee->tx_pending.txb);
-+ ieee->tx_pending.txb = NULL;
-+}
-+
-+
-+void ieee80211_reset_queue(struct ieee80211_device *ieee)
-+{
-+ unsigned long flags;
-+
-+ spin_lock_irqsave(&ieee->lock,flags);
-+ init_mgmt_queue(ieee);
-+ if (ieee->tx_pending.txb){
-+ ieee80211_txb_free(ieee->tx_pending.txb);
-+ ieee->tx_pending.txb = NULL;
-+ }
-+ ieee->queue_stop = 0;
-+ spin_unlock_irqrestore(&ieee->lock,flags);
-+
-+}
-+
-+void ieee80211_wake_queue(struct ieee80211_device *ieee)
-+{
-+
-+ unsigned long flags;
-+ struct sk_buff *skb;
-+ struct ieee80211_hdr_3addr *header;
-+
-+ spin_lock_irqsave(&ieee->lock,flags);
-+ if (! ieee->queue_stop) goto exit;
-+
-+ ieee->queue_stop = 0;
-+
-+ if(ieee->softmac_features & IEEE_SOFTMAC_SINGLE_QUEUE){
-+ while (!ieee->queue_stop && (skb = dequeue_mgmt(ieee))){
-+
-+ header = (struct ieee80211_hdr_3addr *) skb->data;
-+
-+ header->seq_ctl = cpu_to_le16(ieee->seq_ctrl[0] << 4);
-+
-+ if (ieee->seq_ctrl[0] == 0xFFF)
-+ ieee->seq_ctrl[0] = 0;
-+ else
-+ ieee->seq_ctrl[0]++;
-+
-+ printk(KERN_ALERT "ieee80211_wake_queue \n");
-+ ieee->softmac_data_hard_start_xmit(skb,ieee->dev,ieee->basic_rate);
-+ dev_kfree_skb_any(skb);//edit by thomas
-+ }
-+ }
-+ if (!ieee->queue_stop && ieee->tx_pending.txb)
-+ ieee80211_resume_tx(ieee);
-+
-+ if (!ieee->queue_stop && netif_queue_stopped(ieee->dev)){
-+ ieee->softmac_stats.swtxawake++;
-+ netif_wake_queue(ieee->dev);
-+ }
-+
-+exit :
-+ spin_unlock_irqrestore(&ieee->lock,flags);
-+}
-+
-+
-+void ieee80211_stop_queue(struct ieee80211_device *ieee)
-+{
-+ //unsigned long flags;
-+ //spin_lock_irqsave(&ieee->lock,flags);
-+
-+ if (! netif_queue_stopped(ieee->dev)){
-+ netif_stop_queue(ieee->dev);
-+ ieee->softmac_stats.swtxstop++;
-+ }
-+ ieee->queue_stop = 1;
-+ //spin_unlock_irqrestore(&ieee->lock,flags);
-+
-+}
-+
-+
-+inline void ieee80211_randomize_cell(struct ieee80211_device *ieee)
-+{
-+
-+ get_random_bytes(ieee->current_network.bssid, ETH_ALEN);
-+
-+ /* an IBSS cell address must have the two less significant
-+ * bits of the first byte = 2
-+ */
-+ ieee->current_network.bssid[0] &= ~0x01;
-+ ieee->current_network.bssid[0] |= 0x02;
-+}
-+
-+/* called in user context only */
-+void ieee80211_start_master_bss(struct ieee80211_device *ieee)
-+{
-+ ieee->assoc_id = 1;
-+
-+ if (ieee->current_network.ssid_len == 0){
-+ strncpy(ieee->current_network.ssid,
-+ IEEE80211_DEFAULT_TX_ESSID,
-+ IW_ESSID_MAX_SIZE);
-+
-+ ieee->current_network.ssid_len = strlen(IEEE80211_DEFAULT_TX_ESSID);
-+ ieee->ssid_set = 1;
-+ }
-+
-+ memcpy(ieee->current_network.bssid, ieee->dev->dev_addr, ETH_ALEN);
-+
-+ ieee->set_chan(ieee->dev, ieee->current_network.channel);
-+ ieee->state = IEEE80211_LINKED;
-+
-+//by lizhaoming for LED LINK
-+#ifdef LED_SHIN
-+ {
-+ struct net_device *dev = ieee->dev;
-+ ieee->ieee80211_led_contorl(dev, LED_CTL_LINK);
-+ }
-+#endif
-+ ieee->link_change(ieee->dev);
-+ notify_wx_assoc_event(ieee);
-+
-+ if (ieee->data_hard_resume)
-+ ieee->data_hard_resume(ieee->dev);
-+
-+ netif_carrier_on(ieee->dev);
-+}
-+
-+void ieee80211_start_monitor_mode(struct ieee80211_device *ieee)
-+{
-+ if(ieee->raw_tx){
-+
-+ if (ieee->data_hard_resume)
-+ ieee->data_hard_resume(ieee->dev);
-+
-+ netif_carrier_on(ieee->dev);
-+ }
-+}
-+
-+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20))
-+void ieee80211_start_ibss_wq(struct work_struct *work)
-+{
-+ struct delayed_work *dwork = container_of(work, struct delayed_work, work);
-+ struct ieee80211_device *ieee = container_of(dwork, struct ieee80211_device, start_ibss_wq);
-+#else
-+void ieee80211_start_ibss_wq(struct ieee80211_device *ieee)
-+{
-+#endif
-+
-+ /* iwconfig mode ad-hoc will schedule this and return
-+ * on the other hand this will block further iwconfig SET
-+ * operations because of the wx_sem hold.
-+ * Anyway some most set operations set a flag to speed-up
-+ * (abort) this wq (when syncro scanning) before sleeping
-+ * on the semaphore
-+ */
-+
-+ down(&ieee->wx_sem);
-+
-+ if (ieee->current_network.ssid_len == 0){
-+ strcpy(ieee->current_network.ssid,IEEE80211_DEFAULT_TX_ESSID);
-+ ieee->current_network.ssid_len = strlen(IEEE80211_DEFAULT_TX_ESSID);
-+ ieee->ssid_set = 1;
-+ }
-+
-+//by lizhaoming for LED BLINK 2008.6.23
-+#ifdef LED_SHIN
-+ {
-+ struct net_device *dev = ieee->dev;
-+ ieee->ieee80211_led_contorl(dev, LED_CTL_SITE_SURVEY);
-+ }
-+#endif
-+
-+ /* check if we have this cell in our network list */
-+ ieee80211_softmac_check_all_nets(ieee);
-+
-+#ifdef ENABLE_DOT11D
-+ //[World wide 13]:
-+ // Adhoc:
-+ // (1) active scan from ch1~11 and passive scan from ch12~13
-+ // (2) IBSS can join ch1~13 adhoc, but only start at ch10.
-+ if(ieee->state == IEEE80211_NOLINK)
-+ if(ieee->IbssStartChnl != 0)
-+ ieee->current_network.channel = ieee->IbssStartChnl;//chan 10
-+#endif
-+
-+ /* if not then the state is not linked. Maybe the user swithced to
-+ * ad-hoc mode just after being in monitor mode, or just after
-+ * being very few time in managed mode (so the card have had no
-+ * time to scan all the chans..) or we have just run up the iface
-+ * after setting ad-hoc mode. So we have to give another try..
-+ * Here, in ibss mode, should be safe to do this without extra care
-+ * (in bss mode we had to make sure no-one tryed to associate when
-+ * we had just checked the ieee->state and we was going to start the
-+ * scan) beacause in ibss mode the ieee80211_new_net function, when
-+ * finds a good net, just set the ieee->state to IEEE80211_LINKED,
-+ * so, at worst, we waste a bit of time to initiate an unneeded syncro
-+ * scan, that will stop at the first round because it sees the state
-+ * associated.
-+ */
-+ if (ieee->state == IEEE80211_NOLINK){
-+ ieee80211_start_scan_syncro(ieee);
-+ }
-+
-+ /* the network definitively is not here.. create a new cell */
-+ if (ieee->state == IEEE80211_NOLINK){
-+ printk("creating new IBSS cell\n");
-+ ieee->state = IEEE80211_LINKED;
-+ if(!ieee->wap_set)
-+ ieee80211_randomize_cell(ieee);
-+
-+ if(ieee->modulation & IEEE80211_CCK_MODULATION){
-+
-+ ieee->current_network.rates_len = 4;
-+
-+ ieee->current_network.rates[0] = IEEE80211_BASIC_RATE_MASK | IEEE80211_CCK_RATE_1MB;
-+ ieee->current_network.rates[1] = IEEE80211_BASIC_RATE_MASK | IEEE80211_CCK_RATE_2MB;
-+ ieee->current_network.rates[2] = IEEE80211_BASIC_RATE_MASK | IEEE80211_CCK_RATE_5MB;
-+ ieee->current_network.rates[3] = IEEE80211_BASIC_RATE_MASK | IEEE80211_CCK_RATE_11MB;
-+
-+ }else
-+ ieee->current_network.rates_len = 0;
-+
-+ if(ieee->modulation & IEEE80211_OFDM_MODULATION){
-+ ieee->current_network.rates_ex_len = 8;
-+
-+ ieee->current_network.rates_ex[0] = IEEE80211_BASIC_RATE_MASK | IEEE80211_OFDM_RATE_6MB;
-+ ieee->current_network.rates_ex[1] = IEEE80211_BASIC_RATE_MASK | IEEE80211_OFDM_RATE_9MB;
-+ ieee->current_network.rates_ex[2] = IEEE80211_BASIC_RATE_MASK | IEEE80211_OFDM_RATE_12MB;
-+ ieee->current_network.rates_ex[3] = IEEE80211_BASIC_RATE_MASK | IEEE80211_OFDM_RATE_18MB;
-+ ieee->current_network.rates_ex[4] = IEEE80211_BASIC_RATE_MASK | IEEE80211_OFDM_RATE_24MB;
-+ ieee->current_network.rates_ex[5] = IEEE80211_BASIC_RATE_MASK | IEEE80211_OFDM_RATE_36MB;
-+ ieee->current_network.rates_ex[6] = IEEE80211_BASIC_RATE_MASK | IEEE80211_OFDM_RATE_48MB;
-+ ieee->current_network.rates_ex[7] = IEEE80211_BASIC_RATE_MASK | IEEE80211_OFDM_RATE_54MB;
-+
-+ ieee->rate = 540;
-+ }else{
-+ ieee->current_network.rates_ex_len = 0;
-+ ieee->rate = 110;
-+ }
-+
-+ // By default, WMM function will be disabled in IBSS mode
-+ ieee->current_network.QoS_Enable = 0;
-+
-+ ieee->current_network.atim_window = 0;
-+ ieee->current_network.capability = WLAN_CAPABILITY_IBSS;
-+ if(ieee->short_slot)
-+ ieee->current_network.capability |= WLAN_CAPABILITY_SHORT_SLOT;
-+
-+ }
-+
-+ ieee->state = IEEE80211_LINKED;
-+
-+//by lizhaoming for LED LINK
-+#ifdef LED_SHIN
-+ {
-+ struct net_device *dev = ieee->dev;
-+ ieee->ieee80211_led_contorl(dev, LED_CTL_LINK);
-+ }
-+#endif
-+
-+ ieee->set_chan(ieee->dev, ieee->current_network.channel);
-+ ieee->link_change(ieee->dev);
-+
-+ notify_wx_assoc_event(ieee);
-+
-+ ieee80211_start_send_beacons(ieee);
-+ printk(KERN_WARNING "after sending beacon packet!\n");
-+
-+ if (ieee->data_hard_resume)
-+ ieee->data_hard_resume(ieee->dev);
-+
-+ netif_carrier_on(ieee->dev);
-+
-+ up(&ieee->wx_sem);
-+}
-+
-+inline void ieee80211_start_ibss(struct ieee80211_device *ieee)
-+{
-+#if LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0)
-+ queue_delayed_work(ieee->wq, &ieee->start_ibss_wq, 150); //change to delayed work, delayed time is need to check
-+#else
-+ schedule_task(&ieee->start_ibss_wq);
-+#endif
-+}
-+
-+/* this is called only in user context, with wx_sem held */
-+void ieee80211_start_bss(struct ieee80211_device *ieee)
-+{
-+ unsigned long flags;
-+ /* check if we have already found the net we
-+ * are interested in (if any).
-+ * if not (we are disassociated and we are not
-+ * in associating / authenticating phase) start the background scanning.
-+ */
-+
-+//by lizhaoming for LED BLINK 2008.6.23
-+#ifdef LED_SHIN
-+ {
-+ struct net_device *dev = ieee->dev;
-+ ieee->ieee80211_led_contorl(dev, LED_CTL_SITE_SURVEY);
-+ }
-+#endif
-+
-+#ifdef ENABLE_DOT11D
-+ //
-+ // Ref: 802.11d 11.1.3.3
-+ // STA shall not start a BSS unless properly formed Beacon frame including a Country IE.
-+ //
-+ if(IS_DOT11D_ENABLE(ieee) && !IS_COUNTRY_IE_VALID(ieee))
-+ {
-+ if(! ieee->bGlobalDomain)
-+ {
-+ return;
-+ }
-+ }
-+#endif
-+ //printk("======>%s()\n",__FUNCTION__);
-+ ieee80211_softmac_check_all_nets(ieee);
-+
-+ /* ensure no-one start an associating process (thus setting
-+ * the ieee->state to ieee80211_ASSOCIATING) while we
-+ * have just cheked it and we are going to enable scan.
-+ * The ieee80211_new_net function is always called with
-+ * lock held (from both ieee80211_softmac_check_all_nets and
-+ * the rx path), so we cannot be in the middle of such function
-+ */
-+
-+ spin_lock_irqsave(&ieee->lock, flags);
-+ if (ieee->state == IEEE80211_NOLINK){
-+ //printk("Not find SSID in network list scan now\n");
-+ ieee80211_start_scan(ieee);
-+ }
-+ spin_unlock_irqrestore(&ieee->lock, flags);
-+
-+}
-+
-+/* called only in userspace context */
-+void ieee80211_disassociate(struct ieee80211_device *ieee)
-+{
-+ netif_carrier_off(ieee->dev);
-+
-+ if (ieee->softmac_features & IEEE_SOFTMAC_TX_QUEUE)
-+ ieee80211_reset_queue(ieee);
-+
-+ if (ieee->data_hard_stop)
-+ ieee->data_hard_stop(ieee->dev);
-+
-+#ifdef ENABLE_DOT11D
-+ if(IS_DOT11D_ENABLE(ieee))
-+ Dot11d_Reset(ieee);
-+#endif
-+
-+ ieee->state = IEEE80211_NOLINK;
-+ ieee->link_change(ieee->dev);
-+ notify_wx_assoc_event(ieee);
-+
-+}
-+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20))
-+void ieee80211_associate_retry_wq(struct work_struct *work)
-+{
-+ struct delayed_work *dwork = container_of(work, struct delayed_work, work);
-+ struct ieee80211_device *ieee = container_of(dwork, struct ieee80211_device, associate_retry_wq);
-+#else
-+void ieee80211_associate_retry_wq(struct ieee80211_device *ieee)
-+{
-+#endif
-+ unsigned long flags;
-+
-+ down(&ieee->wx_sem);
-+ if(!ieee->proto_started)
-+ goto exit;
-+
-+ if(ieee->state != IEEE80211_ASSOCIATING_RETRY)
-+ goto exit;
-+
-+ /* until we do not set the state to IEEE80211_NOLINK
-+ * there are no possibility to have someone else trying
-+ * to start an association procdure (we get here with
-+ * ieee->state = IEEE80211_ASSOCIATING).
-+ * When we set the state to IEEE80211_NOLINK it is possible
-+ * that the RX path run an attempt to associate, but
-+ * both ieee80211_softmac_check_all_nets and the
-+ * RX path works with ieee->lock held so there are no
-+ * problems. If we are still disassociated then start a scan.
-+ * the lock here is necessary to ensure no one try to start
-+ * an association procedure when we have just checked the
-+ * state and we are going to start the scan.
-+ */
-+ ieee->state = IEEE80211_NOLINK;
-+
-+ ieee80211_softmac_check_all_nets(ieee);
-+
-+ spin_lock_irqsave(&ieee->lock, flags);
-+ if(ieee->state == IEEE80211_NOLINK)
-+ {
-+ printk("%s():Not find SSID:%s[ch=%d, mode=%s] in network list scan now\n", __FUNCTION__,
-+ ieee->current_network.ssid,ieee->current_network.channel,
-+ (ieee->iw_mode == IW_MODE_INFRA) ? "BSS" : "IBSS");
-+
-+ ieee80211_start_scan(ieee);
-+ }
-+
-+ spin_unlock_irqrestore(&ieee->lock, flags);
-+
-+exit:
-+ up(&ieee->wx_sem);
-+}
-+
-+struct sk_buff *ieee80211_get_beacon_(struct ieee80211_device *ieee)
-+{
-+ u8 broadcast_addr[] = {0xff,0xff,0xff,0xff,0xff,0xff};
-+
-+ struct sk_buff *skb = NULL;
-+ struct ieee80211_probe_response *b;
-+
-+//rz
-+#ifdef _RTL8187_EXT_PATCH_
-+ if((ieee->iw_mode == ieee->iw_ext_mode) && ieee->ext_patch_get_beacon_get_probersp )
-+ skb = ieee->ext_patch_get_beacon_get_probersp(ieee, broadcast_addr, &(ieee->current_network));
-+ else
-+ skb = ieee80211_probe_resp(ieee, broadcast_addr);
-+#else
-+ skb = ieee80211_probe_resp(ieee, broadcast_addr);
-+#endif
-+//
-+ if (!skb)
-+ return NULL;
-+
-+ b = (struct ieee80211_probe_response *) skb->data;
-+ b->header.frame_ctl = cpu_to_le16(IEEE80211_STYPE_BEACON);
-+
-+ return skb;
-+
-+}
-+
-+struct sk_buff *ieee80211_get_beacon(struct ieee80211_device *ieee)
-+{
-+ struct sk_buff *skb;
-+ struct ieee80211_probe_response *b;
-+// printk("=========>%s()\n", __FUNCTION__);
-+ skb = ieee80211_get_beacon_(ieee);
-+ if(!skb)
-+ return NULL;
-+
-+ b = (struct ieee80211_probe_response *) skb->data;
-+ b->header.seq_ctrl = cpu_to_le16(ieee->seq_ctrl[0] << 4);
-+
-+ if (ieee->seq_ctrl[0] == 0xFFF)
-+ ieee->seq_ctrl[0] = 0;
-+ else
-+ ieee->seq_ctrl[0]++;
-+
-+ return skb;
-+}
-+
-+void ieee80211_softmac_stop_protocol(struct ieee80211_device *ieee)
-+{
-+ ieee->sync_scan_hurryup = 1;
-+ down(&ieee->wx_sem);
-+ ieee80211_stop_protocol(ieee);
-+ up(&ieee->wx_sem);
-+}
-+
-+
-+void ieee80211_stop_protocol(struct ieee80211_device *ieee)
-+{
-+ if (!ieee->proto_started)
-+ return;
-+
-+ ieee->proto_started = 0;
-+ //printk("=====>%s\n", __func__);
-+
-+#ifdef _RTL8187_EXT_PATCH_
-+ if(ieee->ext_patch_ieee80211_stop_protocol)
-+ ieee->ext_patch_ieee80211_stop_protocol(ieee);
-+//if call queue_delayed_work,can call this,or do nothing..
-+//edit by lawrence,20071118
-+#if LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0)
-+// cancel_delayed_work(&ieee->ext_stop_scan_wq);
-+// cancel_delayed_work(&ieee->ext_send_beacon_wq);
-+#endif
-+#endif // _RTL8187_EXT_PATCH_
-+
-+ ieee80211_stop_send_beacons(ieee);
-+
-+ del_timer_sync(&ieee->associate_timer);
-+#if LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0)
-+ cancel_delayed_work(&ieee->associate_retry_wq);
-+ cancel_delayed_work(&ieee->start_ibss_wq); //cancel ibss start workqueue when stop protocol
-+#endif
-+ ieee80211_stop_scan(ieee);
-+
-+ ieee80211_disassociate(ieee);
-+ //printk("<=====%s\n", __func__);
-+
-+}
-+
-+void ieee80211_softmac_start_protocol(struct ieee80211_device *ieee)
-+{
-+ ieee->sync_scan_hurryup = 0;
-+ down(&ieee->wx_sem);
-+ ieee80211_start_protocol(ieee);
-+ up(&ieee->wx_sem);
-+}
-+
-+void ieee80211_start_protocol(struct ieee80211_device *ieee)
-+{
-+ short ch = 0;
-+ int i = 0;
-+
-+ if (ieee->proto_started)
-+ return;
-+
-+ //printk("=====>%s\n", __func__);
-+
-+ ieee->proto_started = 1;
-+
-+ if (ieee->current_network.channel == 0){
-+ do{
-+ ch++;
-+ if (ch > MAX_CHANNEL_NUMBER)
-+ return; /* no channel found */
-+#ifdef ENABLE_DOT11D
-+ }while(!GET_DOT11D_INFO(ieee)->channel_map[ch]);
-+#else
-+ }while(!ieee->channel_map[ch]);
-+#endif
-+ ieee->current_network.channel = ch;
-+ }
-+
-+ if (ieee->current_network.beacon_interval == 0)
-+ ieee->current_network.beacon_interval = 100;
-+
-+ ieee->set_chan(ieee->dev,ieee->current_network.channel);
-+ mdelay(10);//must or link change will fail lzm
-+
-+ for(i = 0; i < 17; i++) {
-+ ieee->last_rxseq_num[i] = -1;
-+ ieee->last_rxfrag_num[i] = -1;
-+ ieee->last_packet_time[i] = 0;
-+ }
-+
-+ ieee->init_wmmparam_flag = 0;//reinitialize AC_xx_PARAM registers.
-+
-+
-+ /* if the user set the MAC of the ad-hoc cell and then
-+ * switch to managed mode, shall we make sure that association
-+ * attempts does not fail just because the user provide the essid
-+ * and the nic is still checking for the AP MAC ??
-+ */
-+
-+ if (ieee->iw_mode == IW_MODE_INFRA){
-+ ieee80211_start_bss(ieee);
-+ // printk("==========> IW_MODE_INFRA\n");
-+ }
-+ else if (ieee->iw_mode == IW_MODE_ADHOC){
-+ // printk("==========> IW_MODE_ADHOC\n");
-+ ieee80211_start_ibss(ieee);
-+ }
-+ else if (ieee->iw_mode == IW_MODE_MASTER){
-+ ieee80211_start_master_bss(ieee);
-+// printk("==========> IW_MODE_MASTER\n");
-+ }
-+ else if(ieee->iw_mode == IW_MODE_MONITOR){
-+ ieee80211_start_monitor_mode(ieee);
-+// printk("==========> IW_MODE_MONITOR\n");
-+ }
-+
-+#ifdef _RTL8187_EXT_PATCH_
-+// else if((ieee->iw_mode == ieee->iw_ext_mode) && ieee->ext_patch_ieee80211_start_protocol && ieee->ext_patch_ieee80211_start_protocol(ieee))
-+ else if((ieee->iw_mode == ieee->iw_ext_mode) && ieee->ext_patch_ieee80211_start_protocol)
-+ {
-+ ieee->ext_patch_ieee80211_start_mesh(ieee);
-+ }
-+#endif
-+}
-+
-+
-+#define DRV_NAME "Ieee80211"
-+void ieee80211_softmac_init(struct ieee80211_device *ieee)
-+{
-+ int i;
-+ memset(&ieee->current_network, 0, sizeof(struct ieee80211_network));
-+
-+ ieee->state = IEEE80211_NOLINK;
-+ ieee->sync_scan_hurryup = 0;
-+ for(i = 0; i < 5; i++) {
-+ ieee->seq_ctrl[i] = 0;
-+ }
-+
-+ ieee->assoc_id = 0;
-+ ieee->queue_stop = 0;
-+ ieee->scanning = 0;
-+ ieee->scan_watchdog = 0;//lzm add 081215 for roaming
-+ ieee->softmac_features = 0; //so IEEE2100-like driver are happy
-+ ieee->wap_set = 0;
-+ ieee->ssid_set = 0;
-+ ieee->proto_started = 0;
-+ ieee->basic_rate = IEEE80211_DEFAULT_BASIC_RATE;
-+ ieee->rate = 3;
-+ ieee->ps = IEEE80211_PS_DISABLED;
-+ ieee->sta_sleep = 0;
-+//by amy
-+ ieee->bInactivePs = false;
-+ ieee->actscanning = false;
-+ ieee->ListenInterval = 2;
-+ ieee->NumRxData = 0;
-+ ieee->NumRxDataInPeriod = 0; //YJ,add,080828
-+ ieee->NumRxBcnInPeriod = 0; //YJ,add,080828
-+ ieee->bHwRadioOff = false;//by lizhaoming
-+//by amy
-+#ifdef _RTL8187_EXT_PATCH_
-+ ieee->iw_ext_mode = 999;
-+#endif
-+
-+ init_mgmt_queue(ieee);
-+
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
-+ init_timer(&ieee->scan_timer);
-+ ieee->scan_timer.data = (unsigned long)ieee;
-+ ieee->scan_timer.function = ieee80211_softmac_scan_cb;
-+#endif
-+ ieee->tx_pending.txb = NULL;
-+
-+ init_timer(&ieee->associate_timer);
-+ ieee->associate_timer.data = (unsigned long)ieee;
-+ ieee->associate_timer.function = ieee80211_associate_abort_cb;
-+
-+ init_timer(&ieee->beacon_timer);
-+ ieee->beacon_timer.data = (unsigned long) ieee;
-+ ieee->beacon_timer.function = ieee80211_send_beacon_cb;
-+
-+#if LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0)
-+#ifdef PF_SYNCTHREAD
-+ ieee->wq = create_workqueue(DRV_NAME,0);
-+#else
-+ ieee->wq = create_workqueue(DRV_NAME);
-+#endif
-+#endif
-+#if LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0)
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)//added by lawrence,070702
-+ INIT_DELAYED_WORK(&ieee->start_ibss_wq, ieee80211_start_ibss_wq);
-+ INIT_WORK(&ieee->associate_complete_wq, ieee80211_associate_complete_wq);
-+ INIT_WORK(&ieee->associate_procedure_wq, ieee80211_associate_procedure_wq);
-+ INIT_DELAYED_WORK(&ieee->softmac_scan_wq, ieee80211_softmac_scan_wq);
-+ INIT_DELAYED_WORK(&ieee->associate_retry_wq, ieee80211_associate_retry_wq);
-+ INIT_WORK(&ieee->wx_sync_scan_wq, ieee80211_wx_sync_scan_wq);
-+//added by lawrence,20071118
-+#ifdef _RTL8187_EXT_PATCH_
-+ INIT_WORK(&ieee->ext_stop_scan_wq, ieee80211_ext_stop_scan_wq);
-+ //INIT_WORK(&ieee->ext_send_beacon_wq, ieee80211_beacons_start,ieee);
-+ INIT_WORK(&ieee->ext_send_beacon_wq, ext_ieee80211_send_beacon_wq);
-+#endif //_RTL8187_EXT_PATCH_
-+#else
-+ INIT_WORK(&ieee->start_ibss_wq,(void(*)(void*)) ieee80211_start_ibss_wq,ieee);
-+ INIT_WORK(&ieee->associate_retry_wq,(void(*)(void*)) ieee80211_associate_retry_wq,ieee);
-+ INIT_WORK(&ieee->associate_complete_wq,(void(*)(void*)) ieee80211_associate_complete_wq,ieee);
-+ INIT_WORK(&ieee->associate_procedure_wq,(void(*)(void*)) ieee80211_associate_procedure_wq,ieee);
-+ INIT_WORK(&ieee->softmac_scan_wq,(void(*)(void*)) ieee80211_softmac_scan_wq,ieee);
-+ INIT_WORK(&ieee->wx_sync_scan_wq,(void(*)(void*)) ieee80211_wx_sync_scan_wq,ieee);
-+#ifdef _RTL8187_EXT_PATCH_
-+ INIT_WORK(&ieee->ext_stop_scan_wq,(void(*)(void*)) ieee80211_ext_stop_scan_wq,ieee);
-+ //INIT_WORK(&ieee->ext_send_beacon_wq,(void(*)(void*)) ieee80211_beacons_start,ieee);
-+ INIT_WORK(&ieee->ext_send_beacon_wq,(void(*)(void*)) ext_ieee80211_send_beacon_wq,ieee);
-+#endif
-+#endif
-+#else
-+ tq_init(&ieee->start_ibss_wq,(void(*)(void*)) ieee80211_start_ibss_wq,ieee);
-+ tq_init(&ieee->associate_retry_wq,(void(*)(void*)) ieee80211_associate_retry_wq,ieee);
-+ tq_init(&ieee->associate_complete_wq,(void(*)(void*)) ieee80211_associate_complete_wq,ieee);
-+ tq_init(&ieee->associate_procedure_wq,(void(*)(void*)) ieee80211_associate_procedure_wq,ieee);
-+ tq_init(&ieee->softmac_scan_wq,(void(*)(void*)) ieee80211_softmac_scan_wq,ieee);
-+ tq_init(&ieee->wx_sync_scan_wq,(void(*)(void*)) ieee80211_wx_sync_scan_wq,ieee);
-+#ifdef _RTL8187_EXT_PATCH_
-+ tq_init(&ieee->ext_stop_scan_wq,(void(*)(void*)) ieee80211_ext_stop_scan_wq,ieee);
-+ //tq_init(&ieee->ext_send_beacon_wq,(void(*)(void*)) ieee80211_beacons_start,ieee);
-+ tq_init(&ieee->ext_send_beacon_wq,(void(*)(void*)) ext_ieee80211_send_beacon_wq,ieee);
-+#endif
-+#endif
-+ sema_init(&ieee->wx_sem, 1);
-+ sema_init(&ieee->scan_sem, 1);
-+ sema_init(&ieee->ips_sem,1);
-+ spin_lock_init(&ieee->mgmt_tx_lock);
-+ spin_lock_init(&ieee->beacon_lock);
-+ spin_lock_init(&ieee->beaconflag_lock);
-+ tasklet_init(&ieee->ps_task,
-+ (void(*)(unsigned long)) ieee80211_sta_ps,
-+ (unsigned long)ieee);
-+#ifdef ENABLE_DOT11D
-+ ieee->pDot11dInfo = kmalloc(sizeof(RT_DOT11D_INFO), GFP_ATOMIC);
-+#endif
-+
-+}
-+
-+void ieee80211_softmac_free(struct ieee80211_device *ieee)
-+{
-+ down(&ieee->wx_sem);
-+
-+ del_timer_sync(&ieee->associate_timer);
-+
-+#if LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0)
-+ cancel_delayed_work(&ieee->associate_retry_wq);
-+
-+
-+
-+#ifdef _RTL8187_EXT_PATCH_
-+ //When kernel>2.6.20,crash....
-+// cancel_delayed_work(&ieee->ext_stop_scan_wq);
-+// cancel_delayed_work(&ieee->ext_send_beacon_wq);
-+#endif
-+ destroy_workqueue(ieee->wq);
-+#endif
-+
-+#ifdef ENABLE_DOT11D
-+ if(NULL != ieee->pDot11dInfo)
-+ kfree(ieee->pDot11dInfo);
-+#endif
-+
-+ up(&ieee->wx_sem);
-+}
-+
-+/********************************************************
-+ * Start of WPA code. *
-+ * this is stolen from the ipw2200 driver *
-+ ********************************************************/
-+
-+
-+static int ieee80211_wpa_enable(struct ieee80211_device *ieee, int value)
-+{
-+ /* This is called when wpa_supplicant loads and closes the driver
-+ * interface. */
-+ printk("%s WPA\n",value ? "enabling" : "disabling");
-+ ieee->wpa_enabled = value;
-+ return 0;
-+}
-+
-+
-+void ieee80211_wpa_assoc_frame(struct ieee80211_device *ieee, char *wpa_ie, int wpa_ie_len)
-+{
-+ /* make sure WPA is enabled */
-+ ieee80211_wpa_enable(ieee, 1);
-+
-+ ieee80211_disassociate(ieee);
-+}
-+
-+
-+static int ieee80211_wpa_mlme(struct ieee80211_device *ieee, int command, int reason)
-+{
-+
-+ int ret = 0;
-+
-+ switch (command) {
-+ case IEEE_MLME_STA_DEAUTH:
-+ // silently ignore
-+ break;
-+
-+ case IEEE_MLME_STA_DISASSOC:
-+ ieee80211_disassociate(ieee);
-+ break;
-+
-+ default:
-+ printk("Unknown MLME request: %d\n", command);
-+ ret = -EOPNOTSUPP;
-+ }
-+
-+ return ret;
-+}
-+
-+
-+static int ieee80211_wpa_set_wpa_ie(struct ieee80211_device *ieee,
-+ struct ieee_param *param, int plen)
-+{
-+ u8 *buf;
-+
-+ if (param->u.wpa_ie.len > MAX_WPA_IE_LEN ||
-+ (param->u.wpa_ie.len && param->u.wpa_ie.data == NULL))
-+ return -EINVAL;
-+
-+ if (param->u.wpa_ie.len) {
-+ buf = kmalloc(param->u.wpa_ie.len, GFP_KERNEL);
-+ if (buf == NULL)
-+ return -ENOMEM;
-+
-+ memcpy(buf, param->u.wpa_ie.data, param->u.wpa_ie.len);
-+ kfree(ieee->wpa_ie);
-+ ieee->wpa_ie = buf;
-+ ieee->wpa_ie_len = param->u.wpa_ie.len;
-+ } else {
-+ kfree(ieee->wpa_ie);
-+ ieee->wpa_ie = NULL;
-+ ieee->wpa_ie_len = 0;
-+ }
-+
-+ ieee80211_wpa_assoc_frame(ieee, ieee->wpa_ie, ieee->wpa_ie_len);
-+ return 0;
-+}
-+
-+#define AUTH_ALG_OPEN_SYSTEM 0x1
-+#define AUTH_ALG_SHARED_KEY 0x2
-+
-+static int ieee80211_wpa_set_auth_algs(struct ieee80211_device *ieee, int value)
-+{
-+
-+ struct ieee80211_security sec = {
-+ .flags = SEC_AUTH_MODE,
-+ };
-+ int ret = 0;
-+
-+ if (value & AUTH_ALG_SHARED_KEY) {
-+ sec.auth_mode = WLAN_AUTH_SHARED_KEY;
-+ ieee->open_wep = 0;
-+ } else {
-+ sec.auth_mode = WLAN_AUTH_OPEN;
-+ ieee->open_wep = 1;
-+ }
-+
-+ if (ieee->set_security)
-+ ieee->set_security(ieee->dev, &sec);
-+ else
-+ ret = -EOPNOTSUPP;
-+
-+ return ret;
-+}
-+
-+static int ieee80211_wpa_set_param(struct ieee80211_device *ieee, u8 name, u32 value)
-+{
-+ int ret=0;
-+ unsigned long flags;
-+
-+ switch (name) {
-+ case IEEE_PARAM_WPA_ENABLED:
-+ ret = ieee80211_wpa_enable(ieee, value);
-+ break;
-+
-+ case IEEE_PARAM_TKIP_COUNTERMEASURES:
-+ ieee->tkip_countermeasures=value;
-+ break;
-+
-+ case IEEE_PARAM_DROP_UNENCRYPTED: {
-+ /* HACK:
-+ *
-+ * wpa_supplicant calls set_wpa_enabled when the driver
-+ * is loaded and unloaded, regardless of if WPA is being
-+ * used. No other calls are made which can be used to
-+ * determine if encryption will be used or not prior to
-+ * association being expected. If encryption is not being
-+ * used, drop_unencrypted is set to false, else true -- we
-+ * can use this to determine if the CAP_PRIVACY_ON bit should
-+ * be set.
-+ */
-+ struct ieee80211_security sec = {
-+ .flags = SEC_ENABLED,
-+ .enabled = value,
-+ };
-+ ieee->drop_unencrypted = value;
-+ /* We only change SEC_LEVEL for open mode. Others
-+ * are set by ipw_wpa_set_encryption.
-+ */
-+ if (!value) {
-+ sec.flags |= SEC_LEVEL;
-+ sec.level = SEC_LEVEL_0;
-+ }
-+ else {
-+ sec.flags |= SEC_LEVEL;
-+ sec.level = SEC_LEVEL_1;
-+ }
-+ if (ieee->set_security)
-+ ieee->set_security(ieee->dev, &sec);
-+ break;
-+ }
-+
-+ case IEEE_PARAM_PRIVACY_INVOKED:
-+ ieee->privacy_invoked=value;
-+ break;
-+
-+ case IEEE_PARAM_AUTH_ALGS:
-+ ret = ieee80211_wpa_set_auth_algs(ieee, value);
-+ break;
-+
-+ case IEEE_PARAM_IEEE_802_1X:
-+ ieee->ieee802_1x=value;
-+ break;
-+ case IEEE_PARAM_WPAX_SELECT:
-+ // added for WPA2 mixed mode
-+ //printk(KERN_WARNING "------------------------>wpax value = %x\n", value);
-+ spin_lock_irqsave(&ieee->wpax_suitlist_lock,flags);
-+ ieee->wpax_type_set = 1;
-+ ieee->wpax_type_notify = value;
-+ spin_unlock_irqrestore(&ieee->wpax_suitlist_lock,flags);
-+ break;
-+
-+ default:
-+ printk("Unknown WPA param: %d\n",name);
-+ ret = -EOPNOTSUPP;
-+ }
-+
-+ return ret;
-+}
-+
-+/* implementation borrowed from hostap driver */
-+
-+static int ieee80211_wpa_set_encryption(struct ieee80211_device *ieee,
-+ struct ieee_param *param, int param_len)
-+{
-+ int ret = 0;
-+
-+ struct ieee80211_crypto_ops *ops;
-+ struct ieee80211_crypt_data **crypt;
-+
-+ struct ieee80211_security sec = {
-+ .flags = 0,
-+ };
-+
-+ param->u.crypt.err = 0;
-+ param->u.crypt.alg[IEEE_CRYPT_ALG_NAME_LEN - 1] = '\0';
-+
-+ if (param_len !=
-+ (int) ((char *) param->u.crypt.key - (char *) param) +
-+ param->u.crypt.key_len) {
-+ printk("Len mismatch %d, %d\n", param_len,
-+ param->u.crypt.key_len);
-+ return -EINVAL;
-+ }
-+ if (param->sta_addr[0] == 0xff && param->sta_addr[1] == 0xff &&
-+ param->sta_addr[2] == 0xff && param->sta_addr[3] == 0xff &&
-+ param->sta_addr[4] == 0xff && param->sta_addr[5] == 0xff) {
-+ if (param->u.crypt.idx >= WEP_KEYS)
-+ return -EINVAL;
-+#ifdef _RTL8187_EXT_PATCH_
-+ crypt = &ieee->cryptlist[0]->crypt[param->u.crypt.idx];
-+#else
-+ crypt = &ieee->crypt[param->u.crypt.idx];
-+#endif
-+
-+ } else {
-+ return -EINVAL;
-+ }
-+
-+ if (strcmp(param->u.crypt.alg, "none") == 0) {
-+ if (crypt) {
-+ sec.enabled = 0;
-+ // FIXME FIXME
-+ //sec.encrypt = 0;
-+ sec.level = SEC_LEVEL_0;
-+ sec.flags |= SEC_ENABLED | SEC_LEVEL;
-+ ieee80211_crypt_delayed_deinit(ieee, crypt);
-+ }
-+ goto done;
-+ }
-+ sec.enabled = 1;
-+// FIXME FIXME
-+// sec.encrypt = 1;
-+ sec.flags |= SEC_ENABLED;
-+
-+ /* IPW HW cannot build TKIP MIC, host decryption still needed. */
-+ if (!(ieee->host_encrypt || ieee->host_decrypt) &&
-+ strcmp(param->u.crypt.alg, "TKIP"))
-+ goto skip_host_crypt;
-+
-+ ops = ieee80211_get_crypto_ops(param->u.crypt.alg);
-+ if (ops == NULL && strcmp(param->u.crypt.alg, "WEP") == 0) {
-+ request_module("ieee80211_crypt_wep");
-+ ops = ieee80211_get_crypto_ops(param->u.crypt.alg);
-+ } else if (ops == NULL && strcmp(param->u.crypt.alg, "TKIP") == 0) {
-+ request_module("ieee80211_crypt_tkip");
-+ ops = ieee80211_get_crypto_ops(param->u.crypt.alg);
-+ } else if (ops == NULL && strcmp(param->u.crypt.alg, "CCMP") == 0) {
-+ request_module("ieee80211_crypt_ccmp");
-+ ops = ieee80211_get_crypto_ops(param->u.crypt.alg);
-+ }
-+ if (ops == NULL) {
-+ printk("unknown crypto alg '%s'\n", param->u.crypt.alg);
-+ param->u.crypt.err = IEEE_CRYPT_ERR_UNKNOWN_ALG;
-+ ret = -EINVAL;
-+ goto done;
-+ }
-+
-+#ifdef _RTL8187_EXT_PATCH_
-+ u8 i;
-+ for (i=0; i<MAX_MP; i++){
-+ crypt = &ieee->cryptlist[i]->crypt[param->u.crypt.idx];
-+// if (crypt != NULL) printk("crypt not null\n", crypt);
-+
-+ *crypt = ieee->cryptlist[i]->crypt[param->u.crypt.idx];
-+#endif
-+ if (*crypt == NULL || (*crypt)->ops != ops) {
-+ struct ieee80211_crypt_data *new_crypt;
-+
-+ ieee80211_crypt_delayed_deinit(ieee, crypt);
-+
-+ new_crypt = (struct ieee80211_crypt_data *)
-+ kmalloc(sizeof(*new_crypt), GFP_KERNEL);
-+ if (new_crypt == NULL) {
-+ ret = -ENOMEM;
-+ goto done;
-+ }
-+ memset(new_crypt, 0, sizeof(struct ieee80211_crypt_data));
-+ new_crypt->ops = ops;
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
-+ if (new_crypt->ops && try_module_get(new_crypt->ops->owner))
-+#else
-+ if (new_crypt->ops && try_inc_mod_count(new_crypt->ops->owner))
-+#endif
-+ new_crypt->priv =
-+ new_crypt->ops->init(param->u.crypt.idx);
-+
-+ if (new_crypt->priv == NULL) {
-+ kfree(new_crypt);
-+ param->u.crypt.err = IEEE_CRYPT_ERR_CRYPT_INIT_FAILED;
-+ ret = -EINVAL;
-+ goto done;
-+ }
-+
-+ *crypt = new_crypt;
-+ }
-+
-+ if (param->u.crypt.key_len > 0 && (*crypt)->ops->set_key &&
-+ (*crypt)->ops->set_key(param->u.crypt.key,
-+ param->u.crypt.key_len, param->u.crypt.seq,
-+ (*crypt)->priv) < 0) {
-+ printk("key setting failed\n");
-+ param->u.crypt.err = IEEE_CRYPT_ERR_KEY_SET_FAILED;
-+ ret = -EINVAL;
-+ goto done;
-+ }
-+#ifdef _RTL8187_EXT_PATCH_
-+ }
-+#endif
-+ skip_host_crypt:
-+ if (param->u.crypt.set_tx) {
-+ ieee->tx_keyidx = param->u.crypt.idx;
-+ sec.active_key = param->u.crypt.idx;
-+ sec.flags |= SEC_ACTIVE_KEY;
-+ } else
-+ sec.flags &= ~SEC_ACTIVE_KEY;
-+
-+ if (param->u.crypt.alg != NULL) {
-+ memcpy(sec.keys[param->u.crypt.idx],
-+ param->u.crypt.key,
-+ param->u.crypt.key_len);
-+ sec.key_sizes[param->u.crypt.idx] = param->u.crypt.key_len;
-+ sec.flags |= (1 << param->u.crypt.idx);
-+
-+ if (strcmp(param->u.crypt.alg, "WEP") == 0) {
-+ sec.flags |= SEC_LEVEL;
-+ sec.level = SEC_LEVEL_1;
-+ } else if (strcmp(param->u.crypt.alg, "TKIP") == 0) {
-+ sec.flags |= SEC_LEVEL;
-+ sec.level = SEC_LEVEL_2;
-+ } else if (strcmp(param->u.crypt.alg, "CCMP") == 0) {
-+ sec.flags |= SEC_LEVEL;
-+ sec.level = SEC_LEVEL_3;
-+ }
-+ }
-+ done:
-+ if (ieee->set_security)
-+ ieee->set_security(ieee->dev, &sec);
-+#if 1
-+#ifdef _RTL8187_EXT_PATCH_
-+ if (ret != 0)//error out
-+ {
-+ for (i=0; i<MAX_MP; i++)
-+ {
-+ if (ieee->cryptlist[i]->crypt[param->u.crypt.idx]==NULL){
-+ break;
-+ }
-+ else{
-+ //if (ieee->cryptlist[i]->crypt[param->u.crypt.idx] != NULL)
-+ // {
-+ kfree(ieee->cryptlist[i]->crypt[param->u.crypt.idx]);
-+ ieee->cryptlist[i]->crypt[param->u.crypt.idx] = NULL;
-+ // }
-+ // kfree(ieee->cryptlist[i]);
-+ // ieee->cryptlist[i] = NULL;
-+ }
-+ }
-+ }
-+#endif
-+#endif
-+ /* Do not reset port if card is in Managed mode since resetting will
-+ * generate new IEEE 802.11 authentication which may end up in looping
-+ * with IEEE 802.1X. If your hardware requires a reset after WEP
-+ * configuration (for example... Prism2), implement the reset_port in
-+ * the callbacks structures used to initialize the 802.11 stack. */
-+ if (ieee->reset_on_keychange &&
-+ ieee->iw_mode != IW_MODE_INFRA &&
-+ ieee->reset_port &&
-+ ieee->reset_port(ieee->dev)) {
-+ printk("reset_port failed\n");
-+ param->u.crypt.err = IEEE_CRYPT_ERR_CARD_CONF_FAILED;
-+ return -EINVAL;
-+ }
-+
-+ return ret;
-+}
-+
-+int ieee80211_wpa_supplicant_ioctl(struct ieee80211_device *ieee, struct iw_point *p)
-+{
-+ struct ieee_param *param;
-+ int ret=0;
-+
-+ down(&ieee->wx_sem);
-+ //IEEE_DEBUG_INFO("wpa_supplicant: len=%d\n", p->length);
-+
-+ if (p->length < sizeof(struct ieee_param) || !p->pointer){
-+ ret = -EINVAL;
-+ goto out;
-+ }
-+
-+ param = (struct ieee_param *)kmalloc(p->length, GFP_KERNEL);
-+ if (param == NULL){
-+ ret = -ENOMEM;
-+ goto out;
-+ }
-+ if (copy_from_user(param, p->pointer, p->length)) {
-+ kfree(param);
-+ ret = -EFAULT;
-+ goto out;
-+ }
-+
-+ switch (param->cmd) {
-+
-+ case IEEE_CMD_SET_WPA_PARAM:
-+ ret = ieee80211_wpa_set_param(ieee, param->u.wpa_param.name,
-+ param->u.wpa_param.value);
-+ break;
-+
-+ case IEEE_CMD_SET_WPA_IE:
-+ ret = ieee80211_wpa_set_wpa_ie(ieee, param, p->length);
-+ break;
-+
-+ case IEEE_CMD_SET_ENCRYPTION:
-+ ret = ieee80211_wpa_set_encryption(ieee, param, p->length);
-+ break;
-+
-+ case IEEE_CMD_MLME:
-+ ret = ieee80211_wpa_mlme(ieee, param->u.mlme.command,
-+ param->u.mlme.reason_code);
-+ break;
-+
-+ default:
-+ printk("Unknown WPA supplicant request: %d\n",param->cmd);
-+ ret = -EOPNOTSUPP;
-+ break;
-+ }
-+
-+ if (ret == 0 && copy_to_user(p->pointer, param, p->length))
-+ ret = -EFAULT;
-+
-+ kfree(param);
-+out:
-+ up(&ieee->wx_sem);
-+
-+ return ret;
-+}
-+
-+void notify_wx_assoc_event(struct ieee80211_device *ieee)
-+{
-+ union iwreq_data wrqu;
-+ wrqu.ap_addr.sa_family = ARPHRD_ETHER;
-+ if (ieee->state == IEEE80211_LINKED)
-+ memcpy(wrqu.ap_addr.sa_data, ieee->current_network.bssid, ETH_ALEN);
-+ else
-+ memset(wrqu.ap_addr.sa_data, 0, ETH_ALEN);
-+ wireless_send_event(ieee->dev, SIOCGIWAP, &wrqu, NULL);
-+}
-+
-+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0))
-+EXPORT_SYMBOL(ieee80211_get_beacon);
-+EXPORT_SYMBOL(ieee80211_wake_queue);
-+EXPORT_SYMBOL(ieee80211_stop_queue);
-+EXPORT_SYMBOL(ieee80211_reset_queue);
-+EXPORT_SYMBOL(ieee80211_softmac_stop_protocol);
-+EXPORT_SYMBOL(ieee80211_softmac_start_protocol);
-+EXPORT_SYMBOL(ieee80211_is_shortslot);
-+EXPORT_SYMBOL(ieee80211_is_54g);
-+EXPORT_SYMBOL(ieee80211_wpa_supplicant_ioctl);
-+EXPORT_SYMBOL(ieee80211_ps_tx_ack);
-+EXPORT_SYMBOL(notify_wx_assoc_event);
-+EXPORT_SYMBOL(ieee80211_stop_send_beacons);
-+EXPORT_SYMBOL(ieee80211_start_send_beacons);
-+EXPORT_SYMBOL(ieee80211_start_scan_syncro);
-+EXPORT_SYMBOL(ieee80211_start_protocol);
-+EXPORT_SYMBOL(ieee80211_stop_protocol);
-+EXPORT_SYMBOL(ieee80211_start_scan);
-+EXPORT_SYMBOL(ieee80211_stop_scan);
-+#ifdef _RTL8187_EXT_PATCH_
-+EXPORT_SYMBOL(ieee80211_ext_issue_assoc_req);
-+EXPORT_SYMBOL(ieee80211_ext_issue_disassoc);
-+EXPORT_SYMBOL(ieee80211_ext_issue_assoc_rsp);
-+EXPORT_SYMBOL(softmac_mgmt_xmit);
-+EXPORT_SYMBOL(ieee80211_ext_probe_resp_by_net);
-+EXPORT_SYMBOL(ieee80211_stop_scan);
-+EXPORT_SYMBOL(ieee80211_ext_send_11s_beacon);
-+EXPORT_SYMBOL(ieee80211_rx_auth_rq);
-+EXPORT_SYMBOL(ieee80211_associate_step1);
-+#endif // _RTL8187_EXT_PATCH_
-+#else
-+EXPORT_SYMBOL_NOVERS(ieee80211_get_beacon);
-+EXPORT_SYMBOL_NOVERS(ieee80211_wake_queue);
-+EXPORT_SYMBOL_NOVERS(ieee80211_stop_queue);
-+EXPORT_SYMBOL_NOVERS(ieee80211_reset_queue);
-+EXPORT_SYMBOL_NOVERS(ieee80211_softmac_stop_protocol);
-+EXPORT_SYMBOL_NOVERS(ieee80211_softmac_start_protocol);
-+EXPORT_SYMBOL_NOVERS(ieee80211_is_shortslot);
-+EXPORT_SYMBOL_NOVERS(ieee80211_is_54g);
-+EXPORT_SYMBOL_NOVERS(ieee80211_wpa_supplicant_ioctl);
-+EXPORT_SYMBOL_NOVERS(ieee80211_ps_tx_ack);
-+EXPORT_SYMBOL_NOVERS(ieee80211_start_scan);
-+EXPORT_SYMBOL_NOVERS(ieee80211_stop_scan);
-+#ifdef _RTL8187_EXT_PATCH_
-+EXPORT_SYMBOL_NOVERS(ieee80211_ext_issue_assoc_req);
-+EXPORT_SYMBOL_NOVERS(ieee80211_ext_issue_disassoc);
-+EXPORT_SYMBOL_NOVERS(ieee80211_ext_issue_assoc_rsp);
-+EXPORT_SYMBOL_NOVERS(softmac_mgmt_xmit);
-+EXPORT_SYMBOL_NOVERS(ieee80211_ext_probe_resp_by_net);
-+EXPORT_SYMBOL_NOVERS(ieee80211_stop_scan);
-+EXPORT_SYMBOL_NOVERS(ieee80211_ext_send_11s_beacon);
-+EXPORT_SYMBOL_NOVERS(ieee80211_rx_auth_rq);
-+EXPORT_SYMBOL(ieee80211_associate_step1);
-+#endif // _RTL8187_EXT_PATCH_
-+
-+#endif
-+//EXPORT_SYMBOL(ieee80211_sta_ps_send_null_frame);
-diff -Nur linux-2.6.30.5.orig/drivers/net/wireless/rtl8187b/ieee80211/ieee80211_softmac_wx.c linux-2.6.30.5/drivers/net/wireless/rtl8187b/ieee80211/ieee80211_softmac_wx.c
---- linux-2.6.30.5.orig/drivers/net/wireless/rtl8187b/ieee80211/ieee80211_softmac_wx.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.30.5/drivers/net/wireless/rtl8187b/ieee80211/ieee80211_softmac_wx.c 2009-08-23 19:01:04.000000000 +0200
-@@ -0,0 +1,629 @@
-+/* IEEE 802.11 SoftMAC layer
-+ * Copyright (c) 2005 Andrea Merello <andreamrl@tiscali.it>
-+ *
-+ * Mostly extracted from the rtl8180-sa2400 driver for the
-+ * in-kernel generic ieee802.11 stack.
-+ *
-+ * Some pieces of code might be stolen from ipw2100 driver
-+ * copyright of who own it's copyright ;-)
-+ *
-+ * PS wx handler mostly stolen from hostap, copyright who
-+ * own it's copyright ;-)
-+ *
-+ * released under the GPL
-+ */
-+
-+
-+#include "ieee80211.h"
-+#ifdef ENABLE_DOT11D
-+#include "dot11d.h"
-+#endif
-+
-+/* FIXME: add A freqs */
-+
-+const long ieee80211_wlan_frequencies[] = {
-+ 2412, 2417, 2422, 2427,
-+ 2432, 2437, 2442, 2447,
-+ 2452, 2457, 2462, 2467,
-+ 2472, 2484
-+};
-+
-+
-+int ieee80211_wx_set_freq(struct ieee80211_device *ieee, struct iw_request_info *a,
-+ union iwreq_data *wrqu, char *b)
-+{
-+ int ret;
-+ struct iw_freq *fwrq = & wrqu->freq;
-+
-+ down(&ieee->wx_sem);
-+
-+ if(ieee->iw_mode == IW_MODE_INFRA){
-+ ret = -EOPNOTSUPP;
-+ goto out;
-+ }
-+
-+ /* if setting by freq convert to channel */
-+ if (fwrq->e == 1) {
-+ if ((fwrq->m >= (int) 2.412e8 &&
-+ fwrq->m <= (int) 2.487e8)) {
-+ int f = fwrq->m / 100000;
-+ int c = 0;
-+
-+ while ((c < 14) && (f != ieee80211_wlan_frequencies[c]))
-+ c++;
-+
-+ /* hack to fall through */
-+ fwrq->e = 0;
-+ fwrq->m = c + 1;
-+ }
-+ }
-+
-+ if (fwrq->e > 0 || fwrq->m > 14 || fwrq->m < 1 ){
-+ ret = -EOPNOTSUPP;
-+ goto out;
-+
-+ }else { /* Set the channel */
-+
-+#ifdef ENABLE_DOT11D
-+ if(!IsLegalChannel(ieee, fwrq->m) )
-+ {
-+ printk("channel(%d). is invalide\n", fwrq->m);
-+ ret = -EOPNOTSUPP;
-+ goto out;
-+ }
-+ else
-+ {
-+ if(ieee->iw_mode == IW_MODE_ADHOC)
-+ {
-+ if(ieee->MinPassiveChnlNum != MAX_CHANNEL_NUMBER+1)
-+ {
-+ if(fwrq->m >= ieee->MinPassiveChnlNum)
-+ {
-+ ret = -EOPNOTSUPP;
-+ goto out;
-+ }
-+ }
-+ }
-+ }
-+#endif
-+ ieee->current_network.channel = fwrq->m;
-+ ieee->set_chan(ieee->dev, ieee->current_network.channel);
-+
-+ if(ieee->iw_mode == IW_MODE_ADHOC || ieee->iw_mode == IW_MODE_MASTER)
-+ if(ieee->state == IEEE80211_LINKED){
-+
-+ ieee80211_stop_send_beacons(ieee);
-+ ieee80211_start_send_beacons(ieee);
-+ }
-+ }
-+
-+ ret = 0;
-+out:
-+ up(&ieee->wx_sem);
-+ return ret;
-+}
-+
-+
-+int ieee80211_wx_get_freq(struct ieee80211_device *ieee,
-+ struct iw_request_info *a,
-+ union iwreq_data *wrqu, char *b)
-+{
-+ struct iw_freq *fwrq = & wrqu->freq;
-+
-+ if (ieee->current_network.channel == 0)
-+ return -1;
-+
-+ fwrq->m = ieee->current_network.channel;
-+ fwrq->e = 0;
-+
-+ return 0;
-+}
-+
-+int ieee80211_wx_get_wap(struct ieee80211_device *ieee,
-+ struct iw_request_info *info,
-+ union iwreq_data *wrqu, char *extra)
-+{
-+ unsigned long flags;
-+
-+ wrqu->ap_addr.sa_family = ARPHRD_ETHER;
-+
-+ if (ieee->iw_mode == IW_MODE_MONITOR)
-+ return -1;
-+
-+ /* We want avoid to give to the user inconsistent infos*/
-+ spin_lock_irqsave(&ieee->lock, flags);
-+
-+ if (ieee->state != IEEE80211_LINKED &&
-+ ieee->state != IEEE80211_LINKED_SCANNING &&
-+ ieee->wap_set == 0)
-+
-+ memset(wrqu->ap_addr.sa_data, 0, ETH_ALEN);
-+ else
-+ memcpy(wrqu->ap_addr.sa_data,
-+ ieee->current_network.bssid, ETH_ALEN);
-+
-+ spin_unlock_irqrestore(&ieee->lock, flags);
-+
-+ return 0;
-+}
-+
-+
-+int ieee80211_wx_set_wap(struct ieee80211_device *ieee,
-+ struct iw_request_info *info,
-+ union iwreq_data *awrq,
-+ char *extra)
-+{
-+
-+ int ret = 0;
-+ u8 zero[] = {0,0,0,0,0,0};
-+ unsigned long flags;
-+
-+ short ifup = ieee->proto_started;//dev->flags & IFF_UP;
-+ struct sockaddr *temp = (struct sockaddr *)awrq;
-+
-+ ieee->sync_scan_hurryup = 1;
-+
-+ down(&ieee->wx_sem);
-+ /* use ifconfig hw ether */
-+ if (ieee->iw_mode == IW_MODE_MASTER){
-+ ret = -1;
-+ goto out;
-+ }
-+
-+ if (temp->sa_family != ARPHRD_ETHER){
-+ ret = -EINVAL;
-+ goto out;
-+ }
-+
-+ if (ifup)
-+ ieee80211_stop_protocol(ieee);
-+
-+ /* just to avoid to give inconsistent infos in the
-+ * get wx method. not really needed otherwise
-+ */
-+ spin_lock_irqsave(&ieee->lock, flags);
-+
-+ memcpy(ieee->current_network.bssid, temp->sa_data, ETH_ALEN);
-+ ieee->wap_set = memcmp(temp->sa_data, zero,ETH_ALEN)!=0;
-+
-+ spin_unlock_irqrestore(&ieee->lock, flags);
-+
-+ if (ifup)
-+ ieee80211_start_protocol(ieee);
-+
-+out:
-+ up(&ieee->wx_sem);
-+ return ret;
-+}
-+
-+ int ieee80211_wx_get_essid(struct ieee80211_device *ieee, struct iw_request_info *a,union iwreq_data *wrqu,char *b)
-+{
-+ int len,ret = 0;
-+ unsigned long flags;
-+
-+ if (ieee->iw_mode == IW_MODE_MONITOR)
-+ return -1;
-+
-+ /* We want avoid to give to the user inconsistent infos*/
-+ spin_lock_irqsave(&ieee->lock, flags);
-+
-+ if (ieee->current_network.ssid[0] == '\0' ||
-+ ieee->current_network.ssid_len == 0){
-+ ret = -1;
-+ goto out;
-+ }
-+
-+ if (ieee->state != IEEE80211_LINKED &&
-+ ieee->state != IEEE80211_LINKED_SCANNING &&
-+ ieee->ssid_set == 0){
-+ ret = -1;
-+ goto out;
-+ }
-+ len = ieee->current_network.ssid_len;
-+ wrqu->essid.length = len;
-+ strncpy(b,ieee->current_network.ssid,len);
-+ wrqu->essid.flags = 1;
-+
-+out:
-+ spin_unlock_irqrestore(&ieee->lock, flags);
-+
-+ return ret;
-+
-+}
-+
-+int ieee80211_wx_set_rate(struct ieee80211_device *ieee,
-+ struct iw_request_info *info,
-+ union iwreq_data *wrqu, char *extra)
-+{
-+
-+ u32 target_rate = wrqu->bitrate.value;
-+
-+ ieee->rate = target_rate/100000;
-+ //FIXME: we might want to limit rate also in management protocols.
-+ return 0;
-+}
-+
-+
-+
-+int ieee80211_wx_get_rate(struct ieee80211_device *ieee,
-+ struct iw_request_info *info,
-+ union iwreq_data *wrqu, char *extra)
-+{
-+
-+ wrqu->bitrate.value = ieee->rate * 100000;
-+
-+ return 0;
-+}
-+
-+int ieee80211_wx_set_mode(struct ieee80211_device *ieee, struct iw_request_info *a,
-+ union iwreq_data *wrqu, char *b)
-+{
-+
-+ ieee->sync_scan_hurryup = 1;
-+
-+ down(&ieee->wx_sem);
-+ //printk("=======>%s\n", __func__);
-+
-+ if (wrqu->mode == ieee->iw_mode)
-+ goto out;
-+
-+ if (wrqu->mode == IW_MODE_MONITOR){
-+
-+ ieee->dev->type = ARPHRD_IEEE80211;
-+ }else{
-+ ieee->dev->type = ARPHRD_ETHER;
-+ }
-+
-+ if (!ieee->proto_started){
-+ ieee->iw_mode = wrqu->mode;
-+ }else{
-+ ieee80211_stop_protocol(ieee);
-+ ieee->iw_mode = wrqu->mode;
-+ ieee80211_start_protocol(ieee);
-+ }
-+
-+out:
-+ up(&ieee->wx_sem);
-+ return 0;
-+}
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)
-+void ieee80211_wx_sync_scan_wq(struct work_struct *work)
-+{
-+ struct ieee80211_device *ieee = container_of(work, struct ieee80211_device, wx_sync_scan_wq);
-+#else
-+void ieee80211_wx_sync_scan_wq(struct ieee80211_device *ieee)
-+{
-+#endif
-+ short chan;
-+
-+ chan = ieee->current_network.channel;
-+
-+ netif_carrier_off(ieee->dev);
-+
-+ if (ieee->data_hard_stop)
-+ ieee->data_hard_stop(ieee->dev);
-+
-+ ieee80211_stop_send_beacons(ieee);
-+
-+ ieee->state = IEEE80211_LINKED_SCANNING;
-+ ieee->link_change(ieee->dev);
-+
-+ ieee80211_start_scan_syncro(ieee);
-+
-+ ieee->set_chan(ieee->dev, chan);
-+
-+ ieee->state = IEEE80211_LINKED;
-+ ieee->link_change(ieee->dev);
-+
-+ if (ieee->data_hard_resume)
-+ ieee->data_hard_resume(ieee->dev);
-+
-+ if(ieee->iw_mode == IW_MODE_ADHOC || ieee->iw_mode == IW_MODE_MASTER)
-+ ieee80211_start_send_beacons(ieee);
-+
-+ netif_carrier_on(ieee->dev);
-+
-+ up(&ieee->wx_sem);
-+
-+}
-+
-+int ieee80211_wx_set_scan(struct ieee80211_device *ieee, struct iw_request_info *a,
-+ union iwreq_data *wrqu, char *b)
-+{
-+ int ret = 0;
-+
-+ down(&ieee->wx_sem);
-+
-+ if (ieee->iw_mode == IW_MODE_MONITOR || !(ieee->proto_started)){
-+ ret = -1;
-+ goto out;
-+ }
-+
-+ if ( ieee->state == IEEE80211_LINKED){
-+#if LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0)
-+ queue_work(ieee->wq, &ieee->wx_sync_scan_wq);
-+#else
-+ schedule_task(&ieee->wx_sync_scan_wq);
-+#endif
-+ /* intentionally forget to up sem */
-+ return 0;
-+ }
-+
-+out:
-+ up(&ieee->wx_sem);
-+ return ret;
-+}
-+
-+int ieee80211_wx_set_essid(struct ieee80211_device *ieee,
-+ struct iw_request_info *a,
-+ union iwreq_data *wrqu, char *extra)
-+{
-+
-+ int ret=0,len;
-+ short proto_started;
-+ unsigned long flags;
-+
-+ ieee->sync_scan_hurryup = 1;
-+
-+ down(&ieee->wx_sem);
-+
-+ //printk("=======>%s\n", __func__);
-+ proto_started = ieee->proto_started;
-+
-+ if (wrqu->essid.length > IW_ESSID_MAX_SIZE){
-+ ret= -E2BIG;
-+ goto out;
-+ }
-+
-+ if (ieee->iw_mode == IW_MODE_MONITOR){
-+ ret= -1;
-+ goto out;
-+ }
-+
-+ if(proto_started){
-+ ieee80211_stop_protocol(ieee);
-+ }
-+
-+ /* this is just to be sure that the GET wx callback
-+ * has consisten infos. not needed otherwise
-+ */
-+ spin_lock_irqsave(&ieee->lock, flags);
-+
-+ if (wrqu->essid.flags && wrqu->essid.length) {
-+ len = ((wrqu->essid.length-1) < IW_ESSID_MAX_SIZE) ? (wrqu->essid.length-1) : IW_ESSID_MAX_SIZE;
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20)
-+ strncpy(ieee->current_network.ssid, extra, len);
-+ ieee->current_network.ssid_len = len;
-+#else
-+ strncpy(ieee->current_network.ssid, extra, len+1);
-+ ieee->current_network.ssid_len = len+1;
-+#endif
-+ ieee->ssid_set = 1;
-+ //YJ,add,080819,for hidden ap
-+ if(len == 0){
-+ memset(ieee->current_network.bssid, 0, ETH_ALEN);
-+ ieee->current_network.capability = 0;
-+ }
-+ //YJ,add,080819,for hidden ap,end
-+ }
-+ else{
-+ ieee->ssid_set = 0;
-+ ieee->current_network.ssid[0] = '\0';
-+ ieee->current_network.ssid_len = 0;
-+ }
-+
-+ spin_unlock_irqrestore(&ieee->lock, flags);
-+
-+ if (proto_started){
-+ ieee80211_start_protocol(ieee);
-+ }
-+out:
-+ up(&ieee->wx_sem);
-+ return ret;
-+}
-+
-+ int ieee80211_wx_get_mode(struct ieee80211_device *ieee, struct iw_request_info *a,
-+ union iwreq_data *wrqu, char *b)
-+{
-+
-+ wrqu->mode = ieee->iw_mode;
-+ return 0;
-+}
-+
-+ int ieee80211_wx_set_rawtx(struct ieee80211_device *ieee,
-+ struct iw_request_info *info,
-+ union iwreq_data *wrqu, char *extra)
-+{
-+
-+ int *parms = (int *)extra;
-+ int enable = (parms[0] > 0);
-+ short prev = ieee->raw_tx;
-+
-+ down(&ieee->wx_sem);
-+
-+ if(enable)
-+ ieee->raw_tx = 1;
-+ else
-+ ieee->raw_tx = 0;
-+
-+ printk(KERN_INFO"raw TX is %s\n",
-+ ieee->raw_tx ? "enabled" : "disabled");
-+
-+ if(ieee->iw_mode == IW_MODE_MONITOR)
-+ {
-+ if(prev == 0 && ieee->raw_tx){
-+ if (ieee->data_hard_resume)
-+ ieee->data_hard_resume(ieee->dev);
-+
-+ netif_carrier_on(ieee->dev);
-+ }
-+
-+ if(prev && ieee->raw_tx == 1)
-+ netif_carrier_off(ieee->dev);
-+ }
-+
-+ up(&ieee->wx_sem);
-+
-+ return 0;
-+}
-+
-+int ieee80211_wx_get_name(struct ieee80211_device *ieee,
-+ struct iw_request_info *info,
-+ union iwreq_data *wrqu, char *extra)
-+{
-+ strcpy(wrqu->name, "802.11");
-+ if(ieee->modulation & IEEE80211_CCK_MODULATION){
-+ strcat(wrqu->name, "b");
-+ if(ieee->modulation & IEEE80211_OFDM_MODULATION)
-+ strcat(wrqu->name, "/g");
-+ }else if(ieee->modulation & IEEE80211_OFDM_MODULATION)
-+ strcat(wrqu->name, "g");
-+
-+ if((ieee->state == IEEE80211_LINKED) ||
-+ (ieee->state == IEEE80211_LINKED_SCANNING))
-+ strcat(wrqu->name," linked");
-+ else if(ieee->state != IEEE80211_NOLINK)
-+ strcat(wrqu->name," link..");
-+
-+
-+ return 0;
-+}
-+
-+
-+/* this is mostly stolen from hostap */
-+int ieee80211_wx_set_power(struct ieee80211_device *ieee,
-+ struct iw_request_info *info,
-+ union iwreq_data *wrqu, char *extra)
-+{
-+ int ret = 0;
-+
-+ if(
-+ (!ieee->sta_wake_up) ||
-+ (!ieee->ps_request_tx_ack) ||
-+ (!ieee->enter_sleep_state) ||
-+ (!ieee->ps_is_queue_empty)){
-+
-+ printk("ERROR. PS mode is tryied to be use but\
-+driver missed a callback\n\n");
-+
-+ return -1;
-+ }
-+
-+ down(&ieee->wx_sem);
-+
-+ if (wrqu->power.disabled){
-+ ieee->ps = IEEE80211_PS_DISABLED;
-+
-+ goto exit;
-+ }
-+ switch (wrqu->power.flags & IW_POWER_MODE) {
-+ case IW_POWER_UNICAST_R:
-+ ieee->ps = IEEE80211_PS_UNICAST;
-+
-+ break;
-+ case IW_POWER_ALL_R:
-+ ieee->ps = IEEE80211_PS_UNICAST | IEEE80211_PS_MBCAST;
-+ break;
-+
-+ case IW_POWER_ON:
-+ ieee->ps = IEEE80211_PS_DISABLED;
-+ break;
-+
-+ default:
-+ ret = -EINVAL;
-+ goto exit;
-+ }
-+
-+ if (wrqu->power.flags & IW_POWER_TIMEOUT) {
-+
-+ ieee->ps_timeout = wrqu->power.value / 1000;
-+ printk("Timeout %d\n",ieee->ps_timeout);
-+ }
-+
-+ if (wrqu->power.flags & IW_POWER_PERIOD) {
-+
-+ ret = -EOPNOTSUPP;
-+ goto exit;
-+ //wrq->value / 1024;
-+
-+ }
-+exit:
-+ up(&ieee->wx_sem);
-+ return ret;
-+
-+}
-+
-+/* this is stolen from hostap */
-+int ieee80211_wx_get_power(struct ieee80211_device *ieee,
-+ struct iw_request_info *info,
-+ union iwreq_data *wrqu, char *extra)
-+{
-+ int ret =0;
-+
-+ down(&ieee->wx_sem);
-+
-+ if(ieee->ps == IEEE80211_PS_DISABLED){
-+ wrqu->power.disabled = 1;
-+ goto exit;
-+ }
-+
-+ wrqu->power.disabled = 0;
-+
-+// if ((wrqu->power.flags & IW_POWER_TYPE) == IW_POWER_TIMEOUT) {
-+ wrqu->power.flags = IW_POWER_TIMEOUT;
-+ wrqu->power.value = ieee->ps_timeout * 1000;
-+// } else {
-+// ret = -EOPNOTSUPP;
-+// goto exit;
-+ //wrqu->power.flags = IW_POWER_PERIOD;
-+ //wrqu->power.value = ieee->current_network.dtim_period *
-+ // ieee->current_network.beacon_interval * 1024;
-+// }
-+
-+
-+ if (ieee->ps & IEEE80211_PS_MBCAST)
-+ wrqu->power.flags |= IW_POWER_ALL_R;
-+ else
-+ wrqu->power.flags |= IW_POWER_UNICAST_R;
-+
-+exit:
-+ up(&ieee->wx_sem);
-+ return ret;
-+
-+}
-+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0))
-+EXPORT_SYMBOL(ieee80211_wx_get_essid);
-+EXPORT_SYMBOL(ieee80211_wx_set_essid);
-+EXPORT_SYMBOL(ieee80211_wx_set_rate);
-+EXPORT_SYMBOL(ieee80211_wx_get_rate);
-+EXPORT_SYMBOL(ieee80211_wx_set_wap);
-+EXPORT_SYMBOL(ieee80211_wx_get_wap);
-+EXPORT_SYMBOL(ieee80211_wx_set_mode);
-+EXPORT_SYMBOL(ieee80211_wx_get_mode);
-+EXPORT_SYMBOL(ieee80211_wx_set_scan);
-+EXPORT_SYMBOL(ieee80211_wx_get_freq);
-+EXPORT_SYMBOL(ieee80211_wx_set_freq);
-+EXPORT_SYMBOL(ieee80211_wx_set_rawtx);
-+EXPORT_SYMBOL(ieee80211_wx_get_name);
-+EXPORT_SYMBOL(ieee80211_wx_set_power);
-+EXPORT_SYMBOL(ieee80211_wx_get_power);
-+EXPORT_SYMBOL(ieee80211_wlan_frequencies);
-+#else
-+EXPORT_SYMBOL_NOVERS(ieee80211_wx_get_essid);
-+EXPORT_SYMBOL_NOVERS(ieee80211_wx_set_essid);
-+EXPORT_SYMBOL_NOVERS(ieee80211_wx_set_rate);
-+EXPORT_SYMBOL_NOVERS(ieee80211_wx_get_rate);
-+EXPORT_SYMBOL_NOVERS(ieee80211_wx_set_wap);
-+EXPORT_SYMBOL_NOVERS(ieee80211_wx_get_wap);
-+EXPORT_SYMBOL_NOVERS(ieee80211_wx_set_mode);
-+EXPORT_SYMBOL_NOVERS(ieee80211_wx_get_mode);
-+EXPORT_SYMBOL_NOVERS(ieee80211_wx_set_scan);
-+EXPORT_SYMBOL_NOVERS(ieee80211_wx_get_freq);
-+EXPORT_SYMBOL_NOVERS(ieee80211_wx_set_freq);
-+EXPORT_SYMBOL_NOVERS(ieee80211_wx_set_rawtx);
-+EXPORT_SYMBOL_NOVERS(ieee80211_wx_get_name);
-+EXPORT_SYMBOL_NOVERS(ieee80211_wx_set_power);
-+EXPORT_SYMBOL_NOVERS(ieee80211_wx_get_power);
-+EXPORT_SYMBOL_NOVERS(ieee80211_wlan_frequencies);
-+#endif
-diff -Nur linux-2.6.30.5.orig/drivers/net/wireless/rtl8187b/ieee80211/ieee80211_tx.c linux-2.6.30.5/drivers/net/wireless/rtl8187b/ieee80211/ieee80211_tx.c
---- linux-2.6.30.5.orig/drivers/net/wireless/rtl8187b/ieee80211/ieee80211_tx.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.30.5/drivers/net/wireless/rtl8187b/ieee80211/ieee80211_tx.c 2009-08-23 19:01:04.000000000 +0200
-@@ -0,0 +1,876 @@
-+/******************************************************************************
-+
-+ Copyright(c) 2003 - 2004 Intel Corporation. All rights reserved.
-+
-+ This program is free software; you can redistribute it and/or modify it
-+ under the terms of version 2 of the GNU General Public License as
-+ published by the Free Software Foundation.
-+
-+ 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.
-+
-+ The full GNU General Public License is included in this distribution in the
-+ file called LICENSE.
-+
-+ Contact Information:
-+ James P. Ketrenos <ipw2100-admin@linux.intel.com>
-+ Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
-+
-+******************************************************************************
-+
-+ Few modifications for Realtek's Wi-Fi drivers by
-+ Andrea Merello <andreamrl@tiscali.it>
-+
-+ A special thanks goes to Realtek for their support !
-+
-+******************************************************************************/
-+
-+#include <linux/compiler.h>
-+//#include <linux/config.h>
-+#include <linux/errno.h>
-+#include <linux/if_arp.h>
-+#include <linux/in6.h>
-+#include <linux/in.h>
-+#include <linux/ip.h>
-+#include <linux/kernel.h>
-+#include <linux/module.h>
-+#include <linux/netdevice.h>
-+#include <linux/pci.h>
-+#include <linux/proc_fs.h>
-+#include <linux/skbuff.h>
-+#include <linux/slab.h>
-+#include <linux/tcp.h>
-+#include <linux/types.h>
-+#include <linux/version.h>
-+#include <linux/wireless.h>
-+#include <linux/etherdevice.h>
-+#include <asm/uaccess.h>
-+#include <linux/if_vlan.h>
-+
-+#include "ieee80211.h"
-+
-+
-+/*
-+
-+
-+802.11 Data Frame
-+
-+
-+802.11 frame_contorl for data frames - 2 bytes
-+ ,-----------------------------------------------------------------------------------------.
-+bits | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | a | b | c | d | e |
-+ |----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|------|
-+val | 0 | 0 | 0 | 1 | x | 0 | 0 | 0 | 1 | 0 | x | x | x | x | x |
-+ |----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|------|
-+desc | ^-ver-^ | ^type-^ | ^-----subtype-----^ | to |from |more |retry| pwr |more |wep |
-+ | | | x=0 data,x=1 data+ack | DS | DS |frag | | mgm |data | |
-+ '-----------------------------------------------------------------------------------------'
-+ /\
-+ |
-+802.11 Data Frame |
-+ ,--------- 'ctrl' expands to >-----------'
-+ |
-+ ,--'---,-------------------------------------------------------------.
-+Bytes | 2 | 2 | 6 | 6 | 6 | 2 | 0..2312 | 4 |
-+ |------|------|---------|---------|---------|------|---------|------|
-+Desc. | ctrl | dura | DA/RA | TA | SA | Sequ | Frame | fcs |
-+ | | tion | (BSSID) | | | ence | data | |
-+ `--------------------------------------------------| |------'
-+Total: 28 non-data bytes `----.----'
-+ |
-+ .- 'Frame data' expands to <---------------------------'
-+ |
-+ V
-+ ,---------------------------------------------------.
-+Bytes | 1 | 1 | 1 | 3 | 2 | 0-2304 |
-+ |------|------|---------|----------|------|---------|
-+Desc. | SNAP | SNAP | Control |Eth Tunnel| Type | IP |
-+ | DSAP | SSAP | | | | Packet |
-+ | 0xAA | 0xAA |0x03 (UI)|0x00-00-F8| | |
-+ `-----------------------------------------| |
-+Total: 8 non-data bytes `----.----'
-+ |
-+ .- 'IP Packet' expands, if WEP enabled, to <--'
-+ |
-+ V
-+ ,-----------------------.
-+Bytes | 4 | 0-2296 | 4 |
-+ |-----|-----------|-----|
-+Desc. | IV | Encrypted | ICV |
-+ | | IP Packet | |
-+ `-----------------------'
-+Total: 8 non-data bytes
-+
-+
-+802.3 Ethernet Data Frame
-+
-+ ,-----------------------------------------.
-+Bytes | 6 | 6 | 2 | Variable | 4 |
-+ |-------|-------|------|-----------|------|
-+Desc. | Dest. | Source| Type | IP Packet | fcs |
-+ | MAC | MAC | | | |
-+ `-----------------------------------------'
-+Total: 18 non-data bytes
-+
-+In the event that fragmentation is required, the incoming payload is split into
-+N parts of size ieee->fts. The first fragment contains the SNAP header and the
-+remaining packets are just data.
-+
-+If encryption is enabled, each fragment payload size is reduced by enough space
-+to add the prefix and postfix (IV and ICV totalling 8 bytes in the case of WEP)
-+So if you have 1500 bytes of payload with ieee->fts set to 500 without
-+encryption it will take 3 frames. With WEP it will take 4 frames as the
-+payload of each frame is reduced to 492 bytes.
-+
-+* SKB visualization
-+*
-+* ,- skb->data
-+* |
-+* | ETHERNET HEADER ,-<-- PAYLOAD
-+* | | 14 bytes from skb->data
-+* | 2 bytes for Type --> ,T. | (sizeof ethhdr)
-+* | | | |
-+* |,-Dest.--. ,--Src.---. | | |
-+* | 6 bytes| | 6 bytes | | | |
-+* v | | | | | |
-+* 0 | v 1 | v | v 2
-+* 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
-+* ^ | ^ | ^ |
-+* | | | | | |
-+* | | | | `T' <---- 2 bytes for Type
-+* | | | |
-+* | | '---SNAP--' <-------- 6 bytes for SNAP
-+* | |
-+* `-IV--' <-------------------- 4 bytes for IV (WEP)
-+*
-+* SNAP HEADER
-+*
-+*/
-+
-+static u8 P802_1H_OUI[P80211_OUI_LEN] = { 0x00, 0x00, 0xf8 };
-+static u8 RFC1042_OUI[P80211_OUI_LEN] = { 0x00, 0x00, 0x00 };
-+
-+static inline int ieee80211_put_snap(u8 *data, u16 h_proto)
-+{
-+ struct ieee80211_snap_hdr *snap;
-+ u8 *oui;
-+
-+ snap = (struct ieee80211_snap_hdr *)data;
-+ snap->dsap = 0xaa;
-+ snap->ssap = 0xaa;
-+ snap->ctrl = 0x03;
-+
-+ if (h_proto == 0x8137 || h_proto == 0x80f3)
-+ oui = P802_1H_OUI;
-+ else
-+ oui = RFC1042_OUI;
-+ snap->oui[0] = oui[0];
-+ snap->oui[1] = oui[1];
-+ snap->oui[2] = oui[2];
-+
-+ *(u16 *)(data + SNAP_SIZE) = htons(h_proto);
-+
-+ return SNAP_SIZE + sizeof(u16);
-+}
-+
-+int ieee80211_encrypt_fragment(
-+ struct ieee80211_device *ieee,
-+ struct sk_buff *frag,
-+ int hdr_len)
-+{
-+ struct ieee80211_crypt_data* crypt = NULL;//ieee->crypt[ieee->tx_keyidx];
-+ int res;//, i;
-+// printk("====>wwwwww%s():ieee:%x, hdr_len:%d\n", __FUNCTION__, ieee, hdr_len);
-+/* printk("\n%s(), hdr_len:%d\n", __FUNCTION__, hdr_len);
-+ for (i = 0; i < 48; i++) {
-+ if (i % 16 == 0) printk("\n\t");
-+ printk("%2x ", *(frag->data+i));
-+ }
-+*/
-+
-+#ifdef _RTL8187_EXT_PATCH_
-+#if 0
-+ i = ieee80211_find_MP(ieee, ((struct ieee80211_hdr*) frag->data)->addr1);
-+ if (i== -1){
-+ printk("error find MP entry in %s()\n", __FUNCTION__);
-+ return i;
-+ }
-+ // printk("%s():"MAC_FMT", find in index:%d\n", __FUNCTION__, MAC_ARG(((struct ieee80211_hdr*)frag->data)->addr1), i);
-+#endif
-+// crypt = ieee->cryptlist[MAX_MP-1]->crypt[ieee->tx_keyidx];
-+ crypt = ieee->cryptlist[0]->crypt[ieee->tx_keyidx];
-+#else
-+ crypt = ieee->crypt[ieee->tx_keyidx];
-+#endif
-+ /*added to care about null crypt condition, to solve that system hangs when shared keys error*/
-+ if (!crypt || !crypt->ops)
-+ return -1;
-+
-+#ifdef CONFIG_IEEE80211_CRYPT_TKIP
-+ struct ieee80211_hdr *header;
-+
-+ if (ieee->tkip_countermeasures &&
-+ crypt && crypt->ops && strcmp(crypt->ops->name, "TKIP") == 0) {
-+ header = (struct ieee80211_hdr *) frag->data;
-+ if (net_ratelimit()) {
-+ printk(KERN_DEBUG "%s: TKIP countermeasures: dropped "
-+ "TX packet to " MAC_FMT "\n",
-+ ieee->dev->name, MAC_ARG(header->addr1));
-+ }
-+ return -1;
-+ }
-+#endif
-+ /* To encrypt, frame format is:
-+ * IV (4 bytes), clear payload (including SNAP), ICV (4 bytes) */
-+
-+ // PR: FIXME: Copied from hostap. Check fragmentation/MSDU/MPDU encryption.
-+ /* Host-based IEEE 802.11 fragmentation for TX is not yet supported, so
-+ * call both MSDU and MPDU encryption functions from here. */
-+ atomic_inc(&crypt->refcnt);
-+ res = 0;
-+ if (crypt->ops->encrypt_msdu)
-+ res = crypt->ops->encrypt_msdu(frag, hdr_len, crypt->priv);
-+ if (res == 0 && crypt->ops->encrypt_mpdu)
-+ res = crypt->ops->encrypt_mpdu(frag, hdr_len, crypt->priv);
-+ atomic_dec(&crypt->refcnt);
-+ if (res < 0) {
-+ printk(KERN_INFO "%s: Encryption failed: len=%d.\n",
-+ ieee->dev->name, frag->len);
-+ ieee->ieee_stats.tx_discards++;
-+ return -1;
-+ }
-+
-+ return 0;
-+}
-+
-+
-+void ieee80211_txb_free(struct ieee80211_txb *txb) {
-+ int i;
-+ if (unlikely(!txb))
-+ return;
-+ for (i = 0; i < txb->nr_frags; i++)
-+ if (txb->fragments[i])
-+ dev_kfree_skb_any(txb->fragments[i]);
-+ kfree(txb);
-+}
-+
-+struct ieee80211_txb *ieee80211_alloc_txb(int nr_frags, int txb_size,
-+ int gfp_mask)
-+{
-+ struct ieee80211_txb *txb;
-+ int i;
-+ txb = kmalloc(
-+ sizeof(struct ieee80211_txb) + (sizeof(u8*) * nr_frags),
-+ gfp_mask);
-+ if (!txb)
-+ return NULL;
-+
-+ memset(txb, 0, sizeof(struct ieee80211_txb));
-+ txb->nr_frags = nr_frags;
-+ txb->frag_size = txb_size;
-+
-+ for (i = 0; i < nr_frags; i++) {
-+ txb->fragments[i] = dev_alloc_skb(txb_size);
-+ if (unlikely(!txb->fragments[i])) {
-+ i--;
-+ break;
-+ }
-+ }
-+ if (unlikely(i != nr_frags)) {
-+ while (i >= 0)
-+ dev_kfree_skb_any(txb->fragments[i--]);
-+ kfree(txb);
-+ return NULL;
-+ }
-+ return txb;
-+}
-+
-+// Classify the to-be send data packet
-+// Need to acquire the sent queue index.
-+static int
-+ieee80211_classify(struct sk_buff *skb, struct ieee80211_network *network)
-+{
-+ struct ether_header *eh = (struct ether_header*)skb->data;
-+ unsigned int wme_UP = 0;
-+
-+ if(!network->QoS_Enable) {
-+ skb->priority = 0;
-+ return(wme_UP);
-+ }
-+
-+ if(eh->ether_type == __constant_htons(ETHERTYPE_IP)) {
-+ const struct iphdr *ih = (struct iphdr*)(skb->data + \
-+ sizeof(struct ether_header));
-+ wme_UP = (ih->tos >> 5)&0x07;
-+ } else if (vlan_tx_tag_present(skb)) {//vtag packet
-+#ifndef VLAN_PRI_SHIFT
-+#define VLAN_PRI_SHIFT 13 /* Shift to find VLAN user priority */
-+#define VLAN_PRI_MASK 7 /* Mask for user priority bits in VLAN */
-+#endif
-+ u32 tag = vlan_tx_tag_get(skb);
-+ wme_UP = (tag >> VLAN_PRI_SHIFT) & VLAN_PRI_MASK;
-+ } else if(ETH_P_PAE == ntohs(((struct ethhdr *)skb->data)->h_proto)) {
-+ //printk(KERN_WARNING "type = normal packet\n");
-+ wme_UP = 7;
-+ }
-+ skb->priority = wme_UP;
-+/*
-+ if (network->QoS_Enable) {
-+ skb->priority = wme_UP;
-+ }else {
-+ skb->priority = 0;
-+ }
-+*/
-+ return(wme_UP);
-+}
-+
-+#ifdef _RTL8187_EXT_PATCH_
-+// based on part of ieee80211_xmit. Mainly allocate txb. ieee->lock is held
-+struct ieee80211_txb *ieee80211_ext_alloc_txb(struct sk_buff *skb, struct net_device *dev, struct ieee80211_hdr_3addr *header, int hdr_len, u8 isQoS, u16 *pQOS_ctl, int isEncrypt, struct ieee80211_crypt_data* crypt)
-+{
-+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0))
-+ struct ieee80211_device *ieee = netdev_priv(dev);
-+#else
-+ struct ieee80211_device *ieee = (struct ieee80211_device *)dev->priv;
-+#endif
-+ struct ieee80211_txb *txb = NULL;
-+ struct ieee80211_hdr_3addr *frag_hdr;
-+ int i, bytes_per_frag, nr_frags, bytes_last_frag, frag_size;
-+ int ether_type;
-+ int bytes, QOS_ctl;
-+ struct sk_buff *skb_frag;
-+
-+ ether_type = ntohs(((struct ethhdr *)skb->data)->h_proto);
-+
-+ /* Advance the SKB to the start of the payload */
-+ skb_pull(skb, sizeof(struct ethhdr));
-+
-+ /* Determine total amount of storage required for TXB packets */
-+ bytes = skb->len + SNAP_SIZE + sizeof(u16);
-+
-+ /* Determine fragmentation size based on destination (multicast
-+ * and broadcast are not fragmented) */
-+ // if (is_multicast_ether_addr(dest) ||
-+ // is_broadcast_ether_addr(dest)) {
-+ if (is_multicast_ether_addr(header->addr1) ||
-+ is_broadcast_ether_addr(header->addr1)) {
-+ frag_size = MAX_FRAG_THRESHOLD;
-+ QOS_ctl = QOS_CTL_NOTCONTAIN_ACK;
-+ }
-+ else {
-+ //printk(KERN_WARNING "&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&frag_size = %d\n", frag_size);
-+ frag_size = ieee->fts;//default:392
-+ QOS_ctl = 0;
-+ }
-+
-+ if(isQoS) {
-+ QOS_ctl |= skb->priority; //set in the ieee80211_classify
-+ *pQOS_ctl = cpu_to_le16(QOS_ctl);
-+ }
-+ //printk(KERN_WARNING "header size = %d, QOS_ctl = %x\n", hdr_len,QOS_ctl);
-+ /* Determine amount of payload per fragment. Regardless of if
-+ * this stack is providing the full 802.11 header, one will
-+ * eventually be affixed to this fragment -- so we must account for
-+ * it when determining the amount of payload space. */
-+ //bytes_per_frag = frag_size - (IEEE80211_3ADDR_LEN + (ieee->current_network->QoS_Enable ? 2:0));
-+ bytes_per_frag = frag_size - hdr_len;
-+ if (ieee->config &
-+ (CFG_IEEE80211_COMPUTE_FCS | CFG_IEEE80211_RESERVE_FCS))
-+ bytes_per_frag -= IEEE80211_FCS_LEN;
-+
-+ /* Each fragment may need to have room for encryptiong pre/postfix */
-+ if (isEncrypt)
-+ bytes_per_frag -= crypt->ops->extra_prefix_len +
-+ crypt->ops->extra_postfix_len;
-+
-+ /* Number of fragments is the total bytes_per_frag /
-+ * payload_per_fragment */
-+ nr_frags = bytes / bytes_per_frag;
-+ bytes_last_frag = bytes % bytes_per_frag;
-+ if (bytes_last_frag)
-+ nr_frags++;
-+ else
-+ bytes_last_frag = bytes_per_frag;
-+
-+ /* When we allocate the TXB we allocate enough space for the reserve
-+ * and full fragment bytes (bytes_per_frag doesn't include prefix,
-+ * postfix, header, FCS, etc.) */
-+ txb = ieee80211_alloc_txb(nr_frags, frag_size, GFP_ATOMIC);
-+ if (unlikely(!txb)) {
-+ printk(KERN_WARNING "%s: Could not allocate TXB\n",
-+ ieee->dev->name);
-+ return NULL;
-+ }
-+ txb->encrypted = isEncrypt;
-+ txb->payload_size = bytes;
-+
-+ for (i = 0; i < nr_frags; i++) {
-+ skb_frag = txb->fragments[i];
-+ skb_frag->priority = UP2AC(skb->priority);
-+ if (isEncrypt)
-+ skb_reserve(skb_frag, crypt->ops->extra_prefix_len);
-+
-+ frag_hdr = (struct ieee80211_hdr_3addr *)skb_put(skb_frag, hdr_len);
-+ memcpy(frag_hdr, (void *)header, hdr_len);
-+
-+ /* If this is not the last fragment, then add the MOREFRAGS
-+ * bit to the frame control */
-+ if (i != nr_frags - 1) {
-+ frag_hdr->frame_ctl = cpu_to_le16(
-+ header->frame_ctl | IEEE80211_FCTL_MOREFRAGS);
-+ bytes = bytes_per_frag;
-+
-+ } else {
-+ /* The last fragment takes the remaining length */
-+ bytes = bytes_last_frag;
-+ }
-+
-+ frag_hdr->seq_ctl = cpu_to_le16(ieee->seq_ctrl[0]<<4 | i);
-+ //frag_hdr->seq_ctl = cpu_to_le16(ieee->seq_ctrl<<4 | i);
-+ //
-+
-+ /* Put a SNAP header on the first fragment */
-+ if (i == 0) {
-+ ieee80211_put_snap(
-+ skb_put(skb_frag, SNAP_SIZE + sizeof(u16)), ether_type);
-+ bytes -= SNAP_SIZE + sizeof(u16);
-+ }
-+
-+ memcpy(skb_put(skb_frag, bytes), skb->data, bytes);
-+
-+ /* Advance the SKB... */
-+ skb_pull(skb, bytes);
-+
-+ /* Encryption routine will move the header forward in order
-+ * to insert the IV between the header and the payload */
-+ if (isEncrypt)
-+ ieee80211_encrypt_fragment(ieee, skb_frag, hdr_len);
-+ if (ieee->config &
-+ (CFG_IEEE80211_COMPUTE_FCS | CFG_IEEE80211_RESERVE_FCS))
-+ skb_put(skb_frag, 4);
-+ }
-+ // Advance sequence number in data frame.
-+ //printk(KERN_WARNING "QoS Enalbed? %s\n", ieee->current_network.QoS_Enable?"Y":"N");
-+ if (ieee->seq_ctrl[0] == 0xFFF)
-+ ieee->seq_ctrl[0] = 0;
-+ else
-+ ieee->seq_ctrl[0]++;
-+ // stanley, just for debug
-+/*
-+{
-+ int j=0;
-+ for(j=0;j<nr_frags;j++)
-+ {
-+ int i;
-+ struct sk_buff *skb = txb->fragments[j];
-+ printk("send(%d): ", j);
-+ for (i=0;i<skb->len;i++)
-+ printk("%02X ", skb->data[i]&0xff);
-+ printk("\n");
-+ }
-+}
-+*/
-+
-+ return txb;
-+}
-+
-+
-+// based on part of ieee80211_xmit. Mainly allocate txb. ieee->lock is held
-+// Assume no encryption, no FCS computing
-+struct ieee80211_txb *ieee80211_ext_reuse_txb(struct sk_buff *skb, struct net_device *dev, struct ieee80211_hdr_3addr *header, int hdr_len, u8 isQoS, u16 *pQOS_ctl, int isEncrypt, struct ieee80211_crypt_data* crypt)
-+{
-+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0))
-+ struct ieee80211_device *ieee = netdev_priv(dev);
-+#else
-+ struct ieee80211_device *ieee = (struct ieee80211_device *)dev->priv;
-+#endif
-+ struct ieee80211_txb *txb = NULL;
-+ struct ieee80211_hdr_3addr *frag_hdr;
-+ int ether_type;
-+ int bytes, QOS_ctl;
-+
-+ ether_type = ntohs(((struct ethhdr *)skb->data)->h_proto);
-+
-+ /* Advance the SKB to the start of the payload */
-+ skb_pull(skb, sizeof(struct ethhdr));
-+
-+ /* Determine total amount of storage required for TXB packets */
-+ bytes = skb->len + SNAP_SIZE + sizeof(u16);
-+
-+ if (is_multicast_ether_addr(header->addr1) ||
-+ is_broadcast_ether_addr(header->addr1)) {
-+ QOS_ctl = QOS_CTL_NOTCONTAIN_ACK;
-+ }
-+ else {
-+ QOS_ctl = 0;
-+ }
-+
-+ if(isQoS) {
-+ QOS_ctl |= skb->priority; //set in the ieee80211_classify
-+ *pQOS_ctl = cpu_to_le16(QOS_ctl);
-+ }
-+
-+ txb = kmalloc( sizeof(struct ieee80211_txb) + sizeof(u8*), GFP_ATOMIC );
-+ if (unlikely(!txb)) {
-+ printk(KERN_WARNING "%s: Could not allocate TXB\n",
-+ ieee->dev->name);
-+ return NULL;
-+ }
-+
-+ txb->nr_frags = 1;
-+ txb->frag_size = bytes;
-+ txb->encrypted = isEncrypt;
-+ txb->payload_size = bytes;
-+
-+ txb->fragments[0] = skb;
-+ ieee80211_put_snap(
-+ skb_push(skb, SNAP_SIZE + sizeof(u16)), ether_type);
-+ frag_hdr = (struct ieee80211_hdr_3addr *)skb_push(skb, hdr_len);
-+ memcpy(frag_hdr, (void *)header, hdr_len);
-+ frag_hdr->seq_ctl = cpu_to_le16(ieee->seq_ctrl[0]<<4 | 0);
-+ skb->priority = UP2AC(skb->priority);
-+ if(isEncrypt)
-+ ieee80211_encrypt_fragment(ieee,skb,hdr_len);
-+
-+ // Advance sequence number in data frame.
-+ //printk(KERN_WARNING "QoS Enalbed? %s\n", ieee->current_network.QoS_Enable?"Y":"N");
-+ if (ieee->seq_ctrl[0] == 0xFFF)
-+ ieee->seq_ctrl[0] = 0;
-+ else
-+ ieee->seq_ctrl[0]++;
-+
-+ return txb;
-+}
-+
-+#endif // _RTL8187_EXT_PATCH_
-+
-+/* SKBs are added to the ieee->tx_queue. */
-+int ieee80211_xmit(struct sk_buff *skb,
-+ struct net_device *dev)
-+{
-+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0))
-+ struct ieee80211_device *ieee = netdev_priv(dev);
-+#else
-+ struct ieee80211_device *ieee = (struct ieee80211_device *)dev->priv;
-+#endif
-+ struct ieee80211_txb *txb = NULL;
-+ struct ieee80211_hdr_3addr_QOS *frag_hdr;
-+ int i, bytes_per_frag, nr_frags, bytes_last_frag, frag_size;
-+ unsigned long flags;
-+ struct net_device_stats *stats = &ieee->stats;
-+ int ether_type, encrypt;
-+ int bytes, fc, QOS_ctl, hdr_len;
-+ struct sk_buff *skb_frag;
-+ //struct ieee80211_hdr header = { /* Ensure zero initialized */
-+ // .duration_id = 0,
-+ // .seq_ctl = 0
-+ //};
-+ struct ieee80211_hdr_3addr_QOS header = { /* Ensure zero initialized */
-+ .duration_id = 0,
-+ .seq_ctl = 0,
-+ .QOS_ctl = 0
-+ };
-+ u8 dest[ETH_ALEN], src[ETH_ALEN];
-+
-+ struct ieee80211_crypt_data* crypt;
-+
-+ //printk(KERN_WARNING "upper layer packet!\n");
-+ spin_lock_irqsave(&ieee->lock, flags);
-+
-+ /* If there is no driver handler to take the TXB, dont' bother
-+ * creating it... */
-+ if ((!ieee->hard_start_xmit && !(ieee->softmac_features & IEEE_SOFTMAC_TX_QUEUE))||
-+ ((!ieee->softmac_data_hard_start_xmit && (ieee->softmac_features & IEEE_SOFTMAC_TX_QUEUE)))) {
-+ printk(KERN_WARNING "%s: No xmit handler.\n",
-+ ieee->dev->name);
-+ goto success;
-+ }
-+
-+ ieee80211_classify(skb,&ieee->current_network);
-+ if(likely(ieee->raw_tx == 0)){
-+
-+ if (unlikely(skb->len < SNAP_SIZE + sizeof(u16))) {
-+ printk(KERN_WARNING "%s: skb too small (%d).\n",
-+ ieee->dev->name, skb->len);
-+ goto success;
-+ }
-+
-+
-+#ifdef _RTL8187_EXT_PATCH_
-+ // note, skb->priority which was set by ieee80211_classify, and used by physical tx
-+ if((ieee->iw_mode == ieee->iw_ext_mode) && (ieee->ext_patch_ieee80211_xmit))
-+ {
-+ txb = ieee->ext_patch_ieee80211_xmit(skb, dev);
-+ goto success;
-+ }
-+#endif
-+
-+ ether_type = ntohs(((struct ethhdr *)skb->data)->h_proto);
-+#ifdef _RTL8187_EXT_PATCH_
-+ crypt = ieee->cryptlist[0]->crypt[ieee->tx_keyidx];
-+#else
-+ crypt = ieee->crypt[ieee->tx_keyidx];
-+#endif
-+ encrypt = !(ether_type == ETH_P_PAE && ieee->ieee802_1x) &&
-+ ieee->host_encrypt && crypt && crypt->ops;
-+
-+ if (!encrypt && ieee->ieee802_1x &&
-+ ieee->drop_unencrypted && ether_type != ETH_P_PAE) {
-+ stats->tx_dropped++;
-+ goto success;
-+ }
-+
-+ #ifdef CONFIG_IEEE80211_DEBUG
-+ if (crypt && !encrypt && ether_type == ETH_P_PAE) {
-+ struct eapol *eap = (struct eapol *)(skb->data +
-+ sizeof(struct ethhdr) - SNAP_SIZE - sizeof(u16));
-+ IEEE80211_DEBUG_EAP("TX: IEEE 802.11 EAPOL frame: %s\n",
-+ eap_get_type(eap->type));
-+ }
-+ #endif
-+
-+ /* Save source and destination addresses */
-+ memcpy(&dest, skb->data, ETH_ALEN);
-+ memcpy(&src, skb->data+ETH_ALEN, ETH_ALEN);
-+
-+ /* Advance the SKB to the start of the payload */
-+ skb_pull(skb, sizeof(struct ethhdr));
-+
-+ /* Determine total amount of storage required for TXB packets */
-+ bytes = skb->len + SNAP_SIZE + sizeof(u16);
-+
-+ if(ieee->current_network.QoS_Enable) {
-+ if (encrypt)
-+ fc = IEEE80211_FTYPE_DATA | IEEE80211_STYPE_QOS_DATA |
-+ IEEE80211_FCTL_WEP;
-+ else
-+ fc = IEEE80211_FTYPE_DATA | IEEE80211_STYPE_QOS_DATA;
-+
-+ } else {
-+ if (encrypt)
-+ fc = IEEE80211_FTYPE_DATA | IEEE80211_STYPE_DATA |
-+ IEEE80211_FCTL_WEP;
-+ else
-+ fc = IEEE80211_FTYPE_DATA | IEEE80211_STYPE_DATA;
-+ }
-+
-+ if (ieee->iw_mode == IW_MODE_INFRA) {
-+ fc |= IEEE80211_FCTL_TODS;
-+ /* To DS: Addr1 = BSSID, Addr2 = SA,
-+ Addr3 = DA */
-+ memcpy(&header.addr1, ieee->current_network.bssid, ETH_ALEN);
-+ memcpy(&header.addr2, &src, ETH_ALEN);
-+ memcpy(&header.addr3, &dest, ETH_ALEN);
-+ } else if (ieee->iw_mode == IW_MODE_ADHOC) {
-+ /* not From/To DS: Addr1 = DA, Addr2 = SA,
-+ Addr3 = BSSID */
-+ memcpy(&header.addr1, dest, ETH_ALEN);
-+ memcpy(&header.addr2, src, ETH_ALEN);
-+ memcpy(&header.addr3, ieee->current_network.bssid, ETH_ALEN);
-+ }
-+ // printk(KERN_WARNING "essid MAC address is "MAC_FMT, MAC_ARG(&header.addr1));
-+ header.frame_ctl = cpu_to_le16(fc);
-+ //hdr_len = IEEE80211_3ADDR_LEN;
-+
-+ /* Determine fragmentation size based on destination (multicast
-+ * and broadcast are not fragmented) */
-+// if (is_multicast_ether_addr(dest) ||
-+// is_broadcast_ether_addr(dest)) {
-+ if (is_multicast_ether_addr(header.addr1) ||
-+ is_broadcast_ether_addr(header.addr1)) {
-+ frag_size = MAX_FRAG_THRESHOLD;
-+ QOS_ctl = QOS_CTL_NOTCONTAIN_ACK;
-+ }
-+ else {
-+ //printk(KERN_WARNING "&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&frag_size = %d\n", frag_size);
-+ frag_size = ieee->fts;//default:392
-+ QOS_ctl = 0;
-+ }
-+
-+ if (ieee->current_network.QoS_Enable) {
-+ hdr_len = IEEE80211_3ADDR_LEN + 2;
-+ QOS_ctl |= skb->priority; //set in the ieee80211_classify
-+ header.QOS_ctl = cpu_to_le16(QOS_ctl);
-+ } else {
-+ hdr_len = IEEE80211_3ADDR_LEN;
-+ }
-+ //printk(KERN_WARNING "header size = %d, QOS_ctl = %x\n", hdr_len,QOS_ctl);
-+ /* Determine amount of payload per fragment. Regardless of if
-+ * this stack is providing the full 802.11 header, one will
-+ * eventually be affixed to this fragment -- so we must account for
-+ * it when determining the amount of payload space. */
-+ //bytes_per_frag = frag_size - (IEEE80211_3ADDR_LEN + (ieee->current_network->QoS_Enable ? 2:0));
-+ bytes_per_frag = frag_size - hdr_len;
-+ if (ieee->config &
-+ (CFG_IEEE80211_COMPUTE_FCS | CFG_IEEE80211_RESERVE_FCS))
-+ bytes_per_frag -= IEEE80211_FCS_LEN;
-+
-+ /* Each fragment may need to have room for encryptiong pre/postfix */
-+ if (encrypt)
-+ bytes_per_frag -= crypt->ops->extra_prefix_len +
-+ crypt->ops->extra_postfix_len;
-+
-+ /* Number of fragments is the total bytes_per_frag /
-+ * payload_per_fragment */
-+ nr_frags = bytes / bytes_per_frag;
-+ bytes_last_frag = bytes % bytes_per_frag;
-+ if (bytes_last_frag)
-+ nr_frags++;
-+ else
-+ bytes_last_frag = bytes_per_frag;
-+
-+ /* When we allocate the TXB we allocate enough space for the reserve
-+ * and full fragment bytes (bytes_per_frag doesn't include prefix,
-+ * postfix, header, FCS, etc.) */
-+ txb = ieee80211_alloc_txb(nr_frags, frag_size, GFP_ATOMIC);
-+ if (unlikely(!txb)) {
-+ printk(KERN_WARNING "%s: Could not allocate TXB\n",
-+ ieee->dev->name);
-+ goto failed;
-+ }
-+ txb->encrypted = encrypt;
-+ txb->payload_size = bytes;
-+
-+ for (i = 0; i < nr_frags; i++) {
-+ skb_frag = txb->fragments[i];
-+ skb_frag->priority = UP2AC(skb->priority);
-+ if (encrypt)
-+ skb_reserve(skb_frag, crypt->ops->extra_prefix_len);
-+
-+ frag_hdr = (struct ieee80211_hdr_3addr_QOS *)skb_put(skb_frag, hdr_len);
-+ memcpy(frag_hdr, &header, hdr_len);
-+
-+ /* If this is not the last fragment, then add the MOREFRAGS
-+ * bit to the frame control */
-+ if (i != nr_frags - 1) {
-+ frag_hdr->frame_ctl = cpu_to_le16(
-+ fc | IEEE80211_FCTL_MOREFRAGS);
-+ bytes = bytes_per_frag;
-+
-+ } else {
-+ /* The last fragment takes the remaining length */
-+ bytes = bytes_last_frag;
-+ }
-+ if(ieee->current_network.QoS_Enable) {
-+ // add 1 only indicate to corresponding seq number control 2006/7/12
-+ frag_hdr->seq_ctl = cpu_to_le16(ieee->seq_ctrl[UP2AC(skb->priority)+1]<<4 | i);
-+ //printk(KERN_WARNING "skb->priority = %d,", skb->priority);
-+ //printk(KERN_WARNING "type:%d: seq = %d\n",UP2AC(skb->priority),ieee->seq_ctrl[UP2AC(skb->priority)+1]);
-+ } else {
-+ frag_hdr->seq_ctl = cpu_to_le16(ieee->seq_ctrl[0]<<4 | i);
-+ }
-+ //frag_hdr->seq_ctl = cpu_to_le16(ieee->seq_ctrl<<4 | i);
-+ //
-+
-+ /* Put a SNAP header on the first fragment */
-+ if (i == 0) {
-+ ieee80211_put_snap(
-+ skb_put(skb_frag, SNAP_SIZE + sizeof(u16)),
-+ ether_type);
-+ bytes -= SNAP_SIZE + sizeof(u16);
-+ }
-+
-+ memcpy(skb_put(skb_frag, bytes), skb->data, bytes);
-+
-+ /* Advance the SKB... */
-+ skb_pull(skb, bytes);
-+
-+ /* Encryption routine will move the header forward in order
-+ * to insert the IV between the header and the payload */
-+ if (encrypt)
-+ ieee80211_encrypt_fragment(ieee, skb_frag, hdr_len);
-+ if (ieee->config &
-+ (CFG_IEEE80211_COMPUTE_FCS | CFG_IEEE80211_RESERVE_FCS))
-+ skb_put(skb_frag, 4);
-+ }
-+ // Advance sequence number in data frame.
-+ //printk(KERN_WARNING "QoS Enalbed? %s\n", ieee->current_network.QoS_Enable?"Y":"N");
-+ if (ieee->current_network.QoS_Enable) {
-+ if (ieee->seq_ctrl[UP2AC(skb->priority) + 1] == 0xFFF)
-+ ieee->seq_ctrl[UP2AC(skb->priority) + 1] = 0;
-+ else
-+ ieee->seq_ctrl[UP2AC(skb->priority) + 1]++;
-+ } else {
-+ if (ieee->seq_ctrl[0] == 0xFFF)
-+ ieee->seq_ctrl[0] = 0;
-+ else
-+ ieee->seq_ctrl[0]++;
-+ }
-+ //---
-+ }else{
-+ if (unlikely(skb->len < sizeof(struct ieee80211_hdr_3addr))) {
-+ printk(KERN_WARNING "%s: skb too small (%d).\n",
-+ ieee->dev->name, skb->len);
-+ goto success;
-+ }
-+
-+ txb = ieee80211_alloc_txb(1, skb->len, GFP_ATOMIC);
-+ if(!txb){
-+ printk(KERN_WARNING "%s: Could not allocate TXB\n",
-+ ieee->dev->name);
-+ goto failed;
-+ }
-+
-+ txb->encrypted = 0;
-+ txb->payload_size = skb->len;
-+ memcpy(skb_put(txb->fragments[0],skb->len), skb->data, skb->len);
-+ }
-+
-+ success:
-+ spin_unlock_irqrestore(&ieee->lock, flags);
-+#ifdef _RTL8187_EXT_PATCH_
-+ // Sometimes, extension mode can reuse skb (by txb->fragments[0])
-+ if( ! ((ieee->iw_mode == ieee->iw_ext_mode) && txb && (txb->fragments[0] == skb)) )
-+#endif
-+ dev_kfree_skb_any(skb);
-+ if (txb) {
-+ if (ieee->softmac_features & IEEE_SOFTMAC_TX_QUEUE){
-+ ieee80211_softmac_xmit(txb, ieee);
-+ }else{
-+ if ((*ieee->hard_start_xmit)(txb, dev) == 0) {
-+ stats->tx_packets++;
-+ stats->tx_bytes += txb->payload_size;
-+ return 0;
-+ }
-+ ieee80211_txb_free(txb);
-+ }
-+ }
-+
-+ return 0;
-+
-+ failed:
-+ spin_unlock_irqrestore(&ieee->lock, flags);
-+ netif_stop_queue(dev);
-+ printk("netif_stop_queue in ieee80211_xmit \n");
-+ stats->tx_errors++;
-+ return 1;
-+
-+}
-+
-+
-+
-+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0))
-+EXPORT_SYMBOL(ieee80211_txb_free);
-+#ifdef _RTL8187_EXT_PATCH_
-+EXPORT_SYMBOL(ieee80211_alloc_txb);
-+EXPORT_SYMBOL(ieee80211_ext_alloc_txb);
-+EXPORT_SYMBOL(ieee80211_ext_reuse_txb);
-+
-+EXPORT_SYMBOL(ieee80211_encrypt_fragment);
-+#endif // _RTL8187_EXT_PATCH_
-+#else
-+EXPORT_SYMBOL_NOVERS(ieee80211_txb_free);
-+#ifdef _RTL8187_EXT_PATCH_
-+EXPORT_SYMBOL_NOVERS(ieee80211_alloc_txb);
-+EXPORT_SYMBOL_NOVERS(ieee80211_ext_reuse_txb);
-+
-+EXPORT_SYMBOL_NOVERS(ieee80211_encrypt_fragment);
-+#endif // _RTL8187_EXT_PATCH_
-+#endif
-+
-diff -Nur linux-2.6.30.5.orig/drivers/net/wireless/rtl8187b/ieee80211/ieee80211_wx.c linux-2.6.30.5/drivers/net/wireless/rtl8187b/ieee80211/ieee80211_wx.c
---- linux-2.6.30.5.orig/drivers/net/wireless/rtl8187b/ieee80211/ieee80211_wx.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.30.5/drivers/net/wireless/rtl8187b/ieee80211/ieee80211_wx.c 2009-08-23 19:01:04.000000000 +0200
-@@ -0,0 +1,926 @@
-+/******************************************************************************
-+
-+ Copyright(c) 2004 Intel Corporation. All rights reserved.
-+
-+ Portions of this file are based on the WEP enablement code provided by the
-+ Host AP project hostap-drivers v0.1.3
-+ Copyright (c) 2001-2002, SSH Communications Security Corp and Jouni Malinen
-+ <jkmaline@cc.hut.fi>
-+ Copyright (c) 2002-2003, Jouni Malinen <jkmaline@cc.hut.fi>
-+
-+ This program is free software; you can redistribute it and/or modify it
-+ under the terms of version 2 of the GNU General Public License as
-+ published by the Free Software Foundation.
-+
-+ 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.
-+
-+ The full GNU General Public License is included in this distribution in the
-+ file called LICENSE.
-+
-+ Contact Information:
-+ James P. Ketrenos <ipw2100-admin@linux.intel.com>
-+ Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
-+
-+******************************************************************************/
-+#include <linux/wireless.h>
-+#include <linux/version.h>
-+#include <linux/kmod.h>
-+#include <linux/module.h>
-+
-+#include "ieee80211.h"
-+static const char *ieee80211_modes[] = {
-+ "?", "a", "b", "ab", "g", "ag", "bg", "abg"
-+};
-+
-+#define MAX_CUSTOM_LEN 64
-+static inline char *rtl819x_translate_scan(struct ieee80211_device *ieee,
-+ char *start, char *stop,
-+ struct ieee80211_network *network,
-+ struct iw_request_info *info)
-+{
-+ char custom[MAX_CUSTOM_LEN];
-+ char *p;
-+ struct iw_event iwe;
-+ int i, j;
-+ u8 max_rate, rate;
-+
-+ /* First entry *MUST* be the AP MAC address */
-+ iwe.cmd = SIOCGIWAP;
-+ iwe.u.ap_addr.sa_family = ARPHRD_ETHER;
-+ memcpy(iwe.u.ap_addr.sa_data, network->bssid, ETH_ALEN);
-+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,27) || defined (QMI_26_6))
-+ start = iwe_stream_add_event(info, start, stop, &iwe, IW_EV_ADDR_LEN);
-+#else
-+ start = iwe_stream_add_event(start, stop, &iwe, IW_EV_ADDR_LEN);
-+#endif
-+ /* Remaining entries will be displayed in the order we provide them */
-+
-+ /* Add the ESSID */
-+ iwe.cmd = SIOCGIWESSID;
-+ iwe.u.data.flags = 1;
-+ //YJ,modified,080903,for hidden ap
-+ //if (network->flags & NETWORK_EMPTY_ESSID) {
-+ if (network->ssid_len == 0) {
-+ iwe.u.data.length = sizeof("<hidden>");
-+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,27) || defined (QMI_26_6))
-+ start = iwe_stream_add_point(info, start, stop, &iwe, "<hidden>");
-+#else
-+ start = iwe_stream_add_point(start, stop, &iwe, "<hidden>");
-+#endif
-+ } else {
-+ iwe.u.data.length = min(network->ssid_len, (u8)32);
-+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,27) || defined (QMI_26_6))
-+ start = iwe_stream_add_point(info, start, stop, &iwe, network->ssid);
-+#else
-+ start = iwe_stream_add_point(start, stop, &iwe, network->ssid);
-+#endif
-+ }
-+
-+ /* Add the protocol name */
-+ iwe.cmd = SIOCGIWNAME;
-+ snprintf(iwe.u.name, IFNAMSIZ, "IEEE 802.11%s", ieee80211_modes[network->mode]);
-+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,27) || defined (QMI_26_6))
-+ start = iwe_stream_add_event(info, start, stop, &iwe, IW_EV_CHAR_LEN);
-+#else
-+ start = iwe_stream_add_event(start, stop, &iwe, IW_EV_CHAR_LEN);
-+#endif
-+ /* Add mode */
-+ iwe.cmd = SIOCGIWMODE;
-+ if (network->capability &
-+ (WLAN_CAPABILITY_BSS | WLAN_CAPABILITY_IBSS)) {
-+ if (network->capability & WLAN_CAPABILITY_BSS)
-+ iwe.u.mode = IW_MODE_MASTER;
-+ else
-+ iwe.u.mode = IW_MODE_ADHOC;
-+
-+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,27) || defined (QMI_26_6))
-+ start = iwe_stream_add_event(info, start, stop, &iwe,
-+ IW_EV_UINT_LEN);
-+#else
-+ start = iwe_stream_add_event(start, stop, &iwe,
-+ IW_EV_UINT_LEN);
-+#endif
-+ }
-+
-+ /* Add frequency/channel */
-+ iwe.cmd = SIOCGIWFREQ;
-+/* iwe.u.freq.m = ieee80211_frequency(network->channel, network->mode);
-+ iwe.u.freq.e = 3; */
-+ iwe.u.freq.m = network->channel;
-+ iwe.u.freq.e = 0;
-+ iwe.u.freq.i = 0;
-+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,27) || defined (QMI_26_6))
-+ start = iwe_stream_add_event(info, start, stop, &iwe, IW_EV_FREQ_LEN);
-+#else
-+ start = iwe_stream_add_event(start, stop, &iwe, IW_EV_FREQ_LEN);
-+#endif
-+ /* Add encryption capability */
-+ iwe.cmd = SIOCGIWENCODE;
-+ if (network->capability & WLAN_CAPABILITY_PRIVACY)
-+ iwe.u.data.flags = IW_ENCODE_ENABLED | IW_ENCODE_NOKEY;
-+ else
-+ iwe.u.data.flags = IW_ENCODE_DISABLED;
-+ iwe.u.data.length = 0;
-+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,27) || defined (QMI_26_6))
-+ start = iwe_stream_add_point(info, start, stop, &iwe, network->ssid);
-+#else
-+ start = iwe_stream_add_point(start, stop, &iwe, network->ssid);
-+#endif
-+ /* Add basic and extended rates */
-+ max_rate = 0;
-+ p = custom;
-+ p += snprintf(p, MAX_CUSTOM_LEN - (p - custom), " Rates (Mb/s): ");
-+ for (i = 0, j = 0; i < network->rates_len; ) {
-+ if (j < network->rates_ex_len &&
-+ ((network->rates_ex[j] & 0x7F) <
-+ (network->rates[i] & 0x7F)))
-+ rate = network->rates_ex[j++] & 0x7F;
-+ else
-+ rate = network->rates[i++] & 0x7F;
-+ if (rate > max_rate)
-+ max_rate = rate;
-+ p += snprintf(p, MAX_CUSTOM_LEN - (p - custom),
-+ "%d%s ", rate >> 1, (rate & 1) ? ".5" : "");
-+ }
-+ for (; j < network->rates_ex_len; j++) {
-+ rate = network->rates_ex[j] & 0x7F;
-+ p += snprintf(p, MAX_CUSTOM_LEN - (p - custom),
-+ "%d%s ", rate >> 1, (rate & 1) ? ".5" : "");
-+ if (rate > max_rate)
-+ max_rate = rate;
-+ }
-+
-+ iwe.cmd = SIOCGIWRATE;
-+ iwe.u.bitrate.fixed = iwe.u.bitrate.disabled = 0;
-+ iwe.u.bitrate.value = max_rate * 500000;
-+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,27) || defined (QMI_26_6))
-+ start = iwe_stream_add_event(info, start, stop, &iwe,IW_EV_PARAM_LEN);
-+#else
-+ start = iwe_stream_add_event(start, stop, &iwe,IW_EV_PARAM_LEN);
-+#endif
-+ iwe.cmd = IWEVCUSTOM;
-+ iwe.u.data.length = p - custom;
-+ if (iwe.u.data.length)
-+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,27) || defined (QMI_26_6))
-+ start = iwe_stream_add_point(info, start, stop, &iwe, custom);
-+#else
-+ start = iwe_stream_add_point(start, stop, &iwe, custom);
-+#endif
-+ /* Add quality statistics */
-+ /* TODO: Fix these values... */
-+ iwe.cmd = IWEVQUAL;
-+ iwe.u.qual.qual = network->stats.signalstrength;//network->stats.signal;
-+ iwe.u.qual.level = network->stats.signal;//network->stats.rssi;
-+ iwe.u.qual.noise = network->stats.noise;
-+#if 0
-+ iwe.u.qual.updated = network->stats.mask & IEEE80211_STATMASK_WEMASK;
-+ if (!(network->stats.mask & IEEE80211_STATMASK_RSSI))
-+ iwe.u.qual.updated |= IW_QUAL_LEVEL_INVALID;
-+ if (!(network->stats.mask & IEEE80211_STATMASK_NOISE))
-+ iwe.u.qual.updated |= IW_QUAL_NOISE_INVALID;
-+ if (!(network->stats.mask & IEEE80211_STATMASK_SIGNAL))
-+ iwe.u.qual.updated |= IW_QUAL_QUAL_INVALID;
-+#endif
-+
-+ iwe.u.qual.updated = 0x7;//network->stats.mask & IEEE80211_STATMASK_WEMASK;
-+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,27) || defined (QMI_26_6))
-+ start = iwe_stream_add_event(info, start, stop, &iwe, IW_EV_QUAL_LEN);
-+#else
-+ start = iwe_stream_add_event(start, stop, &iwe, IW_EV_QUAL_LEN);
-+#endif
-+ iwe.cmd = IWEVCUSTOM;
-+ p = custom;
-+
-+ iwe.u.data.length = p - custom;
-+ if (iwe.u.data.length)
-+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,27) || defined (QMI_26_6))
-+ start = iwe_stream_add_point(info, start, stop, &iwe, custom);
-+#else
-+ start = iwe_stream_add_point(start, stop, &iwe, custom);
-+#endif
-+#if 0
-+ if (ieee->wpa_enabled && network->wpa_ie_len){
-+ char buf[MAX_WPA_IE_LEN * 2 + 30];
-+ // printk("WPA IE\n");
-+ u8 *p = buf;
-+ p += sprintf(p, "wpa_ie=");
-+ for (i = 0; i < network->wpa_ie_len; i++) {
-+ p += sprintf(p, "%02x", network->wpa_ie[i]);
-+ }
-+
-+ memset(&iwe, 0, sizeof(iwe));
-+ iwe.cmd = IWEVCUSTOM;
-+ iwe.u.data.length = strlen(buf);
-+ start = iwe_stream_add_point(start, stop, &iwe, buf);
-+ }
-+
-+ if (ieee->wpa_enabled && network->rsn_ie_len){
-+ char buf[MAX_WPA_IE_LEN * 2 + 30];
-+
-+ u8 *p = buf;
-+ p += sprintf(p, "rsn_ie=");
-+ for (i = 0; i < network->rsn_ie_len; i++) {
-+ p += sprintf(p, "%02x", network->rsn_ie[i]);
-+ }
-+
-+
-+#else
-+ memset(&iwe, 0, sizeof(iwe));
-+ if (network->wpa_ie_len) {
-+ //printk("wpa_ie_len:%d\n", network->wpa_ie_len);
-+ char buf[MAX_WPA_IE_LEN];
-+ memcpy(buf, network->wpa_ie, network->wpa_ie_len);
-+ iwe.cmd = IWEVGENIE;
-+ iwe.u.data.length = network->wpa_ie_len;
-+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,27) || defined (QMI_26_6))
-+ start = iwe_stream_add_point(info, start, stop, &iwe, buf);
-+#else
-+ start = iwe_stream_add_point(start, stop, &iwe, buf);
-+#endif
-+ }
-+
-+ memset(&iwe, 0, sizeof(iwe));
-+ if (network->rsn_ie_len) {
-+ //printk("=====>rsn_ie_len:\n", network->rsn_ie_len);
-+ #if 0
-+ {
-+ int i;
-+ for (i=0; i<network->rsn_ie_len; i++);
-+ printk("%2x ", network->rsn_ie[i]);
-+ printk("\n");
-+ }
-+ #endif
-+ char buf[MAX_WPA_IE_LEN];
-+ memcpy(buf, network->rsn_ie, network->rsn_ie_len);
-+ iwe.cmd = IWEVGENIE;
-+ iwe.u.data.length = network->rsn_ie_len;
-+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,27) || defined (QMI_26_6))
-+ start = iwe_stream_add_point(info, start, stop, &iwe, buf);
-+#else
-+ start = iwe_stream_add_point(start, stop, &iwe, buf);
-+#endif
-+ }
-+
-+#endif
-+
-+ /* Add EXTRA: Age to display seconds since last beacon/probe response
-+ * for given network. */
-+ iwe.cmd = IWEVCUSTOM;
-+ p = custom;
-+ p += snprintf(p, MAX_CUSTOM_LEN - (p - custom),
-+ " Last beacon: %lums ago", (jiffies - network->last_scanned) / (HZ / 100));
-+ iwe.u.data.length = p - custom;
-+ if (iwe.u.data.length)
-+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,27) || defined (QMI_26_6))
-+ start = iwe_stream_add_point(info, start, stop, &iwe, custom);
-+#else
-+ start = iwe_stream_add_point(start, stop, &iwe, custom);
-+#endif
-+
-+ return start;
-+}
-+
-+int ieee80211_wx_get_scan(struct ieee80211_device *ieee,
-+ struct iw_request_info *info,
-+ union iwreq_data *wrqu, char *extra)
-+{
-+ struct ieee80211_network *network;
-+ unsigned long flags;
-+ int err = 0;
-+ char *ev = extra;
-+ char *stop = ev + wrqu->data.length;//IW_SCAN_MAX_DATA;
-+ //char *stop = ev + IW_SCAN_MAX_DATA;
-+ int i = 0;
-+
-+ IEEE80211_DEBUG_WX("Getting scan\n");
-+ down(&ieee->wx_sem);
-+ spin_lock_irqsave(&ieee->lock, flags);
-+
-+ if(!ieee->bHwRadioOff)
-+ {
-+ list_for_each_entry(network, &ieee->network_list, list) {
-+ i++;
-+
-+ if((stop-ev)<200)
-+ {
-+ err = -E2BIG;
-+ break;
-+ }
-+
-+ if (ieee->scan_age == 0 ||
-+ time_after(network->last_scanned + ieee->scan_age, jiffies))
-+ {
-+ ev = rtl819x_translate_scan(ieee, ev, stop, network, info);
-+ }
-+ else
-+ IEEE80211_DEBUG_SCAN(
-+ "Not showing network '%s ("
-+ MAC_FMT ")' due to age (%lums).\n",
-+ escape_essid(network->ssid,
-+ network->ssid_len),
-+ MAC_ARG(network->bssid),
-+ (jiffies - network->last_scanned) / (HZ / 100));
-+ }
-+ }
-+ spin_unlock_irqrestore(&ieee->lock, flags);
-+ up(&ieee->wx_sem);
-+ wrqu->data.length = ev - extra;
-+ wrqu->data.flags = 0;
-+
-+ IEEE80211_DEBUG_WX("exit: %d networks returned.\n", i);
-+
-+ return err;
-+}
-+
-+int ieee80211_wx_set_encode(struct ieee80211_device *ieee,
-+ struct iw_request_info *info,
-+ union iwreq_data *wrqu, char *keybuf)
-+{
-+ struct iw_point *erq = &(wrqu->encoding);
-+ struct net_device *dev = ieee->dev;
-+ struct ieee80211_security sec = {
-+ .flags = 0
-+ };
-+ int i, key, key_provided, len;
-+ struct ieee80211_crypt_data **crypt;
-+
-+ IEEE80211_DEBUG_WX("SET_ENCODE\n");
-+
-+ key = erq->flags & IW_ENCODE_INDEX;
-+ if (key) {
-+ if (key > WEP_KEYS)
-+ return -EINVAL;
-+ key--;
-+ key_provided = 1;
-+ } else {
-+ key_provided = 0;
-+ key = ieee->tx_keyidx;
-+ }
-+
-+ IEEE80211_DEBUG_WX("Key: %d [%s]\n", key, key_provided ?
-+ "provided" : "default");
-+#ifdef _RTL8187_EXT_PATCH_
-+#if 0
-+{
-+ int j;
-+ for(j=0; j<MAX_MP; j++){
-+ crypt = &ieee->cryptlist[j]->crypt[key];
-+#else
-+ crypt = &ieee->cryptlist[0]->crypt[key];
-+#endif
-+#else
-+ crypt = &ieee->crypt[key];
-+#endif
-+ if (erq->flags & IW_ENCODE_DISABLED) {
-+ if (key_provided && *crypt) {
-+ IEEE80211_DEBUG_WX("Disabling encryption on key %d.\n",
-+ key);
-+ ieee80211_crypt_delayed_deinit(ieee, crypt);
-+ } else
-+ IEEE80211_DEBUG_WX("Disabling encryption.\n");
-+
-+ /* Check all the keys to see if any are still configured,
-+ * and if no key index was provided, de-init them all */
-+ for (i = 0; i < WEP_KEYS; i++) {
-+#ifdef _RTL8187_EXT_PATCH_
-+
-+ if (ieee->cryptlist[0]->crypt[i] != NULL){
-+#else
-+
-+ if (ieee->crypt[i] != NULL) {
-+#endif
-+ if (key_provided)
-+ break;
-+ ieee80211_crypt_delayed_deinit(
-+#ifdef _RTL8187_EXT_PATCH_
-+ ieee, &ieee->cryptlist[0]->crypt[i]);
-+#else
-+ ieee, &ieee->crypt[i]);
-+#endif
-+ }
-+ }
-+
-+ if (i == WEP_KEYS) {
-+ sec.enabled = 0;
-+ sec.level = SEC_LEVEL_0;
-+ sec.flags |= SEC_ENABLED | SEC_LEVEL;
-+ }
-+
-+ goto done;
-+ }
-+
-+
-+
-+ sec.enabled = 1;
-+ sec.flags |= SEC_ENABLED;
-+
-+ if (*crypt != NULL && (*crypt)->ops != NULL &&
-+ strcmp((*crypt)->ops->name, "WEP") != 0) {
-+ /* changing to use WEP; deinit previously used algorithm
-+ * on this key */
-+ ieee80211_crypt_delayed_deinit(ieee, crypt);
-+ }
-+
-+ if (*crypt == NULL) {
-+ struct ieee80211_crypt_data *new_crypt;
-+
-+ /* take WEP into use */
-+ new_crypt = kmalloc(sizeof(struct ieee80211_crypt_data),
-+ GFP_KERNEL);
-+ if (new_crypt == NULL)
-+ return -ENOMEM;
-+ memset(new_crypt, 0, sizeof(struct ieee80211_crypt_data));
-+ new_crypt->ops = ieee80211_get_crypto_ops("WEP");
-+ if (!new_crypt->ops) {
-+ request_module("ieee80211_crypt_wep");
-+ new_crypt->ops = ieee80211_get_crypto_ops("WEP");
-+ }
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
-+ if (new_crypt->ops && try_module_get(new_crypt->ops->owner))
-+#else
-+ if (new_crypt->ops && try_inc_mod_count(new_crypt->ops->owner))
-+#endif
-+ new_crypt->priv = new_crypt->ops->init(key);
-+
-+ if (!new_crypt->ops || !new_crypt->priv) {
-+ kfree(new_crypt);
-+ new_crypt = NULL;
-+
-+ printk(KERN_WARNING "%s: could not initialize WEP: "
-+ "load module ieee80211_crypt_wep\n",
-+ dev->name);
-+ return -EOPNOTSUPP;
-+ }
-+ *crypt = new_crypt;
-+ }
-+
-+ /* If a new key was provided, set it up */
-+ if (erq->length > 0) {
-+ len = erq->length <= 5 ? 5 : 13;
-+ memcpy(sec.keys[key], keybuf, erq->length);
-+ if (len > erq->length)
-+ memset(sec.keys[key] + erq->length, 0,
-+ len - erq->length);
-+ IEEE80211_DEBUG_WX("Setting key %d to '%s' (%d:%d bytes)\n",
-+ key, escape_essid(sec.keys[key], len),
-+ erq->length, len);
-+ sec.key_sizes[key] = len;
-+ (*crypt)->ops->set_key(sec.keys[key], len, NULL,
-+ (*crypt)->priv);
-+ sec.flags |= (1 << key);
-+ /* This ensures a key will be activated if no key is
-+ * explicitely set */
-+ if (key == sec.active_key)
-+ sec.flags |= SEC_ACTIVE_KEY;
-+
-+ ieee->tx_keyidx = key; //we need it to support multi_key setting. added by wb 2008_2_22
-+ } else {
-+ len = (*crypt)->ops->get_key(sec.keys[key], WEP_KEY_LEN,
-+ NULL, (*crypt)->priv);
-+ if (len == 0) {
-+ /* Set a default key of all 0 */
-+ IEEE80211_DEBUG_WX("Setting key %d to all zero.\n",
-+ key);
-+ memset(sec.keys[key], 0, 13);
-+ (*crypt)->ops->set_key(sec.keys[key], 13, NULL,
-+ (*crypt)->priv);
-+ sec.key_sizes[key] = 13;
-+ sec.flags |= (1 << key);
-+ }
-+
-+ /* No key data - just set the default TX key index */
-+ if (key_provided) {
-+ IEEE80211_DEBUG_WX(
-+ "Setting key %d to default Tx key.\n", key);
-+ ieee->tx_keyidx = key;
-+ sec.active_key = key;
-+ sec.flags |= SEC_ACTIVE_KEY;
-+ }
-+ }
-+#ifdef _RTL8187_EXT_PATCH_
-+#if 0
-+}
-+}
-+#endif
-+#endif
-+ done:
-+ ieee->open_wep = !(erq->flags & IW_ENCODE_RESTRICTED);
-+ sec.auth_mode = ieee->open_wep ? WLAN_AUTH_OPEN : WLAN_AUTH_SHARED_KEY;
-+ sec.flags |= SEC_AUTH_MODE;
-+ IEEE80211_DEBUG_WX("Auth: %s\n", sec.auth_mode == WLAN_AUTH_OPEN ?
-+ "OPEN" : "SHARED KEY");
-+
-+ /* For now we just support WEP, so only set that security level...
-+ * TODO: When WPA is added this is one place that needs to change */
-+ sec.flags |= SEC_LEVEL;
-+ sec.level = SEC_LEVEL_1; /* 40 and 104 bit WEP */
-+
-+ if (ieee->set_security)
-+ ieee->set_security(dev, &sec);
-+
-+ /* Do not reset port if card is in Managed mode since resetting will
-+ * generate new IEEE 802.11 authentication which may end up in looping
-+ * with IEEE 802.1X. If your hardware requires a reset after WEP
-+ * configuration (for example... Prism2), implement the reset_port in
-+ * the callbacks structures used to initialize the 802.11 stack. */
-+ if (ieee->reset_on_keychange &&
-+ ieee->iw_mode != IW_MODE_INFRA &&
-+ ieee->reset_port && ieee->reset_port(dev)) {
-+ printk(KERN_DEBUG "%s: reset_port failed\n", dev->name);
-+ return -EINVAL;
-+ }
-+ return 0;
-+}
-+
-+int ieee80211_wx_get_encode(struct ieee80211_device *ieee,
-+ struct iw_request_info *info,
-+ union iwreq_data *wrqu, char *keybuf)
-+{
-+ struct iw_point *erq = &(wrqu->encoding);
-+ int len, key;
-+ struct ieee80211_crypt_data *crypt;
-+
-+ IEEE80211_DEBUG_WX("GET_ENCODE\n");
-+
-+ if(ieee->iw_mode == IW_MODE_MONITOR)
-+ return -1;
-+
-+ key = erq->flags & IW_ENCODE_INDEX;
-+ if (key) {
-+ if (key > WEP_KEYS)
-+ return -EINVAL;
-+ key--;
-+ } else
-+ key = ieee->tx_keyidx;
-+#ifdef _RTL8187_EXT_PATCH_
-+ crypt = ieee->cryptlist[0]->crypt[key];
-+#else
-+ crypt = ieee->crypt[key];
-+#endif
-+ erq->flags = key + 1;
-+
-+ if (crypt == NULL || crypt->ops == NULL) {
-+ erq->length = 0;
-+ erq->flags |= IW_ENCODE_DISABLED;
-+ return 0;
-+ }
-+
-+ if (strcmp(crypt->ops->name, "WEP") != 0) {
-+ /* only WEP is supported with wireless extensions, so just
-+ * report that encryption is used */
-+ erq->length = 0;
-+ erq->flags |= IW_ENCODE_ENABLED;
-+ return 0;
-+ }
-+
-+ len = crypt->ops->get_key(keybuf, WEP_KEY_LEN, NULL, crypt->priv);
-+ erq->length = (len >= 0 ? len : 0);
-+
-+ erq->flags |= IW_ENCODE_ENABLED;
-+
-+ if (ieee->open_wep)
-+ erq->flags |= IW_ENCODE_OPEN;
-+ else
-+ erq->flags |= IW_ENCODE_RESTRICTED;
-+
-+ return 0;
-+}
-+
-+int ieee80211_wx_set_encode_ext(struct ieee80211_device *ieee,
-+ struct iw_request_info *info,
-+ union iwreq_data *wrqu, char *extra)
-+{
-+ struct net_device *dev = ieee->dev;
-+ struct iw_point *encoding = &wrqu->encoding;
-+ struct iw_encode_ext *ext = (struct iw_encode_ext *)extra;
-+ int i, idx, ret = 0;
-+ int group_key = 0;
-+ const char *alg, *module;
-+ struct ieee80211_crypto_ops *ops;
-+ struct ieee80211_crypt_data **crypt;
-+
-+ struct ieee80211_security sec = {
-+ .flags = 0,
-+ };
-+ //printk("======>encoding flag:%x,ext flag:%x, ext alg:%d\n", encoding->flags,ext->ext_flags, ext->alg);
-+ idx = encoding->flags & IW_ENCODE_INDEX;
-+ if (idx) {
-+ if (idx < 1 || idx > WEP_KEYS)
-+ return -EINVAL;
-+ idx--;
-+ } else
-+ idx = ieee->tx_keyidx;
-+
-+ if (ext->ext_flags & IW_ENCODE_EXT_GROUP_KEY) {
-+#ifdef _RTL8187_EXT_PATCH_
-+ crypt = &ieee->cryptlist[0]->crypt[idx];
-+#else
-+ crypt = &ieee->crypt[idx];
-+#endif
-+ group_key = 1;
-+ } else {
-+ /* some Cisco APs use idx>0 for unicast in dynamic WEP */
-+ //printk("not group key, flags:%x, ext->alg:%d\n", ext->ext_flags, ext->alg);
-+ if (idx != 0 && ext->alg != IW_ENCODE_ALG_WEP)
-+ return -EINVAL;
-+ if (ieee->iw_mode == IW_MODE_INFRA)
-+#ifdef _RTL8187_EXT_PATCH_
-+ crypt = &ieee->cryptlist[0]->crypt[idx];
-+#else
-+ crypt = &ieee->crypt[idx];
-+#endif
-+ else
-+ return -EINVAL;
-+ }
-+
-+ sec.flags |= SEC_ENABLED;// | SEC_ENCRYPT;
-+ if ((encoding->flags & IW_ENCODE_DISABLED) ||
-+ ext->alg == IW_ENCODE_ALG_NONE) {
-+ if (*crypt)
-+ ieee80211_crypt_delayed_deinit(ieee, crypt);
-+
-+ for (i = 0; i < WEP_KEYS; i++)
-+#ifdef _RTL8187_EXT_PATCH_
-+ if (ieee->cryptlist[0]->crypt[i] != NULL)
-+#else
-+ if (ieee->crypt[i] != NULL)
-+#endif
-+ break;
-+
-+ if (i == WEP_KEYS) {
-+ sec.enabled = 0;
-+ // sec.encrypt = 0;
-+ sec.level = SEC_LEVEL_0;
-+ sec.flags |= SEC_LEVEL;
-+ }
-+ //printk("disabled: flag:%x\n", encoding->flags);
-+ goto done;
-+ }
-+
-+ sec.enabled = 1;
-+ // sec.encrypt = 1;
-+#if 0
-+ if (group_key ? !ieee->host_mc_decrypt :
-+ !(ieee->host_encrypt || ieee->host_decrypt ||
-+ ieee->host_encrypt_msdu))
-+ goto skip_host_crypt;
-+#endif
-+ switch (ext->alg) {
-+ case IW_ENCODE_ALG_WEP:
-+ alg = "WEP";
-+ module = "ieee80211_crypt_wep";
-+ break;
-+ case IW_ENCODE_ALG_TKIP:
-+ alg = "TKIP";
-+ module = "ieee80211_crypt_tkip";
-+ break;
-+ case IW_ENCODE_ALG_CCMP:
-+ alg = "CCMP";
-+ module = "ieee80211_crypt_ccmp";
-+ break;
-+ default:
-+ IEEE80211_DEBUG_WX("%s: unknown crypto alg %d\n",
-+ dev->name, ext->alg);
-+ ret = -EINVAL;
-+ goto done;
-+ }
-+ printk("alg name:%s\n",alg);
-+
-+ ops = ieee80211_get_crypto_ops(alg);
-+ if (ops == NULL) {
-+ request_module(module);
-+ ops = ieee80211_get_crypto_ops(alg);
-+ }
-+ if (ops == NULL) {
-+ IEEE80211_DEBUG_WX("%s: unknown crypto alg %d\n",
-+ dev->name, ext->alg);
-+ printk("========>unknown crypto alg %d\n", ext->alg);
-+ ret = -EINVAL;
-+ goto done;
-+ }
-+
-+ if (*crypt == NULL || (*crypt)->ops != ops) {
-+ struct ieee80211_crypt_data *new_crypt;
-+
-+ ieee80211_crypt_delayed_deinit(ieee, crypt);
-+
-+ new_crypt = kzalloc(sizeof(*new_crypt), GFP_KERNEL);
-+ if (new_crypt == NULL) {
-+ ret = -ENOMEM;
-+ goto done;
-+ }
-+ new_crypt->ops = ops;
-+ if (new_crypt->ops && try_module_get(new_crypt->ops->owner))
-+ new_crypt->priv = new_crypt->ops->init(idx);
-+ if (new_crypt->priv == NULL) {
-+ kfree(new_crypt);
-+ ret = -EINVAL;
-+ goto done;
-+ }
-+ *crypt = new_crypt;
-+
-+ }
-+ //I need to deinit other crypt here in mesh mode instead deinit them while use them to tx&rx.
-+#ifdef _RTL8187_EXT_PATCH_
-+ if (ieee->iw_mode == ieee->iw_ext_mode)
-+ {
-+ int j;
-+ for (j=1; j<MAX_MP; j++)
-+ {
-+ struct ieee80211_crypt_data ** crypttmp = &ieee->cryptlist[j]->crypt[idx];
-+ if (*crypttmp == NULL)
-+ break;
-+ if (*crypttmp && (*crypttmp)->ops != ops)
-+ ieee80211_crypt_delayed_deinit(ieee, crypttmp);
-+ }
-+ }
-+#endif
-+ if (ext->key_len > 0 && (*crypt)->ops->set_key &&
-+ (*crypt)->ops->set_key(ext->key, ext->key_len, ext->rx_seq,
-+ (*crypt)->priv) < 0) {
-+ IEEE80211_DEBUG_WX("%s: key setting failed\n", dev->name);
-+ printk("key setting failed\n");
-+ ret = -EINVAL;
-+ goto done;
-+ }
-+#if 1
-+// skip_host_crypt:
-+ //printk("skip_host_crypt:ext_flags:%x\n", ext->ext_flags);
-+ if (ext->ext_flags & IW_ENCODE_EXT_SET_TX_KEY) {
-+ ieee->tx_keyidx = idx;
-+ sec.active_key = idx;
-+ sec.flags |= SEC_ACTIVE_KEY;
-+ }
-+
-+ if (ext->alg != IW_ENCODE_ALG_NONE) {
-+ memcpy(sec.keys[idx], ext->key, ext->key_len);
-+ sec.key_sizes[idx] = ext->key_len;
-+ sec.flags |= (1 << idx);
-+ if (ext->alg == IW_ENCODE_ALG_WEP) {
-+ // sec.encode_alg[idx] = SEC_ALG_WEP;
-+ sec.flags |= SEC_LEVEL;
-+ sec.level = SEC_LEVEL_1;
-+ } else if (ext->alg == IW_ENCODE_ALG_TKIP) {
-+ // sec.encode_alg[idx] = SEC_ALG_TKIP;
-+ sec.flags |= SEC_LEVEL;
-+ sec.level = SEC_LEVEL_2;
-+ } else if (ext->alg == IW_ENCODE_ALG_CCMP) {
-+ // sec.encode_alg[idx] = SEC_ALG_CCMP;
-+ sec.flags |= SEC_LEVEL;
-+ sec.level = SEC_LEVEL_3;
-+ }
-+ /* Don't set sec level for group keys. */
-+ if (group_key)
-+ sec.flags &= ~SEC_LEVEL;
-+ }
-+#endif
-+done:
-+ if (ieee->set_security)
-+ ieee->set_security(ieee->dev, &sec);
-+
-+ if (ieee->reset_on_keychange &&
-+ ieee->iw_mode != IW_MODE_INFRA &&
-+ ieee->reset_port && ieee->reset_port(dev)) {
-+ IEEE80211_DEBUG_WX("%s: reset_port failed\n", dev->name);
-+ return -EINVAL;
-+ }
-+
-+ return ret;
-+}
-+int ieee80211_wx_set_mlme(struct ieee80211_device *ieee,
-+ struct iw_request_info *info,
-+ union iwreq_data *wrqu, char *extra)
-+{
-+ struct iw_mlme *mlme = (struct iw_mlme *) extra;
-+// printk("\ndkgadfslkdjgalskdf===============>%s(), cmd:%x\n", __FUNCTION__, mlme->cmd);
-+#if 1
-+ switch (mlme->cmd) {
-+ case IW_MLME_DEAUTH:
-+ case IW_MLME_DISASSOC:
-+ // printk("disassoc now\n");
-+ ieee80211_disassociate(ieee);
-+ break;
-+ default:
-+ return -EOPNOTSUPP;
-+ }
-+#endif
-+ return 0;
-+}
-+
-+int ieee80211_wx_set_auth(struct ieee80211_device *ieee,
-+ struct iw_request_info *info,
-+ struct iw_param *data, char *extra)
-+{
-+/*
-+ struct ieee80211_security sec = {
-+ .flags = SEC_AUTH_MODE,
-+ }
-+*/
-+ //printk("set auth:flag:%x, data value:%x\n", data->flags, data->value);
-+ switch (data->flags & IW_AUTH_INDEX) {
-+ case IW_AUTH_WPA_VERSION:
-+ /*need to support wpa2 here*/
-+ //printk("wpa version:%x\n", data->value);
-+ break;
-+ case IW_AUTH_CIPHER_PAIRWISE:
-+ case IW_AUTH_CIPHER_GROUP:
-+ case IW_AUTH_KEY_MGMT:
-+ /*
-+ * * Host AP driver does not use these parameters and allows
-+ * * wpa_supplicant to control them internally.
-+ * */
-+ break;
-+ case IW_AUTH_TKIP_COUNTERMEASURES:
-+ ieee->tkip_countermeasures = data->value;
-+ break;
-+ case IW_AUTH_DROP_UNENCRYPTED:
-+ ieee->drop_unencrypted = data->value;
-+ break;
-+
-+ case IW_AUTH_80211_AUTH_ALG:
-+ ieee->open_wep = (data->value&IW_AUTH_ALG_OPEN_SYSTEM)?1:0;
-+ //printk("open_wep:%d\n", ieee->open_wep);
-+ break;
-+
-+#if 1
-+ case IW_AUTH_WPA_ENABLED:
-+ ieee->wpa_enabled = (data->value)?1:0;
-+ //printk("enalbe wpa:%d\n", ieee->wpa_enabled);
-+ break;
-+
-+#endif
-+ case IW_AUTH_RX_UNENCRYPTED_EAPOL:
-+ ieee->ieee802_1x = data->value;
-+ break;
-+ case IW_AUTH_PRIVACY_INVOKED:
-+ ieee->privacy_invoked = data->value;
-+ break;
-+ default:
-+ return -EOPNOTSUPP;
-+ }
-+ return 0;
-+}
-+
-+#if 1
-+int ieee80211_wx_set_gen_ie(struct ieee80211_device *ieee, u8 *ie, size_t len)
-+{
-+#if 0
-+ printk("====>%s()\n", __FUNCTION__);
-+ {
-+ int i;
-+ for (i=0; i<len; i++)
-+ printk("%2x ", ie[i]&0xff);
-+ printk("\n");
-+ }
-+#endif
-+ u8 *buf = NULL;
-+
-+ if (len>MAX_WPA_IE_LEN || (len && ie == NULL))
-+ {
-+ // printk("return error out, len:%d\n", len);
-+ return -EINVAL;
-+ }
-+ if (len)
-+ {
-+
-+ if (len != ie[1]+2) printk("len:%d, ie:%d\n", (int)len, ie[1]);
-+ buf = kmalloc(len, GFP_KERNEL);
-+ if (buf == NULL)
-+ return -ENOMEM;
-+ memcpy(buf, ie, len);
-+ kfree(ieee->wpa_ie);
-+ ieee->wpa_ie = buf;
-+ ieee->wpa_ie_len = len;
-+ }
-+ else{
-+ if (ieee->wpa_ie)
-+ kfree(ieee->wpa_ie);
-+ ieee->wpa_ie = NULL;
-+ ieee->wpa_ie_len = 0;
-+ }
-+// printk("<=====out %s()\n", __FUNCTION__);
-+
-+ return 0;
-+
-+}
-+#endif
-+
-+EXPORT_SYMBOL(ieee80211_wx_set_gen_ie);
-+EXPORT_SYMBOL(ieee80211_wx_set_mlme);
-+EXPORT_SYMBOL(ieee80211_wx_set_auth);
-+EXPORT_SYMBOL(ieee80211_wx_set_encode_ext);
-+EXPORT_SYMBOL(ieee80211_wx_get_scan);
-+EXPORT_SYMBOL(ieee80211_wx_set_encode);
-+EXPORT_SYMBOL(ieee80211_wx_get_encode);
-+#if 0
-+EXPORT_SYMBOL_NOVERS(ieee80211_wx_get_scan);
-+EXPORT_SYMBOL_NOVERS(ieee80211_wx_set_encode);
-+EXPORT_SYMBOL_NOVERS(ieee80211_wx_get_encode);
-+#endif
-diff -Nur linux-2.6.30.5.orig/drivers/net/wireless/rtl8187b/ieee80211/internal.h linux-2.6.30.5/drivers/net/wireless/rtl8187b/ieee80211/internal.h
---- linux-2.6.30.5.orig/drivers/net/wireless/rtl8187b/ieee80211/internal.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.30.5/drivers/net/wireless/rtl8187b/ieee80211/internal.h 2009-08-23 19:01:04.000000000 +0200
-@@ -0,0 +1,115 @@
-+/*
-+ * Cryptographic API.
-+ *
-+ * Copyright (c) 2002 James Morris <jmorris@intercode.com.au>
-+ *
-+ * 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.
-+ *
-+ */
-+#ifndef _CRYPTO_INTERNAL_H
-+#define _CRYPTO_INTERNAL_H
-+
-+
-+//#include <linux/crypto.h>
-+#include "rtl_crypto.h"
-+#include <linux/mm.h>
-+#include <linux/highmem.h>
-+#include <linux/init.h>
-+#include <asm/hardirq.h>
-+#include <asm/softirq.h>
-+#include <asm/kmap_types.h>
-+
-+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,4,20))
-+#define list_for_each_entry(pos, head, member) \
-+ for (pos = list_entry((head)->next, typeof(*pos), member), \
-+ prefetch(pos->member.next); \
-+ &pos->member != (head); \
-+ pos = list_entry(pos->member.next, typeof(*pos), member), \
-+ prefetch(pos->member.next))
-+
-+static inline void cond_resched(void)
-+{
-+ if (need_resched()) {
-+ set_current_state(TASK_RUNNING);
-+ schedule();
-+ }
-+}
-+#endif
-+
-+extern enum km_type crypto_km_types[];
-+
-+static inline enum km_type crypto_kmap_type(int out)
-+{
-+ return crypto_km_types[(in_softirq() ? 2 : 0) + out];
-+}
-+
-+static inline void *crypto_kmap(struct page *page, int out)
-+{
-+ return kmap_atomic(page, crypto_kmap_type(out));
-+}
-+
-+static inline void crypto_kunmap(void *vaddr, int out)
-+{
-+ kunmap_atomic(vaddr, crypto_kmap_type(out));
-+}
-+
-+static inline void crypto_yield(struct crypto_tfm *tfm)
-+{
-+ if (!in_softirq())
-+ cond_resched();
-+}
-+
-+static inline void *crypto_tfm_ctx(struct crypto_tfm *tfm)
-+{
-+ return (void *)&tfm[1];
-+}
-+
-+struct crypto_alg *crypto_alg_lookup(const char *name);
-+
-+#ifdef CONFIG_KMOD
-+void crypto_alg_autoload(const char *name);
-+struct crypto_alg *crypto_alg_mod_lookup(const char *name);
-+#else
-+static inline struct crypto_alg *crypto_alg_mod_lookup(const char *name)
-+{
-+ return crypto_alg_lookup(name);
-+}
-+#endif
-+
-+#ifdef CONFIG_CRYPTO_HMAC
-+int crypto_alloc_hmac_block(struct crypto_tfm *tfm);
-+void crypto_free_hmac_block(struct crypto_tfm *tfm);
-+#else
-+static inline int crypto_alloc_hmac_block(struct crypto_tfm *tfm)
-+{
-+ return 0;
-+}
-+
-+static inline void crypto_free_hmac_block(struct crypto_tfm *tfm)
-+{ }
-+#endif
-+
-+#ifdef CONFIG_PROC_FS
-+void __init crypto_init_proc(void);
-+#else
-+static inline void crypto_init_proc(void)
-+{ }
-+#endif
-+
-+int crypto_init_digest_flags(struct crypto_tfm *tfm, u32 flags);
-+int crypto_init_cipher_flags(struct crypto_tfm *tfm, u32 flags);
-+int crypto_init_compress_flags(struct crypto_tfm *tfm, u32 flags);
-+
-+int crypto_init_digest_ops(struct crypto_tfm *tfm);
-+int crypto_init_cipher_ops(struct crypto_tfm *tfm);
-+int crypto_init_compress_ops(struct crypto_tfm *tfm);
-+
-+void crypto_exit_digest_ops(struct crypto_tfm *tfm);
-+void crypto_exit_cipher_ops(struct crypto_tfm *tfm);
-+void crypto_exit_compress_ops(struct crypto_tfm *tfm);
-+
-+#endif /* _CRYPTO_INTERNAL_H */
-+
-diff -Nur linux-2.6.30.5.orig/drivers/net/wireless/rtl8187b/ieee80211/kmap_types.h linux-2.6.30.5/drivers/net/wireless/rtl8187b/ieee80211/kmap_types.h
---- linux-2.6.30.5.orig/drivers/net/wireless/rtl8187b/ieee80211/kmap_types.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.30.5/drivers/net/wireless/rtl8187b/ieee80211/kmap_types.h 2009-08-23 19:01:04.000000000 +0200
-@@ -0,0 +1,20 @@
-+#ifndef __KMAP_TYPES_H
-+
-+#define __KMAP_TYPES_H
-+
-+
-+enum km_type {
-+ KM_BOUNCE_READ,
-+ KM_SKB_SUNRPC_DATA,
-+ KM_SKB_DATA_SOFTIRQ,
-+ KM_USER0,
-+ KM_USER1,
-+ KM_BH_IRQ,
-+ KM_SOFTIRQ0,
-+ KM_SOFTIRQ1,
-+ KM_TYPE_NR
-+};
-+
-+#define _ASM_KMAP_TYPES_H
-+
-+#endif
-diff -Nur linux-2.6.30.5.orig/drivers/net/wireless/rtl8187b/ieee80211/readme linux-2.6.30.5/drivers/net/wireless/rtl8187b/ieee80211/readme
---- linux-2.6.30.5.orig/drivers/net/wireless/rtl8187b/ieee80211/readme 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.30.5/drivers/net/wireless/rtl8187b/ieee80211/readme 2009-08-23 19:01:04.000000000 +0200
-@@ -0,0 +1,162 @@
-+What this layer should do
-+
-+- It mantain the old mechanism as alternative, so the
-+ ipw2100 driver works with really few changes.
-+- Encapsulate / Decapsulate ieee80211 packet
-+- Handle fragmentation
-+- Optionally provide an alterantive mechanism for netif queue stop/wake,
-+ so that the ieee80211 layer will pass one fragment per time instead of
-+ one txb struct per time. so the driver can stop the queue in the middle
-+ of a packet.
-+- Provide two different TX interfaces for cards that can handle management
-+ frames on one HW queue, and data on another, and for cards that have only
-+ one HW queue (the latter untested and very, very rough).
-+- Optionally provide the logic for handling IBSS/MASTER/MONITOR/BSS modes
-+ and for the channel, essid and wap get/set wireless extension requests.
-+ so that the driver has only to change channel when the ieee stack tell it.
-+- Optionally provide a scanning mechanism so that the driver has not to
-+ worry about this, just implement the set channel calback and pass
-+ frames to the upper layer
-+- Optionally provide the bss client protocol handshaking (just with open
-+ authentication)
-+- Optionally provide the probe request send mechanism
-+- Optionally provide the bss master mode logic to handle association
-+ protocol (only open authentication) and probe responses.
-+- SW wep encryption (with open authentication)
-+- It collects some stats
-+- It provides beacons to the card when it ask for them
-+
-+What this layer doesn't do (yet)
-+- Perform shared authentication
-+- Have full support for master mode (the AP should loop back in the air
-+ frames from an associated client to another. This could be done easily
-+ with few lines of code, and it is done in my previous version of the
-+ stach, but a table of association must be keept and a disassociation
-+ policy must be decided and implemented.
-+- Handle cleanly the full ieee 802.11 protocol. In AP mode it never
-+ disassociate clients, and it is really prone to always allow access.
-+ In bss client mode it is a bit rough with AP deauth and disassoc requests.
-+- It has not any entry point to view the collected stats.
-+- Altought it takes care of the card supported rates in the management frame
-+ it sends, support for rate changing on TXed packet is not complete.
-+- Give up once associated in bss client mode (it never detect a
-+ signal loss condition to disassociate and restart scanning)
-+- Provide a mechanism for enabling the TX in monitor mode, so
-+ userspace programs can TX raw packets.
-+- Provide a mechanism for cards that need that the SW take care of beacon
-+ TX completely, in sense that the SW has to enqueue by itself beacons
-+ to the card so it TX them (if any...)
-+APIs
-+
-+Callback functions in the original stack has been mantained.
-+following has been added (from ieee80211.h)
-+
-+ /* Softmac-generated frames (mamagement) are TXed via this
-+ * callback if the flag IEEE_SOFTMAC_SINGLE_QUEUE is
-+ * not set. As some cards may have different HW queues that
-+ * one might want to use for data and management frames
-+ * the option to have two callbacks might be useful.
-+ * This fucntion can't sleep.
-+ */
-+ int (*softmac_hard_start_xmit)(struct sk_buff *skb,
-+ struct net_device *dev);
-+
-+ /* used instead of hard_start_xmit (not softmac_hard_start_xmit)
-+ * if the IEEE_SOFTMAC_TX_QUEUE feature is used to TX data
-+ * frames. I the option IEEE_SOFTMAC_SINGLE_QUEUE is also set
-+ * then also management frames are sent via this callback.
-+ * This function can't sleep.
-+ */
-+ void (*softmac_data_hard_start_xmit)(struct sk_buff *skb,
-+ struct net_device *dev);
-+
-+ /* stops the HW queue for DATA frames. Useful to avoid
-+ * waste time to TX data frame when we are reassociating
-+ * This function can sleep.
-+ */
-+ void (*data_hard_stop)(struct net_device *dev);
-+
-+ /* OK this is complementar to data_poll_hard_stop */
-+ void (*data_hard_resume)(struct net_device *dev);
-+
-+ /* ask to the driver to retune the radio .
-+ * This function can sleep. the driver should ensure
-+ * the radio has been swithced before return.
-+ */
-+ void (*set_chan)(struct net_device *dev,short ch);
-+
-+ /* These are not used if the ieee stack takes care of
-+ * scanning (IEEE_SOFTMAC_SCAN feature set).
-+ * In this case only the set_chan is used.
-+ *
-+ * The syncro version is similar to the start_scan but
-+ * does not return until all channels has been scanned.
-+ * this is called in user context and should sleep,
-+ * it is called in a work_queue when swithcing to ad-hoc mode
-+ * or in behalf of iwlist scan when the card is associated
-+ * and root user ask for a scan.
-+ * the fucntion stop_scan should stop both the syncro and
-+ * background scanning and can sleep.
-+ * The fucntion start_scan should initiate the background
-+ * scanning and can't sleep.
-+ */
-+ void (*scan_syncro)(struct net_device *dev);
-+ void (*start_scan)(struct net_device *dev);
-+ void (*stop_scan)(struct net_device *dev);
-+
-+ /* indicate the driver that the link state is changed
-+ * for example it may indicate the card is associated now.
-+ * Driver might be interested in this to apply RX filter
-+ * rules or simply light the LINK led
-+ */
-+ void (*link_change)(struct net_device *dev);
-+
-+Functions hard_data_[resume/stop] are optional and should not be used
-+if the driver decides to uses data+management frames enqueue in a
-+single HQ queue (thus using just the softmac_hard_data_start_xmit
-+callback).
-+
-+Function that the driver can use are:
-+
-+ieee80211_get_beacon - this is called by the driver when
-+ the HW needs a beacon.
-+ieee80211_softmac_start_protocol - this should normally be called in the
-+ driver open function
-+ieee80211_softmac_stop_protocol - the opposite of the above
-+ieee80211_wake_queue - this is similar to netif_wake_queue
-+ieee80211_reset_queue - this throw away fragments pending(if any)
-+ieee80211_stop_queue - this is similar to netif_stop_queue
-+
-+
-+known BUGS:
-+- When performing syncro scan (possiblily when swithcing to ad-hoc mode
-+ and when running iwlist scan when associated) there is still an odd
-+ behaviour.. I have not looked in this more accurately (yet).
-+
-+locking:
-+locking is done by means of three structures.
-+1- ieee->lock (by means of spin_[un]lock_irq[save/restore]
-+2- ieee->wx_sem
-+3- ieee->scan_sem
-+
-+the lock 1 is what protect most of the critical sections in the ieee stack.
-+the lock 2 is used to avoid that more than one of the SET wireless extension
-+handlers (as well as start/stop protocol function) are running at the same time.
-+the lock 1 is used when we need to modify or read the shared data in the wx handlers.
-+In other words the lock 2 will prevent one SET action will run across another SET
-+action (by make sleep the 2nd one) but allow GET actions, while the lock 1
-+make atomic those little shared data access in both GET and SET operation.
-+So get operation will be never be delayed really: they will never sleep..
-+Furthermore in the top of some SET operations a flag is set before acquiring
-+the lock. This is an help to make the previous running SET operation to
-+finish faster if needed (just in case the second one will totally undo the
-+first, so there is not need to complete the 1st really.. ).
-+The background scanning mechaninsm is protected by the lock 1 except for the
-+workqueue. this wq is here just to let the set_chan callback sleep (I thinked it
-+might be appreciated by USB network card driver developer). In this case the lock 3
-+take its turn.
-+Thus the stop function needs both the locks.
-+Funny in the syncro scan the lock 2 play its role (as both the syncro_scan
-+function and the stop scan function are called with this semaphore held).
-+
-+
-diff -Nur linux-2.6.30.5.orig/drivers/net/wireless/rtl8187b/ieee80211/rtl8187_mesh.h linux-2.6.30.5/drivers/net/wireless/rtl8187b/ieee80211/rtl8187_mesh.h
---- linux-2.6.30.5.orig/drivers/net/wireless/rtl8187b/ieee80211/rtl8187_mesh.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.30.5/drivers/net/wireless/rtl8187b/ieee80211/rtl8187_mesh.h 2009-08-23 19:01:04.000000000 +0200
-@@ -0,0 +1,282 @@
-+#ifndef _RTL8187_MESH_H_
-+#define _RTL8187_MESH_H_
-+
-+#include "msh_class.h" // struct mshclass
-+#include "mesh.h" // struct MESH-Neighbor-Entry
-+#include "ieee80211.h" // struct ieee80211-network
-+#include "mesh_8185_util.h" // DOT11-QUEUE
-+#include "hash_table.h" // hash-table
-+#include "8185s_pathsel.h"
-+#include <linux/list.h>
-+
-+#define GET_MESH_PRIV(x) ((struct mshclass_priv *)(x->priv))
-+
-+struct ieee80211_hdr_mesh {
-+ u16 frame_ctl;
-+ u16 duration_id;
-+ u8 addr1[ETH_ALEN];
-+ u8 addr2[ETH_ALEN];
-+ u8 addr3[ETH_ALEN];
-+ u16 seq_ctl;
-+ u8 addr4[ETH_ALEN];
-+ unsigned char mesh_flag;
-+ INT8 TTL;
-+ UINT16 segNum;
-+ unsigned char DestMACAddr[ETH_ALEN]; // modify for 6 address
-+ unsigned char SrcMACAddr[ETH_ALEN];
-+} __attribute__ ((packed));
-+
-+struct myMeshIDNode {
-+ struct list_head list;
-+ char id[MESH_ID_LEN+1];
-+ short popEN;
-+ char tried;
-+ unsigned long expire;
-+ struct ieee80211_network mesh_network;
-+};
-+
-+struct ieee80211_hdr_mesh_QOS {
-+ u16 frame_ctl;
-+ u16 duration_id;
-+ u8 addr1[ETH_ALEN];
-+ u8 addr2[ETH_ALEN];
-+ u8 addr3[ETH_ALEN];
-+ u16 seq_ctl;
-+ u8 addr4[ETH_ALEN];
-+ u16 QOS_ctl;
-+ unsigned char mesh_flag;
-+ INT8 TTL;
-+ UINT16 segNum;
-+ unsigned char DestMACAddr[ETH_ALEN]; // modify for 6 address
-+ unsigned char SrcMACAddr[ETH_ALEN];
-+} __attribute__ ((packed));
-+
-+
-+struct mesh_PeerEntry {
-+ // based on 8185ag.h
-+ struct list_head hash_list;
-+ unsigned int used; ///< used == TRUE => has been allocated, \n used == FALSE => can be allocated
-+ unsigned char hwaddr[MACADDRLEN]; ///< hardware address
-+
-+ // struct list_head mesh_unEstablish_ptr; // ©|¥¼(©Î±q¤w³s½u -> ¥¼³s½u) ¤§ MP list
-+ struct list_head mesh_mp_ptr; // MP list
-+
-+ /*mesh_neighbor:
-+ * Inited by "Neighbor Discovering"
-+ * cleaned by "Disassociation" or "Expired"
-+ */
-+ struct MESH_Neighbor_Entry mesh_neighbor_TBL;
-+
-+ struct ieee80211_network * pstat; // a backward pointer
-+
-+ // 802.11 seq checking
-+ u16 last_rxseq; /* rx seq previous per-tid */
-+ u16 last_rxfrag;/* tx frag previous per-tid */
-+ unsigned long last_time;
-+ //
-+};
-+
-+
-+struct mshclass_priv {
-+
-+ struct mesh_PeerEntry *meshEntries; // 1-to-1 for priv->ieee80211->networks
-+
-+ spinlock_t lock_stainfo; // lock for accessing the data structure of stat info
-+ spinlock_t lock_queue; // lock for DOT11_EnQueue2/DOT11_DeQueue2/enque/dequeue
-+ spinlock_t lock_Rreq; // lock for rreq_retry. Some function like aodv_expire/tx use lock_queue simultaneously
-+// spinlock_t lock_meshlist;
-+
-+ // struct _DOT11_QUEUE *pevent_queue; ///< 802.11 QUEUEµ²ºc
-+ // struct hash_table *pathsel_table; // GANTOE
-+ //tsananiu
-+ struct _DOT11_QUEUE *pathsel_queue; ///< 802.11 QUEUEµ²ºc
-+
-+ //tsananiu end
-+
-+ //add by shlu 20070518
-+ unsigned char RreqMAC[AODV_RREQ_TABLE_SIZE][6];
-+ unsigned int RreqBegin;
-+ unsigned int RreqEnd;
-+
-+#if defined(MESH_ROLE_ROOT) || defined(MESH_ROLE_PORTAL)
-+#define MAX_SZ_BAD_MAC 3
-+ unsigned char BadMac[MAX_SZ_BAD_MAC][MACADDRLEN];
-+ int idx_BadMac;
-+#endif // MESH_ROLE_ROOT || MESH_ROLE_PORTAL
-+
-+ //-------------
-+ unsigned char root_mac[MACADDRLEN];
-+ struct mesh_info dot11MeshInfo; // extrated from wifi_mib (ieee802_mib.h)
-+ struct hash_table *proxy_table, *mesh_rreq_retry_queue; //GANTOE //GANTOE
-+ struct hash_table *pathsel_table; // add by chuangch 2007.09.13
-+ // add by Jason
-+ struct mpp_tb *pann_mpp_tb;
-+
-+ struct timer_list expire_timer; // 1sec timer
-+
-+ struct timer_list beacon_timer; // 1sec timer
-+ struct list_head stat_hash[MAX_NETWORK_COUNT]; // sta_info hash table (aid_obj)
-+
-+ struct list_head meshList[MAX_CHANNEL_NUMBER];
-+ int scanMode;
-+
-+ struct {
-+ struct ieee80211_network *pstat;
-+ unsigned char hwaddr[MACADDRLEN];
-+ } stainfo_cache;
-+
-+ // The following elements are used by 802.11s.
-+ // For copyright-pretection, we use an independent (binary) module.
-+ // Note that it can also be put either under r8180_priv or ieee80211_device. The adv of put under
-+ // r8180_priv is to get "higher encapsulation". On the other hand, r8180_priv was originally designed
-+ // for "hardward specific."
-+ char mesh_mac_filter_allow[8][13];
-+ char mesh_mac_filter_deny[8][13];
-+
-+ struct MESH_Share meshare; // mesh share data
-+
-+ struct {
-+
-+ int prev_iw_mode; // Save this->iw_mode for r8180_wx->r8180_wx_enable_mesh. No init requirement
-+
-+ struct MESH_Profile mesh_profile; // contains MESHID
-+
-+ struct mesh_info dot11MeshInfo; // contains meshMaxAssocNum
-+
-+ struct net_device_stats mesh_stats;
-+
-+ UINT8 mesh_Version; // ¨Ï¥Îªºª©¥»
-+ // WLAN Mesh Capability
-+ INT16 mesh_PeerCAP_cap; // peer capability-Cap number (¦³¸¹¼Æ)
-+ UINT8 mesh_PeerCAP_flags; // peer capability-flags
-+ UINT8 mesh_PowerSaveCAP; // Power Save capability
-+ UINT8 mesh_SyncCAP; // Synchronization capability
-+ UINT8 mesh_MDA_CAP; // MDA capability
-+ UINT32 mesh_ChannelPrecedence; // Channel Precedence
-+
-+ // neighbor -> candidate neighbor, if mesh_available_peerlink > 0, page 56, D0.02
-+ UINT8 mesh_AvailablePeerLink; // ¦¹¬O§_¦³»Ý­n?(¦]¥¦µ¥¦P©ó mesh_PeerCAP)=>¼È ®É«O ¯d
-+
-+ UINT8 mesh_HeaderFlags; // mesh header ¤ºªº mesh flags field
-+
-+ // MKD domain element [MKDDIE]
-+ UINT8 mesh_MKD_DomainID[6];
-+ UINT8 mesh_MKDDIE_SecurityConfiguration;
-+
-+ // EMSA Handshake element [EMSAIE]
-+ UINT8 mesh_EMSAIE_ANonce[32];
-+ UINT8 mesh_EMSAIE_SNonce[32];
-+ UINT8 mesh_EMSAIE_MA_ID[6];
-+ UINT16 mesh_EMSAIE_MIC_Control;
-+ UINT8 mesh_EMSAIE_MIC[16];
-+
-+ struct timer_list mesh_peer_link_timer; ///< ¹ï©|¥¼³s ½u(»P³s½u°h¦Ü¥¼³s½u) MP mesh_unEstablish_hdr §@ peer link time out
-+
-+// struct timer_list mesh_beacon_timer;
-+ // mesh_unEstablish_hdr:
-+ // It is a list structure, only stores unEstablish (or Establish -> unEstablish [MP_HOLDING])MP entry
-+ // Each entry is a pointer pointing to an entry in "stat_info->mesh_mp_ptr"
-+ // and removed by successful "Peer link setup" or "Expired"
-+ struct list_head mesh_unEstablish_hdr;
-+
-+ // mesh_mp_hdr:
-+ // It is a list of MP/MAP/MPP who has already passed "Peer link setup"
-+ // Each entry is a pointer pointing to an entry in "stat_info->mesh_mp_ptr"
-+ // Every entry is inserted by "successful peer link setup"
-+ // and removed by "Expired"
-+ struct list_head mesh_mp_hdr;
-+
-+ } mesh;
-+
-+ int iCurChannel; // remember the working channel
-+};
-+
-+// Stanley, 04/23/07
-+// The following mode is used by ieee80211_device->iw_mode
-+// Although it is better to put the definition under linux/wireless.h (or wireless_copy.h), it is a system file
-+// that we shouldn't modify directly.
-+#define IW_MODE_MESH 11 /* 802.11s mesh mode */
-+
-+// Default MESHID
-+#define IEEE80211S_DEFAULT_MESHID "802.11s"
-+
-+// callback for 802.11s
-+extern short rtl8187_patch_ieee80211_probe_req_1 (struct ieee80211_device *ieee);
-+extern u8* rtl8187_patch_ieee80211_probe_req_2 (struct ieee80211_device *ieee, struct sk_buff *skb, u8 *tag);
-+
-+// wx
-+extern int rtl8187_patch_r8180_wx_get_meshinfo(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra);
-+extern int rtl8187_patch_r8180_wx_enable_mesh(struct net_device *dev);
-+extern int rtl8187_patch_r8180_wx_disable_mesh(struct net_device *dev);
-+extern int rtl8187_patch_r8180_wx_wx_set_meshID(struct net_device *dev, char *ext,unsigned char channel);
-+extern void rtl8187_patch_r8180_wx_set_channel (struct ieee80211_device *ieee, int ch);
-+extern int rtl8187_patch_r8180_wx_set_add_mac_allow(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra);
-+extern int rtl8187_patch_r8180_wx_set_del_mac_allow(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra);
-+extern int rtl8187_patch_r8180_wx_set_add_mac_deny(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra);
-+extern int rtl8187_patch_r8180_wx_set_del_mac_deny(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra);
-+extern int rtl8187_patch_r8180_wx_get_mac_allow(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra);
-+extern int rtl8187_patch_r8180_wx_get_mac_deny(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra);
-+
-+extern int rtl8187_patch_r8180_wx_get_mesh_list(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra);
-+extern int rtl8187_patch_r8180_wx_mesh_scan(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra);
-+extern int rtl8187_patch_r8180_wx_get_selected_mesh(struct net_device *dev, int en, char *cho, char* id);
-+//by amy for networkmanager UI
-+extern int rtl8187_patch_r8180_wx_get_selected_mesh_channel(struct net_device *dev, char *extmeshid, char *cho);
-+//by amy for networkmanager UI
-+// osdep
-+extern int rtl8187_patch_ieee80211_start_protocol (struct ieee80211_device *ieee);
-+extern u8 rtl8187_patch_rtl8180_up(struct mshclass *priv);
-+extern void rtl8187_patch_ieee80211_stop_protocol(struct ieee80211_device *ieee);
-+
-+// issue_assocreq_MP
-+extern void rtl8187_patch_ieee80211_association_req_1 (struct ieee80211_assoc_request_frame *hdr);
-+extern u8* rtl8187_patch_ieee80211_association_req_2 (struct ieee80211_device *ieee, struct ieee80211_network *pstat, struct sk_buff *skb);
-+
-+// OnAssocReq_MP
-+extern int rtl8187_patch_ieee80211_rx_frame_softmac_on_assoc_req (struct ieee80211_device *ieee, struct sk_buff *skb);
-+
-+// issue_assocrsp_MP
-+extern void rtl8187_patch_ieee80211_assoc_resp_by_net_1 (struct ieee80211_assoc_response_frame *assoc);
-+u8* rtl8187_patch_ieee80211_assoc_resp_by_net_2 (struct ieee80211_device *ieee, struct ieee80211_network *pstat, int pkt_type, struct sk_buff *skb);
-+
-+// OnAssocRsp_MP
-+extern int rtl8187_patch_ieee80211_rx_frame_softmac_on_assoc_rsp (struct ieee80211_device *ieee, struct sk_buff *skb);
-+
-+
-+extern int rtl8187_patch_ieee80211_rx_frame_softmac_on_auth(struct ieee80211_device *ieee, struct sk_buff *skb, struct ieee80211_rx_stats *rx_stats);
-+extern int rtl8187_patch_ieee80211_rx_frame_softmac_on_deauth(struct ieee80211_device *ieee, struct sk_buff *skb, struct ieee80211_rx_stats *rx_stats);
-+extern unsigned int rtl8187_patch_ieee80211_process_probe_response_1( struct ieee80211_device *ieee, struct ieee80211_probe_response *beacon, struct ieee80211_rx_stats *stats);
-+extern void rtl8187_patch_ieee80211_rx_mgt_on_probe_req( struct ieee80211_device *ieee, struct ieee80211_probe_request *beacon, struct ieee80211_rx_stats *stats);
-+extern void rtl8187_patch_ieee80211_rx_mgt_update_expire ( struct ieee80211_device *ieee, struct sk_buff *skb);
-+
-+// set channel
-+extern int rtl8187_patch_ieee80211_ext_stop_scan_wq_set_channel (struct ieee80211_device *ieee);
-+
-+// on rx (rx isr)
-+extern int rtl8187_patch_ieee80211_rx_on_rx (struct ieee80211_device *ieee, struct sk_buff *skb, struct ieee80211_rx_stats *rx_stats, u16 type, u16 stype);
-+
-+// r8187_core
-+// handle ioctl
-+extern int rtl8187_patch_rtl8180_ioctl(struct net_device *dev, struct ifreq *rq, int cmd);
-+// create proc
-+extern void rtl8187_patch_create_proc(struct r8180_priv *priv);
-+extern void rtl8187_patch_remove_proc(struct r8180_priv *priv);
-+
-+// tx, xmit
-+// locked by ieee->lock. Call ieee80211_softmac_xmit afterward
-+extern struct ieee80211_txb* rtl8187_patch_ieee80211_xmit (struct sk_buff *skb, struct net_device *dev);
-+
-+// given a skb, output header's length
-+extern int rtl8187_patch_ieee80211_rx_frame_get_hdrlen (struct ieee80211_device *ieee, struct sk_buff *skb);
-+
-+// check the frame control field, return 0: not accept, 1: accept
-+extern int rtl8187_patch_ieee80211_rx_is_valid_framectl (struct ieee80211_device *ieee, u16 fc, u16 type, u16 stype);
-+
-+// process_dataframe
-+extern int rtl8187_patch_ieee80211_rx_process_dataframe (struct ieee80211_device *ieee, struct sk_buff *skb, struct ieee80211_rx_stats *rx_stats);
-+
-+extern int rtl8187_patch_is_duplicate_packet (struct ieee80211_device *ieee, struct ieee80211_hdr *header, u16 type, u16 stype);
-+
-+extern int rtl8187_patch_ieee80211_softmac_xmit_get_rate (struct ieee80211_device *ieee, struct sk_buff *skb);
-+extern void ieee80211_start_mesh(struct ieee80211_device *ieee);
-+#endif // _RTL8187_MESH_H_
-diff -Nur linux-2.6.30.5.orig/drivers/net/wireless/rtl8187b/ieee80211/rtl_crypto.h linux-2.6.30.5/drivers/net/wireless/rtl8187b/ieee80211/rtl_crypto.h
---- linux-2.6.30.5.orig/drivers/net/wireless/rtl8187b/ieee80211/rtl_crypto.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.30.5/drivers/net/wireless/rtl8187b/ieee80211/rtl_crypto.h 2009-08-23 19:01:04.000000000 +0200
-@@ -0,0 +1,399 @@
-+/*
-+ * Scatterlist Cryptographic API.
-+ *
-+ * Copyright (c) 2002 James Morris <jmorris@intercode.com.au>
-+ * Copyright (c) 2002 David S. Miller (davem@redhat.com)
-+ *
-+ * Portions derived from Cryptoapi, by Alexander Kjeldaas <astor@fast.no>
-+ * and Nettle, by Niels Mé°ˆler.
-+ *
-+ * 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.
-+ *
-+ */
-+#ifndef _LINUX_CRYPTO_H
-+#define _LINUX_CRYPTO_H
-+
-+#include <linux/module.h>
-+#include <linux/kernel.h>
-+#include <linux/types.h>
-+#include <linux/list.h>
-+#include <linux/string.h>
-+#include <asm/page.h>
-+#include <asm/errno.h>
-+
-+#define crypto_register_alg crypto_register_alg_rtl
-+#define crypto_unregister_alg crypto_unregister_alg_rtl
-+#define crypto_alloc_tfm crypto_alloc_tfm_rtl
-+#define crypto_free_tfm crypto_free_tfm_rtl
-+#define crypto_alg_available crypto_alg_available_rtl
-+
-+/*
-+ * Algorithm masks and types.
-+ */
-+#define CRYPTO_ALG_TYPE_MASK 0x000000ff
-+#define CRYPTO_ALG_TYPE_CIPHER 0x00000001
-+#define CRYPTO_ALG_TYPE_DIGEST 0x00000002
-+#define CRYPTO_ALG_TYPE_COMPRESS 0x00000004
-+
-+/*
-+ * Transform masks and values (for crt_flags).
-+ */
-+#define CRYPTO_TFM_MODE_MASK 0x000000ff
-+#define CRYPTO_TFM_REQ_MASK 0x000fff00
-+#define CRYPTO_TFM_RES_MASK 0xfff00000
-+
-+#define CRYPTO_TFM_MODE_ECB 0x00000001
-+#define CRYPTO_TFM_MODE_CBC 0x00000002
-+#define CRYPTO_TFM_MODE_CFB 0x00000004
-+#define CRYPTO_TFM_MODE_CTR 0x00000008
-+
-+#define CRYPTO_TFM_REQ_WEAK_KEY 0x00000100
-+#define CRYPTO_TFM_RES_WEAK_KEY 0x00100000
-+#define CRYPTO_TFM_RES_BAD_KEY_LEN 0x00200000
-+#define CRYPTO_TFM_RES_BAD_KEY_SCHED 0x00400000
-+#define CRYPTO_TFM_RES_BAD_BLOCK_LEN 0x00800000
-+#define CRYPTO_TFM_RES_BAD_FLAGS 0x01000000
-+
-+/*
-+ * Miscellaneous stuff.
-+ */
-+#define CRYPTO_UNSPEC 0
-+#define CRYPTO_MAX_ALG_NAME 64
-+
-+struct scatterlist;
-+
-+/*
-+ * Algorithms: modular crypto algorithm implementations, managed
-+ * via crypto_register_alg() and crypto_unregister_alg().
-+ */
-+struct cipher_alg {
-+ unsigned int cia_min_keysize;
-+ unsigned int cia_max_keysize;
-+ int (*cia_setkey)(void *ctx, const u8 *key,
-+ unsigned int keylen, u32 *flags);
-+ void (*cia_encrypt)(void *ctx, u8 *dst, const u8 *src);
-+ void (*cia_decrypt)(void *ctx, u8 *dst, const u8 *src);
-+};
-+
-+struct digest_alg {
-+ unsigned int dia_digestsize;
-+ void (*dia_init)(void *ctx);
-+ void (*dia_update)(void *ctx, const u8 *data, unsigned int len);
-+ void (*dia_final)(void *ctx, u8 *out);
-+ int (*dia_setkey)(void *ctx, const u8 *key,
-+ unsigned int keylen, u32 *flags);
-+};
-+
-+struct compress_alg {
-+ int (*coa_init)(void *ctx);
-+ void (*coa_exit)(void *ctx);
-+ int (*coa_compress)(void *ctx, const u8 *src, unsigned int slen,
-+ u8 *dst, unsigned int *dlen);
-+ int (*coa_decompress)(void *ctx, const u8 *src, unsigned int slen,
-+ u8 *dst, unsigned int *dlen);
-+};
-+
-+#define cra_cipher cra_u.cipher
-+#define cra_digest cra_u.digest
-+#define cra_compress cra_u.compress
-+
-+struct crypto_alg {
-+ struct list_head cra_list;
-+ u32 cra_flags;
-+ unsigned int cra_blocksize;
-+ unsigned int cra_ctxsize;
-+ const char cra_name[CRYPTO_MAX_ALG_NAME];
-+
-+ union {
-+ struct cipher_alg cipher;
-+ struct digest_alg digest;
-+ struct compress_alg compress;
-+ } cra_u;
-+
-+ struct module *cra_module;
-+};
-+
-+/*
-+ * Algorithm registration interface.
-+ */
-+int crypto_register_alg(struct crypto_alg *alg);
-+int crypto_unregister_alg(struct crypto_alg *alg);
-+
-+/*
-+ * Algorithm query interface.
-+ */
-+int crypto_alg_available(const char *name, u32 flags);
-+
-+/*
-+ * Transforms: user-instantiated objects which encapsulate algorithms
-+ * and core processing logic. Managed via crypto_alloc_tfm() and
-+ * crypto_free_tfm(), as well as the various helpers below.
-+ */
-+struct crypto_tfm;
-+
-+struct cipher_tfm {
-+ void *cit_iv;
-+ unsigned int cit_ivsize;
-+ u32 cit_mode;
-+ int (*cit_setkey)(struct crypto_tfm *tfm,
-+ const u8 *key, unsigned int keylen);
-+ int (*cit_encrypt)(struct crypto_tfm *tfm,
-+ struct scatterlist *dst,
-+ struct scatterlist *src,
-+ unsigned int nbytes);
-+ int (*cit_encrypt_iv)(struct crypto_tfm *tfm,
-+ struct scatterlist *dst,
-+ struct scatterlist *src,
-+ unsigned int nbytes, u8 *iv);
-+ int (*cit_decrypt)(struct crypto_tfm *tfm,
-+ struct scatterlist *dst,
-+ struct scatterlist *src,
-+ unsigned int nbytes);
-+ int (*cit_decrypt_iv)(struct crypto_tfm *tfm,
-+ struct scatterlist *dst,
-+ struct scatterlist *src,
-+ unsigned int nbytes, u8 *iv);
-+ void (*cit_xor_block)(u8 *dst, const u8 *src);
-+};
-+
-+struct digest_tfm {
-+ void (*dit_init)(struct crypto_tfm *tfm);
-+ void (*dit_update)(struct crypto_tfm *tfm,
-+ struct scatterlist *sg, unsigned int nsg);
-+ void (*dit_final)(struct crypto_tfm *tfm, u8 *out);
-+ void (*dit_digest)(struct crypto_tfm *tfm, struct scatterlist *sg,
-+ unsigned int nsg, u8 *out);
-+ int (*dit_setkey)(struct crypto_tfm *tfm,
-+ const u8 *key, unsigned int keylen);
-+#ifdef CONFIG_CRYPTO_HMAC
-+ void *dit_hmac_block;
-+#endif
-+};
-+
-+struct compress_tfm {
-+ int (*cot_compress)(struct crypto_tfm *tfm,
-+ const u8 *src, unsigned int slen,
-+ u8 *dst, unsigned int *dlen);
-+ int (*cot_decompress)(struct crypto_tfm *tfm,
-+ const u8 *src, unsigned int slen,
-+ u8 *dst, unsigned int *dlen);
-+};
-+
-+#define crt_cipher crt_u.cipher
-+#define crt_digest crt_u.digest
-+#define crt_compress crt_u.compress
-+
-+struct crypto_tfm {
-+
-+ u32 crt_flags;
-+
-+ union {
-+ struct cipher_tfm cipher;
-+ struct digest_tfm digest;
-+ struct compress_tfm compress;
-+ } crt_u;
-+
-+ struct crypto_alg *__crt_alg;
-+};
-+
-+/*
-+ * Transform user interface.
-+ */
-+
-+/*
-+ * crypto_alloc_tfm() will first attempt to locate an already loaded algorithm.
-+ * If that fails and the kernel supports dynamically loadable modules, it
-+ * will then attempt to load a module of the same name or alias. A refcount
-+ * is grabbed on the algorithm which is then associated with the new transform.
-+ *
-+ * crypto_free_tfm() frees up the transform and any associated resources,
-+ * then drops the refcount on the associated algorithm.
-+ */
-+struct crypto_tfm *crypto_alloc_tfm(const char *alg_name, u32 tfm_flags);
-+void crypto_free_tfm(struct crypto_tfm *tfm);
-+
-+/*
-+ * Transform helpers which query the underlying algorithm.
-+ */
-+static inline const char *crypto_tfm_alg_name(struct crypto_tfm *tfm)
-+{
-+ return tfm->__crt_alg->cra_name;
-+}
-+
-+static inline const char *crypto_tfm_alg_modname(struct crypto_tfm *tfm)
-+{
-+ struct crypto_alg *alg = tfm->__crt_alg;
-+
-+ if (alg->cra_module)
-+ return alg->cra_module->name;
-+ else
-+ return NULL;
-+}
-+
-+static inline u32 crypto_tfm_alg_type(struct crypto_tfm *tfm)
-+{
-+ return tfm->__crt_alg->cra_flags & CRYPTO_ALG_TYPE_MASK;
-+}
-+
-+static inline unsigned int crypto_tfm_alg_min_keysize(struct crypto_tfm *tfm)
-+{
-+ BUG_ON(crypto_tfm_alg_type(tfm) != CRYPTO_ALG_TYPE_CIPHER);
-+ return tfm->__crt_alg->cra_cipher.cia_min_keysize;
-+}
-+
-+static inline unsigned int crypto_tfm_alg_max_keysize(struct crypto_tfm *tfm)
-+{
-+ BUG_ON(crypto_tfm_alg_type(tfm) != CRYPTO_ALG_TYPE_CIPHER);
-+ return tfm->__crt_alg->cra_cipher.cia_max_keysize;
-+}
-+
-+static inline unsigned int crypto_tfm_alg_ivsize(struct crypto_tfm *tfm)
-+{
-+ BUG_ON(crypto_tfm_alg_type(tfm) != CRYPTO_ALG_TYPE_CIPHER);
-+ return tfm->crt_cipher.cit_ivsize;
-+}
-+
-+static inline unsigned int crypto_tfm_alg_blocksize(struct crypto_tfm *tfm)
-+{
-+ return tfm->__crt_alg->cra_blocksize;
-+}
-+
-+static inline unsigned int crypto_tfm_alg_digestsize(struct crypto_tfm *tfm)
-+{
-+ BUG_ON(crypto_tfm_alg_type(tfm) != CRYPTO_ALG_TYPE_DIGEST);
-+ return tfm->__crt_alg->cra_digest.dia_digestsize;
-+}
-+
-+/*
-+ * API wrappers.
-+ */
-+static inline void crypto_digest_init(struct crypto_tfm *tfm)
-+{
-+ BUG_ON(crypto_tfm_alg_type(tfm) != CRYPTO_ALG_TYPE_DIGEST);
-+ tfm->crt_digest.dit_init(tfm);
-+}
-+
-+static inline void crypto_digest_update(struct crypto_tfm *tfm,
-+ struct scatterlist *sg,
-+ unsigned int nsg)
-+{
-+ BUG_ON(crypto_tfm_alg_type(tfm) != CRYPTO_ALG_TYPE_DIGEST);
-+ tfm->crt_digest.dit_update(tfm, sg, nsg);
-+}
-+
-+static inline void crypto_digest_final(struct crypto_tfm *tfm, u8 *out)
-+{
-+ BUG_ON(crypto_tfm_alg_type(tfm) != CRYPTO_ALG_TYPE_DIGEST);
-+ tfm->crt_digest.dit_final(tfm, out);
-+}
-+
-+static inline void crypto_digest_digest(struct crypto_tfm *tfm,
-+ struct scatterlist *sg,
-+ unsigned int nsg, u8 *out)
-+{
-+ BUG_ON(crypto_tfm_alg_type(tfm) != CRYPTO_ALG_TYPE_DIGEST);
-+ tfm->crt_digest.dit_digest(tfm, sg, nsg, out);
-+}
-+
-+static inline int crypto_digest_setkey(struct crypto_tfm *tfm,
-+ const u8 *key, unsigned int keylen)
-+{
-+ BUG_ON(crypto_tfm_alg_type(tfm) != CRYPTO_ALG_TYPE_DIGEST);
-+ if (tfm->crt_digest.dit_setkey == NULL)
-+ return -ENOSYS;
-+ return tfm->crt_digest.dit_setkey(tfm, key, keylen);
-+}
-+
-+static inline int crypto_cipher_setkey(struct crypto_tfm *tfm,
-+ const u8 *key, unsigned int keylen)
-+{
-+ BUG_ON(crypto_tfm_alg_type(tfm) != CRYPTO_ALG_TYPE_CIPHER);
-+ return tfm->crt_cipher.cit_setkey(tfm, key, keylen);
-+}
-+
-+static inline int crypto_cipher_encrypt(struct crypto_tfm *tfm,
-+ struct scatterlist *dst,
-+ struct scatterlist *src,
-+ unsigned int nbytes)
-+{
-+ BUG_ON(crypto_tfm_alg_type(tfm) != CRYPTO_ALG_TYPE_CIPHER);
-+ return tfm->crt_cipher.cit_encrypt(tfm, dst, src, nbytes);
-+}
-+
-+static inline int crypto_cipher_encrypt_iv(struct crypto_tfm *tfm,
-+ struct scatterlist *dst,
-+ struct scatterlist *src,
-+ unsigned int nbytes, u8 *iv)
-+{
-+ BUG_ON(crypto_tfm_alg_type(tfm) != CRYPTO_ALG_TYPE_CIPHER);
-+ BUG_ON(tfm->crt_cipher.cit_mode == CRYPTO_TFM_MODE_ECB);
-+ return tfm->crt_cipher.cit_encrypt_iv(tfm, dst, src, nbytes, iv);
-+}
-+
-+static inline int crypto_cipher_decrypt(struct crypto_tfm *tfm,
-+ struct scatterlist *dst,
-+ struct scatterlist *src,
-+ unsigned int nbytes)
-+{
-+ BUG_ON(crypto_tfm_alg_type(tfm) != CRYPTO_ALG_TYPE_CIPHER);
-+ return tfm->crt_cipher.cit_decrypt(tfm, dst, src, nbytes);
-+}
-+
-+static inline int crypto_cipher_decrypt_iv(struct crypto_tfm *tfm,
-+ struct scatterlist *dst,
-+ struct scatterlist *src,
-+ unsigned int nbytes, u8 *iv)
-+{
-+ BUG_ON(crypto_tfm_alg_type(tfm) != CRYPTO_ALG_TYPE_CIPHER);
-+ BUG_ON(tfm->crt_cipher.cit_mode == CRYPTO_TFM_MODE_ECB);
-+ return tfm->crt_cipher.cit_decrypt_iv(tfm, dst, src, nbytes, iv);
-+}
-+
-+static inline void crypto_cipher_set_iv(struct crypto_tfm *tfm,
-+ const u8 *src, unsigned int len)
-+{
-+ BUG_ON(crypto_tfm_alg_type(tfm) != CRYPTO_ALG_TYPE_CIPHER);
-+ memcpy(tfm->crt_cipher.cit_iv, src, len);
-+}
-+
-+static inline void crypto_cipher_get_iv(struct crypto_tfm *tfm,
-+ u8 *dst, unsigned int len)
-+{
-+ BUG_ON(crypto_tfm_alg_type(tfm) != CRYPTO_ALG_TYPE_CIPHER);
-+ memcpy(dst, tfm->crt_cipher.cit_iv, len);
-+}
-+
-+static inline int crypto_comp_compress(struct crypto_tfm *tfm,
-+ const u8 *src, unsigned int slen,
-+ u8 *dst, unsigned int *dlen)
-+{
-+ BUG_ON(crypto_tfm_alg_type(tfm) != CRYPTO_ALG_TYPE_COMPRESS);
-+ return tfm->crt_compress.cot_compress(tfm, src, slen, dst, dlen);
-+}
-+
-+static inline int crypto_comp_decompress(struct crypto_tfm *tfm,
-+ const u8 *src, unsigned int slen,
-+ u8 *dst, unsigned int *dlen)
-+{
-+ BUG_ON(crypto_tfm_alg_type(tfm) != CRYPTO_ALG_TYPE_COMPRESS);
-+ return tfm->crt_compress.cot_decompress(tfm, src, slen, dst, dlen);
-+}
-+
-+/*
-+ * HMAC support.
-+ */
-+#ifdef CONFIG_CRYPTO_HMAC
-+void crypto_hmac_init(struct crypto_tfm *tfm, u8 *key, unsigned int *keylen);
-+void crypto_hmac_update(struct crypto_tfm *tfm,
-+ struct scatterlist *sg, unsigned int nsg);
-+void crypto_hmac_final(struct crypto_tfm *tfm, u8 *key,
-+ unsigned int *keylen, u8 *out);
-+void crypto_hmac(struct crypto_tfm *tfm, u8 *key, unsigned int *keylen,
-+ struct scatterlist *sg, unsigned int nsg, u8 *out);
-+#endif /* CONFIG_CRYPTO_HMAC */
-+
-+#endif /* _LINUX_CRYPTO_H */
-+
-diff -Nur linux-2.6.30.5.orig/drivers/net/wireless/rtl8187b/ieee80211/scatterwalk.h linux-2.6.30.5/drivers/net/wireless/rtl8187b/ieee80211/scatterwalk.h
---- linux-2.6.30.5.orig/drivers/net/wireless/rtl8187b/ieee80211/scatterwalk.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.30.5/drivers/net/wireless/rtl8187b/ieee80211/scatterwalk.h 2009-08-23 19:01:04.000000000 +0200
-@@ -0,0 +1,51 @@
-+/*
-+ * Cryptographic API.
-+ *
-+ * Copyright (c) 2002 James Morris <jmorris@intercode.com.au>
-+ * Copyright (c) 2002 Adam J. Richter <adam@yggdrasil.com>
-+ * Copyright (c) 2004 Jean-Luc Cooke <jlcooke@certainkey.com>
-+ *
-+ * 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.
-+ *
-+ */
-+
-+#ifndef _CRYPTO_SCATTERWALK_H
-+#define _CRYPTO_SCATTERWALK_H
-+#include <linux/mm.h>
-+#include <asm/scatterlist.h>
-+
-+struct scatter_walk {
-+ struct scatterlist *sg;
-+ struct page *page;
-+ void *data;
-+ unsigned int len_this_page;
-+ unsigned int len_this_segment;
-+ unsigned int offset;
-+};
-+
-+/* Define sg_next is an inline routine now in case we want to change
-+ scatterlist to a linked list later. */
-+static inline struct scatterlist *sg_next(struct scatterlist *sg)
-+{
-+ return sg + 1;
-+}
-+
-+static inline int scatterwalk_samebuf(struct scatter_walk *walk_in,
-+ struct scatter_walk *walk_out,
-+ void *src_p, void *dst_p)
-+{
-+ return walk_in->page == walk_out->page &&
-+ walk_in->offset == walk_out->offset &&
-+ walk_in->data == src_p && walk_out->data == dst_p;
-+}
-+
-+void *scatterwalk_whichbuf(struct scatter_walk *walk, unsigned int nbytes, void *scratch);
-+void scatterwalk_start(struct scatter_walk *walk, struct scatterlist *sg);
-+int scatterwalk_copychunks(void *buf, struct scatter_walk *walk, size_t nbytes, int out);
-+void scatterwalk_map(struct scatter_walk *walk, int out);
-+void scatterwalk_done(struct scatter_walk *walk, int out, int more);
-+
-+#endif /* _CRYPTO_SCATTERWALK_H */
-diff -Nur linux-2.6.30.5.orig/drivers/net/wireless/rtl8187b/Makefile linux-2.6.30.5/drivers/net/wireless/rtl8187b/Makefile
---- linux-2.6.30.5.orig/drivers/net/wireless/rtl8187b/Makefile 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.30.5/drivers/net/wireless/rtl8187b/Makefile 2009-08-23 19:01:04.000000000 +0200
-@@ -0,0 +1,41 @@
-+obj-$(CONFIG_RTL8187B) += rtl8187b.o
-+
-+rtl8187b-objs := r8187_core.o \
-+ r8180_93cx6.o \
-+ r8180_wx.o \
-+ r8180_rtl8225.o \
-+ r8180_rtl8225z2.o \
-+ r8180_pm.o \
-+ r8180_dm.o \
-+ r8187_led.o \
-+ ieee80211/dot11d.o \
-+ ieee80211/ieee80211_softmac.o \
-+ ieee80211/ieee80211_rx.o \
-+ ieee80211/ieee80211_tx.o \
-+ ieee80211/ieee80211_wx.o \
-+ ieee80211/ieee80211_module.o \
-+ ieee80211/ieee80211_softmac_wx.o \
-+ ieee80211/ieee80211_crypt.o \
-+ ieee80211/ieee80211_crypt_tkip.o \
-+ ieee80211/ieee80211_crypt_ccmp.o \
-+ ieee80211/ieee80211_crypt_wep.o
-+
-+EXTRA_CFLAGS += -DCONFIG_RTL8180_PM
-+EXTRA_CFLAGS += -DJACKSON_NEW_8187 -DJACKSON_NEW_RX
-+EXTRA_CFLAGS += -DTHOMAS_BEACON -DTHOMAS_TASKLET -DTHOMAS_SKB -DTHOMAS_TURBO
-+EXTRA_CFLAGS += -DJOHN_IOCTL
-+EXTRA_CFLAGS += -DLED
-+#EXTRA_CFLAGS += -DLED_SHIN
-+EXTRA_CFLAGS += -DPOLLING_METHOD_FOR_RADIO
-+#EXTRA_CFLAGS += -DSW_ANTE_DIVERSITY
-+EXTRA_CFLAGS += -DCPU_64BIT
-+EXTRA_CFLAGS += -DCONFIG_IPS
-+#CFLAGS += -DJOHN_HWSEC -DJOHN_TKIP
-+#CFLAGS += -DJOHN_DUMP_TX
-+#EXTRA_CFLAGS += -DJOHN_DUMP_TXPKT
-+
-+#Radio On/Off debug
-+EXTRA_CFLAGS += -DCONFIG_RADIO_DEBUG
-+
-+#for dot11d
-+EXTRA_CFLAGS += -DENABLE_DOT11D
-diff -Nur linux-2.6.30.5.orig/drivers/net/wireless/rtl8187b/msh_class.h linux-2.6.30.5/drivers/net/wireless/rtl8187b/msh_class.h
---- linux-2.6.30.5.orig/drivers/net/wireless/rtl8187b/msh_class.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.30.5/drivers/net/wireless/rtl8187b/msh_class.h 2009-08-23 19:01:04.000000000 +0200
-@@ -0,0 +1,117 @@
-+/*! \file msh_class.h
-+ \brief msh CLASS extension
-+
-+ \date 2007/5/2
-+ \author Stanley Chang <chagnsl@cs.nctu.edu.tw>
-+*/
-+
-+#ifndef _MESH_CLASS_HDR_H_
-+#define _MESH_CLASS_HDR_H_
-+
-+#include <linux/if_ether.h> /* ETH_ALEN */
-+#include <linux/kernel.h> /* ARRAY_SIZE */
-+#include <linux/version.h>
-+#include <linux/jiffies.h>
-+#include <linux/timer.h>
-+#include <linux/sched.h>
-+
-+#include "ieee80211/ieee80211.h" // for struct ieee80211-xxxx
-+#include "r8187.h" // for struct r8180-priv
-+
-+#define MAC_TABLE_SIZE 8
-+
-+struct mshclass {
-+ struct r8180_priv * p8187;
-+
-+ // callback functions
-+ // ieee80211_softmac.c
-+ int (*ext_patch_ieee80211_start_protocol) (struct ieee80211_device *ieee); // start special mode
-+
-+ short (*ext_patch_ieee80211_probe_req_1) (struct ieee80211_device *ieee); // return = 0: no more phases, >0: another phase
-+ u8* (*ext_patch_ieee80211_probe_req_2) (struct ieee80211_device *ieee, struct sk_buff *skb, u8 *tag); // return tag
-+
-+ void (*ext_patch_ieee80211_association_req_1) (struct ieee80211_assoc_request_frame *hdr);
-+ u8* (*ext_patch_ieee80211_association_req_2) (struct ieee80211_device *ieee, struct ieee80211_network *pstat, struct sk_buff *skb);
-+
-+ int (*ext_patch_ieee80211_rx_frame_softmac_on_assoc_req) (struct ieee80211_device *ieee, struct sk_buff *skb);
-+ int (*ext_patch_ieee80211_rx_frame_softmac_on_assoc_rsp) (struct ieee80211_device *ieee, struct sk_buff *skb);
-+
-+ void (*ext_patch_ieee80211_stop_protocol) (struct ieee80211_device *ieee); // stop timer
-+
-+ void (*ext_patch_ieee80211_assoc_resp_by_net_1) (struct ieee80211_assoc_response_frame *assoc);
-+ u8* (*ext_patch_ieee80211_assoc_resp_by_net_2) (struct ieee80211_device *ieee, struct ieee80211_network *pstat, int pkt_type, struct sk_buff *skb);
-+
-+ int (*ext_patch_ieee80211_ext_stop_scan_wq_set_channel) (struct ieee80211_device *ieee);
-+
-+ struct sk_buff* (*ext_patch_get_beacon_get_probersp)(struct ieee80211_device *ieee, u8 *dest, struct ieee80211_network *net);
-+
-+ int (*ext_patch_ieee80211_softmac_xmit_get_rate) (struct ieee80211_device *ieee, struct sk_buff *skb);
-+ int (*ext_patch_ieee80211_rx_frame_softmac_on_auth)(struct ieee80211_device *ieee, struct sk_buff *skb, struct ieee80211_rx_stats *rx_stats);
-+ int (*ext_patch_ieee80211_rx_frame_softmac_on_deauth)(struct ieee80211_device *ieee, struct sk_buff *skb, struct ieee80211_rx_stats *rx_stats);
-+//by amy for mesh
-+ void (*ext_patch_ieee80211_start_mesh)(struct ieee80211_device *ieee);
-+//by amy for mesh
-+ /// r8180_wx.c
-+ int (*ext_patch_r8180_wx_get_meshinfo) (struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra);
-+ int (*ext_patch_r8180_wx_enable_mesh) (struct net_device *dev);
-+ int (*ext_patch_r8180_wx_disable_mesh) (struct net_device *dev);
-+ int (*ext_patch_r8180_wx_set_meshID) ( struct net_device *dev, char *ext);
-+//by amy for mesh
-+ int (*ext_patch_r8180_wx_set_mesh_chan)(struct net_device *dev, unsigned char channel);
-+//by amy for mesh
-+ void (*ext_patch_r8180_wx_set_channel) (struct ieee80211_device *ieee, int ch);
-+
-+ int (*ext_patch_r8180_wx_set_add_mac_allow) (struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra);
-+ int (*ext_patch_r8180_wx_set_del_mac_allow) (struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra);
-+ int (*ext_patch_r8180_wx_set_add_mac_deny) (struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra);
-+ int (*ext_patch_r8180_wx_set_del_mac_deny) (struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra);
-+ int (*ext_patch_r8180_wx_get_mac_allow) (struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra);
-+ int (*ext_patch_r8180_wx_get_mac_deny) (struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra);
-+
-+ int (*ext_patch_r8180_wx_get_mesh_list) (struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra);
-+ int (*ext_patch_r8180_wx_mesh_scan) (struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra);
-+ int (*ext_patch_r8180_wx_get_selected_mesh)(struct net_device *dev, int en, char *cho, char* id);
-+//by amy for networkmanager UI
-+ int (*ext_patch_r8180_wx_get_selected_mesh_channel)(struct net_device *dev, char* extmeshid, char *cho);
-+//by amy for networkmanager UI
-+ /// r8187_core.c
-+ u8 (*ext_patch_rtl8180_up) (struct mshclass *priv);
-+
-+ // ieee80211_rx.c
-+ unsigned int (*ext_patch_ieee80211_process_probe_response_1) ( struct ieee80211_device *ieee, struct ieee80211_probe_response *beacon, struct ieee80211_rx_stats *stats);
-+ void (*ext_patch_ieee80211_rx_mgt_on_probe_req) ( struct ieee80211_device *ieee, struct ieee80211_probe_request *beacon, struct ieee80211_rx_stats *stats);
-+
-+ void (*ext_patch_ieee80211_rx_mgt_update_expire) ( struct ieee80211_device *ieee, struct sk_buff *skb);
-+
-+ int (*ext_patch_ieee80211_rx_on_rx) (struct ieee80211_device *ieee, struct sk_buff *skb, struct ieee80211_rx_stats *rx_stats, u16 type, u16 stype);
-+
-+ int (*ext_patch_ieee80211_rx_frame_get_hdrlen) (struct ieee80211_device *ieee, struct sk_buff *skb);
-+
-+ int (*ext_patch_ieee80211_rx_is_valid_framectl) (struct ieee80211_device *ieee, u16 fc, u16 type, u16 stype);
-+
-+ // return > 0 is success. 0 when failed
-+ int (*ext_patch_ieee80211_rx_process_dataframe) (struct ieee80211_device *ieee, struct sk_buff *skb, struct ieee80211_rx_stats *rx_stats);
-+
-+ int (*ext_patch_is_duplicate_packet) (struct ieee80211_device *ieee, struct ieee80211_hdr *header, u16 type, u16 stype);
-+ /* added by david for setting acl dynamically */
-+ u8 (*ext_patch_ieee80211_acl_query) (struct ieee80211_device *ieee, u8 *sa);
-+
-+ // r8187_core.c
-+ int (*ext_patch_rtl8180_ioctl) (struct net_device *dev, struct ifreq *rq, int cmd);
-+ void (*ext_patch_create_proc) (struct r8180_priv *priv);
-+ void (*ext_patch_remove_proc) (struct r8180_priv *priv);
-+
-+ // ieee80211_tx.c
-+
-+ // locked by ieee->lock. Call ieee80211_softmac_xmit afterward
-+ struct ieee80211_txb* (*ext_patch_ieee80211_xmit) (struct sk_buff *skb, struct net_device *dev);
-+
-+ // DO NOT MODIFY ANY STRUCTURE BELOW THIS LINE
-+ u8 priv[0]; // mshclass_priv;
-+};
-+
-+extern void free_mshobj(struct mshclass **pObj);
-+extern struct mshclass *alloc_mshobj(struct r8180_priv *caller_priv);
-+
-+
-+#endif // _MESH_CLASS_HDR_H_
-diff -Nur linux-2.6.30.5.orig/drivers/net/wireless/rtl8187b/r8180_93cx6.c linux-2.6.30.5/drivers/net/wireless/rtl8187b/r8180_93cx6.c
---- linux-2.6.30.5.orig/drivers/net/wireless/rtl8187b/r8180_93cx6.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.30.5/drivers/net/wireless/rtl8187b/r8180_93cx6.c 2009-08-23 19:01:04.000000000 +0200
-@@ -0,0 +1,146 @@
-+/*
-+ This files contains card eeprom (93c46 or 93c56) programming routines,
-+ memory is addressed by 16 bits words.
-+
-+ This is part of rtl8180 OpenSource driver.
-+ Copyright (C) Andrea Merello 2004 <andreamrl@tiscali.it>
-+ Released under the terms of GPL (General Public Licence)
-+
-+ Parts of this driver are based on the GPL part of the
-+ official realtek driver.
-+
-+ Parts of this driver are based on the rtl8180 driver skeleton
-+ from Patric Schenke & Andres Salomon.
-+
-+ Parts of this driver are based on the Intel Pro Wireless 2100 GPL driver.
-+
-+ We want to tanks the Authors of those projects and the Ndiswrapper
-+ project Authors.
-+*/
-+
-+#include "r8180_93cx6.h"
-+
-+void eprom_cs(struct net_device *dev, short bit)
-+{
-+ if(bit)
-+ write_nic_byte(dev, EPROM_CMD,
-+ (1<<EPROM_CS_SHIFT) | \
-+ read_nic_byte(dev, EPROM_CMD)); //enable EPROM
-+ else
-+ write_nic_byte(dev, EPROM_CMD, read_nic_byte(dev, EPROM_CMD)\
-+ &~(1<<EPROM_CS_SHIFT)); //disable EPROM
-+
-+ force_pci_posting(dev);
-+ udelay(EPROM_DELAY);
-+}
-+
-+
-+void eprom_ck_cycle(struct net_device *dev)
-+{
-+ write_nic_byte(dev, EPROM_CMD,
-+ (1<<EPROM_CK_SHIFT) | read_nic_byte(dev,EPROM_CMD));
-+ force_pci_posting(dev);
-+ udelay(EPROM_DELAY);
-+ write_nic_byte(dev, EPROM_CMD,
-+ read_nic_byte(dev, EPROM_CMD) &~ (1<<EPROM_CK_SHIFT));
-+ force_pci_posting(dev);
-+ udelay(EPROM_DELAY);
-+}
-+
-+
-+void eprom_w(struct net_device *dev,short bit)
-+{
-+ if(bit)
-+ write_nic_byte(dev, EPROM_CMD, (1<<EPROM_W_SHIFT) | \
-+ read_nic_byte(dev,EPROM_CMD));
-+ else
-+ write_nic_byte(dev, EPROM_CMD, read_nic_byte(dev,EPROM_CMD)\
-+ &~(1<<EPROM_W_SHIFT));
-+
-+ force_pci_posting(dev);
-+ udelay(EPROM_DELAY);
-+}
-+
-+
-+short eprom_r(struct net_device *dev)
-+{
-+ short bit;
-+
-+ bit=(read_nic_byte(dev, EPROM_CMD) & (1<<EPROM_R_SHIFT) );
-+ udelay(EPROM_DELAY);
-+
-+ if(bit) return 1;
-+ return 0;
-+}
-+
-+
-+void eprom_send_bits_string(struct net_device *dev, short b[], int len)
-+{
-+ int i;
-+
-+ for(i=0; i<len; i++){
-+ eprom_w(dev, b[i]);
-+ eprom_ck_cycle(dev);
-+ }
-+}
-+
-+
-+u32 eprom_read(struct net_device *dev, u32 addr)
-+{
-+ struct r8180_priv *priv = ieee80211_priv(dev);
-+ short read_cmd[]={1,1,0};
-+ short addr_str[8];
-+ int i;
-+ int addr_len;
-+ u32 ret;
-+
-+ ret=0;
-+ //enable EPROM programming
-+ write_nic_byte(dev, EPROM_CMD,
-+ (EPROM_CMD_PROGRAM<<EPROM_CMD_OPERATING_MODE_SHIFT));
-+ force_pci_posting(dev);
-+ udelay(EPROM_DELAY);
-+
-+ if (priv->epromtype==EPROM_93c56){
-+ addr_str[7]=addr & 1;
-+ addr_str[6]=addr & (1<<1);
-+ addr_str[5]=addr & (1<<2);
-+ addr_str[4]=addr & (1<<3);
-+ addr_str[3]=addr & (1<<4);
-+ addr_str[2]=addr & (1<<5);
-+ addr_str[1]=addr & (1<<6);
-+ addr_str[0]=addr & (1<<7);
-+ addr_len=8;
-+ }else{
-+ addr_str[5]=addr & 1;
-+ addr_str[4]=addr & (1<<1);
-+ addr_str[3]=addr & (1<<2);
-+ addr_str[2]=addr & (1<<3);
-+ addr_str[1]=addr & (1<<4);
-+ addr_str[0]=addr & (1<<5);
-+ addr_len=6;
-+ }
-+ eprom_cs(dev, 1);
-+ eprom_ck_cycle(dev);
-+ eprom_send_bits_string(dev, read_cmd, 3);
-+ eprom_send_bits_string(dev, addr_str, addr_len);
-+
-+ //keep chip pin D to low state while reading.
-+ //I'm unsure if it is necessary, but anyway shouldn't hurt
-+ eprom_w(dev, 0);
-+
-+ for(i=0;i<16;i++){
-+ //eeprom needs a clk cycle between writing opcode&adr
-+ //and reading data. (eeprom outs a dummy 0)
-+ eprom_ck_cycle(dev);
-+ ret |= (eprom_r(dev)<<(15-i));
-+ }
-+
-+ eprom_cs(dev, 0);
-+ eprom_ck_cycle(dev);
-+
-+ //disable EPROM programming
-+ write_nic_byte(dev, EPROM_CMD,
-+ (EPROM_CMD_NORMAL<<EPROM_CMD_OPERATING_MODE_SHIFT));
-+ return ret;
-+}
-diff -Nur linux-2.6.30.5.orig/drivers/net/wireless/rtl8187b/r8180_93cx6.h linux-2.6.30.5/drivers/net/wireless/rtl8187b/r8180_93cx6.h
---- linux-2.6.30.5.orig/drivers/net/wireless/rtl8187b/r8180_93cx6.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.30.5/drivers/net/wireless/rtl8187b/r8180_93cx6.h 2009-08-23 19:01:04.000000000 +0200
-@@ -0,0 +1,46 @@
-+/*
-+ This is part of rtl8187 OpenSource driver
-+ Copyright (C) Andrea Merello 2004-2005 <andreamrl@tiscali.it>
-+ Released under the terms of GPL (General Public Licence)
-+
-+ Parts of this driver are based on the GPL part of the official realtek driver
-+ Parts of this driver are based on the rtl8180 driver skeleton from Patric Schenke & Andres Salomon
-+ Parts of this driver are based on the Intel Pro Wireless 2100 GPL driver
-+
-+ We want to tanks the Authors of such projects and the Ndiswrapper project Authors.
-+*/
-+
-+/*This files contains card eeprom (93c46 or 93c56) programming routines*/
-+/*memory is addressed by WORDS*/
-+
-+#include "r8187.h"
-+#include "r8180_hw.h"
-+
-+#define EPROM_DELAY 10
-+
-+#define EPROM_ANAPARAM_ADDRLWORD 0xd
-+#define EPROM_ANAPARAM_ADDRHWORD 0xe
-+
-+#define EPROM_CHANNEL_PLAN 0x3 //0x6>>1
-+//0x77 BIT[0]0:use gpio 1 bit 1, 1:use gpio 1 bit 2.
-+#define EPROM_SELECT_GPIO (0x77 >> 1)
-+//#define EEPROM_COUNTRY_CODE 0x2E//87se channel plan is here
-+
-+#define EPROM_RFCHIPID 0x6
-+#define EPROM_TXPW_BASE 0x05
-+#define EPROM_RFCHIPID_RTL8225U 5
-+#define EPROM_RFCHIPID_RTL8225U_VF 6
-+#define EPROM_RF_PARAM 0x4
-+#define EPROM_CONFIG2 0xc
-+
-+#define EPROM_VERSION 0x1E
-+#define MAC_ADR 0x7
-+
-+#define CIS 0x18
-+
-+#define EPROM_TXPW0 0x16
-+#define EPROM_TXPW2 0x1b
-+#define EPROM_TXPW1 0x3d
-+
-+
-+u32 eprom_read(struct net_device *dev,u32 addr); //reads a 16 bits word
-diff -Nur linux-2.6.30.5.orig/drivers/net/wireless/rtl8187b/r8180_dm.c linux-2.6.30.5/drivers/net/wireless/rtl8187b/r8180_dm.c
---- linux-2.6.30.5.orig/drivers/net/wireless/rtl8187b/r8180_dm.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.30.5/drivers/net/wireless/rtl8187b/r8180_dm.c 2009-08-23 19:01:04.000000000 +0200
-@@ -0,0 +1,882 @@
-+/*++
-+Copyright (c) Realtek Semiconductor Corp. All rights reserved.
-+
-+Module Name:
-+ r8180_dig.c
-+
-+Abstract:
-+ Hardware dynamic mechanism for RTL8187B
-+
-+Major Change History:
-+ When Who What
-+ ---------- --------------- -------------------------------
-+ 2006-11-15 david Created
-+
-+Notes:
-+ This file is ported from RTL8187B Windows driver.
-+
-+
-+--*/
-+#include "r8180_dm.h"
-+#include "r8180_hw.h"
-+#include "r8180_rtl8225.h"
-+
-+//================================================================================
-+// Local Constant.
-+//================================================================================
-+#define Z1_HIPWR_UPPER_TH 99
-+#define Z1_HIPWR_LOWER_TH 70
-+#define Z2_HIPWR_UPPER_TH 99
-+#define Z2_HIPWR_LOWER_TH 90
-+
-+bool CheckDig(struct net_device *dev)
-+{
-+ struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
-+ struct ieee80211_device *ieee = priv->ieee80211;
-+
-+ if(ieee->state != IEEE80211_LINKED)
-+ return false;
-+
-+ if(priv->card_8187 == NIC_8187B) {
-+ //
-+ // We need to schedule dig workitem on either of the below mechanisms.
-+ // By Bruce, 2007-06-01.
-+ //
-+ if(!priv->bDigMechanism && !priv->bCCKThMechanism)
-+ return false;
-+
-+ if(priv->CurrentOperaRate < 36) // Schedule Dig under all OFDM rates. By Bruce, 2007-06-01.
-+ return false;
-+ } else {
-+ if(!priv->bDigMechanism)
-+ return false;
-+
-+ if(priv->CurrentOperaRate < 48)
-+ return false;
-+ }
-+ return true;
-+}
-+
-+
-+//
-+// Description:
-+// Implementation of DIG for Zebra and Zebra2.
-+//
-+void DIG_Zebra(struct net_device *dev)
-+{
-+ struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
-+ //PHAL_DATA_8187 pHalData = GetHalData8187(Adapter);
-+ u16 CCKFalseAlarm, OFDMFalseAlarm;
-+ u16 OfdmFA1, OfdmFA2;
-+ int InitialGainStep = 7; // The number of initial gain stages.
-+ int LowestGainStage = 4; // The capable lowest stage of performing dig workitem.
-+
-+// printk("---------> DIG_Zebra()\n");
-+
-+ //Read only 1 byte because of HW bug. This is a temporal modification. Joseph
-+ // Modify by Isaiah 2006-06-27
-+ if(priv->card_8187_Bversion == VERSION_8187B_B)
-+ {
-+ CCKFalseAlarm = 0;
-+ OFDMFalseAlarm = (u16)(priv->FalseAlarmRegValue);
-+ OfdmFA1 = 0x01;
-+ OfdmFA2 = priv->RegDigOfdmFaUpTh;
-+ }
-+ else
-+ {
-+ CCKFalseAlarm = (u16)(priv->FalseAlarmRegValue & 0x0000ffff);
-+ OFDMFalseAlarm = (u16)((priv->FalseAlarmRegValue >> 16) & 0x0000ffff);
-+ OfdmFA1 = 0x15;
-+ //OfdmFA2 = 0xC00;
-+ OfdmFA2 = ((u16)(priv->RegDigOfdmFaUpTh)) << 8;
-+ }
-+
-+// printk("DIG**********CCK False Alarm: %#X \n",CCKFalseAlarm);
-+// printk("DIG**********OFDM False Alarm: %#X \n",OFDMFalseAlarm);
-+
-+
-+
-+ // The number of initial gain steps is different, by Bruce, 2007-04-13.
-+ if(priv->card_8187 == NIC_8187) {
-+ if (priv->InitialGain == 0 ) //autoDIG
-+ {
-+ switch( priv->rf_chip)
-+ {
-+ case RF_ZEBRA:
-+ priv->InitialGain = 5; // m74dBm;
-+ break;
-+ case RF_ZEBRA2:
-+ priv->InitialGain = 4; // m78dBm;
-+ break;
-+ default:
-+ priv->InitialGain = 5; // m74dBm;
-+ break;
-+ }
-+ }
-+ InitialGainStep = 7;
-+ if(priv->InitialGain > 7)
-+ priv->InitialGain = 5;
-+ LowestGainStage = 4;
-+ } else {
-+ if (priv->InitialGain == 0 ) //autoDIG
-+ { // Advised from SD3 DZ, by Bruce, 2007-06-05.
-+ priv->InitialGain = 4; // In 87B, m74dBm means State 4 (m82dBm)
-+ }
-+ if(priv->card_8187_Bversion != VERSION_8187B_B)
-+ { // Advised from SD3 DZ, by Bruce, 2007-06-05.
-+ OfdmFA1 = 0x20;
-+ }
-+ InitialGainStep = 8;
-+ LowestGainStage = priv->RegBModeGainStage; // Lowest gain stage.
-+ }
-+
-+ if (OFDMFalseAlarm > OfdmFA1)
-+ {
-+ if (OFDMFalseAlarm > OfdmFA2)
-+ {
-+ priv->DIG_NumberFallbackVote++;
-+ if (priv->DIG_NumberFallbackVote >1)
-+ {
-+ //serious OFDM False Alarm, need fallback
-+ // By Bruce, 2007-03-29.
-+ // if (pHalData->InitialGain < 7) // In 87B, m66dBm means State 7 (m74dBm)
-+ if (priv->InitialGain < InitialGainStep)
-+ {
-+ priv->InitialGain = (priv->InitialGain + 1);
-+ //printk("DIG**********OFDM False Alarm: %#X, OfdmFA1: %#X, OfdmFA2: %#X\n", OFDMFalseAlarm, OfdmFA1, OfdmFA2);
-+ //printk("DIG+++++++ fallback OFDM:%d \n", priv->InitialGain);
-+ UpdateInitialGain(dev); // 2005.01.06, by rcnjko.
-+ }
-+ priv->DIG_NumberFallbackVote = 0;
-+ priv->DIG_NumberUpgradeVote=0;
-+ }
-+ }
-+ else
-+ {
-+ if (priv->DIG_NumberFallbackVote)
-+ priv->DIG_NumberFallbackVote--;
-+ }
-+ priv->DIG_NumberUpgradeVote=0;
-+ }
-+ else //OFDM False Alarm < 0x15
-+ {
-+ if (priv->DIG_NumberFallbackVote)
-+ priv->DIG_NumberFallbackVote--;
-+ priv->DIG_NumberUpgradeVote++;
-+
-+ if (priv->DIG_NumberUpgradeVote>9)
-+ {
-+ if (priv->InitialGain > LowestGainStage) // In 87B, m78dBm means State 4 (m864dBm)
-+ {
-+ priv->InitialGain = (priv->InitialGain - 1);
-+ //printk("DIG**********OFDM False Alarm: %#X, OfdmFA1: %#X, OfdmFA2: %#X\n", OFDMFalseAlarm, OfdmFA1, OfdmFA2);
-+ //printk("DIG--------- Upgrade OFDM:%d \n", priv->InitialGain);
-+ UpdateInitialGain(dev); // 2005.01.06, by rcnjko.
-+ }
-+ priv->DIG_NumberFallbackVote = 0;
-+ priv->DIG_NumberUpgradeVote=0;
-+ }
-+ }
-+
-+// printk("DIG+++++++ OFDM:%d\n", priv->InitialGain);
-+// printk("<--------- DIG_Zebra()\n");
-+}
-+
-+//
-+// Description:
-+// Dispatch DIG implementation according to RF.
-+//
-+void DynamicInitGain(struct net_device *dev)
-+{
-+ struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
-+
-+ switch(priv->rf_chip)
-+ {
-+ case RF_ZEBRA:
-+ case RF_ZEBRA2: // [AnnieWorkaround] For Zebra2, 2005-08-01.
-+ //case RF_ZEBRA4:
-+ DIG_Zebra(dev);
-+ break;
-+
-+ default:
-+ printk("DynamicInitGain(): unknown RFChipID(%d) !!!\n", priv->rf_chip);
-+ break;
-+ }
-+}
-+
-+// By Bruce, 2007-03-29.
-+//
-+// Description:
-+// Dispatch CCK Power Detection implementation according to RF.
-+//
-+void DynamicCCKThreshold(struct net_device *dev)
-+{
-+ struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
-+ u16 CCK_Up_Th;
-+ u16 CCK_Lw_Th;
-+ u16 CCKFalseAlarm;
-+
-+ printk("=====>DynamicCCKThreshold()\n");
-+
-+ CCK_Up_Th = priv->CCKUpperTh;
-+ CCK_Lw_Th = priv->CCKLowerTh;
-+ CCKFalseAlarm = (u16)((priv->FalseAlarmRegValue & 0x0000ffff) >> 8); // We only care about the higher byte.
-+ printk("DynamicCCKThreshold(): CCK Upper Threshold: 0x%02X, Lower Threshold: 0x%02X, CCKFalseAlarmHighByte: 0x%02X\n", CCK_Up_Th, CCK_Lw_Th, CCKFalseAlarm);
-+
-+ if(priv->StageCCKTh < 3 && CCKFalseAlarm >= CCK_Up_Th)
-+ {
-+ priv->StageCCKTh ++;
-+ UpdateCCKThreshold(dev);
-+ }
-+ else if(priv->StageCCKTh > 0 && CCKFalseAlarm <= CCK_Lw_Th)
-+ {
-+ priv->StageCCKTh --;
-+ UpdateCCKThreshold(dev);
-+ }
-+
-+ printk("<=====DynamicCCKThreshold()\n");
-+}
-+
-+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20))
-+void rtl8180_hw_dig_wq (struct work_struct *work)
-+{
-+ struct delayed_work *dwork = container_of(work,struct delayed_work,work);
-+ struct ieee80211_device *ieee = container_of(dwork,struct ieee80211_device,hw_dig_wq);
-+ struct net_device *dev = ieee->dev;
-+#else
-+void rtl8180_hw_dig_wq(struct net_device *dev)
-+{
-+ // struct r8180_priv *priv = ieee80211_priv(dev);
-+#endif
-+ struct r8180_priv *priv = ieee80211_priv(dev);
-+
-+ // Read CCK and OFDM False Alarm.
-+ if(priv->card_8187_Bversion == VERSION_8187B_B) {
-+ // Read only 1 byte because of HW bug. This is a temporal modification. Joseph
-+ // Modify by Isaiah 2006-06-27
-+ priv->FalseAlarmRegValue = (u32)read_nic_byte(dev, (OFDM_FALSE_ALARM+1));
-+ } else {
-+ priv->FalseAlarmRegValue = read_nic_dword(dev, CCK_FALSE_ALARM);
-+ }
-+
-+ // Adjust Initial Gain dynamically.
-+ if(priv->bDigMechanism) {
-+ DynamicInitGain(dev);
-+ }
-+
-+ //
-+ // Move from DynamicInitGain to be independent of the OFDM DIG mechanism, by Bruce, 2007-06-01.
-+ //
-+ if(priv->card_8187 == NIC_8187B) {
-+ // By Bruce, 2007-03-29.
-+ // Dynamically update CCK Power Detection Threshold.
-+ if(priv->bCCKThMechanism)
-+ {
-+ DynamicCCKThreshold(dev);
-+ }
-+ }
-+}
-+
-+void SetTxPowerLevel8187(struct net_device *dev, short chan)
-+{
-+ struct r8180_priv *priv = ieee80211_priv(dev);
-+
-+ switch(priv->rf_chip)
-+ {
-+ case RF_ZEBRA:
-+ rtl8225_SetTXPowerLevel(dev,chan);
-+ break;
-+
-+ case RF_ZEBRA2:
-+ //case RF_ZEBRA4:
-+ rtl8225z2_SetTXPowerLevel(dev,chan);
-+ break;
-+ }
-+}
-+
-+//
-+// Description:
-+// Check if input power signal strength exceeds maximum input power threshold
-+// of current HW.
-+// If yes, we set our HW to high input power state:
-+// RX: always force TR switch to SW Tx mode to reduce input power.
-+// TX: turn off smaller Tx output power (see RtUsbCheckForHang).
-+//
-+// If no, we restore our HW to normal input power state:
-+/// RX: restore TR switch to HW controled mode.
-+// TX: restore TX output power (see RtUsbCheckForHang).
-+//
-+// TODO:
-+// 1. Tx power control shall not be done in Platform-dependent timer (e.g. RtUsbCheckForHang).
-+// 2. Allow these threshold adjustable by RF SD.
-+//
-+void DoRxHighPower(struct net_device *dev)
-+{
-+ struct r8180_priv *priv = ieee80211_priv(dev);
-+ TR_SWITCH_STATE TrSwState;
-+ u16 HiPwrUpperTh = 0;
-+ u16 HiPwrLowerTh = 0;
-+ u16 RSSIHiPwrUpperTh = 0;
-+ u16 RSSIHiPwrLowerTh = 0;
-+
-+ //87S remove TrSwitch mechanism
-+ if((priv->card_8187 == NIC_8187B)||(priv->card_8187 == NIC_8187)) {
-+
-+ //printk("----> DoRxHighPower()\n");
-+
-+ //
-+ // Get current TR switch setting.
-+ //
-+ //Adapter->HalFunc.GetHwRegHandler(Adapter, HW_VAR_TR_SWITCH, (pu1Byte)(&TrSwState));
-+ TrSwState = priv->TrSwitchState;
-+
-+ //
-+ // Determine threshold according to RF type.
-+ //
-+ switch(priv->rf_chip)
-+ {
-+ case RF_ZEBRA:
-+ HiPwrUpperTh = Z1_HIPWR_UPPER_TH;
-+ HiPwrLowerTh = Z1_HIPWR_LOWER_TH;
-+ printk("DoRxHighPower(): RF_ZEBRA, Upper Threshold: %d LOWER Threshold: %d\n",
-+ HiPwrUpperTh, HiPwrLowerTh);
-+ break;
-+
-+ case RF_ZEBRA2:
-+ if((priv->card_8187 == NIC_8187)) {
-+ HiPwrUpperTh = Z2_HIPWR_UPPER_TH;
-+ HiPwrLowerTh = Z2_HIPWR_LOWER_TH;
-+ } else {
-+ // By Bruce, 2007-04-11.
-+ // HiPwrUpperTh = Z2_HIPWR_UPPER_TH;
-+ // HiPwrLowerTh = Z2_HIPWR_LOWER_TH;
-+
-+ HiPwrUpperTh = priv->Z2HiPwrUpperTh;
-+ HiPwrLowerTh = priv->Z2HiPwrLowerTh;
-+ HiPwrUpperTh = HiPwrUpperTh * 10;
-+ HiPwrLowerTh = HiPwrLowerTh * 10;
-+
-+ RSSIHiPwrUpperTh = priv->Z2RSSIHiPwrUpperTh;
-+ RSSIHiPwrLowerTh = priv->Z2RSSIHiPwrLowerTh;
-+ //printk("DoRxHighPower(): RF_ZEBRA2, Upper Threshold: %d LOWER Threshold: %d, RSSI Upper Th: %d, RSSI Lower Th: %d\n",HiPwrUpperTh, HiPwrLowerTh, RSSIHiPwrUpperTh, RSSIHiPwrLowerTh);
-+ }
-+ break;
-+
-+ default:
-+ printk("DoRxHighPower(): Unknown RFChipID(%d), UndecoratedSmoothedSS(%d), TrSwState(%d)!!!\n",
-+ priv->rf_chip, priv->UndecoratedSmoothedSS, TrSwState);
-+ return;
-+ break;
-+ }
-+
-+ /*printk(">>>>>>>>>>Set TR switch to software control, UndecoratedSmoothedSS:%d, CurCCKRSSI = %d\n",\
-+ priv->UndecoratedSmoothedSS, priv->CurCCKRSSI);
-+ */
-+ if((priv->card_8187 == NIC_8187)) {
-+ //
-+ // Perform Rx part High Power Mechanism by UndecoratedSmoothedSS.
-+ //
-+ if (priv->UndecoratedSmoothedSS > HiPwrUpperTh)
-+ { // High input power state.
-+ if( priv->TrSwitchState == TR_HW_CONTROLLED )
-+ {
-+ /* printk(">>>>>>>>>>Set TR switch to software control, UndecoratedSmoothedSS:%d \n", \
-+ priv->UndecoratedSmoothedSS);
-+ // printk(">>>>>>>>>> TR_SW_TX\n");
-+ */
-+ write_nic_byte(dev, RFPinsSelect,
-+ (u8)(priv->wMacRegRfPinsSelect | TR_SW_MASK_8187 ));
-+ write_nic_byte(dev, RFPinsOutput,
-+ (u8)((priv->wMacRegRfPinsOutput&(~TR_SW_MASK_8187))|TR_SW_MASK_TX_8187));
-+ priv->TrSwitchState = TR_SW_TX;
-+ priv->bToUpdateTxPwr = true;
-+ }
-+ }
-+ else if (priv->UndecoratedSmoothedSS < HiPwrLowerTh)
-+ { // Normal input power state.
-+ if( priv->TrSwitchState == TR_SW_TX)
-+ {
-+ /* printk("<<<<<<<<<<<Set TR switch to hardware control UndecoratedSmoothedSS:%d \n", \
-+ priv->UndecoratedSmoothedSS);
-+ // printk("<<<<<<<<<< TR_HW_CONTROLLED\n");
-+ */
-+ write_nic_byte(dev, RFPinsOutput, (u8)(priv->wMacRegRfPinsOutput));
-+ write_nic_byte(dev, RFPinsSelect, (u8)(priv->wMacRegRfPinsSelect));
-+ priv->TrSwitchState = TR_HW_CONTROLLED;
-+ priv->bToUpdateTxPwr = true;
-+ }
-+ }
-+ }else {
-+ /*printk("=====>TrSwState = %s\n", (TrSwState==TR_HW_CONTROLLED)?"TR_HW_CONTROLLED":"TR_SW_TX");
-+ //printk("UndecoratedSmoothedSS:%d, CurCCKRSSI = %d\n",priv->UndecoratedSmoothedSS, priv->CurCCKRSSI); */
-+ // Asked by SD3 DZ, by Bruce, 2007-04-12.
-+ if(TrSwState == TR_HW_CONTROLLED)
-+ {
-+ if((priv->UndecoratedSmoothedSS > HiPwrUpperTh) ||
-+ (priv->bCurCCKPkt && (priv->CurCCKRSSI > RSSIHiPwrUpperTh)))
-+ {
-+ //printk("===============================> high power!\n");
-+ write_nic_byte(dev, RFPinsSelect, (u8)(priv->wMacRegRfPinsSelect|TR_SW_MASK_8187 ));
-+ write_nic_byte(dev, RFPinsOutput,
-+ (u8)((priv->wMacRegRfPinsOutput&(~TR_SW_MASK_8187))|TR_SW_MASK_TX_8187));
-+ priv->TrSwitchState = TR_SW_TX;
-+ priv->bToUpdateTxPwr = true;
-+ }
-+ }
-+ else
-+ {
-+ if((priv->UndecoratedSmoothedSS < HiPwrLowerTh) &&
-+ (!priv->bCurCCKPkt || priv->CurCCKRSSI < RSSIHiPwrLowerTh))
-+ {
-+ write_nic_byte(dev, RFPinsOutput, (u8)(priv->wMacRegRfPinsOutput));
-+ write_nic_byte(dev, RFPinsSelect, (u8)(priv->wMacRegRfPinsSelect));
-+ priv->TrSwitchState = TR_HW_CONTROLLED;
-+ priv->bToUpdateTxPwr = true;
-+ }
-+ }
-+ //printk("<=======TrSwState = %s\n", (TrSwState==TR_HW_CONTROLLED)?"TR_HW_CONTROLLED":"TR_SW_TX");
-+ }
-+ //printk("<---- DoRxHighPower()\n");
-+ }
-+}
-+
-+
-+//
-+// Description:
-+// Callback function of UpdateTxPowerWorkItem.
-+// Because of some event happend, e.g. CCX TPC, High Power Mechanism,
-+// We update Tx power of current channel again.
-+//
-+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20))
-+void rtl8180_tx_pw_wq (struct work_struct *work)
-+{
-+ struct delayed_work *dwork = container_of(work,struct delayed_work,work);
-+ struct ieee80211_device *ieee = container_of(dwork,struct ieee80211_device,tx_pw_wq);
-+ struct net_device *dev = ieee->dev;
-+#else
-+void rtl8180_tx_pw_wq(struct net_device *dev)
-+{
-+ // struct r8180_priv *priv = ieee80211_priv(dev);
-+#endif
-+
-+ struct r8180_priv *priv = ieee80211_priv(dev);
-+
-+ //printk("----> UpdateTxPowerWorkItemCallback()\n");
-+
-+ if(priv->bToUpdateTxPwr)
-+ {
-+ //printk("DoTxHighPower(): schedule UpdateTxPowerWorkItem......\n");
-+ priv->bToUpdateTxPwr = false;
-+ SetTxPowerLevel8187(dev, priv->chan);
-+ }
-+
-+ DoRxHighPower(dev);
-+ //printk("<---- UpdateTxPowerWorkItemCallback()\n");
-+}
-+
-+//
-+// Description:
-+// Return TRUE if we shall perform High Power Mecahnism, FALSE otherwise.
-+//
-+bool CheckHighPower(struct net_device *dev)
-+{
-+ struct r8180_priv *priv = ieee80211_priv(dev);
-+ struct ieee80211_device *ieee = priv->ieee80211;
-+
-+ if(!priv->bRegHighPowerMechanism)
-+ {
-+ return false;
-+ }
-+
-+ if((ieee->state == IEEE80211_LINKED_SCANNING)||(ieee->state == IEEE80211_MESH_SCANNING))
-+ {
-+ return false;
-+ }
-+
-+ return true;
-+}
-+
-+#ifdef SW_ANTE_DIVERSITY
-+
-+#define ANTENNA_DIVERSITY_TIMER_PERIOD 1000 // 1000 m
-+
-+void
-+SwAntennaDiversityRxOk8185(
-+ struct net_device *dev,
-+ u8 SignalStrength
-+ )
-+{
-+ struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
-+
-+ //printk("+SwAntennaDiversityRxOk8185: RxSs: %d\n", SignalStrength);
-+
-+ priv->AdRxOkCnt++;
-+
-+ if( priv->AdRxSignalStrength != -1)
-+ {
-+ priv->AdRxSignalStrength = ((priv->AdRxSignalStrength*7) + (SignalStrength*3)) / 10;
-+ }
-+ else
-+ { // Initialization case.
-+ priv->AdRxSignalStrength = SignalStrength;
-+ }
-+
-+ //printk("====>pkt rcvd by %d\n", priv->LastRxPktAntenna);
-+ if( priv->LastRxPktAntenna ) //Main antenna.
-+ priv->AdMainAntennaRxOkCnt++;
-+ else // Aux antenna.
-+ priv->AdAuxAntennaRxOkCnt++;
-+ //printk("-SwAntennaDiversityRxOk8185: AdRxOkCnt: %d AdRxSignalStrength: %d\n", priv->AdRxOkCnt, priv->AdRxSignalStrength);
-+}
-+
-+//
-+// Description: Change Antenna Switch.
-+//
-+bool
-+SetAntenna8185(
-+ struct net_device *dev,
-+ u8 u1bAntennaIndex
-+ )
-+{
-+ struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
-+ bool bAntennaSwitched = false;
-+
-+// printk("+SetAntenna8185(): Antenna is switching to: %d \n", u1bAntennaIndex);
-+
-+ switch(u1bAntennaIndex)
-+ {
-+ case 0://main antenna
-+ switch(priv->rf_chip)
-+ {
-+ case RF_ZEBRA:
-+ case RF_ZEBRA2:
-+ //case RF_ZEBRA4:
-+ // Tx Antenna.
-+ write_nic_byte(dev, ANTSEL, 0x03); // Config TX antenna.
-+
-+ //PlatformEFIOWrite4Byte(Adapter, BBAddr, 0x01009b90); // Config CCK RX antenna.
-+ //PlatformEFIOWrite4Byte(Adapter, BBAddr, 0x5c8D); // Config OFDM RX antenna.
-+
-+ // Rx CCK .
-+ write_nic_byte(dev, 0x7f, ((0x01009b90 & 0xff000000) >> 24));
-+ write_nic_byte(dev, 0x7e, ((0x01009b90 & 0x00ff0000) >> 16));
-+ write_nic_byte(dev, 0x7d, ((0x01009b90 & 0x0000ff00) >> 8));
-+ write_nic_byte(dev, 0x7c, ((0x01009b90 & 0x000000ff) >> 0));
-+
-+ // Rx OFDM.
-+ write_nic_byte(dev, 0x7f, ((0x00005c8D & 0xff000000) >> 24));
-+ write_nic_byte(dev, 0x7e, ((0x00005c8D & 0x00ff0000) >> 16));
-+ write_nic_byte(dev, 0x7d, ((0x00005c8D & 0x0000ff00) >> 8));
-+ write_nic_byte(dev, 0x7c, ((0x00005c8D & 0x000000ff) >> 0));
-+
-+ bAntennaSwitched = true;
-+ break;
-+
-+ default:
-+ printk("SetAntenna8185: unkown RFChipID(%d)\n", priv->rf_chip);
-+ break;
-+ }
-+ break;
-+
-+ case 1:
-+ switch(priv->rf_chip)
-+ {
-+ case RF_ZEBRA:
-+ case RF_ZEBRA2:
-+ //case RF_ZEBRA4:
-+ // Tx Antenna.
-+ write_nic_byte(dev, ANTSEL, 0x00); // Config TX antenna.
-+
-+ //PlatformEFIOWrite4Byte(Adapter, BBAddr, 0x0100bb90); // Config CCK RX antenna.
-+ //PlatformEFIOWrite4Byte(Adapter, BBAddr, 0x548D); // Config OFDM RX antenna.
-+
-+ // Rx CCK.
-+ write_nic_byte(dev, 0x7f, ((0x0100bb90 & 0xff000000) >> 24));
-+ write_nic_byte(dev, 0x7e, ((0x0100bb90 & 0x00ff0000) >> 16));
-+ write_nic_byte(dev, 0x7d, ((0x0100bb90 & 0x0000ff00) >> 8));
-+ write_nic_byte(dev, 0x7c, ((0x0100bb90 & 0x000000ff) >> 0));
-+
-+ // Rx OFDM.
-+ write_nic_byte(dev, 0x7f, ((0x0000548D & 0xff000000) >> 24));
-+ write_nic_byte(dev, 0x7e, ((0x0000548D & 0x00ff0000) >> 16));
-+ write_nic_byte(dev, 0x7d, ((0x0000548D & 0x0000ff00) >> 8));
-+ write_nic_byte(dev, 0x7c, ((0x0000548D & 0x000000ff) >> 0));
-+
-+ bAntennaSwitched = true;
-+ break;
-+
-+ default:
-+ printk("SetAntenna8185: unkown RFChipID(%d)\n", priv->rf_chip);
-+ break;
-+ }
-+ break;
-+
-+ default:
-+ printk("SetAntenna8185: unkown u1bAntennaIndex(%d)\n", u1bAntennaIndex);
-+ break;
-+ }
-+
-+ if(bAntennaSwitched)
-+ {
-+ priv->CurrAntennaIndex = u1bAntennaIndex;
-+ }
-+
-+// printk("-SetAntenna8185(): return (%#X)\n", bAntennaSwitched);
-+
-+ return bAntennaSwitched;
-+}
-+
-+//
-+// Description: Toggle Antenna switch.
-+//
-+bool SwitchAntenna(struct net_device *dev)
-+{
-+ struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
-+
-+ bool bResult = false;
-+
-+ if(priv->CurrAntennaIndex == 0)
-+ {
-+ bResult = SetAntenna8185(dev, 1);
-+ if(priv->ieee80211->state == IEEE80211_LINKED)
-+ printk("Switching to Aux antenna 1 \n");
-+ }
-+ else
-+ {
-+ bResult = SetAntenna8185(dev, 0);
-+ if(priv->ieee80211->state == IEEE80211_LINKED)
-+ printk("Switching to Main antenna 0 \n");
-+ }
-+
-+ return bResult;
-+}
-+
-+//
-+// Description:
-+// Engine of SW Antenna Diversity mechanism.
-+// Since 8187 has no Tx part information,
-+// this implementation is only dependend on Rx part information.
-+//
-+// 2006.04.17, by rcnjko.
-+//
-+void SwAntennaDiversity(struct net_device *dev)
-+{
-+ struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
-+ //bool bSwCheckSS=false;
-+ bool bSwCheckSS=true;//open the SignalStrength check if not switched by rx ok pkt.
-+
-+// printk("+SwAntennaDiversity(): CurrAntennaIndex: %d\n", priv->CurrAntennaIndex);
-+
-+//by amy 080312
-+ if(bSwCheckSS){
-+ priv->AdTickCount++;
-+
-+ //printk("(1) AdTickCount: %d, AdCheckPeriod: %d\n", priv->AdTickCount, priv->AdCheckPeriod);
-+ //printk("(2) AdRxSignalStrength: %ld, AdRxSsThreshold: %ld\n", priv->AdRxSignalStrength, priv->AdRxSsThreshold);
-+ }
-+// priv->AdTickCount++;//-by amy 080312
-+
-+ // Case 1. No Link.
-+ if(priv->ieee80211->state != IEEE80211_LINKED){
-+ //printk("SwAntennaDiversity(): Case 1. No Link.\n");
-+
-+ priv->bAdSwitchedChecking = false;
-+ // I switch antenna here to prevent any one of antenna is broken before link established, 2006.04.18, by rcnjko..
-+ SwitchAntenna(dev);
-+ }
-+ // Case 2. Linked but no packet received.
-+ else if(priv->AdRxOkCnt == 0){
-+ printk("SwAntennaDiversity(): Case 2. Linked but no packet received.\n");
-+
-+ priv->bAdSwitchedChecking = false;
-+ SwitchAntenna(dev);
-+ }
-+ // Case 3. Evaluate last antenna switch action in case4. and undo it if necessary.
-+ else if(priv->bAdSwitchedChecking == true){
-+ //printk("SwAntennaDiversity(): Case 3. Evaluate last antenna switch action.\n");
-+
-+ priv->bAdSwitchedChecking = false;
-+
-+ // Adjust Rx signal strength threashold.
-+ priv->AdRxSsThreshold = (priv->AdRxSignalStrength + priv->AdRxSsBeforeSwitched) / 2;
-+
-+ priv->AdRxSsThreshold = (priv->AdRxSsThreshold > priv->AdMaxRxSsThreshold) ?
-+ priv->AdMaxRxSsThreshold: priv->AdRxSsThreshold;
-+ if(priv->AdRxSignalStrength < priv->AdRxSsBeforeSwitched){
-+ // Rx signal strength is not improved after we swtiched antenna. => Swich back.
-+ printk("SwAntennaDiversity(): Rx Signal Strength is not improved, CurrRxSs: %ld, LastRxSs: %ld\n", priv->AdRxSignalStrength, priv->AdRxSsBeforeSwitched);
-+
-+ //by amy 080312
-+ // Increase Antenna Diversity checking period due to bad decision.
-+ priv->AdCheckPeriod *= 2;
-+ //by amy 080312
-+ //
-+ // Increase Antenna Diversity checking period.
-+ if(priv->AdCheckPeriod > priv->AdMaxCheckPeriod)
-+ priv->AdCheckPeriod = priv->AdMaxCheckPeriod;
-+
-+ // Wrong deceision => switch back.
-+ SwitchAntenna(dev);
-+ }else{ // Rx Signal Strength is improved.
-+ printk("SwAntennaDiversity(): Rx Signal Strength is improved, CurrRxSs: %ld, LastRxSs: %ld\n", priv->AdRxSignalStrength, priv->AdRxSsBeforeSwitched);
-+
-+ // Reset Antenna Diversity checking period to its min value.
-+ priv->AdCheckPeriod = priv->AdMinCheckPeriod;
-+ }
-+
-+ //printk("SwAntennaDiversity(): AdRxSsThreshold: %ld, AdCheckPeriod: %d\n",
-+ // priv->AdRxSsThreshold, priv->AdCheckPeriod);
-+ }
-+ // Case 4. Evaluate if we shall switch antenna now.
-+ // Cause Table Speed is very fast in TRC Dell Lab, we check it every time.
-+ else// if(priv->AdTickCount >= priv->AdCheckPeriod)//-by amy 080312
-+ {
-+ //printk("SwAntennaDiversity(): Case 4. Evaluate if we shall switch antenna now.\n");
-+
-+ priv->AdTickCount = 0;
-+
-+ //
-+ // <Roger_Notes> We evaluate RxOk counts for each antenna first and than
-+ // evaluate signal strength.
-+ // The following operation can overcome the disability of CCA on both two antennas
-+ // When signal strength was extremely low or high.
-+ // 2008.01.30.
-+ //
-+
-+ //
-+ // Evaluate RxOk count from each antenna if we shall switch default antenna now.
-+ // Added by Roger, 2008.02.21.
-+
-+ //{by amy 080312
-+ if((priv->AdMainAntennaRxOkCnt < priv->AdAuxAntennaRxOkCnt) && (priv->CurrAntennaIndex == 0)){
-+ // We set Main antenna as default but RxOk count was less than Aux ones.
-+
-+ printk("SwAntennaDiversity(): Main antenna %d RxOK is poor, AdMainAntennaRxOkCnt: %d, AdAuxAntennaRxOkCnt: %d\n",priv->CurrAntennaIndex, priv->AdMainAntennaRxOkCnt, priv->AdAuxAntennaRxOkCnt);
-+
-+ // Switch to Aux antenna.
-+ SwitchAntenna(dev);
-+ priv->bHWAdSwitched = true;
-+ }else if((priv->AdAuxAntennaRxOkCnt < priv->AdMainAntennaRxOkCnt) && (priv->CurrAntennaIndex == 1)){
-+ // We set Aux antenna as default but RxOk count was less than Main ones.
-+
-+ printk("SwAntennaDiversity(): Aux antenna %d RxOK is poor, AdMainAntennaRxOkCnt: %d, AdAuxAntennaRxOkCnt: %d\n",priv->CurrAntennaIndex, priv->AdMainAntennaRxOkCnt, priv->AdAuxAntennaRxOkCnt);
-+
-+ // Switch to Main antenna.
-+ SwitchAntenna(dev);
-+ priv->bHWAdSwitched = true;
-+ }else{// Default antenna is better.
-+
-+ printk("SwAntennaDiversity(): Current Antenna %d is better., AdMainAntennaRxOkCnt: %d, AdAuxAntennaRxOkCnt: %d\n",priv->CurrAntennaIndex, priv->AdMainAntennaRxOkCnt, priv->AdAuxAntennaRxOkCnt);
-+
-+ // Still need to check current signal strength.
-+ priv->bHWAdSwitched = false;
-+ }
-+ //
-+ // <Roger_Notes> We evaluate Rx signal strength ONLY when default antenna
-+ // didn't changed by HW evaluation.
-+ // 2008.02.27.
-+ //
-+ // [TRC Dell Lab] SignalStrength is inaccuracy. Isaiah 2008-03-05
-+ // For example, Throughput of aux is better than main antenna(about 10M v.s 2M),
-+ // but AdRxSignalStrength is less than main.
-+ // Our guess is that main antenna have lower throughput and get many change
-+ // to receive more CCK packets(ex.Beacon) which have stronger SignalStrength.
-+ //
-+ if( (!priv->bHWAdSwitched) && (bSwCheckSS)){
-+ //by amy 080312}
-+
-+ // Evaluate Rx signal strength if we shall switch antenna now.
-+ if(priv->AdRxSignalStrength < priv->AdRxSsThreshold){
-+ // Rx signal strength is weak => Switch Antenna.
-+ printk("SwAntennaDiversity(): Rx Signal Strength is weak, CurrRxSs: %ld, RxSsThreshold: %ld\n", priv->AdRxSignalStrength, priv->AdRxSsThreshold);
-+
-+ priv->AdRxSsBeforeSwitched = priv->AdRxSignalStrength;
-+ priv->bAdSwitchedChecking = true;
-+
-+ SwitchAntenna(dev);
-+ }else{ // Rx signal strength is OK.
-+ printk("SwAntennaDiversity(): Rx Signal Strength is OK, CurrRxSs: %ld, RxSsThreshold: %ld\n", priv->AdRxSignalStrength, priv->AdRxSsThreshold);
-+
-+ priv->bAdSwitchedChecking = false;
-+ // Increase Rx signal strength threashold if necessary.
-+ if( (priv->AdRxSignalStrength > (priv->AdRxSsThreshold + 10)) && // Signal is much stronger than current threshold
-+ priv->AdRxSsThreshold <= priv->AdMaxRxSsThreshold) // Current threhold is not yet reach upper limit.
-+ {
-+ priv->AdRxSsThreshold = (priv->AdRxSsThreshold + priv->AdRxSignalStrength) / 2;
-+ priv->AdRxSsThreshold = (priv->AdRxSsThreshold > priv->AdMaxRxSsThreshold) ?
-+ priv->AdMaxRxSsThreshold: priv->AdRxSsThreshold;//+by amy 080312
-+ }
-+
-+ // Reduce Antenna Diversity checking period if possible.
-+ if( priv->AdCheckPeriod > priv->AdMinCheckPeriod )
-+ {
-+ priv->AdCheckPeriod /= 2;
-+ }
-+ }
-+ }
-+ }
-+//by amy 080312
-+ // Reset antenna diversity Rx related statistics.
-+ priv->AdRxOkCnt = 0;
-+ priv->AdMainAntennaRxOkCnt = 0;
-+ priv->AdAuxAntennaRxOkCnt = 0;
-+//by amy 080312
-+
-+// priv->AdRxOkCnt = 0;//-by amy 080312
-+
-+ //printk("-SwAntennaDiversity()\n");
-+}
-+
-+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20))
-+void SwAntennaWorkItemCallback(struct work_struct *work)
-+{
-+ struct ieee80211_device *ieee = container_of(work, struct ieee80211_device, SwAntennaWorkItem.work);
-+ struct net_device *dev = ieee->dev;
-+#else
-+void SwAntennaWorkItemCallback(struct net_device *dev)
-+{
-+#endif
-+ //printk("==>%s \n", __func__);
-+ SwAntennaDiversity(dev);
-+}
-+
-+//
-+// Description: Timer callback function of SW Antenna Diversity.
-+//
-+void SwAntennaDiversityTimerCallback(struct net_device *dev)
-+{
-+ struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
-+ RT_RF_POWER_STATE rtState;
-+
-+ //printk("+SwAntennaDiversityTimerCallback()\n");
-+
-+ //
-+ // We do NOT need to switch antenna while RF is off.
-+ // 2007.05.09, added by Roger.
-+ //
-+ rtState = priv->eRFPowerState;
-+ do{
-+ if (rtState == eRfOff){
-+// printk("SwAntennaDiversityTimer - RF is OFF.\n");
-+ break;
-+ }else if (rtState == eRfSleep){
-+ // Don't access BB/RF under Disable PLL situation.
-+ //RT_TRACE((COMP_RF|COMP_ANTENNA), DBG_LOUD, ("SwAntennaDiversityTimerCallback(): RF is Sleep => skip it\n"));
-+ break;
-+ }
-+
-+ queue_work(priv->ieee80211->wq,(void *)&priv->ieee80211->SwAntennaWorkItem);
-+
-+ }while(false);
-+
-+ if(priv->up){
-+ //priv->SwAntennaDiversityTimer.expires = jiffies + MSECS(ANTENNA_DIVERSITY_TIMER_PERIOD);
-+ //add_timer(&priv->SwAntennaDiversityTimer);
-+ mod_timer(&priv->SwAntennaDiversityTimer, jiffies + MSECS(ANTENNA_DIVERSITY_TIMER_PERIOD));
-+ }
-+
-+}
-+#endif
-+
-+
-+
-diff -Nur linux-2.6.30.5.orig/drivers/net/wireless/rtl8187b/r8180_dm.h linux-2.6.30.5/drivers/net/wireless/rtl8187b/r8180_dm.h
---- linux-2.6.30.5.orig/drivers/net/wireless/rtl8187b/r8180_dm.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.30.5/drivers/net/wireless/rtl8187b/r8180_dm.h 2009-08-23 19:01:04.000000000 +0200
-@@ -0,0 +1,38 @@
-+/*
-+ Hardware dynamic mechanism for RTL8187B.
-+Notes:
-+ This file is ported from RTL8187B Windows driver
-+*/
-+
-+#ifndef R8180_DM_H
-+#define R8180_DM_H
-+
-+#include "r8187.h"
-+
-+bool CheckDig(struct net_device *dev);
-+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20))
-+void rtl8180_hw_dig_wq (struct work_struct *work);
-+#else
-+void rtl8180_hw_dig_wq(struct net_device *dev);
-+#endif
-+
-+bool CheckHighPower(struct net_device *dev);
-+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20))
-+void rtl8180_tx_pw_wq (struct work_struct *work);
-+#else
-+void rtl8180_tx_pw_wq(struct net_device *dev);
-+#endif
-+
-+//by lzm for antenna
-+#ifdef SW_ANTE_DIVERSITY
-+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20))
-+void SwAntennaWorkItemCallback(struct work_struct *work);
-+#else
-+void SwAntennaWorkItemCallback(struct net_device *dev);
-+#endif
-+void SwAntennaDiversityRxOk8185(struct net_device *dev, u8 SignalStrength);
-+void SwAntennaDiversityTimerCallback(struct net_device *dev);
-+#endif
-+//by lzm for antenna
-+
-+#endif //R8180_PM_H
-diff -Nur linux-2.6.30.5.orig/drivers/net/wireless/rtl8187b/r8180_hw.h linux-2.6.30.5/drivers/net/wireless/rtl8187b/r8180_hw.h
---- linux-2.6.30.5.orig/drivers/net/wireless/rtl8187b/r8180_hw.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.30.5/drivers/net/wireless/rtl8187b/r8180_hw.h 2009-08-23 19:01:04.000000000 +0200
-@@ -0,0 +1,788 @@
-+/*
-+ This is part of rtl8187 OpenSource driver.
-+ Copyright (C) Andrea Merello 2004-2005 <andreamrl@tiscali.it>
-+ Released under the terms of GPL (General Public Licence)
-+
-+ Parts of this driver are based on the GPL part of the
-+ official Realtek driver.
-+ Parts of this driver are based on the rtl8180 driver skeleton
-+ from Patric Schenke & Andres Salomon.
-+ Parts of this driver are based on the Intel Pro Wireless
-+ 2100 GPL driver.
-+
-+ We want to tanks the Authors of those projects
-+ and the Ndiswrapper project Authors.
-+*/
-+
-+/* Mariusz Matuszek added full registers definition with Realtek's name */
-+
-+/* this file contains register definitions for the rtl8187 MAC controller */
-+#ifndef R8180_HW
-+#define R8180_HW
-+
-+typedef enum _RF_TYPE_8187{
-+ RF_TYPE_MIN,
-+ RF_ZEBRA = 5,
-+ RF_ZEBRA2, // added by Annie, 2005-08-01.
-+ RF_TYPE_MAX,
-+}RF_TYPE_8187,*PRF_TYPE_8187;
-+
-+typedef enum _VERSION_8187{
-+ // RTL8187
-+ VERSION_8187_B, // B-cut
-+ VERSION_8187_D, // D-cut
-+ // RTL8187B
-+ VERSION_8187B_B, // B-cut
-+ VERSION_8187B_D, //D-cut //added 2007-9-14
-+ VERSION_8187B_E, //E-cut //added 2007-9-14
-+}VERSION_8187,*PVERSION_8187;
-+
-+//by lzm for antenna
-+#ifdef SW_ANTE_DIVERSITY
-+#define RF_PARAM 0x19
-+#define RF_PARAM_DIGPHY_SHIFT 0
-+#define RF_PARAM_ANTBDEFAULT_SHIFT 1
-+#define EEPROM_VERSION 0x3c
-+#define EEPROM_CONFIG2 0x18
-+#define EEPROM_CS_THRESHOLD 0x2F
-+#define EEPROM_RF_PARAM 0x08
-+//// BIT[8-9] is for SW Antenna Diversity. Only the value EEPROM_SW_AD_ENABLE means enable, other values are diable.
-+#define EEPROM_SW_AD_MASK 0x0300
-+#define EEPROM_SW_AD_ENABLE 0x0100
-+//// BIT[10-11] determine if Antenna 1 is the Default Antenna. Only the value EEPROM_DEF_ANT_1 means TRUE, other values are FALSE.
-+#define EEPROM_DEF_ANT_MASK 0x0C00
-+#define EEPROM_DEF_ANT_1 0x0400
-+
-+#define RCR_EnCS1 BIT29 // enable carrier sense method 1
-+#define RCR_EnCS2 BIT30 // enable carrier sense method 2
-+#endif
-+//by lzm for antenna
-+
-+#define RTL8187_RF_INDEX 0x8225
-+#define RTL8187_REQT_READ 0xc0
-+#define RTL8187_REQT_WRITE 0x40
-+#define RTL8187_REQ_GET_REGS 0x05
-+#define RTL8187_REQ_SET_REGS 0x05
-+
-+
-+
-+#define MAX_TX_URB 5
-+#define MAX_RX_URB 16
-+#define RX_URB_SIZE 0x9C4
-+
-+
-+
-+
-+
-+#define BB_ANTATTEN_CHAN14 0x0c
-+#define BB_ANTENNA_B 0x40
-+
-+#define BB_HOST_BANG (1<<30)
-+#define BB_HOST_BANG_EN (1<<2)
-+#define BB_HOST_BANG_CLK (1<<1)
-+#define BB_HOST_BANG_RW (1<<3)
-+#define BB_HOST_BANG_DATA 1
-+
-+#define ANAPARAM_TXDACOFF_SHIFT 27
-+#define ANAPARAM_PWR0_MASK ((1<<30)|(1<<29)|(1<<28))
-+#define ANAPARAM_PWR0_SHIFT 28
-+#define ANAPARAM_PWR1_MASK ((1<<26)|(1<<25)|(1<<24)|(1<<23)|(1<<22)|(1<<21)|(1<<20))
-+#define ANAPARAM_PWR1_SHIFT 20
-+
-+#define MAC0 0
-+#define MAC1 1
-+#define MAC2 2
-+#define MAC3 3
-+#define MAC4 4
-+#define MAC5 5
-+
-+#define RXFIFOCOUNT 0x10
-+#define TXFIFOCOUNT 0x12
-+#define BcnIntTime 0x74
-+#define TALLY_SEL 0xfc
-+#define BQREQ 0x13
-+
-+#define CMD 0x37
-+#define CMD_RST_SHIFT 4
-+#define CMD_RESERVED_MASK ((1<<1) | (1<<5) | (1<<6) | (1<<7))
-+#define CMD_RX_ENABLE_SHIFT 3
-+#define CMD_TX_ENABLE_SHIFT 2
-+
-+#define EPROM_CMD 0x50
-+#define EPROM_CMD_RESERVED_MASK ((1<<5)|(1<<4))
-+#define EPROM_CMD_OPERATING_MODE_SHIFT 6
-+#define EPROM_CMD_OPERATING_MODE_MASK ((1<<7)|(1<<6))
-+#define EPROM_CMD_CONFIG 0x3
-+#define EPROM_CMD_NORMAL 0
-+#define EPROM_CMD_LOAD 1
-+#define EPROM_CMD_PROGRAM 2
-+#define EPROM_CS_SHIFT 3
-+#define EPROM_CK_SHIFT 2
-+#define EPROM_W_SHIFT 1
-+#define EPROM_R_SHIFT 0
-+#define CONFIG2_DMA_POLLING_MODE_SHIFT 3
-+#define INTA 0x3e
-+#define INTA_TXOVERFLOW (1<<15)
-+#define INTA_TIMEOUT (1<<14)
-+#define INTA_BEACONTIMEOUT (1<<13)
-+#define INTA_ATIM (1<<12)
-+#define INTA_BEACONDESCERR (1<<11)
-+#define INTA_BEACONDESCOK (1<<10)
-+#define INTA_HIPRIORITYDESCERR (1<<9)
-+#define INTA_HIPRIORITYDESCOK (1<<8)
-+#define INTA_NORMPRIORITYDESCERR (1<<7)
-+#define INTA_NORMPRIORITYDESCOK (1<<6)
-+#define INTA_RXOVERFLOW (1<<5)
-+#define INTA_RXDESCERR (1<<4)
-+#define INTA_LOWPRIORITYDESCERR (1<<3)
-+#define INTA_LOWPRIORITYDESCOK (1<<2)
-+#define INTA_RXCRCERR (1<<1)
-+#define INTA_RXOK (1)
-+#define INTA_MASK 0x3c
-+#define RXRING_ADDR 0xe4 // page 0
-+#define PGSELECT 0x5e
-+#define PGSELECT_PG_SHIFT 0
-+#define RX_CONF 0x44
-+#define MAC_FILTER_MASK ((1<<0) | (1<<1) | (1<<2) | (1<<3) | (1<<5) | \
-+(1<<12) | (1<<18) | (1<<19) | (1<<20) | (1<<21) | (1<<22) | (1<<23))
-+#define RX_CHECK_BSSID_SHIFT 23
-+#define ACCEPT_PWR_FRAME_SHIFT 22
-+#define ACCEPT_MNG_FRAME_SHIFT 20
-+#define ACCEPT_CTL_FRAME_SHIFT 19
-+#define ACCEPT_DATA_FRAME_SHIFT 18
-+#define ACCEPT_ICVERR_FRAME_SHIFT 12
-+#define ACCEPT_CRCERR_FRAME_SHIFT 5
-+#define ACCEPT_BCAST_FRAME_SHIFT 3
-+#define ACCEPT_MCAST_FRAME_SHIFT 2
-+#define ACCEPT_ALLMAC_FRAME_SHIFT 0
-+#define ACCEPT_NICMAC_FRAME_SHIFT 1
-+#define RX_FIFO_THRESHOLD_MASK ((1<<13) | (1<<14) | (1<<15))
-+#define RX_FIFO_THRESHOLD_SHIFT 13
-+#define RX_FIFO_THRESHOLD_128 3
-+#define RX_FIFO_THRESHOLD_256 4
-+#define RX_FIFO_THRESHOLD_512 5
-+#define RX_FIFO_THRESHOLD_1024 6
-+#define RX_FIFO_THRESHOLD_NONE 7
-+#define RX_AUTORESETPHY_SHIFT 28
-+#define EPROM_TYPE_SHIFT 6
-+#define TX_CONF 0x40
-+#define TX_CONF_HEADER_AUTOICREMENT_SHIFT 30
-+#define TX_LOOPBACK_SHIFT 17
-+#define TX_LOOPBACK_MAC 1
-+#define TX_LOOPBACK_BASEBAND 2
-+#define TX_LOOPBACK_NONE 0
-+#define TX_LOOPBACK_CONTINUE 3
-+#define TX_LOOPBACK_MASK ((1<<17)|(1<<18))
-+#define TX_LRLRETRY_SHIFT 0
-+#define R8180_MAX_RETRY 255
-+#define TX_SRLRETRY_SHIFT 8
-+#define TX_NOICV_SHIFT 19
-+#define TX_NOCRC_SHIFT 16
-+#define TX_DMA_POLLING 0xd9
-+#define TX_DMA_POLLING_BEACON_SHIFT 7
-+#define TX_DMA_POLLING_HIPRIORITY_SHIFT 6
-+#define TX_DMA_POLLING_NORMPRIORITY_SHIFT 5
-+#define TX_DMA_POLLING_LOWPRIORITY_SHIFT 4
-+#define TX_DMA_STOP_BEACON_SHIFT 3
-+#define TX_DMA_STOP_HIPRIORITY_SHIFT 2
-+#define TX_DMA_STOP_NORMPRIORITY_SHIFT 1
-+#define TX_DMA_STOP_LOWPRIORITY_SHIFT 0
-+#define TX_NORMPRIORITY_RING_ADDR 0x24
-+#define TX_HIGHPRIORITY_RING_ADDR 0x28
-+#define TX_LOWPRIORITY_RING_ADDR 0x20
-+#define MAX_RX_DMA_MASK ((1<<8) | (1<<9) | (1<<10))
-+#define MAX_RX_DMA_2048 7
-+#define MAX_RX_DMA_1024 6
-+#define MAX_RX_DMA_SHIFT 10
-+#define INT_TIMEOUT 0x48
-+#define CONFIG3_CLKRUN_SHIFT 2
-+#define CONFIG3_ANAPARAM_W_SHIFT 6
-+#define ANAPARAM 0x54
-+#define BEACON_INTERVAL 0x70
-+#define BEACON_INTERVAL_MASK ((1<<0)|(1<<1)|(1<<2)|(1<<3)|(1<<4)|(1<<5)| \
-+(1<<6)|(1<<7)|(1<<8)|(1<<9))
-+#define ATIM_MASK ((1<<0)|(1<<1)|(1<<2)|(1<<3)|(1<<4)|(1<<5)|(1<<6)|(1<<7)| \
-+(1<<8)|(1<<9))
-+#define ATIM 0x72
-+#define EPROM_CS_SHIFT 3
-+#define EPROM_CK_SHIFT 2
-+#define PHY_DELAY 0x78
-+#define PHY_CONFIG 0x80
-+#define PHY_ADR 0x7c
-+#define PHY_READ 0x7e
-+#define CARRIER_SENSE_COUNTER 0x79 //byte
-+#define SECURITY 0x5f
-+#define SECURITY_WEP_TX_ENABLE_SHIFT 1
-+#define SECURITY_WEP_RX_ENABLE_SHIFT 0
-+#define SECURITY_ENCRYP_104 1
-+#define SECURITY_ENCRYP_SHIFT 4
-+#define SECURITY_ENCRYP_MASK ((1<<4)|(1<<5))
-+#define KEY0 0x90
-+#define CONFIG2_ANTENNA_SHIFT 6
-+#define TX_BEACON_RING_ADDR 0x4c
-+#define CONFIG0_WEP40_SHIFT 7
-+#define CONFIG0_WEP104_SHIFT 6
-+#define AGCRESET_SHIFT 5
-+
-+
-+
-+/*
-+ * Operational registers offsets in PCI (I/O) space.
-+ * RealTek names are used.
-+ */
-+
-+#define IDR0 0x0000
-+#define IDR1 0x0001
-+#define IDR2 0x0002
-+#define IDR3 0x0003
-+#define IDR4 0x0004
-+#define IDR5 0x0005
-+
-+/* 0x0006 - 0x0007 - reserved */
-+
-+#define MAR0 0x0008
-+#define MAR1 0x0009
-+#define MAR2 0x000A
-+#define MAR3 0x000B
-+#define MAR4 0x000C
-+#define MAR5 0x000D
-+#define MAR6 0x000E
-+#define MAR7 0x000F
-+
-+/* 0x0010 - 0x0017 - reserved */
-+
-+#define TSFTR 0x0018
-+#define TSFTR_END 0x001F
-+
-+#define TLPDA 0x0020
-+#define TLPDA_END 0x0023
-+#define TNPDA 0x0024
-+#define TNPDA_END 0x0027
-+#define THPDA 0x0028
-+#define THPDA_END 0x002B
-+
-+#define BRSR_8187 0x002C
-+#define BRSR_8187_END 0x002D
-+#define BRSR_8187B 0x0034
-+#define BRSR_8187B_END 0x0035
-+
-+#define BSSID 0x002E
-+#define BSSID_END 0x0033
-+
-+/* 0x0034 - 0x0034 - reserved */
-+
-+/* 0x0038 - 0x003B - reserved */
-+
-+#define IMR 0x003C
-+#define IMR_END 0x003D
-+
-+#define ISR 0x003E
-+#define ISR_END 0x003F
-+
-+#define TCR 0x0040
-+#define TCR_END 0x0043
-+
-+#define RCR 0x0044
-+#define RCR_END 0x0047
-+
-+#define TimerInt 0x0048
-+#define TimerInt_END 0x004B
-+
-+#define TBDA 0x004C
-+#define TBDA_END 0x004F
-+
-+#define CR9346 0x0050
-+
-+#define CONFIG0 0x0051
-+#define CONFIG1 0x0052
-+#define CONFIG2 0x0053
-+
-+#define ANA_PARAM 0x0054
-+#define ANA_PARAM_END 0x0x0057
-+
-+#define MSR 0x0058
-+
-+#define CONFIG3 0x0059
-+#define CONFIG4 0x005A
-+
-+#define TESTR 0x005B
-+
-+/* 0x005C - 0x005D - reserved */
-+#define TFPC_AC 0x005C
-+#define PSR 0x005E
-+
-+#define SCR 0x005F
-+
-+/* 0x0060 - 0x006F - reserved */
-+#define ANA_PARAM2 0x0060
-+#define ANA_PARAM2_END 0x0063
-+
-+#define BcnIntv 0x0070
-+#define BcnItv_END 0x0071
-+
-+#define AtimWnd 0x0072
-+#define AtimWnd_END 0x0073
-+
-+#define BintrItv 0x0074
-+#define BintrItv_END 0x0075
-+
-+#define AtimtrItv 0x0076
-+#define AtimtrItv_END 0x0077
-+
-+#define PhyDelay 0x0078
-+
-+//#define CRCount 0x0079
-+
-+#define AckTimeOutReg 0x79 // ACK timeout register, in unit of 4 us.
-+/* 0x007A - 0x007B - reserved */
-+#define BBAddr 0x007C
-+
-+
-+#define PhyAddr 0x007C
-+#define PhyDataW 0x007D
-+#define PhyDataR 0x007E
-+#define RF_Ready 0x007F
-+
-+#define PhyCFG 0x0080
-+#define PhyCFG_END 0x0083
-+
-+/* following are for rtl8185 */
-+#define RFPinsOutput 0x80
-+#define RFPinsEnable 0x82
-+#define RF_TIMING 0x8c
-+#define RFPinsSelect 0x84
-+#define ANAPARAM2 0x60
-+#define RF_PARA 0x88
-+#define RFPinsInput 0x86
-+#define GP_ENABLE 0x90
-+#define GPIO 0x91
-+#define HSSI_PARA 0x94 // HSS Parameter
-+#define SW_CONTROL_GPIO 0x400
-+#define CCK_TXAGC 0x9d
-+#define OFDM_TXAGC 0x9e
-+#define ANTSEL 0x9f
-+#define TXAGC_CTL_PER_PACKET_ANT_SEL 0x02
-+#define WPA_CONFIG 0xb0
-+#define TX_AGC_CTL 0x9c
-+#define TX_AGC_CTL_PER_PACKET_TXAGC 0x01
-+#define TX_AGC_CTL_PERPACKET_GAIN_SHIFT 0
-+#define TX_AGC_CTL_PERPACKET_ANTSEL_SHIFT 1
-+#define TX_AGC_CTL_FEEDBACK_ANT 2
-+#define RESP_RATE 0x34
-+#define SIFS 0xb4
-+#define DIFS 0xb5
-+#define EIFS_8187 0x35
-+#define EIFS_8187B 0x2D
-+#define SLOT 0xb6
-+#define CW_VAL 0xbd
-+#define CW_CONF 0xbc
-+#define CW_CONF_PERPACKET_RETRY_LIMIT 0x02
-+#define CW_CONF_PERPACKET_CW 0x01
-+#define CW_CONF_PERPACKET_RETRY_SHIFT 1
-+#define CW_CONF_PERPACKET_CW_SHIFT 0
-+#define MAX_RESP_RATE_SHIFT 4
-+#define MIN_RESP_RATE_SHIFT 0
-+#define RATE_FALLBACK 0xbe
-+#define RATE_FALLBACK_CTL_ENABLE 0x80
-+#define RATE_FALLBACK_CTL_AUTO_STEP0 0x00
-+
-+#define ARFR 0x1E0 // Auto Rate Fallback Register (0x1e0 ~ 0x1e2)
-+#define RMS 0x1EC // Rx Max Pacetk Size (0x1ec[0:12])
-+
-+/*
-+ * 0x0084 - 0x00D3 is selected to page 1 when PSEn bit (bit0, PSR)
-+ * is set to 1
-+ */
-+
-+#define Wakeup0 0x0084
-+#define Wakeup0_END 0x008B
-+
-+#define Wakeup1 0x008C
-+#define Wakeup1_END 0x0093
-+
-+#define Wakeup2LD 0x0094
-+#define Wakeup2LD_END 0x009B
-+#define Wakeup2HD 0x009C
-+#define Wakeup2HD_END 0x00A3
-+
-+#define Wakeup3LD 0x00A4
-+#define Wakeup3LD_END 0x00AB
-+#define Wakeup3HD 0x00AC
-+#define Wakeup3HD_END 0x00B3
-+
-+#define Wakeup4LD 0x00B4
-+#define Wakeup4LD_END 0x00BB
-+#define Wakeup4HD 0x00BC
-+#define Wakeup4HD_END 0x00C3
-+
-+#define CRC0 0x00C4
-+#define CRC0_END 0x00C5
-+#define CRC1 0x00C6
-+#define CRC1_END 0x00C7
-+#define CRC2 0x00C8
-+#define CRC2_END 0x00C9
-+#define CRC3 0x00CA
-+#define CRC3_END 0x00CB
-+#define CRC4 0x00CC
-+#define CRC4_END 0x00CD
-+
-+/* 0x00CE - 0x00D3 - reserved */
-+
-+
-+
-+/*
-+ * 0x0084 - 0x00D3 is selected to page 0 when PSEn bit (bit0, PSR)
-+ * is set to 0
-+ */
-+
-+/* 0x0084 - 0x008F - reserved */
-+
-+#define DK0 0x0090
-+#define DK0_END 0x009F
-+#define DK1 0x00A0
-+#define DK1_END 0x00AF
-+#define DK2 0x00B0
-+#define DK2_END 0x00BF
-+#define DK3 0x00C0
-+#define DK3_END 0x00CF
-+
-+#define GPO 0x90
-+#define GPE 0x91
-+#define GPI 0x92
-+
-+#define RFTiming 0x008C
-+#define ACM_CONTROL 0x00BF // ACM Control Registe
-+#define INT_MIG 0x00E2 // Interrupt Migration (0xE2 ~ 0xE3)
-+#define TID_AC_MAP 0x00E8 // TID to AC Mapping Register
-+
-+#define AC_VO_PARAM 0x00F0 // AC_VO Parameters Record
-+#define AC_VI_PARAM 0x00F4 // AC_VI Parameters Record
-+#define AC_BE_PARAM 0x00F8 // AC_BE Parameters Record
-+#define AC_BK_PARAM 0x00FC // AC_BK Parameters Record
-+
-+/* 0x00D0 - 0x00D3 - reserved */
-+#define CCK_FALSE_ALARM 0x00D0
-+#define OFDM_FALSE_ALARM 0x00D2
-+
-+
-+/* 0x00D4 - 0x00D7 - reserved */
-+
-+#define CONFIG5 0x00D8
-+
-+#define TPPoll 0x00D9
-+
-+/* 0x00DA - 0x00DB - reserved */
-+
-+#define CWR 0x00DC
-+#define CWR_END 0x00DD
-+
-+#define RetryCTR 0x00DE
-+
-+/* 0x00DF - 0x00E3 - reserved */
-+
-+#define RDSAR 0x00E4
-+#define RDSAR_END 0x00E7
-+
-+/* 0x00E8 - 0x00EF - reserved */
-+#define ANA_PARAM3 0x00EE
-+
-+#define FER 0x00F0
-+#define FER_END 0x00F3
-+
-+#define FEMR 0x1D4 // Function Event Mask register (0xf4 ~ 0xf7)
-+//#define FEMR 0x00F4
-+#define FEMR_END 0x00F7
-+
-+#define FPSR 0x00F8
-+#define FPSR_END 0x00FB
-+
-+#define FFER 0x00FC
-+#define FFER_END 0x00FF
-+
-+/*
-+ * 0x0000 - 0x00ff is selected to page 0 when PSEn bit (bit0, PSR)
-+ * is set to 2
-+ */
-+#define RFSW_CTRL 0x272 // 0x272-0x273.
-+
-+
-+
-+//----------------------------------------------------------------------------
-+// 8187B AC_XX_PARAM bits
-+//----------------------------------------------------------------------------
-+#define AC_PARAM_TXOP_LIMIT_OFFSET 16
-+#define AC_PARAM_ECW_MAX_OFFSET 12
-+#define AC_PARAM_ECW_MIN_OFFSET 8
-+#define AC_PARAM_AIFS_OFFSET 0
-+
-+//----------------------------------------------------------------------------
-+// 8187B ACM_CONTROL bits (Offset 0xBF, 1 Byte)
-+//----------------------------------------------------------------------------
-+#define VOQ_ACM_EN (0x01 << 7) //BIT7
-+#define VIQ_ACM_EN (0x01 << 6) //BIT6
-+#define BEQ_ACM_EN (0x01 << 5) //BIT5
-+#define ACM_HW_EN (0x01 << 4) //BIT4
-+#define TXOPSEL (0x01 << 3) //BIT3
-+#define VOQ_ACM_CTL (0x01 << 2) //BIT2 // Set to 1 when AC_VO used time reaches or exceeds the admitted time
-+#define VIQ_ACM_CTL (0x01 << 1) //BIT1 // Set to 1 when AC_VI used time reaches or exceeds the admitted time
-+#define BEQ_ACM_CTL (0x01 << 0) //BIT0 // Set to 1 when AC_BE used time reaches or exceeds the admitted time
-+
-+//----------------------------------------------------------------------------
-+// 8187B RF pins related setting (offset 0xFF80-0xFF87,)
-+//----------------------------------------------------------------------------
-+#define TR_SW_MASK_TX_8187 BIT5
-+#define TR_SW_MASK_RX_8187 BIT6
-+#define TR_SW_MASK_8187 (TR_SW_MASK_TX_8187 | TR_SW_MASK_RX_8187)
-+
-+/*
-+ * Bitmasks for specific register functions.
-+ * Names are derived from the register name and function name.
-+ *
-+ * <REGISTER>_<FUNCTION>[<bit>]
-+ *
-+ * this leads to some awkward names...
-+ */
-+
-+#define BRSR_BPLCP ((1<< 8))
-+#define BRSR_MBR ((1<< 1)|(1<< 0))
-+#define BRSR_MBR_8185 ((1<< 11)|(1<< 10)|(1<< 9)|(1<< 8)|(1<< 7)|(1<< 6)|(1<< 5)|(1<< 4)|(1<< 3)|(1<< 2)|(1<< 1)|(1<< 0))
-+#define BRSR_MBR0 ((1<< 0))
-+#define BRSR_MBR1 ((1<< 1))
-+
-+#define CR_RST ((1<< 4))
-+#define CR_RE ((1<< 3))
-+#define CR_TE ((1<< 2))
-+#define CR_MulRW ((1<< 0))
-+
-+#define IMR_TXFOVW ((1<<15))
-+#define IMR_TimeOut ((1<<14))
-+#define IMR_BcnInt ((1<<13))
-+#define IMR_ATIMInt ((1<<12))
-+#define IMR_TBDER ((1<<11))
-+#define IMR_TBDOK ((1<<10))
-+#define IMR_THPDER ((1<< 9))
-+#define IMR_THPDOK ((1<< 8))
-+#define IMR_TNPDER ((1<< 7))
-+#define IMR_TNPDOK ((1<< 6))
-+#define IMR_RXFOVW ((1<< 5))
-+#define IMR_RDU ((1<< 4))
-+#define IMR_TLPDER ((1<< 3))
-+#define IMR_TLPDOK ((1<< 2))
-+#define IMR_RER ((1<< 1))
-+#define IMR_ROK ((1<< 0))
-+
-+#define ISR_TXFOVW ((1<<15))
-+#define ISR_TimeOut ((1<<14))
-+#define ISR_BcnInt ((1<<13))
-+#define ISR_ATIMInt ((1<<12))
-+#define ISR_TBDER ((1<<11))
-+#define ISR_TBDOK ((1<<10))
-+#define ISR_THPDER ((1<< 9))
-+#define ISR_THPDOK ((1<< 8))
-+#define ISR_TNPDER ((1<< 7))
-+#define ISR_TNPDOK ((1<< 6))
-+#define ISR_RXFOVW ((1<< 5))
-+#define ISR_RDU ((1<< 4))
-+#define ISR_TLPDER ((1<< 3))
-+#define ISR_TLPDOK ((1<< 2))
-+#define ISR_RER ((1<< 1))
-+#define ISR_ROK ((1<< 0))
-+
-+#define HW_VERID_R8180_F 3
-+#define HW_VERID_R8180_ABCD 2
-+#define HW_VERID_R8185_ABC 4
-+#define HW_VERID_R8185_D 5
-+
-+#define TCR_DurProcMode ((1<<30))
-+#define TCR_DISReqQsize ((1<<28))
-+#define TCR_HWVERID_MASK ((1<<27)|(1<<26)|(1<<25))
-+#define TCR_HWVERID_SHIFT 25
-+#define TCR_SWPLCPLEN ((1<<24))
-+#define TCR_PLCP_LEN TCR_SAT // rtl8180
-+#define TCR_MXDMA_MASK ((1<<23)|(1<<22)|(1<<21))
-+#define TCR_MXDMA_1024 6
-+#define TCR_MXDMA_2048 7
-+#define TCR_MXDMA_SHIFT 21
-+#define TCR_DISCW ((1<<20))
-+#define TCR_ICV ((1<<19))
-+#define TCR_LBK ((1<<18)|(1<<17))
-+#define TCR_LBK1 ((1<<18))
-+#define TCR_LBK0 ((1<<17))
-+#define TCR_CRC ((1<<16))
-+#define TCR_SRL_MASK ((1<<15)|(1<<14)|(1<<13)|(1<<12)|(1<<11)|(1<<10)|(1<<9)|(1<<8))
-+#define TCR_LRL_MASK ((1<<0)|(1<<1)|(1<<2)|(1<<3)|(1<<4)|(1<<5)|(1<<6)|(1<<7))
-+#define TCR_PROBE_NOTIMESTAMP_SHIFT 29 //rtl8185
-+
-+#define RCR_ONLYERLPKT ((1<<31))
-+#define RCR_CS_SHIFT 29
-+#define RCR_CS_MASK ((1<<30) | (1<<29))
-+#define RCR_ENMARP ((1<<28))
-+#define RCR_CBSSID ((1<<23))
-+#define RCR_APWRMGT ((1<<22))
-+#define RCR_ADD3 ((1<<21))
-+#define RCR_AMF ((1<<20))
-+#define RCR_ACF ((1<<19))
-+#define RCR_ADF ((1<<18))
-+#define RCR_RXFTH ((1<<15)|(1<<14)|(1<<13))
-+#define RCR_RXFTH2 ((1<<15))
-+#define RCR_RXFTH1 ((1<<14))
-+#define RCR_RXFTH0 ((1<<13))
-+#define RCR_AICV ((1<<12))
-+#define RCR_MXDMA ((1<<10)|(1<< 9)|(1<< 8))
-+#define RCR_MXDMA2 ((1<<10))
-+#define RCR_MXDMA1 ((1<< 9))
-+#define RCR_MXDMA0 ((1<< 8))
-+#define RCR_9356SEL ((1<< 6))
-+#define RCR_ACRC32 ((1<< 5))
-+#define RCR_AB ((1<< 3))
-+#define RCR_AM ((1<< 2))
-+#define RCR_APM ((1<< 1))
-+#define RCR_AAP ((1<< 0))
-+
-+#define CR9346_EEM ((1<<7)|(1<<6))
-+#define CR9346_EEM1 ((1<<7))
-+#define CR9346_EEM0 ((1<<6))
-+#define CR9346_EECS ((1<<3))
-+#define CR9346_EESK ((1<<2))
-+#define CR9346_EED1 ((1<<1))
-+#define CR9346_EED0 ((1<<0))
-+
-+#define CONFIG0_WEP104 ((1<<6))
-+#define CONFIG0_LEDGPO_En ((1<<4))
-+#define CONFIG0_Aux_Status ((1<<3))
-+#define CONFIG0_GL ((1<<1)|(1<<0))
-+#define CONFIG0_GL1 ((1<<1))
-+#define CONFIG0_GL0 ((1<<0))
-+
-+#define CONFIG1_LEDS ((1<<7)|(1<<6))
-+#define CONFIG1_LEDS1 ((1<<7))
-+#define CONFIG1_LEDS0 ((1<<6))
-+#define CONFIG1_LWACT ((1<<4))
-+#define CONFIG1_MEMMAP ((1<<3))
-+#define CONFIG1_IOMAP ((1<<2))
-+#define CONFIG1_VPD ((1<<1))
-+#define CONFIG1_PMEn ((1<<0))
-+
-+#define CONFIG2_LCK ((1<<7))
-+#define CONFIG2_ANT ((1<<6))
-+#define CONFIG2_DPS ((1<<3))
-+#define CONFIG2_PAPE_sign ((1<<2))
-+#define CONFIG2_PAPE_time ((1<<1)|(1<<0))
-+#define CONFIG2_PAPE_time1 ((1<<1))
-+#define CONFIG2_PAPE_time0 ((1<<0))
-+
-+#define CONFIG3_GNTSel ((1<<7))
-+#define CONFIG3_PARM_En ((1<<6))
-+#define CONFIG3_Magic ((1<<5))
-+#define CONFIG3_CardB_En ((1<<3))
-+#define CONFIG3_CLKRUN_En ((1<<2))
-+#define CONFIG3_FuncRegEn ((1<<1))
-+#define CONFIG3_FBtbEn ((1<<0))
-+
-+#define CONFIG4_VCOPDN ((1<<7))
-+#define CONFIG4_PWROFF ((1<<6))
-+#define CONFIG4_PWRMGT ((1<<5))
-+#define CONFIG4_LWPME ((1<<4))
-+#define CONFIG4_LWPTN ((1<<2))
-+#define CONFIG4_RFTYPE ((1<<1)|(1<<0))
-+#define CONFIG4_RFTYPE1 ((1<<1))
-+#define CONFIG4_RFTYPE0 ((1<<0))
-+
-+#define CONFIG5_TX_FIFO_OK ((1<<7))
-+#define CONFIG5_RX_FIFO_OK ((1<<6))
-+#define CONFIG5_CALON ((1<<5))
-+#define CONFIG5_EACPI ((1<<2))
-+#define CONFIG5_LANWake ((1<<1))
-+#define CONFIG5_PME_STS ((1<<0))
-+
-+#define MSR_LINK_MASK ((1<<2)|(1<<3))
-+#define MSR_LINK_MANAGED 2
-+#define MSR_LINK_NONE 0
-+#define MSR_LINK_SHIFT 2
-+#define MSR_LINK_ADHOC 1
-+#define MSR_LINK_MASTER 3
-+#define MSR_LINK_ENEDCA (1<<4)
-+
-+#define PSR_GPO ((1<<7))
-+#define PSR_GPI ((1<<6))
-+#define PSR_LEDGPO1 ((1<<5))
-+#define PSR_LEDGPO0 ((1<<4))
-+#define PSR_UWF ((1<<1))
-+#define PSR_PSEn ((1<<0))
-+
-+#define SCR_KM ((1<<5)|(1<<4))
-+#define SCR_KM1 ((1<<5))
-+#define SCR_KM0 ((1<<4))
-+#define SCR_TXSECON ((1<<1))
-+#define SCR_RXSECON ((1<<0))
-+
-+#define BcnItv_BcnItv (0x01FF)
-+
-+#define AtimWnd_AtimWnd (0x01FF)
-+
-+#define BintrItv_BintrItv (0x01FF)
-+
-+#define AtimtrItv_AtimtrItv (0x01FF)
-+
-+#define PhyDelay_PhyDelay ((1<<2)|(1<<1)|(1<<0))
-+
-+#define TPPoll_BQ ((1<<7))
-+#define TPPoll_HPQ ((1<<6))
-+#define TPPoll_NPQ ((1<<5))
-+#define TPPoll_LPQ ((1<<4))
-+#define TPPoll_SBQ ((1<<3))
-+#define TPPoll_SHPQ ((1<<2))
-+#define TPPoll_SNPQ ((1<<1))
-+#define TPPoll_SLPQ ((1<<0))
-+
-+#define CWR_CW (0x01FF)
-+
-+#define FER_INTR ((1<<15))
-+#define FER_GWAKE ((1<< 4))
-+
-+#define FEMR_INTR ((1<<15))
-+#define FEMR_WKUP ((1<<14))
-+#define FEMR_GWAKE ((1<< 4))
-+
-+#define FPSR_INTR ((1<<15))
-+#define FPSR_GWAKE ((1<< 4))
-+
-+#define FFER_INTR ((1<<15))
-+#define FFER_GWAKE ((1<< 4))
-+
-+
-+//----------------------------------------------------------------------------
-+// 818xB AnaParm & AnaParm2 Register
-+//----------------------------------------------------------------------------
-+/*
-+#ifdef RTL8185B_FPGA
-+#define ANAPARM_FPGA_ON 0xa0000b59
-+//#define ANAPARM_FPGA_OFF
-+#define ANAPARM2_FPGA_ON 0x860dec11
-+//#define ANAPARM2_FPGA_OFF
-+#else //ASIC
-+*/
-+#define ANAPARM_ASIC_ON 0x45090658
-+//#define ANAPARM_ASIC_OFF
-+#define ANAPARM2_ASIC_ON 0x727f3f52
-+//#define ANAPARM2_ASIC_OFF
-+//#endif
-+//by amy for power save
-+#define RF_CHANGE_BY_SW BIT31
-+#define RF_CHANGE_BY_HW BIT30
-+#define RF_CHANGE_BY_PS BIT29
-+#define RF_CHANGE_BY_IPS BIT28
-+#define ANAPARM_ASIC_ON 0x45090658
-+#define ANAPARM2_ASIC_ON 0x727f3f52
-+
-+#define ANAPARM_ON ANAPARM_ASIC_ON
-+#define ANAPARM2_ON ANAPARM2_ASIC_ON
-+#define TFPC 0x5C // Tx FIFO Packet Count for BK, BE, VI, VO queues (2 bytes)
-+#define Config4_PowerOff BIT6 // Turn ON/Off RF Power(RFMD)
-+#define ANAPARM_OFF 0x51480658
-+#define ANAPARM2_OFF 0x72003f70
-+//by amy for power save
-+
-+#define MAX_DOZE_WAITING_TIMES_87B 500
-+
-+#endif
-diff -Nur linux-2.6.30.5.orig/drivers/net/wireless/rtl8187b/r8180_pm.c linux-2.6.30.5/drivers/net/wireless/rtl8187b/r8180_pm.c
---- linux-2.6.30.5.orig/drivers/net/wireless/rtl8187b/r8180_pm.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.30.5/drivers/net/wireless/rtl8187b/r8180_pm.c 2009-08-23 19:01:04.000000000 +0200
-@@ -0,0 +1,99 @@
-+/*
-+ Power management interface routines.
-+ Written by Mariusz Matuszek.
-+ This code is currently just a placeholder for later work and
-+ does not do anything useful.
-+
-+ This is part of rtl8180 OpenSource driver.
-+ Copyright (C) Andrea Merello 2004 <andreamrl@tiscali.it>
-+ Released under the terms of GPL (General Public Licence)
-+*/
-+
-+#ifdef CONFIG_RTL8180_PM
-+
-+
-+#include "r8180_hw.h"
-+#include "r8180_pm.h"
-+#include "r8187.h"
-+int rtl8180_save_state (struct pci_dev *dev, u32 state)
-+{
-+ printk(KERN_NOTICE "r8180 save state call (state %u).\n", state);
-+ return(-EAGAIN);
-+}
-+
-+//netif_running is set to 0 before system call rtl8180_close,
-+//netif_running is set to 1 before system call rtl8180_open,
-+//if open success it will not change, or it change to 0;
-+int rtl8187_suspend (struct usb_interface *intf, pm_message_t state)
-+{
-+ struct r8180_priv *priv;
-+#if LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0)
-+ struct net_device *dev = usb_get_intfdata(intf);
-+#else
-+ //struct net_device *dev = (struct net_device *)ptr;
-+#endif
-+
-+ printk("====>%s \n", __func__);
-+ priv=ieee80211_priv(dev);
-+
-+ if(dev) {
-+#ifdef POLLING_METHOD_FOR_RADIO
-+ del_timer_sync(&priv->gpio_polling_timer);
-+ cancel_delayed_work(&priv->ieee80211->GPIOChangeRFWorkItem);
-+ priv->polling_timer_on = 0;
-+#endif
-+ if (!netif_running(dev)) {
-+ //printk(KERN_WARNING "UI or other close dev before suspend, go out suspend function\n");
-+ return 0;
-+ }
-+
-+ dev->netdev_ops->ndo_stop(dev);
-+ netif_device_detach(dev);
-+ }
-+ return 0;
-+}
-+
-+
-+int rtl8187_resume (struct usb_interface *intf)
-+{
-+ struct r8180_priv *priv;
-+#if LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0)
-+ struct net_device *dev = usb_get_intfdata(intf);
-+#else
-+ //struct net_device *dev = (struct net_device *)ptr;
-+#endif
-+
-+ printk("====>%s \n", __func__);
-+ priv=ieee80211_priv(dev);
-+
-+ if(dev) {
-+#ifdef POLLING_METHOD_FOR_RADIO
-+ if(priv->polling_timer_on == 0){//add for S3/S4
-+ gpio_change_polling((unsigned long)dev);
-+ }
-+#endif
-+ if (!netif_running(dev)){
-+ //printk(KERN_WARNING "UI or other close dev before suspend, go out resume function\n");
-+ return 0;
-+ }
-+
-+ netif_device_attach(dev);
-+ dev->netdev_ops->ndo_open(dev);
-+ }
-+
-+ return 0;
-+}
-+
-+
-+int rtl8180_enable_wake (struct pci_dev *dev, u32 state, int enable)
-+{
-+
-+ //printk(KERN_NOTICE "r8180 enable wake call (state %u, enable %d).\n",
-+ // state, enable);
-+ return 0;
-+ //return(-EAGAIN);
-+}
-+
-+
-+
-+#endif //CONFIG_RTL8180_PM
-diff -Nur linux-2.6.30.5.orig/drivers/net/wireless/rtl8187b/r8180_pm.h linux-2.6.30.5/drivers/net/wireless/rtl8187b/r8180_pm.h
---- linux-2.6.30.5.orig/drivers/net/wireless/rtl8187b/r8180_pm.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.30.5/drivers/net/wireless/rtl8187b/r8180_pm.h 2009-08-23 19:01:04.000000000 +0200
-@@ -0,0 +1,28 @@
-+/*
-+ Power management interface routines.
-+ Written by Mariusz Matuszek.
-+ This code is currently just a placeholder for later work and
-+ does not do anything useful.
-+
-+ This is part of rtl8180 OpenSource driver.
-+ Copyright (C) Andrea Merello 2004 <andreamrl@tiscali.it>
-+ Released under the terms of GPL (General Public Licence)
-+
-+*/
-+
-+#ifdef CONFIG_RTL8180_PM
-+
-+#ifndef R8180_PM_H
-+#define R8180_PM_H
-+
-+#include <linux/types.h>
-+#include <linux/usb.h>
-+
-+int rtl8180_save_state (struct pci_dev *dev, u32 state);
-+int rtl8187_suspend (struct usb_interface *intf,pm_message_t state);
-+int rtl8187_resume (struct usb_interface *intf);
-+int rtl8180_enable_wake (struct pci_dev *dev, u32 state, int enable);
-+
-+#endif //R8180_PM_H
-+
-+#endif // CONFIG_RTL8180_PM
-diff -Nur linux-2.6.30.5.orig/drivers/net/wireless/rtl8187b/r8180_rtl8225.c linux-2.6.30.5/drivers/net/wireless/rtl8187b/r8180_rtl8225.c
---- linux-2.6.30.5.orig/drivers/net/wireless/rtl8187b/r8180_rtl8225.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.30.5/drivers/net/wireless/rtl8187b/r8180_rtl8225.c 2009-08-23 19:01:04.000000000 +0200
-@@ -0,0 +1,1007 @@
-+/*
-+ This is part of the rtl8180-sa2400 driver
-+ released under the GPL (See file COPYING for details).
-+ Copyright (c) 2005 Andrea Merello <andreamrl@tiscali.it>
-+
-+ This files contains programming code for the rtl8225
-+ radio frontend.
-+
-+ *Many* thanks to Realtek Corp. for their great support!
-+
-+*/
-+
-+
-+
-+#include "r8180_hw.h"
-+#include "r8180_rtl8225.h"
-+#ifdef ENABLE_DOT11D
-+#include "dot11d.h"
-+#endif
-+
-+#define USE_8051_3WIRE 1
-+
-+u8 rtl8225_threshold[]={
-+ 0x8d, 0x8d, 0x8d, 0x8d, 0x9d, 0xad, 0xbd,
-+};
-+
-+u8 rtl8225_gain[]={
-+ 0x23,0x88,0x7c,0xa5,// -82dbm
-+ 0x23,0x88,0x7c,0xb5,// -82dbm
-+ 0x23,0x88,0x7c,0xc5,// -82dbm
-+ 0x33,0x80,0x79,0xc5,// -78dbm
-+ 0x43,0x78,0x76,0xc5,// -74dbm
-+ 0x53,0x60,0x73,0xc5,// -70dbm
-+ 0x63,0x58,0x70,0xc5,// -66dbm
-+};
-+
-+u16 rtl8225bcd_rxgain[]={
-+ 0x0400, 0x0401, 0x0402, 0x0403, 0x0404, 0x0405, 0x0408, 0x0409,
-+ 0x040a, 0x040b, 0x0502, 0x0503, 0x0504, 0x0505, 0x0540, 0x0541,
-+ 0x0542, 0x0543, 0x0544, 0x0545, 0x0580, 0x0581, 0x0582, 0x0583,
-+ 0x0584, 0x0585, 0x0588, 0x0589, 0x058a, 0x058b, 0x0643, 0x0644,
-+ 0x0645, 0x0680, 0x0681, 0x0682, 0x0683, 0x0684, 0x0685, 0x0688,
-+ 0x0689, 0x068a, 0x068b, 0x068c, 0x0742, 0x0743, 0x0744, 0x0745,
-+ 0x0780, 0x0781, 0x0782, 0x0783, 0x0784, 0x0785, 0x0788, 0x0789,
-+ 0x078a, 0x078b, 0x078c, 0x078d, 0x0790, 0x0791, 0x0792, 0x0793,
-+ 0x0794, 0x0795, 0x0798, 0x0799, 0x079a, 0x079b, 0x079c, 0x079d,
-+ 0x07a0, 0x07a1, 0x07a2, 0x07a3, 0x07a4, 0x07a5, 0x07a8, 0x07a9,
-+ 0x07aa, 0x07ab, 0x07ac, 0x07ad, 0x07b0, 0x07b1, 0x07b2, 0x07b3,
-+ 0x07b4, 0x07b5, 0x07b8, 0x07b9, 0x07ba, 0x07bb, 0x07bb
-+
-+};
-+
-+
-+
-+u8 rtl8225_tx_gain_cck_ofdm[]={
-+ 0x02,0x06,0x0e,0x1e,0x3e,0x7e
-+};
-+
-+
-+u8 rtl8225_tx_power_ofdm[]={
-+ 0x80,0x90,0xa2,0xb5,0xcb,0xe4
-+};
-+
-+
-+u8 rtl8225_tx_power_cck_ch14[]={
-+ 0x18,0x17,0x15,0x0c,0x00,0x00,0x00,0x00,
-+ 0x1b,0x1a,0x17,0x0e,0x00,0x00,0x00,0x00,
-+ 0x1f,0x1e,0x1a,0x0f,0x00,0x00,0x00,0x00,
-+ 0x22,0x21,0x1d,0x11,0x00,0x00,0x00,0x00,
-+ 0x26,0x25,0x21,0x13,0x00,0x00,0x00,0x00,
-+ 0x2b,0x2a,0x25,0x15,0x00,0x00,0x00,0x00
-+};
-+
-+
-+u8 rtl8225_tx_power_cck[]={
-+ 0x18,0x17,0x15,0x11,0x0c,0x08,0x04,0x02,
-+ 0x1b,0x1a,0x17,0x13,0x0e,0x09,0x04,0x02,
-+ 0x1f,0x1e,0x1a,0x15,0x10,0x0a,0x05,0x02,
-+ 0x22,0x21,0x1d,0x18,0x11,0x0b,0x06,0x02,
-+ 0x26,0x25,0x21,0x1b,0x14,0x0d,0x06,0x03,
-+ 0x2b,0x2a,0x25,0x1e,0x16,0x0e,0x07,0x03
-+};
-+
-+u8 rtl8225_agc[]={
-+ 0x9e,0x9e,0x9e,0x9e,0x9e,0x9e,0x9e,0x9e,0x9d,0x9c,0x9b,0x9a,0x99,0x98,0x97,0x96,
-+ 0x95,0x94,0x93,0x92,0x91,0x90,0x8f,0x8e,0x8d,0x8c,0x8b,0x8a,0x89,0x88,0x87,0x86,
-+ 0x85,0x84,0x83,0x82,0x81,0x80,0x3f,0x3e,0x3d,0x3c,0x3b,0x3a,0x39,0x38,0x37,0x36,
-+ 0x35,0x34,0x33,0x32,0x31,0x30,0x2f,0x2e,0x2d,0x2c,0x2b,0x2a,0x29,0x28,0x27,0x26,
-+ 0x25,0x24,0x23,0x22,0x21,0x20,0x1f,0x1e,0x1d,0x1c,0x1b,0x1a,0x19,0x18,0x17,0x16,
-+ 0x15,0x14,0x13,0x12,0x11,0x10,0x0f,0x0e,0x0d,0x0c,0x0b,0x0a,0x09,0x08,0x07,0x06,
-+ 0x05,0x04,0x03,0x02,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
-+ 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
-+};
-+
-+u32 rtl8225_chan[] = {
-+ 0, //dummy channel 0
-+ 0x085c, //1
-+ 0x08dc, //2
-+ 0x095c, //3
-+ 0x09dc, //4
-+ 0x0a5c, //5
-+ 0x0adc, //6
-+ 0x0b5c, //7
-+ 0x0bdc, //8
-+ 0x0c5c, //9
-+ 0x0cdc, //10
-+ 0x0d5c, //11
-+ 0x0ddc, //12
-+ 0x0e5c, //13
-+ //0x0f5c, //14
-+ 0x0f72, // 14
-+};
-+
-+void rtl8225_set_gain(struct net_device *dev, short gain)
-+{
-+ write_phy_ofdm(dev, 0x0d, rtl8225_gain[gain * 4]);
-+ write_phy_ofdm(dev, 0x1b, rtl8225_gain[gain * 4 + 2]);
-+ write_phy_ofdm(dev, 0x1d, rtl8225_gain[gain * 4 + 3]);
-+ write_phy_ofdm(dev, 0x23, rtl8225_gain[gain * 4 + 1]);
-+
-+}
-+
-+
-+void write_rtl8225(struct net_device *dev, u8 adr, u16 data)
-+{
-+//in windows the delays in this function was del from 85 to 87,
-+//here we mod to sleep, or The CPU occupany is too hight. LZM 31/10/2008
-+
-+#ifdef USE_8051_3WIRE
-+
-+ struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
-+ struct usb_device *udev = priv->udev;
-+ //u8 bit;
-+ //u16 wReg80, wReg82, wReg84;
-+ u16 wReg80, wReg84;
-+
-+ wReg80 = read_nic_word(dev, RFPinsOutput);
-+ wReg80 &= 0xfff3;
-+// wReg82 = read_nic_word(dev, RFPinsEnable);
-+ wReg84 = read_nic_word(dev, RFPinsSelect);
-+ // <RJ_NOTE> 3-wire should be controled by HW when we finish SW 3-wire programming. 2005.08.10, by rcnjko.
-+ //wReg84 &= 0xfff0;
-+ wReg84 &= 0xfff8; //modified by david according to windows segment code.
-+
-+ // We must set SW enabled before terminating HW 3-wire, 2005.07.29, by rcnjko.
-+// write_nic_word(dev, RFPinsEnable, (wReg82|0x0007)); // Set To Output Enable
-+ write_nic_word(dev, RFPinsSelect, (wReg84|0x0007)); // Set To SW Switch
-+// force_pci_posting(dev);
-+// udelay(10); //
-+
-+ write_nic_word(dev, 0x80, (BB_HOST_BANG_EN|wReg80)); // Set SI_EN (RFLE)
-+// force_pci_posting(dev);
-+// udelay(2);
-+ //twreg.struc.enableB = 0;
-+ write_nic_word(dev, 0x80, (wReg80)); // Clear SI_EN (RFLE)
-+// force_pci_posting(dev);
-+// udelay(10);
-+
-+ usb_control_msg(udev, usb_sndctrlpipe(udev, 0),
-+ RTL8187_REQ_SET_REGS, RTL8187_REQT_WRITE,
-+ adr, 0x8225, &data, 2, HZ / 2);
-+
-+ // write_nic_word(dev, 0x80, (BB_HOST_BANG_EN|wReg80));
-+// force_pci_posting(dev);
-+// udelay(10);
-+
-+ write_nic_word(dev, 0x80, (wReg80|0x0004));
-+ write_nic_word(dev, 0x84, (wReg84|0x0000));// Set To SW Switch
-+
-+ if(priv->card_type == USB)
-+ ;// msleep(2);
-+ else
-+ ; // rtl8185_rf_pins_enable(dev);
-+
-+#else
-+ int i;
-+ u16 out,select;
-+ u8 bit;
-+ u32 bangdata = (data << 4) | (adr & 0xf);
-+ struct r8180_priv *priv = ieee80211_priv(dev);
-+
-+ out = read_nic_word(dev, RFPinsOutput) & 0xfff3;
-+
-+ write_nic_word(dev,RFPinsEnable,
-+ (read_nic_word(dev,RFPinsEnable) | 0x7));
-+
-+ select = read_nic_word(dev, RFPinsSelect);
-+
-+ write_nic_word(dev, RFPinsSelect, select | 0x7 |
-+ ((priv->card_type == USB) ? 0 : SW_CONTROL_GPIO));
-+
-+// force_pci_posting(dev);
-+// udelay(10);
-+
-+ write_nic_word(dev, RFPinsOutput, out | BB_HOST_BANG_EN );//| 0x1fff);
-+
-+// force_pci_posting(dev);
-+// udelay(2);
-+
-+ write_nic_word(dev, RFPinsOutput, out);
-+
-+// force_pci_posting(dev);
-+// udelay(10);
-+
-+
-+ for(i=15; i>=0;i--){
-+
-+ bit = (bangdata & (1<<i)) >> i;
-+
-+ write_nic_word(dev, RFPinsOutput, bit | out);
-+
-+ write_nic_word(dev, RFPinsOutput, bit | out | BB_HOST_BANG_CLK);
-+ write_nic_word(dev, RFPinsOutput, bit | out | BB_HOST_BANG_CLK);
-+
-+ i--;
-+ bit = (bangdata & (1<<i)) >> i;
-+
-+ write_nic_word(dev, RFPinsOutput, bit | out | BB_HOST_BANG_CLK);
-+ write_nic_word(dev, RFPinsOutput, bit | out | BB_HOST_BANG_CLK);
-+
-+ write_nic_word(dev, RFPinsOutput, bit | out);
-+
-+ }
-+
-+ write_nic_word(dev, RFPinsOutput, out | BB_HOST_BANG_EN);
-+
-+// force_pci_posting(dev);
-+// udelay(10);
-+
-+ write_nic_word(dev, RFPinsOutput, out |
-+ ((priv->card_type == USB) ? 4 : BB_HOST_BANG_EN));
-+
-+ write_nic_word(dev, RFPinsSelect, select |
-+ ((priv->card_type == USB) ? 0 : SW_CONTROL_GPIO));
-+
-+ if(priv->card_type == USB)
-+ ;// msleep(2);
-+ else
-+// rtl8185_rf_pins_enable(dev);
-+#endif
-+}
-+
-+
-+void write_rtl8225_patch(struct net_device *dev, u8 adr, u16 data)
-+{
-+
-+ int i;
-+ u16 out,select;
-+ u8 bit;
-+ u32 bangdata = (data << 4) | (adr & 0xf);
-+ struct r8180_priv *priv = ieee80211_priv(dev);
-+
-+ out = read_nic_word(dev, RFPinsOutput) & 0xfff3;
-+
-+ write_nic_word(dev,RFPinsEnable,
-+ (read_nic_word(dev,RFPinsEnable) | 0x7));
-+
-+ select = read_nic_word(dev, RFPinsSelect);
-+
-+ write_nic_word(dev, RFPinsSelect, select | 0x7 |
-+ ((priv->card_type == USB) ? 0 : SW_CONTROL_GPIO));
-+
-+ force_pci_posting(dev);
-+ udelay(10);
-+
-+ write_nic_word(dev, RFPinsOutput, out | BB_HOST_BANG_EN );//| 0x1fff);
-+
-+ force_pci_posting(dev);
-+ udelay(2);
-+
-+ write_nic_word(dev, RFPinsOutput, out);
-+
-+ force_pci_posting(dev);
-+ udelay(10);
-+
-+ for(i=15; i>=0;i--){
-+
-+ bit = (bangdata & (1<<i)) >> i;
-+
-+ write_nic_word(dev, RFPinsOutput, bit | out);
-+
-+ write_nic_word(dev, RFPinsOutput, bit | out | BB_HOST_BANG_CLK);
-+ write_nic_word(dev, RFPinsOutput, bit | out | BB_HOST_BANG_CLK);
-+
-+ i--;
-+ bit = (bangdata & (1<<i)) >> i;
-+
-+ write_nic_word(dev, RFPinsOutput, bit | out | BB_HOST_BANG_CLK);
-+ write_nic_word(dev, RFPinsOutput, bit | out | BB_HOST_BANG_CLK);
-+
-+ write_nic_word(dev, RFPinsOutput, bit | out);
-+
-+ }
-+
-+ write_nic_word(dev, RFPinsOutput, out | BB_HOST_BANG_EN);
-+
-+ force_pci_posting(dev);
-+ udelay(10);
-+
-+ write_nic_word(dev, RFPinsOutput, out |
-+ ((priv->card_type == USB) ? 4 : BB_HOST_BANG_EN));
-+
-+ write_nic_word(dev, RFPinsSelect, select |
-+ ((priv->card_type == USB) ? 0 : SW_CONTROL_GPIO));
-+
-+ if(priv->card_type == USB)
-+ mdelay(2);
-+ else
-+ rtl8185_rf_pins_enable(dev);
-+
-+}
-+
-+void rtl8225_rf_close(struct net_device *dev)
-+{
-+ write_rtl8225(dev, 0x4, 0x1f);
-+
-+ force_pci_posting(dev);
-+ mdelay(1);
-+
-+ rtl8180_set_anaparam(dev, RTL8225_ANAPARAM_OFF);
-+ rtl8185_set_anaparam2(dev, RTL8225_ANAPARAM2_OFF);
-+}
-+
-+#ifdef ENABLE_DOT11D
-+//
-+// Description:
-+// Map dBm into Tx power index according to
-+// current HW model, for example, RF and PA, and
-+// current wireless mode.
-+//
-+s8
-+DbmToTxPwrIdx(
-+ struct r8180_priv *priv,
-+ WIRELESS_MODE WirelessMode,
-+ s32 PowerInDbm
-+ )
-+{
-+ bool bUseDefault = true;
-+ s8 TxPwrIdx = 0;
-+
-+#ifdef CONFIG_RTL818X_S
-+ //
-+ // 071011, SD3 SY:
-+ // OFDM Power in dBm = Index * 0.5 + 0
-+ // CCK Power in dBm = Index * 0.25 + 13
-+ //
-+ if(priv->card_8185 >= VERSION_8187S_B)
-+ {
-+ s32 tmp = 0;
-+
-+ if(WirelessMode == WIRELESS_MODE_G)
-+ {
-+ bUseDefault = false;
-+ tmp = (2 * PowerInDbm);
-+
-+ if(tmp < 0)
-+ TxPwrIdx = 0;
-+ else if(tmp > 40) // 40 means 20 dBm.
-+ TxPwrIdx = 40;
-+ else
-+ TxPwrIdx = (s8)tmp;
-+ }
-+ else if(WirelessMode == WIRELESS_MODE_B)
-+ {
-+ bUseDefault = false;
-+ tmp = (4 * PowerInDbm) - 52;
-+
-+ if(tmp < 0)
-+ TxPwrIdx = 0;
-+ else if(tmp > 28) // 28 means 20 dBm.
-+ TxPwrIdx = 28;
-+ else
-+ TxPwrIdx = (s8)tmp;
-+ }
-+ }
-+#endif
-+
-+ //
-+ // TRUE if we want to use a default implementation.
-+ // We shall set it to FALSE when we have exact translation formular
-+ // for target IC. 070622, by rcnjko.
-+ //
-+ if(bUseDefault)
-+ {
-+ if(PowerInDbm < 0)
-+ TxPwrIdx = 0;
-+ else if(PowerInDbm > 35)
-+ TxPwrIdx = 35;
-+ else
-+ TxPwrIdx = (u8)PowerInDbm;
-+ }
-+
-+ return TxPwrIdx;
-+}
-+#endif
-+
-+
-+short rtl8225_rf_set_sens(struct net_device *dev, short sens)
-+{
-+ if (sens <0 || sens > 6) return -1;
-+
-+ if(sens > 4)
-+ write_rtl8225(dev, 0x0c, 0x850);
-+ else
-+ write_rtl8225(dev, 0x0c, 0x50);
-+
-+ sens= 6-sens;
-+ rtl8225_set_gain(dev, sens);
-+
-+ write_phy_cck(dev, 0x41, rtl8225_threshold[sens]);
-+ return 0;
-+
-+}
-+
-+void rtl8225_SetTXPowerLevel(struct net_device *dev, short ch)
-+{
-+ struct r8180_priv *priv = ieee80211_priv(dev);
-+
-+ int GainIdx;
-+ int GainSetting;
-+ int i;
-+ u8 power;
-+ u8 *cck_power_table;
-+ u8 max_cck_power_level;
-+ u8 max_ofdm_power_level;
-+ u8 min_ofdm_power_level;
-+ u8 cck_power_level = 0xff & priv->chtxpwr[ch];
-+ u8 ofdm_power_level = 0xff & priv->chtxpwr_ofdm[ch];
-+
-+#ifdef ENABLE_DOT11D
-+ if(IS_DOT11D_ENABLE(priv->ieee80211) &&
-+ IS_DOT11D_STATE_DONE(priv->ieee80211) )
-+ {
-+ //PRT_DOT11D_INFO pDot11dInfo = GET_DOT11D_INFO(priv->ieee80211);
-+ u8 MaxTxPwrInDbm = DOT11D_GetMaxTxPwrInDbm(priv->ieee80211, ch);
-+ u8 CckMaxPwrIdx = DbmToTxPwrIdx(priv, WIRELESS_MODE_B, MaxTxPwrInDbm);
-+ u8 OfdmMaxPwrIdx = DbmToTxPwrIdx(priv, WIRELESS_MODE_G, MaxTxPwrInDbm);
-+
-+ //printk("Max Tx Power dBm (%d) => CCK Tx power index : %d, OFDM Tx power index: %d\n", MaxTxPwrInDbm, CckMaxPwrIdx, OfdmMaxPwrIdx);
-+
-+ //printk("EEPROM channel(%d) => CCK Tx power index: %d, OFDM Tx power index: %d\n",
-+ // ch, cck_power_level, ofdm_power_level);
-+
-+ if(cck_power_level > CckMaxPwrIdx)
-+ cck_power_level = CckMaxPwrIdx;
-+ if(ofdm_power_level > OfdmMaxPwrIdx)
-+ ofdm_power_level = OfdmMaxPwrIdx;
-+ }
-+
-+ //priv->CurrentCckTxPwrIdx = cck_power_level;
-+ //priv->CurrentOfdmTxPwrIdx = ofdm_power_level;
-+#endif
-+
-+
-+ if(priv->card_type == USB){
-+ max_cck_power_level = 11;
-+ max_ofdm_power_level = 25; // 12 -> 25
-+ min_ofdm_power_level = 10;
-+ }else{
-+ max_cck_power_level = 35;
-+ max_ofdm_power_level = 35;
-+ min_ofdm_power_level = 0;
-+ }
-+ if( priv->TrSwitchState == TR_SW_TX )
-+ {
-+ printk("SetTxPowerLevel8187(): Origianl OFDM Tx power level %d\n", ofdm_power_level);
-+ ofdm_power_level -= GetTxOfdmHighPowerBias(dev);
-+ cck_power_level -= GetTxCckHighPowerBias(dev);
-+ printk("SetTxPowerLevel8187(): Adjusted OFDM Tx power level %d for we are in High Power state\n",
-+ ofdm_power_level);
-+ printk("SetTxPowerLevel8187(): Adjusted CCK Tx power level %d for we are in High Power state\n",
-+ cck_power_level);
-+ }
-+
-+
-+
-+ /* CCK power setting */
-+ if(cck_power_level > max_cck_power_level)
-+ cck_power_level = max_cck_power_level;
-+ GainIdx=cck_power_level % 6;
-+ GainSetting=cck_power_level / 6;
-+
-+ if(ch == 14)
-+ cck_power_table = rtl8225_tx_power_cck_ch14;
-+ else
-+ cck_power_table = rtl8225_tx_power_cck;
-+
-+// if(priv->card_8185 == 1 && priv->card_8185_Bversion ){
-+ /*Ver B*/
-+// write_nic_byte(dev, TX_GAIN_CCK, rtl8225_tx_gain_cck_ofdm[GainSetting]);
-+// }else{
-+ /*Ver C - D */
-+ write_nic_byte(dev, CCK_TXAGC, rtl8225_tx_gain_cck_ofdm[GainSetting]>>1);
-+// }
-+
-+ for(i=0;i<8;i++){
-+
-+ power = cck_power_table[GainIdx * 8 + i];
-+ write_phy_cck(dev, 0x44 + i, power);
-+ }
-+
-+ /* FIXME Is this delay really needeed ? */
-+ force_pci_posting(dev);
-+ mdelay(1);
-+
-+ /* OFDM power setting */
-+// Old:
-+// if(ofdm_power_level > max_ofdm_power_level)
-+// ofdm_power_level = 35;
-+// ofdm_power_level += min_ofdm_power_level;
-+// Latest:
-+ if(ofdm_power_level > (max_ofdm_power_level - min_ofdm_power_level))
-+ ofdm_power_level = max_ofdm_power_level;
-+ else
-+ ofdm_power_level += min_ofdm_power_level;
-+ if(ofdm_power_level > 35)
-+ ofdm_power_level = 35;
-+//
-+
-+ GainIdx=ofdm_power_level % 6;
-+ GainSetting=ofdm_power_level / 6;
-+#if 1
-+// if(priv->card_type == USB){
-+ rtl8185_set_anaparam2(dev,RTL8225_ANAPARAM2_ON);
-+
-+ write_phy_ofdm(dev,2,0x42);
-+ write_phy_ofdm(dev,6,0);
-+ write_phy_ofdm(dev,8,0);
-+// }
-+#endif
-+// if(priv->card_8185 == 1 && priv->card_8185_Bversion){
-+// /*Ver B*/
-+// write_nic_byte(dev, TX_GAIN_OFDM, rtl8225_tx_gain_cck_ofdm[GainSetting]);
-+// }else{
-+ /*Ver C - D */
-+ write_nic_byte(dev, OFDM_TXAGC, rtl8225_tx_gain_cck_ofdm[GainSetting]>>1);
-+// }
-+
-+
-+ power = rtl8225_tx_power_ofdm[GainIdx];
-+
-+ write_phy_ofdm(dev, 0x5, power);
-+ write_phy_ofdm(dev, 0x7, power);
-+
-+ force_pci_posting(dev);
-+ mdelay(1);
-+ //write_nic_byte(dev, TX_AGC_CONTROL,4);
-+}
-+
-+void rtl8225_rf_set_chan(struct net_device *dev, short ch)
-+{
-+ struct r8180_priv *priv = ieee80211_priv(dev);
-+ short gset = (priv->ieee80211->state == IEEE80211_LINKED &&
-+ ieee80211_is_54g(priv->ieee80211->current_network)) ||
-+ priv->ieee80211->iw_mode == IW_MODE_MONITOR;
-+ int eifs_addr;
-+
-+ if(NIC_8187 == priv->card_8187) {
-+ eifs_addr = EIFS_8187;
-+ } else {
-+ eifs_addr = EIFS_8187B;
-+ }
-+
-+#ifdef ENABLE_DOT11D
-+ if(!IsLegalChannel(priv->ieee80211, ch) )
-+ {
-+ printk("channel(%d). is invalide\n", ch);
-+ return;
-+ }
-+#endif
-+
-+ rtl8225_SetTXPowerLevel(dev, ch);
-+
-+ write_rtl8225(dev, 0x7, rtl8225_chan[ch]);
-+
-+ force_pci_posting(dev);
-+ mdelay(10);
-+
-+ write_nic_byte(dev,SIFS,0x22);// SIFS: 0x22
-+
-+ if(gset)
-+ write_nic_byte(dev,DIFS,20); //DIFS: 20
-+ else
-+ write_nic_byte(dev,DIFS,0x24); //DIFS: 36
-+
-+ if(priv->ieee80211->state == IEEE80211_LINKED &&
-+ ieee80211_is_shortslot(priv->ieee80211->current_network))
-+ write_nic_byte(dev,SLOT,0x9); //SLOT: 9
-+
-+ else
-+ write_nic_byte(dev,SLOT,0x14); //SLOT: 20 (0x14)
-+
-+
-+ if(gset){
-+ write_nic_byte(dev,eifs_addr,91 - 20); // EIFS: 91 (0x5B)
-+ write_nic_byte(dev,CW_VAL,0x73); //CW VALUE: 0x37
-+ //DMESG("using G net params");
-+ }else{
-+ write_nic_byte(dev,eifs_addr,91 - 0x24); // EIFS: 91 (0x5B)
-+ write_nic_byte(dev,CW_VAL,0xa5); //CW VALUE: 0x37
-+ //DMESG("using B net params");
-+ }
-+
-+
-+}
-+
-+void rtl8225_host_pci_init(struct net_device *dev)
-+{
-+ write_nic_word(dev, RFPinsOutput, 0x480);
-+
-+ rtl8185_rf_pins_enable(dev);
-+
-+ //if(priv->card_8185 == 2 && priv->enable_gpio0 ) /* version D */
-+ //write_nic_word(dev, RFPinsSelect, 0x88);
-+ //else
-+ write_nic_word(dev, RFPinsSelect, 0x88 | SW_CONTROL_GPIO); /* 0x488 | SW_CONTROL_GPIO */
-+
-+ write_nic_byte(dev, GP_ENABLE, 0);
-+
-+ force_pci_posting(dev);
-+ mdelay(200);
-+
-+ write_nic_word(dev, GP_ENABLE, 0xff & (~(1<<6))); /* bit 6 is for RF on/off detection */
-+
-+
-+}
-+
-+void rtl8225_host_usb_init(struct net_device *dev)
-+{
-+ write_nic_byte(dev,RFPinsSelect+1,0);
-+
-+ write_nic_byte(dev,GPIO,0);
-+
-+ write_nic_byte_E(dev,0x53,read_nic_byte_E(dev,0x53) | (1<<7));
-+
-+ write_nic_byte(dev,RFPinsSelect+1,4);
-+
-+ write_nic_byte(dev,GPIO,0x20);
-+
-+ write_nic_byte(dev,GP_ENABLE,0);
-+
-+
-+ /* Config BB & RF */
-+ write_nic_word(dev, RFPinsOutput, 0x80);
-+
-+ write_nic_word(dev, RFPinsSelect, 0x80);
-+
-+ write_nic_word(dev, RFPinsEnable, 0x80);
-+
-+
-+ mdelay(100);
-+
-+ mdelay(1000);
-+
-+}
-+
-+void rtl8225_rf_init(struct net_device *dev)
-+{
-+ struct r8180_priv *priv = ieee80211_priv(dev);
-+ int i;
-+ short channel = 1;
-+ u16 brsr;
-+ int brsr_addr;
-+
-+ if(NIC_8187 == priv->card_8187) {
-+ brsr_addr = BRSR_8187;
-+ } else {
-+ brsr_addr = BRSR_8187B;
-+ }
-+
-+
-+ priv->chan = channel;
-+
-+ rtl8180_set_anaparam(dev, RTL8225_ANAPARAM_ON);
-+
-+
-+ if(priv->card_type == USB)
-+ rtl8225_host_usb_init(dev);
-+ else
-+ rtl8225_host_pci_init(dev);
-+
-+ write_nic_dword(dev, RF_TIMING, 0x000a8008);
-+
-+ //brsr = read_nic_word(dev, BRSR);
-+ brsr = read_nic_word(dev, brsr_addr);
-+
-+ //write_nic_word(dev, BRSR, 0xffff);
-+ write_nic_word(dev, brsr_addr, 0xffff);
-+
-+ write_nic_dword(dev, RF_PARA, 0x100044);
-+
-+ #if 1 //0->1
-+ rtl8180_set_mode(dev, EPROM_CMD_CONFIG);
-+ write_nic_byte(dev, CONFIG3, 0x44);
-+ rtl8180_set_mode(dev, EPROM_CMD_NORMAL);
-+ #endif
-+
-+ if(priv->card_type == USB){
-+ rtl8185_rf_pins_enable(dev);
-+
-+ mdelay(1000);
-+ }
-+
-+ write_rtl8225(dev, 0x0, 0x67); mdelay(1);
-+
-+
-+ write_rtl8225(dev, 0x1, 0xfe0); mdelay(1);
-+
-+ write_rtl8225(dev, 0x2, 0x44d); mdelay(1);
-+
-+ write_rtl8225(dev, 0x3, 0x441); mdelay(1);
-+
-+ if(priv->card_type == USB)
-+ write_rtl8225(dev, 0x4, 0x486);
-+ else
-+ write_rtl8225(dev, 0x4, 0x8be);
-+
-+ mdelay(1);
-+
-+
-+ /* version B & C */
-+
-+ if(priv->card_type == USB)
-+ write_rtl8225(dev, 0x5, 0xbc0);
-+ else if(priv->card_type == MINIPCI)
-+ write_rtl8225(dev, 0x5, 0xbc0 + 3 +(6<<3));
-+ else
-+ write_rtl8225(dev, 0x5, 0xbc0 + (6<<3));
-+
-+ mdelay(1);
-+// }
-+
-+ write_rtl8225(dev, 0x6, 0xae6); mdelay(1);
-+
-+ write_rtl8225(dev, 0x7, ((priv->card_type == USB)? 0x82a : rtl8225_chan[channel])); mdelay(1);
-+
-+ write_rtl8225(dev, 0x8, 0x1f); mdelay(1);
-+
-+ write_rtl8225(dev, 0x9, 0x334); mdelay(1);
-+
-+ write_rtl8225(dev, 0xa, 0xfd4); mdelay(1);
-+
-+ write_rtl8225(dev, 0xb, 0x391); mdelay(1);
-+
-+ write_rtl8225(dev, 0xc, 0x50); mdelay(1);
-+
-+
-+ write_rtl8225(dev, 0xd, 0x6db); mdelay(1);
-+
-+ write_rtl8225(dev, 0xe, 0x29); mdelay(1);
-+
-+ write_rtl8225(dev, 0xf, 0x914);
-+
-+ if(priv->card_type == USB){
-+ //force_pci_posting(dev);
-+ mdelay(100);
-+ }
-+
-+ write_rtl8225(dev, 0x2, 0xc4d);
-+
-+ if(priv->card_type == USB){
-+ // force_pci_posting(dev);
-+ mdelay(200);
-+
-+ write_rtl8225(dev, 0x2, 0x44d);
-+
-+ // force_pci_posting(dev);
-+ mdelay(100);
-+
-+ }//End of if(priv->card_type == USB)
-+ /* FIXME!! rtl8187 we have to check if calibrarion
-+ * is successful and eventually cal. again (repeat
-+ * the two write on reg 2)
-+ */
-+ force_pci_posting(dev);
-+
-+ mdelay(100); //200 for 8187
-+
-+ //if(priv->card_type != USB) /* maybe not needed even for 8185 */
-+// write_rtl8225(dev, 0x7, rtl8225_chan[channel]);
-+
-+ write_rtl8225(dev, 0x0, 0x127);
-+
-+ for(i=0;i<95;i++){
-+ write_rtl8225(dev, 0x1, (u8)(i+1));
-+
-+ /* version B & C & D*/
-+
-+ write_rtl8225(dev, 0x2, rtl8225bcd_rxgain[i]);
-+ }
-+
-+ write_rtl8225(dev, 0x0, 0x27);
-+
-+
-+// //if(priv->card_type != USB){
-+// write_rtl8225(dev, 0x2, 0x44d);
-+// write_rtl8225(dev, 0x7, rtl8225_chan[channel]);
-+// write_rtl8225(dev, 0x2, 0x47d);
-+//
-+// force_pci_posting(dev);
-+// mdelay(100);
-+//
-+// write_rtl8225(dev, 0x2, 0x44d);
-+// //}
-+
-+ write_rtl8225(dev, 0x0, 0x22f);
-+
-+ if(priv->card_type != USB)
-+ rtl8185_rf_pins_enable(dev);
-+
-+ for(i=0;i<128;i++){
-+ write_phy_ofdm(dev, 0xb, rtl8225_agc[i]);
-+
-+ mdelay(1);
-+ write_phy_ofdm(dev, 0xa, (u8)i+ 0x80);
-+
-+ mdelay(1);
-+ }
-+
-+ force_pci_posting(dev);
-+ mdelay(1);
-+
-+ write_phy_ofdm(dev, 0x0, 0x1); mdelay(1);
-+ write_phy_ofdm(dev, 0x1, 0x2); mdelay(1);
-+ write_phy_ofdm(dev, 0x2, ((priv->card_type == USB)? 0x42 : 0x62)); mdelay(1);
-+ write_phy_ofdm(dev, 0x3, 0x0); mdelay(1);
-+ write_phy_ofdm(dev, 0x4, 0x0); mdelay(1);
-+ write_phy_ofdm(dev, 0x5, 0x0); mdelay(1);
-+ write_phy_ofdm(dev, 0x6, 0x40); mdelay(1);
-+ write_phy_ofdm(dev, 0x7, 0x0); mdelay(1);
-+ write_phy_ofdm(dev, 0x8, 0x40); mdelay(1);
-+ write_phy_ofdm(dev, 0x9, 0xfe); mdelay(1);
-+
-+ /* ver C & D */
-+ write_phy_ofdm(dev, 0xa, 0x9); mdelay(1);
-+
-+ //write_phy_ofdm(dev, 0x18, 0xef);
-+ // }
-+ //}
-+ write_phy_ofdm(dev, 0xb, 0x80); mdelay(1);
-+
-+ write_phy_ofdm(dev, 0xc, 0x1);mdelay(1);
-+
-+
-+ //if(priv->card_type != USB)
-+ //write_phy_ofdm(dev, 0xd, 0x33); // <>
-+
-+ write_phy_ofdm(dev, 0xe, 0xd3);mdelay(1);
-+
-+ write_phy_ofdm(dev, 0xf, 0x38);mdelay(1);
-+/*ver D & 8187*/
-+// }
-+
-+// if(priv->card_8185 == 1 && priv->card_8185_Bversion)
-+// write_phy_ofdm(dev, 0x10, 0x04);/*ver B*/
-+// else
-+ write_phy_ofdm(dev, 0x10, 0x84);mdelay(1);
-+/*ver C & D & 8187*/
-+
-+ write_phy_ofdm(dev, 0x11, 0x06);mdelay(1);
-+/*agc resp time 700*/
-+
-+
-+// if(priv->card_8185 == 2){
-+ /* Ver D & 8187*/
-+ write_phy_ofdm(dev, 0x12, 0x20);mdelay(1);
-+
-+ write_phy_ofdm(dev, 0x13, 0x20);mdelay(1);
-+
-+ write_phy_ofdm(dev, 0x14, 0x0); mdelay(1);
-+ write_phy_ofdm(dev, 0x15, 0x40); mdelay(1);
-+ write_phy_ofdm(dev, 0x16, 0x0); mdelay(1);
-+ write_phy_ofdm(dev, 0x17, 0x40); mdelay(1);
-+
-+// if (priv->card_type == USB)
-+// write_phy_ofdm(dev, 0x18, 0xef);
-+
-+ write_phy_ofdm(dev, 0x18, 0xef);mdelay(1);
-+
-+
-+ write_phy_ofdm(dev, 0x19, 0x19); mdelay(1);
-+ write_phy_ofdm(dev, 0x1a, 0x20); mdelay(1);
-+
-+// if (priv->card_type != USB){
-+// if(priv->card_8185 == 1 && priv->card_8185_Bversion)
-+// write_phy_ofdm(dev, 0x1b, 0x66); /* Ver B */
-+// else
-+ write_phy_ofdm(dev, 0x1b, 0x76);mdelay(1);
-+ /* Ver C & D */ //FIXME:MAYBE not needed
-+// }
-+
-+ write_phy_ofdm(dev, 0x1c, 0x4);mdelay(1);
-+
-+ /*ver D & 8187*/
-+ write_phy_ofdm(dev, 0x1e, 0x95);mdelay(1);
-+
-+ write_phy_ofdm(dev, 0x1f, 0x75); mdelay(1);
-+
-+// }
-+
-+ write_phy_ofdm(dev, 0x20, 0x1f);mdelay(1);
-+
-+ write_phy_ofdm(dev, 0x21, 0x27);mdelay(1);
-+
-+ write_phy_ofdm(dev, 0x22, 0x16);mdelay(1);
-+
-+// if(priv->card_type != USB)
-+ //write_phy_ofdm(dev, 0x23, 0x43); //FIXME maybe not needed // <>
-+
-+ write_phy_ofdm(dev, 0x24, 0x46); mdelay(1);
-+ write_phy_ofdm(dev, 0x25, 0x20); mdelay(1);
-+ write_phy_ofdm(dev, 0x26, 0x90); mdelay(1);
-+ write_phy_ofdm(dev, 0x27, 0x88); mdelay(1);
-+/* Ver C & D & 8187*/
-+
-+ // <> Set init. gain to m74dBm.
-+
-+ rtl8225_set_gain(dev,4);
-+ /*write_phy_ofdm(dev, 0x0d, 0x43); mdelay(1);
-+ write_phy_ofdm(dev, 0x1b, 0x76); mdelay(1);
-+ write_phy_ofdm(dev, 0x1d, 0xc5); mdelay(1);
-+ write_phy_ofdm(dev, 0x23, 0x78); mdelay(1);
-+*/
-+ //if(priv->card_type == USB);
-+ // rtl8225_set_gain_usb(dev, 1); /* FIXME this '2' is random */
-+
-+ write_phy_cck(dev, 0x0, 0x98); mdelay(1);
-+ write_phy_cck(dev, 0x3, 0x20); mdelay(1);
-+ write_phy_cck(dev, 0x4, 0x7e); mdelay(1);
-+ write_phy_cck(dev, 0x5, 0x12); mdelay(1);
-+ write_phy_cck(dev, 0x6, 0xfc); mdelay(1);
-+ write_phy_cck(dev, 0x7, 0x78);mdelay(1);
-+ /* Ver C & D & 8187*/
-+
-+ write_phy_cck(dev, 0x8, 0x2e);mdelay(1);
-+
-+ write_phy_cck(dev, 0x10, ((priv->card_type == USB) ? 0x9b: 0x93)); mdelay(1);
-+ write_phy_cck(dev, 0x11, 0x88); mdelay(1);
-+ write_phy_cck(dev, 0x12, 0x47); mdelay(1);
-+ write_phy_cck(dev, 0x13, 0xd0); /* Ver C & D & 8187*/
-+
-+ write_phy_cck(dev, 0x19, 0x0);
-+ write_phy_cck(dev, 0x1a, 0xa0);
-+ write_phy_cck(dev, 0x1b, 0x8);
-+ write_phy_cck(dev, 0x40, 0x86); /* CCK Carrier Sense Threshold */
-+
-+ write_phy_cck(dev, 0x41, 0x8d);mdelay(1);
-+
-+
-+ write_phy_cck(dev, 0x42, 0x15); mdelay(1);
-+ write_phy_cck(dev, 0x43, 0x18); mdelay(1);
-+ write_phy_cck(dev, 0x44, 0x1f); mdelay(1);
-+ write_phy_cck(dev, 0x45, 0x1e); mdelay(1);
-+ write_phy_cck(dev, 0x46, 0x1a); mdelay(1);
-+ write_phy_cck(dev, 0x47, 0x15); mdelay(1);
-+ write_phy_cck(dev, 0x48, 0x10); mdelay(1);
-+ write_phy_cck(dev, 0x49, 0xa); mdelay(1);
-+ write_phy_cck(dev, 0x4a, 0x5); mdelay(1);
-+ write_phy_cck(dev, 0x4b, 0x2); mdelay(1);
-+ write_phy_cck(dev, 0x4c, 0x5);mdelay(1);
-+
-+
-+ write_nic_byte(dev, 0x5b, 0x0d); mdelay(1);
-+
-+
-+
-+// <>
-+// // TESTR 0xb 8187
-+// write_phy_cck(dev, 0x10, 0x93);// & 0xfb);
-+//
-+// //if(priv->card_type != USB){
-+// write_phy_ofdm(dev, 0x2, 0x62);
-+// write_phy_ofdm(dev, 0x6, 0x0);
-+// write_phy_ofdm(dev, 0x8, 0x0);
-+// //}
-+
-+ rtl8225_SetTXPowerLevel(dev, channel);
-+
-+ write_phy_cck(dev, 0x10, 0x9b); mdelay(1); /* Rx ant A, 0xdb for B */
-+ write_phy_ofdm(dev, 0x26, 0x90); mdelay(1); /* Rx ant A, 0x10 for B */
-+
-+ rtl8185_tx_antenna(dev, 0x3); /* TX ant A, 0x0 for B */
-+
-+ /* switch to high-speed 3-wire
-+ * last digit. 2 for both cck and ofdm
-+ */
-+ if(priv->card_type == USB)
-+ write_nic_dword(dev, 0x94, 0x3dc00002);
-+ else{
-+ write_nic_dword(dev, 0x94, 0x15c00002);
-+ rtl8185_rf_pins_enable(dev);
-+ }
-+
-+// if(priv->card_type != USB)
-+// rtl8225_set_gain(dev, 4); /* FIXME this '1' is random */ // <>
-+// rtl8225_set_mode(dev, 1); /* FIXME start in B mode */ // <>
-+//
-+// /* make sure is waken up! */
-+// write_rtl8225(dev,0x4, 0x9ff);
-+// rtl8180_set_anaparam(dev, RTL8225_ANAPARAM_ON);
-+// rtl8185_set_anaparam2(dev, RTL8225_ANAPARAM2_ON);
-+
-+ rtl8225_rf_set_chan(dev, priv->chan);
-+
-+ //write_nic_word(dev,BRSR,brsr);
-+
-+}
-diff -Nur linux-2.6.30.5.orig/drivers/net/wireless/rtl8187b/r8180_rtl8225.h linux-2.6.30.5/drivers/net/wireless/rtl8187b/r8180_rtl8225.h
---- linux-2.6.30.5.orig/drivers/net/wireless/rtl8187b/r8180_rtl8225.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.30.5/drivers/net/wireless/rtl8187b/r8180_rtl8225.h 2009-08-23 19:01:04.000000000 +0200
-@@ -0,0 +1,77 @@
-+/*
-+ This is part of the rtl8180-sa2400 driver
-+ released under the GPL (See file COPYING for details).
-+ Copyright (c) 2005 Andrea Merello <andreamrl@tiscali.it>
-+
-+ This files contains programming code for the rtl8225
-+ radio frontend.
-+
-+ *Many* thanks to Realtek Corp. for their great support!
-+
-+*/
-+
-+#ifndef RTL8225H
-+#define RTL8225H
-+
-+#include "r8187.h"
-+
-+#define RTL8225_ANAPARAM_ON 0xa0000a59
-+
-+// FIXME: OFF ANAPARAM MIGHT BE WRONG!
-+#define RTL8225_ANAPARAM_OFF 0xa00beb59
-+#define RTL8225_ANAPARAM2_OFF 0x840dec11
-+
-+#define RTL8225_ANAPARAM2_ON 0x860c7312
-+
-+void rtl8225_rf_init(struct net_device *dev);
-+void rtl8225z2_rf_init(struct net_device *dev);
-+void rtl8225z2_rf_set_chan(struct net_device *dev, short ch);
-+short rtl8225_is_V_z2(struct net_device *dev);
-+void rtl8225_rf_set_chan(struct net_device *dev,short ch);
-+void rtl8225_rf_close(struct net_device *dev);
-+short rtl8225_rf_set_sens(struct net_device *dev, short sens);
-+void rtl8225_host_pci_init(struct net_device *dev);
-+void rtl8225_host_usb_init(struct net_device *dev);
-+void write_rtl8225(struct net_device *dev, u8 adr, u16 data);
-+void rtl8225z2_rf_set_mode(struct net_device *dev) ;
-+void rtl8185_rf_pins_enable(struct net_device *dev);
-+void rtl8180_set_mode(struct net_device *dev,int mode);
-+void UpdateInitialGain(struct net_device *dev);
-+void UpdateCCKThreshold(struct net_device *dev);
-+void rtl8225_SetTXPowerLevel(struct net_device *dev, short ch);
-+void rtl8225z2_SetTXPowerLevel(struct net_device *dev, short ch);
-+
-+#define RTL8225_RF_MAX_SENS 6
-+#define RTL8225_RF_DEF_SENS 4
-+
-+extern inline char GetTxOfdmHighPowerBias(struct net_device *dev)
-+{
-+ //
-+ // We should always adjust our Tx Power for 8187 and 8187B.
-+ // It was ever recommended not to adjust Tx Power of 8187B with Atheros AP
-+ // for throughput by David, but now we found it is not the issue to impact
-+ // the Atheros's problem and also no adjustion for Tx Power will cause "low"
-+ // throughput. By Bruce, 2007-07-03.
-+ //
-+ return 10;
-+}
-+
-+//
-+// Description:
-+// Return Tx power level to minus if we are in high power state.
-+//
-+// Note:
-+// Adjust it according to RF if required.
-+//
-+extern inline char GetTxCckHighPowerBias(struct net_device *dev)
-+{
-+ return 7;
-+}
-+
-+
-+
-+extern u8 rtl8225_agc[];
-+
-+extern u32 rtl8225_chan[];
-+
-+#endif
-diff -Nur linux-2.6.30.5.orig/drivers/net/wireless/rtl8187b/r8180_rtl8225z2.c linux-2.6.30.5/drivers/net/wireless/rtl8187b/r8180_rtl8225z2.c
---- linux-2.6.30.5.orig/drivers/net/wireless/rtl8187b/r8180_rtl8225z2.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.30.5/drivers/net/wireless/rtl8187b/r8180_rtl8225z2.c 2009-08-23 19:01:04.000000000 +0200
-@@ -0,0 +1,2090 @@
-+/*
-+ This is part of the rtl8180-sa2400 driver
-+ released under the GPL (See file COPYING for details).
-+ Copyright (c) 2005 Andrea Merello <andreamrl@tiscali.it>
-+
-+ This files contains programming code for the rtl8225
-+ radio frontend.
-+
-+ *Many* thanks to Realtek Corp. for their great support!
-+
-+*/
-+
-+
-+
-+#include "r8180_hw.h"
-+#include "r8180_rtl8225.h"
-+#ifdef ENABLE_DOT11D
-+#include "dot11d.h"
-+#endif
-+
-+//2005.11.16
-+u8 rtl8225z2_threshold[]={
-+ 0x8d, 0x8d, 0x8d, 0x8d, 0x9d, 0xad, 0xbd,
-+};
-+
-+// 0xd 0x19 0x1b 0x21
-+u8 rtl8225z2_gain_bg[]={
-+ 0x23, 0x15, 0xa5, // -82-1dbm
-+ 0x23, 0x15, 0xb5, // -82-2dbm
-+ 0x23, 0x15, 0xc5, // -82-3dbm
-+ 0x33, 0x15, 0xc5, // -78dbm
-+ 0x43, 0x15, 0xc5, // -74dbm
-+ 0x53, 0x15, 0xc5, // -70dbm
-+ 0x63, 0x15, 0xc5, // -66dbm
-+};
-+
-+u8 rtl8225z2_gain_a[]={
-+ 0x13,0x27,0x5a,//,0x37,// -82dbm
-+ 0x23,0x23,0x58,//,0x37,// -82dbm
-+ 0x33,0x1f,0x56,//,0x37,// -82dbm
-+ 0x43,0x1b,0x54,//,0x37,// -78dbm
-+ 0x53,0x17,0x51,//,0x37,// -74dbm
-+ 0x63,0x24,0x4f,//,0x37,// -70dbm
-+ 0x73,0x0f,0x4c,//,0x37,// -66dbm
-+};
-+static u32 MAC_REG_TABLE[][3]={
-+ {0xf0, 0x32, 0000}, {0xf1, 0x32, 0000}, {0xf2, 0x00, 0000}, {0xf3, 0x00, 0000},
-+ {0xf4, 0x32, 0000}, {0xf5, 0x43, 0000}, {0xf6, 0x00, 0000}, {0xf7, 0x00, 0000},
-+ {0xf8, 0x46, 0000}, {0xf9, 0xa4, 0000}, {0xfa, 0x00, 0000}, {0xfb, 0x00, 0000},
-+ {0xfc, 0x96, 0000}, {0xfd, 0xa4, 0000}, {0xfe, 0x00, 0000}, {0xff, 0x00, 0000},
-+
-+ {0x58, 0x4b, 0001}, {0x59, 0x00, 0001}, {0x5a, 0x4b, 0001}, {0x5b, 0x00, 0001},
-+ {0x60, 0x4b, 0001}, {0x61, 0x09, 0001}, {0x62, 0x4b, 0001}, {0x63, 0x09, 0001},
-+ {0xce, 0x0f, 0001}, {0xcf, 0x00, 0001}, {0xe0, 0xff, 0001}, {0xe1, 0x0f, 0001},
-+ {0xe2, 0x00, 0001}, {0xf0, 0x4e, 0001}, {0xf1, 0x01, 0001}, {0xf2, 0x02, 0001},
-+ {0xf3, 0x03, 0001}, {0xf4, 0x04, 0001}, {0xf5, 0x05, 0001}, {0xf6, 0x06, 0001},
-+ {0xf7, 0x07, 0001}, {0xf8, 0x08, 0001},
-+
-+ {0x4e, 0x00, 0002}, {0x0c, 0x04, 0002}, {0x21, 0x61, 0002}, {0x22, 0x68, 0002},
-+ {0x23, 0x6f, 0002}, {0x24, 0x76, 0002}, {0x25, 0x7d, 0002}, {0x26, 0x84, 0002},
-+ {0x27, 0x8d, 0002}, {0x4d, 0x08, 0002}, {0x50, 0x05, 0002}, {0x51, 0xf5, 0002},
-+ {0x52, 0x04, 0002}, {0x53, 0xa0, 0002}, {0x54, 0x1f, 0002}, {0x55, 0x23, 0002},
-+ {0x56, 0x45, 0002}, {0x57, 0x67, 0002}, {0x58, 0x08, 0002}, {0x59, 0x08, 0002},
-+ {0x5a, 0x08, 0002}, {0x5b, 0x08, 0002}, {0x60, 0x08, 0002}, {0x61, 0x08, 0002},
-+ {0x62, 0x08, 0002}, {0x63, 0x08, 0002}, {0x64, 0xcf, 0002}, {0x72, 0x56, 0002},
-+ {0x73, 0x9a, 0002},
-+
-+ {0x34, 0xf0, 0000}, {0x35, 0x0f, 0000}, {0x5b, 0x40, 0000}, {0x84, 0x88, 0000},
-+ {0x85, 0x24, 0000}, {0x88, 0x54, 0000}, {0x8b, 0xb8, 0000}, {0x8c, 0x07, 0000},
-+ {0x8d, 0x00, 0000}, {0x94, 0x1b, 0000}, {0x95, 0x12, 0000}, {0x96, 0x00, 0000},
-+ {0x97, 0x06, 0000}, {0x9d, 0x1a, 0000}, {0x9f, 0x10, 0000}, {0xb4, 0x22, 0000},
-+ {0xbe, 0x80, 0000}, {0xdb, 0x00, 0000}, {0xee, 0x00, 0000}, {0x91, 0x01, 0000},
-+ //lzm mode 0x91 form 0x03->0x01 open GPIO BIT1,
-+ //because Polling methord will rurn off Radio
-+ //the first time when read GPI(0x92).
-+ //because after 0x91:bit1 form 1->0, there will
-+ //be time for 0x92:bit1 form 0->1
-+
-+ {0x4c, 0x00, 0002}, {0x9f, 0x00, 0003}, {0x8c, 0x01, 0000}, {0x8d, 0x10, 0000},
-+ {0x8e, 0x08, 0000}, {0x8f, 0x00, 0000}
-+};
-+
-+static u8 ZEBRA_AGC[]={
-+ 0,
-+ 0x5e,0x5e,0x5e,0x5e,0x5d,0x5b,0x59,0x57,0x55,0x53,0x51,0x4f,0x4d,0x4b,0x49,0x47,
-+ 0x45,0x43,0x41,0x3f,0x3d,0x3b,0x39,0x37,0x35,0x33,0x31,0x2f,0x2d,0x2b,0x29,0x27,
-+ 0x25,0x23,0x21,0x1f,0x1d,0x1b,0x19,0x17,0x15,0x13,0x11,0x0f,0x0d,0x0b,0x09,0x07,
-+ 0x05,0x03,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
-+ 0x19,0x19,0x19,0x019,0x19,0x19,0x19,0x19,0x19,0x20,0x21,0x22,0x23,0x24,0x25,0x26,
-+ 0x26,0x27,0x27,0x28,0x28,0x29,0x2a,0x2a,0x2a,0x2b,0x2b,0x2b,0x2c,0x2c,0x2c,0x2d,
-+ 0x2d,0x2d,0x2d,0x2e,0x2e,0x2e,0x2e,0x2f,0x2f,0x2f,0x30,0x30,0x31,0x31,0x31,0x31,
-+ 0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31
-+};
-+
-+static u32 ZEBRA_RF_RX_GAIN_TABLE[]={
-+ 0,
-+ 0x0400,0x0401,0x0402,0x0403,0x0404,0x0405,0x0408,0x0409,
-+ 0x040a,0x040b,0x0502,0x0503,0x0504,0x0505,0x0540,0x0541,
-+ 0x0542,0x0543,0x0544,0x0545,0x0580,0x0581,0x0582,0x0583,
-+ 0x0584,0x0585,0x0588,0x0589,0x058a,0x058b,0x0643,0x0644,
-+ 0x0645,0x0680,0x0681,0x0682,0x0683,0x0684,0x0685,0x0688,
-+ 0x0689,0x068a,0x068b,0x068c,0x0742,0x0743,0x0744,0x0745,
-+ 0x0780,0x0781,0x0782,0x0783,0x0784,0x0785,0x0788,0x0789,
-+ 0x078a,0x078b,0x078c,0x078d,0x0790,0x0791,0x0792,0x0793,
-+ 0x0794,0x0795,0x0798,0x0799,0x079a,0x079b,0x079c,0x079d,
-+ 0x07a0,0x07a1,0x07a2,0x07a3,0x07a4,0x07a5,0x07a8,0x07a9,
-+ 0x03aa,0x03ab,0x03ac,0x03ad,0x03b0,0x03b1,0x03b2,0x03b3,
-+ 0x03b4,0x03b5,0x03b8,0x03b9,0x03ba,0x03bb,0x03bb
-+};
-+
-+// Use the new SD3 given param, by shien chang, 2006.07.14
-+
-+static u8 OFDM_CONFIG[]={
-+ // 0x00
-+ 0x10, 0x0d, 0x01, 0x00, 0x14, 0xfb, 0xfb, 0x60,
-+ 0x00, 0x60, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x00,
-+
-+ // 0x10
-+ 0x40, 0x00, 0x40, 0x00, 0x00, 0x00, 0xa8, 0x26,
-+ 0x32, 0x33, 0x07, 0xa5, 0x6f, 0x55, 0xc8, 0xb3,
-+
-+ // 0x20
-+ 0x0a, 0xe1, 0x2C, 0x8a, 0x86, 0x83, 0x34, 0x0f,
-+ 0x4f, 0x24, 0x6f, 0xc2, 0x6b, 0x40, 0x80, 0x00,
-+
-+ // 0x30
-+ 0xc0, 0xc1, 0x58, 0xf1, 0x00, 0xe4, 0x90, 0x3e,
-+ 0x6d, 0x3c, 0xfb, 0x07//0xc7
-+ };
-+
-+//2005.11.16,
-+u8 ZEBRA2_CCK_OFDM_GAIN_SETTING[]={
-+ 0x00,0x01,0x02,0x03,0x04,0x05,
-+ 0x06,0x07,0x08,0x09,0x0a,0x0b,
-+ 0x0c,0x0d,0x0e,0x0f,0x10,0x11,
-+ 0x12,0x13,0x14,0x15,0x16,0x17,
-+ 0x18,0x19,0x1a,0x1b,0x1c,0x1d,
-+ 0x1e,0x1f,0x20,0x21,0x22,0x23,
-+};
-+//-
-+u16 rtl8225z2_rxgain[]={
-+ 0x0400, 0x0401, 0x0402, 0x0403, 0x0404, 0x0405, 0x0408, 0x0409,
-+ 0x040a, 0x040b, 0x0502, 0x0503, 0x0504, 0x0505, 0x0540, 0x0541,
-+ 0x0542, 0x0543, 0x0544, 0x0545, 0x0580, 0x0581, 0x0582, 0x0583,
-+ 0x0584, 0x0585, 0x0588, 0x0589, 0x058a, 0x058b, 0x0643, 0x0644,
-+ 0x0645, 0x0680, 0x0681, 0x0682, 0x0683, 0x0684, 0x0685, 0x0688,
-+ 0x0689, 0x068a, 0x068b, 0x068c, 0x0742, 0x0743, 0x0744, 0x0745,
-+ 0x0780, 0x0781, 0x0782, 0x0783, 0x0784, 0x0785, 0x0788, 0x0789,
-+ 0x078a, 0x078b, 0x078c, 0x078d, 0x0790, 0x0791, 0x0792, 0x0793,
-+ 0x0794, 0x0795, 0x0798, 0x0799, 0x079a, 0x079b, 0x079c, 0x079d,
-+ 0x07a0, 0x07a1, 0x07a2, 0x07a3, 0x07a4, 0x07a5, 0x07a8, 0x07a9,
-+ 0x03aa, 0x03ab, 0x03ac, 0x03ad, 0x03b0, 0x03b1, 0x03b2, 0x03b3,
-+ 0x03b4, 0x03b5, 0x03b8, 0x03b9, 0x03ba, 0x03bb, 0x03bb
-+
-+};
-+
-+
-+/*
-+ from 0 to 0x23
-+u8 rtl8225_tx_gain_cck_ofdm[]={
-+ 0x02,0x06,0x0e,0x1e,0x3e,0x7e
-+};
-+*/
-+
-+//-
-+u8 rtl8225z2_tx_power_ofdm[]={
-+ 0x42,0x00,0x40,0x00,0x40
-+};
-+
-+
-+//-
-+u8 rtl8225z2_tx_power_cck_ch14[]={
-+ 0x36,0x35,0x2e,0x1b,0x00,0x00,0x00,0x00,
-+ 0x30, 0x2f, 0x29, 0x15, 0x00, 0x00, 0x00, 0x00,
-+ 0x30, 0x2f, 0x29, 0x15, 0x00, 0x00, 0x00, 0x00,
-+ 0x30, 0x2f, 0x29, 0x15, 0x00, 0x00, 0x00, 0x00,
-+};
-+
-+
-+//-
-+u8 rtl8225z2_tx_power_cck[]={
-+ 0x36,0x35,0x2e,0x25,0x1c,0x12,0x09,0x04,
-+ 0x30, 0x2f, 0x29, 0x21, 0x19, 0x10, 0x08, 0x03,
-+ 0x2b, 0x2a, 0x25, 0x1e, 0x16, 0x0e, 0x07, 0x03,
-+ 0x26, 0x25, 0x21, 0x1b, 0x14, 0x0d, 0x06, 0x03
-+};
-+
-+#ifdef ENABLE_DOT11D
-+//
-+// Description:
-+// Map dBm into Tx power index according to
-+// current HW model, for example, RF and PA, and
-+// current wireless mode.
-+//
-+s8
-+rtl8187B_DbmToTxPwrIdx(
-+ struct r8180_priv *priv,
-+ WIRELESS_MODE WirelessMode,
-+ s32 PowerInDbm
-+ )
-+{
-+ bool bUseDefault = true;
-+ s8 TxPwrIdx = 0;
-+
-+#ifdef CONFIG_RTL818X_S
-+ //
-+ // 071011, SD3 SY:
-+ // OFDM Power in dBm = Index * 0.5 + 0
-+ // CCK Power in dBm = Index * 0.25 + 13
-+ //
-+ if(priv->card_8185 >= VERSION_8187S_B)
-+ {
-+ s32 tmp = 0;
-+
-+ if(WirelessMode == WIRELESS_MODE_G)
-+ {
-+ bUseDefault = false;
-+ tmp = (2 * PowerInDbm);
-+
-+ if(tmp < 0)
-+ TxPwrIdx = 0;
-+ else if(tmp > 40) // 40 means 20 dBm.
-+ TxPwrIdx = 40;
-+ else
-+ TxPwrIdx = (s8)tmp;
-+ }
-+ else if(WirelessMode == WIRELESS_MODE_B)
-+ {
-+ bUseDefault = false;
-+ tmp = (4 * PowerInDbm) - 52;
-+
-+ if(tmp < 0)
-+ TxPwrIdx = 0;
-+ else if(tmp > 28) // 28 means 20 dBm.
-+ TxPwrIdx = 28;
-+ else
-+ TxPwrIdx = (s8)tmp;
-+ }
-+ }
-+#endif
-+
-+ //
-+ // TRUE if we want to use a default implementation.
-+ // We shall set it to FALSE when we have exact translation formular
-+ // for target IC. 070622, by rcnjko.
-+ //
-+ if(bUseDefault)
-+ {
-+ if(PowerInDbm < 0)
-+ TxPwrIdx = 0;
-+ else if(PowerInDbm > 35)
-+ TxPwrIdx = 35;
-+ else
-+ TxPwrIdx = (u8)PowerInDbm;
-+ }
-+
-+ return TxPwrIdx;
-+}
-+#endif
-+
-+
-+void rtl8225z2_set_gain(struct net_device *dev, short gain)
-+{
-+ u8* rtl8225_gain;
-+ struct r8180_priv *priv = ieee80211_priv(dev);
-+
-+ u8 mode = priv->ieee80211->mode;
-+
-+ if(mode == IEEE_B || mode == IEEE_G)
-+ rtl8225_gain = rtl8225z2_gain_bg;
-+ else
-+ rtl8225_gain = rtl8225z2_gain_a;
-+
-+ //write_phy_ofdm(dev, 0x0d, rtl8225_gain[gain * 3]);
-+ //write_phy_ofdm(dev, 0x19, rtl8225_gain[gain * 3 + 1]);
-+ //write_phy_ofdm(dev, 0x1b, rtl8225_gain[gain * 3 + 2]);
-+ //2005.11.17, by ch-hsu
-+ write_phy_ofdm(dev, 0x0b, rtl8225_gain[gain * 3]);
-+ write_phy_ofdm(dev, 0x1b, rtl8225_gain[gain * 3 + 1]);
-+ write_phy_ofdm(dev, 0x1d, rtl8225_gain[gain * 3 + 2]);
-+ write_phy_ofdm(dev, 0x21, 0x37);
-+
-+}
-+
-+u32 read_rtl8225(struct net_device *dev, u8 adr)
-+{
-+ u32 data2Write = ((u32)(adr & 0x1f)) << 27;
-+ u32 dataRead;
-+ u32 mask;
-+ u16 oval,oval2,oval3,tmp;
-+// ThreeWireReg twreg;
-+// ThreeWireReg tdata;
-+ int i;
-+ short bit, rw;
-+
-+ u8 wLength = 6;
-+ u8 rLength = 12;
-+ u8 low2high = 0;
-+
-+ oval = read_nic_word(dev, RFPinsOutput);
-+ oval2 = read_nic_word(dev, RFPinsEnable);
-+ oval3 = read_nic_word(dev, RFPinsSelect);
-+ write_nic_word(dev, RFPinsEnable, (oval2|0xf));
-+ write_nic_word(dev, RFPinsSelect, (oval3|0xf));
-+
-+ dataRead = 0;
-+
-+ oval &= ~0xf;
-+
-+ write_nic_word(dev, RFPinsOutput, oval | BB_HOST_BANG_EN ); udelay(4);
-+
-+ write_nic_word(dev, RFPinsOutput, oval ); udelay(5);
-+
-+ rw = 0;
-+
-+ mask = (low2high) ? 0x01 : (((u32)0x01)<<(32-1));
-+ for(i = 0; i < wLength/2; i++)
-+ {
-+ bit = ((data2Write&mask) != 0) ? 1 : 0;
-+ write_nic_word(dev, RFPinsOutput, bit|oval | rw); udelay(1);
-+
-+ write_nic_word(dev, RFPinsOutput, bit|oval | BB_HOST_BANG_CLK | rw); udelay(2);
-+ write_nic_word(dev, RFPinsOutput, bit|oval | BB_HOST_BANG_CLK | rw); udelay(2);
-+
-+ mask = (low2high) ? (mask<<1): (mask>>1);
-+
-+ if(i == 2)
-+ {
-+ rw = BB_HOST_BANG_RW;
-+ write_nic_word(dev, RFPinsOutput, bit|oval | BB_HOST_BANG_CLK | rw); udelay(2);
-+ write_nic_word(dev, RFPinsOutput, bit|oval | rw); udelay(2);
-+ break;
-+ }
-+
-+ bit = ((data2Write&mask) != 0) ? 1: 0;
-+
-+ write_nic_word(dev, RFPinsOutput, oval|bit|rw| BB_HOST_BANG_CLK); udelay(2);
-+ write_nic_word(dev, RFPinsOutput, oval|bit|rw| BB_HOST_BANG_CLK); udelay(2);
-+
-+ write_nic_word(dev, RFPinsOutput, oval| bit |rw); udelay(1);
-+
-+ mask = (low2high) ? (mask<<1) : (mask>>1);
-+ }
-+
-+ //twreg.struc.clk = 0;
-+ //twreg.struc.data = 0;
-+ write_nic_word(dev, RFPinsOutput, rw|oval); udelay(2);
-+ mask = (low2high) ? 0x01 : (((u32)0x01) << (12-1));
-+
-+ // We must set data pin to HW controled, otherwise RF can't driver it and
-+ // value RF register won't be able to read back properly. 2006.06.13, by rcnjko.
-+ write_nic_word(dev, RFPinsEnable,((oval2|0xe) & (~0x01)));
-+
-+ for(i = 0; i < rLength; i++)
-+ {
-+ write_nic_word(dev, RFPinsOutput, rw|oval); udelay(1);
-+
-+ write_nic_word(dev, RFPinsOutput, rw|oval|BB_HOST_BANG_CLK); udelay(2);
-+ write_nic_word(dev, RFPinsOutput, rw|oval|BB_HOST_BANG_CLK); udelay(2);
-+ write_nic_word(dev, RFPinsOutput, rw|oval|BB_HOST_BANG_CLK); udelay(2);
-+ tmp = read_nic_word(dev, RFPinsInput);
-+
-+ dataRead |= (tmp & BB_HOST_BANG_CLK ? mask : 0);
-+
-+ write_nic_word(dev, RFPinsOutput, (rw|oval)); udelay(2);
-+
-+ mask = (low2high) ? (mask<<1) : (mask>>1);
-+ }
-+
-+ write_nic_word(dev, RFPinsOutput, BB_HOST_BANG_EN|BB_HOST_BANG_RW|oval); udelay(2);
-+
-+ write_nic_word(dev, RFPinsEnable, oval2);
-+ write_nic_word(dev, RFPinsSelect, oval3); // Set To SW Switch
-+ write_nic_word(dev, RFPinsOutput, 0x3a0);
-+
-+ return dataRead;
-+
-+}
-+short rtl8225_is_V_z2(struct net_device *dev)
-+{
-+ short vz2 = 1;
-+ //set VCO-PDN pin
-+// printk("%s()\n", __FUNCTION__);
-+ write_nic_word(dev, RFPinsOutput, 0x0080);
-+ write_nic_word(dev, RFPinsSelect, 0x0080);
-+ write_nic_word(dev, RFPinsEnable, 0x0080);
-+
-+ //lzm mod for up take too long time 20081201
-+ //mdelay(100);
-+ //mdelay(1000);
-+
-+ /* sw to reg pg 1 */
-+ write_rtl8225(dev, 0, 0x1b7);
-+ /* reg 8 pg 1 = 23*/
-+ if( read_rtl8225(dev, 8) != 0x588)
-+ vz2 = 0;
-+
-+ else /* reg 9 pg 1 = 24 */
-+ if( read_rtl8225(dev, 9) != 0x700)
-+ vz2 = 0;
-+
-+ /* sw back to pg 0 */
-+ write_rtl8225(dev, 0, 0xb7);
-+
-+ return vz2;
-+
-+}
-+
-+void rtl8225z2_SetTXPowerLevel(struct net_device *dev, short ch)
-+{
-+ struct r8180_priv *priv = ieee80211_priv(dev);
-+
-+// int GainIdx;
-+// int GainSetting;
-+ int i;
-+ u8 power;
-+ u8 *cck_power_table;
-+ u8 max_cck_power_level;
-+ u8 min_cck_power_level;
-+ u8 max_ofdm_power_level;
-+ u8 min_ofdm_power_level;
-+ s8 cck_power_level = 0xff & priv->chtxpwr[ch];
-+ s8 ofdm_power_level = 0xff & priv->chtxpwr_ofdm[ch];
-+ u8 hw_version = priv->card_8187_Bversion;
-+
-+#ifdef ENABLE_DOT11D
-+ if(IS_DOT11D_ENABLE(priv->ieee80211) &&
-+ IS_DOT11D_STATE_DONE(priv->ieee80211) )
-+ {
-+ //PRT_DOT11D_INFO pDot11dInfo = GET_DOT11D_INFO(priv->ieee80211);
-+ u8 MaxTxPwrInDbm = DOT11D_GetMaxTxPwrInDbm(priv->ieee80211, ch);
-+ u8 CckMaxPwrIdx = rtl8187B_DbmToTxPwrIdx(priv, WIRELESS_MODE_B, MaxTxPwrInDbm);
-+ u8 OfdmMaxPwrIdx = rtl8187B_DbmToTxPwrIdx(priv, WIRELESS_MODE_G, MaxTxPwrInDbm);
-+
-+ //printk("Max Tx Power dBm (%d) => CCK Tx power index : %d, OFDM Tx power index: %d\n", MaxTxPwrInDbm, CckMaxPwrIdx, OfdmMaxPwrIdx);
-+
-+ //printk("EEPROM channel(%d) => CCK Tx power index: %d, OFDM Tx power index: %d\n",
-+ // ch, cck_power_level, ofdm_power_level);
-+
-+ if(cck_power_level > CckMaxPwrIdx)
-+ cck_power_level = CckMaxPwrIdx;
-+ if(ofdm_power_level > OfdmMaxPwrIdx)
-+ ofdm_power_level = OfdmMaxPwrIdx;
-+ }
-+
-+ //priv->CurrentCckTxPwrIdx = cck_power_level;
-+ //priv->CurrentOfdmTxPwrIdx = ofdm_power_level;
-+#endif
-+
-+ if (NIC_8187B == priv->card_8187)
-+ {
-+ if (hw_version == VERSION_8187B_B)
-+ {
-+ min_cck_power_level = 0;
-+ max_cck_power_level = 15;
-+ min_ofdm_power_level = 2;
-+ max_ofdm_power_level = 17;
-+ }else
-+ {
-+ min_cck_power_level = 7;
-+ max_cck_power_level = 22;
-+ min_ofdm_power_level = 10;
-+ max_ofdm_power_level = 25;
-+ }
-+
-+ if( priv->TrSwitchState == TR_SW_TX )
-+ {
-+ //printk("SetTxPowerLevel8187(): Origianl OFDM Tx power level %d, adjust value = %d\n", ofdm_power_level,GetTxOfdmHighPowerBias(dev));
-+ ofdm_power_level -= GetTxOfdmHighPowerBias(dev);
-+ cck_power_level -= GetTxCckHighPowerBias(dev);
-+ //printk("SetTxPowerLevel8187(): Adjusted OFDM Tx power level %d for we are in High Power state\n",
-+ // ofdm_power_level);
-+ //printk("SetTxPowerLevel8187(): Adjusted CCK Tx power level %d for we are in High Power state\n",
-+ // cck_power_level);
-+ }
-+ /* CCK power setting */
-+ if(cck_power_level > (max_cck_power_level -min_cck_power_level))
-+ cck_power_level = max_cck_power_level;
-+ else
-+ cck_power_level += min_cck_power_level;
-+ cck_power_level += priv->cck_txpwr_base;
-+
-+ if(cck_power_level > 35)
-+ cck_power_level = 35;
-+ if(cck_power_level < 0)
-+ cck_power_level = 0;
-+
-+ if(ch == 14)
-+ cck_power_table = rtl8225z2_tx_power_cck_ch14;
-+ else
-+ cck_power_table = rtl8225z2_tx_power_cck;
-+ if (hw_version == VERSION_8187B_B)
-+ {
-+ if (cck_power_level <= 6){
-+ }
-+ else if (cck_power_level <=11){
-+ cck_power_table += 8;
-+ }
-+ else{
-+ cck_power_table += (8*2);
-+ }
-+ }else{
-+ if (cck_power_level<=5){
-+ }else if(cck_power_level<=11){
-+ cck_power_table += 8;
-+ }else if(cck_power_level <= 17){
-+ cck_power_table += 8*2;
-+ }else{
-+ cck_power_table += 8*3;
-+ }
-+ }
-+
-+
-+
-+ for(i=0;i<8;i++){
-+
-+ power = cck_power_table[i];
-+ write_phy_cck(dev, 0x44 + i, power);
-+ }
-+
-+ //write_nic_byte(dev, TX_GAIN_CCK, power);
-+ //2005.11.17,
-+ write_nic_byte(dev, CCK_TXAGC, (ZEBRA2_CCK_OFDM_GAIN_SETTING[cck_power_level]*2));
-+
-+// force_pci_posting(dev);
-+// msleep(1);
-+//in windows the delay was del from 85 to 87,
-+//here we mod to sleep, or The CPU occupany is too hight. LZM 31/10/2008
-+
-+ /* OFDM power setting */
-+ // Old:
-+ // if(ofdm_power_level > max_ofdm_power_level)
-+ // ofdm_power_level = 35;
-+ // ofdm_power_level += min_ofdm_power_level;
-+ // Latest:
-+ if(ofdm_power_level > (max_ofdm_power_level - min_ofdm_power_level))
-+ ofdm_power_level = max_ofdm_power_level;
-+ else
-+ ofdm_power_level += min_ofdm_power_level;
-+
-+ ofdm_power_level += priv->ofdm_txpwr_base;
-+
-+ if(ofdm_power_level > 35)
-+ ofdm_power_level = 35;
-+
-+ if(ofdm_power_level < 0)
-+ ofdm_power_level = 0;
-+ write_nic_byte(dev, OFDM_TXAGC, ZEBRA2_CCK_OFDM_GAIN_SETTING[ofdm_power_level]*2);
-+
-+ if (hw_version == VERSION_8187B_B)
-+ {
-+ if(ofdm_power_level<=11){
-+ write_phy_ofdm(dev, 0x87, 0x60);
-+ write_phy_ofdm(dev, 0x89, 0x60);
-+ }
-+ else{
-+ write_phy_ofdm(dev, 0x87, 0x5c);
-+ write_phy_ofdm(dev, 0x89, 0x5c);
-+ }
-+ }else{
-+ if(ofdm_power_level<=11){
-+ write_phy_ofdm(dev, 0x87, 0x5c);
-+ write_phy_ofdm(dev, 0x89, 0x5c);
-+ }
-+ if(ofdm_power_level<=17){
-+ write_phy_ofdm(dev, 0x87, 0x54);
-+ write_phy_ofdm(dev, 0x89, 0x54);
-+ }
-+ else{
-+ write_phy_ofdm(dev, 0x87, 0x50);
-+ write_phy_ofdm(dev, 0x89, 0x50);
-+ }
-+ }
-+// force_pci_posting(dev);
-+// msleep(1);
-+//in windows the delay was del from 85 to 87,
-+//and here we mod to sleep, or The CPU occupany is too hight. LZM 31/10/2008
-+ }else if(NIC_8187 == priv->card_8187) {
-+ min_cck_power_level = 0;
-+ max_cck_power_level = 15;
-+ min_ofdm_power_level = 10;
-+ max_ofdm_power_level = 25;
-+ if(cck_power_level > (max_cck_power_level -min_cck_power_level))
-+ cck_power_level = max_cck_power_level;
-+ else
-+ cck_power_level += min_cck_power_level;
-+ cck_power_level += priv->cck_txpwr_base;
-+
-+ if(cck_power_level > 35)
-+ cck_power_level = 35;
-+
-+ if(ch == 14)
-+ cck_power_table = rtl8225z2_tx_power_cck_ch14;
-+ else
-+ cck_power_table = rtl8225z2_tx_power_cck;
-+ for(i=0;i<8;i++){
-+ power = cck_power_table[i];
-+ write_phy_cck(dev, 0x44 + i, power);
-+ }
-+
-+ //write_nic_byte(dev, TX_GAIN_CCK, power);
-+ //2005.11.17,
-+ write_nic_byte(dev, CCK_TXAGC, ZEBRA2_CCK_OFDM_GAIN_SETTING[cck_power_level]);
-+
-+// force_pci_posting(dev);
-+// msleep(1);
-+//in windows the delay was del from 85 to 87,
-+//and here we mod to sleep, or The CPU occupany is too hight. LZM 31/10/2008
-+ if(ofdm_power_level > (max_ofdm_power_level - min_ofdm_power_level))
-+ ofdm_power_level = max_ofdm_power_level;
-+ else
-+ ofdm_power_level += min_ofdm_power_level;
-+
-+ ofdm_power_level += priv->ofdm_txpwr_base;
-+
-+ if(ofdm_power_level > 35)
-+ ofdm_power_level = 35;
-+ write_nic_byte(dev, OFDM_TXAGC, ZEBRA2_CCK_OFDM_GAIN_SETTING[ofdm_power_level]);
-+
-+ rtl8185_set_anaparam2(dev,RTL8225_ANAPARAM2_ON);
-+
-+ write_phy_ofdm(dev,2,0x42);
-+ write_phy_ofdm(dev,5,0);
-+ write_phy_ofdm(dev,6,0x40);
-+ write_phy_ofdm(dev,7,0);
-+ write_phy_ofdm(dev,8,0x40);
-+ }
-+
-+}
-+
-+void rtl8225z2_rf_set_chan(struct net_device *dev, short ch)
-+{
-+ struct r8180_priv *priv = ieee80211_priv(dev);
-+ short gset = (priv->ieee80211->state == IEEE80211_LINKED &&
-+ ieee80211_is_54g(priv->ieee80211->current_network)) ||
-+ priv->ieee80211->iw_mode == IW_MODE_MONITOR;
-+ int eifs_addr;
-+
-+ down(&priv->set_chan_sem);
-+
-+ if(NIC_8187 == priv->card_8187) {
-+ eifs_addr = EIFS_8187;
-+ } else {
-+ eifs_addr = EIFS_8187B;
-+ }
-+
-+#ifdef ENABLE_DOT11D
-+ if(!IsLegalChannel(priv->ieee80211, ch) )
-+ {
-+ printk("channel(%d). is invalide\n", ch);
-+ up(&priv->set_chan_sem);
-+ return;
-+ }
-+#endif
-+ //87B not do it FIXME
-+ rtl8225z2_SetTXPowerLevel(dev, ch);
-+
-+ //write_nic_byte(dev,0x7,(u8)rtl8225_chan[ch]);
-+ write_rtl8225(dev, 0x7, rtl8225_chan[ch]);
-+
-+ force_pci_posting(dev);
-+ //mdelay(10);
-+//in windows the delay was del from 85 to 87,
-+//and here we mod to sleep, or The CPU occupany is too hight. LZM 31/10/2008
-+ if(NIC_8187 == priv->card_8187){
-+ write_nic_byte(dev,SIFS,0x22);// SIFS: 0x22
-+
-+ if(gset)
-+ write_nic_byte(dev,DIFS,20); //DIFS: 20
-+ else
-+ write_nic_byte(dev,DIFS,0x24); //DIFS: 36
-+
-+ if(priv->ieee80211->state == IEEE80211_LINKED &&
-+ ieee80211_is_shortslot(priv->ieee80211->current_network))
-+ write_nic_byte(dev,SLOT,0x9); //SLOT: 9
-+
-+ else
-+ write_nic_byte(dev,SLOT,0x14); //SLOT: 20 (0x14)
-+
-+
-+ if(gset){
-+ write_nic_byte(dev,eifs_addr,91 - 20); // EIFS: 91 (0x5B)
-+ write_nic_byte(dev,CW_VAL,0x73); //CW VALUE: 0x37
-+ //DMESG("using G net params");
-+ }else{
-+ write_nic_byte(dev,eifs_addr,91 - 0x24); // EIFS: 91 (0x5B)
-+ write_nic_byte(dev,CW_VAL,0xa5); //CW VALUE: 0x37
-+ //DMESG("using B net params");
-+ }
-+ }
-+
-+ else {
-+#ifdef THOMAS_TURBO
-+ if(priv->ieee80211->current_network.Turbo_Enable && priv->ieee80211->iw_mode == IW_MODE_INFRA){
-+ write_nic_word(dev,AC_VO_PARAM,0x5114);
-+ write_nic_word(dev,AC_VI_PARAM,0x5114);
-+ write_nic_word(dev,AC_BE_PARAM,0x5114);
-+ write_nic_word(dev,AC_BK_PARAM,0x5114);
-+ } else {
-+ write_nic_word(dev,AC_VO_PARAM,0x731c);
-+ write_nic_word(dev,AC_VI_PARAM,0x731c);
-+ write_nic_word(dev,AC_BE_PARAM,0x731c);
-+ write_nic_word(dev,AC_BK_PARAM,0x731c);
-+ }
-+#endif
-+ }
-+
-+ up(&priv->set_chan_sem);
-+}
-+void
-+MacConfig_87BASIC_HardCode(struct net_device *dev)
-+{
-+ //============================================================================
-+ // MACREG.TXT
-+ //============================================================================
-+ int nLinesRead = 0;
-+ u32 u4bRegOffset, u4bRegValue, u4bPageIndex;
-+ int i;
-+
-+ nLinesRead=(sizeof(MAC_REG_TABLE)/3)/4;
-+
-+ for(i = 0; i < nLinesRead; i++)
-+ {
-+ u4bRegOffset=MAC_REG_TABLE[i][0];
-+ u4bRegValue=MAC_REG_TABLE[i][1];
-+ u4bPageIndex=MAC_REG_TABLE[i][2];
-+
-+ u4bRegOffset|= (u4bPageIndex << 8);
-+
-+ write_nic_byte(dev, u4bRegOffset, (u8)u4bRegValue);
-+ }
-+ //============================================================================
-+}
-+
-+static void MacConfig_87BASIC(struct net_device *dev)
-+{
-+ MacConfig_87BASIC_HardCode(dev);
-+
-+ //============================================================================
-+
-+ // Follow TID_AC_MAP of WMac.
-+ //PlatformEFIOWrite2Byte(dev, TID_AC_MAP, 0xfa50);
-+ write_nic_word(dev, TID_AC_MAP, 0xfa50);
-+
-+ // Interrupt Migration, Jong suggested we use set 0x0000 first, 2005.12.14, by rcnjko.
-+ write_nic_word(dev, INT_MIG, 0x0000);
-+
-+ // Prevent TPC to cause CRC error. Added by Annie, 2006-06-10.
-+ write_nic_dword(dev, 0x1F0, 0x00000000);
-+ write_nic_dword(dev, 0x1F4, 0x00000000);
-+ write_nic_byte(dev, 0x1F8, 0x00);
-+
-+ // For WiFi 5.2.2.5 Atheros AP performance. Added by Annie, 2006-06-12.
-+ // PlatformIOWrite4Byte(dev, RFTiming, 0x0008e00f);
-+ // Asked for by SD3 CM Lin, 2006.06.27, by rcnjko.
-+ write_nic_dword(dev, RFTiming, 0x00004001);
-+
-+#ifdef TODO
-+ // Asked for by Victor, for 87B B-cut Rx FIFO overflow bug, 2006.06.27, by rcnjko.
-+ if(dev->NdisUsbDev.CardInfo.USBIsHigh == FALSE)
-+ {
-+ PlatformEFIOWrite1Byte(dev, 0x24E, 0x01);
-+ }
-+#endif
-+}
-+
-+
-+//
-+// Description:
-+// Initialize RFE and read Zebra2 version code.
-+//
-+// 2005-08-01, by Annie.
-+//
-+void
-+SetupRFEInitialTiming(struct net_device* dev)
-+{
-+ //u32 data8, data9;
-+ struct r8180_priv *priv = ieee80211_priv(dev);
-+
-+ // setup initial timing for RFE
-+ // Set VCO-PDN pin.
-+ write_nic_word(dev, RFPinsOutput, 0x0480);
-+ write_nic_word(dev, RFPinsSelect, 0x2488);
-+ write_nic_word(dev, RFPinsEnable, 0x1FFF);
-+
-+ mdelay(100);
-+ // Steven recommends: delay 1 sec for setting RF 1.8V. by Annie, 2005-04-28.
-+ mdelay(1000);
-+
-+ //
-+ // TODO: Read Zebra version code if necessary.
-+ //
-+ priv->rf_chip = RF_ZEBRA2;
-+}
-+
-+
-+void ZEBRA_Config_87BASIC_HardCode(struct net_device* dev)
-+{
-+ u32 i;
-+ u32 addr,data;
-+ u32 u4bRegOffset, u4bRegValue;
-+
-+
-+ //=============================================================================
-+ // RADIOCFG.TXT
-+ //=============================================================================
-+ write_rtl8225(dev, 0x00, 0x00b7); mdelay(1);
-+ write_rtl8225(dev, 0x01, 0x0ee0); mdelay(1);
-+ write_rtl8225(dev, 0x02, 0x044d); mdelay(1);
-+ write_rtl8225(dev, 0x03, 0x0441); mdelay(1);
-+ write_rtl8225(dev, 0x04, 0x08c3); mdelay(1);
-+ write_rtl8225(dev, 0x05, 0x0c72); mdelay(1);
-+ write_rtl8225(dev, 0x06, 0x00e6); mdelay(1);
-+ write_rtl8225(dev, 0x07, 0x082a); mdelay(1);
-+ write_rtl8225(dev, 0x08, 0x003f); mdelay(1);
-+ write_rtl8225(dev, 0x09, 0x0335); mdelay(1);
-+ write_rtl8225(dev, 0x0a, 0x09d4); mdelay(1);
-+ write_rtl8225(dev, 0x0b, 0x07bb); mdelay(1);
-+ write_rtl8225(dev, 0x0c, 0x0850); mdelay(1);
-+ write_rtl8225(dev, 0x0d, 0x0cdf); mdelay(1);
-+ write_rtl8225(dev, 0x0e, 0x002b); mdelay(1);
-+ write_rtl8225(dev, 0x0f, 0x0114); mdelay(1);
-+
-+ write_rtl8225(dev, 0x00, 0x01b7); mdelay(1);
-+
-+
-+ for(i=1;i<=95;i++)
-+ {
-+ write_rtl8225(dev, 0x01, i);mdelay(1);
-+ write_rtl8225(dev, 0x02, ZEBRA_RF_RX_GAIN_TABLE[i]); mdelay(1);
-+ //DbgPrint("RF - 0x%x = 0x%x\n", i, ZEBRA_RF_RX_GAIN_TABLE[i]);
-+ }
-+
-+ write_rtl8225(dev, 0x03, 0x0080); mdelay(1); // write reg 18
-+ write_rtl8225(dev, 0x05, 0x0004); mdelay(1); // write reg 20
-+ write_rtl8225(dev, 0x00, 0x00b7); mdelay(1); // switch to reg0-reg15
-+ //lzm mod for up take too long time 20081201
-+#ifdef THOMAS_BEACON
-+ msleep(1000);// Deay 1 sec. //0xfd
-+ //msleep(1000);// Deay 1 sec. //0xfd
-+ //msleep(1000);// Deay 1 sec. //0xfd
-+ msleep(400);// Deay 1 sec. //0xfd
-+#else
-+
-+ mdelay(1000);
-+ //mdelay(1000);
-+ //mdelay(1000);
-+ mdelay(400);
-+#endif
-+ write_rtl8225(dev, 0x02, 0x0c4d); mdelay(1);
-+ //lzm mod for up take too long time 20081201
-+ //mdelay(1000);
-+ //mdelay(1000);
-+ msleep(100);// Deay 100 ms. //0xfe
-+ msleep(100);// Deay 100 ms. //0xfe
-+ write_rtl8225(dev, 0x02, 0x044d); mdelay(1);
-+ write_rtl8225(dev, 0x00, 0x02bf); mdelay(1); //0x002f disable 6us corner change, 06f--> enable
-+
-+ //=============================================================================
-+
-+ //=============================================================================
-+ // CCKCONF.TXT
-+ //=============================================================================
-+ /*
-+ u4bRegOffset=0x41;
-+ u4bRegValue=0xc8;
-+
-+ //DbgPrint("\nCCK- 0x%x = 0x%x\n", u4bRegOffset, u4bRegValue);
-+ WriteBB(dev, (0x01000080 | (u4bRegOffset & 0x7f) | ((u4bRegValue & 0xff) << 8)));
-+ */
-+
-+
-+ //=============================================================================
-+
-+ //=============================================================================
-+ // Follow WMAC RTL8225_Config()
-+ //=============================================================================
-+// //
-+// // enable EEM0 and EEM1 in 9346CR
-+// PlatformEFIOWrite1Byte(dev, CR9346, PlatformEFIORead1Byte(dev, CR9346)|0xc0);
-+// // enable PARM_En in Config3
-+// PlatformEFIOWrite1Byte(dev, CONFIG3, PlatformEFIORead1Byte(dev, CONFIG3)|0x40);
-+//
-+// PlatformEFIOWrite4Byte(dev, AnaParm2, ANAPARM2_ASIC_ON); //0x727f3f52
-+// PlatformEFIOWrite4Byte(dev, AnaParm, ANAPARM_ASIC_ON); //0x45090658
-+
-+ // power control
-+ write_nic_byte(dev, CCK_TXAGC, 0x03);
-+ write_nic_byte(dev, OFDM_TXAGC, 0x07);
-+ write_nic_byte(dev, ANTSEL, 0x03);
-+
-+// // disable PARM_En in Config3
-+// PlatformEFIOWrite1Byte(dev, CONFIG3, PlatformEFIORead1Byte(dev, CONFIG3)&0xbf);
-+// // disable EEM0 and EEM1 in 9346CR
-+// PlatformEFIOWrite1Byte(dev, CR9346, PlatformEFIORead1Byte(dev, CR9346)&0x3f);
-+ //=============================================================================
-+
-+ //=============================================================================
-+ // AGC.txt
-+ //=============================================================================
-+ //write_nic_dword( dev, PhyAddr, 0x00001280); // Annie, 2006-05-05
-+ //write_phy_ofdm( dev, 0x00, 0x12); // David, 2006-08-01
-+ write_phy_ofdm( dev, 0x80, 0x12); // David, 2006-08-09
-+
-+ for (i=0; i<128; i++)
-+ {
-+ //DbgPrint("AGC - [%x+1] = 0x%x\n", i, ZEBRA_AGC[i+1]);
-+
-+ data = ZEBRA_AGC[i+1];
-+ data = data << 8;
-+ data = data | 0x0000008F;
-+
-+ addr = i + 0x80; //enable writing AGC table
-+ addr = addr << 8;
-+ addr = addr | 0x0000008E;
-+
-+ write_phy_ofdm(dev,data&0x7f,(data>>8)&0xff);
-+ write_phy_ofdm(dev,addr&0x7f,(addr>>8)&0xff);
-+ write_phy_ofdm(dev,0x0E,0x00);
-+ }
-+
-+ //write_nic_dword(dev, PhyAddr, 0x00001080); // Annie, 2006-05-05
-+ //write_phy_ofdm( dev, 0x00, 0x10); // David, 2006-08-01
-+ write_phy_ofdm( dev, 0x80, 0x10); // David, 2006-08-09
-+
-+ //=============================================================================
-+
-+ //=============================================================================
-+ // OFDMCONF.TXT
-+ //=============================================================================
-+
-+ for(i=0; i<60; i++)
-+ {
-+ u4bRegOffset=i;
-+ u4bRegValue=OFDM_CONFIG[i];
-+ //u4bRegValue=OFDM_CONFIG3m82[i];
-+
-+ // write_nic_dword(dev,PhyAddr,(0x00000080 | (u4bRegOffset & 0x7f) | ((u4bRegValue & 0xff) << 8)));
-+ write_phy_ofdm(dev,i,u4bRegValue);
-+ }
-+
-+
-+ //=============================================================================
-+}
-+
-+void ZEBRA_Config_87BASIC(struct net_device *dev)
-+{
-+ ZEBRA_Config_87BASIC_HardCode(dev);
-+}
-+//by amy for DIG
-+//
-+// Description:
-+// Update initial gain into PHY.
-+//
-+void
-+UpdateCCKThreshold(
-+ struct net_device *dev
-+ )
-+{
-+ struct r8180_priv *priv = ieee80211_priv(dev);
-+ // Update CCK Power Detection(0x41) value.
-+ switch(priv->StageCCKTh)
-+ {
-+ case 0:
-+// printk("Update CCK Stage 0: 88 \n");
-+ write_phy_cck(dev, 0xc1, 0x88);mdelay(1);
-+ break;
-+
-+ case 1:
-+// printk("Update CCK Stage 1: 98 \n");
-+ write_phy_cck(dev, 0xc1, 0x98);mdelay(1);
-+ break;
-+
-+ case 2:
-+// printk("Update CCK Stage 2: C8 \n");
-+ write_phy_cck(dev, 0xc1, 0xC8);mdelay(1);
-+ break;
-+
-+ case 3:
-+// printk("Update CCK Stage 3: D8 \n");
-+ write_phy_cck(dev, 0xc1, 0xD8);mdelay(1);
-+ break;
-+
-+ default:
-+// printk("Update CCK Stage %d ERROR!\n", pHalData->StageCCKTh);
-+ break;
-+ }
-+}
-+//
-+// Description:
-+// Update initial gain into PHY.
-+//
-+void
-+UpdateInitialGain(
-+ struct net_device *dev
-+ )
-+{
-+ struct r8180_priv *priv = ieee80211_priv(dev);
-+ //u8 u1Tmp=0;
-+
-+ //printk("UpdateInitialGain(): InitialGain: %d RFChipID: %d\n", priv->InitialGain, priv->rf_chip);
-+
-+ switch(priv->rf_chip)
-+ {
-+ case RF_ZEBRA:
-+ case RF_ZEBRA2:
-+
-+ //
-+ // Note:
-+ // Whenever we update this gain table, we should be careful about those who call it.
-+ // Functions which call UpdateInitialGain as follows are important:
-+ // (1)StaRateAdaptive87B
-+ // (2)DIG_Zebra
-+ // (3)ActSetWirelessMode8187 (when the wireless mode is "B" mode, we set the
-+ // OFDM[0x17] = 0x26 to improve the Rx sensitivity).
-+ // By Bruce, 2007-06-01.
-+ //
-+
-+ //
-+ // SD3 C.M. Lin Initial Gain Table, by Bruce, 2007-06-01.
-+ //
-+ switch(priv->InitialGain)
-+ {
-+ case 1: //m861dBm
-+ DMESG("RTL8187 + 8225 Initial Gain State 1: -82 dBm ");
-+ write_phy_ofdm(dev, 0x97, 0x26); mdelay(1);
-+ write_phy_ofdm(dev, 0xa4, 0x86); mdelay(1);
-+ write_phy_ofdm(dev, 0x85, 0xfa); mdelay(1);
-+ break;
-+
-+ case 2: //m862dBm
-+ DMESG("RTL8187 + 8225 Initial Gain State 2: -78 dBm ");
-+ write_phy_ofdm(dev, 0x97, 0x36); mdelay(1);// Revise 0x26 to 0x36, by Roger, 2007.05.03.
-+ write_phy_ofdm(dev, 0xa4, 0x86); mdelay(1);
-+ write_phy_ofdm(dev, 0x85, 0xfa); mdelay(1);
-+ break;
-+
-+ case 3: //m863dBm
-+ DMESG("RTL8187 + 8225 Initial Gain State 3: -78 dBm ");
-+ write_phy_ofdm(dev, 0x97, 0x36); mdelay(1);// Revise 0x26 to 0x36, by Roger, 2007.05.03.
-+ write_phy_ofdm(dev, 0xa4, 0x86); mdelay(1);
-+ write_phy_ofdm(dev, 0x85, 0xfb); mdelay(1);
-+ break;
-+
-+ case 4: //m864dBm
-+ DMESG("RTL8187 + 8225 Initial Gain State 4: -74 dBm ");
-+ write_phy_ofdm(dev, 0x97, 0x46); mdelay(1);// Revise 0x26 to 0x36, by Roger, 2007.05.03.
-+ write_phy_ofdm(dev, 0xa4, 0x86); mdelay(1);
-+ write_phy_ofdm(dev, 0x85, 0xfb); mdelay(1);
-+ break;
-+
-+ case 5: //m82dBm
-+ DMESG("RTL8187 + 8225 Initial Gain State 5: -74 dBm ");
-+ write_phy_ofdm(dev, 0x97, 0x46); mdelay(1);
-+ write_phy_ofdm(dev, 0xa4, 0x96); mdelay(1);
-+ write_phy_ofdm(dev, 0x85, 0xfb); mdelay(1);
-+ break;
-+
-+ case 6: //m78dBm
-+ DMESG("RTL8187 + 8225 Initial Gain State 6: -70 dBm ");
-+ write_phy_ofdm(dev, 0x97, 0x56); mdelay(1);
-+ write_phy_ofdm(dev, 0xa4, 0x96); mdelay(1);
-+ write_phy_ofdm(dev, 0x85, 0xfc); mdelay(1);
-+ break;
-+
-+ case 7: //m74dBm
-+ DMESG("RTL8187 + 8225 Initial Gain State 7: -70 dBm ");
-+ write_phy_ofdm(dev, 0x97, 0x56); mdelay(1);
-+ write_phy_ofdm(dev, 0xa4, 0xa6); mdelay(1);
-+ write_phy_ofdm(dev, 0x85, 0xfc); mdelay(1);
-+ break;
-+
-+ // By Bruce, 2007-03-29.
-+ case 8:
-+ write_phy_ofdm(dev, 0x97, 0x66); mdelay(1);
-+ write_phy_ofdm(dev, 0xa4, 0xb6); mdelay(1);
-+ write_phy_ofdm(dev, 0x85, 0xfc); mdelay(1);
-+ break;
-+
-+ default: //MP
-+ DMESG("RTL8187 + 8225 Initial Gain State: -82 dBm (default), InitialGain(%d)", priv->InitialGain);
-+ write_phy_ofdm(dev, 0x97, 0x26); mdelay(1);
-+ write_phy_ofdm(dev, 0xa4, 0x86); mdelay(1);
-+ write_phy_ofdm(dev, 0x85, 0xfa); mdelay(1);
-+ break;
-+ }
-+ break;
-+
-+ default:
-+ break;
-+ }
-+}
-+//by amy for DIG
-+void PhyConfig8187(struct net_device *dev)
-+{
-+ struct r8180_priv *priv = ieee80211_priv(dev);
-+ u8 btConfig4;
-+
-+ btConfig4 = read_nic_byte(dev, CONFIG4);
-+ priv->RFProgType = (btConfig4 & 0x03);
-+
-+
-+
-+ switch(priv->rf_chip)
-+ {
-+ case RF_ZEBRA2:
-+ ZEBRA_Config_87BASIC(dev);
-+ break;
-+ }
-+ if(priv->bDigMechanism)
-+ {
-+ if(priv->InitialGain == 0)
-+ priv->InitialGain = 4;
-+ DMESG("DIG is enabled, set default initial gain index to %d", priv->InitialGain);
-+ }
-+
-+ // By Bruce, 2007-03-29.
-+ UpdateCCKThreshold(dev);
-+ // Update initial gain after PhyConfig comleted, asked for by SD3 CMLin.
-+ UpdateInitialGain(dev);
-+ return ;
-+}
-+
-+u8 GetSupportedWirelessMode8187(struct net_device* dev)
-+{
-+ u8 btSupportedWirelessMode;
-+ struct r8180_priv *priv = ieee80211_priv(dev);
-+
-+ btSupportedWirelessMode = 0;
-+
-+ switch(priv->rf_chip)
-+ {
-+ case RF_ZEBRA:
-+ case RF_ZEBRA2:
-+ btSupportedWirelessMode = (WIRELESS_MODE_B | WIRELESS_MODE_G);
-+ break;
-+ default:
-+ btSupportedWirelessMode = WIRELESS_MODE_B;
-+ break;
-+ }
-+ return btSupportedWirelessMode;
-+}
-+
-+void ActUpdateChannelAccessSetting(struct net_device *dev,
-+ int WirelessMode,
-+ PCHANNEL_ACCESS_SETTING ChnlAccessSetting)
-+{
-+ AC_CODING eACI;
-+ AC_PARAM AcParam;
-+#ifdef TODO
-+ PSTA_QOS pStaQos = Adapter->MgntInfo.pStaQos;
-+#endif
-+ //bool bFollowLegacySetting = false;
-+
-+
-+ switch( WirelessMode )
-+ {
-+ case WIRELESS_MODE_A:
-+ ChnlAccessSetting->SIFS_Timer = 0x22;
-+ ChnlAccessSetting->DIFS_Timer = 34; // 34 = 16 + 2*9. 2006.06.07, by rcnjko.
-+ ChnlAccessSetting->SlotTimeTimer = 9;
-+ ChnlAccessSetting->EIFS_Timer = 23;
-+ ChnlAccessSetting->CWminIndex = 4;
-+ ChnlAccessSetting->CWmaxIndex = 10;
-+ break;
-+
-+ case WIRELESS_MODE_B:
-+ ChnlAccessSetting->SIFS_Timer = 0x22;
-+ ChnlAccessSetting->DIFS_Timer = 50; // 50 = 10 + 2*20. 2006.06.07, by rcnjko.
-+ ChnlAccessSetting->SlotTimeTimer = 20;
-+ ChnlAccessSetting->EIFS_Timer = 91;
-+ ChnlAccessSetting->CWminIndex = 5;
-+ ChnlAccessSetting->CWmaxIndex = 10;
-+ break;
-+
-+ case WIRELESS_MODE_G:
-+ //
-+ // <RJ_TODO_8185B>
-+ // TODO: We still don't know how to set up these registers, just follow WMAC to
-+ // verify 8185B FPAG.
-+ //
-+ // <RJ_TODO_8185B>
-+ // Jong said CWmin/CWmax register are not functional in 8185B,
-+ // so we shall fill channel access realted register into AC parameter registers,
-+ // even in nQBss.
-+ //
-+ ChnlAccessSetting->SIFS_Timer = 0x22; // Suggested by Jong, 2005.12.08.
-+ ChnlAccessSetting->SlotTimeTimer = 9; // 2006.06.07, by rcnjko.
-+ ChnlAccessSetting->DIFS_Timer = 28; // 28 = 10 + 2*9. 2006.06.07, by rcnjko.
-+ ChnlAccessSetting->EIFS_Timer = 0x5B; // Suggested by wcchu, it is the default value of EIFS register, 2005.12.08.
-+#ifdef TODO
-+ switch (Adapter->NdisUsbDev.CWinMaxMin)
-+#else
-+ switch (2)
-+#endif
-+ {
-+ case 0:// 0: [max:7 min:1 ]
-+ ChnlAccessSetting->CWminIndex = 1;
-+ ChnlAccessSetting->CWmaxIndex = 7;
-+ break;
-+ case 1:// 1: [max:7 min:2 ]
-+ ChnlAccessSetting->CWminIndex = 2;
-+ ChnlAccessSetting->CWmaxIndex = 7;
-+ break;
-+ case 2:// 2: [max:7 min:3 ]
-+ ChnlAccessSetting->CWminIndex = 3;
-+ ChnlAccessSetting->CWmaxIndex = 7;
-+ break;
-+ case 3:// 3: [max:9 min:1 ]
-+ ChnlAccessSetting->CWminIndex = 1;
-+ ChnlAccessSetting->CWmaxIndex = 9;
-+ break;
-+ case 4:// 4: [max:9 min:2 ]
-+ ChnlAccessSetting->CWminIndex = 2;
-+ ChnlAccessSetting->CWmaxIndex = 9;
-+ break;
-+ case 5:// 5: [max:9 min:3 ]
-+ ChnlAccessSetting->CWminIndex = 3;
-+ ChnlAccessSetting->CWmaxIndex = 9;
-+ break;
-+ case 6:// 6: [max:A min:5 ]
-+ ChnlAccessSetting->CWminIndex = 5;
-+ ChnlAccessSetting->CWmaxIndex = 10;
-+ break;
-+ case 7:// 7: [max:A min:4 ]
-+ ChnlAccessSetting->CWminIndex = 4;
-+ ChnlAccessSetting->CWmaxIndex = 10;
-+ break;
-+
-+ default:
-+ ChnlAccessSetting->CWminIndex = 1;
-+ ChnlAccessSetting->CWmaxIndex = 7;
-+ break;
-+ }
-+#ifdef TODO
-+ if( Adapter->MgntInfo.OpMode == RT_OP_MODE_IBSS)
-+ {
-+ ChnlAccessSetting->CWminIndex= 4;
-+ ChnlAccessSetting->CWmaxIndex= 10;
-+ }
-+#endif
-+ break;
-+ }
-+
-+
-+ write_nic_byte(dev, SIFS, ChnlAccessSetting->SIFS_Timer);
-+//{ update slot time related by david, 2006-7-21
-+ write_nic_byte(dev, SLOT, ChnlAccessSetting->SlotTimeTimer); // Rewrited from directly use PlatformEFIOWrite1Byte(), by Annie, 2006-03-29.
-+#ifdef TODO
-+ if(pStaQos->CurrentQosMode > QOS_DISABLE)
-+ {
-+ for(eACI = 0; eACI < AC_MAX; eACI++)
-+ {
-+ Adapter->HalFunc.SetHwRegHandler(Adapter, HW_VAR_AC_PARAM, \
-+ (pu1Byte)(&(pStaQos->WMMParamEle.AcParam[eACI])) );
-+ }
-+ }
-+ else
-+#endif
-+ {
-+ u8 u1bAIFS = aSifsTime + (2 * ChnlAccessSetting->SlotTimeTimer );
-+
-+ write_nic_byte(dev, AC_VO_PARAM, u1bAIFS);
-+ write_nic_byte(dev, AC_VI_PARAM, u1bAIFS);
-+ write_nic_byte(dev, AC_BE_PARAM, u1bAIFS);
-+ write_nic_byte(dev, AC_BK_PARAM, u1bAIFS);
-+ }
-+//}
-+
-+ write_nic_byte(dev, EIFS_8187B, ChnlAccessSetting->EIFS_Timer);
-+ write_nic_byte(dev, AckTimeOutReg, 0x5B); // <RJ_EXPR_QOS> Suggested by wcchu, it is the default value of EIFS register, 2005.12.08.
-+#ifdef TODO
-+ // <RJ_TODO_NOW_8185B> Update ECWmin/ECWmax, AIFS, TXOP Limit of each AC to the value defined by SPEC.
-+ if( pStaQos->CurrentQosMode > QOS_DISABLE )
-+ { // QoS mode.
-+ if(pStaQos->QBssWirelessMode == WirelessMode)
-+ {
-+ // Follow AC Parameters of the QBSS.
-+ for(eACI = 0; eACI < AC_MAX; eACI++)
-+ {
-+ Adapter->HalFunc.SetHwRegHandler(Adapter, HW_VAR_AC_PARAM, (pu1Byte)(&(pStaQos->WMMParamEle.AcParam[eACI])) );
-+ }
-+ }
-+ else
-+ {
-+ // Follow Default WMM AC Parameters.
-+ bFollowLegacySetting = TRUE;
-+ }
-+ }
-+ else
-+ { // Legacy 802.11.
-+ bFollowLegacySetting = TRUE;
-+ }
-+
-+ if(bFollowLegacySetting)
-+#endif
-+ if(true)
-+ {
-+ //
-+ // Follow 802.11 seeting to AC parameter, all AC shall use the same parameter.
-+ // 2005.12.01, by rcnjko.
-+ //
-+ AcParam.longData = 0;
-+ AcParam.f.AciAifsn.f.AIFSN = 2; // Follow 802.11 DIFS.
-+ AcParam.f.AciAifsn.f.ACM = 0;
-+ AcParam.f.Ecw.f.ECWmin = ChnlAccessSetting->CWminIndex; // Follow 802.11 CWmin.
-+ AcParam.f.Ecw.f.ECWmax = ChnlAccessSetting->CWmaxIndex; // Follow 802.11 CWmax.
-+ AcParam.f.TXOPLimit = 0;
-+ for(eACI = 0; eACI < AC_MAX; eACI++)
-+ {
-+ AcParam.f.AciAifsn.f.ACI = (u8)eACI;
-+ {
-+ PAC_PARAM pAcParam = (PAC_PARAM)(&AcParam);
-+ AC_CODING eACI;
-+ u8 u1bAIFS;
-+ u32 u4bAcParam;
-+
-+ // Retrive paramters to udpate.
-+ eACI = pAcParam->f.AciAifsn.f.ACI;
-+ u1bAIFS = pAcParam->f.AciAifsn.f.AIFSN * ChnlAccessSetting->SlotTimeTimer + aSifsTime;
-+ u4bAcParam = ( (((u32)(pAcParam->f.TXOPLimit)) << AC_PARAM_TXOP_LIMIT_OFFSET) |
-+ (((u32)(pAcParam->f.Ecw.f.ECWmax)) << AC_PARAM_ECW_MAX_OFFSET) |
-+ (((u32)(pAcParam->f.Ecw.f.ECWmin)) << AC_PARAM_ECW_MIN_OFFSET) |
-+ (((u32)u1bAIFS) << AC_PARAM_AIFS_OFFSET));
-+
-+ switch(eACI)
-+ {
-+ case AC1_BK:
-+ write_nic_dword(dev, AC_BK_PARAM, u4bAcParam);
-+ break;
-+
-+ case AC0_BE:
-+ write_nic_dword(dev, AC_BE_PARAM, u4bAcParam);
-+ break;
-+
-+ case AC2_VI:
-+ write_nic_dword(dev, AC_VI_PARAM, u4bAcParam);
-+ break;
-+
-+ case AC3_VO:
-+ write_nic_dword(dev, AC_VO_PARAM, u4bAcParam);
-+ break;
-+
-+ default:
-+ printk(KERN_WARNING "SetHwReg8185(): invalid ACI: %d !\n", eACI);
-+ break;
-+ }
-+
-+ // Cehck ACM bit.
-+ // If it is set, immediately set ACM control bit to downgrading AC for passing WMM testplan. Annie, 2005-12-13.
-+ //write_nic_byte(dev, ACM_CONTROL, pAcParam->f.AciAifsn);
-+ {
-+ PACI_AIFSN pAciAifsn = (PACI_AIFSN)(&pAcParam->f.AciAifsn);
-+ AC_CODING eACI = pAciAifsn->f.ACI;
-+
-+ //modified Joseph
-+ //for 8187B AsynIORead issue
-+#ifdef TODO
-+ u8 AcmCtrl = pHalData->AcmControl;
-+#else
-+ u8 AcmCtrl = 0;
-+#endif
-+ if( pAciAifsn->f.ACM )
-+ { // ACM bit is 1.
-+ switch(eACI)
-+ {
-+ case AC0_BE:
-+ AcmCtrl |= (BEQ_ACM_EN|BEQ_ACM_CTL|ACM_HW_EN); // or 0x21
-+ break;
-+
-+ case AC2_VI:
-+ AcmCtrl |= (VIQ_ACM_EN|VIQ_ACM_CTL|ACM_HW_EN); // or 0x42
-+ break;
-+
-+ case AC3_VO:
-+ AcmCtrl |= (VOQ_ACM_EN|VOQ_ACM_CTL|ACM_HW_EN); // or 0x84
-+ break;
-+
-+ default:
-+ printk(KERN_WARNING "SetHwReg8185(): [HW_VAR_ACM_CTRL] ACM set\
-+ failed: eACI is %d\n", eACI );
-+ break;
-+ }
-+ }
-+ else
-+ { // ACM bit is 0.
-+ switch(eACI)
-+ {
-+ case AC0_BE:
-+ AcmCtrl &= ( (~BEQ_ACM_EN) & (~BEQ_ACM_CTL) & (~ACM_HW_EN) ); // and 0xDE
-+ break;
-+
-+ case AC2_VI:
-+ AcmCtrl &= ( (~VIQ_ACM_EN) & (~VIQ_ACM_CTL) & (~ACM_HW_EN) ); // and 0xBD
-+ break;
-+
-+ case AC3_VO:
-+ AcmCtrl &= ( (~VOQ_ACM_EN) & (~VOQ_ACM_CTL) & (~ACM_HW_EN) ); // and 0x7B
-+ break;
-+
-+ default:
-+ break;
-+ }
-+ }
-+
-+ //printk(KERN_WARNING "SetHwReg8185(): [HW_VAR_ACM_CTRL] Write 0x%X\n", AcmCtrl);
-+
-+#ifdef TO_DO
-+ pHalData->AcmControl = AcmCtrl;
-+#endif
-+ write_nic_byte(dev, ACM_CONTROL, AcmCtrl);
-+ }
-+ }
-+ }
-+ }
-+}
-+
-+void ActSetWirelessMode8187(struct net_device* dev, u8 btWirelessMode)
-+{
-+ struct r8180_priv *priv = ieee80211_priv(dev);
-+ struct ieee80211_device *ieee = priv->ieee80211;
-+ //PMGNT_INFO pMgntInfo = &(pAdapter->MgntInfo);
-+ u8 btSupportedWirelessMode = GetSupportedWirelessMode8187(dev);
-+
-+ if( (btWirelessMode & btSupportedWirelessMode) == 0 )
-+ { // Don't switch to unsupported wireless mode, 2006.02.15, by rcnjko.
-+ printk(KERN_WARNING "ActSetWirelessMode8187(): WirelessMode(%d) is not supported (%d)!\n",
-+ btWirelessMode, btSupportedWirelessMode);
-+ return;
-+ }
-+
-+ // 1. Assign wireless mode to swtich if necessary.
-+ if( (btWirelessMode == WIRELESS_MODE_AUTO) ||
-+ (btWirelessMode & btSupportedWirelessMode) == 0 )
-+ {
-+ if((btSupportedWirelessMode & WIRELESS_MODE_A))
-+ {
-+ btWirelessMode = WIRELESS_MODE_A;
-+ }
-+ else if((btSupportedWirelessMode & WIRELESS_MODE_G))
-+ {
-+ btWirelessMode = WIRELESS_MODE_G;
-+ }
-+ else if((btSupportedWirelessMode & WIRELESS_MODE_B))
-+ {
-+ btWirelessMode = WIRELESS_MODE_B;
-+ }
-+ else
-+ {
-+ printk(KERN_WARNING "MptActSetWirelessMode8187(): No valid wireless mode supported, \
-+ btSupportedWirelessMode(%x)!!!\n", btSupportedWirelessMode);
-+ btWirelessMode = WIRELESS_MODE_B;
-+ }
-+ }
-+
-+ // 2. Swtich band.
-+ switch(priv->rf_chip)
-+ {
-+ case RF_ZEBRA:
-+ case RF_ZEBRA2:
-+ {
-+ // Update current wireless mode if we swtich to specified band successfully.
-+ ieee->mode = (WIRELESS_MODE)btWirelessMode;
-+ }
-+ break;
-+
-+ default:
-+ printk(KERN_WARNING "MptActSetWirelessMode8187(): unsupported RF: 0x%X !!!\n", priv->rf_chip);
-+ break;
-+ }
-+
-+ // 4. Change related setting.
-+ if( ieee->mode == WIRELESS_MODE_A ){
-+ DMESG("WIRELESS_MODE_A");
-+ }
-+ else if(ieee->mode == WIRELESS_MODE_B ){
-+ DMESG("WIRELESS_MODE_B");
-+ }
-+ else if( ieee->mode == WIRELESS_MODE_G ){
-+ DMESG("WIRELESS_MODE_G");
-+ }
-+ ActUpdateChannelAccessSetting(dev, ieee->mode, &priv->ChannelAccessSetting );
-+//by amy 0305
-+#ifdef TODO
-+ if(ieee->mode == WIRELESS_MODE_B && priv->InitialGain > pHalData->RegBModeGainStage)
-+ {
-+ pHalData->InitialGain = pHalData->RegBModeGainStage; // B mode, OFDM[0x17] = 26.
-+ RT_TRACE(COMP_INIT | COMP_DIG, DBG_LOUD, ("ActSetWirelessMode8187(): update init_gain to index %d for B mode\n",pHalData->InitialGain));
-+ PlatformScheduleWorkItem( &(pHalData->UpdateDigWorkItem) );
-+ }
-+// pAdapter->MgntInfo.dot11CurrentWirelessMode = pHalData->CurrentWirelessMode;
-+// MgntSetRegdot11OperationalRateSet( pAdapter );
-+#endif
-+//by amy 0305
-+}
-+
-+
-+void
-+InitializeExtraRegsOn8185(struct net_device *dev)
-+{
-+ struct r8180_priv *priv = ieee80211_priv(dev);
-+ struct ieee80211_device *ieee = priv->ieee80211;
-+ //RTL8185_TODO: Determine Retrylimit, TxAGC, AutoRateFallback control.
-+ bool bUNIVERSAL_CONTROL_RL = false; // Enable per-packet tx retry, 2005.03.31, by rcnjko.
-+ bool bUNIVERSAL_CONTROL_AGC = true;//false;
-+ bool bUNIVERSAL_CONTROL_ANT = true;//false;
-+ bool bAUTO_RATE_FALLBACK_CTL = true;
-+ u8 val8;
-+
-+ // Set up ACK rate.
-+ // Suggested by wcchu, 2005.08.25, by rcnjko.
-+ // 1. Initialize (MinRR, MaxRR) to (6,24) for A/G.
-+ // 2. MUST Set RR before BRSR.
-+ // 3. CCK must be basic rate.
-+ if((ieee->mode == IEEE_G)||(ieee->mode == IEEE_A))
-+ {
-+ write_nic_word(dev, BRSR_8187B, 0x0fff);
-+ }
-+ else
-+ {
-+ write_nic_word(dev, BRSR_8187B, 0x000f);
-+ }
-+
-+
-+ // Retry limit
-+ val8 = read_nic_byte(dev, CW_CONF);
-+ if(bUNIVERSAL_CONTROL_RL)
-+ {
-+ val8 &= (~CW_CONF_PERPACKET_RETRY_LIMIT);
-+ }
-+ else
-+ {
-+ val8 |= CW_CONF_PERPACKET_RETRY_LIMIT;
-+ }
-+
-+ write_nic_byte(dev, CW_CONF, val8);
-+
-+ // Tx AGC
-+ val8 = read_nic_byte(dev, TX_AGC_CTL);
-+ if(bUNIVERSAL_CONTROL_AGC)
-+ {
-+ val8 &= (~TX_AGC_CTL_PER_PACKET_TXAGC);
-+ write_nic_byte(dev, CCK_TXAGC, 128);
-+ write_nic_byte(dev, OFDM_TXAGC, 128);
-+ }
-+ else
-+ {
-+ val8 |= TX_AGC_CTL_PER_PACKET_TXAGC;
-+ }
-+ write_nic_byte(dev, TX_AGC_CTL, val8);
-+
-+ // Tx Antenna including Feedback control
-+ val8 = read_nic_byte(dev, TX_AGC_CTL);
-+
-+ if(bUNIVERSAL_CONTROL_ANT)
-+ {
-+ write_nic_byte(dev, ANTSEL, 0x00);
-+ val8 &= (~TXAGC_CTL_PER_PACKET_ANT_SEL);
-+ }
-+ else
-+ {
-+ val8 |= TXAGC_CTL_PER_PACKET_ANT_SEL;
-+ }
-+ write_nic_byte(dev, TX_AGC_CTL, val8);
-+
-+ // Auto Rate fallback control
-+ val8 = read_nic_byte(dev, RATE_FALLBACK);
-+ if( bAUTO_RATE_FALLBACK_CTL )
-+ {
-+ val8 |= RATE_FALLBACK_CTL_ENABLE | RATE_FALLBACK_CTL_AUTO_STEP0;
-+
-+ // <RJ_TODO_8187B> We shall set up the ARFR according to user's setting.
-+ write_nic_word(dev, ARFR, 0x0fff); // set 1M ~ 54M
-+ }
-+ else
-+ {
-+ val8 &= (~RATE_FALLBACK_CTL_ENABLE);
-+ }
-+ write_nic_byte(dev, RATE_FALLBACK, val8);
-+
-+}
-+///////////////////////////
-+void rtl8225z2_rf_init(struct net_device *dev)
-+{
-+
-+ struct r8180_priv *priv = ieee80211_priv(dev);
-+ if (NIC_8187B == priv->card_8187){
-+ struct ieee80211_device *ieee = priv->ieee80211;
-+ u8 InitWirelessMode;
-+ u8 SupportedWirelessMode;
-+ bool bInvalidWirelessMode = false;
-+ InitializeExtraRegsOn8185(dev);
-+
-+ write_nic_byte(dev, MSR, read_nic_byte(dev,MSR) & 0xf3); // default network type to 'No Link'
-+ //{to avoid tx stall
-+ write_nic_byte(dev, MSR, read_nic_byte(dev, MSR)|MSR_LINK_ENEDCA);//should always set ENDCA bit
-+ write_nic_byte(dev, ACM_CONTROL, priv->AcmControl);
-+
-+ write_nic_word(dev, BcnIntv, 100);
-+ write_nic_word(dev, AtimWnd, 2);
-+ write_nic_word(dev, FEMR, 0xFFFF);
-+ //LED TYPE
-+ {
-+ write_nic_byte(dev, CONFIG1,((read_nic_byte(dev, CONFIG1)&0x3f)|0x80)); //turn on bit 5:Clkrun_mode
-+ }
-+ write_nic_byte(dev, CR9346, 0x0); // disable config register write
-+
-+ //{ add some info here
-+ write_nic_dword(dev, MAC0, ((u32*)dev->dev_addr)[0]);
-+ write_nic_word(dev, MAC4, ((u32*)dev->dev_addr)[1] & 0xffff );
-+
-+ write_nic_byte(dev, WPA_CONFIG, 0);
-+ //}
-+
-+ MacConfig_87BASIC(dev);
-+
-+ // Override the RFSW_CTRL (MAC offset 0x272-0x273), 2006.06.07, by rcnjko.
-+ write_nic_word(dev, RFSW_CTRL, 0x569a);
-+#ifdef JOHN_TKIP
-+ {
-+ void CamResetAllEntry(struct net_device *dev);
-+ void EnableHWSecurityConfig8187(struct net_device *dev);
-+ CamResetAllEntry(dev);
-+ EnableHWSecurityConfig8187(dev);
-+ write_nic_word(dev, AESMSK_FC, AESMSK_FC_DEFAULT); mdelay(1);
-+ write_nic_word(dev, AESMSK_SC, AESMSK_SC_DEFAULT); mdelay(1);
-+ write_nic_word(dev, AESMSK_QC, AESMSK_QC_DEFAULT); mdelay(1);
-+ }
-+#endif
-+ //-----------------------------------------------------------------------------
-+ // Set up PHY related.
-+ //-----------------------------------------------------------------------------
-+ // Enable Config3.PARAM_En to revise AnaaParm.
-+ write_nic_byte(dev, CR9346, 0xC0);
-+ write_nic_byte(dev, CONFIG3, read_nic_byte(dev,CONFIG3)|CONFIG3_PARM_En);
-+ write_nic_byte(dev, CR9346, 0x0);
-+
-+ // Initialize RFE and read Zebra2 version code. Added by Annie, 2005-08-01.
-+ SetupRFEInitialTiming(dev);
-+ // PHY config.
-+ PhyConfig8187(dev);
-+
-+ // We assume RegWirelessMode has already been initialized before,
-+ // however, we has to validate the wireless mode here and provide a reasonble
-+ // initialized value if necessary. 2005.01.13, by rcnjko.
-+ SupportedWirelessMode = GetSupportedWirelessMode8187(dev);
-+
-+ if((ieee->mode != WIRELESS_MODE_B) &&
-+ (ieee->mode != WIRELESS_MODE_G) &&
-+ (ieee->mode != WIRELESS_MODE_A) &&
-+ (ieee->mode != WIRELESS_MODE_AUTO))
-+ { // It should be one of B, G, A, or AUTO.
-+ bInvalidWirelessMode = true;
-+ }
-+ else
-+ { // One of B, G, A, or AUTO.
-+ // Check if the wireless mode is supported by RF.
-+ if( (ieee->mode != WIRELESS_MODE_AUTO) &&
-+ (ieee->mode & SupportedWirelessMode) == 0 )
-+ {
-+ bInvalidWirelessMode = true;
-+ }
-+ }
-+
-+ if(bInvalidWirelessMode || ieee->mode==WIRELESS_MODE_AUTO)
-+ { // Auto or other invalid value.
-+ // Assigne a wireless mode to initialize.
-+ if((SupportedWirelessMode & WIRELESS_MODE_A))
-+ {
-+ InitWirelessMode = WIRELESS_MODE_A;
-+ }
-+ else if((SupportedWirelessMode & WIRELESS_MODE_G))
-+ {
-+
-+ InitWirelessMode = WIRELESS_MODE_G;
-+ }
-+ else if((SupportedWirelessMode & WIRELESS_MODE_B))
-+ {
-+
-+ InitWirelessMode = WIRELESS_MODE_B;
-+ }
-+ else
-+ {
-+ printk(KERN_WARNING
-+ "InitializeAdapter8187(): No valid wireless mode supported, SupportedWirelessMode(%x)!!!\n",
-+ SupportedWirelessMode);
-+ InitWirelessMode = WIRELESS_MODE_B;
-+ }
-+
-+ // Initialize RegWirelessMode if it is not a valid one.
-+ if(bInvalidWirelessMode)
-+ {
-+ ieee->mode = (WIRELESS_MODE)InitWirelessMode;
-+ }
-+ }
-+ else
-+ { // One of B, G, A.
-+ InitWirelessMode = ieee->mode;
-+ }
-+ ActSetWirelessMode8187(dev, (u8)(InitWirelessMode));
-+ {//added for init gain
-+ write_phy_ofdm(dev, 0x97, 0x46); mdelay(1);
-+ write_phy_ofdm(dev, 0xa4, 0xb6); mdelay(1);
-+ write_phy_ofdm(dev, 0x85, 0xfc); mdelay(1);
-+ write_phy_cck(dev, 0xc1, 0x88); mdelay(1);
-+ }
-+
-+ }
-+ else{
-+ int i;
-+ short channel = 1;
-+ u16 brsr;
-+ u32 data,addr;
-+
-+ priv->chan = channel;
-+
-+ rtl8180_set_anaparam(dev, RTL8225_ANAPARAM_ON);
-+
-+ if(priv->card_type == USB)
-+ rtl8225_host_usb_init(dev);
-+ else
-+ rtl8225_host_pci_init(dev);
-+
-+ write_nic_dword(dev, RF_TIMING, 0x000a8008);
-+
-+ brsr = read_nic_word(dev, BRSR_8187);
-+
-+ write_nic_word(dev, BRSR_8187, 0xffff);
-+
-+
-+ write_nic_dword(dev, RF_PARA, 0x100044);
-+
-+ #if 1 //0->1
-+ rtl8180_set_mode(dev, EPROM_CMD_CONFIG);
-+ write_nic_byte(dev, CONFIG3, 0x44);
-+ rtl8180_set_mode(dev, EPROM_CMD_NORMAL);
-+ #endif
-+
-+
-+ rtl8185_rf_pins_enable(dev);
-+
-+ // mdelay(1000);
-+
-+ write_rtl8225(dev, 0x0, 0x2bf); mdelay(1);
-+
-+
-+ write_rtl8225(dev, 0x1, 0xee0); mdelay(1);
-+
-+ write_rtl8225(dev, 0x2, 0x44d); mdelay(1);
-+
-+ write_rtl8225(dev, 0x3, 0x441); mdelay(1);
-+
-+
-+ write_rtl8225(dev, 0x4, 0x8c3);mdelay(1);
-+
-+
-+
-+ write_rtl8225(dev, 0x5, 0xc72);mdelay(1);
-+ // }
-+
-+ write_rtl8225(dev, 0x6, 0xe6); mdelay(1);
-+
-+ write_rtl8225(dev, 0x7, ((priv->card_type == USB)? 0x82a : rtl8225_chan[channel])); mdelay(1);
-+
-+ write_rtl8225(dev, 0x8, 0x3f); mdelay(1);
-+
-+ write_rtl8225(dev, 0x9, 0x335); mdelay(1);
-+
-+ write_rtl8225(dev, 0xa, 0x9d4); mdelay(1);
-+
-+ write_rtl8225(dev, 0xb, 0x7bb); mdelay(1);
-+
-+ write_rtl8225(dev, 0xc, 0x850); mdelay(1);
-+
-+
-+ write_rtl8225(dev, 0xd, 0xcdf); mdelay(1);
-+
-+ write_rtl8225(dev, 0xe, 0x2b); mdelay(1);
-+
-+ write_rtl8225(dev, 0xf, 0x114);
-+
-+
-+ mdelay(100);
-+
-+
-+ //if(priv->card_type != USB) /* maybe not needed even for 8185 */
-+ // write_rtl8225(dev, 0x7, rtl8225_chan[channel]);
-+
-+ write_rtl8225(dev, 0x0, 0x1b7);
-+
-+ for(i=0;i<95;i++){
-+ write_rtl8225(dev, 0x1, (u8)(i+1));
-+ /* version B & C & D*/
-+ write_rtl8225(dev, 0x2, rtl8225z2_rxgain[i]);
-+ }
-+ //write_rtl8225(dev, 0x3, 0x80);
-+ write_rtl8225(dev, 0x3, 0x2);
-+ write_rtl8225(dev, 0x5, 0x4);
-+
-+ write_rtl8225(dev, 0x0, 0xb7);
-+
-+ write_rtl8225(dev, 0x2, 0xc4d);
-+
-+ if(priv->card_type == USB){
-+ // force_pci_posting(dev);
-+ mdelay(200);
-+
-+ write_rtl8225(dev, 0x2, 0x44d);
-+
-+ // force_pci_posting(dev);
-+ mdelay(200);
-+
-+ }//End of if(priv->card_type == USB)
-+ /* FIXME!! rtl8187 we have to check if calibrarion
-+ * is successful and eventually cal. again (repeat
-+ * the two write on reg 2)
-+ */
-+ // Check for calibration status, 2005.11.17,
-+ data = read_rtl8225(dev, 6);
-+ if (!(data&0x00000080))
-+ {
-+ write_rtl8225(dev, 0x02, 0x0c4d);
-+ force_pci_posting(dev); mdelay(200);
-+ write_rtl8225(dev, 0x02, 0x044d);
-+ force_pci_posting(dev); mdelay(100);
-+ data = read_rtl8225(dev, 6);
-+ if (!(data&0x00000080))
-+ {
-+ DMESGW("RF Calibration Failed!!!!\n");
-+ }
-+ }
-+ //force_pci_posting(dev);
-+
-+ mdelay(200); //200 for 8187
-+
-+
-+ // //if(priv->card_type != USB){
-+ // write_rtl8225(dev, 0x2, 0x44d);
-+ // write_rtl8225(dev, 0x7, rtl8225_chan[channel]);
-+ // write_rtl8225(dev, 0x2, 0x47d);
-+ //
-+ // force_pci_posting(dev);
-+ // mdelay(100);
-+ //
-+ // write_rtl8225(dev, 0x2, 0x44d);
-+ // //}
-+
-+ write_rtl8225(dev, 0x0, 0x2bf);
-+
-+ if(priv->card_type != USB)
-+ rtl8185_rf_pins_enable(dev);
-+ //set up ZEBRA AGC table, 2005.11.17,
-+ for(i=0;i<128;i++){
-+ data = rtl8225_agc[i];
-+
-+ addr = i + 0x80; //enable writing AGC table
-+ write_phy_ofdm(dev, 0xb, data);
-+
-+ mdelay(1);
-+ write_phy_ofdm(dev, 0xa, addr);
-+
-+ mdelay(1);
-+ }
-+
-+ force_pci_posting(dev);
-+ mdelay(1);
-+
-+ write_phy_ofdm(dev, 0x0, 0x1); mdelay(1);
-+ write_phy_ofdm(dev, 0x1, 0x2); mdelay(1);
-+ write_phy_ofdm(dev, 0x2, ((priv->card_type == USB)? 0x42 : 0x62)); mdelay(1);
-+ write_phy_ofdm(dev, 0x3, 0x0); mdelay(1);
-+ write_phy_ofdm(dev, 0x4, 0x0); mdelay(1);
-+ write_phy_ofdm(dev, 0x5, 0x0); mdelay(1);
-+ write_phy_ofdm(dev, 0x6, 0x40); mdelay(1);
-+ write_phy_ofdm(dev, 0x7, 0x0); mdelay(1);
-+ write_phy_ofdm(dev, 0x8, 0x40); mdelay(1);
-+ write_phy_ofdm(dev, 0x9, 0xfe); mdelay(1);
-+
-+ write_phy_ofdm(dev, 0xa, 0x8); mdelay(1);
-+
-+ //write_phy_ofdm(dev, 0x18, 0xef);
-+ // }
-+ //}
-+ write_phy_ofdm(dev, 0xb, 0x80); mdelay(1);
-+
-+ write_phy_ofdm(dev, 0xc, 0x1);mdelay(1);
-+
-+
-+ //if(priv->card_type != USB)
-+ write_phy_ofdm(dev, 0xd, 0x43);
-+
-+ write_phy_ofdm(dev, 0xe, 0xd3);mdelay(1);
-+
-+ write_phy_ofdm(dev, 0xf, 0x38);mdelay(1);
-+ /*ver D & 8187*/
-+ // }
-+
-+ // if(priv->card_8185 == 1 && priv->card_8185_Bversion)
-+ // write_phy_ofdm(dev, 0x10, 0x04);/*ver B*/
-+ // else
-+ write_phy_ofdm(dev, 0x10, 0x84);mdelay(1);
-+ /*ver C & D & 8187*/
-+
-+ write_phy_ofdm(dev, 0x11, 0x07);mdelay(1);
-+ /*agc resp time 700*/
-+
-+
-+ // if(priv->card_8185 == 2){
-+ /* Ver D & 8187*/
-+ write_phy_ofdm(dev, 0x12, 0x20);mdelay(1);
-+
-+ write_phy_ofdm(dev, 0x13, 0x20);mdelay(1);
-+
-+ write_phy_ofdm(dev, 0x14, 0x0); mdelay(1);
-+ write_phy_ofdm(dev, 0x15, 0x40); mdelay(1);
-+ write_phy_ofdm(dev, 0x16, 0x0); mdelay(1);
-+ write_phy_ofdm(dev, 0x17, 0x40); mdelay(1);
-+
-+ // if (priv->card_type == USB)
-+ // write_phy_ofdm(dev, 0x18, 0xef);
-+
-+ write_phy_ofdm(dev, 0x18, 0xef);mdelay(1);
-+
-+
-+ write_phy_ofdm(dev, 0x19, 0x19); mdelay(1);
-+ write_phy_ofdm(dev, 0x1a, 0x20); mdelay(1);
-+ write_phy_ofdm(dev, 0x1b, 0x15);mdelay(1);
-+
-+ write_phy_ofdm(dev, 0x1c, 0x4);mdelay(1);
-+
-+ write_phy_ofdm(dev, 0x1d, 0xc5);mdelay(1); //2005.11.17,
-+
-+ write_phy_ofdm(dev, 0x1e, 0x95);mdelay(1);
-+
-+ write_phy_ofdm(dev, 0x1f, 0x75); mdelay(1);
-+
-+ // }
-+
-+ write_phy_ofdm(dev, 0x20, 0x1f);mdelay(1);
-+
-+ write_phy_ofdm(dev, 0x21, 0x17);mdelay(1);
-+
-+ write_phy_ofdm(dev, 0x22, 0x16);mdelay(1);
-+
-+ // if(priv->card_type != USB)
-+ write_phy_ofdm(dev, 0x23, 0x80);mdelay(1); //FIXME maybe not needed // <>
-+
-+ write_phy_ofdm(dev, 0x24, 0x46); mdelay(1);
-+ write_phy_ofdm(dev, 0x25, 0x00); mdelay(1);
-+ write_phy_ofdm(dev, 0x26, 0x90); mdelay(1);
-+
-+ write_phy_ofdm(dev, 0x27, 0x88); mdelay(1);
-+
-+
-+ // <> Set init. gain to m74dBm.
-+
-+ rtl8225z2_set_gain(dev,4);
-+ //rtl8225z2_set_gain(dev,2);
-+
-+ write_phy_cck(dev, 0x0, 0x98); mdelay(1);
-+ write_phy_cck(dev, 0x3, 0x20); mdelay(1);
-+ write_phy_cck(dev, 0x4, 0x7e); mdelay(1);
-+ write_phy_cck(dev, 0x5, 0x12); mdelay(1);
-+ write_phy_cck(dev, 0x6, 0xfc); mdelay(1);
-+ write_phy_cck(dev, 0x7, 0x78);mdelay(1);
-+ /* Ver C & D & 8187*/
-+ write_phy_cck(dev, 0x8, 0x2e);mdelay(1);
-+
-+ write_phy_cck(dev, 0x9, 0x11);mdelay(1);
-+ write_phy_cck(dev, 0xa, 0x17);mdelay(1);
-+ write_phy_cck(dev, 0xb, 0x11);mdelay(1);
-+
-+ write_phy_cck(dev, 0x10, ((priv->card_type == USB) ? 0x9b: 0x93)); mdelay(1);
-+ write_phy_cck(dev, 0x11, 0x88); mdelay(1);
-+ write_phy_cck(dev, 0x12, 0x47); mdelay(1);
-+ write_phy_cck(dev, 0x13, 0xd0); /* Ver C & D & 8187*/
-+
-+ write_phy_cck(dev, 0x19, 0x0); mdelay(1);
-+ write_phy_cck(dev, 0x1a, 0xa0); mdelay(1);
-+ write_phy_cck(dev, 0x1b, 0x8); mdelay(1);
-+ write_phy_cck(dev, 0x1d, 0x0); mdelay(1);
-+
-+ write_phy_cck(dev, 0x40, 0x86); /* CCK Carrier Sense Threshold */ mdelay(1);
-+
-+ write_phy_cck(dev, 0x41, 0x9d);mdelay(1);
-+
-+
-+ write_phy_cck(dev, 0x42, 0x15); mdelay(1);
-+ write_phy_cck(dev, 0x43, 0x18); mdelay(1);
-+
-+
-+ write_phy_cck(dev, 0x44, 0x36); mdelay(1);
-+ write_phy_cck(dev, 0x45, 0x35); mdelay(1);
-+ write_phy_cck(dev, 0x46, 0x2e); mdelay(1);
-+ write_phy_cck(dev, 0x47, 0x25); mdelay(1);
-+ write_phy_cck(dev, 0x48, 0x1c); mdelay(1);
-+ write_phy_cck(dev, 0x49, 0x12); mdelay(1);
-+ write_phy_cck(dev, 0x4a, 0x09); mdelay(1);
-+ write_phy_cck(dev, 0x4b, 0x04); mdelay(1);
-+ write_phy_cck(dev, 0x4c, 0x5);mdelay(1);
-+
-+
-+ write_nic_byte(dev, 0x5b, 0x0d); mdelay(1);
-+
-+
-+
-+ // <>
-+ // // TESTR 0xb 8187
-+ // write_phy_cck(dev, 0x10, 0x93);// & 0xfb);
-+ //
-+ // //if(priv->card_type != USB){
-+ // write_phy_ofdm(dev, 0x2, 0x62);
-+ // write_phy_ofdm(dev, 0x6, 0x0);
-+ // write_phy_ofdm(dev, 0x8, 0x0);
-+ // //}
-+
-+ rtl8225z2_SetTXPowerLevel(dev, channel);
-+
-+ write_phy_cck(dev, 0x10, 0x9b); mdelay(1); /* Rx ant A, 0xdb for B */
-+ write_phy_ofdm(dev, 0x26, 0x90); mdelay(1); /* Rx ant A, 0x10 for B */
-+
-+ rtl8185_tx_antenna(dev, 0x3); /* TX ant A, 0x0 for B */
-+
-+ /* switch to high-speed 3-wire
-+ * last digit. 2 for both cck and ofdm
-+ */
-+ if(priv->card_type == USB)
-+ write_nic_dword(dev, 0x94, 0x3dc00002);
-+ else{
-+ write_nic_dword(dev, 0x94, 0x15c00002);
-+ rtl8185_rf_pins_enable(dev);
-+ }
-+
-+ // if(priv->card_type != USB)
-+ // rtl8225_set_gain(dev, 4); /* FIXME this '1' is random */ // <>
-+ // rtl8225_set_mode(dev, 1); /* FIXME start in B mode */ // <>
-+ //
-+ // /* make sure is waken up! */
-+ // write_rtl8225(dev,0x4, 0x9ff);
-+ // rtl8180_set_anaparam(dev, RTL8225_ANAPARAM_ON);
-+ // rtl8185_set_anaparam2(dev, RTL8225_ANAPARAM2_ON);
-+
-+ rtl8225_rf_set_chan(dev, priv->chan);
-+
-+ //write_nic_word(dev,BRSR,brsr);
-+
-+ //rtl8225z2_rf_set_mode(dev);
-+ }
-+}
-+
-+void rtl8225z2_rf_set_mode(struct net_device *dev)
-+{
-+ struct r8180_priv *priv = ieee80211_priv(dev);
-+
-+ if(priv->ieee80211->mode == IEEE_A)
-+ {
-+ write_rtl8225(dev, 0x5, 0x1865);
-+ write_nic_dword(dev, RF_PARA, 0x10084);
-+ write_nic_dword(dev, RF_TIMING, 0xa8008);
-+ write_phy_ofdm(dev, 0x0, 0x0);
-+ write_phy_ofdm(dev, 0xa, 0x6);
-+ write_phy_ofdm(dev, 0xb, 0x99);
-+ write_phy_ofdm(dev, 0xf, 0x20);
-+ write_phy_ofdm(dev, 0x11, 0x7);
-+
-+ rtl8225z2_set_gain(dev,4);
-+
-+ write_phy_ofdm(dev,0x15, 0x40);
-+ write_phy_ofdm(dev,0x17, 0x40);
-+
-+ write_nic_dword(dev, 0x94,0x10000000);
-+ }else{
-+
-+ write_rtl8225(dev, 0x5, 0x1864);
-+ write_nic_dword(dev, RF_PARA, 0x10044);
-+ write_nic_dword(dev, RF_TIMING, 0xa8008);
-+ write_phy_ofdm(dev, 0x0, 0x1);
-+ write_phy_ofdm(dev, 0xa, 0x6);
-+ write_phy_ofdm(dev, 0xb, 0x99);
-+ write_phy_ofdm(dev, 0xf, 0x20);
-+ write_phy_ofdm(dev, 0x11, 0x7);
-+
-+ rtl8225z2_set_gain(dev,4);
-+
-+ write_phy_ofdm(dev,0x15, 0x40);
-+ write_phy_ofdm(dev,0x17, 0x40);
-+
-+ write_nic_dword(dev, 0x94,0x04000002);
-+ }
-+}
-diff -Nur linux-2.6.30.5.orig/drivers/net/wireless/rtl8187b/r8180_wx.c linux-2.6.30.5/drivers/net/wireless/rtl8187b/r8180_wx.c
---- linux-2.6.30.5.orig/drivers/net/wireless/rtl8187b/r8180_wx.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.30.5/drivers/net/wireless/rtl8187b/r8180_wx.c 2009-08-23 19:01:04.000000000 +0200
-@@ -0,0 +1,2067 @@
-+/*
-+ This file contains wireless extension handlers.
-+
-+ This is part of rtl8180 OpenSource driver.
-+ Copyright (C) Andrea Merello 2004-2005 <andreamrl@tiscali.it>
-+ Released under the terms of GPL (General Public Licence)
-+
-+ Parts of this driver are based on the GPL part
-+ of the official realtek driver.
-+
-+ Parts of this driver are based on the rtl8180 driver skeleton
-+ from Patric Schenke & Andres Salomon.
-+
-+ Parts of this driver are based on the Intel Pro Wireless 2100 GPL driver.
-+
-+ We want to tanks the Authors of those projects and the Ndiswrapper
-+ project Authors.
-+*/
-+
-+
-+
-+#include "r8187.h"
-+#include "r8180_hw.h"
-+//added 1117
-+#include "ieee80211/ieee80211.h"
-+#ifdef ENABLE_DOT11D
-+#include "dot11d.h"
-+#endif
-+
-+
-+//#define RATE_COUNT 4
-+u32 rtl8180_rates[] = {1000000,2000000,5500000,11000000,
-+ 6000000,9000000,12000000,18000000,24000000,36000000,48000000,54000000};
-+#define RATE_COUNT sizeof(rtl8180_rates)/(sizeof(rtl8180_rates[0]))
-+
-+#ifdef _RTL8187_EXT_PATCH_
-+#define IW_MODE_MESH 11
-+static int r8180_wx_join_mesh(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra);
-+int r8180_wx_set_channel(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra);
-+static int r8180_wx_mesh_scan(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra);
-+static int r8180_wx_get_mesh_list(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra);
-+#endif
-+
-+static int r8180_wx_get_freq(struct net_device *dev,
-+ struct iw_request_info *a,
-+ union iwreq_data *wrqu, char *b)
-+{
-+ struct r8180_priv *priv = ieee80211_priv(dev);
-+
-+ return ieee80211_wx_get_freq(priv->ieee80211,a,wrqu,b);
-+}
-+
-+
-+#if 0
-+
-+static int r8180_wx_set_beaconinterval(struct net_device *dev, struct iw_request_info *aa,
-+ union iwreq_data *wrqu, char *b)
-+{
-+ int *parms = (int *)b;
-+ int bi = parms[0];
-+
-+ struct r8180_priv *priv = ieee80211_priv(dev);
-+ if(priv->ieee80211->bHwRadioOff)
-+ return 0;
-+ down(&priv->wx_sem);
-+ DMESG("setting beacon interval to %x",bi);
-+
-+ priv->ieee80211->beacon_interval=bi;
-+ rtl8180_commit(dev);
-+ up(&priv->wx_sem);
-+
-+ return 0;
-+}
-+
-+
-+static int r8180_wx_set_forceassociate(struct net_device *dev, struct iw_request_info *aa,
-+ union iwreq_data *wrqu, char *extra)
-+{
-+ struct r8180_priv *priv=ieee80211_priv(dev);
-+ int *parms = (int *)extra;
-+ if(priv->ieee80211->bHwRadioOff)
-+ return 0;
-+
-+ priv->ieee80211->force_associate = (parms[0] > 0);
-+
-+
-+ return 0;
-+}
-+
-+#endif
-+static int r8180_wx_get_mode(struct net_device *dev, struct iw_request_info *a,
-+ union iwreq_data *wrqu, char *b)
-+{
-+ struct r8180_priv *priv=ieee80211_priv(dev);
-+
-+ return ieee80211_wx_get_mode(priv->ieee80211,a,wrqu,b);
-+}
-+
-+
-+
-+static int r8180_wx_get_rate(struct net_device *dev,
-+ struct iw_request_info *info,
-+ union iwreq_data *wrqu, char *extra)
-+{
-+ struct r8180_priv *priv = ieee80211_priv(dev);
-+ return ieee80211_wx_get_rate(priv->ieee80211,info,wrqu,extra);
-+}
-+
-+
-+
-+static int r8180_wx_set_rate(struct net_device *dev,
-+ struct iw_request_info *info,
-+ union iwreq_data *wrqu, char *extra)
-+{
-+ int ret;
-+ struct r8180_priv *priv = ieee80211_priv(dev);
-+ if(priv->ieee80211->bHwRadioOff)
-+ return 0;
-+
-+ down(&priv->wx_sem);
-+
-+ ret = ieee80211_wx_set_rate(priv->ieee80211,info,wrqu,extra);
-+
-+ up(&priv->wx_sem);
-+
-+ return ret;
-+}
-+#ifdef JOHN_IOCTL
-+u16 read_rtl8225(struct net_device *dev, u8 addr);
-+void write_rtl8225(struct net_device *dev, u8 adr, u16 data);
-+u32 john_read_rtl8225(struct net_device *dev, u8 adr);
-+void _write_rtl8225(struct net_device *dev, u8 adr, u16 data);
-+
-+static int r8180_wx_read_regs(struct net_device *dev,
-+ struct iw_request_info *info,
-+ union iwreq_data *wrqu, char *extra)
-+{
-+ struct r8180_priv *priv = ieee80211_priv(dev);
-+ u8 addr = 0;
-+ u16 data1;
-+
-+ down(&priv->wx_sem);
-+
-+
-+ get_user(addr,(u8*)wrqu->data.pointer);
-+ data1 = read_rtl8225(dev, addr);
-+ wrqu->data.length = data1;
-+
-+ up(&priv->wx_sem);
-+ return 0;
-+
-+}
-+
-+static int r8180_wx_write_regs(struct net_device *dev,
-+ struct iw_request_info *info,
-+ union iwreq_data *wrqu, char *extra)
-+{
-+ struct r8180_priv *priv = ieee80211_priv(dev);
-+ u8 addr = 0;
-+
-+ down(&priv->wx_sem);
-+
-+ get_user(addr, (u8*)wrqu->data.pointer);
-+ write_rtl8225(dev, addr, wrqu->data.length);
-+
-+ up(&priv->wx_sem);
-+ return 0;
-+
-+}
-+
-+void rtl8187_write_phy(struct net_device *dev, u8 adr, u32 data);
-+u8 rtl8187_read_phy(struct net_device *dev,u8 adr, u32 data);
-+
-+static int r8180_wx_read_bb(struct net_device *dev,
-+ struct iw_request_info *info,
-+ union iwreq_data *wrqu, char *extra)
-+{
-+ struct r8180_priv *priv = ieee80211_priv(dev);
-+ u8 databb;
-+#if 0
-+ int i;
-+ for(i=0;i<12;i++) printk("%8x\n", read_cam(dev, i) );
-+#endif
-+
-+ down(&priv->wx_sem);
-+
-+ databb = rtl8187_read_phy(dev, (u8)wrqu->data.length, 0x00000000);
-+ wrqu->data.length = databb;
-+
-+ up(&priv->wx_sem);
-+ return 0;
-+}
-+
-+void rtl8187_write_phy(struct net_device *dev, u8 adr, u32 data);
-+static int r8180_wx_write_bb(struct net_device *dev,
-+ struct iw_request_info *info,
-+ union iwreq_data *wrqu, char *extra)
-+{
-+ struct r8180_priv *priv = ieee80211_priv(dev);
-+ u8 databb = 0;
-+
-+ down(&priv->wx_sem);
-+
-+ get_user(databb, (u8*)wrqu->data.pointer);
-+ rtl8187_write_phy(dev, wrqu->data.length, databb);
-+
-+ up(&priv->wx_sem);
-+ return 0;
-+
-+}
-+
-+
-+static int r8180_wx_write_nicb(struct net_device *dev,
-+ struct iw_request_info *info,
-+ union iwreq_data *wrqu, char *extra)
-+{
-+ struct r8180_priv *priv = ieee80211_priv(dev);
-+ u32 addr = 0;
-+
-+ down(&priv->wx_sem);
-+
-+ get_user(addr, (u32*)wrqu->data.pointer);
-+ write_nic_byte(dev, addr, wrqu->data.length);
-+
-+ up(&priv->wx_sem);
-+ return 0;
-+
-+}
-+static int r8180_wx_read_nicb(struct net_device *dev,
-+ struct iw_request_info *info,
-+ union iwreq_data *wrqu, char *extra)
-+{
-+ struct r8180_priv *priv = ieee80211_priv(dev);
-+ u32 addr = 0;
-+ u16 data1;
-+
-+ down(&priv->wx_sem);
-+
-+ get_user(addr,(u32*)wrqu->data.pointer);
-+ data1 = read_nic_byte(dev, addr);
-+ wrqu->data.length = data1;
-+
-+ up(&priv->wx_sem);
-+ return 0;
-+}
-+
-+static inline int is_same_network(struct ieee80211_network *src,
-+ struct ieee80211_network *dst,
-+ struct ieee80211_device *ieee)
-+{
-+ /* A network is only a duplicate if the channel, BSSID, ESSID
-+ * and the capability field (in particular IBSS and BSS) all match.
-+ * We treat all <hidden> with the same BSSID and channel
-+ * as one network */
-+ return (((src->ssid_len == dst->ssid_len)||(ieee->iw_mode == IW_MODE_INFRA)) && //YJ,mod, 080819,for hidden ap
-+ //((src->ssid_len == dst->ssid_len) &&
-+ (src->channel == dst->channel) &&
-+ !memcmp(src->bssid, dst->bssid, ETH_ALEN) &&
-+ (!memcmp(src->ssid, dst->ssid, src->ssid_len)||(ieee->iw_mode == IW_MODE_INFRA)) && //YJ,mod, 080819,for hidden ap
-+ //!memcmp(src->ssid, dst->ssid, src->ssid_len) &&
-+ ((src->capability & WLAN_CAPABILITY_IBSS) ==
-+ (dst->capability & WLAN_CAPABILITY_IBSS)) &&
-+ ((src->capability & WLAN_CAPABILITY_BSS) ==
-+ (dst->capability & WLAN_CAPABILITY_BSS)));
-+}
-+
-+static int r8180_wx_get_ap_status(struct net_device *dev,
-+ struct iw_request_info *info,
-+ union iwreq_data *wrqu, char *extra)
-+{
-+ struct r8180_priv *priv = ieee80211_priv(dev);
-+ struct ieee80211_device *ieee = priv->ieee80211;
-+ struct ieee80211_network *target;
-+ int name_len;
-+
-+ down(&priv->wx_sem);
-+
-+ //count the length of input ssid
-+ for(name_len=0 ; ((char*)wrqu->data.pointer)[name_len]!='\0' ; name_len++);
-+
-+ //search for the correspoding info which is received
-+ list_for_each_entry(target, &ieee->network_list, list) {
-+ if ( (target->ssid_len == name_len) &&
-+ (strncmp(target->ssid, (char*)wrqu->data.pointer, name_len)==0)){
-+ if( ((jiffies-target->last_scanned)/HZ > 1) && (ieee->state == IEEE80211_LINKED) && (is_same_network(&ieee->current_network,target, ieee)) )
-+ wrqu->data.length = 999;
-+ else
-+ wrqu->data.length = target->SignalStrength;
-+ if(target->wpa_ie_len>0 || target->rsn_ie_len>0 )
-+ //set flags=1 to indicate this ap is WPA
-+ wrqu->data.flags = 1;
-+ else wrqu->data.flags = 0;
-+
-+
-+ break;
-+ }
-+ }
-+
-+ if (&target->list == &ieee->network_list){
-+ wrqu->data.flags = 3;
-+ }
-+ up(&priv->wx_sem);
-+ return 0;
-+}
-+
-+
-+
-+#endif
-+
-+static int r8180_wx_set_rawtx(struct net_device *dev,
-+ struct iw_request_info *info,
-+ union iwreq_data *wrqu, char *extra)
-+{
-+ struct r8180_priv *priv = ieee80211_priv(dev);
-+ int ret;
-+
-+ if(priv->ieee80211->bHwRadioOff)
-+ return 0;
-+
-+ down(&priv->wx_sem);
-+
-+ ret = ieee80211_wx_set_rawtx(priv->ieee80211, info, wrqu, extra);
-+
-+ up(&priv->wx_sem);
-+
-+ return ret;
-+
-+}
-+
-+static int r8180_wx_set_crcmon(struct net_device *dev,
-+ struct iw_request_info *info,
-+ union iwreq_data *wrqu, char *extra)
-+{
-+ struct r8180_priv *priv = ieee80211_priv(dev);
-+ int *parms = (int *)extra;
-+ int enable = (parms[0] > 0);
-+ short prev = priv->crcmon;
-+
-+ if(priv->ieee80211->bHwRadioOff)
-+ return 0;
-+
-+ down(&priv->wx_sem);
-+
-+ if(enable)
-+ priv->crcmon=1;
-+ else
-+ priv->crcmon=0;
-+
-+ DMESG("bad CRC in monitor mode are %s",
-+ priv->crcmon ? "accepted" : "rejected");
-+
-+ if(prev != priv->crcmon && priv->up){
-+ rtl8180_down(dev);
-+ rtl8180_up(dev);
-+ }
-+
-+ up(&priv->wx_sem);
-+
-+ return 0;
-+}
-+
-+static int r8180_wx_set_mode(struct net_device *dev, struct iw_request_info *a,
-+ union iwreq_data *wrqu, char *b)
-+{
-+ struct r8180_priv *priv = ieee80211_priv(dev);
-+ int ret;
-+ if(priv->ieee80211->bHwRadioOff)
-+ return 0;
-+
-+#ifdef _RTL8187_EXT_PATCH_
-+ if (priv->mshobj && (priv->ieee80211->iw_ext_mode==11)) return 0;
-+#endif
-+ down(&priv->wx_sem);
-+
-+#ifdef CONFIG_IPS
-+ if(priv->bInactivePs){
-+ if(wrqu->mode != IW_MODE_INFRA){
-+ down(&priv->ieee80211->ips_sem);
-+ IPSLeave(dev);
-+ up(&priv->ieee80211->ips_sem);
-+ }
-+ }
-+#endif
-+ ret = ieee80211_wx_set_mode(priv->ieee80211,a,wrqu,b);
-+
-+ rtl8187_set_rxconf(dev);
-+
-+ up(&priv->wx_sem);
-+ return ret;
-+}
-+
-+
-+//YJ,add,080819,for hidden ap
-+struct iw_range_with_scan_capa
-+{
-+ /* Informative stuff (to choose between different interface) */
-+ __u32 throughput; /* To give an idea... */
-+ /* In theory this value should be the maximum benchmarked
-+ * TCP/IP throughput, because with most of these devices the
-+ * bit rate is meaningless (overhead an co) to estimate how
-+ * fast the connection will go and pick the fastest one.
-+ * I suggest people to play with Netperf or any benchmark...
-+ */
-+
-+ /* NWID (or domain id) */
-+ __u32 min_nwid; /* Minimal NWID we are able to set */
-+ __u32 max_nwid; /* Maximal NWID we are able to set */
-+
-+ /* Old Frequency (backward compat - moved lower ) */
-+ __u16 old_num_channels;
-+ __u8 old_num_frequency;
-+
-+ /* Scan capabilities */
-+ __u8 scan_capa;
-+};
-+//YJ,add,080819,for hidden ap
-+
-+static int rtl8180_wx_get_range(struct net_device *dev,
-+ struct iw_request_info *info,
-+ union iwreq_data *wrqu, char *extra)
-+{
-+ struct iw_range *range = (struct iw_range *)extra;
-+ struct r8180_priv *priv = ieee80211_priv(dev);
-+ u16 val;
-+ int i;
-+ struct iw_range_with_scan_capa* tmp = (struct iw_range_with_scan_capa*)range; //YJ,add,080819,for hidden ap
-+
-+ wrqu->data.length = sizeof(*range);
-+ memset(range, 0, sizeof(*range));
-+
-+ /* Let's try to keep this struct in the same order as in
-+ * linux/include/wireless.h
-+ */
-+
-+ /* TODO: See what values we can set, and remove the ones we can't
-+ * set, or fill them with some default data.
-+ */
-+
-+ /* ~5 Mb/s real (802.11b) */
-+ range->throughput = 5 * 1000 * 1000;
-+
-+ // TODO: Not used in 802.11b?
-+// range->min_nwid; /* Minimal NWID we are able to set */
-+ // TODO: Not used in 802.11b?
-+// range->max_nwid; /* Maximal NWID we are able to set */
-+
-+ /* Old Frequency (backward compat - moved lower ) */
-+// range->old_num_channels;
-+// range->old_num_frequency;
-+// range->old_freq[6]; /* Filler to keep "version" at the same offset */
-+ if(priv->rf_set_sens != NULL)
-+ range->sensitivity = priv->max_sens; /* signal level threshold range */
-+
-+ range->max_qual.qual = 100;
-+ /* TODO: Find real max RSSI and stick here */
-+ range->max_qual.level = 0;
-+ range->max_qual.noise = -98;
-+ range->max_qual.updated = 7; /* Updated all three */
-+
-+ range->avg_qual.qual = 92; /* > 8% missed beacons is 'bad' */
-+ /* TODO: Find real 'good' to 'bad' threshol value for RSSI */
-+ range->avg_qual.level = 20 + -98;
-+ range->avg_qual.noise = 0;
-+ range->avg_qual.updated = 7; /* Updated all three */
-+
-+ range->num_bitrates = RATE_COUNT;
-+
-+ for (i = 0; i < RATE_COUNT && i < IW_MAX_BITRATES; i++) {
-+ range->bitrate[i] = rtl8180_rates[i];
-+ }
-+
-+ range->min_frag = MIN_FRAG_THRESHOLD;
-+ range->max_frag = MAX_FRAG_THRESHOLD;
-+
-+ range->pm_capa = 0;
-+
-+ range->we_version_compiled = WIRELESS_EXT;
-+ range->we_version_source = 16;
-+
-+// range->retry_capa; /* What retry options are supported */
-+// range->retry_flags; /* How to decode max/min retry limit */
-+// range->r_time_flags; /* How to decode max/min retry life */
-+// range->min_retry; /* Minimal number of retries */
-+// range->max_retry; /* Maximal number of retries */
-+// range->min_r_time; /* Minimal retry lifetime */
-+// range->max_r_time; /* Maximal retry lifetime */
-+
-+ range->num_channels = 14;
-+
-+ for (i = 0, val = 0; i < 14; i++) {
-+
-+ // Include only legal frequencies for some countries
-+#ifdef ENABLE_DOT11D
-+ if ((GET_DOT11D_INFO(priv->ieee80211)->channel_map)[i+1]) {
-+#else
-+ if ((priv->ieee80211->channel_map)[i+1]) {
-+#endif
-+ range->freq[val].i = i + 1;
-+ range->freq[val].m = ieee80211_wlan_frequencies[i] * 100000;
-+ range->freq[val].e = 1;
-+ val++;
-+ } else {
-+ // FIXME: do we need to set anything for channels
-+ // we don't use ?
-+ }
-+
-+ if (val == IW_MAX_FREQUENCIES)
-+ break;
-+ }
-+
-+ range->num_frequency = val;
-+ range->enc_capa = IW_ENC_CAPA_WPA | IW_ENC_CAPA_WPA2 |
-+ IW_ENC_CAPA_CIPHER_TKIP | IW_ENC_CAPA_CIPHER_CCMP;
-+
-+ tmp->scan_capa = 0x01; //YJ,add,080819,for hidden ap
-+
-+ return 0;
-+}
-+
-+
-+static int r8180_wx_set_scan(struct net_device *dev, struct iw_request_info *a,
-+ union iwreq_data *wrqu, char *b)
-+{
-+ struct r8180_priv *priv = ieee80211_priv(dev);
-+ struct ieee80211_device* ieee = priv->ieee80211;
-+ int ret;
-+
-+ if(priv->ieee80211->bHwRadioOff)
-+ return 0;
-+ //printk("==============>%s()\n",__FUNCTION__);
-+ if(!priv->up)
-+ return -1;
-+
-+ if (wrqu->data.flags & IW_SCAN_THIS_ESSID)
-+ {
-+ struct iw_scan_req* req = (struct iw_scan_req*)b;
-+ if (req->essid_len)
-+ {
-+ ieee->current_network.ssid_len = req->essid_len;
-+ memcpy(ieee->current_network.ssid, req->essid, req->essid_len);
-+ }
-+ }
-+
-+ //set Tr switch to hardware control to scan more bss
-+ if(priv->TrSwitchState == TR_SW_TX) {
-+ //YJ,add,080611
-+ write_nic_byte(dev, RFPinsSelect, (u8)(priv->wMacRegRfPinsSelect));
-+ write_nic_byte(dev, RFPinsOutput, (u8)(priv->wMacRegRfPinsOutput));
-+ //YJ,add,080611,end
-+ priv->TrSwitchState = TR_HW_CONTROLLED;
-+ }
-+#ifdef _RTL8187_EXT_PATCH_
-+ if((priv->ieee80211->iw_mode == IW_MODE_MESH) && (priv->ieee80211->iw_ext_mode == IW_MODE_MESH)){
-+ r8180_wx_mesh_scan(dev,a,wrqu,b);
-+ ret = 0;
-+ }
-+ else
-+#endif
-+ {
-+ down(&priv->wx_sem);
-+ if(priv->ieee80211->state != IEEE80211_LINKED){
-+ //printk("===>start no link scan\n");
-+ //ieee80211_start_scan(priv->ieee80211);
-+ //lzm mod 090115 because wq can't scan complete once
-+ //because after start protocal wq scan is in doing
-+ //so we should stop it first.
-+ ieee80211_stop_scan(priv->ieee80211);
-+ ieee80211_start_scan_syncro(priv->ieee80211);
-+ ret = 0;
-+ } else {
-+ ret = ieee80211_wx_set_scan(priv->ieee80211,a,wrqu,b);
-+ }
-+ up(&priv->wx_sem);
-+ }
-+ return ret;
-+}
-+
-+
-+static int r8180_wx_get_scan(struct net_device *dev, struct iw_request_info *a,
-+ union iwreq_data *wrqu, char *b)
-+{
-+
-+ int ret;
-+ struct r8180_priv *priv = ieee80211_priv(dev);
-+
-+ if(!priv->up) return -1;
-+#ifdef _RTL8187_EXT_PATCH_
-+ if((priv->ieee80211->iw_mode == IW_MODE_MESH) && (priv->ieee80211->iw_ext_mode == IW_MODE_MESH)){
-+ ret = r8180_wx_get_mesh_list(dev, a, wrqu, b);
-+ }
-+ else
-+#endif
-+ {
-+ down(&priv->wx_sem);
-+
-+ ret = ieee80211_wx_get_scan(priv->ieee80211,a,wrqu,b);
-+
-+ up(&priv->wx_sem);
-+ }
-+ return ret;
-+}
-+
-+
-+static int r8180_wx_set_essid(struct net_device *dev,
-+ struct iw_request_info *a,
-+ union iwreq_data *wrqu, char *b)
-+{
-+ struct r8180_priv *priv = ieee80211_priv(dev);
-+ int ret;
-+#ifdef _RTL8187_EXT_PATCH_
-+ struct ieee80211_device *ieee = priv->ieee80211;
-+ char ch = 0;
-+ char tmpmeshid[32];
-+ char *p;
-+ int tmpmeshid_len=0;
-+ int i;
-+ short proto_started;
-+#endif
-+ if(priv->ieee80211->bHwRadioOff)
-+ return 0;
-+ //printk("==========>%s()\n",__FUNCTION__);
-+ down(&priv->wx_sem);
-+
-+#ifdef _RTL8187_EXT_PATCH_
-+ if((priv->ieee80211->iw_mode == IW_MODE_MESH) && (priv->ieee80211->iw_ext_mode == IW_MODE_MESH)){
-+ if (wrqu->essid.length > IW_ESSID_MAX_SIZE){
-+ ret= -E2BIG;
-+ goto out;
-+ }
-+ if (wrqu->essid.flags && (wrqu->essid.length > 1)) {
-+ memset(tmpmeshid,0,32);
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20)
-+ tmpmeshid_len=wrqu->essid.length;
-+#else
-+ tmpmeshid_len=wrqu->essid.length + 1;
-+#endif
-+ p=b+tmpmeshid_len-2;
-+ for(i=tmpmeshid_len-1;i>0;i--)
-+ {
-+ if((*p)=='@')
-+ break;
-+ p--;
-+ }
-+ if((i == 0) || (i == 1)){
-+ printk("error:wrong meshid\n");
-+ ret = -1;
-+ goto out;
-+ }
-+
-+ memcpy(tmpmeshid,b,(i-1));
-+ p++;
-+ if((tmpmeshid_len-1-i)==1)
-+ {
-+ if(*p > '9'|| *p <= '0'){
-+ goto out;
-+ } else {
-+ ch = *p - '0';
-+ }
-+ }
-+ else if((tmpmeshid_len-1-i)==2)
-+ {
-+ if((*p == '1') && (*(p+1) >= '0') && (*(p+1) <= '9'))
-+ ch = (*p - '0') * 10 + (*(p+1) - '0');
-+ else
-+ goto out;
-+ }
-+ else {
-+ ret = 0;
-+ goto out;
-+ }
-+ if(ch > 14)
-+ {
-+ ret = 0;
-+ printk("channel is invalid: %d\n",ch);
-+ goto out;
-+ }
-+ ieee->sync_scan_hurryup = 1;
-+
-+ proto_started = ieee->proto_started;
-+ if(proto_started)
-+ ieee80211_stop_protocol(ieee);
-+
-+ printk("==============>tmpmeshid is %s\n",tmpmeshid);
-+ priv->mshobj->ext_patch_r8180_wx_set_meshID(dev, tmpmeshid);
-+ priv->mshobj->ext_patch_r8180_wx_set_mesh_chan(dev,ch);
-+ r8180_wx_set_channel(dev, NULL, NULL, &ch);
-+ if (proto_started)
-+ ieee80211_start_protocol(ieee);
-+ }
-+ else{
-+ printk("BUG:meshid is null\n");
-+ ret=0;
-+ goto out;
-+ }
-+
-+ ret = 0;
-+ }
-+ else
-+#endif
-+ {
-+ ret = ieee80211_wx_set_essid(priv->ieee80211,a,wrqu,b);
-+ }
-+
-+#ifdef _RTL8187_EXT_PATCH_
-+out:
-+#endif
-+ up(&priv->wx_sem);
-+ return ret;
-+}
-+
-+
-+static int r8180_wx_get_essid(struct net_device *dev,
-+ struct iw_request_info *a,
-+ union iwreq_data *wrqu, char *b)
-+{
-+ int ret;
-+ struct r8180_priv *priv = ieee80211_priv(dev);
-+
-+ down(&priv->wx_sem);
-+
-+ ret = ieee80211_wx_get_essid(priv->ieee80211, a, wrqu, b);
-+
-+ up(&priv->wx_sem);
-+
-+ return ret;
-+}
-+
-+
-+static int r8180_wx_set_freq(struct net_device *dev, struct iw_request_info *a,
-+ union iwreq_data *wrqu, char *b)
-+{
-+ int ret;
-+ struct r8180_priv *priv = ieee80211_priv(dev);
-+
-+ if(priv->ieee80211->bHwRadioOff)
-+ return 0;
-+
-+ down(&priv->wx_sem);
-+
-+ ret = ieee80211_wx_set_freq(priv->ieee80211, a, wrqu, b);
-+
-+ up(&priv->wx_sem);
-+ return ret;
-+}
-+
-+static int r8180_wx_get_name(struct net_device *dev,
-+ struct iw_request_info *info,
-+ union iwreq_data *wrqu, char *extra)
-+{
-+ struct r8180_priv *priv = ieee80211_priv(dev);
-+ return ieee80211_wx_get_name(priv->ieee80211, info, wrqu, extra);
-+}
-+
-+
-+static int r8180_wx_set_frag(struct net_device *dev,
-+ struct iw_request_info *info,
-+ union iwreq_data *wrqu, char *extra)
-+{
-+ struct r8180_priv *priv = ieee80211_priv(dev);
-+
-+ if(priv->ieee80211->bHwRadioOff)
-+ return 0;
-+
-+ if (wrqu->frag.disabled)
-+ priv->ieee80211->fts = DEFAULT_FRAG_THRESHOLD;
-+ else {
-+ if (wrqu->frag.value < MIN_FRAG_THRESHOLD ||
-+ wrqu->frag.value > MAX_FRAG_THRESHOLD)
-+ return -EINVAL;
-+
-+ priv->ieee80211->fts = wrqu->frag.value & ~0x1;
-+ }
-+
-+ return 0;
-+}
-+
-+
-+static int r8180_wx_get_frag(struct net_device *dev,
-+ struct iw_request_info *info,
-+ union iwreq_data *wrqu, char *extra)
-+{
-+ struct r8180_priv *priv = ieee80211_priv(dev);
-+
-+ wrqu->frag.value = priv->ieee80211->fts;
-+ wrqu->frag.fixed = 0; /* no auto select */
-+ wrqu->frag.disabled = (wrqu->frag.value == DEFAULT_FRAG_THRESHOLD);
-+
-+ return 0;
-+}
-+
-+
-+static int r8180_wx_set_wap(struct net_device *dev,
-+ struct iw_request_info *info,
-+ union iwreq_data *awrq,
-+ char *extra)
-+{
-+ int ret;
-+ struct r8180_priv *priv = ieee80211_priv(dev);
-+ if(priv->ieee80211->bHwRadioOff)
-+ return 0;
-+
-+ //printk("in function %s\n",__FUNCTION__);
-+#ifdef _RTL8187_EXT_PATCH_
-+ if (priv->mshobj && (priv->ieee80211->iw_ext_mode==11)){
-+ return 0;
-+ }
-+#endif
-+ down(&priv->wx_sem);
-+
-+ ret = ieee80211_wx_set_wap(priv->ieee80211,info,awrq,extra);
-+
-+ up(&priv->wx_sem);
-+ return ret;
-+
-+}
-+
-+
-+static int r8180_wx_get_wap(struct net_device *dev,
-+ struct iw_request_info *info,
-+ union iwreq_data *wrqu, char *extra)
-+{
-+ struct r8180_priv *priv = ieee80211_priv(dev);
-+
-+ return ieee80211_wx_get_wap(priv->ieee80211,info,wrqu,extra);
-+}
-+
-+
-+static int r8180_wx_get_enc(struct net_device *dev,
-+ struct iw_request_info *info,
-+ union iwreq_data *wrqu, char *key)
-+{
-+ struct r8180_priv *priv = ieee80211_priv(dev);
-+
-+ return ieee80211_wx_get_encode(priv->ieee80211, info, wrqu, key);
-+}
-+
-+static int r8180_wx_set_enc(struct net_device *dev,
-+ struct iw_request_info *info,
-+ union iwreq_data *wrqu, char *key)
-+{
-+ struct r8180_priv *priv = ieee80211_priv(dev);
-+ int ret;
-+#ifdef JOHN_HWSEC
-+// struct ieee80211_device *ieee = priv->ieee80211;
-+// u32 TargetContent;
-+ u32 hwkey[4]={0,0,0,0};
-+ u8 mask=0xff;
-+ u32 key_idx=0;
-+ u8 broadcast_addr[6] ={ 0xff,0xff,0xff,0xff,0xff,0xff};
-+ u8 zero_addr[4][6] ={ {0x00,0x00,0x00,0x00,0x00,0x00},
-+ {0x00,0x00,0x00,0x00,0x00,0x01},
-+ {0x00,0x00,0x00,0x00,0x00,0x02},
-+ {0x00,0x00,0x00,0x00,0x00,0x03} };
-+ int i;
-+
-+#endif
-+
-+ if(priv->ieee80211->bHwRadioOff)
-+ return 0;
-+
-+ down(&priv->wx_sem);
-+
-+ DMESG("Setting SW wep key");
-+ ret = ieee80211_wx_set_encode(priv->ieee80211,info,wrqu,key);
-+
-+ up(&priv->wx_sem);
-+
-+#ifdef JOHN_HWSEC
-+
-+ //sometimes, the length is zero while we do not type key value
-+ if(wrqu->encoding.length!=0){
-+
-+ for(i=0 ; i<4 ; i++){
-+ hwkey[i] |= key[4*i+0]&mask;
-+ if(i==1&&(4*i+1)==wrqu->encoding.length) mask=0x00;
-+ if(i==3&&(4*i+1)==wrqu->encoding.length) mask=0x00;
-+ hwkey[i] |= (key[4*i+1]&mask)<<8;
-+ hwkey[i] |= (key[4*i+2]&mask)<<16;
-+ hwkey[i] |= (key[4*i+3]&mask)<<24;
-+ }
-+
-+ #define CONF_WEP40 0x4
-+ #define CONF_WEP104 0x14
-+
-+ switch(wrqu->encoding.flags){
-+ case 0:
-+ case 1: key_idx = 0; break;
-+ case 2: key_idx = 1; break;
-+ case 3: key_idx = 2; break;
-+ case 4: key_idx = 3; break;
-+ default: break;
-+ }
-+
-+ if(wrqu->encoding.length==0x5){
-+ setKey( dev,
-+ key_idx, //EntryNo
-+ key_idx, //KeyIndex
-+ KEY_TYPE_WEP40, //KeyType
-+ zero_addr[key_idx],
-+ 0, //DefaultKey
-+ hwkey); //KeyContent
-+
-+ if(key_idx == 0){
-+
-+ write_nic_byte(dev, WPA_CONFIG, 7);
-+
-+ setKey( dev,
-+ 4, //EntryNo
-+ key_idx, //KeyIndex
-+ KEY_TYPE_WEP40, //KeyType
-+ broadcast_addr, //addr
-+ 0, //DefaultKey
-+ hwkey); //KeyContent
-+ }
-+ }
-+
-+ else if(wrqu->encoding.length==0xd){
-+ setKey( dev,
-+ key_idx, //EntryNo
-+ key_idx, //KeyIndex
-+ KEY_TYPE_WEP104, //KeyType
-+ zero_addr[key_idx],
-+ 0, //DefaultKey
-+ hwkey); //KeyContent
-+
-+ if(key_idx == 0){
-+
-+ write_nic_byte(dev, WPA_CONFIG, 7);
-+
-+ setKey( dev,
-+ 4, //EntryNo
-+ key_idx, //KeyIndex
-+ KEY_TYPE_WEP104, //KeyType
-+ broadcast_addr, //addr
-+ 0, //DefaultKey
-+ hwkey); //KeyContent
-+ }
-+ }
-+ else printk("wrong type in WEP, not WEP40 and WEP104\n");
-+
-+ }
-+
-+ //consider the setting different key index situation
-+ //wrqu->encoding.flags = 801 means that we set key with index "1"
-+ if(wrqu->encoding.length==0 && (wrqu->encoding.flags >>8) == 0x8 ){
-+
-+ write_nic_byte(dev, WPA_CONFIG, 7);
-+
-+ //copy wpa config from default key(key0~key3) to broadcast key(key5)
-+ //
-+ key_idx = (wrqu->encoding.flags & 0xf)-1 ;
-+ write_cam(dev, (4*6), 0xffff0000|read_cam(dev, key_idx*6) );
-+ write_cam(dev, (4*6)+1, 0xffffffff);
-+ write_cam(dev, (4*6)+2, read_cam(dev, (key_idx*6)+2) );
-+ write_cam(dev, (4*6)+3, read_cam(dev, (key_idx*6)+3) );
-+ write_cam(dev, (4*6)+4, read_cam(dev, (key_idx*6)+4) );
-+ write_cam(dev, (4*6)+5, read_cam(dev, (key_idx*6)+5) );
-+ }
-+
-+#endif /*JOHN_HWSEC*/
-+ return ret;
-+}
-+
-+
-+static int r8180_wx_set_scan_type(struct net_device *dev, struct iw_request_info *aa, union
-+ iwreq_data *wrqu, char *p){
-+
-+ struct r8180_priv *priv = ieee80211_priv(dev);
-+ int *parms=(int*)p;
-+ int mode=parms[0];
-+
-+ if(priv->ieee80211->bHwRadioOff)
-+ return 0;
-+
-+ priv->ieee80211->active_scan = mode;
-+
-+ return 1;
-+}
-+
-+
-+
-+static int r8180_wx_set_retry(struct net_device *dev,
-+ struct iw_request_info *info,
-+ union iwreq_data *wrqu, char *extra)
-+{
-+ struct r8180_priv *priv = ieee80211_priv(dev);
-+ int err = 0;
-+
-+ if(priv->ieee80211->bHwRadioOff)
-+ return 0;
-+
-+ down(&priv->wx_sem);
-+
-+ if (wrqu->retry.flags & IW_RETRY_LIFETIME ||
-+ wrqu->retry.disabled){
-+ err = -EINVAL;
-+ goto exit;
-+ }
-+ if (!(wrqu->retry.flags & IW_RETRY_LIMIT)){
-+ err = -EINVAL;
-+ goto exit;
-+ }
-+
-+ if(wrqu->retry.value > R8180_MAX_RETRY){
-+ err= -EINVAL;
-+ goto exit;
-+ }
-+ if (wrqu->retry.flags & IW_RETRY_MAX) {
-+ priv->retry_rts = wrqu->retry.value;
-+ DMESG("Setting retry for RTS/CTS data to %d", wrqu->retry.value);
-+
-+ }else {
-+ priv->retry_data = wrqu->retry.value;
-+ DMESG("Setting retry for non RTS/CTS data to %d", wrqu->retry.value);
-+ }
-+
-+ /* FIXME !
-+ * We might try to write directly the TX config register
-+ * or to restart just the (R)TX process.
-+ * I'm unsure if whole reset is really needed
-+ */
-+
-+ rtl8180_commit(dev);
-+ /*
-+ if(priv->up){
-+ rtl8180_rtx_disable(dev);
-+ rtl8180_rx_enable(dev);
-+ rtl8180_tx_enable(dev);
-+
-+ }
-+ */
-+exit:
-+ up(&priv->wx_sem);
-+
-+ return err;
-+}
-+
-+static int r8180_wx_get_retry(struct net_device *dev,
-+ struct iw_request_info *info,
-+ union iwreq_data *wrqu, char *extra)
-+{
-+ struct r8180_priv *priv = ieee80211_priv(dev);
-+
-+
-+ wrqu->retry.disabled = 0; /* can't be disabled */
-+
-+ if ((wrqu->retry.flags & IW_RETRY_TYPE) ==
-+ IW_RETRY_LIFETIME)
-+ return -EINVAL;
-+
-+ if (wrqu->retry.flags & IW_RETRY_MAX) {
-+ wrqu->retry.flags = IW_RETRY_LIMIT & IW_RETRY_MAX;
-+ wrqu->retry.value = priv->retry_rts;
-+ } else {
-+ wrqu->retry.flags = IW_RETRY_LIMIT & IW_RETRY_MIN;
-+ wrqu->retry.value = priv->retry_data;
-+ }
-+ //DMESG("returning %d",wrqu->retry.value);
-+
-+
-+ return 0;
-+}
-+
-+static int r8180_wx_get_sens(struct net_device *dev,
-+ struct iw_request_info *info,
-+ union iwreq_data *wrqu, char *extra)
-+{
-+ struct r8180_priv *priv = ieee80211_priv(dev);
-+ if(priv->rf_set_sens == NULL)
-+ return -1; /* we have not this support for this radio */
-+ wrqu->sens.value = priv->sens;
-+ return 0;
-+}
-+
-+
-+static int r8180_wx_set_sens(struct net_device *dev,
-+ struct iw_request_info *info,
-+ union iwreq_data *wrqu, char *extra)
-+{
-+
-+ struct r8180_priv *priv = ieee80211_priv(dev);
-+
-+ short err = 0;
-+
-+ if(priv->ieee80211->bHwRadioOff)
-+ return 0;
-+
-+ down(&priv->wx_sem);
-+ //DMESG("attempt to set sensivity to %ddb",wrqu->sens.value);
-+ if(priv->rf_set_sens == NULL) {
-+ err= -1; /* we have not this support for this radio */
-+ goto exit;
-+ }
-+ if(priv->rf_set_sens(dev, wrqu->sens.value) == 0)
-+ priv->sens = wrqu->sens.value;
-+ else
-+ err= -EINVAL;
-+
-+exit:
-+ up(&priv->wx_sem);
-+
-+ return err;
-+}
-+
-+
-+static int dummy(struct net_device *dev, struct iw_request_info *a,
-+ union iwreq_data *wrqu,char *b)
-+{
-+ return -1;
-+}
-+static int r8180_wx_set_enc_ext(struct net_device *dev,
-+ struct iw_request_info *info,
-+ union iwreq_data *wrqu, char *extra)
-+{
-+
-+ struct r8180_priv *priv = ieee80211_priv(dev);
-+ //printk("===>%s()\n", __FUNCTION__);
-+
-+ int ret=0;
-+
-+ if(priv->ieee80211->bHwRadioOff)
-+ return 0;
-+
-+ down(&priv->wx_sem);
-+ ret = ieee80211_wx_set_encode_ext(priv->ieee80211, info, wrqu, extra);
-+ up(&priv->wx_sem);
-+ return ret;
-+
-+}
-+static int r8180_wx_set_auth(struct net_device *dev,
-+ struct iw_request_info *info,
-+ union iwreq_data* data, char *extra)
-+{
-+ //printk("====>%s()\n", __FUNCTION__);
-+ struct r8180_priv *priv = ieee80211_priv(dev);
-+ int ret=0;
-+
-+ if(priv->ieee80211->bHwRadioOff)
-+ return 0;
-+
-+ down(&priv->wx_sem);
-+ ret = ieee80211_wx_set_auth(priv->ieee80211, info, &(data->param), extra);
-+ up(&priv->wx_sem);
-+ return ret;
-+}
-+
-+static int r8180_wx_set_mlme(struct net_device *dev,
-+ struct iw_request_info *info,
-+ union iwreq_data *wrqu, char *extra)
-+{
-+ //printk("====>%s()\n", __FUNCTION__);
-+
-+ int ret=0;
-+ struct r8180_priv *priv = ieee80211_priv(dev);
-+
-+ if(priv->ieee80211->bHwRadioOff)
-+ return 0;
-+
-+ down(&priv->wx_sem);
-+#if 1
-+ ret = ieee80211_wx_set_mlme(priv->ieee80211, info, wrqu, extra);
-+#endif
-+ up(&priv->wx_sem);
-+ return ret;
-+}
-+
-+static int r8180_wx_set_gen_ie(struct net_device *dev,
-+ struct iw_request_info *info,
-+ union iwreq_data* data, char *extra)
-+{
-+ //printk("====>%s(), len:%d\n", __FUNCTION__, data->length);
-+ int ret=0;
-+ struct r8180_priv *priv = ieee80211_priv(dev);
-+
-+ if(priv->ieee80211->bHwRadioOff)
-+ return 0;
-+
-+ down(&priv->wx_sem);
-+#if 1
-+ ret = ieee80211_wx_set_gen_ie(priv->ieee80211, extra, data->data.length);
-+#endif
-+ up(&priv->wx_sem);
-+ //printk("<======%s(), ret:%d\n", __FUNCTION__, ret);
-+ return ret;
-+
-+
-+}
-+
-+#ifdef _RTL8187_EXT_PATCH_
-+/*
-+ Output:
-+ (case 1) Mesh: Enable. MESHID=[%s] (max length of %s is 32 bytes).
-+ (case 2) Mesh: Disable.
-+*/
-+static int r8180_wx_get_meshinfo(struct net_device *dev,
-+ struct iw_request_info *info,
-+ union iwreq_data *wrqu, char *extra)
-+{
-+ struct r8180_priv *priv = ieee80211_priv(dev);
-+
-+ if( ! priv->mshobj || !priv->mshobj->ext_patch_r8180_wx_get_meshinfo )
-+ return 0;
-+ return priv->mshobj->ext_patch_r8180_wx_get_meshinfo(dev, info, wrqu, extra);
-+}
-+
-+
-+static int r8180_wx_enable_mesh(struct net_device *dev,
-+ struct iw_request_info *info,
-+ union iwreq_data *wrqu, char *extra)
-+{
-+ struct r8180_priv *priv = ieee80211_priv(dev);
-+ struct ieee80211_device *ieee = priv->ieee80211;
-+
-+ int ret = 0;
-+
-+ if( ! priv->mshobj || !priv->mshobj->ext_patch_r8180_wx_enable_mesh )
-+ return 0;
-+
-+ down(&priv->wx_sem);
-+ if(priv->mshobj->ext_patch_r8180_wx_enable_mesh(dev))
-+ {
-+ union iwreq_data tmprqu;
-+ tmprqu.mode = ieee->iw_mode;
-+ ieee->iw_mode = 0;
-+ ret = ieee80211_wx_set_mode(ieee, info, &tmprqu, extra);
-+ rtl8187_set_rxconf(dev);
-+ }
-+
-+ up(&priv->wx_sem);
-+
-+ return ret;
-+
-+}
-+
-+static int r8180_wx_disable_mesh(struct net_device *dev,
-+ struct iw_request_info *info,
-+ union iwreq_data *wrqu, char *extra)
-+{
-+ struct r8180_priv *priv = ieee80211_priv(dev);
-+ struct ieee80211_device *ieee = priv->ieee80211;
-+
-+ int ret = 0;
-+
-+ if( ! priv->mshobj || !priv->mshobj->ext_patch_r8180_wx_disable_mesh )
-+ return 0;
-+
-+ down(&priv->wx_sem);
-+ if(priv->mshobj->ext_patch_r8180_wx_disable_mesh(dev))
-+ {
-+ union iwreq_data tmprqu;
-+ tmprqu.mode = ieee->iw_mode;
-+ ieee->iw_mode = 999;
-+ ret = ieee80211_wx_set_mode(ieee, info, &tmprqu, extra);
-+ rtl8187_set_rxconf(dev);
-+ }
-+
-+ up(&priv->wx_sem);
-+
-+ return ret;
-+}
-+
-+
-+int r8180_wx_set_channel(struct net_device *dev,
-+ struct iw_request_info *info,
-+ union iwreq_data *wrqu, char *extra)
-+{
-+ int ch = *extra;
-+ struct r8180_priv *priv = ieee80211_priv(dev);
-+ struct ieee80211_device *ieee = priv->ieee80211;
-+
-+ if(priv->ieee80211->bHwRadioOff)
-+ return 0;
-+
-+ // is 11s ?
-+ if (!priv->mshobj || (ieee->iw_mode != ieee->iw_ext_mode) || !priv->mshobj->ext_patch_r8180_wx_set_channel )
-+ return 0;
-+
-+ printk("set channel = %d\n", ch);
-+ if ( ch < 0 )
-+ {
-+ ieee80211_start_scan(ieee); // auto
-+ ieee->meshScanMode =2;
-+ }
-+ else
-+ {
-+//#ifdef NETWORKMANAGER_UI
-+ if((priv->ieee80211->iw_mode == IW_MODE_MESH) && (priv->ieee80211->iw_ext_mode == IW_MODE_MESH)){
-+ }
-+//#else
-+ else{
-+ down(&priv->wx_sem);}
-+//#endif
-+ ieee->meshScanMode =0;
-+ // ieee->set_chan(dev, ch);
-+//#ifdef _RTL8187_EXT_PATCH_
-+ if(priv->mshobj->ext_patch_r8180_wx_set_channel)
-+ {
-+ priv->mshobj->ext_patch_r8180_wx_set_channel(ieee, ch);
-+ priv->mshobj->ext_patch_r8180_wx_set_mesh_chan(dev,ch);
-+ }
-+//#endif
-+ ieee->set_chan(ieee->dev, ch);
-+ ieee->current_network.channel = ch;
-+ queue_work(ieee->wq, &ieee->ext_stop_scan_wq);
-+ ieee80211_ext_send_11s_beacon(ieee);
-+//#ifdef NETWORKMANAGER_UI
-+ if((priv->ieee80211->iw_mode == IW_MODE_MESH) && (priv->ieee80211->iw_ext_mode == IW_MODE_MESH)){
-+ }
-+//#else
-+ else{
-+ up(&priv->wx_sem);}
-+//#endif
-+ //up(&ieee->wx_sem);
-+
-+ // ieee80211_stop_scan(ieee); // user set
-+ //
-+
-+ /*
-+ netif_carrier_off(ieee->dev);
-+
-+ if (ieee->data_hard_stop)
-+ ieee->data_hard_stop(ieee->dev);
-+
-+ ieee->state = IEEE80211_NOLINK;
-+ ieee->link_change(ieee->dev);
-+
-+ ieee->current_network.channel = fwrq->m;
-+ ieee->set_chan(ieee->dev, ieee->current_network.channel);
-+
-+
-+ if (ieee->data_hard_resume)
-+ ieee->data_hard_resume(ieee->dev);
-+
-+ netif_carrier_on(ieee->dev);
-+ */
-+
-+ }
-+
-+ return 0;
-+}
-+
-+static int r8180_wx_set_meshID(struct net_device *dev,
-+ struct iw_request_info *info,
-+ union iwreq_data *wrqu, char *extra)
-+{
-+ struct r8180_priv *priv = ieee80211_priv(dev);
-+
-+ if(priv->ieee80211->bHwRadioOff)
-+ return 0;
-+
-+ if( ! priv->mshobj || !priv->mshobj->ext_patch_r8180_wx_set_meshID )
-+ return 0;
-+
-+ //printk("len=%d\n", wrqu->data.length);
-+ //printk("\nCall setMeshid.");
-+ return priv->mshobj->ext_patch_r8180_wx_set_meshID(dev, wrqu->data.pointer);
-+}
-+
-+
-+/* reserved for future
-+static int r8180_wx_add_mac_allow(struct net_device *dev,
-+ struct iw_request_info *info,
-+ union iwreq_data *wrqu, char *extra)
-+{
-+ struct r8180_priv *priv = ieee80211_priv(dev);
-+
-+ if( ! priv->mshobj || !priv->mshobj->ext_patch_r8180_wx_set_add_mac_allow )
-+ return 0;
-+
-+ return priv->mshobj->ext_patch_r8180_wx_set_add_mac_allow(dev, info, wrqu, extra);
-+}
-+
-+static int r8180_wx_del_mac_allow(struct net_device *dev,
-+ struct iw_request_info *info,
-+ union iwreq_data *wrqu, char *extra)
-+{
-+ struct r8180_priv *priv = ieee80211_priv(dev);
-+
-+ if( ! priv->mshobj || !priv->mshobj->ext_patch_r8180_wx_set_del_mac_allow )
-+ return 0;
-+
-+ return priv->mshobj->ext_patch_r8180_wx_set_del_mac_allow(dev, info, wrqu, extra);
-+}
-+*/
-+static int r8180_wx_add_mac_deny(struct net_device *dev,
-+ struct iw_request_info *info,
-+ union iwreq_data *wrqu, char *extra)
-+{
-+ struct r8180_priv *priv = ieee80211_priv(dev);
-+
-+ if( ! priv->mshobj || !priv->mshobj->ext_patch_r8180_wx_set_add_mac_deny )
-+ return 0;
-+
-+ return priv->mshobj->ext_patch_r8180_wx_set_add_mac_deny(dev, info, wrqu, extra);
-+}
-+
-+static int r8180_wx_del_mac_deny(struct net_device *dev,
-+ struct iw_request_info *info,
-+ union iwreq_data *wrqu, char *extra)
-+{
-+ struct r8180_priv *priv = ieee80211_priv(dev);
-+
-+ if( ! priv->mshobj || !priv->mshobj->ext_patch_r8180_wx_set_del_mac_deny )
-+ return 0;
-+
-+ return priv->mshobj->ext_patch_r8180_wx_set_del_mac_deny(dev, info, wrqu, extra);
-+}
-+
-+/* reserved for future
-+static int r8180_wx_get_mac_allow(struct net_device *dev,
-+ struct iw_request_info *info,
-+ union iwreq_data *wrqu, char *extra)
-+{
-+ struct r8180_priv *priv = ieee80211_priv(dev);
-+
-+ if( ! priv->mshobj || !priv->mshobj->ext_patch_r8180_wx_get_mac_allow )
-+ return 0;
-+
-+ return priv->mshobj->ext_patch_r8180_wx_get_mac_allow(dev, info, wrqu, extra);
-+}
-+*/
-+
-+static int r8180_wx_get_mac_deny(struct net_device *dev,
-+ struct iw_request_info *info,
-+ union iwreq_data *wrqu, char *extra)
-+{
-+ struct r8180_priv *priv = ieee80211_priv(dev);
-+
-+ if( ! priv->mshobj || !priv->mshobj->ext_patch_r8180_wx_get_mac_deny )
-+ return 0;
-+
-+ return priv->mshobj->ext_patch_r8180_wx_get_mac_deny(dev, info, wrqu, extra);
-+}
-+
-+
-+static int r8180_wx_get_mesh_list(struct net_device *dev,
-+ struct iw_request_info *info,
-+ union iwreq_data *wrqu, char *extra)
-+{
-+ struct r8180_priv *priv = ieee80211_priv(dev);
-+
-+ if( ! priv->mshobj || !priv->mshobj->ext_patch_r8180_wx_get_mesh_list )
-+ return 0;
-+
-+ return priv->mshobj->ext_patch_r8180_wx_get_mesh_list(dev, info, wrqu, extra);
-+}
-+
-+static int r8180_wx_mesh_scan(struct net_device *dev,
-+ struct iw_request_info *info,
-+ union iwreq_data *wrqu, char *extra)
-+{
-+ struct r8180_priv *priv = ieee80211_priv(dev);
-+
-+ if( ! priv->mshobj || !priv->mshobj->ext_patch_r8180_wx_mesh_scan )
-+ return 0;
-+
-+ return priv->mshobj->ext_patch_r8180_wx_mesh_scan(dev, info, wrqu, extra);
-+}
-+
-+static int r8180_wx_join_mesh(struct net_device *dev,
-+ struct iw_request_info *info,
-+ union iwreq_data *wrqu, char *extra)
-+{
-+ struct r8180_priv *priv = ieee80211_priv(dev);
-+ int index;
-+ int ret=0;
-+ char extmeshid[32];
-+ int len=0;
-+ char id[50], ch;
-+//#ifdef NETWORKMANAGER_UI
-+
-+ if((priv->ieee80211->iw_mode == IW_MODE_MESH) && (priv->ieee80211->iw_ext_mode == IW_MODE_MESH)){
-+ printk("join mesh %s\n",extra);
-+ if (wrqu->essid.length > IW_ESSID_MAX_SIZE){
-+ ret= -E2BIG;
-+ goto out;
-+ }
-+ //printk("wrqu->essid.length is %d\n",wrqu->essid.length);
-+ //printk("wrqu->essid.flags is %d\n",wrqu->essid.flags);
-+ if((wrqu->essid.length == 1) && (wrqu->essid.flags == 1)){
-+ ret = 0;
-+ goto out;
-+ }
-+ if (wrqu->essid.flags && wrqu->essid.length) {
-+ if(priv->mshobj->ext_patch_r8180_wx_get_selected_mesh_channel(dev, extra, &ch))
-+ {
-+ priv->mshobj->ext_patch_r8180_wx_set_meshID(dev, extra);
-+ priv->mshobj->ext_patch_r8180_wx_set_mesh_chan(dev,ch);
-+ r8180_wx_set_channel(dev, NULL, NULL, &ch);
-+ }
-+ else
-+ printk("invalid mesh #\n");
-+
-+ }
-+#if 0
-+ else{
-+ if(priv->mshobj->ext_patch_r8180_wx_get_selected_mesh_channel(dev, 0, &ch))
-+ {
-+ priv->mshobj->ext_patch_r8180_wx_set_meshID(dev, extra);
-+ priv->mshobj->ext_patch_r8180_wx_set_mesh_chan(dev,ch);
-+ r8180_wx_set_channel(dev, NULL, NULL, &ch);
-+ }
-+ else
-+ printk("invalid mesh #\n");
-+
-+ }
-+#endif
-+ }
-+ else{
-+//#else
-+ index = *(extra);
-+// printk("index=%d\n", index);
-+
-+ if( ! priv->mshobj
-+ || !priv->mshobj->ext_patch_r8180_wx_set_meshID
-+ || !priv->mshobj->ext_patch_r8180_wx_get_selected_mesh )
-+ return 0;
-+
-+ if( priv->mshobj->ext_patch_r8180_wx_get_selected_mesh(dev, index, &ch, id) )
-+ {
-+ // printk("ch=%d, id=%s\n", ch, id);
-+ priv->mshobj->ext_patch_r8180_wx_set_meshID(dev, id);
-+ priv->mshobj->ext_patch_r8180_wx_set_mesh_chan(dev,ch);
-+ r8180_wx_set_channel(dev, NULL, NULL, &ch);
-+ }
-+ else
-+ printk("invalid mesh #\n");
-+ }
-+//#endif
-+out:
-+ return ret;
-+}
-+
-+#endif // _RTL8187_EXT_PATCH_
-+
-+
-+static int r8180_wx_get_radion(struct net_device *dev,
-+ struct iw_request_info *info,
-+ union iwreq_data *wrqu, char *extra)
-+{
-+ struct r8180_priv *priv = ieee80211_priv(dev);
-+// u8 addr;
-+
-+ down(&priv->wx_sem);
-+ if(priv->radion == 1) {
-+ *(int *)extra = 1;
-+ } else {
-+
-+ *(int *)extra = 0;
-+ }
-+ up(&priv->wx_sem);
-+ return 0;
-+
-+}
-+
-+static int r8180_wx_set_radion(struct net_device *dev,
-+ struct iw_request_info *info,
-+ union iwreq_data *wrqu, char *extra)
-+{
-+ int radion = *extra;
-+ struct r8180_priv *priv = ieee80211_priv(dev);
-+// struct ieee80211_device *ieee = priv->ieee80211;
-+ u8 btCR9346, btConfig3;
-+ int i;
-+ u16 u2bTFPC = 0;
-+ u8 u1bTmp;
-+
-+ if(priv->ieee80211->bHwRadioOff)
-+ return 0;
-+
-+ down(&priv->wx_sem);
-+ printk("set radion = %d\n", radion);
-+
-+#ifdef _RTL8187_EXT_PATCH_
-+ if(ieee->iw_mode == ieee->iw_ext_mode) {
-+ printk("mesh mode:: could not set radi on/off = %d\n", radion);
-+ up(&priv->wx_sem);
-+ return 0;
-+ }
-+#endif
-+ // Set EEM0 and EEM1 in 9346CR.
-+ btCR9346 = read_nic_byte(dev, CR9346);
-+ write_nic_byte(dev, CR9346, (btCR9346|0xC0) );
-+ // Set PARM_En in Config3.
-+ btConfig3 = read_nic_byte(dev, CONFIG3);
-+ write_nic_byte(dev, CONFIG3, (btConfig3|CONFIG3_PARM_En) );
-+
-+ if ( radion == 1) //radion off
-+ {
-+ printk("==================>RF on\n");
-+ write_nic_dword(dev, ANAPARAM, ANAPARM_ON);
-+ write_nic_dword(dev, ANAPARAM2, ANAPARM2_ON);
-+ write_nic_byte(dev, CONFIG4, (priv->RFProgType));
-+
-+ write_nic_byte(dev, 0x085, 0x24); // 061219, SD3 ED: for minicard CCK power leakage issue.
-+ write_rtl8225(dev, 0x4, 0x9FF);
-+
-+ u1bTmp = read_nic_byte(dev, 0x24E);
-+ write_nic_byte(dev, 0x24E, (u1bTmp & (~(BIT5|BIT6))) );// 070124 SD1 Alex: turn on CCK and OFDM.
-+ priv->radion = 1; //radion on
-+ }
-+ else
-+ {
-+ printk("==================>RF off\n");
-+ for(i = 0; i < MAX_DOZE_WAITING_TIMES_87B; i++)
-+ { // Make sure TX FIFO is empty befor turn off RFE pwoer.
-+ u2bTFPC = read_nic_word(dev, TFPC);
-+ if(u2bTFPC == 0)
-+ {
-+ break;
-+ }
-+ else
-+ {
-+ printk("%d times TFPC: %d != 0 before doze!\n", (i+1), u2bTFPC);
-+ udelay(10);
-+ }
-+ }
-+ if( i == MAX_DOZE_WAITING_TIMES_87B )
-+ {
-+ printk("\n\n\n SetZebraRFPowerState8187B(): %d times TFPC: %d != 0 !!!\n\n\n",\
-+ MAX_DOZE_WAITING_TIMES_87B, u2bTFPC);
-+ }
-+
-+ u1bTmp = read_nic_byte(dev, 0x24E);
-+ write_nic_byte(dev, 0x24E, (u1bTmp|BIT5|BIT6));// 070124 SD1 Alex: turn off CCK and OFDM.
-+
-+ write_rtl8225(dev, 0x4,0x1FF); // Turn off RF first to prevent BB lock up, suggested by PJ, 2006.03.03.
-+ write_nic_byte(dev, 0x085, 0x04); // 061219, SD3 ED: for minicard CCK power leakage issue.
-+
-+ write_nic_byte(dev, CONFIG4, (priv->RFProgType|Config4_PowerOff));
-+
-+ write_nic_dword(dev, ANAPARAM, ANAPARM_OFF);
-+ write_nic_dword(dev, ANAPARAM2, ANAPARM2_OFF); // 070301, SD1 William: to reduce RF off power consumption to 80 mA.
-+ priv->radion = 0; //radion off
-+ }
-+ // Clear PARM_En in Config3.
-+ btConfig3 &= ~(CONFIG3_PARM_En);
-+ write_nic_byte(dev, CONFIG3, btConfig3);
-+ // Clear EEM0 and EEM1 in 9346CR.
-+ btCR9346 &= ~(0xC0);
-+ write_nic_byte(dev, CR9346, btCR9346);
-+
-+ up(&priv->wx_sem);
-+
-+ return 0;
-+}
-+
-+static int r8180_wx_set_ratadpt (struct net_device *dev,
-+ struct iw_request_info *info,
-+ union iwreq_data *wrqu, char *extra)
-+{
-+ int ratadapt = *extra;
-+ struct r8180_priv *priv = ieee80211_priv(dev);
-+ struct ieee80211_device *ieee = priv->ieee80211;
-+
-+ if(priv->ieee80211->bHwRadioOff)
-+ return 0;
-+
-+ down(&priv->wx_sem);
-+ printk("Set rate adaptive %s\n", (ratadapt==0)?"on":"off");
-+ if(ratadapt == 0) {
-+ del_timer_sync(&priv->rateadapter_timer);
-+ cancel_delayed_work(&priv->ieee80211->rate_adapter_wq);
-+ priv->rateadapter_timer.function((unsigned long)dev);
-+ } else {
-+ del_timer_sync(&priv->rateadapter_timer);
-+ cancel_delayed_work(&priv->ieee80211->rate_adapter_wq);
-+ printk("force rate to %d\n", ratadapt);
-+ ieee->rate = ratadapt;
-+ }
-+ up(&priv->wx_sem);
-+ return 0;
-+}
-+
-+#ifdef ENABLE_TOSHIBA_CONFIG
-+static int r8180_wx_get_tblidx(struct net_device *dev,
-+ struct iw_request_info *info,
-+ union iwreq_data *wrqu, char *extra)
-+{
-+ struct r8180_priv *priv = ieee80211_priv(dev);
-+ //extern u8 chan_plan_index;
-+ //printk("=========>%s(), %x\n", __FUNCTION__, priv->channel_plan);
-+ down(&priv->wx_sem);
-+ put_user(priv->channel_plan, (u8*)wrqu->data.pointer);
-+ up(&priv->wx_sem);
-+ return 0;
-+
-+}
-+
-+//This func will be called after probe auto
-+static int r8180_wx_set_tbl (struct net_device *dev,
-+ struct iw_request_info *info,
-+ union iwreq_data *wrqu, char *extra)
-+{
-+ struct r8180_priv *priv = ieee80211_priv(dev);
-+ u8 len = 0;
-+ s8 err = -1;
-+ extern CHANNEL_LIST Current_tbl;
-+ down(&priv->wx_sem);
-+ if (!wrqu->data.pointer)
-+ {
-+ printk("user data pointer is null\n");
-+ goto exit;
-+ }
-+ len = wrqu->data.length;
-+ //printk("=========>%s(), len:%d\n", __FUNCTION__, len);
-+ //memset(&Current_tbl, 0, sizeof(CHANNEL_LIST));
-+ if (copy_from_user((u8*)&Current_tbl, (void*)wrqu->data.pointer, len))
-+ {
-+ printk("error copy from user\n");
-+ goto exit;
-+ }
-+ {
-+ int i;
-+ Current_tbl.Len = len;
-+ //printk("%d\n", Current_tbl.Len);
-+
-+ Dot11d_Init(priv->ieee80211);
-+ priv->ieee80211->bGlobalDomain = false;
-+ priv->ieee80211->bWorldWide13 = false;
-+
-+ //lzm add 081205
-+ priv->ieee80211->MinPassiveChnlNum=12;
-+ priv->ieee80211->IbssStartChnl= 10;
-+
-+ for (i=0; i<Current_tbl.Len; i++){
-+ //printk("%2d ", Current_tbl.Channel[i]);
-+ if(priv->channel_plan == COUNTRY_CODE_ETSI)
-+ {
-+ if(Current_tbl.Channel[i] <= 11)
-+ {
-+#ifdef ENABLE_DOT11D
-+ GET_DOT11D_INFO(priv->ieee80211)->channel_map[Current_tbl.Channel[i]] = 1;
-+#else
-+ priv->ieee80211->channel_map[Current_tbl.Channel[i]] = 1;
-+#endif
-+ }
-+ else if((Current_tbl.Channel[i] >= 11) && (Current_tbl.Channel[i] <= 13))
-+ {
-+#ifdef ENABLE_DOT11D
-+ GET_DOT11D_INFO(priv->ieee80211)->channel_map[Current_tbl.Channel[i]] = 2;
-+#else
-+ priv->ieee80211->channel_map[Current_tbl.Channel[i]] = 2;
-+#endif
-+ }
-+ }
-+ else
-+ {
-+ if(Current_tbl.Channel[i] <= 14)
-+ {
-+#ifdef ENABLE_DOT11D
-+ GET_DOT11D_INFO(priv->ieee80211)->channel_map[Current_tbl.Channel[i]] = 1;
-+#else
-+ priv->ieee80211->channel_map[Current_tbl.Channel[i]] = 1;
-+#endif
-+ }
-+ }
-+ }
-+#if 0
-+ printk("\n");
-+ for(i=1; i<MAX_CHANNEL_NUMBER; i++)
-+ {
-+#ifdef ENABLE_DOT11D
-+ printk("%2d ", GET_DOT11D_INFO(priv->ieee80211)->channel_map[i]);
-+#else
-+ printk("%2d ", priv->ieee80211->channel_map[i]);
-+#endif
-+ }
-+ printk("\n");
-+
-+#endif
-+ if(priv->ieee80211->proto_started)
-+ {//we need to restart protocol now if it was start before channel map
-+ ieee80211_softmac_stop_protocol(priv->ieee80211);
-+ //mdelay(1);
-+ ieee80211_softmac_start_protocol(priv->ieee80211);
-+ }
-+ }
-+ err = 0;
-+exit:
-+ up(&priv->wx_sem);
-+ return err;
-+
-+
-+}
-+
-+#endif
-+
-+
-+static iw_handler r8180_wx_handlers[] =
-+{
-+ NULL, /* SIOCSIWCOMMIT */
-+ r8180_wx_get_name, /* SIOCGIWNAME */
-+ dummy, /* SIOCSIWNWID */
-+ dummy, /* SIOCGIWNWID */
-+ r8180_wx_set_freq, /* SIOCSIWFREQ */
-+ r8180_wx_get_freq, /* SIOCGIWFREQ */
-+ r8180_wx_set_mode, /* SIOCSIWMODE */
-+ r8180_wx_get_mode, /* SIOCGIWMODE */
-+ r8180_wx_set_sens, /* SIOCSIWSENS */
-+ r8180_wx_get_sens, /* SIOCGIWSENS */
-+ NULL, /* SIOCSIWRANGE */
-+ rtl8180_wx_get_range, /* SIOCGIWRANGE */
-+ NULL, /* SIOCSIWPRIV */
-+ NULL, /* SIOCGIWPRIV */
-+ NULL, /* SIOCSIWSTATS */
-+ NULL, /* SIOCGIWSTATS */
-+ dummy, /* SIOCSIWSPY */
-+ dummy, /* SIOCGIWSPY */
-+ NULL, /* SIOCGIWTHRSPY */
-+ NULL, /* SIOCWIWTHRSPY */
-+ r8180_wx_set_wap, /* SIOCSIWAP */
-+ r8180_wx_get_wap, /* SIOCGIWAP */
-+ r8180_wx_set_mlme, //NULL, /* SIOCSIWMLME*/ /* -- hole -- */
-+ dummy, /* SIOCGIWAPLIST -- depricated */
-+ r8180_wx_set_scan, /* SIOCSIWSCAN */
-+ r8180_wx_get_scan, /* SIOCGIWSCAN */
-+ r8180_wx_set_essid, /* SIOCSIWESSID */
-+ r8180_wx_get_essid, /* SIOCGIWESSID */
-+ dummy, /* SIOCSIWNICKN */
-+ dummy, /* SIOCGIWNICKN */
-+ NULL, /* -- hole -- */
-+ NULL, /* -- hole -- */
-+ r8180_wx_set_rate, /* SIOCSIWRATE */
-+ r8180_wx_get_rate, /* SIOCGIWRATE */
-+ dummy, /* SIOCSIWRTS */
-+ dummy, /* SIOCGIWRTS */
-+ r8180_wx_set_frag, /* SIOCSIWFRAG */
-+ r8180_wx_get_frag, /* SIOCGIWFRAG */
-+ dummy, /* SIOCSIWTXPOW */
-+ dummy, /* SIOCGIWTXPOW */
-+ r8180_wx_set_retry, /* SIOCSIWRETRY */
-+ r8180_wx_get_retry, /* SIOCGIWRETRY */
-+ r8180_wx_set_enc, /* SIOCSIWENCODE */
-+ r8180_wx_get_enc, /* SIOCGIWENCODE */
-+ dummy, /* SIOCSIWPOWER */
-+ dummy, /* SIOCGIWPOWER */
-+ NULL, /*---hole---*/
-+ NULL, /*---hole---*/
-+ r8180_wx_set_gen_ie,//NULL, /* SIOCSIWGENIE */
-+ NULL, /* SIOCSIWGENIE */
-+ r8180_wx_set_auth,//NULL, /* SIOCSIWAUTH */
-+ NULL,//r8180_wx_get_auth,//NULL, /* SIOCSIWAUTH */
-+ r8180_wx_set_enc_ext, /* SIOCSIWENCODEEXT */
-+ NULL,//r8180_wx_get_enc_ext,//NULL, /* SIOCSIWENCODEEXT */
-+ NULL, /* SIOCSIWPMKSA */
-+ NULL, /*---hole---*/
-+};
-+
-+
-+static const struct iw_priv_args r8180_private_args[] = {
-+ {
-+ SIOCIWFIRSTPRIV + 0x0,
-+ IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "badcrc"
-+ },
-+
-+ {
-+ SIOCIWFIRSTPRIV + 0x1,
-+ IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "activescan"
-+
-+ },
-+ {
-+ SIOCIWFIRSTPRIV + 0x2,
-+ IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "rawtx"
-+ },
-+#ifdef JOHN_IOCTL
-+ {
-+ SIOCIWFIRSTPRIV + 0x3,
-+ IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "readRF"
-+ }
-+ ,
-+ {
-+ SIOCIWFIRSTPRIV + 0x4,
-+ IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "writeRF"
-+ }
-+ ,
-+ {
-+ SIOCIWFIRSTPRIV + 0x5,
-+ IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "readBB"
-+ }
-+ ,
-+ {
-+ SIOCIWFIRSTPRIV + 0x6,
-+ IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "writeBB"
-+ }
-+ ,
-+ {
-+ SIOCIWFIRSTPRIV + 0x7,
-+ IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "readnicb"
-+ }
-+ ,
-+ {
-+ SIOCIWFIRSTPRIV + 0x8,
-+ IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "writenicb"
-+ }
-+ ,
-+ {
-+ SIOCIWFIRSTPRIV + 0x9,
-+ IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "apinfo"
-+ },
-+#endif
-+ {
-+ SIOCIWFIRSTPRIV + 0xA,
-+ 0, IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED |1, "getradion"
-+ },
-+ {
-+ SIOCIWFIRSTPRIV + 0xB,
-+ IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "setradion"
-+ },
-+ {
-+ SIOCIWFIRSTPRIV + 0xC,
-+ IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "ratadpt"
-+ },
-+#ifdef ENABLE_TOSHIBA_CONFIG
-+ {
-+ SIOCIWFIRSTPRIV + 0xD,
-+ 0, IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, "gettblidx"
-+ },
-+ {
-+ SIOCIWFIRSTPRIV + 0xE,
-+ IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,0, "settblidx"
-+ },
-+
-+#endif
-+
-+};
-+
-+/*
-+ * Private ioctl interface information
-+
-+struct iw_priv_args
-+{
-+// __u32 cmd;
-+// __u16 set_args;
-+// __u16 get_args;
-+// char name[IFNAMSIZ];
-+//};
-+*/
-+//If get cmd's number is big,there may cause some problemes.
-+//So modified by Lawrence,071120
-+
-+static iw_handler r8180_private_handler[] = {
-+// r8180_wx_set_monitor, /* SIOCIWFIRSTPRIV */
-+ r8180_wx_set_crcmon, /*SIOCIWSECONDPRIV*/
-+// r8180_wx_set_forceassociate,
-+// r8180_wx_set_beaconinterval,
-+// r8180_wx_set_monitor_type,
-+ r8180_wx_set_scan_type,
-+ r8180_wx_set_rawtx,
-+
-+#if 0
-+#ifdef _RTL8187_EXT_PATCH_
-+ r8180_wx_get_meshinfo,
-+ r8180_wx_enable_mesh,
-+ r8180_wx_disable_mesh,
-+ r8180_wx_set_channel,
-+ r8180_wx_set_meshID,
-+
-+// r8180_wx_add_mac_allow,
-+// r8180_wx_get_mac_allow,
-+// r8180_wx_del_mac_allow,
-+ r8180_wx_add_mac_deny,
-+ r8180_wx_get_mac_deny,
-+ r8180_wx_del_mac_deny,
-+ r8180_wx_get_mesh_list,
-+ r8180_wx_mesh_scan,
-+ r8180_wx_join_mesh,
-+#endif
-+#endif
-+
-+#ifdef JOHN_IOCTL
-+ r8180_wx_read_regs,
-+ r8180_wx_write_regs,
-+ r8180_wx_read_bb,
-+ r8180_wx_write_bb,
-+ r8180_wx_read_nicb,
-+ r8180_wx_write_nicb,
-+ r8180_wx_get_ap_status,
-+#endif
-+ r8180_wx_get_radion,
-+ r8180_wx_set_radion,
-+ r8180_wx_set_ratadpt,
-+#ifdef ENABLE_TOSHIBA_CONFIG
-+ r8180_wx_get_tblidx,
-+ r8180_wx_set_tbl,
-+#endif
-+};
-+
-+#if WIRELESS_EXT >= 17
-+//WB modefied to show signal to GUI on 18-01-2008
-+static struct iw_statistics *r8180_get_wireless_stats(struct net_device *dev)
-+{
-+ struct r8180_priv *priv = ieee80211_priv(dev);
-+ struct ieee80211_device* ieee = priv->ieee80211;
-+ struct iw_statistics* wstats = &priv->wstats;
-+// struct ieee80211_network* target = NULL;
-+ int tmp_level = 0;
-+ int tmp_qual = 0;
-+ int tmp_noise = 0;
-+// unsigned long flag;
-+
-+ if (ieee->state < IEEE80211_LINKED)
-+ {
-+ wstats->qual.qual = 0;
-+ wstats->qual.level = 0;
-+ wstats->qual.noise = 0;
-+ wstats->qual.updated = IW_QUAL_ALL_UPDATED | IW_QUAL_DBM;
-+ return wstats;
-+ }
-+#if 0
-+ spin_lock_irqsave(&ieee->lock, flag);
-+ list_for_each_entry(target, &ieee->network_list, list)
-+ {
-+ if (is_same_network(target, &ieee->current_network))
-+ {
-+ printk("it's same network:%s\n", target->ssid);
-+#if 0
-+ if (!tmp_level)
-+ {
-+ tmp_level = target->stats.signalstrength;
-+ tmp_qual = target->stats.signal;
-+ }
-+ else
-+ {
-+
-+ tmp_level = (15*tmp_level + target->stats.signalstrength)/16;
-+ tmp_qual = (15*tmp_qual + target->stats.signal)/16;
-+ }
-+#else
-+ tmp_level = target->stats.signal;
-+ tmp_qual = target->stats.signalstrength;
-+ tmp_noise = target->stats.noise;
-+ printk("level:%d, qual:%d, noise:%d\n", tmp_level, tmp_qual, tmp_noise);
-+#endif
-+ break;
-+ }
-+ }
-+ spin_unlock_irqrestore(&ieee->lock, flag);
-+#endif
-+ tmp_level = (&ieee->current_network)->stats.signal;
-+ tmp_qual = (&ieee->current_network)->stats.signalstrength;
-+ tmp_noise = (&ieee->current_network)->stats.noise;
-+ //printk("level:%d, qual:%d, noise:%d\n", tmp_level, tmp_qual, tmp_noise);
-+
-+ wstats->qual.level = tmp_level;
-+ wstats->qual.qual = tmp_qual;
-+ wstats->qual.noise = tmp_noise;
-+ wstats->qual.updated = IW_QUAL_ALL_UPDATED| IW_QUAL_DBM;
-+ return wstats;
-+}
-+#endif
-+
-+
-+struct iw_handler_def r8180_wx_handlers_def={
-+ .standard = r8180_wx_handlers,
-+ .num_standard = sizeof(r8180_wx_handlers) / sizeof(iw_handler),
-+ .private = r8180_private_handler,
-+ .num_private = sizeof(r8180_private_handler) / sizeof(iw_handler),
-+ .num_private_args = sizeof(r8180_private_args) / sizeof(struct iw_priv_args),
-+#if WIRELESS_EXT >= 17
-+ .get_wireless_stats = r8180_get_wireless_stats,
-+#endif
-+ .private_args = (struct iw_priv_args *)r8180_private_args,
-+};
-+#ifdef _RTL8187_EXT_PATCH_
-+EXPORT_SYMBOL(r8180_wx_set_channel);
-+#endif
-diff -Nur linux-2.6.30.5.orig/drivers/net/wireless/rtl8187b/r8180_wx.h linux-2.6.30.5/drivers/net/wireless/rtl8187b/r8180_wx.h
---- linux-2.6.30.5.orig/drivers/net/wireless/rtl8187b/r8180_wx.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.30.5/drivers/net/wireless/rtl8187b/r8180_wx.h 2009-08-23 19:01:04.000000000 +0200
-@@ -0,0 +1,21 @@
-+/*
-+ This is part of rtl8180 OpenSource driver - v 0.3
-+ Copyright (C) Andrea Merello 2004 <andreamrl@tiscali.it>
-+ Released under the terms of GPL (General Public Licence)
-+
-+ Parts of this driver are based on the GPL part of the official realtek driver
-+ Parts of this driver are based on the rtl8180 driver skeleton from Patric Schenke & Andres Salomon
-+ Parts of this driver are based on the Intel Pro Wireless 2100 GPL driver
-+
-+ We want to tanks the Authors of such projects and the Ndiswrapper project Authors.
-+*/
-+
-+/* this file (will) contains wireless extension handlers*/
-+
-+#ifndef R8180_WX_H
-+#define R8180_WX_H
-+#include <linux/wireless.h>
-+#include "ieee80211/ieee80211.h"
-+extern struct iw_handler_def r8180_wx_handlers_def;
-+
-+#endif
-diff -Nur linux-2.6.30.5.orig/drivers/net/wireless/rtl8187b/r8187_core.c linux-2.6.30.5/drivers/net/wireless/rtl8187b/r8187_core.c
---- linux-2.6.30.5.orig/drivers/net/wireless/rtl8187b/r8187_core.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.30.5/drivers/net/wireless/rtl8187b/r8187_core.c 2009-08-23 19:01:04.000000000 +0200
-@@ -0,0 +1,7194 @@
-+/*
-+ This is part of rtl8187 OpenSource driver - v 0.1
-+ Copyright (C) Andrea Merello 2005 <andreamrl@tiscali.it>
-+ Released under the terms of GPL (General Public License)
-+
-+
-+ Parts of this driver are based on the rtl8180 driver skeleton
-+ from Patric Schenke & Andres Salomon.
-+
-+ Parts of this driver are based on the Intel Pro Wireless 2*00 GPL drivers.
-+
-+ some ideas might be derived from David Young rtl8180 netbsd driver.
-+
-+ Parts of the usb code are from the r8150.c driver in linux kernel
-+
-+ Some ideas borrowed from the 8139too.c driver included in linux kernel.
-+
-+ We (I?) want to thanks the Authors of those projecs and also the
-+ Ndiswrapper's project Authors.
-+
-+ A special big thanks goes also to Realtek corp. for their help in my
-+ attempt to add RTL8187 and RTL8225 support, and to David Young also.
-+
-+ - Please note that this file is a modified version from rtl8180-sa2400
-+ drv. So some other people have contributed to this project, and they are
-+ thanked in the rtl8180-sa2400 CHANGELOG.
-+*/
-+
-+#undef LOOP_TEST
-+#undef DUMP_RX
-+#undef DUMP_TX
-+#undef DEBUG_TX_DESC2
-+#undef RX_DONT_PASS_UL
-+#undef DEBUG_EPROM
-+#undef DEBUG_RX_VERBOSE
-+#undef DUMMY_RX
-+#undef DEBUG_ZERO_RX
-+#undef DEBUG_RX_SKB
-+#undef DEBUG_TX_FRAG
-+#undef DEBUG_RX_FRAG
-+#undef DEBUG_TX_FILLDESC
-+#undef DEBUG_TX
-+#undef DEBUG_IRQ
-+#undef DEBUG_RX
-+#undef DEBUG_RXALLOC
-+#undef DEBUG_REGISTERS
-+#undef DEBUG_RING
-+#undef DEBUG_IRQ_TASKLET
-+#undef DEBUG_TX_ALLOC
-+#undef DEBUG_TX_DESC
-+#undef CONFIG_SOFT_BEACON
-+#undef DEBUG_RW_REGISTER
-+
-+#define CONFIG_RTL8180_IO_MAP
-+//#define CONFIG_SOFT_BEACON
-+//#define DEBUG_RW_REGISTER
-+
-+#include <linux/dmapool.h>
-+
-+#include "r8180_hw.h"
-+#include "r8187.h"
-+#include "r8180_rtl8225.h" /* RTL8225 Radio frontend */
-+#include "r8180_93cx6.h" /* Card EEPROM */
-+#include "r8180_wx.h"
-+#include "r8180_dm.h"
-+
-+#include <linux/usb.h>
-+// FIXME: check if 2.6.7 is ok
-+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,7))
-+#define usb_kill_urb usb_unlink_urb
-+#endif
-+
-+#ifdef CONFIG_RTL8180_PM
-+#include "r8180_pm.h"
-+#endif
-+
-+#ifdef ENABLE_DOT11D
-+#include "dot11d.h"
-+#endif
-+
-+#ifndef USB_VENDOR_ID_REALTEK
-+#define USB_VENDOR_ID_REALTEK 0x0bda
-+#endif
-+#ifndef USB_VENDOR_ID_NETGEAR
-+#define USB_VENDOR_ID_NETGEAR 0x0846
-+#endif
-+
-+#define TXISR_SELECT(priority) ((priority == MANAGE_PRIORITY)?rtl8187_managetx_isr:\
-+ (priority == BEACON_PRIORITY)?rtl8187_beacontx_isr: \
-+ (priority == VO_PRIORITY)?rtl8187_votx_isr: \
-+ (priority == VI_PRIORITY)?rtl8187_vitx_isr:\
-+ (priority == BE_PRIORITY)?rtl8187_betx_isr:rtl8187_bktx_isr)
-+
-+static struct usb_device_id rtl8187_usb_id_tbl[] = {
-+ {USB_DEVICE(USB_VENDOR_ID_REALTEK, 0x8187)},
-+ {USB_DEVICE(USB_VENDOR_ID_REALTEK, 0x8189)},
-+// {USB_DEVICE_VER(USB_VENDOR_ID_REALTEK, 0x8187,0x0200,0x0200)},
-+ {USB_DEVICE(USB_VENDOR_ID_NETGEAR, 0x6100)},
-+ {USB_DEVICE(USB_VENDOR_ID_NETGEAR, 0x6a00)},
-+ {USB_DEVICE(USB_VENDOR_ID_REALTEK, 0x8197)},
-+ {USB_DEVICE(USB_VENDOR_ID_REALTEK, 0x8198)},
-+ {}
-+};
-+
-+static char* ifname = "wlan%d";
-+#if 0
-+static int hwseqnum = 0;
-+static int hwwep = 0;
-+#endif
-+static int channels = 0x3fff;
-+//static int channels = 0x7ff;// change by thomas, use 1 - 11 channel 0907-2007
-+#define eqMacAddr(a,b) ( ((a)[0]==(b)[0] && (a)[1]==(b)[1] && (a)[2]==(b)[2] && (a)[3]==(b)[3] && (a)[4]==(b)[4] && (a)[5]==(b)[5]) ? 1:0 )
-+//by amy for rate adaptive
-+#define DEFAULT_RATE_ADAPTIVE_TIMER_PERIOD 300
-+//by amy for rate adaptive
-+//by amy for ps
-+#define IEEE80211_WATCH_DOG_TIME 2000
-+//by amy for ps
-+MODULE_LICENSE("GPL");
-+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0))
-+MODULE_VERSION("V 1.1");
-+#endif
-+MODULE_DEVICE_TABLE(usb, rtl8187_usb_id_tbl);
-+MODULE_AUTHOR("Realsil Wlan");
-+MODULE_DESCRIPTION("Linux driver for Realtek RTL8187 WiFi cards");
-+
-+#if 0
-+MODULE_PARM(ifname,"s");
-+MODULE_PARM_DESC(devname," Net interface name, wlan%d=default");
-+
-+MODULE_PARM(hwseqnum,"i");
-+MODULE_PARM_DESC(hwseqnum," Try to use hardware 802.11 header sequence numbers. Zero=default");
-+
-+MODULE_PARM(hwwep,"i");
-+MODULE_PARM_DESC(hwwep," Try to use hardware WEP support. Still broken and not available on all cards");
-+
-+MODULE_PARM(channels,"i");
-+MODULE_PARM_DESC(channels," Channel bitmask for specific locales. NYI");
-+#endif
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 9)
-+module_param(ifname, charp, S_IRUGO|S_IWUSR );
-+//module_param(hwseqnum,int, S_IRUGO|S_IWUSR);
-+//module_param(hwwep,int, S_IRUGO|S_IWUSR);
-+module_param(channels,int, S_IRUGO|S_IWUSR);
-+#else
-+MODULE_PARM(ifname, "s");
-+//MODULE_PARM(hwseqnum,"i");
-+//MODULE_PARM(hwwep,"i");
-+MODULE_PARM(channels,"i");
-+#endif
-+
-+MODULE_PARM_DESC(devname," Net interface name, wlan%d=default");
-+//MODULE_PARM_DESC(hwseqnum," Try to use hardware 802.11 header sequence numbers. Zero=default");
-+//MODULE_PARM_DESC(hwwep," Try to use hardware WEP support. Still broken and not available on all cards");
-+MODULE_PARM_DESC(channels," Channel bitmask for specific locales. NYI");
-+
-+#if LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0)
-+static int __devinit rtl8187_usb_probe(struct usb_interface *intf,
-+ const struct usb_device_id *id);
-+static void __devexit rtl8187_usb_disconnect(struct usb_interface *intf);
-+#else
-+static void *__devinit rtl8187_usb_probe(struct usb_device *udev,unsigned int ifnum,
-+ const struct usb_device_id *id);
-+static void __devexit rtl8187_usb_disconnect(struct usb_device *udev, void *ptr);
-+#endif
-+
-+
-+static struct usb_driver rtl8187_usb_driver = {
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 15)
-+ .owner = THIS_MODULE,
-+#endif
-+ .name = RTL8187_MODULE_NAME, /* Driver name */
-+ .id_table = rtl8187_usb_id_tbl, /* PCI_ID table */
-+ .probe = rtl8187_usb_probe, /* probe fn */
-+ .disconnect = rtl8187_usb_disconnect, /* remove fn */
-+#if LINUX_VERSION_CODE > KERNEL_VERSION(2, 5, 0)
-+#ifdef CONFIG_RTL8180_PM
-+ .suspend = rtl8187_suspend, /* PM suspend fn */
-+ .resume = rtl8187_resume, /* PM resume fn */
-+#else
-+ .suspend = NULL, /* PM suspend fn */
-+ .resume = NULL, /* PM resume fn */
-+#endif
-+#endif
-+};
-+
-+#ifdef JOHN_HWSEC
-+void CAM_mark_invalid(struct net_device *dev, u8 ucIndex)
-+{
-+ u32 ulContent=0;
-+ u32 ulCommand=0;
-+ u32 ulEncAlgo=CAM_AES;
-+
-+ // keyid must be set in config field
-+ ulContent |= (ucIndex&3) | ((u16)(ulEncAlgo)<<2);
-+
-+ ulContent |= BIT15;
-+ // polling bit, and No Write enable, and address
-+ ulCommand= CAM_CONTENT_COUNT*ucIndex;
-+ ulCommand= ulCommand | BIT31|BIT16;
-+ // write content 0 is equall to mark invalid
-+
-+ write_nic_dword(dev, WCAMI, ulContent); //delay_ms(40);
-+ //RT_TRACE(COMP_SEC, DBG_LOUD, ("CAM_mark_invalid(): WRITE A4: %x \n",ulContent));
-+ write_nic_dword(dev, RWCAM, ulCommand); //delay_ms(40);
-+ //RT_TRACE(COMP_SEC, DBG_LOUD, ("CAM_mark_invalid(): WRITE A0: %x \n",ulCommand));
-+}
-+
-+void CAM_empty_entry(struct net_device *dev, u8 ucIndex)
-+{
-+ u32 ulCommand=0;
-+ u32 ulContent=0;
-+ u8 i;
-+ u32 ulEncAlgo=CAM_AES;
-+
-+ for(i=0;i<6;i++)
-+ {
-+
-+ // filled id in CAM config 2 byte
-+ if( i == 0)
-+ {
-+ ulContent |=(ucIndex & 0x03) | (ulEncAlgo<<2);
-+ ulContent |= BIT15;
-+
-+ }
-+ else
-+ {
-+ ulContent = 0;
-+ }
-+ // polling bit, and No Write enable, and address
-+ ulCommand= CAM_CONTENT_COUNT*ucIndex+i;
-+ ulCommand= ulCommand | BIT31|BIT16;
-+ // write content 0 is equall to mark invalid
-+ write_nic_dword(dev, WCAMI, ulContent); //delay_ms(40);
-+ //RT_TRACE(COMP_SEC, DBG_LOUD, ("CAM_empty_entry(): WRITE A4: %x \n",ulContent));
-+ write_nic_dword(dev, RWCAM, ulCommand); //delay_ms(40);
-+ //RT_TRACE(COMP_SEC, DBG_LOUD, ("CAM_empty_entry(): WRITE A0: %x \n",ulCommand));
-+ }
-+}
-+
-+void CamResetAllEntry(struct net_device *dev)
-+{
-+ u8 ucIndex;
-+
-+ //2004/02/11 In static WEP, OID_ADD_KEY or OID_ADD_WEP are set before STA associate to AP.
-+ // However, ResetKey is called on OID_802_11_INFRASTRUCTURE_MODE and MlmeAssociateRequest
-+ // In this condition, Cam can not be reset because upper layer will not set this static key again.
-+ //if(Adapter->EncAlgorithm == WEP_Encryption)
-+ // return;
-+ //debug
-+ //DbgPrint("========================================\n");
-+ //DbgPrint(" Call ResetAllEntry \n");
-+ //DbgPrint("========================================\n\n");
-+
-+ for(ucIndex=0;ucIndex<TOTAL_CAM_ENTRY;ucIndex++)
-+ CAM_mark_invalid(dev, ucIndex);
-+ for(ucIndex=0;ucIndex<TOTAL_CAM_ENTRY;ucIndex++)
-+ CAM_empty_entry(dev, ucIndex);
-+
-+}
-+
-+
-+void write_cam(struct net_device *dev, u8 addr, u32 data)
-+{
-+ write_nic_dword(dev, WCAMI, data);
-+ write_nic_dword(dev, RWCAM, BIT31|BIT16|(addr&0xff) );
-+}
-+u32 read_cam(struct net_device *dev, u8 addr)
-+{
-+ write_nic_dword(dev, RWCAM, 0x80000000|(addr&0xff) );
-+ return read_nic_dword(dev, 0xa8);
-+}
-+#endif /*JOHN_HWSEC*/
-+
-+#ifdef DEBUG_RW_REGISTER
-+//lzm add for write time out test
-+void add_into_rw_registers(struct net_device *dev, u32 addr, u32 cont, u8 flag)
-+{
-+ struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
-+ int reg_index = (priv->write_read_register_index % 200) ;
-+
-+ priv->write_read_registers[reg_index].address = 0;
-+ priv->write_read_registers[reg_index].content = 0;
-+ priv->write_read_registers[reg_index].flag = 0;
-+
-+ priv->write_read_registers[reg_index].address = addr;
-+ priv->write_read_registers[reg_index].content = cont;
-+ priv->write_read_registers[reg_index].flag = flag;
-+
-+ priv->write_read_register_index = (priv->write_read_register_index + 1) % 200;
-+}
-+
-+bool print_once = 0;
-+
-+void print_rw_registers(struct net_device *dev)
-+{
-+ struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
-+ int reg_index = 0;
-+ int watchdog = 0;
-+ if(print_once == false)
-+ {
-+ print_once = true;
-+ for(reg_index = ((priv->write_read_register_index + 1) % 200); watchdog <= 199; reg_index++)
-+ {
-+ watchdog++;
-+ printk("====>reg_addr:0x%x, reg_cont:0x%x, read_or_write:0x%d\n",
-+ priv->write_read_registers[reg_index].address,
-+ priv->write_read_registers[reg_index].content,
-+ priv->write_read_registers[reg_index].flag);
-+ }
-+ }
-+}
-+//lzm add for write time out test
-+#endif
-+
-+#ifdef CPU_64BIT
-+void write_nic_byte_E(struct net_device *dev, int indx, u8 data)
-+{
-+ int status;
-+ struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
-+ struct usb_device *udev = priv->udev;
-+
-+ status = usb_control_msg(udev, usb_sndctrlpipe(udev, 0),
-+ RTL8187_REQ_SET_REGS, RTL8187_REQT_WRITE,
-+ indx|0xfe00, 0, &data, 1, HZ / 2);
-+
-+//lzm add for write time out test
-+#ifdef DEBUG_RW_REGISTER
-+ add_into_rw_registers(dev, indx, data, 2);
-+#endif
-+
-+ if (status < 0)
-+ {
-+ printk("write_nic_byte_E TimeOut!addr:%x, status:%x\n", indx, status);
-+#ifdef DEBUG_RW_REGISTER
-+ print_rw_registers(dev);
-+#endif
-+ }
-+}
-+
-+u8 read_nic_byte_E(struct net_device *dev, int indx)
-+{
-+ int status;
-+ u8 data, *buf;
-+ dma_addr_t dma_handle;
-+ struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
-+ struct usb_device *udev = priv->udev;
-+
-+ buf = dma_pool_alloc(priv->usb_pool, GFP_ATOMIC, &dma_handle);
-+ if (!buf) {
-+ printk("read_nic_byte_E out of memory\n");
-+ return -ENOMEM;
-+ }
-+ status = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0),
-+ RTL8187_REQ_GET_REGS, RTL8187_REQT_READ,
-+ indx|0xfe00, 0, buf, 1, HZ / 2);
-+//lzm add for write time out test
-+#ifdef DEBUG_RW_REGISTER
-+ add_into_rw_registers(dev, indx, buf[0], 1);
-+#endif
-+
-+ if (status < 0)
-+ {
-+ printk("read_nic_byte_E TimeOut!addr:%x, status:%x\n",indx, status);
-+#ifdef DEBUG_RW_REGISTER
-+ print_rw_registers(dev);
-+#endif
-+ }
-+
-+ data = buf[0];
-+ dma_pool_free(priv->usb_pool, buf, dma_handle);
-+ return data;
-+}
-+
-+void write_nic_byte(struct net_device *dev, int indx, u8 data)
-+{
-+ int status;
-+
-+ struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
-+ struct usb_device *udev = priv->udev;
-+
-+ status = usb_control_msg(udev, usb_sndctrlpipe(udev, 0),
-+ RTL8187_REQ_SET_REGS, RTL8187_REQT_WRITE,
-+ (indx&0xff)|0xff00, (indx>>8)&0x03, &data, 1, HZ / 2);
-+
-+//lzm add for write time out test
-+#ifdef DEBUG_RW_REGISTER
-+ add_into_rw_registers(dev, indx, data, 2);
-+#endif
-+ if (status < 0)
-+ {
-+ printk("write_nic_byte TimeOut!addr:%x, status:%x\n",indx, status);
-+#ifdef DEBUG_RW_REGISTER
-+ print_rw_registers(dev);
-+#endif
-+ }
-+
-+
-+}
-+
-+void write_nic_word(struct net_device *dev, int indx, u16 data)
-+{
-+
-+ int status;
-+
-+ struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
-+ struct usb_device *udev = priv->udev;
-+
-+ status = usb_control_msg(udev, usb_sndctrlpipe(udev, 0),
-+ RTL8187_REQ_SET_REGS, RTL8187_REQT_WRITE,
-+ (indx&0xff)|0xff00, (indx>>8)&0x03, &data, 2, HZ / 2);
-+
-+//lzm add for write time out test
-+#ifdef DEBUG_RW_REGISTER
-+ add_into_rw_registers(dev, indx, data, 2);
-+
-+ if(priv->write_read_register_index == 199)
-+ {
-+ //print_rw_registers(dev);
-+ }
-+#endif
-+ if (status < 0)
-+ {
-+ printk("write_nic_word TimeOut!addr:%x, status:%x\n",indx, status);
-+#ifdef DEBUG_RW_REGISTER
-+ print_rw_registers(dev);
-+#endif
-+ }
-+
-+}
-+
-+void write_nic_dword(struct net_device *dev, int indx, u32 data)
-+{
-+
-+ int status;
-+
-+ struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
-+ struct usb_device *udev = priv->udev;
-+
-+ status = usb_control_msg(udev, usb_sndctrlpipe(udev, 0),
-+ RTL8187_REQ_SET_REGS, RTL8187_REQT_WRITE,
-+ (indx&0xff)|0xff00, (indx>>8)&0x03, &data, 4, HZ / 2);
-+//lzm add for write time out test
-+#ifdef DEBUG_RW_REGISTER
-+ add_into_rw_registers(dev, indx, data, 2);
-+#endif
-+
-+
-+ if (status < 0)
-+ {
-+ printk("write_nic_dword TimeOut!addr:%x, status:%x\n",indx, status);
-+#ifdef DEBUG_RW_REGISTER
-+ print_rw_registers(dev);
-+#endif
-+ }
-+
-+}
-+
-+ u8 read_nic_byte(struct net_device *dev, int indx)
-+{
-+ u8 data, *buf;
-+ int status;
-+ struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
-+ struct usb_device *udev = priv->udev;
-+ dma_addr_t dma_handle;
-+
-+ buf = dma_pool_alloc(priv->usb_pool, GFP_ATOMIC, &dma_handle);
-+ if (!buf) {
-+ printk("read_nic_byte: out of memory\n");
-+ return -ENOMEM;
-+ }
-+ status = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0),
-+ RTL8187_REQ_GET_REGS, RTL8187_REQT_READ,
-+ (indx&0xff)|0xff00, (indx>>8)&0x03, buf, 1, HZ / 2);
-+//lzm add for write time out test
-+#ifdef DEBUG_RW_REGISTER
-+ add_into_rw_registers(dev, indx, buf[0], 1);
-+#endif
-+
-+ if (status < 0)
-+ {
-+ printk("read_nic_byte TimeOut!addr:%x, status:%x\n",indx, status);
-+#ifdef DEBUG_RW_REGISTER
-+ print_rw_registers(dev);
-+#endif
-+ }
-+
-+ data = buf[0];
-+ dma_pool_free(priv->usb_pool, buf, dma_handle);
-+ return data;
-+}
-+
-+u16 read_nic_word(struct net_device *dev, int indx)
-+{
-+ u16 data, *buf;
-+ int status;
-+ struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
-+ struct usb_device *udev = priv->udev;
-+ dma_addr_t dma_handle;
-+
-+ buf = dma_pool_alloc(priv->usb_pool, GFP_ATOMIC, &dma_handle);
-+ if (!buf) {
-+ printk("read_nic_word: out of memory\n");
-+ return -ENOMEM;
-+ }
-+ status = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0),
-+ RTL8187_REQ_GET_REGS, RTL8187_REQT_READ,
-+ (indx&0xff)|0xff00, (indx>>8)&0x03, buf, 2, HZ / 2);
-+//lzm add for write time out test
-+#ifdef DEBUG_RW_REGISTER
-+ add_into_rw_registers(dev, indx, buf[0], 1);
-+#endif
-+
-+ if (status < 0)
-+ {
-+ printk("read_nic_word TimeOut!addr:%x, status:%x\n",indx, status);
-+#ifdef DEBUG_RW_REGISTER
-+ print_rw_registers(dev);
-+#endif
-+ }
-+
-+
-+ data = buf[0];
-+ dma_pool_free(priv->usb_pool, buf, dma_handle);
-+ return data;
-+}
-+
-+u32 read_nic_dword(struct net_device *dev, int indx)
-+{
-+ u32 data, *buf;
-+ int status;
-+ dma_addr_t dma_handle;
-+// int result;
-+
-+ struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
-+ struct usb_device *udev = priv->udev;
-+
-+ buf = dma_pool_alloc(priv->usb_pool, GFP_ATOMIC, &dma_handle);
-+ if (!buf){
-+ printk("read_nic_dword: out of memory\n");
-+ return -ENOMEM;
-+ }
-+ status = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0),
-+ RTL8187_REQ_GET_REGS, RTL8187_REQT_READ,
-+ (indx&0xff)|0xff00, (indx>>8)&0x03, buf, 4, HZ / 2);
-+//lzm add for write time out test
-+#ifdef DEBUG_RW_REGISTER
-+ add_into_rw_registers(dev, indx, buf[0], 1);
-+#endif
-+
-+ if (status < 0)
-+ {
-+ printk("read_nic_dword TimeOut!addr:%x, status:%x\n",indx, status);
-+#ifdef DEBUG_RW_REGISTER
-+ print_rw_registers(dev);
-+#endif
-+ }
-+
-+
-+
-+ data = buf[0];
-+ dma_pool_free(priv->usb_pool, buf, dma_handle);
-+ return data;
-+}
-+#else
-+void write_nic_byte_E(struct net_device *dev, int indx, u8 data)
-+{
-+ int status;
-+ struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
-+ struct usb_device *udev = priv->udev;
-+
-+ status = usb_control_msg(udev, usb_sndctrlpipe(udev, 0),
-+ RTL8187_REQ_SET_REGS, RTL8187_REQT_WRITE,
-+ indx|0xfe00, 0, &data, 1, HZ / 2);
-+
-+ if (status < 0)
-+ {
-+ printk("write_nic_byte_E TimeOut!addr:0x%x,val:0x%x, status:%x\n", indx,data,status);
-+ }
-+}
-+
-+u8 read_nic_byte_E(struct net_device *dev, int indx)
-+{
-+ int status;
-+ u8 data = 0;
-+ u8 buf[64];
-+ struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
-+ struct usb_device *udev = priv->udev;
-+
-+ status = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0),
-+ RTL8187_REQ_GET_REGS, RTL8187_REQT_READ,
-+ indx|0xfe00, 0, buf, 1, HZ / 2);
-+
-+ if (status < 0)
-+ {
-+ printk("read_nic_byte_E TimeOut!addr:0x%x, status:%x\n", indx, status);
-+ }
-+
-+ data = *(u8*)buf;
-+ return data;
-+}
-+
-+void write_nic_byte(struct net_device *dev, int indx, u8 data)
-+{
-+ int status;
-+
-+ struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
-+ struct usb_device *udev = priv->udev;
-+
-+ status = usb_control_msg(udev, usb_sndctrlpipe(udev, 0),
-+ RTL8187_REQ_SET_REGS, RTL8187_REQT_WRITE,
-+ (indx&0xff)|0xff00, (indx>>8)&0x03, &data, 1, HZ / 2);
-+
-+ if (status < 0)
-+ {
-+ printk("write_nic_byte TimeOut!addr:0x%x,val:0x%x, status:%x\n", indx,data, status);
-+ }
-+
-+
-+}
-+
-+void write_nic_word(struct net_device *dev, int indx, u16 data)
-+{
-+
-+ int status;
-+
-+ struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
-+ struct usb_device *udev = priv->udev;
-+
-+ status = usb_control_msg(udev, usb_sndctrlpipe(udev, 0),
-+ RTL8187_REQ_SET_REGS, RTL8187_REQT_WRITE,
-+ (indx&0xff)|0xff00, (indx>>8)&0x03, &data, 2, HZ / 2);
-+
-+ if (status < 0)
-+ {
-+ printk("write_nic_word TimeOut!addr:0x%x,val:0x%x, status:%x\n", indx,data, status);
-+ }
-+
-+}
-+
-+void write_nic_dword(struct net_device *dev, int indx, u32 data)
-+{
-+
-+ int status;
-+
-+ struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
-+ struct usb_device *udev = priv->udev;
-+
-+ status = usb_control_msg(udev, usb_sndctrlpipe(udev, 0),
-+ RTL8187_REQ_SET_REGS, RTL8187_REQT_WRITE,
-+ (indx&0xff)|0xff00, (indx>>8)&0x03, &data, 4, HZ / 2);
-+
-+
-+ if (status < 0)
-+ {
-+ printk("write_nic_dword TimeOut!addr:0x%x,val:0x%x, status:%x\n", indx,data, status);
-+ }
-+
-+}
-+
-+u8 read_nic_byte(struct net_device *dev, int indx)
-+{
-+ u8 data = 0;
-+ u8 buf[64];
-+ int status;
-+ struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
-+ struct usb_device *udev = priv->udev;
-+
-+ status = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0),
-+ RTL8187_REQ_GET_REGS, RTL8187_REQT_READ,
-+ (indx&0xff)|0xff00, (indx>>8)&0x03, buf, 1, HZ / 2);
-+
-+ if (status < 0)
-+ {
-+ printk("read_nic_byte TimeOut!addr:0x%x,status:%x\n", indx,status);
-+ }
-+
-+
-+ data = *(u8*)buf;
-+ return data;
-+}
-+
-+u16 read_nic_word(struct net_device *dev, int indx)
-+{
-+ u16 data = 0;
-+ u8 buf[64];
-+ int status;
-+ struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
-+ struct usb_device *udev = priv->udev;
-+
-+ status = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0),
-+ RTL8187_REQ_GET_REGS, RTL8187_REQT_READ,
-+ (indx&0xff)|0xff00, (indx>>8)&0x03, buf, 2, HZ / 2);
-+
-+ if (status < 0)
-+ {
-+ printk("read_nic_word TimeOut!addr:0x%x,status:%x\n", indx,status);
-+ }
-+
-+ data = *(u16*)buf;
-+ return data;
-+}
-+
-+u32 read_nic_dword(struct net_device *dev, int indx)
-+{
-+ u32 data = 0;
-+ u8 buf[64];
-+ int status;
-+
-+ struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
-+ struct usb_device *udev = priv->udev;
-+
-+ status = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0),
-+ RTL8187_REQ_GET_REGS, RTL8187_REQT_READ,
-+ (indx&0xff)|0xff00, (indx>>8)&0x03, buf, 4, HZ / 2);
-+
-+ if (status < 0)
-+ {
-+ printk("read_nic_dword TimeOut!addr:0x%x,status:%x\n", indx, status);
-+ }
-+
-+
-+ data = *(u32*)buf;
-+ return data;
-+}
-+#endif
-+
-+
-+u8 read_phy_cck(struct net_device *dev, u8 adr);
-+u8 read_phy_ofdm(struct net_device *dev, u8 adr);
-+/* this might still called in what was the PHY rtl8185/rtl8187 common code
-+ * plans are to possibilty turn it again in one common code...
-+ */
-+inline void force_pci_posting(struct net_device *dev)
-+{
-+}
-+
-+
-+static struct net_device_stats *rtl8180_stats(struct net_device *dev);
-+void rtl8180_commit(struct net_device *dev);
-+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20))
-+void rtl8180_restart(struct work_struct *work);
-+#else
-+void rtl8180_restart(struct net_device *dev);
-+#endif
-+/****************************************************************************
-+ -----------------------------PROCFS STUFF-------------------------
-+*****************************************************************************/
-+
-+static struct proc_dir_entry *rtl8180_proc = NULL;
-+static int proc_get_stats_ap(char *page, char **start,
-+ off_t offset, int count,
-+ int *eof, void *data)
-+{
-+ struct net_device *dev = data;
-+ struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
-+ struct ieee80211_device *ieee = priv->ieee80211;
-+ struct ieee80211_network *target;
-+
-+ int len = 0;
-+
-+ list_for_each_entry(target, &ieee->network_list, list) {
-+
-+ len += snprintf(page + len, count - len,
-+ "%s ", target->ssid);
-+ len += snprintf(page + len, count - len,
-+ "%ld ", (jiffies-target->last_scanned)/HZ);
-+
-+
-+
-+ if(target->wpa_ie_len>0 || target->rsn_ie_len>0){
-+ len += snprintf(page + len, count - len,
-+ "WPA\n");
-+ }
-+ else{
-+ len += snprintf(page + len, count - len,
-+ "non_WPA\n");
-+ }
-+
-+ }
-+
-+ *eof = 1;
-+ return len;
-+}
-+
-+static int proc_get_registers(char *page, char **start,
-+ off_t offset, int count,
-+ int *eof, void *data)
-+{
-+ struct net_device *dev = data;
-+
-+ int len = 0;
-+ int i,n;
-+
-+ int max=0xff;
-+
-+ /* This dump the current register page */
-+len += snprintf(page + len, count - len,
-+ "\n####################page 0##################\n ");
-+
-+ for(n=0;n<=max;)
-+ {
-+ //printk( "\nD: %2x> ", n);
-+ len += snprintf(page + len, count - len,
-+ "\nD: %2x > ",n);
-+
-+ for(i=0;i<16 && n<=max;i++,n++)
-+ len += snprintf(page + len, count - len,
-+ "%2x ",read_nic_byte(dev,n));
-+
-+ // printk("%2x ",read_nic_byte(dev,n));
-+ }
-+ len += snprintf(page + len, count - len,"\n");
-+len += snprintf(page + len, count - len,
-+ "\n####################page 1##################\n ");
-+ for(n=0;n<=max;)
-+ {
-+ //printk( "\nD: %2x> ", n);
-+ len += snprintf(page + len, count - len,
-+ "\nD: %2x > ",n);
-+
-+ for(i=0;i<16 && n<=max;i++,n++)
-+ len += snprintf(page + len, count - len,
-+ "%2x ",read_nic_byte(dev,0x100|n));
-+
-+ // printk("%2x ",read_nic_byte(dev,n));
-+ }
-+len += snprintf(page + len, count - len,
-+ "\n####################page 2##################\n ");
-+ for(n=0;n<=max;)
-+ {
-+ //printk( "\nD: %2x> ", n);
-+ len += snprintf(page + len, count - len,
-+ "\nD: %2x > ",n);
-+
-+ for(i=0;i<16 && n<=max;i++,n++)
-+ len += snprintf(page + len, count - len,
-+ "%2x ",read_nic_byte(dev,0x200|n));
-+
-+ // printk("%2x ",read_nic_byte(dev,n));
-+ }
-+
-+
-+
-+ *eof = 1;
-+ return len;
-+
-+}
-+
-+
-+static int proc_get_cck_reg(char *page, char **start,
-+ off_t offset, int count,
-+ int *eof, void *data)
-+{
-+ struct net_device *dev = data;
-+
-+ int len = 0;
-+ int i,n;
-+
-+ int max = 0x5F;
-+
-+ /* This dump the current register page */
-+ for(n=0;n<=max;)
-+ {
-+ //printk( "\nD: %2x> ", n);
-+ len += snprintf(page + len, count - len,
-+ "\nD: %2x > ",n);
-+
-+ for(i=0;i<16 && n<=max;i++,n++)
-+ len += snprintf(page + len, count - len,
-+ "%2x ",read_phy_cck(dev,n));
-+
-+ // printk("%2x ",read_nic_byte(dev,n));
-+ }
-+ len += snprintf(page + len, count - len,"\n");
-+
-+
-+ *eof = 1;
-+ return len;
-+
-+}
-+
-+
-+static int proc_get_ofdm_reg(char *page, char **start,
-+ off_t offset, int count,
-+ int *eof, void *data)
-+{
-+ struct net_device *dev = data;
-+
-+ int len = 0;
-+ int i,n;
-+
-+ //int max=0xff;
-+ int max = 0x40;
-+
-+ /* This dump the current register page */
-+ for(n=0;n<=max;)
-+ {
-+ //printk( "\nD: %2x> ", n);
-+ len += snprintf(page + len, count - len,
-+ "\nD: %2x > ",n);
-+
-+ for(i=0;i<16 && n<=max;i++,n++)
-+ len += snprintf(page + len, count - len,
-+ "%2x ",read_phy_ofdm(dev,n));
-+
-+ // printk("%2x ",read_nic_byte(dev,n));
-+ }
-+ len += snprintf(page + len, count - len,"\n");
-+
-+
-+
-+ *eof = 1;
-+ return len;
-+
-+}
-+
-+
-+#if 0
-+static int proc_get_stats_hw(char *page, char **start,
-+ off_t offset, int count,
-+ int *eof, void *data)
-+{
-+ struct net_device *dev = data;
-+ struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
-+
-+ int len = 0;
-+
-+ len += snprintf(page + len, count - len,
-+ "NIC int: %lu\n"
-+ "Total int: %lu\n",
-+ priv->stats.ints,
-+ priv->stats.shints);
-+
-+ *eof = 1;
-+ return len;
-+}
-+#endif
-+
-+static int proc_get_stats_tx(char *page, char **start,
-+ off_t offset, int count,
-+ int *eof, void *data)
-+{
-+ struct net_device *dev = data;
-+ struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
-+
-+ int len = 0;
-+
-+ len += snprintf(page + len, count - len,
-+ "TX VI priority ok int: %lu\n"
-+ "TX VI priority error int: %lu\n"
-+ "TX VO priority ok int: %lu\n"
-+ "TX VO priority error int: %lu\n"
-+ "TX BE priority ok int: %lu\n"
-+ "TX BE priority error int: %lu\n"
-+ "TX BK priority ok int: %lu\n"
-+ "TX BK priority error int: %lu\n"
-+ "TX MANAGE priority ok int: %lu\n"
-+ "TX MANAGE priority error int: %lu\n"
-+ "TX BEACON priority ok int: %lu\n"
-+ "TX BEACON priority error int: %lu\n"
-+// "TX high priority ok int: %lu\n"
-+// "TX high priority failed error int: %lu\n"
-+ "TX queue resume: %lu\n"
-+ "TX queue stopped?: %d\n"
-+ "TX fifo overflow: %lu\n"
-+// "TX beacon: %lu\n"
-+ "TX VI queue: %d\n"
-+ "TX VO queue: %d\n"
-+ "TX BE queue: %d\n"
-+ "TX BK queue: %d\n"
-+ "TX BEACON queue: %d\n"
-+ "TX MANAGE queue: %d\n"
-+// "TX HW queue: %d\n"
-+ "TX VI dropped: %lu\n"
-+ "TX VO dropped: %lu\n"
-+ "TX BE dropped: %lu\n"
-+ "TX BK dropped: %lu\n"
-+ "TX total data packets %lu\n",
-+// "TX beacon aborted: %lu\n",
-+ priv->stats.txviokint,
-+ priv->stats.txvierr,
-+ priv->stats.txvookint,
-+ priv->stats.txvoerr,
-+ priv->stats.txbeokint,
-+ priv->stats.txbeerr,
-+ priv->stats.txbkokint,
-+ priv->stats.txbkerr,
-+ priv->stats.txmanageokint,
-+ priv->stats.txmanageerr,
-+ priv->stats.txbeaconokint,
-+ priv->stats.txbeaconerr,
-+// priv->stats.txhpokint,
-+// priv->stats.txhperr,
-+ priv->stats.txresumed,
-+ netif_queue_stopped(dev),
-+ priv->stats.txoverflow,
-+// priv->stats.txbeacon,
-+ atomic_read(&(priv->tx_pending[VI_PRIORITY])),
-+ atomic_read(&(priv->tx_pending[VO_PRIORITY])),
-+ atomic_read(&(priv->tx_pending[BE_PRIORITY])),
-+ atomic_read(&(priv->tx_pending[BK_PRIORITY])),
-+ atomic_read(&(priv->tx_pending[BEACON_PRIORITY])),
-+ atomic_read(&(priv->tx_pending[MANAGE_PRIORITY])),
-+// read_nic_byte(dev, TXFIFOCOUNT),
-+ priv->stats.txvidrop,
-+ priv->stats.txvodrop,
-+ priv->stats.txbedrop,
-+ priv->stats.txbkdrop,
-+ priv->stats.txdatapkt
-+// priv->stats.txbeaconerr
-+ );
-+
-+ *eof = 1;
-+ return len;
-+}
-+
-+
-+
-+static int proc_get_stats_rx(char *page, char **start,
-+ off_t offset, int count,
-+ int *eof, void *data)
-+{
-+ struct net_device *dev = data;
-+ struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
-+
-+ int len = 0;
-+
-+ len += snprintf(page + len, count - len,
-+ "RX packets: %lu\n"
-+ "RX urb status error: %lu\n"
-+ "RX invalid urb error: %lu\n",
-+ priv->stats.rxok,
-+ priv->stats.rxstaterr,
-+ priv->stats.rxurberr);
-+
-+ *eof = 1;
-+ return len;
-+}
-+
-+#if WIRELESS_EXT < 17
-+static struct iw_statistics *r8180_get_wireless_stats(struct net_device *dev)
-+{
-+ struct r8180_priv *priv = ieee80211_priv(dev);
-+
-+ return &priv->wstats;
-+}
-+#endif
-+
-+void rtl8180_proc_module_init(void)
-+{
-+ DMESG("Initializing proc filesystem");
-+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24))
-+ rtl8180_proc=create_proc_entry(RTL8187_MODULE_NAME, S_IFDIR, proc_net);
-+#else
-+ rtl8180_proc=create_proc_entry(RTL8187_MODULE_NAME, S_IFDIR, init_net.proc_net);
-+#endif
-+}
-+
-+
-+void rtl8180_proc_module_remove(void)
-+{
-+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24))
-+ remove_proc_entry(RTL8187_MODULE_NAME, proc_net);
-+#else
-+ remove_proc_entry(RTL8187_MODULE_NAME, init_net.proc_net);
-+#endif
-+}
-+
-+
-+void rtl8180_proc_remove_one(struct net_device *dev)
-+{
-+ struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
-+ if (priv->dir_dev) {
-+ // remove_proc_entry("stats-hw", priv->dir_dev);
-+ remove_proc_entry("stats-tx", priv->dir_dev);
-+ remove_proc_entry("stats-rx", priv->dir_dev);
-+ // remove_proc_entry("stats-ieee", priv->dir_dev);
-+ remove_proc_entry("stats-ap", priv->dir_dev);
-+ remove_proc_entry("registers", priv->dir_dev);
-+ remove_proc_entry("cck-registers",priv->dir_dev);
-+ remove_proc_entry("ofdm-registers",priv->dir_dev);
-+ remove_proc_entry(dev->name, rtl8180_proc);
-+ priv->dir_dev = NULL;
-+ }
-+}
-+
-+
-+void rtl8180_proc_init_one(struct net_device *dev)
-+{
-+ struct proc_dir_entry *e;
-+ struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
-+ priv->dir_dev = create_proc_entry(dev->name,
-+ S_IFDIR | S_IRUGO | S_IXUGO,
-+ rtl8180_proc);
-+ if (!priv->dir_dev) {
-+ DMESGE("Unable to initialize /proc/net/rtl8187/%s\n",
-+ dev->name);
-+ return;
-+ }
-+ #if 0
-+ e = create_proc_read_entry("stats-hw", S_IFREG | S_IRUGO,
-+ priv->dir_dev, proc_get_stats_hw, dev);
-+
-+ if (!e) {
-+ DMESGE("Unable to initialize "
-+ "/proc/net/rtl8187/%s/stats-hw\n",
-+ dev->name);
-+ }
-+ #endif
-+ e = create_proc_read_entry("stats-rx", S_IFREG | S_IRUGO,
-+ priv->dir_dev, proc_get_stats_rx, dev);
-+
-+ if (!e) {
-+ DMESGE("Unable to initialize "
-+ "/proc/net/rtl8187/%s/stats-rx\n",
-+ dev->name);
-+ }
-+
-+
-+ e = create_proc_read_entry("stats-tx", S_IFREG | S_IRUGO,
-+ priv->dir_dev, proc_get_stats_tx, dev);
-+
-+ if (!e) {
-+ DMESGE("Unable to initialize "
-+ "/proc/net/rtl8187/%s/stats-tx\n",
-+ dev->name);
-+ }
-+ #if 0
-+ e = create_proc_read_entry("stats-ieee", S_IFREG | S_IRUGO,
-+ priv->dir_dev, proc_get_stats_ieee, dev);
-+
-+ if (!e) {
-+ DMESGE("Unable to initialize "
-+ "/proc/net/rtl8187/%s/stats-ieee\n",
-+ dev->name);
-+ }
-+
-+ #endif
-+
-+ e = create_proc_read_entry("stats-ap", S_IFREG | S_IRUGO,
-+ priv->dir_dev, proc_get_stats_ap, dev);
-+
-+ if (!e) {
-+ DMESGE("Unable to initialize "
-+ "/proc/net/rtl8187/%s/stats-ap\n",
-+ dev->name);
-+ }
-+
-+ e = create_proc_read_entry("registers", S_IFREG | S_IRUGO,
-+ priv->dir_dev, proc_get_registers, dev);
-+ if (!e) {
-+ DMESGE("Unable to initialize "
-+ "/proc/net/rtl8187/%s/registers\n",
-+ dev->name);
-+ }
-+
-+ e = create_proc_read_entry("cck-registers", S_IFREG | S_IRUGO,
-+ priv->dir_dev, proc_get_cck_reg, dev);
-+ if (!e) {
-+ DMESGE("Unable to initialize "
-+ "/proc/net/rtl8187/%s/cck-registers\n",
-+ dev->name);
-+ }
-+
-+ e = create_proc_read_entry("ofdm-registers", S_IFREG | S_IRUGO,
-+ priv->dir_dev, proc_get_ofdm_reg, dev);
-+ if (!e) {
-+ DMESGE("Unable to initialize "
-+ "/proc/net/rtl8187/%s/ofdm-registers\n",
-+ dev->name);
-+ }
-+
-+#ifdef _RTL8187_EXT_PATCH_
-+ if( priv->mshobj && priv->mshobj->ext_patch_create_proc )
-+ priv->mshobj->ext_patch_create_proc(priv);
-+#endif
-+
-+}
-+/****************************************************************************
-+ -----------------------------MISC STUFF-------------------------
-+*****************************************************************************/
-+
-+/* this is only for debugging */
-+void print_buffer(u32 *buffer, int len)
-+{
-+ int i;
-+ u8 *buf =(u8*)buffer;
-+
-+ printk("ASCII BUFFER DUMP (len: %x):\n",len);
-+
-+ for(i=0;i<len;i++)
-+ printk("%c",buf[i]);
-+
-+ printk("\nBINARY BUFFER DUMP (len: %x):\n",len);
-+
-+ for(i=0;i<len;i++)
-+ printk("%x",buf[i]);
-+
-+ printk("\n");
-+}
-+
-+short check_nic_enought_desc(struct net_device *dev, priority_t priority)
-+{
-+ struct r8180_priv *priv = ieee80211_priv(dev);
-+ //int used = atomic_read((priority == NORM_PRIORITY) ?
-+ // &priv->tx_np_pending : &priv->tx_lp_pending);
-+ int used = atomic_read(&priv->tx_pending[priority]);
-+
-+ return (used < MAX_TX_URB);
-+}
-+
-+void tx_timeout(struct net_device *dev)
-+{
-+ struct r8180_priv *priv = ieee80211_priv(dev);
-+ //rtl8180_commit(dev);
-+ printk("@@@@ Transmit timeout at %ld, latency %ld\n", jiffies,
-+ jiffies - dev->trans_start);
-+
-+ printk("@@@@ netif_queue_stopped = %d\n", netif_queue_stopped(dev));
-+
-+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0))
-+ schedule_work(&priv->reset_wq);
-+#else
-+ schedule_task(&priv->reset_wq);
-+#endif
-+ //DMESG("TXTIMEOUT");
-+}
-+
-+
-+/* this is only for debug */
-+void dump_eprom(struct net_device *dev)
-+{
-+ int i;
-+ for(i=0; i<63; i++)
-+ DMESG("EEPROM addr %x : %x", i, eprom_read(dev,i));
-+}
-+
-+/* this is only for debug */
-+void rtl8180_dump_reg(struct net_device *dev)
-+{
-+ int i;
-+ int n;
-+ int max=0xff;
-+
-+ DMESG("Dumping NIC register map");
-+
-+ for(n=0;n<=max;)
-+ {
-+ printk( "\nD: %2x> ", n);
-+ for(i=0;i<16 && n<=max;i++,n++)
-+ printk("%2x ",read_nic_byte(dev,n));
-+ }
-+ printk("\n");
-+}
-+
-+/****************************************************************************
-+ ------------------------------HW STUFF---------------------------
-+*****************************************************************************/
-+
-+
-+void rtl8180_irq_enable(struct net_device *dev)
-+{
-+ struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
-+ //priv->irq_enabled = 1;
-+
-+ //write_nic_word(dev,INTA_MASK,INTA_RXOK | INTA_RXDESCERR | INTA_RXOVERFLOW |
-+ // INTA_TXOVERFLOW | INTA_HIPRIORITYDESCERR | INTA_HIPRIORITYDESCOK |
-+ // INTA_NORMPRIORITYDESCERR | INTA_NORMPRIORITYDESCOK |
-+ // INTA_LOWPRIORITYDESCERR | INTA_LOWPRIORITYDESCOK | INTA_TIMEOUT);
-+
-+ write_nic_word(dev,INTA_MASK, priv->irq_mask);
-+}
-+
-+
-+void rtl8180_irq_disable(struct net_device *dev)
-+{
-+ write_nic_word(dev,INTA_MASK,0);
-+ force_pci_posting(dev);
-+// priv->irq_enabled = 0;
-+}
-+
-+
-+void rtl8180_set_mode(struct net_device *dev,int mode)
-+{
-+ u8 ecmd;
-+ ecmd=read_nic_byte(dev, EPROM_CMD);
-+ ecmd=ecmd &~ EPROM_CMD_OPERATING_MODE_MASK;
-+ ecmd=ecmd | (mode<<EPROM_CMD_OPERATING_MODE_SHIFT);
-+ ecmd=ecmd &~ (1<<EPROM_CS_SHIFT);
-+ ecmd=ecmd &~ (1<<EPROM_CK_SHIFT);
-+ write_nic_byte(dev, EPROM_CMD, ecmd);
-+}
-+
-+
-+void rtl8180_update_msr(struct net_device *dev)
-+{
-+ struct r8180_priv *priv = ieee80211_priv(dev);
-+ u8 msr;
-+
-+ msr = read_nic_byte(dev, MSR);
-+ msr &= ~ MSR_LINK_MASK;
-+
-+ /* do not change in link_state != WLAN_LINK_ASSOCIATED.
-+ * msr must be updated if the state is ASSOCIATING.
-+ * this is intentional and make sense for ad-hoc and
-+ * master (see the create BSS/IBSS func)
-+ */
-+ if (priv->ieee80211->state == IEEE80211_LINKED){
-+
-+ if (priv->ieee80211->iw_mode == IW_MODE_INFRA)
-+ msr |= (MSR_LINK_MANAGED<<MSR_LINK_SHIFT);
-+ else if (priv->ieee80211->iw_mode == IW_MODE_ADHOC)
-+ msr |= (MSR_LINK_ADHOC<<MSR_LINK_SHIFT);
-+ else if (priv->ieee80211->iw_mode == IW_MODE_MASTER)
-+ msr |= (MSR_LINK_MASTER<<MSR_LINK_SHIFT);
-+
-+ }else
-+ msr |= (MSR_LINK_NONE<<MSR_LINK_SHIFT);
-+
-+ write_nic_byte(dev, MSR, msr);
-+}
-+
-+void rtl8180_set_chan(struct net_device *dev,short ch)
-+{
-+ struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
-+ u32 tx;
-+
-+ priv->chan=ch;
-+ #if 0
-+ if(priv->ieee80211->iw_mode == IW_MODE_ADHOC ||
-+ priv->ieee80211->iw_mode == IW_MODE_MASTER){
-+
-+ priv->ieee80211->link_state = WLAN_LINK_ASSOCIATED;
-+ priv->ieee80211->master_chan = ch;
-+ rtl8180_update_beacon_ch(dev);
-+ }
-+ #endif
-+
-+ /* this hack should avoid frame TX during channel setting*/
-+ tx = read_nic_dword(dev,TX_CONF);
-+ tx &= ~TX_LOOPBACK_MASK;
-+
-+#ifndef LOOP_TEST
-+ write_nic_dword(dev,TX_CONF, tx |( TX_LOOPBACK_MAC<<TX_LOOPBACK_SHIFT));
-+ priv->rf_set_chan(dev,priv->chan);
-+ //mdelay(10); //CPU occupany is too high. LZM 31/10/2008
-+ write_nic_dword(dev,TX_CONF,tx | (TX_LOOPBACK_NONE<<TX_LOOPBACK_SHIFT));
-+#endif
-+}
-+
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20)
-+void rtl8187_rx_isr(struct urb *rx_urb, struct pt_regs *regs);
-+#else
-+void rtl8187_rx_isr(struct urb* rx_urb);
-+#endif
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20)
-+void rtl8187_rx_manage_isr(struct urb *rx_urb, struct pt_regs *regs);
-+#else
-+void rtl8187_rx_manage_isr(struct urb* rx_urb);
-+#endif
-+
-+
-+
-+void rtl8187_rx_urbsubmit(struct net_device *dev, struct urb* rx_urb)
-+{
-+ struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
-+ int err;
-+
-+ usb_fill_bulk_urb(rx_urb,priv->udev,
-+ usb_rcvbulkpipe(priv->udev,(NIC_8187 == priv->card_8187)?0x81:0x83),
-+ rx_urb->transfer_buffer,
-+ RX_URB_SIZE,
-+ rtl8187_rx_isr,
-+ dev);
-+#if LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0)
-+ err = usb_submit_urb(rx_urb, GFP_ATOMIC);
-+#else
-+ err = usb_submit_urb(rx_urb);
-+#endif
-+ if(err && err != -EPERM){
-+ DMESGE("cannot submit RX command. URB_STATUS %x",rx_urb->status);
-+ }
-+}
-+
-+
-+void rtl8187_rx_manage_urbsubmit(struct net_device *dev, struct urb* rx_urb)
-+{
-+ struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
-+ int err;
-+#ifdef THOMAS_BEACON
-+ usb_fill_bulk_urb(rx_urb,priv->udev,
-+ usb_rcvbulkpipe(priv->udev,0x09),
-+ rx_urb->transfer_buffer,
-+ rx_urb->transfer_buffer_length,
-+ rtl8187_rx_manage_isr, dev);
-+#endif
-+
-+#if LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0)
-+ err = usb_submit_urb(rx_urb, GFP_ATOMIC);
-+#else
-+ err = usb_submit_urb(rx_urb);
-+#endif
-+ if(err && err != -EPERM){
-+ DMESGE("cannot submit RX command. URB_STATUS %x",rx_urb->status);
-+ }
-+}
-+
-+
-+
-+void rtl8187_rx_initiate(struct net_device *dev)
-+{
-+ int i;
-+ unsigned long flags;
-+ struct urb *purb;
-+
-+ struct sk_buff *pskb;
-+
-+ struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
-+
-+ priv->tx_urb_index = 0;
-+
-+ if ((!priv->rx_urb) || (!priv->pp_rxskb)) {
-+
-+ DMESGE("Cannot intiate RX urb mechanism");
-+ return;
-+
-+ }
-+
-+ priv->rx_inx = 0;
-+#ifdef THOMAS_TASKLET
-+ atomic_set(&priv->irt_counter,0);
-+#endif
-+ for(i = 0;i < MAX_RX_URB; i++){
-+
-+ purb = priv->rx_urb[i] = usb_alloc_urb(0,GFP_KERNEL);
-+
-+ if(!priv->rx_urb[i])
-+ goto destroy;
-+
-+ pskb = priv->pp_rxskb[i] = dev_alloc_skb (RX_URB_SIZE);
-+
-+ if (pskb == NULL)
-+ goto destroy;
-+
-+ purb->transfer_buffer_length = RX_URB_SIZE;
-+ purb->transfer_buffer = pskb->data;
-+ }
-+
-+ spin_lock_irqsave(&priv->irq_lock,flags);//added by thomas
-+
-+ for(i=0;i<MAX_RX_URB;i++)
-+ rtl8187_rx_urbsubmit(dev,priv->rx_urb[i]);
-+
-+ spin_unlock_irqrestore(&priv->irq_lock,flags);//added by thomas
-+
-+ return;
-+
-+destroy:
-+
-+ for(i = 0; i < MAX_RX_URB; i++) {
-+
-+ purb = priv->rx_urb[i];
-+
-+ if (purb)
-+ usb_free_urb(purb);
-+
-+ pskb = priv->pp_rxskb[i];
-+
-+ if (pskb)
-+ dev_kfree_skb_any(pskb);
-+
-+ }
-+
-+ return;
-+}
-+
-+
-+void rtl8187_rx_manage_initiate(struct net_device *dev)
-+{
-+ struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
-+ if(!priv->rx_urb)
-+ DMESGE("Cannot intiate RX urb mechanism");
-+
-+ rtl8187_rx_manage_urbsubmit(dev,priv->rx_urb[MAX_RX_URB]);
-+
-+}
-+
-+
-+void rtl8187_set_rxconf(struct net_device *dev)
-+{
-+ struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
-+ u32 rxconf;
-+
-+ rxconf=read_nic_dword(dev,RX_CONF);
-+ rxconf = rxconf &~ MAC_FILTER_MASK;
-+ rxconf = rxconf | (1<<ACCEPT_MNG_FRAME_SHIFT);
-+ rxconf = rxconf | (1<<ACCEPT_DATA_FRAME_SHIFT);
-+ rxconf = rxconf | (1<<ACCEPT_BCAST_FRAME_SHIFT);
-+ rxconf = rxconf | (1<<ACCEPT_MCAST_FRAME_SHIFT);
-+ //rxconf = rxconf | (1<<ACCEPT_CTL_FRAME_SHIFT);
-+#ifdef SW_ANTE_DIVERSITY
-+ rxconf = rxconf | priv->EEPROMCSMethod;//for antenna
-+#endif
-+
-+ if (dev->flags & IFF_PROMISC) DMESG ("NIC in promisc mode");
-+
-+ if(priv->ieee80211->iw_mode == IW_MODE_MONITOR || \
-+ dev->flags & IFF_PROMISC){
-+ rxconf = rxconf | (1<<ACCEPT_ALLMAC_FRAME_SHIFT);
-+ } /*else if(priv->ieee80211->iw_mode == IW_MODE_MASTER){
-+ rxconf = rxconf | (1<<ACCEPT_ALLMAC_FRAME_SHIFT);
-+ rxconf = rxconf | (1<<RX_CHECK_BSSID_SHIFT);
-+ }*/else{
-+ rxconf = rxconf | (1<<ACCEPT_NICMAC_FRAME_SHIFT);
-+ rxconf = rxconf | (1<<RX_CHECK_BSSID_SHIFT);
-+ }
-+
-+
-+ if(priv->ieee80211->iw_mode == IW_MODE_MONITOR){
-+ rxconf = rxconf | (1<<ACCEPT_ICVERR_FRAME_SHIFT);
-+ rxconf = rxconf | (1<<ACCEPT_PWR_FRAME_SHIFT);
-+ }
-+
-+ if( priv->crcmon == 1 && priv->ieee80211->iw_mode == IW_MODE_MONITOR)
-+ rxconf = rxconf | (1<<ACCEPT_CRCERR_FRAME_SHIFT);
-+
-+
-+ rxconf = rxconf &~ RX_FIFO_THRESHOLD_MASK;
-+ rxconf = rxconf | (RX_FIFO_THRESHOLD_NONE<<RX_FIFO_THRESHOLD_SHIFT);
-+ rxconf = rxconf &~ MAX_RX_DMA_MASK;
-+ rxconf = rxconf | (MAX_RX_DMA_2048<<MAX_RX_DMA_SHIFT);
-+
-+ rxconf = rxconf | (1<<RX_AUTORESETPHY_SHIFT);
-+ rxconf = rxconf | RCR_ONLYERLPKT;
-+
-+ //rxconf = rxconf &~ RCR_CS_MASK;
-+ //rxconf = rxconf | (1<<RCR_CS_SHIFT);
-+
-+ write_nic_dword(dev, RX_CONF, rxconf);
-+
-+ #ifdef DEBUG_RX
-+ DMESG("rxconf: %x %x",rxconf ,read_nic_dword(dev,RX_CONF));
-+ #endif
-+}
-+
-+void rtl8180_rx_enable(struct net_device *dev)
-+{
-+ u8 cmd;
-+
-+ struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
-+
-+ rtl8187_rx_initiate(dev);
-+ rtl8187_set_rxconf(dev);
-+
-+ if(NIC_8187 == priv->card_8187) {
-+ cmd=read_nic_byte(dev,CMD);
-+ write_nic_byte(dev,CMD,cmd | (1<<CMD_RX_ENABLE_SHIFT));
-+ } else {
-+ //write_nic_dword(dev, RCR, priv->ReceiveConfig);
-+ }
-+}
-+
-+
-+void rtl8180_tx_enable(struct net_device *dev)
-+{
-+ u8 cmd;
-+ u8 byte;
-+ u32 txconf = 0;
-+ struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
-+
-+ if(NIC_8187B == priv->card_8187){
-+ write_nic_dword(dev, TCR, priv->TransmitConfig);
-+ byte = read_nic_byte(dev, MSR);
-+ byte |= MSR_LINK_ENEDCA;
-+ write_nic_byte(dev, MSR, byte);
-+#ifdef LOOP_TEST
-+ txconf= read_nic_dword(dev,TX_CONF);
-+ txconf = txconf | (TX_LOOPBACK_MAC<<TX_LOOPBACK_SHIFT);
-+ write_nic_dword(dev,TX_CONF,txconf);
-+#endif
-+ } else {
-+ byte = read_nic_byte(dev,CW_CONF);
-+ byte &= ~(1<<CW_CONF_PERPACKET_CW_SHIFT);
-+ byte &= ~(1<<CW_CONF_PERPACKET_RETRY_SHIFT);
-+ write_nic_byte(dev, CW_CONF, byte);
-+
-+ byte = read_nic_byte(dev, TX_AGC_CTL);
-+ byte &= ~(1<<TX_AGC_CTL_PERPACKET_GAIN_SHIFT);
-+ byte &= ~(1<<TX_AGC_CTL_PERPACKET_ANTSEL_SHIFT);
-+ byte &= ~(1<<TX_AGC_CTL_FEEDBACK_ANT);
-+ write_nic_byte(dev, TX_AGC_CTL, byte);
-+
-+ txconf= read_nic_dword(dev,TX_CONF);
-+
-+
-+ txconf = txconf &~ TX_LOOPBACK_MASK;
-+
-+#ifndef LOOP_TEST
-+ txconf = txconf | (TX_LOOPBACK_NONE<<TX_LOOPBACK_SHIFT);
-+#else
-+ txconf = txconf | (TX_LOOPBACK_BASEBAND<<TX_LOOPBACK_SHIFT);
-+#endif
-+ txconf = txconf &~ TCR_SRL_MASK;
-+ txconf = txconf &~ TCR_LRL_MASK;
-+
-+ txconf = txconf | (priv->retry_data<<TX_LRLRETRY_SHIFT); // long
-+ txconf = txconf | (priv->retry_rts<<TX_SRLRETRY_SHIFT); // short
-+
-+ txconf = txconf &~ (1<<TX_NOCRC_SHIFT);
-+
-+ txconf = txconf &~ TCR_MXDMA_MASK;
-+ txconf = txconf | (TCR_MXDMA_2048<<TCR_MXDMA_SHIFT);
-+
-+ txconf = txconf | TCR_DISReqQsize;
-+ txconf = txconf | TCR_DISCW;
-+ txconf = txconf &~ TCR_SWPLCPLEN;
-+
-+ txconf=txconf | (1<<TX_NOICV_SHIFT);
-+
-+ write_nic_dword(dev,TX_CONF,txconf);
-+
-+#ifdef DEBUG_TX
-+ DMESG("txconf: %x %x",txconf,read_nic_dword(dev,TX_CONF));
-+#endif
-+
-+ cmd=read_nic_byte(dev,CMD);
-+ write_nic_byte(dev,CMD,cmd | (1<<CMD_TX_ENABLE_SHIFT));
-+ }
-+}
-+
-+#if 0
-+void rtl8180_beacon_tx_enable(struct net_device *dev)
-+{
-+ struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
-+ priv->dma_poll_mask &=~(1<<TX_DMA_STOP_BEACON_SHIFT);
-+ rtl8180_set_mode(dev,EPROM_CMD_CONFIG);
-+ write_nic_byte(dev,TX_DMA_POLLING,priv->dma_poll_mask);
-+ rtl8180_set_mode(dev,EPROM_CMD_NORMAL);
-+}
-+
-+
-+void rtl8180_
-+_disable(struct net_device *dev)
-+{
-+ struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
-+ priv->dma_poll_mask |= (1<<TX_DMA_STOP_BEACON_SHIFT);
-+ rtl8180_set_mode(dev,EPROM_CMD_CONFIG);
-+ write_nic_byte(dev,TX_DMA_POLLING,priv->dma_poll_mask);
-+ rtl8180_set_mode(dev,EPROM_CMD_NORMAL);
-+}
-+
-+#endif
-+
-+
-+void rtl8180_rtx_disable(struct net_device *dev)
-+{
-+ u8 cmd;
-+ int i;
-+ struct r8180_priv *priv = ieee80211_priv(dev);
-+
-+ cmd=read_nic_byte(dev,CMD);
-+ write_nic_byte(dev, CMD, cmd &~ \
-+ ((1<<CMD_RX_ENABLE_SHIFT)|(1<<CMD_TX_ENABLE_SHIFT)));
-+ force_pci_posting(dev);
-+ mdelay(10);
-+
-+#ifdef THOMAS_BEACON
-+ {
-+ int index = priv->rx_inx;//0
-+ i=0;
-+ if(priv->rx_urb){
-+ while(i<MAX_RX_URB){
-+ if(priv->rx_urb[index]){
-+ usb_kill_urb(priv->rx_urb[index]);
-+ }
-+ if( index == (MAX_RX_URB-1) )
-+ index=0;
-+ else
-+ index=index+1;
-+ i++;
-+ }
-+ if(priv->rx_urb[MAX_RX_URB])
-+ usb_kill_urb(priv->rx_urb[MAX_RX_URB]);
-+ }
-+ }
-+#endif
-+}
-+
-+
-+int alloc_tx_beacon_desc_ring(struct net_device *dev, int count)
-+{
-+ #if 0
-+ int i;
-+ u32 *tmp;
-+ struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
-+
-+ priv->txbeaconring = (u32*)pci_alloc_consistent(priv->pdev,
-+ sizeof(u32)*8*count,
-+ &priv->txbeaconringdma);
-+ if (!priv->txbeaconring) return -1;
-+ for (tmp=priv->txbeaconring,i=0;i<count;i++){
-+ *tmp = *tmp &~ (1<<31); // descriptor empty, owned by the drv
-+ /*
-+ *(tmp+2) = (u32)dma_tmp;
-+ *(tmp+3) = bufsize;
-+ */
-+ if(i+1<count)
-+ *(tmp+4) = (u32)priv->txbeaconringdma+((i+1)*8*4);
-+ else
-+ *(tmp+4) = (u32)priv->txbeaconringdma;
-+
-+ tmp=tmp+8;
-+ }
-+ #endif
-+ return 0;
-+}
-+
-+long NetgearSignalStrengthTranslate(long LastSS,long CurrSS)
-+{
-+ long RetSS;
-+
-+ // Step 1. Scale mapping.
-+ if(CurrSS >= 71 && CurrSS <= 100){
-+ RetSS = 90 + ((CurrSS - 70) / 3);
-+ }else if(CurrSS >= 41 && CurrSS <= 70){
-+ RetSS = 78 + ((CurrSS - 40) / 3);
-+ }else if(CurrSS >= 31 && CurrSS <= 40){
-+ RetSS = 66 + (CurrSS - 30);
-+ }else if(CurrSS >= 21 && CurrSS <= 30){
-+ RetSS = 54 + (CurrSS - 20);
-+ }else if(CurrSS >= 5 && CurrSS <= 20){
-+ RetSS = 42 + (((CurrSS - 5) * 2) / 3);
-+ }else if(CurrSS == 4){
-+ RetSS = 36;
-+ }else if(CurrSS == 3){
-+ RetSS = 27;
-+ }else if(CurrSS == 2){
-+ RetSS = 18;
-+ }else if(CurrSS == 1){
-+ RetSS = 9;
-+ }else{
-+ RetSS = CurrSS;
-+ }
-+ //RT_TRACE(COMP_DBG, DBG_LOUD, ("##### After Mapping: LastSS: %d, CurrSS: %d, RetSS: %d\n", LastSS, CurrSS, RetSS));
-+
-+ // Step 2. Smoothing.
-+ if(LastSS > 0){
-+ RetSS = ((LastSS * 5) + (RetSS)+ 5) / 6;
-+ }
-+ //RT_TRACE(COMP_DBG, DBG_LOUD, ("$$$$$ After Smoothing: LastSS: %d, CurrSS: %d, RetSS: %d\n", LastSS, CurrSS, RetSS));
-+
-+ return RetSS;
-+}
-+
-+extern long TranslateToDbm8187(u8 SignalStrengthIndex); // 0-100 index.
-+//long TranslateToDbm8187(u8 SignalStrengthIndex) // 0-100 index.
-+//{
-+ // long SignalPower; // in dBm.
-+
-+ // Translate to dBm (x=0.5y-95).
-+ // SignalPower = (long)((SignalStrengthIndex + 1) >> 1);
-+ // SignalPower -= 95;
-+
-+ // return SignalPower;
-+//}
-+
-+
-+void rtl8180_reset(struct net_device *dev)
-+{
-+
-+ struct r8180_priv *priv = ieee80211_priv(dev);
-+ u8 cr;
-+ int i;
-+
-+
-+ /* make sure the analog power is on before
-+ * reset, otherwise reset may fail
-+ */
-+ if(NIC_8187 == priv->card_8187) {
-+ rtl8180_set_anaparam(dev, RTL8225_ANAPARAM_ON);
-+ rtl8185_set_anaparam2(dev, RTL8225_ANAPARAM2_ON);
-+ rtl8180_irq_disable(dev);
-+ mdelay(200);
-+ write_nic_byte_E(dev,0x18,0x10);
-+ write_nic_byte_E(dev,0x18,0x11);
-+ write_nic_byte_E(dev,0x18,0x00);
-+ mdelay(200);
-+ }
-+
-+
-+ cr=read_nic_byte(dev,CMD);
-+ cr = cr & 2;
-+ cr = cr | (1<<CMD_RST_SHIFT);
-+ write_nic_byte(dev,CMD,cr);
-+
-+ //lzm mod for up take too long time 20081201
-+ //force_pci_posting(dev);
-+ //mdelay(200);
-+ udelay(20);
-+
-+ if(read_nic_byte(dev,CMD) & (1<<CMD_RST_SHIFT))
-+ DMESGW("Card reset timeout!");
-+ else
-+ DMESG("Card successfully reset");
-+
-+ if(NIC_8187 == priv->card_8187) {
-+
-+ //printk("This is RTL8187 Reset procedure\n");
-+ rtl8180_set_mode(dev,EPROM_CMD_LOAD);
-+ force_pci_posting(dev);
-+ mdelay(200);
-+
-+ /* after the eeprom load cycle, make sure we have
-+ * correct anaparams
-+ */
-+ rtl8180_set_anaparam(dev, RTL8225_ANAPARAM_ON);
-+ rtl8185_set_anaparam2(dev, RTL8225_ANAPARAM2_ON);
-+ }
-+ else {
-+ //printk("This is RTL8187B Reset procedure\n");
-+ //test pending bug, john 20070815
-+ //initialize tx_pending
-+ for(i=0;i<0x10;i++) atomic_set(&(priv->tx_pending[i]), 0);
-+
-+ }
-+
-+}
-+
-+inline u16 ieeerate2rtlrate(int rate)
-+{
-+ switch(rate){
-+ case 10:
-+ return 0;
-+ case 20:
-+ return 1;
-+ case 55:
-+ return 2;
-+ case 110:
-+ return 3;
-+ case 60:
-+ return 4;
-+ case 90:
-+ return 5;
-+ case 120:
-+ return 6;
-+ case 180:
-+ return 7;
-+ case 240:
-+ return 8;
-+ case 360:
-+ return 9;
-+ case 480:
-+ return 10;
-+ case 540:
-+ return 11;
-+ default:
-+ return 3;
-+
-+ }
-+}
-+static u16 rtl_rate[] = {10,20,55,110,60,90,120,180,240,360,480,540,720};
-+inline u16 rtl8180_rate2rate(short rate)
-+{
-+ if (rate >12) return 10;
-+ return rtl_rate[rate];
-+}
-+
-+void rtl8180_irq_rx_tasklet(struct r8180_priv *priv);
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20)
-+void rtl8187_rx_isr(struct urb *rx_urb, struct pt_regs *regs)
-+#else
-+void rtl8187_rx_isr(struct urb* rx_urb)
-+#endif
-+{
-+ struct net_device *dev = (struct net_device*)rx_urb->context;
-+ struct r8180_priv *priv = ieee80211_priv(dev);
-+ priv->rxurb_task = rx_urb;
-+
-+
-+ //DMESGW("David: Rx tasklet start!");
-+
-+#ifdef THOMAS_TASKLET
-+ atomic_inc( &priv->irt_counter );
-+
-+ //if( likely(priv->irt_counter_head+1 != priv->irt_counter_tail) ){
-+ // priv->irt_counter_head = (priv->irt_counter_head+1)&0xffff ;
-+ tasklet_schedule(&priv->irq_rx_tasklet);
-+ //} else{
-+ //DMESG("error: priv->irt_counter_head is going to pass through priv->irt_counter_tail\n");
-+ /*
-+ skb = priv->pp_rxskb[priv->rx_inx];
-+ dev_kfree_skb_any(skb);
-+
-+ skb = dev_alloc_skb(RX_URB_SIZE);
-+ if (skb == NULL)
-+ panic("No Skb For RX!/n");
-+
-+ rx_urb->transfer_buffer = skb->data;
-+
-+ priv->pp_rxskb[priv->rx_inx] = skb;
-+ if(status == 0)
-+ rtl8187_rx_urbsubmit(dev,rx_urb);
-+ else {
-+ priv->pp_rxskb[priv->rx_inx] = NULL;
-+ dev_kfree_skb_any(skb);
-+ printk("RX process aborted due to explicit shutdown (%x) ", status);
-+ }
-+
-+ if (*prx_inx == (MAX_RX_URB -1))
-+ *prx_inx = 0;
-+ else
-+ *prx_inx = *prx_inx + 1;
-+
-+ */
-+ //}
-+#endif
-+
-+}
-+
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20)
-+void rtl8187_rx_manage_isr(struct urb *rx_urb, struct pt_regs *regs)
-+#else
-+void rtl8187_rx_manage_isr(struct urb* rx_urb)
-+#endif
-+{
-+ struct net_device *dev = (struct net_device*)rx_urb->context;
-+ struct r8180_priv *priv = ieee80211_priv(dev);
-+ int status,cmd;
-+ struct sk_buff *skb;
-+ u32 *desc;
-+ int ret;
-+ unsigned long flag;
-+
-+ //DMESG("RX %d ",rx_urb->status);
-+ status = rx_urb->status;
-+ if(status == 0){
-+
-+ desc = (u32*)(rx_urb->transfer_buffer);
-+ cmd = (desc[0] >> 30) & 0x03;
-+ //printk(KERN_ALERT "buffersize = %d, length = %d, pipe = %p\n",
-+ //rx_urb->transfer_buffer_length, rx_urb->actual_length, rx_urb->pipe>>15);
-+
-+ if(cmd == 0x00) {//beacon interrupt
-+ //send beacon packet
-+
-+ spin_lock_irqsave(&priv->ieee80211->beaconflag_lock,flag);
-+ if(priv->flag_beacon == true){
-+ //printk("rtl8187_rx_manage_isr(): CMD_TYPE0_BCN_INTR\n");
-+
-+ skb = ieee80211_get_beacon(priv->ieee80211);
-+ if(!skb){
-+ DMESG("not enought memory for allocating beacon");
-+ return;
-+ }
-+ //printk(KERN_WARNING "to send beacon packet through beacon endpoint!\n");
-+ ret = rtl8180_tx(dev, (u32*)skb->data, skb->len, BEACON_PRIORITY,
-+ 0, ieeerate2rtlrate(priv->ieee80211->basic_rate));
-+
-+ if( ret != 0 ){
-+ printk(KERN_ALERT "tx beacon packet error : %d !\n", ret);
-+ }
-+ dev_kfree_skb_any(skb);
-+
-+ //} else {//0x00
-+ //{ log the device information
-+ // At present, It is not implemented just now.
-+ //}
-+ //}
-+
-+ }
-+ spin_unlock_irqrestore(&priv->ieee80211->beaconflag_lock,flag);
-+ }
-+ else if(cmd == 0x01){
-+ //printk("rtl8187_rx_manage_isr(): CMD_TYPE1_TX_CLOSE\n");
-+ priv->CurrRetryCnt += (u16)desc[0]&0x000000ff;
-+ //printk("priv->CurrRetryCnt is %d\n",priv->CurrRetryCnt);
-+ }
-+ else
-+ printk("HalUsbInCommandComplete8187B(): unknown Type(%#X) !!!\n", cmd);
-+
-+ }else{
-+ priv->stats.rxstaterr++;
-+ priv->ieee80211->stats.rx_errors++;
-+ }
-+
-+
-+ if( status == 0 )
-+ //if(status != -ENOENT)
-+ rtl8187_rx_manage_urbsubmit(dev, rx_urb);
-+ else
-+ ;//DMESG("Mangement RX process aborted due to explicit shutdown");
-+}
-+
-+#if 0
-+void rtl8180_tx_queues_stop(struct net_device *dev)
-+{
-+ //struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
-+ u8 dma_poll_mask = (1<<TX_DMA_STOP_LOWPRIORITY_SHIFT);
-+ dma_poll_mask |= (1<<TX_DMA_STOP_HIPRIORITY_SHIFT);
-+ dma_poll_mask |= (1<<TX_DMA_STOP_NORMPRIORITY_SHIFT);
-+ dma_poll_mask |= (1<<TX_DMA_STOP_BEACON_SHIFT);
-+
-+ rtl8180_set_mode(dev,EPROM_CMD_CONFIG);
-+ write_nic_byte(dev,TX_DMA_POLLING,dma_poll_mask);
-+ rtl8180_set_mode(dev,EPROM_CMD_NORMAL);
-+}
-+#endif
-+
-+void rtl8180_data_hard_stop(struct net_device *dev)
-+{
-+ //FIXME !!
-+ #if 0
-+ struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
-+ priv->dma_poll_mask |= (1<<TX_DMA_STOP_LOWPRIORITY_SHIFT);
-+ rtl8180_set_mode(dev,EPROM_CMD_CONFIG);
-+ write_nic_byte(dev,TX_DMA_POLLING,priv->dma_poll_mask);
-+ rtl8180_set_mode(dev,EPROM_CMD_NORMAL);
-+ #endif
-+}
-+
-+
-+void rtl8180_data_hard_resume(struct net_device *dev)
-+{
-+ // FIXME !!
-+ #if 0
-+ struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
-+ priv->dma_poll_mask &= ~(1<<TX_DMA_STOP_LOWPRIORITY_SHIFT);
-+ rtl8180_set_mode(dev,EPROM_CMD_CONFIG);
-+ write_nic_byte(dev,TX_DMA_POLLING,priv->dma_poll_mask);
-+ rtl8180_set_mode(dev,EPROM_CMD_NORMAL);
-+ #endif
-+}
-+
-+unsigned int PRI2EP[4] = {0x06,0x07,0x05,0x04};
-+// this function TX data frames when the ieee80211 stack requires this.
-+// It checks also if we need to stop the ieee tx queue, eventually do it
-+void rtl8180_hard_data_xmit(struct sk_buff *skb, struct net_device *dev, int rate)
-+{
-+ struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
-+
-+ short morefrag = 0;
-+ unsigned long flags;
-+ struct ieee80211_hdr *h = (struct ieee80211_hdr *) skb->data;
-+
-+ unsigned char ep;
-+ short ret; //john
-+
-+ if (le16_to_cpu(h->frame_ctl) & IEEE80211_FCTL_MOREFRAGS)
-+ morefrag = 1;
-+ //DMESG("%x %x", h->frame_ctl, h->seq_ctl);
-+ /*
-+ * This function doesn't require lock because we make
-+ * sure it's called with the tx_lock already acquired.
-+ * this come from the kernel's hard_xmit callback (trought
-+ * the ieee stack, or from the try_wake_queue (again trought
-+ * the ieee stack.
-+ */
-+ spin_lock_irqsave(&priv->tx_lock,flags);
-+
-+ //lzm mod 20081128 for sometimes wlan down but it still have some pkt to tx
-+ if((priv->ieee80211->bHwRadioOff)||(!priv->up))
-+ {
-+ spin_unlock_irqrestore(&priv->tx_lock,flags);
-+
-+ return;
-+ }
-+
-+ if(NIC_8187B == priv->card_8187){
-+ ep = PRI2EP[skb->priority];
-+ } else {
-+ ep = LOW_PRIORITY;
-+ }
-+ //if (!check_nic_enought_desc(dev, PRI2EP[skb->priority])){
-+ if (!check_nic_enought_desc(dev, ep)){
-+ DMESG("Error: no TX slot ");
-+ ieee80211_stop_queue(priv->ieee80211);
-+ }
-+
-+#ifdef LED_SHIN
-+ priv->ieee80211->ieee80211_led_contorl(dev,LED_CTL_TX);
-+#endif
-+
-+ ret = rtl8180_tx(dev, (u32*)skb->data, skb->len, ep, morefrag,ieeerate2rtlrate(rate));
-+ if(ret!=0) DMESG("Error: rtl8180_tx failed in rtl8180_hard_data_xmit\n");//john
-+
-+ priv->stats.txdatapkt++;
-+
-+ //if (!check_nic_enought_desc(dev, PRI2EP[skb->priority])){
-+ if (!check_nic_enought_desc(dev, ep)){
-+ ieee80211_stop_queue(priv->ieee80211);
-+ }
-+
-+ spin_unlock_irqrestore(&priv->tx_lock,flags);
-+
-+}
-+
-+//This is a rough attempt to TX a frame
-+//This is called by the ieee 80211 stack to TX management frames.
-+//If the ring is full packet are dropped (for data frame the queue
-+//is stopped before this can happen).
-+
-+int rtl8180_hard_start_xmit(struct sk_buff *skb,struct net_device *dev)
-+{
-+ struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
-+ struct ieee80211_device *ieee = priv->ieee80211;
-+ int ret;
-+ unsigned long flags;
-+ spin_lock_irqsave(&priv->tx_lock,flags);
-+
-+ //lzm mod 20081128 for sometimes wlan down but it still have some pkt to tx
-+ if((priv->ieee80211->bHwRadioOff)||(!priv->up))
-+ {
-+ spin_unlock_irqrestore(&priv->tx_lock,flags);
-+ return 0;
-+ }
-+
-+ ret = rtl8180_tx(dev, (u32*)skb->data, skb->len, MANAGE_PRIORITY, 0, ieeerate2rtlrate(ieee->basic_rate));
-+
-+ priv->ieee80211->stats.tx_bytes+=skb->len;
-+ priv->ieee80211->stats.tx_packets++;
-+
-+ spin_unlock_irqrestore(&priv->tx_lock,flags);
-+
-+ return ret;
-+}
-+
-+
-+#if 0
-+// longpre 144+48 shortpre 72+24
-+u16 rtl8180_len2duration(u32 len, short rate,short* ext)
-+{
-+ u16 duration;
-+ u16 drift;
-+ *ext=0;
-+
-+ switch(rate){
-+ case 0://1mbps
-+ *ext=0;
-+ duration = ((len+4)<<4) /0x2;
-+ drift = ((len+4)<<4) % 0x2;
-+ if(drift ==0 ) break;
-+ duration++;
-+ break;
-+
-+ case 1://2mbps
-+ *ext=0;
-+ duration = ((len+4)<<4) /0x4;
-+ drift = ((len+4)<<4) % 0x4;
-+ if(drift ==0 ) break;
-+ duration++;
-+ break;
-+
-+ case 2: //5.5mbps
-+ *ext=0;
-+ duration = ((len+4)<<4) /0xb;
-+ drift = ((len+4)<<4) % 0xb;
-+ if(drift ==0 )
-+ break;
-+ duration++;
-+ break;
-+
-+ default:
-+ case 3://11mbps
-+ *ext=0;
-+ duration = ((len+4)<<4) /0x16;
-+ drift = ((len+4)<<4) % 0x16;
-+ if(drift ==0 )
-+ break;
-+ duration++;
-+ if(drift > 6)
-+ break;
-+ *ext=1;
-+ break;
-+ }
-+
-+ return duration;
-+}
-+#endif
-+
-+void rtl8180_try_wake_queue(struct net_device *dev, int pri);
-+
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20)
-+void rtl8187_lptx_isr(struct urb *tx_urb, struct pt_regs *regs)
-+#else
-+void rtl8187_lptx_isr(struct urb* tx_urb)
-+#endif
-+{
-+ struct net_device *dev = (struct net_device*)tx_urb->context;
-+ struct r8180_priv *priv = ieee80211_priv(dev);
-+
-+ if(tx_urb->status == 0){
-+ dev->trans_start = jiffies; //john
-+ priv->stats.txlpokint++;
-+ priv->txokbytestotal+=tx_urb->actual_length;
-+ }else{
-+ priv->stats.txlperr++;
-+ }
-+
-+ kfree(tx_urb->transfer_buffer);
-+ usb_free_urb(tx_urb);
-+
-+ if(atomic_read(&priv->tx_pending[LOW_PRIORITY]) >= 1)
-+ atomic_dec(&priv->tx_pending[LOW_PRIORITY]);
-+
-+ rtl8180_try_wake_queue(dev,LOW_PRIORITY);
-+}
-+
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20)
-+void rtl8187_nptx_isr(struct urb *tx_urb, struct pt_regs *regs)
-+#else
-+void rtl8187_nptx_isr(struct urb* tx_urb)
-+#endif
-+{
-+ struct net_device *dev = (struct net_device*)tx_urb->context;
-+ struct r8180_priv *priv = ieee80211_priv(dev);
-+
-+ if(tx_urb->status == 0){
-+ dev->trans_start = jiffies; //john
-+ priv->stats.txnpokint++;
-+ }else{
-+ priv->stats.txnperr++;
-+ }
-+
-+ kfree(tx_urb->transfer_buffer);
-+ usb_free_urb(tx_urb);
-+
-+ if(atomic_read(&priv->tx_pending[NORM_PRIORITY]) >= 1)
-+ atomic_dec(&priv->tx_pending[NORM_PRIORITY]);
-+ //rtl8180_try_wake_queue(dev,NORM_PRIORITY);
-+}
-+
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20)
-+void rtl8187_votx_isr(struct urb *tx_urb, struct pt_regs *regs)
-+#else
-+void rtl8187_votx_isr(struct urb* tx_urb)
-+#endif
-+{
-+ struct net_device *dev = (struct net_device*)tx_urb->context;
-+ struct r8180_priv *priv = ieee80211_priv(dev);
-+
-+ if(tx_urb->status == 0){
-+ dev->trans_start = jiffies; //john
-+ priv->stats.txvookint++;
-+ priv->txokbytestotal+=tx_urb->actual_length;
-+ }else{
-+ priv->stats.txvoerr++;
-+ }
-+
-+ kfree(tx_urb->transfer_buffer);
-+ usb_free_urb(tx_urb);
-+
-+ if(atomic_read(&priv->tx_pending[VO_PRIORITY]) >= 1)
-+ atomic_dec(&priv->tx_pending[VO_PRIORITY]);
-+ rtl8180_try_wake_queue(dev,VO_PRIORITY);
-+}
-+
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20)
-+void rtl8187_vitx_isr(struct urb *tx_urb, struct pt_regs *regs)
-+#else
-+void rtl8187_vitx_isr(struct urb* tx_urb)
-+#endif
-+{
-+ struct net_device *dev = (struct net_device*)tx_urb->context;
-+ struct r8180_priv *priv = ieee80211_priv(dev);
-+
-+ if(tx_urb->status == 0){
-+ dev->trans_start = jiffies; //john
-+ priv->stats.txviokint++;
-+ priv->txokbytestotal+=tx_urb->actual_length;
-+ }else{
-+ priv->stats.txvierr++;
-+ }
-+
-+ kfree(tx_urb->transfer_buffer);
-+ usb_free_urb(tx_urb);
-+
-+ if(atomic_read(&priv->tx_pending[VI_PRIORITY]) >= 1)
-+ atomic_dec(&priv->tx_pending[VI_PRIORITY]);
-+ rtl8180_try_wake_queue(dev,VI_PRIORITY);
-+}
-+
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20)
-+void rtl8187_betx_isr(struct urb *tx_urb, struct pt_regs *regs)
-+#else
-+void rtl8187_betx_isr(struct urb* tx_urb)
-+#endif
-+{
-+ struct net_device *dev = (struct net_device*)tx_urb->context;
-+ struct r8180_priv *priv = ieee80211_priv(dev);
-+
-+ if(tx_urb->status == 0){
-+ dev->trans_start = jiffies; //john
-+ priv->stats.txbeokint++;
-+ priv->txokbytestotal+=tx_urb->actual_length;
-+ }else{
-+ priv->stats.txbeerr++;
-+ }
-+
-+ kfree(tx_urb->transfer_buffer);
-+ usb_free_urb(tx_urb);
-+
-+ if(atomic_read(&priv->tx_pending[BE_PRIORITY]) >= 1)
-+ atomic_dec(&priv->tx_pending[BE_PRIORITY]);
-+ rtl8180_try_wake_queue(dev, BE_PRIORITY);
-+}
-+
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20)
-+void rtl8187_bktx_isr(struct urb *tx_urb, struct pt_regs *regs)
-+#else
-+void rtl8187_bktx_isr(struct urb* tx_urb)
-+#endif
-+{
-+ struct net_device *dev = (struct net_device*)tx_urb->context;
-+ struct r8180_priv *priv = ieee80211_priv(dev);
-+
-+ if(tx_urb->status == 0){
-+ dev->trans_start = jiffies; //john
-+ priv->stats.txbkokint++;
-+ }else{
-+ priv->stats.txbkerr++;
-+ }
-+
-+ kfree(tx_urb->transfer_buffer);
-+ usb_free_urb(tx_urb);
-+
-+ if(atomic_read(&priv->tx_pending[BK_PRIORITY]) >= 1)
-+ atomic_dec(&priv->tx_pending[BK_PRIORITY]);
-+ rtl8180_try_wake_queue(dev,BK_PRIORITY);
-+}
-+
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20)
-+void rtl8187_beacontx_isr(struct urb *tx_urb, struct pt_regs *regs)
-+#else
-+void rtl8187_beacontx_isr(struct urb* tx_urb)
-+#endif
-+{
-+ struct net_device *dev = (struct net_device*)tx_urb->context;
-+ struct r8180_priv *priv = ieee80211_priv(dev);
-+
-+ if(tx_urb->status == 0){
-+ dev->trans_start = jiffies; //john
-+ priv->stats.txbeaconokint++;
-+ priv->txokbytestotal+=tx_urb->actual_length;
-+ }else{
-+ priv->stats.txbeaconerr++;
-+ }
-+
-+ kfree(tx_urb->transfer_buffer);
-+ usb_free_urb(tx_urb);
-+
-+ if(atomic_read(&priv->tx_pending[BEACON_PRIORITY]) >= 1)
-+ atomic_dec(&priv->tx_pending[BEACON_PRIORITY]);
-+ //rtl8180_try_wake_queue(dev,BEACON_PRIORITY);
-+}
-+
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20)
-+void rtl8187_managetx_isr(struct urb *tx_urb, struct pt_regs *regs)
-+#else
-+void rtl8187_managetx_isr(struct urb* tx_urb)
-+#endif
-+{
-+ struct net_device *dev = (struct net_device*)tx_urb->context;
-+ struct r8180_priv *priv = ieee80211_priv(dev);
-+
-+ if(tx_urb->status == 0){
-+ dev->trans_start = jiffies; //john
-+ priv->stats.txmanageokint++;
-+ priv->txokbytestotal+=tx_urb->actual_length;
-+ }else{
-+ priv->stats.txmanageerr++;
-+ }
-+
-+ kfree(tx_urb->transfer_buffer);
-+ usb_free_urb(tx_urb);
-+
-+ if(atomic_read(&priv->tx_pending[MANAGE_PRIORITY]) >= 1)
-+ atomic_dec(&priv->tx_pending[MANAGE_PRIORITY]);
-+// rtl8180_try_wake_queue(dev,MANAGE_PRIORITY);
-+}
-+
-+void rtl8187_beacon_stop(struct net_device *dev)
-+{
-+ u8 msr, msrm, msr2;
-+ struct r8180_priv *priv = ieee80211_priv(dev);
-+ unsigned long flag;
-+ msr = read_nic_byte(dev, MSR);
-+ msrm = msr & MSR_LINK_MASK;
-+ msr2 = msr & ~MSR_LINK_MASK;
-+ if(NIC_8187B == priv->card_8187) {
-+ spin_lock_irqsave(&priv->ieee80211->beaconflag_lock,flag);
-+ priv->flag_beacon = false;
-+ spin_unlock_irqrestore(&priv->ieee80211->beaconflag_lock,flag);
-+ }
-+ if ((msrm == (MSR_LINK_ADHOC<<MSR_LINK_SHIFT) ||
-+ (msrm == (MSR_LINK_MASTER<<MSR_LINK_SHIFT)))){
-+ write_nic_byte(dev, MSR, msr2 | MSR_LINK_NONE);
-+ write_nic_byte(dev, MSR, msr);
-+ }
-+}
-+
-+
-+void rtl8187_net_update(struct net_device *dev)
-+{
-+
-+ struct r8180_priv *priv = ieee80211_priv(dev);
-+ struct ieee80211_network *net;
-+ net = & priv->ieee80211->current_network;
-+
-+
-+ write_nic_dword(dev,BSSID,((u32*)net->bssid)[0]);
-+ write_nic_word(dev,BSSID+4,((u16*)net->bssid)[2]);
-+
-+ rtl8180_update_msr(dev);
-+
-+ //rtl8180_set_mode(dev,EPROM_CMD_CONFIG);
-+ write_nic_word(dev, AtimWnd, 2);
-+ write_nic_word(dev, AtimtrItv, 100);
-+ write_nic_word(dev, BEACON_INTERVAL, net->beacon_interval);
-+ //write_nic_word(dev, BcnIntTime, 100);
-+ write_nic_word(dev, BcnIntTime, 0x3FF);
-+
-+
-+}
-+
-+void rtl8187_beacon_tx(struct net_device *dev)
-+{
-+ struct r8180_priv *priv = ieee80211_priv(dev);
-+ struct sk_buff *skb;
-+ int i = 0;
-+ u8 cr;
-+ unsigned long flag;
-+ rtl8187_net_update(dev);
-+
-+ if(NIC_8187B == priv->card_8187) {
-+ //Cause TSF timer of MAC reset to 0
-+ cr=read_nic_byte(dev,CMD);
-+ cr = cr | (1<<CMD_RST_SHIFT);
-+ write_nic_byte(dev,CMD,cr);
-+
-+ //lzm mod 20081201
-+ //mdelay(200);
-+ mdelay(20);
-+
-+ if(read_nic_byte(dev,CMD) & (1<<CMD_RST_SHIFT))
-+ DMESGW("Card reset timeout for ad-hoc!");
-+ else
-+ DMESG("Card successfully reset for ad-hoc");
-+
-+ write_nic_byte(dev,CMD, (read_nic_byte(dev,CMD)|CR_RE|CR_TE));
-+ spin_lock_irqsave(&priv->ieee80211->beaconflag_lock,flag);
-+ priv->flag_beacon = true;
-+ spin_unlock_irqrestore(&priv->ieee80211->beaconflag_lock,flag);
-+
-+ //rtl8187_rx_manage_initiate(dev);
-+ } else {
-+ printk(KERN_WARNING "get the beacon!\n");
-+ skb = ieee80211_get_beacon(priv->ieee80211);
-+ if(!skb){
-+ DMESG("not enought memory for allocating beacon");
-+ return;
-+ }
-+
-+ write_nic_byte(dev, BQREQ, read_nic_byte(dev, BQREQ) | (1<<7));
-+
-+ i=0;
-+ //while(!read_nic_byte(dev,BQREQ & (1<<7)))
-+ while( (read_nic_byte(dev, BQREQ) & (1<<7)) == 0 )
-+ {
-+ msleep_interruptible_rtl(HZ/2);
-+ if(i++ > 10){
-+ DMESGW("get stuck to wait HW beacon to be ready");
-+ return ;
-+ }
-+ }
-+ //tx
-+ rtl8180_tx(dev, (u32*)skb->data, skb->len, NORM_PRIORITY,
-+ 0, ieeerate2rtlrate(priv->ieee80211->basic_rate));
-+ if(skb)
-+ dev_kfree_skb_any(skb);
-+ }
-+}
-+
-+#if 0
-+void rtl8187_nptx_isr(struct urb *tx_urb, struct pt_regs *regs)
-+{
-+ struct net_device *dev = (struct net_device*)tx_urb->context;
-+ struct r8180_priv *priv = ieee80211_priv(dev);
-+
-+ if(tx_urb->status == 0)
-+ priv->stats.txnpokint++;
-+ else
-+ priv->stats.txnperr++;
-+ kfree(tx_urb->transfer_buffer);
-+ usb_free_urb(tx_urb);
-+ atomic_dec(&priv->tx_np_pending);
-+ //rtl8180_try_wake_queue(dev,NORM_PRIORITY);
-+}
-+#endif
-+inline u8 rtl8180_IsWirelessBMode(u16 rate)
-+{
-+ if( ((rate <= 110) && (rate != 60) && (rate != 90)) || (rate == 220) )
-+ return 1;
-+ else return 0;
-+}
-+
-+u16 N_DBPSOfRate(u16 DataRate);
-+
-+u16 ComputeTxTime(
-+ u16 FrameLength,
-+ u16 DataRate,
-+ u8 bManagementFrame,
-+ u8 bShortPreamble
-+ )
-+{
-+ u16 FrameTime;
-+ u16 N_DBPS;
-+ u16 Ceiling;
-+
-+ if( rtl8180_IsWirelessBMode(DataRate) )
-+ {
-+ if( bManagementFrame || !bShortPreamble || DataRate == 10 ){ // long preamble
-+ FrameTime = (u16)(144+48+(FrameLength*8/(DataRate/10)));
-+ }else{ // Short preamble
-+ FrameTime = (u16)(72+24+(FrameLength*8/(DataRate/10)));
-+ }
-+ if( ( FrameLength*8 % (DataRate/10) ) != 0 ) //Get the Ceilling
-+ FrameTime ++;
-+ } else { //802.11g DSSS-OFDM PLCP length field calculation.
-+ N_DBPS = N_DBPSOfRate(DataRate);
-+ Ceiling = (16 + 8*FrameLength + 6) / N_DBPS
-+ + (((16 + 8*FrameLength + 6) % N_DBPS) ? 1 : 0);
-+ FrameTime = (u16)(16 + 4 + 4*Ceiling + 6);
-+ }
-+ return FrameTime;
-+}
-+
-+u16 N_DBPSOfRate(u16 DataRate)
-+{
-+ u16 N_DBPS = 24;
-+
-+ switch(DataRate)
-+ {
-+ case 60:
-+ N_DBPS = 24;
-+ break;
-+
-+ case 90:
-+ N_DBPS = 36;
-+ break;
-+
-+ case 120:
-+ N_DBPS = 48;
-+ break;
-+
-+ case 180:
-+ N_DBPS = 72;
-+ break;
-+
-+ case 240:
-+ N_DBPS = 96;
-+ break;
-+
-+ case 360:
-+ N_DBPS = 144;
-+ break;
-+
-+ case 480:
-+ N_DBPS = 192;
-+ break;
-+
-+ case 540:
-+ N_DBPS = 216;
-+ break;
-+
-+ default:
-+ break;
-+ }
-+
-+ return N_DBPS;
-+}
-+// NOte!!!
-+// the rate filled in is the rtl_rate.
-+// while the priv->ieee80211->basic_rate,used in the following code is ieee80211 rate.
-+
-+#ifdef JUST_FOR_87SEMESH
-+#define ActionHeadLen 30
-+#endif
-+#define sCrcLng 4
-+#define sAckCtsLng 112 // bits in ACK and CTS frames
-+short rtl8180_tx(struct net_device *dev, u32* txbuf, int len, priority_t priority,
-+ short morefrag, short rate)
-+{
-+ u32 *tx;
-+ int pend ;
-+ int status;
-+ struct urb *tx_urb;
-+ int urb_len;
-+ struct r8180_priv *priv = ieee80211_priv(dev);
-+ struct ieee80211_hdr_3addr_QOS *frag_hdr = (struct ieee80211_hdr_3addr_QOS *)txbuf;
-+ struct ieee80211_device *ieee;//added for descriptor
-+ u8 dest[ETH_ALEN];
-+
-+ bool bUseShortPreamble = false;
-+ bool bCTSEnable = false;
-+ bool bRTSEnable = false;
-+ u16 Duration = 0;
-+ u16 RtsDur = 0;
-+ u16 ThisFrameTime = 0;
-+ u16 TxDescDuration = 0;
-+
-+ ieee = priv->ieee80211;
-+#if 0
-+//{added by david for filter the packet listed in the filter table
-+#ifdef _RTL8187_EXT_PATCH_
-+ if((ieee->iw_mode == ieee->iw_ext_mode) && (ieee->ext_patch_ieee80211_acl_query))
-+ {
-+ if(!ieee->ext_patch_ieee80211_acl_query(ieee, frag_hdr->addr1)) {
-+ return 0;
-+ }
-+ }
-+#endif
-+//}
-+#endif
-+
-+#ifdef JUST_FOR_87SEMESH
-+//#ifdef Lawrence_Mesh
-+ u8* meshtype = (u8*)txbuf;
-+ if(*meshtype == 0xA8)
-+ {
-+ //overflow??
-+ //memcpy(meshtype+ActionHeadLen+2,meshtype+ActionHeadLen,Len-ActionHeadLen);
-+ //memcpy(meshtype+ActionHeadLen,0,2);
-+ u8 actionframe[256];
-+ memset(actionframe,0,256);
-+ memcpy(actionframe,meshtype,ActionHeadLen);
-+ memcpy(actionframe+ActionHeadLen+2,meshtype+ActionHeadLen,len-ActionHeadLen);
-+ txbuf = (u32*)actionframe;
-+ len=len+2;
-+ frag_hdr = (struct ieee80211_hdr_3addr_QOS *)txbuf;
-+ }
-+#endif
-+
-+ //pend = atomic_read((priority == NORM_PRIORITY)? &priv->tx_np_pending : &priv->tx_lp_pending);
-+ pend = atomic_read(&priv->tx_pending[priority]);
-+ /* we are locked here so the two atomic_read and inc are executed without interleaves */
-+ if( pend > MAX_TX_URB){
-+ if(NIC_8187 == priv->card_8187) {
-+ if(priority == NORM_PRIORITY)
-+ priv->stats.txnpdrop++;
-+ else
-+ priv->stats.txlpdrop++;
-+
-+ } else {
-+ switch (priority) {
-+ case VO_PRIORITY:
-+ priv->stats.txvodrop++;
-+ break;
-+ case VI_PRIORITY:
-+ priv->stats.txvidrop++;
-+ break;
-+ case BE_PRIORITY:
-+ priv->stats.txbedrop++;
-+ break;
-+ case MANAGE_PRIORITY: //lzm for MANAGE_PRIORITY pending
-+ if(priv->commit == 0)
-+ {
-+ priv->commit = 1;
-+ printk(KERN_INFO "manage pkt pending will commit now....\n");
-+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0))
-+ schedule_work(&priv->reset_wq);
-+#else
-+ schedule_task(&priv->reset_wq);
-+#endif
-+ }
-+ break;
-+ default://BK_PRIORITY
-+ priv->stats.txbkdrop++;
-+ break;
-+ }
-+ }
-+ //printk(KERN_INFO "tx_pending: %d > MAX_TX_URB\n", priority);
-+ return -1;
-+ }
-+
-+ urb_len = len + ((NIC_8187 == priv->card_8187)?(4*3):(4*8));
-+ if((0 == (urb_len&63))||(0 == (urb_len&511))) {
-+ urb_len += 1;
-+ }
-+
-+ tx = kmalloc(urb_len, GFP_ATOMIC);
-+ if(!tx) return -ENOMEM;
-+ memset(tx, 0, sizeof(u32) * 8);
-+
-+#if LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0)
-+ tx_urb = usb_alloc_urb(0,GFP_ATOMIC);
-+#else
-+ tx_urb = usb_alloc_urb(0);
-+#endif
-+
-+ if(!tx_urb){
-+ kfree(tx);
-+ return -ENOMEM;
-+ }
-+
-+ // Check multicast/broadcast
-+ if (ieee->iw_mode == IW_MODE_INFRA) {
-+ /* To DS: Addr1 = BSSID, Addr2 = SA,
-+ Addr3 = DA */
-+ //memcpy(&dest, frag_hdr->addr3, ETH_ALEN);
-+ memcpy(&dest, frag_hdr->addr1, ETH_ALEN);
-+ } else if (ieee->iw_mode == IW_MODE_ADHOC) {
-+ /* not From/To DS: Addr1 = DA, Addr2 = SA,
-+ Addr3 = BSSID */
-+ memcpy(&dest, frag_hdr->addr1, ETH_ALEN);
-+ }
-+
-+ if (is_multicast_ether_addr(dest) ||is_broadcast_ether_addr(dest))
-+ {
-+ Duration = 0;
-+ RtsDur = 0;
-+ bRTSEnable = false;
-+ bCTSEnable = false;
-+
-+ ThisFrameTime = ComputeTxTime(len + sCrcLng, rtl8180_rate2rate(rate), false, bUseShortPreamble);
-+ TxDescDuration = ThisFrameTime;
-+ } else {// Unicast packet
-+ //u8 AckRate;
-+ u16 AckTime;
-+
-+ // Figure out ACK rate according to BSS basic rate and Tx rate, 2006.03.08 by rcnjko.
-+ //AckRate = ComputeAckRate( pMgntInfo->mBrates, (u1Byte)(pTcb->DataRate) );
-+ // Figure out ACK time according to the AckRate and assume long preamble is used on receiver, 2006.03.08, by rcnjko.
-+ //AckTime = ComputeTxTime( sAckCtsLng/8, AckRate, FALSE, FALSE);
-+ //For simplicity, just use the 1M basic rate
-+ AckTime = ComputeTxTime(14, 10,false, false); // AckCTSLng = 14 use 1M bps send
-+ //AckTime = ComputeTxTime(14, 2,false, false); // AckCTSLng = 14 use 1M bps send
-+
-+ if ( ((len + sCrcLng) > priv->rts) && priv->rts ){ // RTS/CTS.
-+ u16 RtsTime, CtsTime;
-+ //u16 CtsRate;
-+ bRTSEnable = true;
-+ bCTSEnable = false;
-+
-+ // Rate and time required for RTS.
-+ RtsTime = ComputeTxTime( sAckCtsLng/8,priv->ieee80211->basic_rate, false, false);
-+ // Rate and time required for CTS.
-+ CtsTime = ComputeTxTime(14, 10,false, false); // AckCTSLng = 14 use 1M bps send
-+
-+ // Figure out time required to transmit this frame.
-+ ThisFrameTime = ComputeTxTime(len + sCrcLng,
-+ rtl8180_rate2rate(rate),
-+ false,
-+ bUseShortPreamble);
-+
-+ // RTS-CTS-ThisFrame-ACK.
-+ RtsDur = CtsTime + ThisFrameTime + AckTime + 3*aSifsTime;
-+
-+ TxDescDuration = RtsTime + RtsDur;
-+ }else {// Normal case.
-+ bCTSEnable = false;
-+ bRTSEnable = false;
-+ RtsDur = 0;
-+
-+ ThisFrameTime = ComputeTxTime(len + sCrcLng, rtl8180_rate2rate(rate), false, bUseShortPreamble);
-+ TxDescDuration = ThisFrameTime + aSifsTime + AckTime;
-+ }
-+
-+ if(!(frag_hdr->frame_ctl & IEEE80211_FCTL_MOREFRAGS)) { //no more fragment
-+ // ThisFrame-ACK.
-+ Duration = aSifsTime + AckTime;
-+ } else { // One or more fragments remained.
-+ u16 NextFragTime;
-+ NextFragTime = ComputeTxTime( len + sCrcLng, //pretend following packet length equal current packet
-+ rtl8180_rate2rate(rate),
-+ false, bUseShortPreamble );
-+
-+ //ThisFrag-ACk-NextFrag-ACK.
-+ Duration = NextFragTime + 3*aSifsTime + 2*AckTime;
-+ }
-+
-+ } // End of Unicast packet
-+
-+
-+ //fill the tx desriptor
-+ tx[0] |= len & 0xfff;
-+#ifdef JOHN_HWSEC
-+ if(frag_hdr->frame_ctl & IEEE80211_FCTL_WEP ){
-+ tx[0] &= 0xffff7fff;
-+ //group key may be different from pairwise key
-+ if( frag_hdr->addr1[0]==0xff &&
-+ frag_hdr->addr1[0]==0xff &&
-+ frag_hdr->addr1[0]==0xff &&
-+ frag_hdr->addr1[0]==0xff &&
-+ frag_hdr->addr1[0]==0xff &&
-+ frag_hdr->addr1[0]==0xff ){
-+ if(ieee->broadcast_key_type == KEY_TYPE_CCMP) tx[7] |= 0x2;//ccmp
-+ else tx[7] |= 0x1;//wep and tkip
-+ }
-+ else {
-+ if(ieee->pairwise_key_type == KEY_TYPE_CCMP) tx[7] |= 0x2;//CCMP
-+ else tx[7] |= 0x1;//WEP and TKIP
-+ }
-+ }
-+ else
-+#endif /*JOHN_HWSEC*/
-+
-+ tx[0] |= (1<<15);
-+
-+ if (priv->ieee80211->current_network.capability&WLAN_CAPABILITY_SHORT_PREAMBLE){
-+ if (priv->plcp_preamble_mode==1 && rate!=0) { // short mode now, not long!
-+ tx[0] |= (1<<16);
-+ } // enable short preamble mode.
-+ }
-+
-+ if(morefrag) tx[0] |= (1<<17);
-+ //printk(KERN_WARNING "rtl_rate = %d\n", rate);
-+ tx[0] |= (rate << 24); //TX rate
-+ frag_hdr->duration_id = Duration;
-+
-+ if(NIC_8187B == priv->card_8187) {
-+ if(bCTSEnable) {
-+ tx[0] |= (1<<18);
-+ }
-+
-+ if(bRTSEnable) //rts enable
-+ {
-+ tx[0] |= ((ieeerate2rtlrate(priv->ieee80211->basic_rate))<<19);//RTS RATE
-+ tx[0] |= (1<<23);//rts enable
-+ tx[1] |= RtsDur;//RTS Duration
-+ }
-+ tx[3] |= (TxDescDuration<<16); //DURATION
-+ if( WLAN_FC_GET_STYPE(le16_to_cpu(frag_hdr->frame_ctl)) == IEEE80211_STYPE_PROBE_RESP )
-+ tx[5] |= (1<<8);//(priv->retry_data<<8); //retry lim ;
-+ else
-+ tx[5] |= (11<<8);//(priv->retry_data<<8); //retry lim ;
-+
-+ //frag_hdr->duration_id = Duration;
-+ memcpy(tx+8,txbuf,len);
-+ } else {
-+ if ( (len>priv->rts) && priv->rts && priority==LOW_PRIORITY){
-+ tx[0] |= (1<<23); //enalbe RTS function
-+ tx[1] |= RtsDur; //Need to edit here! ----hikaru
-+ }
-+ else {
-+ tx[1]=0;
-+ }
-+ tx[0] |= (ieeerate2rtlrate(priv->ieee80211->basic_rate) << 19); /* RTS RATE - should be basic rate */
-+
-+ tx[2] = 3; // CW min
-+ tx[2] |= (7<<4); //CW max
-+ tx[2] |= (11<<8);//(priv->retry_data<<8); //retry lim
-+
-+ // printk("%x\n%x\n",tx[0],tx[1]);
-+
-+#ifdef DUMP_TX
-+ int i;
-+ printk("<Tx pkt>--rate %x---",rate);
-+ for (i = 0; i < (len + 3); i++)
-+ printk("%2x", ((u8*)tx)[i]);
-+ printk("---------------\n");
-+#endif
-+ memcpy(tx+3,txbuf,len);
-+ }
-+
-+#ifdef JOHN_DUMP_TXDESC
-+ int i;
-+ printk("<Tx descriptor>--rate %x---",rate);
-+ for (i = 0; i < 8; i++)
-+ printk("%8x ", tx[i]);
-+ printk("\n");
-+#endif
-+#ifdef JOHN_DUMP_TXPKT
-+ {
-+ int j;
-+ printk("\n---------------------------------------------------------------------\n");
-+ printk("<Tx packet>--rate %x--urb_len in decimal %d",rate, urb_len);
-+ for (j = 32; j < (urb_len); j++){
-+ if( ( (j-32)%24 )==0 ) printk("\n");
-+ printk("%2x ", ((u8*)tx)[j]);
-+ }
-+ printk("\n---------------------------------------------------------------------\n");
-+
-+ }
-+#endif
-+
-+ if(NIC_8187 == priv->card_8187) {
-+ usb_fill_bulk_urb(tx_urb,priv->udev,
-+ usb_sndbulkpipe(priv->udev,priority), tx,
-+ urb_len, (priority == LOW_PRIORITY)?rtl8187_lptx_isr:rtl8187_nptx_isr, dev);
-+
-+ } else {
-+ //printk(KERN_WARNING "Tx packet use by submit urb!\n");
-+ /* FIXME check what EP is for low/norm PRI */
-+ usb_fill_bulk_urb(tx_urb,priv->udev,
-+ usb_sndbulkpipe(priv->udev,priority), tx,
-+ urb_len, TXISR_SELECT(priority), dev);
-+ }
-+
-+#if LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0)
-+ status = usb_submit_urb(tx_urb, GFP_ATOMIC);
-+#else
-+ status = usb_submit_urb(tx_urb);
-+#endif
-+
-+ if (!status){
-+ //atomic_inc((priority == NORM_PRIORITY)? &priv->tx_np_pending : &priv->tx_lp_pending);
-+ atomic_inc(&priv->tx_pending[priority]);
-+ dev->trans_start = jiffies;
-+ //printk("=====> tx_pending[%d]=%d\n", priority, atomic_read(&priv->tx_pending[priority]));
-+ return 0;
-+ }else{
-+ DMESGE("Error TX URB %d, error pending %d",
-+ //atomic_read((priority == NORM_PRIORITY)? &priv->tx_np_pending : &priv->tx_lp_pending),
-+ atomic_read(&priv->tx_pending[priority]),
-+ status);
-+ return -1;
-+ }
-+}
-+
-+ short rtl8187_usb_initendpoints(struct net_device *dev)
-+{
-+ struct r8180_priv *priv = ieee80211_priv(dev);
-+
-+ priv->rx_urb = (struct urb**) kmalloc (sizeof(struct urb*) * (MAX_RX_URB+1), GFP_KERNEL);
-+
-+ memset(priv->rx_urb, 0, sizeof(struct urb*) * MAX_RX_URB);
-+
-+#ifdef JACKSON_NEW_RX
-+ priv->pp_rxskb = (struct sk_buff **)kmalloc(sizeof(struct sk_buff *) * MAX_RX_URB, GFP_KERNEL);
-+ if (priv->pp_rxskb == NULL)
-+ goto destroy;
-+
-+ memset(priv->pp_rxskb, 0, sizeof(struct sk_buff*) * MAX_RX_URB);
-+#endif
-+#ifdef THOMAS_BEACON
-+ {
-+ int align;
-+ unsigned long oldaddr,newaddr; //lzm mod for 64bit cpu crash 20081107
-+ priv->rx_urb[MAX_RX_URB] = usb_alloc_urb(0, GFP_KERNEL);
-+ priv->oldaddr = kmalloc(16, GFP_KERNEL);
-+ oldaddr = (unsigned long)priv->oldaddr;
-+ align = oldaddr&3;
-+ if(align != 0 ){
-+ newaddr = oldaddr + 4 - align;
-+ priv->rx_urb[MAX_RX_URB]->transfer_buffer_length = 16-4+align;
-+ }
-+ else{
-+ newaddr = oldaddr;
-+ priv->rx_urb[MAX_RX_URB]->transfer_buffer_length = 16;
-+ }
-+ priv->rx_urb[MAX_RX_URB]->transfer_buffer = (u32*)newaddr;
-+ }
-+#endif
-+
-+
-+ goto _middle;
-+
-+
-+destroy:
-+
-+#ifdef JACKSON_NEW_RX
-+ if (priv->pp_rxskb) {
-+ kfree(priv->pp_rxskb);
-+ priv->pp_rxskb = NULL;
-+
-+ }
-+#endif
-+ if (priv->rx_urb) {
-+ kfree(priv->rx_urb);
-+ }
-+ priv->rx_urb = NULL;
-+
-+ DMESGE("Endpoint Alloc Failure");
-+ return -ENOMEM;
-+
-+
-+_middle:
-+
-+ return 0;
-+
-+}
-+#ifdef THOMAS_BEACON
-+void rtl8187_usb_deleteendpoints(struct net_device *dev)
-+{
-+ int i;
-+ struct r8180_priv *priv = ieee80211_priv(dev);
-+
-+ if( in_interrupt() )
-+ printk(KERN_ALERT " %ld in interrupt \n",in_interrupt() );
-+ if(priv->rx_urb){
-+ for(i=0;i<(MAX_RX_URB+1);i++){
-+ if(priv->rx_urb[i]) {
-+ usb_kill_urb(priv->rx_urb[i]);
-+ usb_free_urb(priv->rx_urb[i]);
-+ }
-+ }
-+ kfree(priv->rx_urb);
-+ priv->rx_urb = NULL;
-+ }
-+ if(priv->oldaddr){
-+ kfree(priv->oldaddr);
-+ priv->oldaddr = NULL;
-+ }
-+ if (priv->pp_rxskb) {
-+ kfree(priv->pp_rxskb);
-+ priv->pp_rxskb = 0;
-+ }
-+}
-+#endif
-+
-+void rtl8187_set_rate(struct net_device *dev)
-+{
-+ int i;
-+ u16 word;
-+ int basic_rate,min_rr_rate,max_rr_rate;
-+
-+ //if (ieee80211_is_54g(priv->ieee80211->current_network) &&
-+ // priv->ieee80211->state == IEEE80211_LINKED){
-+ basic_rate = ieeerate2rtlrate(240);
-+ min_rr_rate = ieeerate2rtlrate(60);
-+ max_rr_rate = ieeerate2rtlrate(240);
-+
-+ /*
-+ }else{
-+ basic_rate = ieeerate2rtlrate(20);
-+ min_rr_rate = ieeerate2rtlrate(10);
-+ max_rr_rate = ieeerate2rtlrate(110);
-+ }
-+ */
-+
-+ write_nic_byte(dev, RESP_RATE,
-+ max_rr_rate<<MAX_RESP_RATE_SHIFT| min_rr_rate<<MIN_RESP_RATE_SHIFT);
-+
-+ //word = read_nic_word(dev, BRSR);
-+ word = read_nic_word(dev, BRSR_8187);
-+ word &= ~BRSR_MBR_8185;
-+
-+
-+ for(i=0;i<=basic_rate;i++)
-+ word |= (1<<i);
-+
-+ //write_nic_word(dev, BRSR, word);
-+ write_nic_word(dev, BRSR_8187, word);
-+}
-+
-+
-+void rtl8187_link_change(struct net_device *dev)
-+{
-+ struct r8180_priv *priv = ieee80211_priv(dev);
-+ //write_nic_word(dev, BintrItv, net->beacon_interval);
-+ rtl8187_net_update(dev);
-+ /*update timing params*/
-+ rtl8180_set_chan(dev, priv->chan);
-+ rtl8187_set_rxconf(dev);
-+}
-+
-+#if LINUX_VERSION_CODE >=KERNEL_VERSION(2,6,20)
-+void rtl8180_wmm_param_update(struct work_struct* work)
-+{
-+ struct ieee80211_device * ieee = container_of(work, struct ieee80211_device,wmm_param_update_wq);
-+ struct net_device *dev = ieee->dev;
-+ struct r8180_priv *priv = ieee80211_priv(dev);
-+#else
-+void rtl8180_wmm_param_update(struct ieee80211_device *ieee)
-+{
-+ struct net_device *dev = ieee->dev;
-+ struct r8180_priv *priv = ieee80211_priv(dev);
-+#endif
-+ u8 *ac_param = (u8 *)(ieee->current_network.wmm_param);
-+ u8 mode = ieee->current_network.mode;
-+ AC_CODING eACI;
-+ AC_PARAM AcParam;
-+ PAC_PARAM pAcParam;
-+ u8 i;
-+
-+ //8187 need not to update wmm param, added by David, 2006.9.8
-+ if(NIC_8187 == priv->card_8187) {
-+ return;
-+ }
-+
-+ if(!ieee->current_network.QoS_Enable)
-+ {
-+ //legacy ac_xx_param update
-+
-+ AcParam.longData = 0;
-+ AcParam.f.AciAifsn.f.AIFSN = 2; // Follow 802.11 DIFS.
-+ AcParam.f.AciAifsn.f.ACM = 0;
-+ AcParam.f.Ecw.f.ECWmin = 3; // Follow 802.11 CWmin.
-+ AcParam.f.Ecw.f.ECWmax = 7; // Follow 802.11 CWmax.
-+ AcParam.f.TXOPLimit = 0;
-+ for(eACI = 0; eACI < AC_MAX; eACI++)
-+ {
-+ AcParam.f.AciAifsn.f.ACI = (u8)eACI;
-+ {
-+ u8 u1bAIFS;
-+ u32 u4bAcParam;
-+
-+
-+ pAcParam = (PAC_PARAM)(&AcParam);
-+ // Retrive paramters to udpate.
-+ u1bAIFS = pAcParam->f.AciAifsn.f.AIFSN *(((mode&IEEE_G) == IEEE_G)?9:20) + aSifsTime;
-+ u4bAcParam = ((((u32)(pAcParam->f.TXOPLimit)) << AC_PARAM_TXOP_LIMIT_OFFSET) |
-+ (((u32)(pAcParam->f.Ecw.f.ECWmax)) << AC_PARAM_ECW_MAX_OFFSET) |
-+ (((u32)(pAcParam->f.Ecw.f.ECWmin)) << AC_PARAM_ECW_MIN_OFFSET) |
-+ (((u32)u1bAIFS) << AC_PARAM_AIFS_OFFSET));
-+
-+ switch(eACI)
-+ {
-+ case AC1_BK:
-+ write_nic_dword(dev, AC_BK_PARAM, u4bAcParam);
-+ break;
-+
-+ case AC0_BE:
-+ write_nic_dword(dev, AC_BE_PARAM, u4bAcParam);
-+ break;
-+
-+ case AC2_VI:
-+ write_nic_dword(dev, AC_VI_PARAM, u4bAcParam);
-+ break;
-+
-+ case AC3_VO:
-+ write_nic_dword(dev, AC_VO_PARAM, u4bAcParam);
-+ break;
-+
-+ default:
-+ printk(KERN_WARNING "SetHwReg8185(): invalid ACI: %d !\n", eACI);
-+ break;
-+ }
-+ }
-+ }
-+
-+ return;
-+ }
-+ //
-+ for(i = 0; i < AC_MAX; i++){
-+ pAcParam = (AC_PARAM * )ac_param;
-+ {
-+ AC_CODING eACI;
-+ u8 u1bAIFS;
-+ u32 u4bAcParam;
-+
-+ // Retrive paramters to udpate.
-+ eACI = pAcParam->f.AciAifsn.f.ACI;
-+ //Mode G/A: slotTimeTimer = 9; Mode B: 20
-+ u1bAIFS = pAcParam->f.AciAifsn.f.AIFSN * (((mode&IEEE_G) == IEEE_G)?9:20) + aSifsTime;
-+ u4bAcParam = ((((u32)(pAcParam->f.TXOPLimit)) << AC_PARAM_TXOP_LIMIT_OFFSET) |
-+ (((u32)(pAcParam->f.Ecw.f.ECWmax)) << AC_PARAM_ECW_MAX_OFFSET) |
-+ (((u32)(pAcParam->f.Ecw.f.ECWmin)) << AC_PARAM_ECW_MIN_OFFSET) |
-+ (((u32)u1bAIFS) << AC_PARAM_AIFS_OFFSET));
-+
-+ switch(eACI)
-+ {
-+ case AC1_BK:
-+ write_nic_dword(dev, AC_BK_PARAM, u4bAcParam);
-+ //printk(KERN_WARNING "[%04x]:0x%08x\n",AC_BK_PARAM,read_nic_dword(dev, AC_BK_PARAM));
-+ break;
-+
-+ case AC0_BE:
-+ write_nic_dword(dev, AC_BE_PARAM, u4bAcParam);
-+ //printk(KERN_WARNING "[%04x]:0x%08x\n",AC_BE_PARAM,read_nic_dword(dev, AC_BE_PARAM));
-+ break;
-+
-+ case AC2_VI:
-+ write_nic_dword(dev, AC_VI_PARAM, u4bAcParam);
-+ //printk(KERN_WARNING "[%04x]:0x%08x\n",AC_VI_PARAM,read_nic_dword(dev, AC_VI_PARAM));
-+ break;
-+
-+ case AC3_VO:
-+ write_nic_dword(dev, AC_VO_PARAM, u4bAcParam);
-+ //printk(KERN_WARNING "[%04x]:0x%08x\n",AC_VO_PARAM,read_nic_dword(dev, AC_VO_PARAM));
-+ break;
-+
-+ default:
-+ printk(KERN_WARNING "SetHwReg8185(): invalid ACI: %d !\n", eACI);
-+ break;
-+ }
-+ }
-+ ac_param += (sizeof(AC_PARAM));
-+ }
-+}
-+
-+int IncludedInSupportedRates(struct r8180_priv *priv, u8 TxRate )
-+{
-+ u8 rate_len;
-+ u8 rate_ex_len;
-+ u8 RateMask = 0x7F;
-+ u8 idx;
-+ unsigned short Found = 0;
-+ u8 NaiveTxRate = TxRate&RateMask;
-+
-+ rate_len = priv->ieee80211->current_network.rates_len;
-+ rate_ex_len = priv->ieee80211->current_network.rates_ex_len;
-+
-+ for( idx=0; idx< rate_len; idx++ ){
-+ if( (priv->ieee80211->current_network.rates[idx] & RateMask) == NaiveTxRate ) {
-+ Found = 1;
-+ goto found_rate;
-+ }
-+ }
-+
-+ for( idx=0; idx< rate_ex_len; idx++ ) {
-+ if( (priv->ieee80211->current_network.rates_ex[idx] & RateMask) == NaiveTxRate ) {
-+ Found = 1;
-+ goto found_rate;
-+ }
-+ }
-+
-+ return Found;
-+ found_rate:
-+ return Found;
-+}
-+//
-+// Description:
-+// Get the Tx rate one degree up form the input rate in the supported rates.
-+// Return the upgrade rate if it is successed, otherwise return the input rate.
-+// By Bruce, 2007-06-05.
-+//
-+u8 GetUpgradeTxRate(struct net_device *dev, u8 rate)
-+{
-+ struct r8180_priv *priv = ieee80211_priv(dev);
-+ u8 UpRate;
-+
-+ // Upgrade 1 degree.
-+ switch(rate)
-+ {
-+ case 108: // Up to 54Mbps.
-+ UpRate = 108;
-+ break;
-+
-+ case 96: // Up to 54Mbps.
-+ UpRate = 108;
-+ break;
-+
-+ case 72: // Up to 48Mbps.
-+ UpRate = 96;
-+ break;
-+
-+ case 48: // Up to 36Mbps.
-+ UpRate = 72;
-+ break;
-+
-+ case 36: // Up to 24Mbps.
-+ UpRate = 48;
-+ break;
-+
-+ case 22: // Up to 18Mbps.
-+ UpRate = 36;
-+ break;
-+
-+ case 11: // Up to 11Mbps.
-+ UpRate = 22;
-+ break;
-+
-+ case 4: // Up to 5.5Mbps.
-+ UpRate = 11;
-+ break;
-+
-+ case 2: // Up to 2Mbps.
-+ UpRate = 4;
-+ break;
-+
-+ default:
-+ printk("GetUpgradeTxRate(): Input Tx Rate(%d) is undefined!\n", rate);
-+ return rate;
-+ }
-+ // Check if the rate is valid.
-+ if(IncludedInSupportedRates(priv, UpRate))
-+ {
-+// printk("GetUpgradeTxRate(): GetUpgrade Tx rate(%d) from %d !\n", UpRate, priv->CurrentOperaRate);
-+ return UpRate;
-+ }
-+ else
-+ {
-+ printk("GetUpgradeTxRate(): Tx rate (%d) is not in supported rates\n", UpRate);
-+ return rate;
-+ }
-+ return rate;
-+}
-+//
-+// Description:
-+// Get the Tx rate one degree down form the input rate in the supported rates.
-+// Return the degrade rate if it is successed, otherwise return the input rate.
-+// By Bruce, 2007-06-05.
-+//
-+u8 GetDegradeTxRate( struct net_device *dev, u8 rate)
-+{
-+ struct r8180_priv *priv = ieee80211_priv(dev);
-+ u8 DownRate;
-+
-+ // Upgrade 1 degree.
-+ switch(rate)
-+ {
-+ case 108: // Down to 48Mbps.
-+ DownRate = 96;
-+ break;
-+
-+ case 96: // Down to 36Mbps.
-+ DownRate = 72;
-+ break;
-+
-+ case 72: // Down to 24Mbps.
-+ DownRate = 48;
-+ break;
-+
-+ case 48: // Down to 18Mbps.
-+ DownRate = 36;
-+ break;
-+
-+ case 36: // Down to 11Mbps.
-+ DownRate = 22;
-+ break;
-+
-+ case 22: // Down to 5.5Mbps.
-+ DownRate = 11;
-+ break;
-+
-+ case 11: // Down to 2Mbps.
-+ DownRate = 4;
-+ break;
-+
-+ case 4: // Down to 1Mbps.
-+ DownRate = 2;
-+ break;
-+
-+ case 2: // Down to 1Mbps.
-+ DownRate = 2;
-+ break;
-+
-+ default:
-+ printk("GetDegradeTxRate(): Input Tx Rate(%d) is undefined!\n", rate);
-+ return rate;
-+ }
-+ // Check if the rate is valid.
-+ if(IncludedInSupportedRates(priv, DownRate)){
-+// printk("GetDegradeTxRate(): GetDegrade Tx rate(%d) from %d!\n", DownRate, priv->CurrentOperaRate);
-+ return DownRate;
-+ }else{
-+ printk("GetDegradeTxRate(): Tx rate (%d) is not in supported rates\n", DownRate);
-+ return rate;
-+ }
-+ return rate;
-+}
-+
-+//
-+// Helper function to determine if specified data rate is
-+// CCK rate.
-+// 2005.01.25, by rcnjko.
-+//
-+bool MgntIsCckRate(u16 rate )
-+{
-+ bool bReturn = false;
-+
-+ if((rate <= 22) && (rate != 12) && (rate != 18)){
-+ bReturn = true;
-+ }
-+
-+ return bReturn;
-+}
-+//by amy for rate adaptive
-+//
-+// Description:
-+// Core logic to adjust Tx data rate in STA mode according to
-+// OFDM retry count ratio.
-+//
-+// Note:
-+// RTL8187 : pHalData->CurrRetryCnt = TallyCnt
-+// RTL8187B : pHalData->CurrRetryCnt = PktRetryCnt in TxClosedCommand
-+//
-+void sta_rateadaptive8187B(struct net_device *dev)
-+{
-+ struct r8180_priv *priv = ieee80211_priv(dev);
-+ unsigned long CurrTxokCnt;
-+ u16 CurrRetryCnt;
-+ u16 CurrRetryRate;
-+ unsigned long CurrRxokCnt;
-+ bool bTryUp = false;
-+ bool bTryDown = false;
-+ u8 TryUpTh = 1;
-+ u8 TryDownTh = 2;
-+ u32 TxThroughput;
-+ long CurrSignalStrength;
-+ bool bUpdateInitialGain = false;
-+ CurrRetryCnt = priv->CurrRetryCnt;
-+ CurrTxokCnt = (priv->stats.txbeaconokint + priv->stats.txmanageokint +
-+ priv->stats.txvookint + priv->stats.txviokint + priv->stats.txbeokint)- priv->LastTxokCnt;
-+ CurrRxokCnt = priv->stats.rxok - priv->LastRxokCnt;
-+ CurrSignalStrength = priv->RecvSignalPower;
-+ TxThroughput = (u32)(priv->txokbytestotal - priv->LastTxOKBytes);
-+ priv->LastTxOKBytes = priv->txokbytestotal;
-+ priv->CurrentOperaRate = priv->ieee80211->rate / 5;
-+ //printk("priv->CurrentOperaRate is %d\n",priv->CurrentOperaRate);
-+
-+#if 1
-+ //2 Compute retry ratio.
-+ if (CurrTxokCnt>0)
-+ {
-+ CurrRetryRate = (u16)(CurrRetryCnt*100/CurrTxokCnt);
-+ }
-+ else
-+ { // It may be serious retry. To distinguish serious retry or no packets modified by Bruce
-+ CurrRetryRate = (u16)(CurrRetryCnt*100/1);
-+ }
-+#endif
-+
-+
-+ //printk("\n(1) priv->LastRetryRate: %d \n",priv->LastRetryRate);
-+ //printk("(2) CurrRetryCnt = %d \n", CurrRetryCnt);
-+ //printk("(3) TxokCnt = %d \n", CurrTxokCnt);
-+ //printk("(4) CurrRetryRate = %d \n", CurrRetryRate);
-+ //printk("(5) SignalStrength = %d \n",priv->RecvSignalPower);
-+
-+ priv->LastRetryCnt = priv->CurrRetryCnt;
-+ priv->LastTxokCnt = (priv->stats.txbeaconokint + priv->stats.txmanageokint +
-+ priv->stats.txvookint + priv->stats.txviokint + priv->stats.txbeokint);
-+ priv->LastRxokCnt = priv->stats.rxok;
-+ priv->CurrRetryCnt = 0;
-+ //2No Tx packets, return to init_rate or not?
-+ if (CurrRetryRate==0 && CurrTxokCnt == 0)
-+ {
-+ //
-+ // 2007.04.09, by Roger. after 4.5 seconds in this condition, we try to raise rate.
-+ //
-+ priv->TryupingCountNoData++;
-+
-+ //printk("No Tx packets, TryupingCountNoData(%d)\n", priv->TryupingCountNoData);
-+ //printk("(6) priv->CurrentOperaRate =%d\n", priv->CurrentOperaRate);
-+
-+ if (priv->TryupingCountNoData>15)
-+ {
-+ priv->TryupingCountNoData = 0;
-+ priv->CurrentOperaRate = GetUpgradeTxRate(dev, priv->CurrentOperaRate);
-+ // Reset Fail Record
-+ priv->LastFailTxRate = 0;
-+ priv->LastFailTxRateSS = -200;
-+ priv->FailTxRateCount = 0;
-+ }
-+ goto SetInitialGain;
-+ }
-+ else
-+ {
-+ priv->TryupingCountNoData=0; //Reset trying up times.
-+ }
-+
-+ //
-+ // For Netgear case, I comment out the following signal strength estimation,
-+ // which can results in lower rate to transmit when sample is NOT enough (e.g. PING request).
-+ // 2007.04.09, by Roger.
-+ //
-+#if 1
-+ // If sample is not enough, we use signalstrength.
-+ if ( CurrTxokCnt<10|| CurrRetryCnt<10)
-+ {
-+ //printk("Sample is not enough, we use signalstrength for rate adaptive\n");
-+ //After 3 sec, and trying up.
-+ priv->TryupingCountNoData++;
-+ if (priv->TryupingCountNoData>10)
-+ {
-+ //printk("Sample is not enough and After 3 sec try up\n");
-+ priv->TryupingCountNoData=0;
-+
-+ //
-+ // Added by Roger, 2007.01.04.
-+ // Signal strength plus 3 for air link.
-+ //
-+
-+ if ( CurrSignalStrength>-68 )//&& IncludedInSupportedRates(Adapter, 108) )
-+ {
-+ priv->ieee80211->rate = 540;
-+ //pMgntInfo->CurrentOperaRate = 108;
-+ }
-+ else if (CurrSignalStrength>-70)// && IncludedInSupportedRates(Adapter, 96) )
-+ {
-+ priv->ieee80211->rate = 480;
-+ //pMgntInfo->CurrentOperaRate = 96;
-+ }
-+ else if (CurrSignalStrength>-73)// && IncludedInSupportedRates(Adapter, 72) )
-+ {
-+ priv->ieee80211->rate = 360;
-+ //pMgntInfo->CurrentOperaRate = 72;
-+ }
-+ else if (CurrSignalStrength>-79)// && IncludedInSupportedRates(Adapter, 48) )
-+ {
-+ priv->ieee80211->rate = 240;
-+ //pMgntInfo->CurrentOperaRate = 48;
-+ }
-+ else if (CurrSignalStrength>-81)// && IncludedInSupportedRates(Adapter, 36) )
-+ {
-+ priv->ieee80211->rate = 180;
-+ //pMgntInfo->CurrentOperaRate = 36;
-+ }
-+ else if (CurrSignalStrength>-83)// && IncludedInSupportedRates(Adapter, 22) )
-+ {
-+ priv->ieee80211->rate = 110;
-+ //pMgntInfo->CurrentOperaRate = 22;
-+ }
-+ else if (CurrSignalStrength>-85)// && IncludedInSupportedRates(Adapter, 11) )
-+ {
-+ priv->ieee80211->rate = 55;
-+ //pMgntInfo->CurrentOperaRate = 11;
-+ }
-+ else if (CurrSignalStrength>-89)// && IncludedInSupportedRates(Adapter, 4) )
-+ {
-+ priv->ieee80211->rate = 20;
-+ //pMgntInfo->CurrentOperaRate = 4;
-+ }
-+
-+
-+ }
-+
-+ //2004.12.23 skip record for 0
-+ //pHalData->LastRetryRate = CurrRetryRate;
-+ //printk("pMgntInfo->CurrentOperaRate =%d\n",priv->ieee80211->rate);
-+ return;
-+ }
-+ else
-+ {
-+ priv->TryupingCountNoData=0;
-+ }
-+#endif
-+ //
-+ // Restructure rate adaptive as the following main stages:
-+ // (1) Add retry threshold in 54M upgrading condition with signal strength.
-+ // (2) Add the mechanism to degrade to CCK rate according to signal strength
-+ // and retry rate.
-+ // (3) Remove all Initial Gain Updates over OFDM rate. To avoid the complicated
-+ // situation, Initial Gain Update is upon on DIG mechanism except CCK rate.
-+ // (4) Add the mehanism of trying to upgrade tx rate.
-+ // (5) Record the information of upping tx rate to avoid trying upping tx rate constantly.
-+ // By Bruce, 2007-06-05.
-+ //
-+ //
-+
-+ // 11Mbps or 36Mbps
-+ // Check more times in these rate(key rates).
-+ //
-+ if(priv->CurrentOperaRate == 22 || priv->CurrentOperaRate == 72)
-+ {
-+ TryUpTh += 9;
-+ }
-+ //
-+ // Let these rates down more difficult.
-+ //
-+ if(MgntIsCckRate(priv->CurrentOperaRate) || priv->CurrentOperaRate == 36)
-+ {
-+ TryDownTh += 1;
-+ }
-+
-+ //1 Adjust Rate.
-+ if (priv->bTryuping == true)
-+ {
-+ //2 For Test Upgrading mechanism
-+ // Note:
-+ // Sometimes the throughput is upon on the capability bwtween the AP and NIC,
-+ // thus the low data rate does not improve the performance.
-+ // We randomly upgrade the data rate and check if the retry rate is improved.
-+
-+ // Upgrading rate did not improve the retry rate, fallback to the original rate.
-+ if ( (CurrRetryRate > 25) && TxThroughput < priv->LastTxThroughput)
-+ {
-+ //Not necessary raising rate, fall back rate.
-+ bTryDown = true;
-+ //printk("Not necessary raising rate, fall back rate....\n");
-+ //printk("(7) priv->CurrentOperaRate =%d, TxThroughput = %d, LastThroughput = %d\n",
-+ // priv->CurrentOperaRate, TxThroughput, priv->LastTxThroughput);
-+ }
-+ else
-+ {
-+ priv->bTryuping = false;
-+ }
-+ }
-+ else if (CurrSignalStrength > -51 && (CurrRetryRate < 100))
-+ {
-+ //2For High Power
-+ //
-+ // Added by Roger, 2007.04.09.
-+ // Return to highest data rate, if signal strength is good enough.
-+ // SignalStrength threshold(-50dbm) is for RTL8186.
-+ // Revise SignalStrength threshold to -51dbm.
-+ //
-+ // Also need to check retry rate for safety, by Bruce, 2007-06-05.
-+ if(priv->CurrentOperaRate != 108)
-+ {
-+ bTryUp = true;
-+ // Upgrade Tx Rate directly.
-+ priv->TryupingCount += TryUpTh;
-+ //printk("StaRateAdaptive87B: Power(%d) is high enough!!. \n", CurrSignalStrength);
-+ }
-+ }
-+ // To avoid unstable rate jumping, comment out this condition, by Bruce, 2007-06-26.
-+ /*
-+ else if(CurrSignalStrength < -86 && CurrRetryRate >= 100)
-+ {
-+ //2 For Low Power
-+ //
-+ // Low signal strength and high current tx rate may cause Tx rate to degrade too slowly.
-+ // Update Tx rate to CCK rate directly.
-+ // By Bruce, 2007-06-05.
-+ //
-+ if(!MgntIsCckRate(pMgntInfo->CurrentOperaRate))
-+ {
-+ if(CurrSignalStrength > -88 && IncludedInSupportedRates(Adapter, 22)) // 11M
-+ pMgntInfo->CurrentOperaRate = 22;
-+ else if(CurrSignalStrength > -90 && IncludedInSupportedRates(Adapter, 11)) // 5.5M
-+ pMgntInfo->CurrentOperaRate = 11;
-+ else if(CurrSignalStrength > -92 && IncludedInSupportedRates(Adapter, 4)) // 2M
-+ pMgntInfo->CurrentOperaRate = 4;
-+ else // 1M
-+ pMgntInfo->CurrentOperaRate = 2;
-+ }
-+ else if(CurrRetryRate >= 200)
-+ {
-+ pMgntInfo->CurrentOperaRate = GetDegradeTxRate(Adapter, pMgntInfo->CurrentOperaRate);
-+ }
-+ RT_TRACE(COMP_RATE, DBG_LOUD, ("RA: Low Power(%d), or High Retry Rate(%d), set rate to CCK rate (%d). \n",
-+ CurrSignalStrength, CurrRetryRate, pMgntInfo->CurrentOperaRate));
-+ bUpdateInitialGain = TRUE;
-+ // Reset Fail Record
-+ pHalData->LastFailTxRate = 0;
-+ pHalData->LastFailTxRateSS = -200;
-+ pHalData->FailTxRateCount = 0;
-+ goto SetInitialGain;
-+ }
-+ */
-+ else if(CurrTxokCnt< 100 && CurrRetryRate >= 600)
-+ {
-+ //2 For Serious Retry
-+ //
-+ // Traffic is not busy but our Tx retry is serious.
-+ //
-+ bTryDown = true;
-+ // Let Rate Mechanism to degrade tx rate directly.
-+ priv->TryDownCountLowData += TryDownTh;
-+ //printk("RA: Tx Retry is serious. Degrade Tx Rate to %d directly...\n", priv->CurrentOperaRate);
-+ }
-+ else if ( priv->CurrentOperaRate == 108 )
-+ {
-+ //2For 54Mbps
-+ // if ( (CurrRetryRate>38)&&(pHalData->LastRetryRate>35))
-+ if ( (CurrRetryRate>33)&&(priv->LastRetryRate>32))
-+ {
-+ //(30,25) for cable link threshold. (38,35) for air link.
-+ //Down to rate 48Mbps.
-+ bTryDown = true;
-+ }
-+ }
-+ else if ( priv->CurrentOperaRate == 96 )
-+ {
-+ //2For 48Mbps
-+ // if ( ((CurrRetryRate>73) && (pHalData->LastRetryRate>72)) && IncludedInSupportedRates(Adapter, 72) )
-+ if ( ((CurrRetryRate>48) && (priv->LastRetryRate>47)))
-+ {
-+ //(73, 72) for temp used.
-+ //(25, 23) for cable link, (60,59) for air link.
-+ //CurrRetryRate plus 25 and 26 respectively for air link.
-+ //Down to rate 36Mbps.
-+ bTryDown = true;
-+ }
-+ else if ( (CurrRetryRate<8) && (priv->LastRetryRate<8) ) //TO DO: need to consider (RSSI)
-+ {
-+ bTryUp = true;
-+ }
-+ }
-+ else if ( priv->CurrentOperaRate == 72 )
-+ {
-+ //2For 36Mbps
-+ //if ( (CurrRetryRate>97) && (pHalData->LastRetryRate>97))
-+ if ( (CurrRetryRate>55) && (priv->LastRetryRate>54))
-+ {
-+ //(30,25) for cable link threshold respectively. (103,10) for air link respectively.
-+ //CurrRetryRate plus 65 and 69 respectively for air link threshold.
-+ //Down to rate 24Mbps.
-+ bTryDown = true;
-+ }
-+ // else if ( (CurrRetryRate<20) && (pHalData->LastRetryRate<20) && IncludedInSupportedRates(Adapter, 96) )//&& (device->LastRetryRate<15) ) //TO DO: need to consider (RSSI)
-+ else if ( (CurrRetryRate<15) && (priv->LastRetryRate<16))//&& (device->LastRetryRate<15) ) //TO DO: need to consider (RSSI)
-+ {
-+ bTryUp = true;
-+ }
-+ }
-+ else if ( priv->CurrentOperaRate == 48 )
-+ {
-+ //2For 24Mbps
-+ // if ( ((CurrRetryRate>119) && (pHalData->LastRetryRate>119) && IncludedInSupportedRates(Adapter, 36)))
-+ if ( ((CurrRetryRate>63) && (priv->LastRetryRate>62)))
-+ {
-+ //(15,15) for cable link threshold respectively. (119, 119) for air link threshold.
-+ //Plus 84 for air link threshold.
-+ //Down to rate 18Mbps.
-+ bTryDown = true;
-+ }
-+ // else if ( (CurrRetryRate<14) && (pHalData->LastRetryRate<15) && IncludedInSupportedRates(Adapter, 72)) //TO DO: need to consider (RSSI)
-+ else if ( (CurrRetryRate<20) && (priv->LastRetryRate<21)) //TO DO: need to consider (RSSI)
-+ {
-+ bTryUp = true;
-+ }
-+ }
-+ else if ( priv->CurrentOperaRate == 36 )
-+ {
-+ //2For 18Mbps
-+ if ( ((CurrRetryRate>109) && (priv->LastRetryRate>109)))
-+ {
-+ //(99,99) for cable link, (109,109) for air link.
-+ //Down to rate 11Mbps.
-+ bTryDown = true;
-+ }
-+ // else if ( (CurrRetryRate<15) && (pHalData->LastRetryRate<16) && IncludedInSupportedRates(Adapter, 48)) //TO DO: need to consider (RSSI)
-+ else if ( (CurrRetryRate<25) && (priv->LastRetryRate<26)) //TO DO: need to consider (RSSI)
-+ {
-+ bTryUp = true;
-+ }
-+ }
-+ else if ( priv->CurrentOperaRate == 22 )
-+ {
-+ //2For 11Mbps
-+ // if (CurrRetryRate>299 && IncludedInSupportedRates(Adapter, 11))
-+ if (CurrRetryRate>95)
-+ {
-+ bTryDown = true;
-+ }
-+ else if (CurrRetryRate<55)//&& (device->LastRetryRate<55) ) //TO DO: need to consider (RSSI)
-+ {
-+ bTryUp = true;
-+ }
-+ }
-+ else if ( priv->CurrentOperaRate == 11 )
-+ {
-+ //2For 5.5Mbps
-+ // if (CurrRetryRate>159 && IncludedInSupportedRates(Adapter, 4) )
-+ if (CurrRetryRate>149)
-+ {
-+ bTryDown = true;
-+ }
-+ // else if ( (CurrRetryRate<30) && (pHalData->LastRetryRate<30) && IncludedInSupportedRates(Adapter, 22) )
-+ else if ( (CurrRetryRate<60) && (priv->LastRetryRate < 65))
-+ {
-+ bTryUp = true;
-+ }
-+ }
-+ else if ( priv->CurrentOperaRate == 4 )
-+ {
-+ //2For 2 Mbps
-+ if((CurrRetryRate>99) && (priv->LastRetryRate>99))
-+ {
-+ bTryDown = true;
-+ }
-+ // else if ( (CurrRetryRate<50) && (pHalData->LastRetryRate<65) && IncludedInSupportedRates(Adapter, 11) )
-+ else if ( (CurrRetryRate < 65) && (priv->LastRetryRate < 70))
-+ {
-+ bTryUp = true;
-+ }
-+ }
-+ else if ( priv->CurrentOperaRate == 2 )
-+ {
-+ //2For 1 Mbps
-+ // if ( (CurrRetryRate<50) && (pHalData->LastRetryRate<65) && IncludedInSupportedRates(Adapter, 4))
-+ if ( (CurrRetryRate<70) && (priv->LastRetryRate<75))
-+ {
-+ bTryUp = true;
-+ }
-+ }
-+ if(bTryUp && bTryDown)
-+ printk("StaRateAdaptive87B(): Tx Rate tried upping and downing simultaneously!\n");
-+
-+ //1 Test Upgrading Tx Rate
-+ // Sometimes the cause of the low throughput (high retry rate) is the compatibility between the AP and NIC.
-+ // To test if the upper rate may cause lower retry rate, this mechanism randomly occurs to test upgrading tx rate.
-+ if(!bTryUp && !bTryDown && (priv->TryupingCount == 0) && (priv->TryDownCountLowData == 0)
-+ && priv->CurrentOperaRate != 108 && priv->FailTxRateCount < 2)
-+ {
-+#if 1
-+ if(jiffies% (CurrRetryRate + 101) == 0)
-+ {
-+ bTryUp = true;
-+ priv->bTryuping = true;
-+ printk("======================================================>StaRateAdaptive87B(): Randomly try upgrading...\n");
-+ }
-+#endif
-+ }
-+ //1 Rate Mechanism
-+ if(bTryUp)
-+ {
-+ priv->TryupingCount++;
-+ priv->TryDownCountLowData = 0;
-+
-+ //
-+ // Check more times if we need to upgrade indeed.
-+ // Because the largest value of pHalData->TryupingCount is 0xFFFF and
-+ // the largest value of pHalData->FailTxRateCount is 0x14,
-+ // this condition will be satisfied at most every 2 min.
-+ //
-+ if((priv->TryupingCount > (TryUpTh + priv->FailTxRateCount * priv->FailTxRateCount)) ||
-+ (CurrSignalStrength > priv->LastFailTxRateSS) || priv->bTryuping)
-+ {
-+ priv->TryupingCount = 0;
-+ //
-+ // When transfering from CCK to OFDM, DIG is an important issue.
-+ //
-+ if(priv->CurrentOperaRate == 22)
-+ bUpdateInitialGain = true;
-+ // (1)To avoid upgrade frequently to the fail tx rate, add the FailTxRateCount into the threshold.
-+ // (2)If the signal strength is increased, it may be able to upgrade.
-+ priv->CurrentOperaRate = GetUpgradeTxRate(dev, priv->CurrentOperaRate);
-+ //printk("StaRateAdaptive87B(): Upgrade Tx Rate to %d\n", priv->CurrentOperaRate);
-+
-+ // Update Fail Tx rate and count.
-+ if(priv->LastFailTxRate != priv->CurrentOperaRate)
-+ {
-+ priv->LastFailTxRate = priv->CurrentOperaRate;
-+ priv->FailTxRateCount = 0;
-+ priv->LastFailTxRateSS = -200; // Set lowest power.
-+ }
-+ }
-+ }
-+ else
-+ {
-+ if(priv->TryupingCount > 0)
-+ priv->TryupingCount --;
-+ }
-+
-+ if(bTryDown)
-+ {
-+ priv->TryDownCountLowData++;
-+ priv->TryupingCount = 0;
-+
-+
-+ //Check if Tx rate can be degraded or Test trying upgrading should fallback.
-+ if(priv->TryDownCountLowData > TryDownTh || priv->bTryuping)
-+ {
-+ priv->TryDownCountLowData = 0;
-+ priv->bTryuping = false;
-+ // Update fail information.
-+ if(priv->LastFailTxRate == priv->CurrentOperaRate)
-+ {
-+ priv->FailTxRateCount ++;
-+ // Record the Tx fail rate signal strength.
-+ if(CurrSignalStrength > priv->LastFailTxRateSS)
-+ {
-+ priv->LastFailTxRateSS = CurrSignalStrength;
-+ }
-+ }
-+ else
-+ {
-+ priv->LastFailTxRate = priv->CurrentOperaRate;
-+ priv->FailTxRateCount = 1;
-+ priv->LastFailTxRateSS = CurrSignalStrength;
-+ }
-+ priv->CurrentOperaRate = GetDegradeTxRate(dev, priv->CurrentOperaRate);
-+ //
-+ // When it is CCK rate, it may need to update initial gain to receive lower power packets.
-+ //
-+ if(MgntIsCckRate(priv->CurrentOperaRate))
-+ {
-+ bUpdateInitialGain = true;
-+ }
-+ //printk("StaRateAdaptive87B(): Degrade Tx Rate to %d\n", priv->CurrentOperaRate);
-+ }
-+ }
-+ else
-+ {
-+ if(priv->TryDownCountLowData > 0)
-+ priv->TryDownCountLowData --;
-+ }
-+ // Keep the Tx fail rate count to equal to 0x15 at most.
-+ // Reduce the fail count at least to 10 sec if tx rate is tending stable.
-+ if(priv->FailTxRateCount >= 0x15 ||
-+ (!bTryUp && !bTryDown && priv->TryDownCountLowData == 0 && priv->TryupingCount && priv->FailTxRateCount > 0x6))
-+ {
-+ priv->FailTxRateCount --;
-+ }
-+
-+ //
-+ // We need update initial gain when we set tx rate "from OFDM to CCK" or
-+ // "from CCK to OFDM".
-+ //
-+SetInitialGain:
-+#if 1 //to be done
-+ if(bUpdateInitialGain)
-+ {
-+ if(MgntIsCckRate(priv->CurrentOperaRate)) // CCK
-+ {
-+ if(priv->InitialGain > priv->RegBModeGainStage)
-+ {
-+ if(CurrSignalStrength < -85) // Low power, OFDM [0x17] = 26.
-+ {
-+ priv->InitialGain = priv->RegBModeGainStage;
-+ }
-+ else if(priv->InitialGain > priv->RegBModeGainStage + 1)
-+ {
-+ priv->InitialGain -= 2;
-+ }
-+ else
-+ {
-+ priv->InitialGain --;
-+ }
-+ UpdateInitialGain(dev);
-+ }
-+ }
-+ else // OFDM
-+ {
-+ if(priv->InitialGain < 4)
-+ {
-+ priv->InitialGain ++;
-+ UpdateInitialGain(dev);
-+ }
-+ }
-+ }
-+#endif
-+ //Record the related info
-+ priv->LastRetryRate = CurrRetryRate;
-+ priv->LastTxThroughput = TxThroughput;
-+ priv->ieee80211->rate = priv->CurrentOperaRate * 5;
-+}
-+
-+#if LINUX_VERSION_CODE >=KERNEL_VERSION(2,6,20)
-+void rtl8180_rate_adapter(struct work_struct * work)
-+{
-+ struct delayed_work *dwork = container_of(work,struct delayed_work,work);
-+ struct ieee80211_device *ieee = container_of(dwork,struct ieee80211_device,rate_adapter_wq);
-+ struct net_device *dev = ieee->dev;
-+#else
-+void rtl8180_rate_adapter(struct net_device *dev)
-+{
-+
-+#endif
-+ sta_rateadaptive8187B(dev);
-+}
-+
-+void timer_rate_adaptive(unsigned long data)
-+{
-+ struct r8180_priv* priv = ieee80211_priv((struct net_device *)data);
-+ //DMESG("---->timer_rate_adaptive()\n");
-+ if(!priv->up)
-+ {
-+ //DMESG("<----timer_rate_adaptive():driver is not up!\n");
-+ return;
-+ }
-+ if( (priv->ieee80211->mode != IEEE_B) &&
-+ (priv->ieee80211->iw_mode != IW_MODE_MASTER)
-+ && ((priv->ieee80211->state == IEEE80211_LINKED)||(priv->ieee80211->state == IEEE80211_MESH_LINKED)))
-+ {
-+ //DMESG("timer_rate_adaptive():schedule rate_adapter_wq\n");
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)
-+ queue_delayed_work(priv->ieee80211->wq,&priv->ieee80211->rate_adapter_wq, 0);
-+#else
-+ queue_work(priv->ieee80211->wq,&priv->ieee80211->rate_adapter_wq);
-+#endif
-+ }
-+
-+ mod_timer(&priv->rateadapter_timer, jiffies + MSECS(DEFAULT_RATE_ADAPTIVE_TIMER_PERIOD));
-+ //DMESG("<----timer_rate_adaptive()\n");
-+}
-+//by amy for rate adaptive
-+
-+
-+void rtl8180_irq_rx_tasklet_new(struct r8180_priv *priv);
-+void rtl8180_irq_rx_tasklet(struct r8180_priv *priv);
-+
-+//YJ,add,080828,for KeepAlive
-+#if 0
-+static void MgntLinkKeepAlive(struct r8180_priv *priv )
-+{
-+ if (priv->keepAliveLevel == 0)
-+ return;
-+
-+ if(priv->ieee80211->state == IEEE80211_LINKED)
-+ {
-+ //
-+ // Keep-Alive.
-+ //
-+ //printk("LastTx:%d Tx:%d LastRx:%d Rx:%ld Idle:%d\n",priv->link_detect.LastNumTxUnicast,priv->NumTxUnicast, priv->link_detect.LastNumRxUnicast, priv->ieee80211->NumRxUnicast, priv->link_detect.IdleCount);
-+
-+ if ( (priv->keepAliveLevel== 2) ||
-+ (priv->link_detect.LastNumTxUnicast == priv->NumTxUnicast &&
-+ priv->link_detect.LastNumRxUnicast == priv->ieee80211->NumRxUnicast )
-+ )
-+ {
-+ priv->link_detect.IdleCount++;
-+
-+ //
-+ // Send a Keep-Alive packet packet to AP if we had been idle for a while.
-+ //
-+ if(priv->link_detect.IdleCount >= ((KEEP_ALIVE_INTERVAL / CHECK_FOR_HANG_PERIOD)-1) )
-+ {
-+ priv->link_detect.IdleCount = 0;
-+ ieee80211_sta_ps_send_null_frame(priv->ieee80211, false);
-+ }
-+ }
-+ else
-+ {
-+ priv->link_detect.IdleCount = 0;
-+ }
-+ priv->link_detect.LastNumTxUnicast = priv->NumTxUnicast;
-+ priv->link_detect.LastNumRxUnicast = priv->ieee80211->NumRxUnicast;
-+ }
-+}
-+//YJ,add,080828,for KeepAlive,end
-+#endif
-+void InactivePowerSave(struct net_device *dev)
-+{
-+ struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
-+
-+ //
-+ // This flag "bSwRfProcessing", indicates the status of IPS procedure, should be set if the IPS workitem
-+ // is really scheduled.
-+ // The old code, sets this flag before scheduling the IPS workitem and however, at the same time the
-+ // previous IPS workitem did not end yet, fails to schedule the current workitem. Thus, bSwRfProcessing
-+ // blocks the IPS procedure of switching RF.
-+ // By Bruce, 2007-12-25.
-+ //
-+ priv->bSwRfProcessing = true;
-+ MgntActSet_RF_State(dev, priv->eInactivePowerState, RF_CHANGE_BY_IPS);
-+
-+ //
-+ // To solve CAM values miss in RF OFF, rewrite CAM values after RF ON. By Bruce, 2007-09-20.
-+ //
-+#if 0
-+ while( index < 4 )
-+ {
-+ if( ( pMgntInfo->SecurityInfo.PairwiseEncAlgorithm == WEP104_Encryption ) ||
-+ (pMgntInfo->SecurityInfo.PairwiseEncAlgorithm == WEP40_Encryption) )
-+ {
-+ if( pMgntInfo->SecurityInfo.KeyLen[index] != 0)
-+ pAdapter->HalFunc.SetKeyHandler(pAdapter, index, 0, FALSE, pMgntInfo->SecurityInfo.PairwiseEncAlgorithm, TRUE, FALSE);
-+
-+ }
-+ index++;
-+ }
-+#endif
-+ priv->bSwRfProcessing = false;
-+}
-+
-+//
-+// Description:
-+// Enter the inactive power save mode. RF will be off
-+// 2007.08.17, by shien chang.
-+//
-+void IPSEnter(struct net_device *dev)
-+{
-+ struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
-+ RT_RF_POWER_STATE rtState;
-+
-+ if (priv->bInactivePs)
-+ {
-+ rtState = priv->eRFPowerState;
-+
-+ //
-+ // Added by Bruce, 2007-12-25.
-+ // Do not enter IPS in the following conditions:
-+ // (1) RF is already OFF or Sleep
-+ // (2) bSwRfProcessing (indicates the IPS is still under going)
-+ // (3) Connectted (only disconnected can trigger IPS)
-+ // (4) IBSS (send Beacon)
-+ // (5) AP mode (send Beacon)
-+ //
-+ if (rtState == eRfOn && !priv->bSwRfProcessing && (priv->ieee80211->iw_mode != IW_MODE_ADHOC)
-+ && (priv->ieee80211->state != IEEE80211_LINKED ))
-+ {
-+#ifdef CONFIG_RADIO_DEBUG
-+ DMESG("IPSEnter(): Turn off RF.");
-+#endif
-+ priv->eInactivePowerState = eRfOff;
-+ InactivePowerSave(dev);
-+ //SetRFPowerState(dev, priv->eInactivePowerState);
-+ //MgntActSet_RF_State(dev, priv->eInactivePowerState, RF_CHANGE_BY_IPS);
-+ }
-+ }
-+ //printk("priv->eRFPowerState is %d\n",priv->eRFPowerState);
-+}
-+
-+void IPSLeave(struct net_device *dev)
-+{
-+ struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
-+ RT_RF_POWER_STATE rtState;
-+ if (priv->bInactivePs)
-+ {
-+ rtState = priv->eRFPowerState;
-+ if (rtState == eRfOff && (!priv->bSwRfProcessing) && priv->RfOffReason <= RF_CHANGE_BY_IPS)
-+ {
-+#ifdef CONFIG_RADIO_DEBUG
-+ DMESG("ISLeave(): Turn on RF.");
-+#endif
-+ priv->eInactivePowerState = eRfOn;
-+ InactivePowerSave(dev);
-+ }
-+ }
-+// printk("priv->eRFPowerState is %d\n",priv->eRFPowerState);
-+}
-+//by amy for power save
-+
-+//YJ,add,081230
-+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20))
-+void IPSLeave_wq (struct work_struct *work)
-+{
-+ struct ieee80211_device *ieee = container_of(work,struct ieee80211_device,ips_leave_wq);
-+ struct net_device *dev = ieee->dev;
-+#else
-+void IPSLeave_wq(struct net_device *dev)
-+{
-+#endif
-+ struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
-+ down(&priv->ieee80211->ips_sem);
-+ IPSLeave(dev);
-+ up(&priv->ieee80211->ips_sem);
-+}
-+
-+void ieee80211_ips_leave(struct net_device *dev)
-+{
-+ struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
-+ if(priv->bInactivePs){
-+ if(priv->eRFPowerState == eRfOff)
-+ {
-+ //DMESG("%s", __FUNCTION__);
-+ queue_work(priv->ieee80211->wq,&priv->ieee80211->ips_leave_wq);
-+ }
-+ }
-+}
-+//YJ,add,081230,end
-+
-+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20))
-+void rtl8180_watch_dog_wq (struct work_struct *work)
-+{
-+ struct delayed_work *dwork = container_of(work,struct delayed_work,work);
-+ struct ieee80211_device *ieee = container_of(dwork,struct ieee80211_device,watch_dog_wq);
-+ struct net_device *dev = ieee->dev;
-+#else
-+void rtl8180_watch_dog_wq(struct net_device *dev)
-+{
-+#endif
-+ struct r8180_priv *priv = ieee80211_priv(dev);
-+ //bool bEnterPS = false;
-+ //bool bBusyTraffic = false;
-+ u32 TotalRxNum = 0;
-+ u16 SlotIndex = 0, i=0;
-+ //YJ,add,080828,for link state check
-+ if((priv->ieee80211->state == IEEE80211_LINKED) && (priv->ieee80211->iw_mode == IW_MODE_INFRA)){
-+ SlotIndex = (priv->link_detect.SlotIndex++) % priv->link_detect.SlotNum;
-+ priv->link_detect.RxFrameNum[SlotIndex] = priv->ieee80211->NumRxDataInPeriod + priv->ieee80211->NumRxBcnInPeriod;
-+ for( i=0; i<priv->link_detect.SlotNum; i++ )
-+ TotalRxNum+= priv->link_detect.RxFrameNum[i];
-+#if 0 //for roaming temp del
-+ if(TotalRxNum == 0){
-+ priv->ieee80211->state = IEEE80211_ASSOCIATING;
-+ printk("=========>turn to another AP\n");
-+ queue_work(priv->ieee80211->wq, &priv->ieee80211->associate_procedure_wq);
-+ }
-+#endif
-+ }
-+ priv->link_detect.NumRxOkInPeriod = 0;
-+ priv->link_detect.NumTxOkInPeriod = 0;
-+ priv->ieee80211->NumRxDataInPeriod = 0;
-+ priv->ieee80211->NumRxBcnInPeriod = 0;
-+
-+#ifdef CONFIG_IPS
-+ if(priv->ieee80211->actscanning == false){
-+ if((priv->ieee80211->iw_mode == IW_MODE_INFRA) &&
-+ (priv->ieee80211->state == IEEE80211_NOLINK) &&
-+ (priv->eRFPowerState == eRfOn))
-+ {
-+ //printk("actscanning:%d, state:%d, eRFPowerState:%d\n",
-+ // priv->ieee80211->actscanning,
-+ // priv->ieee80211->state,
-+ // priv->eRFPowerState);
-+
-+ down(&priv->ieee80211->ips_sem);
-+ IPSEnter(dev);
-+ up(&priv->ieee80211->ips_sem);
-+ }
-+ }
-+ //queue_delayed_work(priv->ieee80211->wq,&priv->ieee80211->watch_dog_wq,IEEE80211_WATCH_DOG_TIME);
-+#endif
-+
-+ //printk("========================>leave rtl8180_watch_dog_wq()\n");
-+}
-+
-+void watch_dog_adaptive(unsigned long data)
-+{
-+ struct net_device* dev = (struct net_device*)data;
-+ struct r8180_priv* priv = ieee80211_priv(dev);
-+ //DMESG("---->watch_dog_adaptive()\n");
-+ if(!priv->up){
-+ //DMESG("<----watch_dog_adaptive():driver is not up!\n");
-+ return;
-+ }
-+ // Tx and Rx High Power Mechanism.
-+ if(CheckHighPower(dev)){
-+ //printk("===============================> high power!\n");
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)
-+ queue_delayed_work(priv->ieee80211->wq,&priv->ieee80211->tx_pw_wq, 0);
-+#else
-+ queue_work(priv->ieee80211->wq,&priv->ieee80211->tx_pw_wq);
-+#endif
-+ }
-+
-+ // Schedule an workitem to perform DIG
-+ if(CheckDig(dev) == true){
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)
-+ queue_delayed_work(priv->ieee80211->wq,&priv->ieee80211->hw_dig_wq,0);
-+#else
-+ queue_work(priv->ieee80211->wq,&priv->ieee80211->hw_dig_wq);
-+#endif
-+ }
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)
-+ queue_delayed_work(priv->ieee80211->wq,&priv->ieee80211->watch_dog_wq,0);
-+#else
-+ queue_work(priv->ieee80211->wq,&priv->ieee80211->watch_dog_wq);
-+#endif
-+
-+ mod_timer(&priv->watch_dog_timer, jiffies + MSECS(IEEE80211_WATCH_DOG_TIME));
-+ //DMESG("<----watch_dog_adaptive()\n");
-+}
-+
-+#ifdef ENABLE_DOT11D
-+
-+CHANNEL_LIST Current_tbl;
-+
-+static CHANNEL_LIST ChannelPlan[] = {
-+ {{1,2,3,4,5,6,7,8,9,10,11,36,40,44,48,52,56,60,64},19}, //FCC
-+ {{1,2,3,4,5,6,7,8,9,10,11},11}, //IC
-+ {{1,2,3,4,5,6,7,8,9,10,11,12,13,36,40,44,48,52,56,60,64},21}, //ETSI
-+ {{1,2,3,4,5,6,7,8,9,10,11,12,13,36,40,44,48,52,56,60,64},21}, //Spain. Change to ETSI.
-+ {{1,2,3,4,5,6,7,8,9,10,11,12,13,36,40,44,48,52,56,60,64},21}, //France. Change to ETSI.
-+ {{14,36,40,44,48,52,56,60,64},9}, //MKK
-+ {{1,2,3,4,5,6,7,8,9,10,11,12,13,14, 36,40,44,48,52,56,60,64},22},//MKK1
-+ {{1,2,3,4,5,6,7,8,9,10,11,12,13,36,40,44,48,52,56,60,64},21}, //Israel.
-+ {{1,2,3,4,5,6,7,8,9,10,11,12,13,34,38,42,46},17}, // For 11a , TELEC
-+ {{1,2,3,4,5,6,7,8,9,10,11,12,13,14},14}, //For Global Domain. 1-11:active scan, 12-14 passive scan. //+YJ, 080626
-+ {{1,2,3,4,5,6,7,8,9,10,11,12,13},13} //world wide 13: ch1~ch11 active scan, ch12~13 passive //lzm add 081205
-+};
-+
-+static void rtl8180_set_channel_map(u8 channel_plan, struct ieee80211_device *ieee)
-+{
-+ int i;
-+
-+ //lzm add 081205
-+ ieee->MinPassiveChnlNum=MAX_CHANNEL_NUMBER+1;
-+ ieee->IbssStartChnl=0;
-+
-+ switch (channel_plan)
-+ {
-+ case COUNTRY_CODE_FCC:
-+ case COUNTRY_CODE_IC:
-+ case COUNTRY_CODE_ETSI:
-+ case COUNTRY_CODE_SPAIN:
-+ case COUNTRY_CODE_FRANCE:
-+ case COUNTRY_CODE_MKK:
-+ case COUNTRY_CODE_MKK1:
-+ case COUNTRY_CODE_ISRAEL:
-+ case COUNTRY_CODE_TELEC:
-+ {
-+ Dot11d_Init(ieee);
-+ ieee->bGlobalDomain = false;
-+ ieee->bWorldWide13 = false;
-+ if (ChannelPlan[channel_plan].Len != 0){
-+ // Clear old channel map
-+ memset(GET_DOT11D_INFO(ieee)->channel_map, 0, sizeof(GET_DOT11D_INFO(ieee)->channel_map));
-+ // Set new channel map
-+ for (i=0;i<ChannelPlan[channel_plan].Len;i++)
-+ {
-+ if(ChannelPlan[channel_plan].Channel[i] <= 14)
-+ GET_DOT11D_INFO(ieee)->channel_map[ChannelPlan[channel_plan].Channel[i]] = 1;
-+ }
-+ }
-+ break;
-+ }
-+ case COUNTRY_CODE_GLOBAL_DOMAIN:
-+ {
-+ GET_DOT11D_INFO(ieee)->bEnabled = 0;
-+ Dot11d_Reset(ieee);
-+ ieee->bGlobalDomain = true;
-+ ieee->bWorldWide13 = false;
-+
-+ //lzm add 081205
-+ ieee->MinPassiveChnlNum=12;
-+ ieee->IbssStartChnl= 10;
-+
-+ break;
-+ }
-+ case COUNTRY_CODE_WORLD_WIDE_13_INDEX://lzm add 081205
-+ {
-+ Dot11d_Init(ieee);
-+ ieee->bGlobalDomain = false;
-+ ieee->bWorldWide13 = true;
-+
-+ //lzm add 081205
-+ ieee->MinPassiveChnlNum=12;
-+ ieee->IbssStartChnl= 10;
-+
-+ if (ChannelPlan[channel_plan].Len != 0){
-+ // Clear old channel map
-+ memset(GET_DOT11D_INFO(ieee)->channel_map, 0, sizeof(GET_DOT11D_INFO(ieee)->channel_map));
-+ // Set new channel map
-+ for (i=0;i<ChannelPlan[channel_plan].Len;i++)
-+ {
-+ if(ChannelPlan[channel_plan].Channel[i] <= 11)//ch1~ch11 active scan
-+ GET_DOT11D_INFO(ieee)->channel_map[ChannelPlan[channel_plan].Channel[i]] = 1;
-+ else//ch12~13 passive scan
-+ GET_DOT11D_INFO(ieee)->channel_map[ChannelPlan[channel_plan].Channel[i]] = 2;
-+ }
-+ }
-+
-+ break;
-+ }
-+ default:
-+ {
-+ Dot11d_Init(ieee);
-+ ieee->bGlobalDomain = false;
-+ ieee->bWorldWide13 = false;
-+ memset(GET_DOT11D_INFO(ieee)->channel_map, 0, sizeof(GET_DOT11D_INFO(ieee)->channel_map));
-+ for (i=1;i<=14;i++)
-+ {
-+ GET_DOT11D_INFO(ieee)->channel_map[i] = 1;
-+ }
-+ break;
-+ }
-+ }
-+}
-+#endif
-+
-+
-+//Add for RF power on power off by lizhaoming 080512
-+#ifdef POLLING_METHOD_FOR_RADIO
-+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20))
-+void GPIOChangeRFWorkItemCallBack(struct work_struct *work);
-+#else
-+void GPIOChangeRFWorkItemCallBack(struct ieee80211_device *ieee);
-+#endif
-+void gpio_change_polling(unsigned long data);
-+#endif
-+
-+
-+static void rtl8180_link_detect_init(plink_detect_t plink_detect)
-+{
-+ memset(plink_detect, 0, sizeof(link_detect_t));
-+ plink_detect->SlotNum = DEFAULT_SLOT_NUM;
-+}
-+
-+#ifdef SW_ANTE_DIVERSITY
-+static void rtl8187_antenna_diversity_read(struct net_device *dev)
-+{
-+ struct r8180_priv *priv = ieee80211_priv(dev);
-+ u16 usValue;
-+
-+ //2 Read CustomerID
-+ usValue = eprom_read(dev, EEPROM_SW_REVD_OFFSET>>1);
-+ priv->EEPROMCustomerID = (u8)( usValue & EEPROM_CID_MASK );
-+ //DMESG("EEPROM Customer ID: %02X\n", priv->EEPROMCustomerID);
-+
-+ //2 Read AntennaDiversity
-+ // SW Antenna Diversity.
-+ if( (usValue & EEPROM_SW_AD_MASK) != EEPROM_SW_AD_ENABLE ){
-+ priv->EEPROMSwAntennaDiversity = false;
-+ DMESG("EEPROM Disable SW Antenna Diversity");
-+ }else{
-+ priv->EEPROMSwAntennaDiversity = true;
-+ DMESG("EEPROM Enable SW Antenna Diversity");
-+ }
-+ // Default Antenna to use.
-+ if( (usValue & EEPROM_DEF_ANT_MASK) != EEPROM_DEF_ANT_1 ) {
-+ priv->EEPROMDefaultAntenna1 = false;
-+ DMESG("EEPROM Default Main Antenna 0");
-+ }else{
-+ priv->EEPROMDefaultAntenna1 = false;
-+ DMESG( "EEPROM Default Aux Antenna 1");
-+ }
-+
-+ //
-+ // Antenna diversity mechanism. Added by Roger, 2007.11.05.
-+ //
-+ if( priv->RegSwAntennaDiversityMechanism == 0 ) // Auto //set it to 0 when init
-+ {// 0: default from EEPROM.
-+ priv->bSwAntennaDiverity = priv->EEPROMSwAntennaDiversity;
-+ }else{// 1:disable antenna diversity, 2: enable antenna diversity.
-+ priv->bSwAntennaDiverity = ((priv->RegSwAntennaDiversityMechanism == 1)? false : true);
-+ }
-+ //DMESG("bSwAntennaDiverity = %d\n", priv->bSwAntennaDiverity);
-+
-+
-+ //
-+ // Default antenna settings. Added by Roger, 2007.11.05.
-+ //
-+ if( priv->RegDefaultAntenna == 0)//set it to 0 when init
-+ { // 0: default from EEPROM.
-+ priv->bDefaultAntenna1 = priv->EEPROMDefaultAntenna1;
-+ }else{// 1: main, 2: aux.
-+ priv->bDefaultAntenna1 = ((priv->RegDefaultAntenna== 2) ? true : false);
-+ }
-+ //DMESG("bDefaultAntenna1 = %d\n", priv->bDefaultAntenna1);
-+
-+//by amy for antenna
-+}
-+#endif
-+
-+short rtl8180_init(struct net_device *dev)
-+{
-+ struct r8180_priv *priv = ieee80211_priv(dev);
-+ int i, j;
-+ u16 word;
-+ //int ch;
-+ //u16 version;
-+ u8 hw_version;
-+ //u8 config3;
-+ struct usb_device *udev;
-+ u16 idProduct;
-+ u16 bcdDevice;
-+ //u8 chan_plan_index;
-+
-+ //FIXME: these constants are placed in a bad pleace.
-+
-+ //priv->txbuffsize = 1024;
-+ //priv->txringcount = 32;
-+ //priv->rxbuffersize = 1024;
-+ //priv->rxringcount = 32;
-+ //priv->txbeaconcount = 3;
-+ //priv->rx_skb_complete = 1;
-+ //priv->txnp_pending.ispending=0;
-+ /* ^^ the SKB does not containt a partial RXed packet (is empty) */
-+
-+ //memcpy(priv->stats,0,sizeof(struct Stats));
-+
-+ //priv->irq_enabled=0;
-+ priv->driver_upping = 0;
-+ priv->commit = 0;
-+
-+ //priv->stats.rxdmafail=0;
-+ priv->stats.txrdu=0;
-+ //priv->stats.rxrdu=0;
-+ //priv->stats.rxnolast=0;
-+ //priv->stats.rxnodata=0;
-+ //priv->stats.rxreset=0;
-+ //priv->stats.rxwrkaround=0;
-+ //priv->stats.rxnopointer=0;
-+ priv->stats.txbeerr=0;
-+ priv->stats.txbkerr=0;
-+ priv->stats.txvierr=0;
-+ priv->stats.txvoerr=0;
-+ priv->stats.txmanageerr=0;
-+ priv->stats.txbeaconerr=0;
-+ priv->stats.txresumed=0;
-+ //priv->stats.rxerr=0;
-+ //priv->stats.rxoverflow=0;
-+ //priv->stats.rxint=0;
-+ priv->stats.txbeokint=0;
-+ priv->stats.txbkokint=0;
-+ priv->stats.txviokint=0;
-+ priv->stats.txvookint=0;
-+ priv->stats.txmanageokint=0;
-+ priv->stats.txbeaconokint=0;
-+ /*priv->stats.txhpokint=0;
-+ priv->stats.txhperr=0;*/
-+ priv->stats.rxurberr=0;
-+ priv->stats.rxstaterr=0;
-+ priv->stats.txoverflow=0;
-+ priv->stats.rxok=0;
-+ //priv->stats.txbeaconerr=0;
-+ //priv->stats.txlperr=0;
-+ //priv->stats.txlpokint=0;
-+//john
-+ priv->stats.txnpdrop=0;
-+ priv->stats.txlpdrop =0;
-+ priv->stats.txbedrop =0;
-+ priv->stats.txbkdrop =0;
-+ priv->stats.txvidrop =0;
-+ priv->stats.txvodrop =0;
-+ priv->stats.txbeacondrop =0;
-+ priv->stats.txmanagedrop =0;
-+
-+ // priv->stats.txokbytestotal =0;
-+//by amy
-+ priv->LastSignalStrengthInPercent=0;
-+ priv->SignalStrength=0;
-+ priv->SignalQuality=0;
-+ priv->antenna_flag=0;
-+ priv->flag_beacon = false;
-+//by amy
-+//david
-+ //radion on defaultly
-+ priv->radion = 1;
-+//david
-+//by amy for rate adaptive
-+ priv->CurrRetryCnt=0;
-+ priv->LastRetryCnt=0;
-+ priv->LastTxokCnt=0;
-+ priv->LastRxokCnt=0;
-+ priv->LastRetryRate=0;
-+ priv->bTryuping=0;
-+ priv->CurrTxRate=0;
-+ priv->CurrRetryRate=0;
-+ priv->TryupingCount=0;
-+ priv->TryupingCountNoData=0;
-+ priv->TryDownCountLowData=0;
-+ priv->RecvSignalPower=0;
-+ priv->LastTxOKBytes=0;
-+ priv->LastFailTxRate=0;
-+ priv->LastFailTxRateSS=0;
-+ priv->FailTxRateCount=0;
-+ priv->LastTxThroughput=0;
-+ priv->txokbytestotal=0;
-+//by amy for rate adaptive
-+//by amy for ps
-+ priv->RFChangeInProgress = false;
-+ priv->SetRFPowerStateInProgress = false;
-+ priv->RFProgType = 0;
-+ priv->bInHctTest = false;
-+ priv->bInactivePs = true;//false;
-+ priv->ieee80211->bInactivePs = priv->bInactivePs;
-+ priv->eInactivePowerState = eRfOn;//lzm add for IPS and Polling methord
-+ priv->bSwRfProcessing = false;
-+ priv->eRFPowerState = eRfOff;
-+ priv->RfOffReason = 0;
-+ priv->NumRxOkInPeriod = 0;
-+ priv->NumTxOkInPeriod = 0;
-+ priv->bLeisurePs = true;
-+ priv->dot11PowerSaveMode = eActive;
-+ priv->RegThreeWireMode=HW_THREE_WIRE_BY_8051;
-+ priv->ps_mode = false;
-+//by amy for ps
-+//by amy for DIG
-+ priv->bDigMechanism = 1;
-+ priv->bCCKThMechanism = 0;
-+ priv->InitialGain = 0;
-+ priv->StageCCKTh = 0;
-+ priv->RegBModeGainStage = 2;
-+//by amy for DIG
-+// {by david for DIG, 2008.3.6
-+ priv->RegDigOfdmFaUpTh = 0x0c;
-+ priv->RegBModeGainStage = 0x02;
-+ priv->DIG_NumberFallbackVote = 0;
-+ priv->DIG_NumberUpgradeVote = 0;
-+ priv->CCKUpperTh = 0x100;
-+ priv->CCKLowerTh = 0x20;
-+//}
-+//{added by david for High tx power, 2008.3.11
-+ priv->bRegHighPowerMechanism = true;
-+ priv->bToUpdateTxPwr = false;
-+
-+ priv->Z2HiPwrUpperTh = 77;
-+ priv->Z2HiPwrLowerTh = 75;
-+ priv->Z2RSSIHiPwrUpperTh = 70;
-+ priv->Z2RSSIHiPwrLowerTh = 20;
-+ //specify for rtl8187B
-+ priv->wMacRegRfPinsOutput = 0x0480;
-+ priv->wMacRegRfPinsSelect = 0x2488;
-+ //
-+ // Note that, we just set TrSwState to TR_HW_CONTROLLED here instead of changing
-+ // HW setting because we assume it should be inialized as HW controlled. 061010, by rcnjko.
-+ //
-+ priv->TrSwitchState = TR_HW_CONTROLLED;
-+//}
-+ priv->ieee80211->iw_mode = IW_MODE_INFRA;
-+//test pending bug, john 20070815
-+ for(i=0;i<0x10;i++) atomic_set(&(priv->tx_pending[i]), 0);
-+//by lizhaoming
-+#ifdef POLLING_METHOD_FOR_RADIO
-+ priv->wlan_first_up_flag1 = 0;
-+ priv->polling_timer_on = 0;//add for S3/S4
-+#endif
-+//by lizhaoming for LED
-+#ifdef LED
-+ priv->ieee80211->ieee80211_led_contorl = LedControl8187;
-+#endif
-+#ifdef CONFIG_IPS
-+ priv->ieee80211->ieee80211_ips_leave = ieee80211_ips_leave;//IPSLeave;
-+#endif
-+
-+#ifdef SW_ANTE_DIVERSITY
-+ priv->antb=0;
-+ priv->diversity=1;
-+ priv->LastRxPktAntenna = 0;
-+ priv->AdMinCheckPeriod = 5;
-+ priv->AdMaxCheckPeriod = 10;
-+ // Lower signal strength threshold to fit the HW participation in antenna diversity. +by amy 080312
-+ priv->AdMaxRxSsThreshold = 30;//60->30
-+ priv->AdRxSsThreshold = 20;//50->20
-+ priv->AdCheckPeriod = priv->AdMinCheckPeriod;
-+ priv->AdTickCount = 0;
-+ priv->AdRxSignalStrength = -1;
-+ priv->RegSwAntennaDiversityMechanism = 0;
-+ priv->RegDefaultAntenna = 0;
-+ priv->SignalStrength = 0;
-+ priv->AdRxOkCnt = 0;
-+ priv->CurrAntennaIndex = 0;
-+ priv->AdRxSsBeforeSwitched = 0;
-+ init_timer(&priv->SwAntennaDiversityTimer);
-+ priv->SwAntennaDiversityTimer.data = (unsigned long)dev;
-+ priv->SwAntennaDiversityTimer.function = (void *)SwAntennaDiversityTimerCallback;
-+#endif
-+
-+ priv->retry_rts = DEFAULT_RETRY_RTS;
-+ priv->retry_data = DEFAULT_RETRY_DATA;
-+ priv->ieee80211->rate = 110; //11 mbps
-+ priv->CurrentOperaRate=priv->ieee80211->rate/5;
-+ priv->ieee80211->short_slot = 1;
-+ priv->ieee80211->mode = IEEE_G;
-+ priv->promisc = (dev->flags & IFF_PROMISC) ? 1:0;
-+
-+ rtl8180_link_detect_init(&priv->link_detect);
-+
-+ spin_lock_init(&priv->tx_lock);
-+ spin_lock_init(&priv->irq_lock);//added by thomas
-+ spin_lock_init(&priv->rf_ps_lock);
-+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0))
-+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20))
-+ INIT_WORK(&priv->reset_wq, (void*)rtl8180_restart);
-+ INIT_WORK(&priv->ieee80211->ips_leave_wq, (void*)IPSLeave_wq); //YJ,add,081230,for IPS
-+ INIT_DELAYED_WORK(&priv->ieee80211->rate_adapter_wq,(void*)rtl8180_rate_adapter);
-+ INIT_DELAYED_WORK(&priv->ieee80211->hw_dig_wq,(void*)rtl8180_hw_dig_wq);
-+ INIT_DELAYED_WORK(&priv->ieee80211->watch_dog_wq,(void*)rtl8180_watch_dog_wq);
-+ INIT_DELAYED_WORK(&priv->ieee80211->tx_pw_wq,(void*)rtl8180_tx_pw_wq);
-+
-+//add for RF power on power off by lizhaoming 080512
-+#ifdef POLLING_METHOD_FOR_RADIO
-+ INIT_DELAYED_WORK(&priv->ieee80211->GPIOChangeRFWorkItem, (void*)GPIOChangeRFWorkItemCallBack);
-+#endif
-+
-+#ifdef SW_ANTE_DIVERSITY
-+ INIT_DELAYED_WORK(&priv->ieee80211->SwAntennaWorkItem,(void*) SwAntennaWorkItemCallback);
-+#endif
-+
-+#else
-+ INIT_WORK(&priv->reset_wq,(void*) rtl8180_restart,dev);
-+ INIT_WORK(&priv->ieee80211->ips_leave_wq, (void*)IPSLeave_wq,dev); //YJ,add,081230,for IPS
-+ INIT_WORK(&priv->ieee80211->rate_adapter_wq,(void*)rtl8180_rate_adapter,dev);
-+ INIT_WORK(&priv->ieee80211->hw_dig_wq,(void*)rtl8180_hw_dig_wq,dev);
-+ INIT_WORK(&priv->ieee80211->watch_dog_wq,(void*)rtl8180_watch_dog_wq,dev);
-+ INIT_WORK(&priv->ieee80211->tx_pw_wq,(void*)rtl8180_tx_pw_wq,dev);
-+
-+//add for RF power on power off by lizhaoming 080512
-+#ifdef POLLING_METHOD_FOR_RADIO
-+ INIT_WORK(&priv->ieee80211->GPIOChangeRFWorkItem,(void*) GPIOChangeRFWorkItemCallBack, priv->ieee80211);
-+#endif
-+
-+#ifdef SW_ANTE_DIVERSITY
-+ INIT_WORK(&priv->ieee80211->SwAntennaWorkItem,(void*) SwAntennaWorkItemCallback, dev);
-+#endif
-+
-+#endif
-+#else
-+ tq_init(&priv->reset_wq,(void*) rtl8180_restart,dev);
-+#endif
-+ sema_init(&priv->wx_sem,1);
-+ sema_init(&priv->set_chan_sem,1);
-+#ifdef THOMAS_TASKLET
-+ tasklet_init(&priv->irq_rx_tasklet,
-+ (void(*)(unsigned long))rtl8180_irq_rx_tasklet_new,
-+ (unsigned long)priv);
-+#else
-+ tasklet_init(&priv->irq_rx_tasklet,
-+ (void(*)(unsigned long))rtl8180_irq_rx_tasklet,
-+ (unsigned long)priv);
-+#endif
-+//by lizhaoming for Radio on/off
-+#ifdef POLLING_METHOD_FOR_RADIO
-+ init_timer(&priv->gpio_polling_timer);
-+ priv->gpio_polling_timer.data = (unsigned long)dev;
-+ priv->gpio_polling_timer.function = gpio_change_polling;
-+#endif
-+//by amy for rate adaptive
-+ init_timer(&priv->rateadapter_timer);
-+ priv->rateadapter_timer.data = (unsigned long)dev;
-+ priv->rateadapter_timer.function = timer_rate_adaptive;
-+//by amy for rate adaptive
-+//by amy for ps
-+ init_timer(&priv->watch_dog_timer);
-+ priv->watch_dog_timer.data = (unsigned long)dev;
-+ priv->watch_dog_timer.function = watch_dog_adaptive;
-+//by amy
-+//by amy for ps
-+ priv->ieee80211->current_network.beacon_interval = DEFAULT_BEACONINTERVAL;
-+ priv->ieee80211->iw_mode = IW_MODE_INFRA;
-+ priv->ieee80211->softmac_features = IEEE_SOFTMAC_SCAN |
-+ IEEE_SOFTMAC_ASSOCIATE | IEEE_SOFTMAC_PROBERQ |
-+#ifdef CONFIG_SOFT_BEACON
-+ IEEE_SOFTMAC_BEACONS | //IEEE_SOFTMAC_SINGLE_QUEUE;
-+#endif
-+ IEEE_SOFTMAC_PROBERS | IEEE_SOFTMAC_TX_QUEUE;
-+
-+ priv->ieee80211->active_scan = 1;
-+ //priv->ieee80211->ch_lock = 0;
-+ priv->ieee80211->rate = 110; //11 mbps
-+ priv->ieee80211->modulation = IEEE80211_CCK_MODULATION | IEEE80211_OFDM_MODULATION;
-+ priv->ieee80211->host_encrypt = 1;
-+ priv->ieee80211->host_decrypt = 1;
-+#ifdef CONFIG_SOFT_BEACON
-+ priv->ieee80211->start_send_beacons = NULL;
-+ priv->ieee80211->stop_send_beacons = NULL;
-+#else
-+ priv->ieee80211->start_send_beacons = rtl8187_beacon_tx;
-+ priv->ieee80211->stop_send_beacons = rtl8187_beacon_stop;
-+#endif
-+ priv->ieee80211->softmac_hard_start_xmit = rtl8180_hard_start_xmit;
-+ priv->ieee80211->set_chan = rtl8180_set_chan;
-+ priv->ieee80211->link_change = rtl8187_link_change;
-+ priv->ieee80211->softmac_data_hard_start_xmit = rtl8180_hard_data_xmit;
-+ priv->ieee80211->data_hard_stop = rtl8180_data_hard_stop;
-+ priv->ieee80211->data_hard_resume = rtl8180_data_hard_resume;
-+
-+#ifdef _RTL8187_EXT_PATCH_
-+ priv->ieee80211->meshScanMode = 0;
-+ priv->mshobj = alloc_mshobj(priv);
-+ if(priv->mshobj)
-+ {
-+ priv->ieee80211->ext_patch_ieee80211_start_protocol = priv->mshobj->ext_patch_ieee80211_start_protocol;
-+ priv->ieee80211->ext_patch_ieee80211_stop_protocol = priv->mshobj->ext_patch_ieee80211_stop_protocol;
-+//by amy for mesh
-+ priv->ieee80211->ext_patch_ieee80211_start_mesh = priv->mshobj->ext_patch_ieee80211_start_mesh;
-+//by amy for mesh
-+ priv->ieee80211->ext_patch_ieee80211_probe_req_1 = priv->mshobj->ext_patch_ieee80211_probe_req_1;
-+ priv->ieee80211->ext_patch_ieee80211_probe_req_2 = priv->mshobj->ext_patch_ieee80211_probe_req_2;
-+ priv->ieee80211->ext_patch_ieee80211_association_req_1 = priv->mshobj->ext_patch_ieee80211_association_req_1;
-+ priv->ieee80211->ext_patch_ieee80211_association_req_2 = priv->mshobj->ext_patch_ieee80211_association_req_2;
-+ priv->ieee80211->ext_patch_ieee80211_assoc_resp_by_net_1 = priv->mshobj->ext_patch_ieee80211_assoc_resp_by_net_1;
-+ priv->ieee80211->ext_patch_ieee80211_assoc_resp_by_net_2 = priv->mshobj->ext_patch_ieee80211_assoc_resp_by_net_2;
-+ priv->ieee80211->ext_patch_ieee80211_rx_frame_softmac_on_auth = priv->mshobj->ext_patch_ieee80211_rx_frame_softmac_on_auth;
-+ priv->ieee80211->ext_patch_ieee80211_rx_frame_softmac_on_deauth = priv->mshobj->ext_patch_ieee80211_rx_frame_softmac_on_deauth;
-+ priv->ieee80211->ext_patch_ieee80211_rx_frame_softmac_on_assoc_req = priv->mshobj->ext_patch_ieee80211_rx_frame_softmac_on_assoc_req;
-+ priv->ieee80211->ext_patch_ieee80211_rx_frame_softmac_on_assoc_rsp = priv->mshobj->ext_patch_ieee80211_rx_frame_softmac_on_assoc_rsp;
-+ priv->ieee80211->ext_patch_ieee80211_ext_stop_scan_wq_set_channel = priv->mshobj->ext_patch_ieee80211_ext_stop_scan_wq_set_channel;
-+ priv->ieee80211->ext_patch_ieee80211_process_probe_response_1 = priv->mshobj->ext_patch_ieee80211_process_probe_response_1;
-+ priv->ieee80211->ext_patch_ieee80211_rx_mgt_on_probe_req = priv->mshobj->ext_patch_ieee80211_rx_mgt_on_probe_req;
-+ priv->ieee80211->ext_patch_ieee80211_rx_mgt_update_expire = priv->mshobj->ext_patch_ieee80211_rx_mgt_update_expire;
-+ priv->ieee80211->ext_patch_get_beacon_get_probersp = priv->mshobj->ext_patch_get_beacon_get_probersp;
-+ priv->ieee80211->ext_patch_ieee80211_rx_on_rx = priv->mshobj->ext_patch_ieee80211_rx_on_rx;
-+ priv->ieee80211->ext_patch_ieee80211_xmit = priv->mshobj->ext_patch_ieee80211_xmit;
-+ priv->ieee80211->ext_patch_ieee80211_rx_frame_get_hdrlen = priv->mshobj->ext_patch_ieee80211_rx_frame_get_hdrlen;
-+ priv->ieee80211->ext_patch_ieee80211_rx_is_valid_framectl = priv->mshobj->ext_patch_ieee80211_rx_is_valid_framectl;
-+ priv->ieee80211->ext_patch_ieee80211_rx_process_dataframe = priv->mshobj->ext_patch_ieee80211_rx_process_dataframe;
-+ // priv->ieee80211->ext_patch_is_duplicate_packet = priv->mshobj->ext_patch_is_duplicate_packet;
-+ priv->ieee80211->ext_patch_ieee80211_softmac_xmit_get_rate = priv->mshobj->ext_patch_ieee80211_softmac_xmit_get_rate;
-+ /* added by david for setting acl dynamically */
-+ priv->ieee80211->ext_patch_ieee80211_acl_query = priv->mshobj->ext_patch_ieee80211_acl_query;
-+ }
-+
-+#endif // _RTL8187_EXT_PATCH_
-+
-+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0))
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20)
-+ INIT_WORK(&priv->ieee80211->wmm_param_update_wq,\
-+ (void(*)(void*)) rtl8180_wmm_param_update,\
-+ priv->ieee80211);
-+#else
-+ INIT_WORK(&priv->ieee80211->wmm_param_update_wq,\
-+ rtl8180_wmm_param_update);
-+#endif
-+#else
-+ tq_init(&priv->ieee80211->wmm_param_update_wq,\
-+ (void(*)(void*)) rtl8180_wmm_param_update,\
-+ priv->ieee80211);
-+#endif
-+ priv->ieee80211->init_wmmparam_flag = 0;
-+ priv->ieee80211->fts = DEFAULT_FRAG_THRESHOLD;
-+
-+ //priv->card_8185 = 2;
-+ priv->phy_ver = 2;
-+ priv->card_type = USB;
-+//{add for 87B
-+ priv->ShortRetryLimit = 7;
-+ priv->LongRetryLimit = 7;
-+ priv->EarlyRxThreshold = 7;
-+
-+ priv->TransmitConfig =
-+ TCR_DurProcMode | //for RTL8185B, duration setting by HW
-+ TCR_DISReqQsize |
-+ (TCR_MXDMA_2048<<TCR_MXDMA_SHIFT)| // Max DMA Burst Size per Tx DMA Burst, 7: reservied.
-+ (priv->ShortRetryLimit<<TX_SRLRETRY_SHIFT)| // Short retry limit
-+ (priv->LongRetryLimit<<TX_LRLRETRY_SHIFT) | // Long retry limit
-+ (false ? TCR_SWPLCPLEN : 0); // FALSE: HW provies PLCP length and LENGEXT, TURE: SW proiveds them
-+
-+ priv->ReceiveConfig =
-+ RCR_AMF | RCR_ADF | //accept management/data
-+ RCR_ACF | //accept control frame for SW AP needs PS-poll, 2005.07.07, by rcnjko.
-+ RCR_AB | RCR_AM | RCR_APM | //accept BC/MC/UC
-+ //RCR_AICV | RCR_ACRC32 | //accept ICV/CRC error packet
-+ RCR_MXDMA | // Max DMA Burst Size per Rx DMA Burst, 7: unlimited.
-+ (priv->EarlyRxThreshold<<RX_FIFO_THRESHOLD_SHIFT) | // Rx FIFO Threshold, 7: No Rx threshold.
-+ (priv->EarlyRxThreshold == 7 ? RCR_ONLYERLPKT:0);
-+
-+ priv->AcmControl = 0;
-+//}
-+ priv->rf_chip = 0xff & eprom_read(dev,EPROM_RFCHIPID);
-+ //DMESG("rf_chip:%x\n", priv->rf_chip);
-+ if (!priv->rf_chip)
-+ {
-+ DMESG("Can't get rf chip ID from EEPROM");
-+ DMESGW("So set rf chip ID to defalut EPROM_RFCHIPID_RTL8225U");
-+ DMESGW("use it with care and at your own risk and");
-+ DMESGW("**PLEASE** REPORT SUCCESS/INSUCCESS TO Realtek");
-+ priv->rf_chip = EPROM_RFCHIPID_RTL8225U;
-+
-+ }
-+
-+
-+//{put the card to detect different card here, mainly I/O processing
-+ udev = priv->udev;
-+ idProduct = le16_to_cpu(udev->descriptor.idProduct);
-+ //idProduct = 0x8197;
-+ bcdDevice = le16_to_cpu(udev->descriptor.bcdDevice);
-+ DMESG("idProduct:0x%x, bcdDevice:0x%x", idProduct,bcdDevice);
-+ switch (idProduct) {
-+ case 0x8189:
-+ case 0x8197:
-+ case 0x8198:
-+ /* check RF frontend chipset */
-+ priv->card_8187 = NIC_8187B;
-+ priv->rf_init = rtl8225z2_rf_init;
-+ priv->rf_set_chan = rtl8225z2_rf_set_chan;
-+ priv->rf_set_sens = NULL;
-+ break;
-+
-+ case 0x8187:
-+ if(bcdDevice == 0x0200){
-+ priv->card_8187 = NIC_8187B;
-+ priv->rf_init = rtl8225z2_rf_init;
-+ priv->rf_set_chan = rtl8225z2_rf_set_chan;
-+ priv->rf_set_sens = NULL;
-+ break;
-+ }else{
-+ //0x0100 is for 8187
-+ //legacy 8187 NIC
-+ //delet
-+ ;
-+ }
-+ default:
-+ /* check RF frontend chipset */
-+ priv->ieee80211->softmac_features |= IEEE_SOFTMAC_SINGLE_QUEUE;
-+ priv->card_8187 = NIC_8187;
-+ switch (priv->rf_chip) {
-+ case EPROM_RFCHIPID_RTL8225U:
-+ DMESG("Card reports RF frontend Realtek 8225");
-+ DMESGW("This driver has EXPERIMENTAL support for this chipset.");
-+ DMESGW("use it with care and at your own risk and");
-+ DMESGW("**PLEASE** REPORT SUCCESS/INSUCCESS TO Realtek");
-+ if(rtl8225_is_V_z2(dev)){
-+ priv->rf_init = rtl8225z2_rf_init;
-+ priv->rf_set_chan = rtl8225z2_rf_set_chan;
-+ priv->rf_set_sens = NULL;
-+ DMESG("This seems a new V2 radio");
-+ }else{
-+ priv->rf_init = rtl8225_rf_init;
-+ priv->rf_set_chan = rtl8225_rf_set_chan;
-+ priv->rf_set_sens = rtl8225_rf_set_sens;
-+ DMESG("This seems a legacy 1st version radio");
-+ }
-+ break;
-+
-+ case EPROM_RFCHIPID_RTL8225U_VF:
-+ priv->rf_init = rtl8225z2_rf_init;
-+ priv->rf_set_chan = rtl8225z2_rf_set_chan;
-+ priv->rf_set_sens = NULL;
-+ DMESG("This seems a new V2 radio");
-+ break;
-+
-+ default:
-+ DMESGW("Unknown RF module %x",priv->rf_chip);
-+ DMESGW("Exiting...");
-+ return -1;
-+ }
-+ break;
-+ }
-+
-+ priv->rf_close = rtl8225_rf_close;
-+ priv->max_sens = RTL8225_RF_MAX_SENS;
-+ priv->sens = RTL8225_RF_DEF_SENS;
-+
-+#ifdef ENABLE_DOT11D
-+#if 0
-+ for(i=0;i<0xFF;i++) {
-+ if(i%16 == 0)
-+ printk("\n[%x]: ", i/16);
-+ printk("\t%4.4x", eprom_read(dev,i));
-+ }
-+#endif
-+ priv->channel_plan = eprom_read(dev,EPROM_CHANNEL_PLAN) & 0xFF;
-+ //DMESG("EPROM_CHANNEL_PLAN is %x", priv->channel_plan);
-+
-+ // lzm add 081205 for Toshiba:
-+ // For Toshiba,reading the value from EEPROM 0x6h bit[7] to determine the priority of
-+ // channel plan to be defined.
-+ // -If bit[7] is true, then the channel plan is defined by EEPROM but no user defined.
-+ // -If bit[7] is false, then the channel plan is defined by user first.
-+ //
-+ if(priv->channel_plan & 0x80) {
-+ DMESG("Toshiba channel plan is defined by EEPROM");
-+ priv->channel_plan &= 0xf;
-+ }
-+ else
-+ priv->channel_plan = 0;
-+
-+ //if(priv->channel_plan > COUNTRY_CODE_WORLD_WIDE_13_INDEX){
-+ if(priv->channel_plan > COUNTRY_CODE_GLOBAL_DOMAIN){
-+ DMESG("rtl8180_init:Error channel plan! Set to default.\n");
-+ priv->channel_plan = 0;
-+ }
-+
-+ //priv->channel_plan = 9; //Global Domain
-+ //priv->channel_plan = 2; //ETSI
-+
-+
-+ DMESG("Channel plan is %d ",priv->channel_plan);
-+
-+ //for Toshiba card we read channel plan from ChanPlanBin
-+ if((idProduct != 0x8197) && (idProduct != 0x8198))
-+ rtl8180_set_channel_map(priv->channel_plan, priv->ieee80211);
-+#else
-+ int ch;
-+ priv->channel_plan = eprom_read(dev,EPROM_CHANNEL_PLAN) & 0xff;
-+ if(priv->channel_plan & 0x80) {
-+ priv->channel_plan &= 0x7f;
-+ if (ChannelPlan[priv->channel_plan].Len != 0){
-+ // force channel plan map
-+ for (i=0;i<ChannelPlan[priv->channel_plan].Len;i++)
-+ priv->ieee80211->channel_map[ChannelPlan[priv->channel_plan].Channel[i]] = 1;
-+ } else {
-+ DMESG("No channels, aborting");
-+ return -1;
-+ }
-+ } else {
-+ //default channel plan setting
-+ if(!channels){
-+ DMESG("No channels, aborting");
-+ return -1;
-+ }
-+ ch=channels;
-+ // set channels 1..14 allowed in given locale
-+ for (i=1; i<=14; i++) {
-+ (priv->ieee80211->channel_map)[i] = (u8)(ch & 0x01);
-+ ch >>= 1;
-+ }
-+ }
-+#endif
-+
-+ if((idProduct == 0x8197) || (idProduct == 0x8198)) {
-+ // lzm add 081205 for Toshiba:
-+ // 0x77h bit[0]=1: use GPIO bit[2], bit[0]=0: use GPIO bit[1]
-+ priv->EEPROMSelectNewGPIO =((u8)((eprom_read(dev,EPROM_SELECT_GPIO) & 0xff00) >> 8)) ? true : false;
-+ DMESG("EPROM_SELECT_GPIO:%d", priv->EEPROMSelectNewGPIO);
-+ } else {
-+ priv->EEPROMSelectNewGPIO = false;
-+ }
-+
-+
-+ if (NIC_8187 == priv->card_8187){
-+ hw_version =( read_nic_dword(dev, TCR) & TCR_HWVERID_MASK)>>TCR_HWVERID_SHIFT;
-+ switch (hw_version) {
-+ case 0x06:
-+ //priv->card_8187_Bversion = VERSION_8187B_B;
-+ break;
-+ case 0x05:
-+ priv->card_8187_Bversion = VERSION_8187_D;
-+ break;
-+ default:
-+ priv->card_8187_Bversion = VERSION_8187_B;
-+ break;
-+ }
-+ }else{
-+ hw_version = read_nic_byte(dev, 0xe1); //87B hw version reg
-+ switch (hw_version){
-+ case 0x00:
-+ priv->card_8187_Bversion = VERSION_8187B_B;
-+ break;
-+ case 0x01:
-+ priv->card_8187_Bversion = VERSION_8187B_D;
-+ break;
-+ case 0x02:
-+ priv->card_8187_Bversion = VERSION_8187B_E;
-+ break;
-+ default:
-+ priv->card_8187_Bversion = VERSION_8187B_B; //defalt
-+ break;
-+ }
-+ }
-+
-+ //printk("=====hw_version:%x\n", priv->card_8187_Bversion);
-+ priv->enable_gpio0 = 0;
-+
-+ /*the eeprom type is stored in RCR register bit #6 */
-+ if (RCR_9356SEL & read_nic_dword(dev, RCR)){
-+ priv->epromtype=EPROM_93c56;
-+ DMESG("Reported EEPROM chip is a 93c56 (2Kbit)");
-+ }else{
-+ priv->epromtype=EPROM_93c46;
-+ DMESG("Reported EEPROM chip is a 93c46 (1Kbit)");
-+ }
-+
-+ dev->dev_addr[0]=eprom_read(dev,MAC_ADR) & 0xff;
-+ dev->dev_addr[1]=(eprom_read(dev,MAC_ADR) & 0xff00)>>8;
-+ dev->dev_addr[2]=eprom_read(dev,MAC_ADR+1) & 0xff;
-+ dev->dev_addr[3]=(eprom_read(dev,MAC_ADR+1) & 0xff00)>>8;
-+ dev->dev_addr[4]=eprom_read(dev,MAC_ADR+2) & 0xff;
-+ dev->dev_addr[5]=((eprom_read(dev,MAC_ADR+2) & 0xff00)>>8)+1;
-+
-+ DMESG("Card MAC address is "MAC_FMT, MAC_ARG(dev->dev_addr));
-+
-+ for(i=1,j=0; i<6; i+=2,j++){
-+
-+ word = eprom_read(dev,EPROM_TXPW0 + j);
-+ priv->chtxpwr[i]=word & 0xf;
-+ priv->chtxpwr_ofdm[i]=(word & 0xf0)>>4;
-+ priv->chtxpwr[i+1]=(word & 0xf00)>>8;
-+ priv->chtxpwr_ofdm[i+1]=(word & 0xf000)>>12;
-+ }
-+
-+ for(i=1,j=0; i<4; i+=2,j++){
-+
-+ word = eprom_read(dev,EPROM_TXPW1 + j);
-+ priv->chtxpwr[i+6]=word & 0xf;
-+ priv->chtxpwr_ofdm[i+6]=(word & 0xf0)>>4;
-+ priv->chtxpwr[i+6+1]=(word & 0xf00)>>8;
-+ priv->chtxpwr_ofdm[i+6+1]=(word & 0xf000)>>12;
-+ }
-+ if (priv->card_8187 == NIC_8187){
-+ for(i=1,j=0; i<4; i+=2,j++){
-+ word = eprom_read(dev,EPROM_TXPW2 + j);
-+ priv->chtxpwr[i+6+4]=word & 0xf;
-+ priv->chtxpwr_ofdm[i+6+4]=(word & 0xf0)>>4;
-+ priv->chtxpwr[i+6+4+1]=(word & 0xf00)>>8;
-+ priv->chtxpwr_ofdm[i+6+4+1]=(word & 0xf000)>>12;
-+ }
-+ } else{
-+ word = eprom_read(dev, 0x1B) & 0xff; //channel 11;
-+ priv->chtxpwr[11]=word & 0xf;
-+ priv->chtxpwr_ofdm[11] = (word & 0xf0)>>4;
-+
-+ word = eprom_read(dev, 0xA) & 0xff; //channel 12;
-+ priv->chtxpwr[12]=word & 0xf;
-+ priv->chtxpwr_ofdm[12] = (word & 0xf0)>>4;
-+
-+ word = eprom_read(dev, 0x1c) ; //channel 13 ,14;
-+ priv->chtxpwr[13]=word & 0xf;
-+ priv->chtxpwr_ofdm[13] = (word & 0xf0)>>4;
-+ priv->chtxpwr[14]=(word & 0xf00)>>8;
-+ priv->chtxpwr_ofdm[14] = (word & 0xf000)>>12;
-+ }
-+
-+ word = eprom_read(dev,EPROM_TXPW_BASE);
-+ priv->cck_txpwr_base = word & 0xf;
-+ priv->ofdm_txpwr_base = (word>>4) & 0xf;
-+
-+ //DMESG("PAPE from CONFIG2: %x",read_nic_byte(dev,CONFIG2)&0x7);
-+
-+#ifdef SW_ANTE_DIVERSITY
-+ rtl8187_antenna_diversity_read(dev);
-+#endif
-+
-+ if(rtl8187_usb_initendpoints(dev)!=0){
-+ DMESG("Endopoints initialization failed");
-+ return -ENOMEM;
-+ }
-+#ifdef LED
-+ InitSwLeds(dev);
-+#endif
-+#ifdef DEBUG_EPROM
-+ dump_eprom(dev);
-+#endif
-+ return 0;
-+
-+}
-+
-+void rtl8185_rf_pins_enable(struct net_device *dev)
-+{
-+/* u16 tmp;
-+ tmp = read_nic_word(dev, RFPinsEnable);*/
-+ write_nic_word(dev, RFPinsEnable, 0x1ff7);// | tmp);
-+}
-+
-+
-+void rtl8185_set_anaparam2(struct net_device *dev, u32 a)
-+{
-+ u8 conf3;
-+
-+ rtl8180_set_mode(dev, EPROM_CMD_CONFIG);
-+
-+ conf3 = read_nic_byte(dev, CONFIG3);
-+ write_nic_byte(dev, CONFIG3, conf3 | (1<<CONFIG3_ANAPARAM_W_SHIFT));
-+
-+ write_nic_dword(dev, ANAPARAM2, a);
-+
-+ conf3 = read_nic_byte(dev, CONFIG3);
-+ write_nic_byte(dev, CONFIG3, conf3 &~(1<<CONFIG3_ANAPARAM_W_SHIFT));
-+
-+ rtl8180_set_mode(dev, EPROM_CMD_NORMAL);
-+
-+}
-+
-+
-+void rtl8180_set_anaparam(struct net_device *dev, u32 a)
-+{
-+ u8 conf3;
-+
-+ rtl8180_set_mode(dev, EPROM_CMD_CONFIG);
-+
-+ conf3 = read_nic_byte(dev, CONFIG3);
-+ write_nic_byte(dev, CONFIG3, conf3 | (1<<CONFIG3_ANAPARAM_W_SHIFT));
-+
-+ write_nic_dword(dev, ANAPARAM, a);
-+
-+ conf3 = read_nic_byte(dev, CONFIG3);
-+ write_nic_byte(dev, CONFIG3, conf3 &~(1<<CONFIG3_ANAPARAM_W_SHIFT));
-+
-+ rtl8180_set_mode(dev, EPROM_CMD_NORMAL);
-+
-+}
-+
-+
-+void rtl8185_tx_antenna(struct net_device *dev, u8 ant)
-+{
-+ write_nic_byte(dev, ANTSEL, ant);
-+ //lzm mod for up take too long time 20081201
-+ //mdelay(1);
-+}
-+
-+
-+void rtl8187_write_phy(struct net_device *dev, u8 adr, u32 data)
-+{
-+ u32 phyw;
-+
-+ adr |= 0x80;
-+
-+ phyw= ((data<<8) | adr);
-+
-+
-+
-+ // Note that, we must write 0xff7c after 0x7d-0x7f to write BB register.
-+ write_nic_byte(dev, 0x7f, ((phyw & 0xff000000) >> 24));
-+ write_nic_byte(dev, 0x7e, ((phyw & 0x00ff0000) >> 16));
-+ write_nic_byte(dev, 0x7d, ((phyw & 0x0000ff00) >> 8));
-+ write_nic_byte(dev, 0x7c, ((phyw & 0x000000ff) ));
-+
-+ //read_nic_dword(dev, PHY_ADR);
-+#if 0
-+ for(i=0;i<10;i++){
-+ write_nic_dword(dev, PHY_ADR, 0xffffff7f & phyw);
-+ phyr = read_nic_byte(dev, PHY_READ);
-+ if(phyr == (data&0xff)) break;
-+
-+ }
-+#endif
-+ /* this is ok to fail when we write AGC table. check for AGC table might be
-+ * done by masking with 0x7f instead of 0xff */
-+ //if(phyr != (data&0xff)) DMESGW("Phy write timeout %x %x %x", phyr, data, adr);
-+ //msdelay(1);//CPU occupany is too high. LZM 31/10/2008
-+}
-+
-+u8 rtl8187_read_phy(struct net_device *dev,u8 adr, u32 data)
-+{
-+ u32 phyw;
-+
-+ adr &= ~0x80;
-+ phyw= ((data<<8) | adr);
-+
-+
-+ // Note that, we must write 0xff7c after 0x7d-0x7f to write BB register.
-+ write_nic_byte(dev, 0x7f, ((phyw & 0xff000000) >> 24));
-+ write_nic_byte(dev, 0x7e, ((phyw & 0x00ff0000) >> 16));
-+ write_nic_byte(dev, 0x7d, ((phyw & 0x0000ff00) >> 8));
-+ write_nic_byte(dev, 0x7c, ((phyw & 0x000000ff) ));
-+
-+ return(read_nic_byte(dev,0x7e));
-+
-+}
-+
-+u8 read_phy_ofdm(struct net_device *dev, u8 adr)
-+{
-+ return(rtl8187_read_phy(dev, adr, 0x000000));
-+}
-+
-+u8 read_phy_cck(struct net_device *dev, u8 adr)
-+{
-+ return(rtl8187_read_phy(dev, adr, 0x10000));
-+}
-+
-+inline void write_phy_ofdm (struct net_device *dev, u8 adr, u32 data)
-+{
-+ data = data & 0xff;
-+ rtl8187_write_phy(dev, adr, data);
-+}
-+
-+
-+void write_phy_cck (struct net_device *dev, u8 adr, u32 data)
-+{
-+ data = data & 0xff;
-+ rtl8187_write_phy(dev, adr, data | 0x10000);
-+}
-+//
-+// Description: Change ZEBRA's power state.
-+//
-+// Assumption: This function must be executed in PASSIVE_LEVEL.
-+//
-+// 061214, by rcnjko.
-+//
-+//#define MAX_DOZE_WAITING_TIMES_87B 1000//500
-+#define MAX_DOZE_WAITING_TIMES_87B_MOD 500
-+
-+bool SetZebraRFPowerState8187B(struct net_device *dev,RT_RF_POWER_STATE eRFPowerState)
-+{
-+ struct r8180_priv *priv = ieee80211_priv(dev);
-+ u8 btCR9346, btConfig3;
-+ bool bResult = true;
-+ int i;
-+ u16 u2bTFPC = 0;
-+ u8 u1bTmp;
-+
-+ // Set EEM0 and EEM1 in 9346CR.
-+ btCR9346 = read_nic_byte(dev, CR9346);
-+ write_nic_byte(dev, CR9346, (btCR9346|0xC0) );
-+ // Set PARM_En in Config3.
-+ btConfig3 = read_nic_byte(dev, CONFIG3);
-+ write_nic_byte(dev, CONFIG3, (btConfig3|CONFIG3_PARM_En) );
-+ // BB and RF related operations:
-+ switch(eRFPowerState)
-+ {
-+ case eRfOn:
-+//#ifdef CONFIG_RADIO_DEBUG
-+ DMESG("Now Radio ON!");
-+//#endif
-+ write_nic_dword(dev, ANAPARAM, ANAPARM_ON);
-+ write_nic_dword(dev, ANAPARAM2, ANAPARM2_ON);
-+ //write_nic_byte(dev, CONFIG4, (priv->RFProgType));
-+
-+ write_nic_byte(dev, 0x085, 0x24); // 061219, SD3 ED: for minicard CCK power leakage issue.
-+ write_rtl8225(dev, 0x4, 0x9FF);
-+ mdelay(1);
-+ //
-+ // <Roger_Notes> We reset PLL to reduce power consumption about 30 mA. 2008.01.16.
-+ //
-+ {
-+ u8 Reg62;
-+
-+ write_nic_byte(dev, 0x61, 0x10);
-+ Reg62 = read_nic_byte(dev, 0x62);
-+ write_nic_byte(dev, 0x62, (Reg62 & (~BIT5)) );
-+ write_nic_byte(dev, 0x62, (Reg62 | BIT5) ); // Enable PLL.
-+ }
-+
-+ u1bTmp = read_nic_byte(dev, 0x24E);
-+ write_nic_byte(dev, 0x24E, (u1bTmp & (~(BIT5|BIT6))) );// 070124 SD1 Alex: turn on CCK and OFDM.
-+ break;
-+
-+ case eRfSleep:
-+#ifdef CONFIG_RADIO_DEBUG
-+ DMESG("Now Radio Sleep!");
-+#endif
-+ for(i = 0; i < MAX_DOZE_WAITING_TIMES_87B_MOD; i++)
-+ { // Make sure TX FIFO is empty befor turn off RFE pwoer.
-+ u2bTFPC = read_nic_word(dev, TFPC);
-+ if(u2bTFPC == 0){
-+ printk("%d times TFPC: %d == 0 before doze...\n", (i+1), u2bTFPC);
-+ break;
-+ }else{
-+ printk("%d times TFPC: %d != 0 before doze!\n", (i+1), u2bTFPC);
-+ udelay(10);
-+ }
-+ }
-+
-+ if( i == MAX_DOZE_WAITING_TIMES_87B_MOD ){
-+ printk("\n\n\n SetZebraRFPowerState8187B(): %d times TFPC: %d != 0 !!!\n\n\n", MAX_DOZE_WAITING_TIMES_87B_MOD, u2bTFPC);
-+ }
-+
-+ u1bTmp = read_nic_byte(dev, 0x24E);
-+ write_nic_byte(dev, 0x24E, (u1bTmp|BIT5|BIT6));// 070124 SD1 Alex: turn off CCK and OFDM.
-+
-+ write_rtl8225(dev, 0x4, 0xDFF); // Turn off RF first to prevent BB lock up, suggested by PJ, 2006.03.03.
-+ write_nic_byte(dev, 0x085, 0x04); // 061219, SD3 ED: for minicard CCK power leakage issue.
-+
-+ //write_nic_byte(dev, CONFIG4, (priv->RFProgType|Config4_PowerOff));
-+
-+ write_nic_dword(dev, ANAPARAM, ANAPARM_OFF);
-+ write_nic_dword(dev, ANAPARAM2, 0x72303f70); // 070126, by SD1 William.
-+ break;
-+
-+ case eRfOff:
-+//#ifdef CONFIG_RADIO_DEBUG
-+ DMESG("Now Radio OFF!");
-+//#endif
-+ for(i = 0; i < MAX_DOZE_WAITING_TIMES_87B_MOD; i++)
-+ { // Make sure TX FIFO is empty befor turn off RFE pwoer.
-+ u2bTFPC = read_nic_word(dev, TFPC);
-+ if(u2bTFPC == 0) {
-+ //printk("%d times TFPC: %d == 0 before doze...\n", (i+1), u2bTFPC);
-+ break;
-+ }else{
-+ //printk("%d times TFPC: 0x%x != 0 before doze!\n", (i+1), u2bTFPC);
-+ udelay(10);
-+ }
-+ }
-+
-+ if( i == MAX_DOZE_WAITING_TIMES_87B_MOD){
-+ printk("\n\n\nSetZebraRFPowerState8187B(): %d times TFPC: 0x%x != 0 !!!\n\n\n", MAX_DOZE_WAITING_TIMES_87B_MOD, u2bTFPC);
-+ }
-+
-+ u1bTmp = read_nic_byte(dev, 0x24E);
-+ write_nic_byte(dev, 0x24E, (u1bTmp|BIT5|BIT6));// 070124 SD1 Alex: turn off CCK and OFDM.
-+
-+ write_rtl8225(dev, 0x4,0x1FF); // Turn off RF first to prevent BB lock up, suggested by PJ, 2006.03.03.
-+ write_nic_byte(dev, 0x085, 0x04); // 061219, SD3 ED: for minicard CCK power leakage issue.
-+
-+ //write_nic_byte(dev, CONFIG4, (priv->RFProgType|Config4_PowerOff));
-+
-+ write_nic_dword(dev, ANAPARAM, ANAPARM_OFF);
-+ write_nic_dword(dev, ANAPARAM2, ANAPARM2_OFF); // 070301, SD1 William: to reduce RF off power consumption to 80 mA.
-+ break;
-+
-+ default:
-+ bResult = false;
-+ printk("SetZebraRFPowerState8187B(): unknow state to set: 0x%X!!!\n", eRFPowerState);
-+ break;
-+ }
-+
-+ // Clear PARM_En in Config3.
-+ btConfig3 &= ~(CONFIG3_PARM_En);
-+ write_nic_byte(dev, CONFIG3, btConfig3);
-+ // Clear EEM0 and EEM1 in 9346CR.
-+ btCR9346 &= ~(0xC0);
-+ write_nic_byte(dev, CR9346, btCR9346);
-+
-+ if(bResult){
-+ // Update current RF state variable.
-+ priv->eRFPowerState = eRFPowerState;
-+ }
-+
-+ return bResult;
-+}
-+//by amy for ps
-+//
-+// Description: Chang RF Power State.
-+// Note that, only MgntActSet_RF_State() is allowed to set HW_VAR_RF_STATE.
-+//
-+// Assumption:PASSIVE LEVEL.
-+//
-+bool SetRFPowerState(struct net_device *dev,RT_RF_POWER_STATE eRFPowerState)
-+{
-+ struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
-+ bool bResult = false;
-+
-+ //printk("---------> SetRFPowerState(): eRFPowerState(%d)\n", eRFPowerState);
-+ if(eRFPowerState == priv->eRFPowerState)
-+ {
-+ //printk("<--------- SetRFPowerState(): discard the request for eRFPowerState(%d) is the same.\n", eRFPowerState);
-+ return bResult;
-+ }
-+
-+ switch(priv->rf_chip)
-+ {
-+ case RF_ZEBRA2:
-+ bResult = SetZebraRFPowerState8187B(dev, eRFPowerState);
-+ break;
-+
-+ default:
-+ printk("SetRFPowerState8185(): unknown RFChipID: 0x%X!!!\n", priv->rf_chip);
-+ break;;
-+ }
-+ //printk("<--------- SetRFPowerState(): bResult(%d)\n", bResult);
-+
-+ return bResult;
-+}
-+
-+bool
-+MgntActSet_RF_State(struct net_device *dev,RT_RF_POWER_STATE StateToSet,u32 ChangeSource)
-+{
-+ struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
-+ bool bActionAllowed = false;
-+ bool bConnectBySSID = false;
-+ RT_RF_POWER_STATE rtState;
-+ u16 RFWaitCounter = 0;
-+ unsigned long flag;
-+ // printk("===>MgntActSet_RF_State(): StateToSet(%d), ChangeSource(0x%x)\n",StateToSet, ChangeSource);
-+ //
-+ // Prevent the race condition of RF state change. By Bruce, 2007-11-28.
-+ // Only one thread can change the RF state at one time, and others should wait to be executed.
-+ //
-+#if 1
-+ while(true)
-+ {
-+ //down(&priv->rf_state);
-+ spin_lock_irqsave(&priv->rf_ps_lock,flag);
-+ if(priv->RFChangeInProgress)
-+ {
-+ //up(&priv->rf_state);
-+ //RT_TRACE(COMP_RF, DBG_LOUD, ("MgntActSet_RF_State(): RF Change in progress! Wait to set..StateToSet(%d).\n", StateToSet));
-+ spin_unlock_irqrestore(&priv->rf_ps_lock,flag);
-+ // Set RF after the previous action is done.
-+ while(priv->RFChangeInProgress)
-+ {
-+ RFWaitCounter ++;
-+ //RT_TRACE(COMP_RF, DBG_LOUD, ("MgntActSet_RF_State(): Wait 1 ms (%d times)...\n", RFWaitCounter));
-+ udelay(1000); // 1 ms
-+
-+ // Wait too long, return FALSE to avoid to be stuck here.
-+ if(RFWaitCounter > 1000) // 1sec
-+ {
-+ DMESG("MgntActSet_RF_State(): Wait too long to set RF");
-+ // TODO: Reset RF state?
-+ return false;
-+ }
-+ }
-+ }
-+ else
-+ {
-+ priv->RFChangeInProgress = true;
-+// up(&priv->rf_state);
-+ spin_unlock_irqrestore(&priv->rf_ps_lock,flag);
-+ break;
-+ }
-+ }
-+#endif
-+ rtState = priv->eRFPowerState;
-+
-+ switch(StateToSet)
-+ {
-+ case eRfOn:
-+ //
-+ // Turn On RF no matter the IPS setting because we need to update the RF state to Ndis under Vista, or
-+ // the Windows does not allow the driver to perform site survey any more. By Bruce, 2007-10-02.
-+ //
-+ // leave last reasons and kick this reason till priv->RfOffReason = 0;
-+ // if one reason turn radio off check if off->on reason is the same.if so turn, or reject it.
-+ // if more than 1 reasons turn radio off we only turn on radio when all reasons turn on radio,
-+ // so first turn on trys will reject till priv->RfOffReason = 0;
-+ priv->RfOffReason &= (~ChangeSource);
-+
-+ if(! priv->RfOffReason)
-+ {
-+ priv->RfOffReason = 0;
-+ bActionAllowed = true;
-+
-+ if(rtState == eRfOff && ChangeSource >=RF_CHANGE_BY_HW && !priv->bInHctTest)
-+ {
-+ bConnectBySSID = true;
-+ }
-+ } else {
-+ ;//lzm must or TX_PENDING 12>MAX_TX_URB
-+ //printk("Turn Radio On Reject because RfOffReason= 0x%x, ChangeSource=0x%X\n", priv->RfOffReason, ChangeSource);
-+ }
-+ break;
-+
-+ case eRfOff:
-+ // 070125, rcnjko: we always keep connected in AP mode.
-+ if (priv->RfOffReason > RF_CHANGE_BY_IPS)
-+ {
-+ //
-+ // 060808, Annie:
-+ // Disconnect to current BSS when radio off. Asked by QuanTa.
-+ //
-+
-+ //
-+ // Calling MgntDisconnect() instead of MgntActSet_802_11_DISASSOCIATE(),
-+ // because we do NOT need to set ssid to dummy ones.
-+ // Revised by Roger, 2007.12.04.
-+ //
-+//by amy not supported
-+ //MgntDisconnect( dev, disas_lv_ss );
-+
-+ // Clear content of bssDesc[] and bssDesc4Query[] to avoid reporting old bss to UI.
-+ // 2007.05.28, by shien chang.
-+ //PlatformZeroMemory( pMgntInfo->bssDesc, sizeof(RT_WLAN_BSS)*MAX_BSS_DESC );
-+ //pMgntInfo->NumBssDesc = 0;
-+ //PlatformZeroMemory( pMgntInfo->bssDesc4Query, sizeof(RT_WLAN_BSS)*MAX_BSS_DESC );
-+ //pMgntInfo->NumBssDesc4Query = 0;
-+ }
-+
-+
-+
-+ priv->RfOffReason |= ChangeSource;
-+ bActionAllowed = true;
-+ //printk("Turn Radio Off RfOffReason= 0x%x, ChangeSource=0x%X\n", priv->RfOffReason, ChangeSource);
-+ break;
-+
-+ case eRfSleep:
-+ priv->RfOffReason |= ChangeSource;
-+ bActionAllowed = true;
-+ break;
-+
-+ default:
-+ break;
-+ }
-+
-+ if(bActionAllowed)
-+ {
-+ // Config HW to the specified mode.
-+ //printk("MgntActSet_RF_State(): Action is allowed.... StateToSet(%d), RfOffReason(%#X)\n", StateToSet, priv->RfOffReason);
-+ SetRFPowerState(dev, StateToSet);
-+ // Turn on RF.
-+ if(StateToSet == eRfOn)
-+ {
-+ //HalEnableRx8185Dummy(dev);
-+ if(bConnectBySSID)
-+ {
-+ // by amy not supported
-+ //MgntActSet_802_11_SSID(Adapter, Adapter->MgntInfo.Ssid.Octet, Adapter->MgntInfo.Ssid.Length, TRUE );
-+ }
-+ }
-+ // Turn off RF.
-+ else if(StateToSet == eRfOff)
-+ {
-+ //HalDisableRx8185Dummy(dev);
-+ }
-+ }
-+ else
-+ {
-+ //printk("Action is rejected.... StateToSet(%d), ChangeSource(%#X), RfOffReason(%#X)\n",
-+ // StateToSet, ChangeSource, priv->RfOffReason);
-+ }
-+
-+ // Release RF spinlock
-+ //down(&priv->rf_state);
-+ spin_lock_irqsave(&priv->rf_ps_lock,flag);
-+ priv->RFChangeInProgress = false;
-+ //up(&priv->rf_state);
-+ spin_unlock_irqrestore(&priv->rf_ps_lock,flag);
-+ return bActionAllowed;
-+}
-+//by amy for ps
-+
-+void rtl8180_adapter_start(struct net_device *dev)
-+{
-+ struct r8180_priv *priv = ieee80211_priv(dev);
-+// struct ieee80211_device *ieee = priv->ieee80211;
-+// u8 InitWirelessMode;
-+// u8 SupportedWirelessMode;
-+// bool bInvalidWirelessMode = false;
-+
-+
-+ if(NIC_8187 == priv->card_8187) {
-+ //rtl8180_rtx_disable(dev);
-+ rtl8180_reset(dev);
-+
-+ write_nic_byte(dev,0x85,0);
-+ write_nic_byte(dev,0x91,0);
-+
-+ /* light blink! */
-+ write_nic_byte(dev,0x85,4);
-+ write_nic_byte(dev,0x91,1);
-+ write_nic_byte(dev,0x90,0);
-+
-+ //by lizhaoming for LED POWR ON
-+ //LedControl8187(dev, LED_CTL_POWER_ON);
-+
-+ /*
-+ write_nic_byte(dev, CR9346, 0xC0);
-+ //LED TYPE
-+ write_nic_byte(dev, CONFIG1,((read_nic_byte(dev, CONFIG1)&0x3f)|0x80)); //turn on bit 5:Clkrun_mode
-+ write_nic_byte(dev, CR9346, 0x0); // disable config register write
-+ */
-+ priv->irq_mask = 0xffff;
-+ /*
-+ priv->dma_poll_mask = 0;
-+ priv->dma_poll_mask|= (1<<TX_DMA_STOP_BEACON_SHIFT);
-+ */
-+ // rtl8180_beacon_tx_disable(dev);
-+
-+ rtl8180_set_mode(dev, EPROM_CMD_CONFIG);
-+ write_nic_dword(dev, MAC0, ((u32*)dev->dev_addr)[0]);
-+ write_nic_word(dev, MAC4, ((u32*)dev->dev_addr)[1] & 0xffff );
-+
-+ rtl8180_set_mode(dev, EPROM_CMD_NORMAL);
-+ rtl8180_update_msr(dev);
-+
-+ rtl8180_set_mode(dev, EPROM_CMD_CONFIG);
-+
-+ write_nic_word(dev,0xf4,0xffff);
-+ write_nic_byte(dev,
-+ CONFIG1, (read_nic_byte(dev,CONFIG1) & 0x3f) | 0x80);
-+
-+ rtl8180_set_mode(dev,EPROM_CMD_NORMAL);
-+
-+ write_nic_dword(dev,INT_TIMEOUT,0);
-+
-+#ifdef DEBUG_REGISTERS
-+ rtl8180_dump_reg(dev);
-+#endif
-+
-+
-+ write_nic_byte(dev, WPA_CONFIG, 0);
-+
-+ write_nic_byte(dev, RATE_FALLBACK, 0x81);
-+ rtl8187_set_rate(dev);
-+
-+ priv->rf_init(dev);
-+
-+ if(priv->rf_set_sens != NULL) {
-+ priv->rf_set_sens(dev,priv->sens);
-+ }
-+
-+ write_nic_word(dev,0x5e,1);
-+ //mdelay(1);
-+ write_nic_word(dev,0xfe,0x10);
-+ // mdelay(1);
-+ write_nic_byte(dev, TALLY_SEL, 0x80);//Set NQ retry count
-+ write_nic_byte(dev, 0xff, 0x60);
-+ write_nic_word(dev,0x5e,0);
-+
-+ rtl8180_irq_enable(dev);
-+ } else {
-+ /**
-+ * IO part migrated from Windows Driver.
-+ */
-+ priv->irq_mask = 0xffff;
-+ // Enable Config3.PARAM_En.
-+ write_nic_byte(dev, CR9346, 0xC0);
-+
-+ write_nic_byte(dev, CONFIG3, (read_nic_byte(dev, CONFIG3)| CONFIG3_PARM_En|CONFIG3_GNTSel));
-+ // Turn on Analog power.
-+ // setup A/D D/A parameter for 8185 b2
-+ // Asked for by William, otherwise, MAC 3-wire can't work, 2006.06.27, by rcnjko.
-+ write_nic_dword(dev, ANA_PARAM2, ANAPARM2_ASIC_ON);
-+ write_nic_dword(dev, ANA_PARAM, ANAPARM_ASIC_ON);
-+ write_nic_byte(dev, ANA_PARAM3, 0x00);
-+
-+ //by lizhaoming for LED POWR ON
-+ //LedControl8187(dev, LED_CTL_POWER_ON);
-+
-+ {//added for reset PLL
-+ u8 bReg62;
-+ write_nic_byte(dev, 0x61, 0x10);
-+ bReg62 = read_nic_byte(dev, 0x62);
-+ write_nic_byte(dev, 0x62, bReg62&(~(0x1<<5)));
-+ write_nic_byte(dev, 0x62, bReg62|(0x1<<5));
-+ }
-+ write_nic_byte(dev, CONFIG3, (read_nic_byte(dev, CONFIG3)&(~CONFIG3_PARM_En)));
-+ write_nic_byte(dev, CR9346, 0x00);
-+
-+ //rtl8180_rtx_disable(dev);
-+ rtl8180_reset(dev);
-+ write_nic_byte(dev, CR9346, 0xc0); // enable config register write
-+ priv->rf_init(dev);
-+ // Enable tx/rx
-+
-+ write_nic_byte(dev, CMD, (CR_RE|CR_TE));// Using HW_VAR_COMMAND instead of writing CMDR directly. Rewrited by Annie, 2006-04-07.
-+
-+ //add this is for 8187B Rx stall problem
-+
-+ rtl8180_irq_enable(dev);
-+
-+ write_nic_byte_E(dev, 0x41, 0xF4);
-+ write_nic_byte_E(dev, 0x40, 0x00);
-+ write_nic_byte_E(dev, 0x42, 0x00);
-+ write_nic_byte_E(dev, 0x42, 0x01);
-+ write_nic_byte_E(dev, 0x40, 0x0F);
-+ write_nic_byte_E(dev, 0x42, 0x00);
-+ write_nic_byte_E(dev, 0x42, 0x01);
-+
-+ // 8187B demo board MAC and AFE power saving parameters from SD1 William, 2006.07.20.
-+ // Parameter revised by SD1 William, 2006.08.21:
-+ // 373h -> 0x4F // Original: 0x0F
-+ // 377h -> 0x59 // Original: 0x4F
-+ // Victor 2006/8/21: ¬Ù¹q°Ñ¼Æ«Øijµ¥SD3 °ª§C·Å and cable link test OK¤~¥¿¦¡ release,¤£«Øij¤Ó§Ö
-+ // 2006/9/5, Victor & ED: it is OK to use.
-+ //if(pHalData->RegBoardType == BT_DEMO_BOARD)
-+ //{
-+ // AFE.
-+ //
-+ // Revise the content of Reg0x372, 0x374, 0x378 and 0x37a to fix unusual electronic current
-+ // while CTS-To-Self occurs, by DZ's request.
-+ // Modified by Roger, 2007.06.22.
-+ //
-+ write_nic_byte(dev, 0x0DB, (read_nic_byte(dev, 0x0DB)|(BIT2)));
-+ write_nic_word(dev, 0x372, 0x59FA); // 0x4FFA-> 0x59FA.
-+ write_nic_word(dev, 0x374, 0x59D2); // 0x4FD2-> 0x59D2.
-+ write_nic_word(dev, 0x376, 0x59D2);
-+ write_nic_word(dev, 0x378, 0x19FA); // 0x0FFA-> 0x19FA.
-+ write_nic_word(dev, 0x37A, 0x19FA); // 0x0FFA-> 0x19FA.
-+ write_nic_word(dev, 0x37C, 0x00D0);
-+
-+ write_nic_byte(dev, 0x061, 0x00);
-+
-+ // MAC.
-+ write_nic_byte(dev, 0x180, 0x0F);
-+ write_nic_byte(dev, 0x183, 0x03);
-+ // 061218, lanhsin: for victorh request
-+ write_nic_byte(dev, 0x0DA, 0x10);
-+ //}
-+
-+ //
-+ // 061213, rcnjko:
-+ // Set MAC.0x24D to 0x00 to prevent cts-to-self Tx/Rx stall symptom.
-+ // If we set MAC 0x24D to 0x08, OFDM and CCK will turn off
-+ // if not in use, and there is a bug about this action when
-+ // we try to send CCK CTS and OFDM data together.
-+ //
-+ //PlatformEFIOWrite1Byte(Adapter, 0x24D, 0x00);
-+ // 061218, lanhsin: for victorh request
-+ write_nic_byte(dev, 0x24D, 0x08);
-+
-+ //
-+ // 061215, rcnjko:
-+ // Follow SD3 RTL8185B_87B_MacPhy_Register.doc v0.4.
-+ //
-+ write_nic_dword(dev, HSSI_PARA, 0x0600321B);
-+ //
-+ // 061226, rcnjko:
-+ // Babble found in HCT 2c_simultaneous test, server with 87B might
-+ // receive a packet size about 2xxx bytes.
-+ // So, we restrict RMS to 2048 (0x800), while as IC default value is 0xC00.
-+ //
-+ write_nic_word(dev, RMS, 0x0800);
-+
-+ /*****20070321 Resolve HW page bug on system logo test
-+ u8 faketemp=read_nic_byte(dev, 0x50);*/
-+ }
-+}
-+
-+/* this configures registers for beacon tx and enables it via
-+ * rtl8180_beacon_tx_enable(). rtl8180_beacon_tx_disable() might
-+ * be used to stop beacon transmission
-+ */
-+#if 0
-+void rtl8180_start_tx_beacon(struct net_device *dev)
-+{
-+ int i;
-+ struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
-+ u16 word;
-+ DMESG("Enabling beacon TX");
-+ //write_nic_byte(dev, 0x42,0xe6);// TCR
-+ //rtl8180_init_beacon(dev);
-+ //set_nic_txring(dev);
-+// rtl8180_prepare_beacon(dev);
-+ rtl8180_irq_disable(dev);
-+// rtl8180_beacon_tx_enable(dev);
-+ rtl8180_set_mode(dev,EPROM_CMD_CONFIG);
-+ //write_nic_byte(dev,0x9d,0x20); //DMA Poll
-+ //write_nic_word(dev,0x7a,0);
-+ //write_nic_word(dev,0x7a,0x8000);
-+
-+
-+ word = read_nic_word(dev, BcnItv);
-+ word &= ~BcnItv_BcnItv; // clear Bcn_Itv
-+ write_nic_word(dev, BcnItv, word);
-+
-+ write_nic_word(dev, AtimWnd,
-+ read_nic_word(dev, AtimWnd) &~ AtimWnd_AtimWnd);
-+
-+ word = read_nic_word(dev, BintrItv);
-+ word &= ~BintrItv_BintrItv;
-+
-+ //word |= priv->ieee80211->beacon_interval *
-+ // ((priv->txbeaconcount > 1)?(priv->txbeaconcount-1):1);
-+ // FIXME:FIXME check if correct ^^ worked with 0x3e8;
-+
-+ write_nic_word(dev, BintrItv, word);
-+
-+ //write_nic_word(dev,0x2e,0xe002);
-+ //write_nic_dword(dev,0x30,0xb8c7832e);
-+ for(i=0; i<ETH_ALEN; i++)
-+ write_nic_byte(dev, BSSID+i, priv->ieee80211->beacon_cell_ssid[i]);
-+
-+// rtl8180_update_msr(dev);
-+
-+
-+ //write_nic_byte(dev,CONFIG4,3); /* !!!!!!!!!! */
-+
-+ rtl8180_set_mode(dev, EPROM_CMD_NORMAL);
-+
-+ rtl8180_irq_enable(dev);
-+
-+ /* VV !!!!!!!!!! VV*/
-+ /*
-+ rtl8180_set_mode(dev,EPROM_CMD_CONFIG);
-+ write_nic_byte(dev,0x9d,0x00);
-+ rtl8180_set_mode(dev,EPROM_CMD_NORMAL);
-+*/
-+}
-+#endif
-+/***************************************************************************
-+ -------------------------------NET STUFF---------------------------
-+***************************************************************************/
-+static struct net_device_stats *rtl8180_stats(struct net_device *dev)
-+{
-+ struct r8180_priv *priv = ieee80211_priv(dev);
-+
-+ return &priv->ieee80211->stats;
-+}
-+
-+int _rtl8180_up(struct net_device *dev)
-+{
-+ struct r8180_priv *priv = ieee80211_priv(dev);
-+ //int i;
-+
-+ priv->driver_upping = 1;
-+ priv->up=1;
-+
-+#ifdef LED
-+ if(priv->ieee80211->bHwRadioOff == false)
-+ priv->ieee80211->ieee80211_led_contorl(dev,LED_CTL_POWER_ON);
-+#endif
-+ MgntActSet_RF_State(dev, eRfOn, RF_CHANGE_BY_SW);
-+
-+ rtl8180_adapter_start(dev);
-+ rtl8180_rx_enable(dev);
-+ rtl8180_tx_enable(dev);
-+//by amy for rate adaptive
-+ timer_rate_adaptive((unsigned long)dev);
-+//by amy for rate adaptive
-+
-+#ifdef SW_ANTE_DIVERSITY
-+ if(priv->bSwAntennaDiverity){
-+ //DMESG("SW Antenna Diversity Enable!");
-+ SwAntennaDiversityTimerCallback(dev);
-+ }
-+#endif
-+#ifdef POLLING_METHOD_FOR_RADIO
-+ if(priv->polling_timer_on == 0){//add for S3/S4
-+ gpio_change_polling((unsigned long)dev);
-+ }
-+#endif
-+
-+ ieee80211_softmac_start_protocol(priv->ieee80211);
-+
-+//by amy for ps
-+ watch_dog_adaptive((unsigned long)dev);
-+//by amy for ps
-+
-+ ieee80211_reset_queue(priv->ieee80211);
-+ if(!netif_queue_stopped(dev))
-+ netif_start_queue(dev);
-+ else
-+ netif_wake_queue(dev);
-+
-+#ifndef CONFIG_SOFT_BEACON
-+ if(NIC_8187B == priv->card_8187)
-+ rtl8187_rx_manage_initiate(dev);
-+#endif
-+
-+#ifdef _RTL8187_EXT_PATCH_
-+ if(priv->mshobj && priv->mshobj->ext_patch_rtl8180_up )
-+ priv->mshobj->ext_patch_rtl8180_up(priv->mshobj);
-+#endif
-+
-+
-+ priv->driver_upping = 0;
-+ DMESG("rtl8187_open process complete");
-+ return 0;
-+}
-+
-+
-+int rtl8180_open(struct net_device *dev)
-+{
-+ struct r8180_priv *priv = ieee80211_priv(dev);
-+ int ret;
-+//changed by lizhaoming for power on/off
-+ if(priv->ieee80211->bHwRadioOff == false){
-+ DMESG("rtl8187_open process ");
-+ down(&priv->wx_sem);
-+ ret = rtl8180_up(dev);
-+ up(&priv->wx_sem);
-+ return ret;
-+ }else{
-+ DMESG("rtl8187_open process failed because radio off");
-+ return -1;
-+ }
-+
-+}
-+
-+
-+int rtl8180_up(struct net_device *dev)
-+{
-+ struct r8180_priv *priv = ieee80211_priv(dev);
-+
-+ if (priv->up == 1) return -1;
-+
-+ return _rtl8180_up(dev);
-+}
-+
-+
-+int rtl8180_close(struct net_device *dev)
-+{
-+ struct r8180_priv *priv = ieee80211_priv(dev);
-+ int ret;
-+
-+ if (priv->up == 0) return -1;
-+
-+ down(&priv->wx_sem);
-+
-+ //DMESG("rtl8187_close process");
-+ ret = rtl8180_down(dev);
-+#ifdef LED
-+ priv->ieee80211->ieee80211_led_contorl(dev,LED_CTL_POWER_OFF);
-+#endif
-+ up(&priv->wx_sem);
-+
-+ return ret;
-+
-+}
-+
-+int rtl8180_down(struct net_device *dev)
-+{
-+ struct r8180_priv *priv = ieee80211_priv(dev);
-+
-+ if (priv->up == 0) return -1;
-+
-+ priv->up=0;
-+
-+/* FIXME */
-+ if (!netif_queue_stopped(dev))
-+ netif_stop_queue(dev);
-+
-+ DMESG("rtl8180_down process");
-+ rtl8180_rtx_disable(dev);
-+ rtl8180_irq_disable(dev);
-+//by amy for rate adaptive
-+ del_timer_sync(&priv->rateadapter_timer);
-+ cancel_delayed_work(&priv->ieee80211->rate_adapter_wq);
-+//by amy for rate adaptive
-+ del_timer_sync(&priv->watch_dog_timer);
-+ cancel_delayed_work(&priv->ieee80211->watch_dog_wq);
-+ cancel_delayed_work(&priv->ieee80211->hw_dig_wq);
-+ cancel_delayed_work(&priv->ieee80211->tx_pw_wq);
-+
-+#ifdef SW_ANTE_DIVERSITY
-+ del_timer_sync(&priv->SwAntennaDiversityTimer);
-+ cancel_delayed_work(&priv->ieee80211->SwAntennaWorkItem);
-+#endif
-+
-+ ieee80211_softmac_stop_protocol(priv->ieee80211);
-+ MgntActSet_RF_State(dev, eRfOff, RF_CHANGE_BY_SW);
-+ //amy,081212
-+ memset(&(priv->ieee80211->current_network),0,sizeof(struct ieee80211_network));
-+ return 0;
-+}
-+
-+bool SetZebraRFPowerState8187B(struct net_device *dev,RT_RF_POWER_STATE eRFPowerState);
-+
-+void rtl8180_commit(struct net_device *dev)
-+{
-+ struct r8180_priv *priv = ieee80211_priv(dev);
-+ int i;
-+
-+ if (priv->up == 0) return ;
-+ printk("==========>%s()\n", __FUNCTION__);
-+
-+ /* FIXME */
-+ if (!netif_queue_stopped(dev))
-+ netif_stop_queue(dev);
-+
-+//by amy for rate adaptive
-+ del_timer_sync(&priv->rateadapter_timer);
-+ cancel_delayed_work(&priv->ieee80211->rate_adapter_wq);
-+//by amy for rate adaptive
-+ del_timer_sync(&priv->watch_dog_timer);
-+ cancel_delayed_work(&priv->ieee80211->watch_dog_wq);
-+ cancel_delayed_work(&priv->ieee80211->hw_dig_wq);
-+ cancel_delayed_work(&priv->ieee80211->tx_pw_wq);
-+
-+#ifdef SW_ANTE_DIVERSITY
-+ del_timer_sync(&priv->SwAntennaDiversityTimer);
-+ cancel_delayed_work(&priv->ieee80211->SwAntennaWorkItem);
-+#endif
-+ ieee80211_softmac_stop_protocol(priv->ieee80211);
-+
-+#if 0
-+ if(priv->ieee80211->bHwRadioOff == false){
-+ MgntActSet_RF_State(dev, eRfOff, RF_CHANGE_BY_HW);
-+ mdelay(10);
-+ MgntActSet_RF_State(dev, eRfOn, RF_CHANGE_BY_HW);
-+ }
-+#endif
-+
-+ rtl8180_irq_disable(dev);
-+ rtl8180_rtx_disable(dev);
-+
-+ //test pending bug, john 20070815
-+ //initialize tx_pending
-+ for(i=0;i<0x10;i++) atomic_set(&(priv->tx_pending[i]), 0);
-+
-+ _rtl8180_up(dev);
-+ priv->commit = 0;
-+}
-+
-+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20))
-+void rtl8180_restart(struct work_struct *work)
-+{
-+ struct r8180_priv *priv = container_of(work, struct r8180_priv, reset_wq);
-+ struct ieee80211_device* ieee = priv->ieee80211;//for commit crash
-+ struct net_device *dev = ieee->dev;//for commit crash
-+#else
-+void rtl8180_restart(struct net_device *dev)
-+{
-+
-+ struct r8180_priv *priv = ieee80211_priv(dev);
-+#endif
-+
-+ down(&priv->wx_sem);
-+
-+ rtl8180_commit(dev);
-+
-+ up(&priv->wx_sem);
-+}
-+
-+static void r8180_set_multicast(struct net_device *dev)
-+{
-+ struct r8180_priv *priv = ieee80211_priv(dev);
-+ short promisc;
-+
-+ //down(&priv->wx_sem);
-+
-+ /* FIXME FIXME */
-+
-+ promisc = (dev->flags & IFF_PROMISC) ? 1:0;
-+
-+ if (promisc != priv->promisc)
-+ // rtl8180_commit(dev);
-+
-+ priv->promisc = promisc;
-+
-+ //schedule_work(&priv->reset_wq);
-+ //up(&priv->wx_sem);
-+}
-+
-+
-+int r8180_set_mac_adr(struct net_device *dev, void *mac)
-+{
-+ struct r8180_priv *priv = ieee80211_priv(dev);
-+ struct sockaddr *addr = mac;
-+
-+ down(&priv->wx_sem);
-+
-+ memcpy(dev->dev_addr, addr->sa_data, ETH_ALEN);
-+
-+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0))
-+ schedule_work(&priv->reset_wq);
-+#else
-+ schedule_task(&priv->reset_wq);
-+#endif
-+ up(&priv->wx_sem);
-+
-+ return 0;
-+}
-+
-+struct ipw_param {
-+ u32 cmd;
-+ u8 sta_addr[ETH_ALEN];
-+ union {
-+ struct {
-+ u8 name;
-+ u32 value;
-+ } wpa_param;
-+ struct {
-+ u32 len;
-+ u8 reserved[32];
-+ u8 data[0];
-+ } wpa_ie;
-+ struct{
-+ u32 command;
-+ u32 reason_code;
-+ } mlme;
-+ struct {
-+ u8 alg[16];
-+ u8 set_tx;
-+ u32 err;
-+ u8 idx;
-+ u8 seq[8];
-+ u16 key_len;
-+ u8 key[0];
-+ } crypt;
-+
-+ } u;
-+};
-+
-+
-+/* based on ipw2200 driver */
-+int rtl8180_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
-+{
-+ struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
-+ struct iwreq *wrq = (struct iwreq *)rq;
-+ int ret=-1;
-+
-+#ifdef JOHN_TKIP
-+ u8 broadcast_addr[6] = {0xff,0xff,0xff,0xff,0xff,0xff};
-+
-+ struct ieee80211_device *ieee = priv->ieee80211;
-+ struct ipw_param *ipw = (struct ipw_param *)wrq->u.data.pointer;
-+ u32 key[4];
-+
-+#endif
-+
-+#ifdef _RTL8187_EXT_PATCH_
-+ if(priv->mshobj && (priv->ieee80211->iw_mode == priv->ieee80211->iw_ext_mode) && priv->mshobj->ext_patch_rtl8180_ioctl)
-+ {
-+ // DO NOT put the belowing function in critical section, due to it uses "spin lock"
-+ if((ret = priv->mshobj->ext_patch_rtl8180_ioctl(dev, rq, cmd)) != -EOPNOTSUPP)
-+ return ret;
-+ }
-+#endif
-+
-+ down(&priv->wx_sem);
-+
-+ switch (cmd) {
-+ case RTL_IOCTL_WPA_SUPPLICANT:
-+#ifdef JOHN_TKIP
-+
-+//the following code is specified for ipw driver in wpa_supplicant
-+ if( ((u32*)wrq->u.data.pointer)[0]==3 ){
-+
-+
-+ if( ((u32*)wrq->u.data.pointer)[7] &&
-+ ( ((u32*)wrq->u.data.pointer)[3]==0x504d4343 ||
-+ ((u32*)wrq->u.data.pointer)[3]==0x50494b54 )) {//50494b54 tkip and 504d4343 ccmp
-+
-+ //enable HW security of TKIP and CCMP
-+ write_nic_byte(dev, WPA_CONFIG, SCR_TxSecEnable | SCR_RxSecEnable );
-+
-+ //copy key from wpa_supplicant ioctl info
-+ key[0] = ((u32*)wrq->u.data.pointer)[12];
-+ key[1] = ((u32*)wrq->u.data.pointer)[13];
-+ key[2] = ((u32*)wrq->u.data.pointer)[14];
-+ key[3] = ((u32*)wrq->u.data.pointer)[15];
-+ switch (ieee->pairwise_key_type){
-+ case KEY_TYPE_TKIP:
-+ setKey( dev,
-+ 0, //EntryNo
-+ ipw->u.crypt.idx, //KeyIndex
-+ KEY_TYPE_TKIP, //KeyType
-+ (u8*)ieee->ap_mac_addr, //MacAddr
-+ 0, //DefaultKey
-+ key); //KeyContent
-+ break;
-+
-+ case KEY_TYPE_CCMP:
-+ setKey( dev,
-+ 0, //EntryNo
-+ ipw->u.crypt.idx, //KeyIndex
-+ KEY_TYPE_CCMP, //KeyType
-+ (u8*)ieee->ap_mac_addr, //MacAddr
-+ 0, //DefaultKey
-+ key); //KeyContent
-+ break
-+;
-+ default:
-+ printk("error on key_type: %d\n", ieee->pairwise_key_type);
-+ break;
-+ }
-+ }
-+
-+ //group key for broadcast
-+ if( ((u32*)wrq->u.data.pointer)[9] ) {
-+
-+ key[0] = ((u32*)wrq->u.data.pointer)[12];
-+ key[1] = ((u32*)wrq->u.data.pointer)[13];
-+ key[2] = ((u32*)wrq->u.data.pointer)[14];
-+ key[3] = ((u32*)wrq->u.data.pointer)[15];
-+
-+ if( ((u32*)wrq->u.data.pointer)[3]==0x50494b54 ){//50494b54 is the ASCII code of TKIP in reversed order
-+ setKey( dev,
-+ 1, //EntryNo
-+ ipw->u.crypt.idx,//KeyIndex
-+ KEY_TYPE_TKIP, //KeyType
-+ broadcast_addr, //MacAddr
-+ 0, //DefaultKey
-+ key); //KeyContent
-+ }
-+ else if( ((u32*)wrq->u.data.pointer)[3]==0x504d4343 ){//CCMP
-+ setKey( dev,
-+ 1, //EntryNo
-+ ipw->u.crypt.idx,//KeyIndex
-+ KEY_TYPE_CCMP, //KeyType
-+ broadcast_addr, //MacAddr
-+ 0, //DefaultKey
-+ key); //KeyContent
-+ }
-+ else if( ((u32*)wrq->u.data.pointer)[3]==0x656e6f6e ){//none
-+ //do nothing
-+ }
-+ else if( ((u32*)wrq->u.data.pointer)[3]==0x504557 ){//WEP
-+ setKey( dev,
-+ 1, //EntryNo
-+ ipw->u.crypt.idx,//KeyIndex
-+ KEY_TYPE_WEP40, //KeyType
-+ broadcast_addr, //MacAddr
-+ 0, //DefaultKey
-+ key); //KeyContent
-+ }
-+ else printk("undefine group key type: %8x\n", ((u32*)wrq->u.data.pointer)[3]);
-+ }
-+
-+ }
-+#endif /*JOHN_TKIP*/
-+
-+
-+#ifdef JOHN_HWSEC_DEBUG
-+ {
-+ int i;
-+ //john's test 0711
-+ printk("@@ wrq->u pointer = ");
-+ for(i=0;i<wrq->u.data.length;i++){
-+ if(i%10==0) printk("\n");
-+ printk( "%8x|", ((u32*)wrq->u.data.pointer)[i] );
-+ }
-+ printk("\n");
-+ }
-+#endif /*JOHN_HWSEC_DEBUG*/
-+ ret = ieee80211_wpa_supplicant_ioctl(priv->ieee80211, &wrq->u.data);
-+ break;
-+
-+ default:
-+ ret = -EOPNOTSUPP;
-+ break;
-+ }
-+
-+ up(&priv->wx_sem);
-+
-+ return ret;
-+}
-+
-+
-+struct tx_desc {
-+
-+#ifdef _LINUX_BYTEORDER_LITTLE_ENDIAN_H
-+
-+
-+//dword 0
-+unsigned int tpktsize:12;
-+unsigned int rsvd0:3;
-+unsigned int no_encrypt:1;
-+unsigned int splcp:1;
-+unsigned int morefrag:1;
-+unsigned int ctsen:1;
-+unsigned int rtsrate:4;
-+unsigned int rtsen:1;
-+unsigned int txrate:4;
-+unsigned int last:1;
-+unsigned int first:1;
-+unsigned int dmaok:1;
-+unsigned int own:1;
-+
-+//dword 1
-+unsigned short rtsdur;
-+unsigned short length:15;
-+unsigned short l_ext:1;
-+
-+//dword 2
-+unsigned int bufaddr;
-+
-+
-+//dword 3
-+unsigned short rxlen:12;
-+unsigned short rsvd1:3;
-+unsigned short miccal:1;
-+unsigned short dur;
-+
-+//dword 4
-+unsigned int nextdescaddr;
-+
-+//dword 5
-+unsigned char rtsagc;
-+unsigned char retrylimit;
-+unsigned short rtdb:1;
-+unsigned short noacm:1;
-+unsigned short pifs:1;
-+unsigned short rsvd2:4;
-+unsigned short rtsratefallback:4;
-+unsigned short ratefallback:5;
-+
-+//dword 6
-+unsigned short delaybound;
-+unsigned short rsvd3:4;
-+unsigned short agc:8;
-+unsigned short antenna:1;
-+unsigned short spc:2;
-+unsigned short rsvd4:1;
-+
-+//dword 7
-+unsigned char len_adjust:2;
-+unsigned char rsvd5:1;
-+unsigned char tpcdesen:1;
-+unsigned char tpcpolarity:2;
-+unsigned char tpcen:1;
-+unsigned char pten:1;
-+
-+unsigned char bckey:6;
-+unsigned char enbckey:1;
-+unsigned char enpmpd:1;
-+unsigned short fragqsz;
-+
-+
-+#else
-+
-+#error "please modify tx_desc to your own\n"
-+
-+#endif
-+
-+
-+} __attribute__((packed));
-+
-+struct rx_desc_rtl8187b {
-+
-+#ifdef _LINUX_BYTEORDER_LITTLE_ENDIAN_H
-+
-+//dword 0
-+unsigned int rxlen:12;
-+unsigned int icv:1;
-+unsigned int crc32:1;
-+unsigned int pwrmgt:1;
-+unsigned int res:1;
-+unsigned int bar:1;
-+unsigned int pam:1;
-+unsigned int mar:1;
-+unsigned int qos:1;
-+unsigned int rxrate:4;
-+unsigned int trsw:1;
-+unsigned int splcp:1;
-+unsigned int fovf:1;
-+unsigned int dmafail:1;
-+unsigned int last:1;
-+unsigned int first:1;
-+unsigned int eor:1;
-+unsigned int own:1;
-+
-+
-+//dword 1
-+unsigned int tsftl;
-+
-+
-+//dword 2
-+unsigned int tsfth;
-+
-+
-+//dword 3
-+unsigned char sq;
-+unsigned char rssi:7;
-+unsigned char antenna:1;
-+
-+unsigned char agc;
-+unsigned char decrypted:1;
-+unsigned char wakeup:1;
-+unsigned char shift:1;
-+unsigned char rsvd0:5;
-+
-+//dword 4
-+unsigned int num_mcsi:4;
-+unsigned int snr_long2end:6;
-+unsigned int cfo_bias:6;
-+
-+int pwdb_g12:8;
-+unsigned int fot:8;
-+
-+
-+
-+
-+#else
-+
-+#error "please modify tx_desc to your own\n"
-+
-+#endif
-+
-+}__attribute__((packed));
-+
-+
-+
-+struct rx_desc_rtl8187 {
-+
-+#ifdef _LINUX_BYTEORDER_LITTLE_ENDIAN_H
-+
-+//dword 0
-+unsigned int rxlen:12;
-+unsigned int icv:1;
-+unsigned int crc32:1;
-+unsigned int pwrmgt:1;
-+unsigned int res:1;
-+unsigned int bar:1;
-+unsigned int pam:1;
-+unsigned int mar:1;
-+unsigned int qos:1;
-+unsigned int rxrate:4;
-+unsigned int trsw:1;
-+unsigned int splcp:1;
-+unsigned int fovf:1;
-+unsigned int dmafail:1;
-+unsigned int last:1;
-+unsigned int first:1;
-+unsigned int eor:1;
-+unsigned int own:1;
-+
-+//dword 1
-+unsigned char sq;
-+unsigned char rssi:7;
-+unsigned char antenna:1;
-+
-+unsigned char agc;
-+unsigned char decrypted:1;
-+unsigned char wakeup:1;
-+unsigned char shift:1;
-+unsigned char rsvd0:5;
-+
-+//dword 2
-+unsigned int tsftl;
-+
-+//dword 3
-+unsigned int tsfth;
-+
-+
-+
-+#else
-+
-+#error "please modify tx_desc to your own\n"
-+
-+#endif
-+
-+
-+}__attribute__((packed));
-+
-+
-+
-+union rx_desc {
-+
-+struct rx_desc_rtl8187b desc_87b;
-+struct rx_desc_rtl8187 desc_87;
-+
-+}__attribute__((packed));
-+
-+//
-+// Description:
-+// Perform signal smoothing for dynamic mechanism.
-+// This is different with PerformSignalSmoothing8187 in smoothing fomula.
-+// No dramatic adjustion is apply because dynamic mechanism need some degree
-+// of correctness.
-+// 2007.01.23, by shien chang.
-+//
-+void PerformUndecoratedSignalSmoothing8187(struct net_device *dev, struct ieee80211_rx_stats *stats)
-+{
-+ struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
-+ bool bCckRate = rtl8180_IsWirelessBMode(rtl8180_rate2rate(stats->rate));
-+
-+ if(NIC_8187 == priv->card_8187) {
-+ if(priv->UndecoratedSmoothedSS >= 0) {
-+ priv->UndecoratedSmoothedSS = ((priv->UndecoratedSmoothedSS * 50) + (stats->signalstrength * 11)) / 60;
-+ }else{
-+ priv->UndecoratedSmoothedSS = stats->signalstrength;
-+ }
-+ } else {
-+ // Determin the current packet is CCK rate, by Bruce, 2007-04-12.
-+ priv->bCurCCKPkt = bCckRate;
-+
-+ // Tesing for SD3 DZ, by Bruce, 2007-04-11.
-+ if(priv->UndecoratedSmoothedSS >= 0) {
-+ priv->UndecoratedSmoothedSS = ((priv->UndecoratedSmoothedSS * 5) + (stats->signalstrength * 10)) / 6;
-+ }else{
-+ priv->UndecoratedSmoothedSS = stats->signalstrength * 10;
-+ }
-+
-+ //
-+ // Bacause the AGC parameter is not exactly correct under high power (AGC saturation), we need to record the RSSI value to be
-+ // referenced by DoRxHighPower. It is not necessary to record this value when this packet is sent by OFDM rate.
-+ // Advised by SD3 DZ, by Bruce, 2007-04-12.
-+ //
-+ if(bCckRate){
-+ priv->CurCCKRSSI = stats->signal;
-+ }else{
-+ priv->CurCCKRSSI = 0;
-+ }
-+ }
-+ //printk("Sommthing SignalSterngth (%d) => UndecoratedSmoothedSS (%d)\n", stats->signalstrength, priv->UndecoratedSmoothedSS);
-+}
-+
-+#ifdef THOMAS_SKB
-+void rtl8180_irq_rx_tasklet(struct r8180_priv *priv)
-+{
-+ int status,len,flen;
-+
-+#ifdef SW_ANTE_DIVERSITY
-+ u8 Antenna = 0;
-+#endif
-+ u32 SignalStrength = 0;
-+ u32 quality = 0;
-+ bool bCckRate = false;
-+ char RX_PWDB = 0;
-+ long RecvSignalPower=0;
-+ struct sk_buff *skb;
-+ struct sk_buff *skb2;//skb for check out of memory
-+ union rx_desc *desc;
-+ //struct urb *rx_urb = priv->rxurb_task;
-+ struct ieee80211_hdr *hdr;//by amy
-+ u16 fc,type;
-+ u8 bHwError=0,bCRC=0,bICV=0;
-+ long SignalStrengthIndex = 0;
-+ struct ieee80211_rx_stats stats = {
-+ .signal = 0,
-+ .noise = -98,
-+ .rate = 0,
-+ //.mac_time = jiffies,
-+ .freq = IEEE80211_24GHZ_BAND,
-+ };
-+
-+ int *prx_inx=&priv->rx_inx;
-+ struct urb *rx_urb=priv->rx_urb[*prx_inx]; //changed by jackson
-+ struct net_device *dev = (struct net_device*)rx_urb->context;
-+ //DMESG("=====>RX %x ",rx_urb->status);
-+
-+ skb = priv->pp_rxskb[*prx_inx];
-+ status = rx_urb->status;
-+ skb2 = dev_alloc_skb(RX_URB_SIZE);
-+
-+ if (skb2 == NULL){
-+ printk(KERN_ALERT "No Skb For RX!/n");
-+ //rx_urb->transfer_buffer = skb->data;
-+ //priv->pp_rxskb[*prx_inx] = skb;
-+ } else {
-+
-+ if(status == 0)
-+ {
-+ if(NIC_8187B == priv->card_8187)
-+ {
-+ stats.nic_type = NIC_8187B;
-+ len = rx_urb->actual_length;
-+ len -= sizeof (struct rx_desc_rtl8187b);
-+ desc = (union rx_desc *)(rx_urb->transfer_buffer + len);
-+ flen = desc->desc_87b.rxlen ;
-+
-+ if( flen <= rx_urb->actual_length){
-+#if 1
-+#ifdef SW_ANTE_DIVERSITY
-+ Antenna = desc->desc_87b.antenna;
-+#endif
-+ stats.mac_time[0] = desc->desc_87b.tsftl;
-+ stats.mac_time[1] = desc->desc_87b.tsfth;
-+
-+ stats.signal = desc->desc_87b.rssi;
-+ //stats.noise = desc->desc_87b.sq;
-+ quality = desc->desc_87b.sq;
-+ stats.rate = desc->desc_87b.rxrate;
-+ bCckRate = rtl8180_IsWirelessBMode(rtl8180_rate2rate(stats.rate));
-+
-+ if(!bCckRate) { // OFDM rate.
-+ if(desc->desc_87b.pwdb_g12 < -106)
-+ SignalStrength = 0;
-+ else
-+ SignalStrength = desc->desc_87b.pwdb_g12 + 106;
-+ RX_PWDB = (desc->desc_87b.pwdb_g12)/2 -42;
-+ } else { // CCK rate.
-+ if(desc->desc_87b.agc> 174)
-+ SignalStrength = 0;
-+ else
-+ SignalStrength = 174 - desc->desc_87b.agc;
-+ RX_PWDB = ((desc->desc_87b.agc)/2)*(-1) - 8;
-+ }
-+
-+ //lzm mod 081028 based on windows driver
-+ //compensate SignalStrength when switch TR to SW controled
-+ if(priv->TrSwitchState == TR_SW_TX) {
-+ SignalStrength = SignalStrength + 54;
-+ RX_PWDB = RX_PWDB + 27;
-+ }
-+
-+ if(SignalStrength > 100)
-+ SignalStrength = 100;
-+ SignalStrength = (SignalStrength * 70) / 100 + 30;
-+
-+ if(SignalStrength > 50)
-+ SignalStrength = SignalStrength + 10;
-+ if(SignalStrength > 100)
-+ SignalStrength = 100;
-+
-+ RecvSignalPower = RX_PWDB;
-+ //printk("SignalStrength = %d \n",SignalStrength);
-+ bHwError = (desc->desc_87b.fovf | desc->desc_87b.icv | desc->desc_87b.crc32);
-+ bCRC = desc->desc_87b.crc32;
-+ bICV = desc->desc_87b.icv;
-+ priv->wstats.qual.level = (u8)SignalStrength;
-+
-+ if(!bCckRate){
-+ if (quality > 127)
-+ quality = 0;
-+ else if (quality <27)
-+ quality = 100;
-+ else
-+ quality = 127 - quality;
-+ } else {
-+ if(quality > 64)
-+ quality = 0;
-+ else
-+ quality = ((64-quality)*100)/64;
-+ }
-+
-+
-+ priv ->wstats.qual.qual = quality;
-+ priv->wstats.qual.noise = 100 - priv ->wstats.qual.qual;
-+
-+ stats.signalstrength = (u8)SignalStrength;
-+ stats.signal = (u8)quality;
-+ stats.noise = desc->desc_87b.snr_long2end;
-+
-+ skb_put(skb,flen-4);
-+
-+ priv->stats.rxok++;
-+ //by amy
-+ hdr = (struct ieee80211_hdr *)skb->data;
-+ fc = le16_to_cpu(hdr->frame_ctl);
-+ type = WLAN_FC_GET_TYPE(fc);
-+
-+ if((IEEE80211_FTYPE_CTL != type) &&
-+ (eqMacAddr(priv->ieee80211->current_network.bssid, (fc & IEEE80211_FCTL_TODS)? hdr->addr1 : (fc & IEEE80211_FCTL_FROMDS )? hdr->addr2 : hdr->addr3)) && (!bHwError) && (!bCRC)&& (!bICV))
-+ {
-+ // Perform signal smoothing for dynamic mechanism on demand.
-+ // This is different with PerformSignalSmoothing8187 in smoothing fomula.
-+ // No dramatic adjustion is apply because dynamic mechanism need some degree
-+ // of correctness. 2007.01.23, by shien chang.
-+ PerformUndecoratedSignalSmoothing8187(dev, &stats);
-+
-+ //Update signal strength and realted into private RxStats for UI query.
-+ SignalStrengthIndex = NetgearSignalStrengthTranslate(priv->LastSignalStrengthInPercent, priv->wstats.qual.level);
-+ priv->LastSignalStrengthInPercent = SignalStrengthIndex;
-+ priv->SignalStrength = TranslateToDbm8187((u8)SignalStrengthIndex);
-+ priv->SignalQuality = (priv->SignalQuality*5+quality+5)/6;
-+ priv->RecvSignalPower = (priv->RecvSignalPower * 5 + RecvSignalPower - 1) / 6;
-+#ifdef SW_ANTE_DIVERSITY
-+ priv->LastRxPktAntenna = Antenna ? 1:0;
-+ SwAntennaDiversityRxOk8185(dev, SignalStrength);
-+#endif
-+ }
-+ //by amy
-+#endif
-+ if(!ieee80211_rx(priv->ieee80211,skb, &stats)) {
-+ dev_kfree_skb_any(skb);
-+ }
-+ }else {
-+ priv->stats.rxurberr++;
-+ printk("URB Error flen:%d actual_length:%d\n", flen , rx_urb->actual_length);
-+ dev_kfree_skb_any(skb);
-+ }
-+ } else {
-+ stats.nic_type = NIC_8187;
-+ len = rx_urb->actual_length;
-+ len -= sizeof (struct rx_desc_rtl8187);
-+ desc = (union rx_desc *)(rx_urb->transfer_buffer + len);
-+ flen = desc->desc_87.rxlen ;
-+
-+ if(flen <= rx_urb->actual_length){
-+ stats.signal = desc->desc_87.rssi;
-+ stats.noise = desc->desc_87.sq;
-+ stats.rate = desc->desc_87.rxrate;
-+ stats.mac_time[0] = desc->desc_87.tsftl;
-+ stats.mac_time[1] = desc->desc_87.tsfth;
-+ SignalStrength = (desc->desc_87.agc&0xfe) >> 1;
-+ if( ((stats.rate <= 22) && (stats.rate != 12) && (stats.rate != 18)) || (stats.rate == 44) )//need to translate to real rate here
-+ bCckRate= TRUE;
-+ if (!bCckRate)
-+ {
-+ if (SignalStrength > 90) SignalStrength = 90;
-+ else if (SignalStrength < 25) SignalStrength = 25;
-+ SignalStrength = ((90 - SignalStrength)*100)/65;
-+ }
-+ else
-+ {
-+ if (SignalStrength >95) SignalStrength = 95;
-+ else if (SignalStrength < 30) SignalStrength = 30;
-+ SignalStrength = ((95 - SignalStrength)*100)/65;
-+ }
-+ stats.signalstrength = (u8)SignalStrength;
-+
-+ skb_put(skb,flen-4);
-+
-+ priv->stats.rxok++;
-+
-+ if(!ieee80211_rx(priv->ieee80211,skb, &stats))
-+ dev_kfree_skb_any(skb);
-+
-+
-+ }else {
-+ priv->stats.rxurberr++;
-+ printk("URB Error flen:%d actual_length:%d\n", flen , rx_urb->actual_length);
-+ dev_kfree_skb_any(skb);
-+ }
-+ }
-+ }else{
-+
-+ //printk("RX Status Error!\n");
-+ priv->stats.rxstaterr++;
-+ priv->ieee80211->stats.rx_errors++;
-+ dev_kfree_skb_any(skb);
-+
-+ }
-+
-+ rx_urb->transfer_buffer = skb2->data;
-+
-+ priv->pp_rxskb[*prx_inx] = skb2;
-+ }
-+
-+ if(status != -ENOENT ){
-+ rtl8187_rx_urbsubmit(dev,rx_urb);
-+ } else {
-+ priv->pp_rxskb[*prx_inx] = NULL;
-+ dev_kfree_skb_any(skb2);
-+ //printk("RX process %d aborted due to explicit shutdown (%x)(%d)\n ", *prx_inx, status, status);
-+ }
-+
-+ if (*prx_inx == (MAX_RX_URB -1))
-+ *prx_inx = 0;
-+ else
-+ *prx_inx = *prx_inx + 1;
-+}
-+#endif
-+
-+#ifdef THOMAS_TASKLET
-+void rtl8180_irq_rx_tasklet_new(struct r8180_priv *priv){
-+ unsigned long flags;
-+ while( atomic_read( &priv->irt_counter ) ){
-+ spin_lock_irqsave(&priv->irq_lock,flags);//added by thomas
-+ rtl8180_irq_rx_tasklet(priv);
-+ spin_unlock_irqrestore(&priv->irq_lock,flags);//added by thomas
-+ if(atomic_read(&priv->irt_counter) >= 1)
-+ atomic_dec( &priv->irt_counter );
-+ }
-+}
-+#endif
-+/****************************************************************************
-+ ---------------------------- USB_STUFF---------------------------
-+*****************************************************************************/
-+
-+static const struct net_device_ops rtl8187_netdev_ops = {
-+ .ndo_open = rtl8180_open,
-+ .ndo_stop = rtl8180_close,
-+ .ndo_tx_timeout = tx_timeout,
-+ .ndo_do_ioctl = rtl8180_ioctl,
-+ .ndo_set_multicast_list = r8180_set_multicast,
-+ .ndo_set_mac_address = r8180_set_mac_adr,
-+ .ndo_validate_addr = eth_validate_addr,
-+ .ndo_change_mtu = eth_change_mtu,
-+ .ndo_start_xmit = ieee80211_xmit,
-+ .ndo_get_stats = rtl8180_stats,
-+};
-+
-+#if LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0)
-+static int __devinit rtl8187_usb_probe(struct usb_interface *intf,
-+ const struct usb_device_id *id)
-+#else
-+static void * __devinit rtl8187_usb_probe(struct usb_device *udev,
-+ unsigned int ifnum,
-+ const struct usb_device_id *id)
-+#endif
-+{
-+ struct net_device *dev = NULL;
-+ struct r8180_priv *priv= NULL;
-+
-+
-+#if LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0)
-+ struct usb_device *udev = interface_to_usbdev(intf);
-+#endif
-+
-+ dev = alloc_ieee80211(sizeof(struct r8180_priv));
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24)
-+ SET_MODULE_OWNER(dev);
-+#endif
-+
-+#if LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0)
-+ usb_set_intfdata(intf, dev);
-+ SET_NETDEV_DEV(dev, &intf->dev);
-+#endif
-+ priv = ieee80211_priv(dev);
-+#if LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0)
-+ priv->ieee80211 = netdev_priv(dev);
-+#else
-+ priv->ieee80211 = (struct net_device *)dev->priv;
-+#endif
-+ priv->udev=udev;
-+#ifdef CPU_64BIT
-+ priv->usb_buf = kmalloc(0x200, GFP_KERNEL);
-+ priv->usb_pool = dma_pool_create("rtl8187b", NULL, 64, 64, 0);
-+#endif
-+//lzm add for write time out test
-+#ifdef DEBUG_RW_REGISTER
-+ {
-+ int reg_index = 0;
-+ for(reg_index = 0; reg_index <= 199; reg_index++)
-+ {
-+ priv->write_read_registers[reg_index].address = 0;
-+ priv->write_read_registers[reg_index].content = 0;
-+ priv->write_read_registers[reg_index].flag = 0;
-+ }
-+ priv->write_read_register_index = 0;
-+ }
-+#endif
-+ //init netdev_ops, added by falcon....
-+ dev->netdev_ops = &rtl8187_netdev_ops;
-+
-+ dev->wireless_handlers = &r8180_wx_handlers_def;
-+#if WIRELESS_EXT >= 12
-+#if WIRELESS_EXT < 17
-+ dev->get_wireless_stats = r8180_get_wireless_stats;
-+#endif
-+ dev->wireless_handlers = (struct iw_handler_def *) &r8180_wx_handlers_def;
-+#endif
-+
-+ dev->type=ARPHRD_ETHER;
-+ dev->watchdog_timeo = HZ*3; //modified by john, 0805
-+
-+ if (dev_alloc_name(dev, ifname) < 0){
-+ DMESG("Oops: devname already taken! Trying wlan%%d...\n");
-+ ifname = "wlan%d";
-+ dev_alloc_name(dev, ifname);
-+ }
-+
-+ if(rtl8180_init(dev)!=0){
-+ DMESG("Initialization failed");
-+ goto fail;
-+ }
-+
-+ netif_carrier_off(dev);
-+ netif_stop_queue(dev);
-+
-+ register_netdev(dev);
-+
-+ rtl8180_proc_init_one(dev);
-+
-+//by lizhaoming for Radio power on/off
-+#ifdef POLLING_METHOD_FOR_RADIO
-+ if(priv->polling_timer_on == 0){//add for S3/S4
-+ gpio_change_polling((unsigned long)dev);
-+ }
-+#endif
-+
-+ DMESG("Driver probe completed");
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
-+ return dev;
-+#else
-+ return 0;
-+#endif
-+
-+
-+fail:
-+ free_ieee80211(dev);
-+
-+ DMESG("wlan driver load failed\n");
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
-+ return NULL;
-+#else
-+ return -ENODEV;
-+#endif
-+
-+}
-+
-+#if LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0)
-+static void __devexit rtl8187_usb_disconnect(struct usb_interface *intf)
-+#else
-+static void __devexit rtl8187_usb_disconnect(struct usb_device *udev, void *ptr)
-+#endif
-+{
-+ struct r8180_priv *priv = NULL;
-+#if LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0)
-+ struct net_device *dev = usb_get_intfdata(intf);
-+#else
-+ struct net_device *dev = (struct net_device *)ptr;
-+#endif
-+ if(dev){
-+ unregister_netdev(dev);
-+
-+ priv=ieee80211_priv(dev);
-+
-+//add for RF power on power off by lizhaoming 080512
-+#ifdef POLLING_METHOD_FOR_RADIO
-+ del_timer_sync(&priv->gpio_polling_timer);
-+ cancel_delayed_work(&priv->ieee80211->GPIOChangeRFWorkItem);
-+ priv->polling_timer_on = 0;//add for S3/S4
-+#endif
-+ MgntActSet_RF_State(dev, eRfOff, RF_CHANGE_BY_SW);
-+
-+#ifdef _RTL8187_EXT_PATCH_
-+ if(priv && priv->mshobj)
-+ {
-+ if(priv->mshobj->ext_patch_remove_proc)
-+ priv->mshobj->ext_patch_remove_proc(priv);
-+ priv->ieee80211->ext_patch_ieee80211_start_protocol = 0;
-+ priv->ieee80211->ext_patch_ieee80211_stop_protocol = 0;
-+ priv->ieee80211->ext_patch_ieee80211_probe_req_1 = 0;
-+ priv->ieee80211->ext_patch_ieee80211_probe_req_2 = 0;
-+ priv->ieee80211->ext_patch_ieee80211_association_req_1 = 0;
-+ priv->ieee80211->ext_patch_ieee80211_association_req_2 = 0;
-+ priv->ieee80211->ext_patch_ieee80211_assoc_resp_by_net_1 = 0;
-+ priv->ieee80211->ext_patch_ieee80211_assoc_resp_by_net_2 = 0;
-+ priv->ieee80211->ext_patch_ieee80211_rx_frame_softmac_on_auth =0;
-+ priv->ieee80211->ext_patch_ieee80211_rx_frame_softmac_on_deauth =0;
-+ priv->ieee80211->ext_patch_ieee80211_rx_frame_softmac_on_assoc_req = 0;
-+ priv->ieee80211->ext_patch_ieee80211_rx_frame_softmac_on_assoc_rsp = 0;
-+ priv->ieee80211->ext_patch_ieee80211_ext_stop_scan_wq_set_channel = 0;
-+ priv->ieee80211->ext_patch_ieee80211_process_probe_response_1 = 0;
-+ priv->ieee80211->ext_patch_ieee80211_rx_mgt_on_probe_req = 0;
-+ priv->ieee80211->ext_patch_ieee80211_rx_mgt_update_expire = 0;
-+ priv->ieee80211->ext_patch_ieee80211_rx_on_rx = 0;
-+ priv->ieee80211->ext_patch_get_beacon_get_probersp = 0;
-+ priv->ieee80211->ext_patch_ieee80211_xmit = 0;
-+ priv->ieee80211->ext_patch_ieee80211_rx_frame_get_hdrlen = 0;
-+ priv->ieee80211->ext_patch_ieee80211_rx_is_valid_framectl = 0;
-+ priv->ieee80211->ext_patch_ieee80211_rx_process_dataframe = 0;
-+ // priv->ieee80211->ext_patch_is_duplicate_packet = 0;
-+ priv->ieee80211->ext_patch_ieee80211_softmac_xmit_get_rate = 0;
-+ free_mshobj(&priv->mshobj);
-+ }
-+#endif // _RTL8187_EXT_PATCH_
-+
-+ rtl8180_proc_remove_one(dev);
-+
-+ rtl8180_down(dev);
-+ priv->rf_close(dev);
-+
-+ //rtl8180_rtx_disable(dev);
-+ rtl8187_usb_deleteendpoints(dev);
-+#ifdef LED
-+ DeInitSwLeds(dev);
-+#endif
-+ rtl8180_irq_disable(dev);
-+ rtl8180_reset(dev);
-+ mdelay(10);
-+
-+ }
-+
-+#ifdef CPU_64BIT
-+ if(priv->usb_buf)
-+ kfree(priv->usb_buf);
-+ if(priv->usb_pool) {
-+ dma_pool_destroy(priv->usb_pool);
-+ priv->usb_pool = NULL;
-+ }
-+#endif
-+ free_ieee80211(dev);
-+ DMESG("wlan driver removed");
-+}
-+
-+/* fun with the built-in ieee80211 stack... */
-+extern int ieee80211_crypto_init(void);
-+extern void ieee80211_crypto_deinit(void);
-+extern int ieee80211_crypto_tkip_init(void);
-+extern void ieee80211_crypto_tkip_exit(void);
-+extern int ieee80211_crypto_ccmp_init(void);
-+extern void ieee80211_crypto_ccmp_exit(void);
-+extern int ieee80211_crypto_wep_init(void);
-+extern void ieee80211_crypto_wep_exit(void);
-+
-+static int __init rtl8187_usb_module_init(void)
-+{
-+ int ret;
-+
-+ ret = ieee80211_crypto_init();
-+ if (ret) {
-+ printk(KERN_ERR "ieee80211_crypto_init() failed %d\n", ret);
-+ return ret;
-+ }
-+ ret = ieee80211_crypto_tkip_init();
-+ if (ret) {
-+ printk(KERN_ERR "ieee80211_crypto_tkip_init() failed %d\n", ret);
-+ return ret;
-+ }
-+ ret = ieee80211_crypto_ccmp_init();
-+ if (ret) {
-+ printk(KERN_ERR "ieee80211_crypto_ccmp_init() failed %d\n", ret);
-+ return ret;
-+ }
-+ ret = ieee80211_crypto_wep_init();
-+ if (ret) {
-+ printk(KERN_ERR "ieee80211_crypto_wep_init() failed %d\n", ret);
-+ return ret;
-+ }
-+
-+ printk("\nLinux kernel driver for RTL8187/RTL8187B based WLAN cards\n");
-+ printk("Copyright (c) 2004-2008, Realsil Wlan\n");
-+ DMESG("Initializing module");
-+ DMESG("Wireless extensions version %d", WIRELESS_EXT);
-+ rtl8180_proc_module_init();
-+ return usb_register(&rtl8187_usb_driver);
-+}
-+
-+
-+static void __exit rtl8187_usb_module_exit(void)
-+{
-+ usb_deregister(&rtl8187_usb_driver);
-+ rtl8180_proc_module_remove();
-+ ieee80211_crypto_tkip_exit();
-+ ieee80211_crypto_ccmp_exit();
-+ ieee80211_crypto_wep_exit();
-+ ieee80211_crypto_deinit();
-+
-+ DMESG("Exiting\n");
-+}
-+
-+
-+void rtl8180_try_wake_queue(struct net_device *dev, int pri)
-+{
-+ unsigned long flags;
-+ short enough_desc;
-+ struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
-+
-+ spin_lock_irqsave(&priv->tx_lock,flags);
-+ enough_desc = check_nic_enought_desc(dev,pri);
-+ spin_unlock_irqrestore(&priv->tx_lock,flags);
-+
-+ if(enough_desc)
-+ ieee80211_wake_queue(priv->ieee80211);
-+}
-+
-+#ifdef JOHN_HWSEC
-+void EnableHWSecurityConfig8187(struct net_device *dev)
-+{
-+ u8 SECR_value = 0x0;
-+ SECR_value = SCR_TxSecEnable | SCR_RxSecEnable;
-+ {
-+ write_nic_byte(dev, WPA_CONFIG, 0x7);//SECR_value | SCR_UseDK );
-+ }
-+}
-+
-+void setKey(struct net_device *dev,
-+ u8 EntryNo,
-+ u8 KeyIndex,
-+ u16 KeyType,
-+ u8 *MacAddr,
-+ u8 DefaultKey,
-+ u32 *KeyContent )
-+{
-+ u32 TargetCommand = 0;
-+ u32 TargetContent = 0;
-+ u16 usConfig = 0;
-+ int i;
-+ usConfig |= BIT15 | (KeyType<<2) | (DefaultKey<<5) | KeyIndex;
-+
-+
-+ for(i=0 ; i<6 ; i++){
-+ TargetCommand = i+6*EntryNo;
-+ TargetCommand |= BIT31|BIT16;
-+
-+ if(i==0){//MAC|Config
-+ TargetContent = (u32)(*(MacAddr+0)) << 16|
-+ (u32)(*(MacAddr+1)) << 24|
-+ (u32)usConfig;
-+
-+ write_nic_dword(dev, WCAMI, TargetContent);
-+ write_nic_dword(dev, RWCAM, TargetCommand);
-+ //printk("setkey cam =%8x\n", read_cam(dev, i+6*EntryNo));
-+ } else if(i==1){//MAC
-+ TargetContent = (u32)(*(MacAddr+2)) |
-+ (u32)(*(MacAddr+3)) << 8|
-+ (u32)(*(MacAddr+4)) << 16|
-+ (u32)(*(MacAddr+5)) << 24;
-+ write_nic_dword(dev, WCAMI, TargetContent);
-+ write_nic_dword(dev, RWCAM, TargetCommand);
-+ } else { //Key Material
-+ write_nic_dword(dev, WCAMI, (u32)(*(KeyContent+i-2)) );
-+ write_nic_dword(dev, RWCAM, TargetCommand);
-+ }
-+ }
-+
-+}
-+#endif
-+
-+/****************************************************************************
-+ --------------------------- RF power on/power off -----------------
-+*****************************************************************************/
-+
-+#ifdef POLLING_METHOD_FOR_RADIO
-+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20))
-+void GPIOChangeRFWorkItemCallBack(struct work_struct *work)
-+{
-+ //struct delayed_work *dwork = container_of(work, struct delayed_work, work);
-+ struct ieee80211_device *ieee = container_of(work, struct ieee80211_device, GPIOChangeRFWorkItem.work);
-+ struct net_device *dev = ieee->dev;
-+ struct r8180_priv *priv = ieee80211_priv(dev);
-+#else
-+void GPIOChangeRFWorkItemCallBack(struct ieee80211_device *ieee)
-+{
-+ struct net_device *dev = ieee->dev;
-+ struct r8180_priv *priv = ieee80211_priv(dev);
-+#endif
-+
-+ //u16 tmp2byte;
-+ u8 tmp1byte;
-+ //u8 btPSR;
-+ //u8 btConfig0;
-+ RT_RF_POWER_STATE eRfPowerStateToSet;
-+ bool bActuallySet=false;
-+
-+ char *argv[3];
-+ static char *RadioPowerPath = "/etc/acpi/events/RadioPower.sh";
-+ static char *envp[] = {"HOME=/", "TERM=linux", "PATH=/usr/bin:/bin", NULL};
-+
-+#if 0
-+ if(priv->up == 0)//driver stopped
-+ {
-+ printk("\nDo nothing...");
-+ goto out;
-+ }
-+ else
-+#endif
-+ {
-+ // We should turn off LED before polling FF51[4].
-+
-+ //Turn off LED.
-+ //btPSR = read_nic_byte(dev, PSR);
-+ //write_nic_byte(dev, PSR, (btPSR & ~BIT3));
-+
-+ //It need to delay 4us suggested by Jong, 2008-01-16
-+ //udelay(4);
-+
-+ //HW radio On/Off according to the value of FF51[4](config0)
-+ //btConfig0 = btPSR = read_nic_byte(dev, CONFIG0);
-+
-+ //Turn on LED.
-+ //write_nic_byte(dev, PSR, btPSR| BIT3);
-+
-+ //eRfPowerStateToSet = (btConfig0 & BIT4) ? eRfOn : eRfOff;
-+
-+ // Get RF power state to set.
-+ //if Driver isn't stopped, we poll GPIO1
-+
-+ //set 0x91 B1= 0 // 1: for output enable; 0: otherwise.
-+ // (William says) Note that, it will cause unstable if we set output enable 1 but not to write it. Annie, 2005-12-12.
-+ tmp1byte = read_nic_byte(dev,GPE);
-+ if(priv->EEPROMSelectNewGPIO == true)
-+ tmp1byte &= ~BIT2;//for toshiba new GPIO use bit2
-+ else
-+ tmp1byte &= ~BIT1;
-+
-+ write_nic_byte(dev,GPE,tmp1byte);
-+
-+ //read 0x92 B1(read GPIO1)
-+ tmp1byte = read_nic_byte(dev,GPI);
-+
-+ //turn on or trun off RF according to the value of GPIO1
-+ if(priv->EEPROMSelectNewGPIO == true)
-+ eRfPowerStateToSet = (tmp1byte&BIT2) ? eRfOn : eRfOff;
-+ else
-+ eRfPowerStateToSet = (tmp1byte&BIT1) ? eRfOn : eRfOff;
-+
-+ if((priv->ieee80211->bHwRadioOff == true) && (eRfPowerStateToSet == eRfOn)){
-+ priv->ieee80211->bHwRadioOff = false;
-+ bActuallySet = true;
-+ }else if((priv->ieee80211->bHwRadioOff == false) && (eRfPowerStateToSet == eRfOff)){
-+ priv->ieee80211->bHwRadioOff = true;
-+ bActuallySet = true;
-+ }
-+
-+ //if(priv->wlan_first_up_flag1 == 0){
-+ // bActuallySet = true;
-+ // priv->wlan_first_up_flag1 = 1;
-+ //}
-+
-+ if(bActuallySet)
-+ {
-+ //printk("GPIO1:%x,eRfPowerStateToSet: %x, bHwRadioOff:%x\n",
-+ // tmp1byte,eRfPowerStateToSet,priv->ieee80211->bHwRadioOff);
-+
-+ //GPIO Polling Methord Made Radio On/Off
-+ DMESG("GPIO Polling Methord Will Turn Radio %s",
-+ (priv->ieee80211->bHwRadioOff == true) ? "Off" : "On");
-+
-+#ifdef LED //by lizhaoming
-+ if(priv->ieee80211->bHwRadioOff == true){
-+ priv->ieee80211->ieee80211_led_contorl(dev,LED_CTL_POWER_OFF);
-+ }else{
-+ if(priv->up == 1){
-+ priv->ieee80211->ieee80211_led_contorl(dev,LED_CTL_POWER_ON);
-+ }
-+ }
-+#endif
-+
-+ MgntActSet_RF_State(dev, eRfPowerStateToSet, RF_CHANGE_BY_HW);
-+
-+ /* To update the UI status for Power status changed */
-+ if(priv->ieee80211->bHwRadioOff == true)
-+ argv[1] = "RFOFF";
-+ else{
-+ //if(priv->eInactivePowerState != eRfOff)
-+ argv[1] = "RFON";
-+ //else
-+ // argv[1] = "RFOFF";
-+ }
-+ argv[0] = RadioPowerPath;
-+ argv[2] = NULL;
-+
-+ call_usermodehelper(RadioPowerPath,argv,envp,1);
-+ }
-+
-+ }
-+}
-+void gpio_change_polling(unsigned long data)
-+{
-+ struct r8180_priv* priv = ieee80211_priv((struct net_device *)data);
-+ //struct net_device* dev = (struct net_device*)data;
-+
-+ priv->polling_timer_on = 1;//add for S3/S4
-+
-+ if(priv->driver_upping == 0){
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)
-+ queue_delayed_work(priv->ieee80211->wq,&priv->ieee80211->GPIOChangeRFWorkItem,0);
-+#else
-+ queue_work(priv->ieee80211->wq,&priv->ieee80211->GPIOChangeRFWorkItem);
-+#endif
-+ }
-+
-+ mod_timer(&priv->gpio_polling_timer, jiffies + MSECS(IEEE80211_WATCH_DOG_TIME));
-+}
-+#endif
-+
-+/***************************************************************************
-+ ------------------- module init / exit stubs ----------------
-+****************************************************************************/
-+module_init(rtl8187_usb_module_init);
-+module_exit(rtl8187_usb_module_exit);
-diff -Nur linux-2.6.30.5.orig/drivers/net/wireless/rtl8187b/r8187.h linux-2.6.30.5/drivers/net/wireless/rtl8187b/r8187.h
---- linux-2.6.30.5.orig/drivers/net/wireless/rtl8187b/r8187.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.30.5/drivers/net/wireless/rtl8187b/r8187.h 2009-08-23 19:01:04.000000000 +0200
-@@ -0,0 +1,816 @@
-+/*
-+ This is part of rtl8187 OpenSource driver.
-+ Copyright (C) Andrea Merello 2004-2005 <andreamrl@tiscali.it>
-+ Released under the terms of GPL (General Public Licence)
-+
-+ Parts of this driver are based on the GPL part of the
-+ official realtek driver
-+
-+ Parts of this driver are based on the rtl8180 driver skeleton
-+ from Patric Schenke & Andres Salomon
-+
-+ Parts of this driver are based on the Intel Pro Wireless 2100 GPL driver
-+
-+ We want to tanks the Authors of those projects and the Ndiswrapper
-+ project Authors.
-+*/
-+
-+#ifndef R8180H
-+#define R8180H
-+
-+
-+#define RTL8187_MODULE_NAME "rtl8187"
-+#define DMESG(x,a...) printk(KERN_INFO RTL8187_MODULE_NAME ": " x "\n", ## a)
-+#define DMESGW(x,a...) printk(KERN_WARNING RTL8187_MODULE_NAME ": WW:" x "\n", ## a)
-+#define DMESGE(x,a...) printk(KERN_WARNING RTL8187_MODULE_NAME ": EE:" x "\n", ## a)
-+
-+#include <linux/module.h>
-+#include <linux/kernel.h>
-+//#include <linux/config.h>
-+#include <linux/init.h>
-+#include <linux/ioport.h>
-+#include <linux/sched.h>
-+#include <linux/types.h>
-+#include <linux/slab.h>
-+#include <linux/netdevice.h>
-+//#include <linux/pci.h>
-+#include <linux/usb.h>
-+#include <linux/etherdevice.h>
-+#include <linux/delay.h>
-+#include <linux/rtnetlink.h> //for rtnl_lock()
-+#include <linux/wireless.h>
-+#include <linux/timer.h>
-+#include <linux/proc_fs.h> // Necessary because we use the proc fs
-+#include <linux/if_arp.h>
-+#include <linux/random.h>
-+#include <linux/version.h>
-+#include <asm/io.h>
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,27)
-+#include <asm/semaphore.h>
-+#endif
-+#include "ieee80211/ieee80211.h"
-+#ifdef _RTL8187_EXT_PATCH_
-+#include "msh_class.h"
-+#endif
-+#ifdef LED
-+#include "r8187_led.h"
-+#endif
-+
-+//added for HW security, john.0629
-+#define FALSE 0
-+#define TRUE 1
-+#define MAX_KEY_LEN 61
-+#define KEY_BUF_SIZE 5
-+
-+#define BIT0 0x00000001
-+#define BIT1 0x00000002
-+#define BIT2 0x00000004
-+#define BIT3 0x00000008
-+#define BIT4 0x00000010
-+#define BIT5 0x00000020
-+#define BIT6 0x00000040
-+#define BIT7 0x00000080
-+#define BIT8 0x00000100
-+#define BIT9 0x00000200
-+#define BIT10 0x00000400
-+#define BIT11 0x00000800
-+#define BIT12 0x00001000
-+#define BIT13 0x00002000
-+#define BIT14 0x00004000
-+#define BIT15 0x00008000
-+#define BIT16 0x00010000
-+#define BIT17 0x00020000
-+#define BIT18 0x00040000
-+#define BIT19 0x00080000
-+#define BIT20 0x00100000
-+#define BIT21 0x00200000
-+#define BIT22 0x00400000
-+#define BIT23 0x00800000
-+#define BIT24 0x01000000
-+#define BIT25 0x02000000
-+#define BIT26 0x04000000
-+#define BIT27 0x08000000
-+#define BIT28 0x10000000
-+#define BIT29 0x20000000
-+#define BIT30 0x40000000
-+#define BIT31 0x80000000
-+
-+//8187B Security
-+#define RWCAM 0xA0 // Software read/write CAM config
-+#define WCAMI 0xA4 // Software write CAM input content
-+#define RCAMO 0xA8 // Output value from CAM according to 0xa0 setting
-+#define DCAM 0xAC // Debug CAM Interface
-+#define SECR 0xB0 // Security configuration register
-+#define AESMSK_FC 0xB2 // AES Mask register for frame control (0xB2~0xB3). Added by Annie, 2006-03-06.
-+#define AESMSK_SC 0x1FC // AES Mask for Sequence Control (0x1FC~0X1FD). Added by Annie, 2006-03-06.
-+#define AESMSK_QC 0x1CE // AES Mask register for QoS Control when computing AES MIC, default = 0x000F. (2 bytes)
-+
-+#define AESMSK_FC_DEFAULT 0xC78F // default value of AES MASK for Frame Control Field. (2 bytes)
-+#define AESMSK_SC_DEFAULT 0x000F // default value of AES MASK for Sequence Control Field. (2 bytes)
-+#define AESMSK_QC_DEFAULT 0x000F // default value of AES MASK for QoS Control Field. (2 bytes)
-+
-+#define CAM_CONTENT_COUNT 6
-+#define CFG_DEFAULT_KEY BIT5
-+#define CFG_VALID BIT15
-+
-+//----------------------------------------------------------------------------
-+// 8187B WPA Config Register (offset 0xb0, 1 byte)
-+//----------------------------------------------------------------------------
-+#define SCR_UseDK 0x01
-+#define SCR_TxSecEnable 0x02
-+#define SCR_RxSecEnable 0x04
-+
-+//----------------------------------------------------------------------------
-+// 8187B CAM Config Setting (offset 0xb0, 1 byte)
-+//----------------------------------------------------------------------------
-+#define CAM_VALID 0x8000
-+#define CAM_NOTVALID 0x0000
-+#define CAM_USEDK 0x0020
-+
-+
-+#define CAM_NONE 0x0
-+#define CAM_WEP40 0x01
-+#define CAM_TKIP 0x02
-+#define CAM_AES 0x04
-+#define CAM_WEP104 0x05
-+
-+
-+//#define CAM_SIZE 16
-+#define TOTAL_CAM_ENTRY 16
-+#define CAM_ENTRY_LEN_IN_DW 6 // 6, unit: in u4byte. Added by Annie, 2006-05-25.
-+#define CAM_ENTRY_LEN_IN_BYTE (CAM_ENTRY_LEN_IN_DW*sizeof(u4Byte)) // 24, unit: in u1byte. Added by Annie, 2006-05-25.
-+
-+#define CAM_CONFIG_USEDK 1
-+#define CAM_CONFIG_NO_USEDK 0
-+
-+#define CAM_WRITE 0x00010000
-+#define CAM_READ 0x00000000
-+#define CAM_POLLINIG 0x80000000
-+
-+//=================================================================
-+//=================================================================
-+
-+#define EPROM_93c46 0
-+#define EPROM_93c56 1
-+
-+#define DEFAULT_FRAG_THRESHOLD 2342U
-+#define MIN_FRAG_THRESHOLD 256U
-+#define DEFAULT_BEACONINTERVAL 0x64U
-+#define DEFAULT_BEACON_ESSID "Rtl8187"
-+
-+#define DEFAULT_SSID ""
-+#define DEFAULT_RETRY_RTS 7
-+#define DEFAULT_RETRY_DATA 7
-+#define PRISM_HDR_SIZE 64
-+
-+typedef enum _WIRELESS_MODE {
-+ WIRELESS_MODE_UNKNOWN = 0x00,
-+ WIRELESS_MODE_A = 0x01,
-+ WIRELESS_MODE_B = 0x02,
-+ WIRELESS_MODE_G = 0x04,
-+ WIRELESS_MODE_AUTO = 0x08,
-+} WIRELESS_MODE;
-+
-+typedef enum _TR_SWITCH_STATE{
-+ TR_HW_CONTROLLED = 0,
-+ TR_SW_TX = 1,
-+}TR_SWITCH_STATE, *PTR_SWITCH_STATE;
-+
-+
-+#define RTL_IOCTL_WPA_SUPPLICANT SIOCIWFIRSTPRIV+30
-+
-+typedef struct buffer
-+{
-+ struct buffer *next;
-+ u32 *buf;
-+
-+} buffer;
-+
-+typedef struct rtl_reg_debug{
-+ unsigned int cmd;
-+ struct {
-+ unsigned char type;
-+ unsigned char addr;
-+ unsigned char page;
-+ unsigned char length;
-+ } head;
-+ unsigned char buf[0xff];
-+}rtl_reg_debug;
-+typedef struct _CHANNEL_LIST{
-+ u8 Channel[MAX_CHANNEL_NUMBER + 1];
-+ u8 Len;
-+}CHANNEL_LIST, *PCHANNEL_LIST;
-+
-+#define MAX_LD_SLOT_NUM 10
-+#define DEFAULT_SLOT_NUM 2
-+#define KEEP_ALIVE_INTERVAL 20 // in seconds.
-+#define CHECK_FOR_HANG_PERIOD 2 //be equal to watchdog check time
-+#define DEFAULT_KEEP_ALIVE_LEVEL 1
-+
-+typedef struct _link_detect_t
-+{
-+ u32 RxFrameNum[MAX_LD_SLOT_NUM]; // number of Rx Frame / CheckForHang_period to determine link status
-+ u16 SlotNum; // number of CheckForHang period to determine link status, default is 2
-+ u16 SlotIndex;
-+
-+ u32 NumTxOkInPeriod; //number of packet transmitted during CheckForHang
-+ u32 NumRxOkInPeriod; //number of packet received during CheckForHang
-+
-+ u8 IdleCount; // (KEEP_ALIVE_INTERVAL / CHECK_FOR_HANG_PERIOD)
-+ u32 LastNumTxUnicast;
-+ u32 LastNumRxUnicast;
-+
-+ bool bBusyTraffic; //when it is set to 1, UI cann't scan at will.
-+}link_detect_t, *plink_detect_t;
-+
-+#if 0
-+
-+typedef struct tx_pendingbuf
-+{
-+ struct ieee80211_txb *txb;
-+ short ispending;
-+ short descfrag;
-+} tx_pendigbuf;
-+
-+#endif
-+
-+typedef struct Stats
-+{
-+ unsigned long txrdu;
-+// unsigned long rxrdu;
-+ //unsigned long rxnolast;
-+ //unsigned long rxnodata;
-+// unsigned long rxreset;
-+// unsigned long rxwrkaround;
-+// unsigned long rxnopointer;
-+ unsigned long rxok;
-+ unsigned long rxurberr;
-+ unsigned long rxstaterr;
-+ unsigned long txnperr;
-+ unsigned long txnpdrop;
-+ unsigned long txresumed;
-+// unsigned long rxerr;
-+// unsigned long rxoverflow;
-+// unsigned long rxint;
-+ unsigned long txnpokint;
-+// unsigned long txhpokint;
-+// unsigned long txhperr;
-+// unsigned long ints;
-+// unsigned long shints;
-+ unsigned long txoverflow;
-+// unsigned long rxdmafail;
-+// unsigned long txbeacon;
-+// unsigned long txbeaconerr;
-+ unsigned long txlpokint;
-+ unsigned long txlpdrop;
-+ unsigned long txlperr;
-+ unsigned long txbeokint;
-+ unsigned long txbedrop;
-+ unsigned long txbeerr;
-+ unsigned long txbkokint;
-+ unsigned long txbkdrop;
-+ unsigned long txbkerr;
-+ unsigned long txviokint;
-+ unsigned long txvidrop;
-+ unsigned long txvierr;
-+ unsigned long txvookint;
-+ unsigned long txvodrop;
-+ unsigned long txvoerr;
-+ unsigned long txbeaconokint;
-+ unsigned long txbeacondrop;
-+ unsigned long txbeaconerr;
-+ unsigned long txmanageokint;
-+ unsigned long txmanagedrop;
-+ unsigned long txmanageerr;
-+ unsigned long txdatapkt;
-+} Stats;
-+
-+typedef struct ChnlAccessSetting {
-+ u16 SIFS_Timer;
-+ u16 DIFS_Timer;
-+ u16 SlotTimeTimer;
-+ u16 EIFS_Timer;
-+ u16 CWminIndex;
-+ u16 CWmaxIndex;
-+}*PCHANNEL_ACCESS_SETTING,CHANNEL_ACCESS_SETTING;
-+
-+
-+typedef enum _RT_RF_POWER_STATE
-+{
-+ eRfOn,
-+ eRfSleep,
-+ eRfOff
-+}RT_RF_POWER_STATE;
-+typedef enum _RT_PS_MODE
-+{
-+ eActive, // Active/Continuous access.
-+ eMaxPs, // Max power save mode.
-+ eFastPs // Fast power save mode.
-+}RT_PS_MODE;
-+//
-+// Three wire mode.
-+//
-+#define IC_DEFAULT_THREE_WIRE 0
-+#define SW_THREE_WIRE 1
-+//RTL818xB
-+#define SW_THREE_WIRE_BY_8051 2
-+#define HW_THREE_WIRE 3
-+#define HW_THREE_WIRE_BY_8051 4
-+//lzm add for write time out test
-+typedef struct write_read_register
-+{
-+ u32 address;
-+ u32 content;
-+ u32 flag;
-+} write_read_register;
-+//lzm add for write time out test
-+typedef struct r8180_priv
-+{
-+//lzm add for write time out test
-+ struct write_read_register write_read_registers[200];
-+ u8 write_read_register_index;
-+//lzm add for write time out test
-+
-+ struct usb_device *udev;
-+ short epromtype;
-+ int irq;
-+ struct ieee80211_device *ieee80211;
-+
-+ short card_8187; /* O: rtl8180, 1:rtl8185 V B/C, 2:rtl8185 V D */
-+ short card_8187_Bversion; /* if TCR reports card V B/C this discriminates */
-+ short phy_ver; /* meaningful for rtl8225 1:A 2:B 3:C */
-+ short enable_gpio0;
-+ enum card_type {PCI,MINIPCI,CARDBUS,USB/*rtl8187*/}card_type;
-+ short hw_plcp_len;
-+ short plcp_preamble_mode;
-+
-+ spinlock_t irq_lock;
-+// spinlock_t irq_th_lock;
-+ spinlock_t tx_lock;
-+//by amy for ps
-+ spinlock_t rf_ps_lock;
-+//by amy for ps
-+
-+ u16 irq_mask;
-+// short irq_enabled;
-+ struct net_device *dev;
-+ short chan;
-+ short sens;
-+ short max_sens;
-+ u8 chtxpwr[15]; //channels from 1 to 14, 0 not used
-+ u8 chtxpwr_ofdm[15]; //channels from 1 to 14, 0 not used
-+ u8 cck_txpwr_base;
-+ u8 ofdm_txpwr_base;
-+ u8 challow[15]; //channels from 1 to 14, 0 not used
-+ short up;
-+ short crcmon; //if 1 allow bad crc frame reception in monitor mode
-+// short prism_hdr;
-+
-+// struct timer_list scan_timer;
-+ /*short scanpending;
-+ short stopscan;*/
-+// spinlock_t scan_lock;
-+// u8 active_probe;
-+ //u8 active_scan_num;
-+ struct semaphore wx_sem;
-+ struct semaphore set_chan_sem;
-+// short hw_wep;
-+
-+// short digphy;
-+// short antb;
-+// short diversity;
-+// u8 cs_treshold;
-+// short rcr_csense;
-+ short rf_chip;
-+// u32 key0[4];
-+ short (*rf_set_sens)(struct net_device *dev,short sens);
-+ void (*rf_set_chan)(struct net_device *dev,short ch);
-+ void (*rf_close)(struct net_device *dev);
-+ void (*rf_init)(struct net_device *dev);
-+ //short rate;
-+ short promisc;
-+ /*stats*/
-+ struct Stats stats;
-+ struct _link_detect_t link_detect; //added on 1016.2008
-+ struct iw_statistics wstats;
-+ struct proc_dir_entry *dir_dev;
-+
-+ /*RX stuff*/
-+// u32 *rxring;
-+// u32 *rxringtail;
-+// dma_addr_t rxringdma;
-+ struct urb **rx_urb;
-+#ifdef THOMAS_BEACON
-+ unsigned long *oldaddr; //lzm for 64bit CPU crash
-+#endif
-+
-+#ifdef THOMAS_TASKLET
-+ atomic_t irt_counter;//count for irq_rx_tasklet
-+#endif
-+#ifdef JACKSON_NEW_RX
-+ struct sk_buff **pp_rxskb;
-+ int rx_inx;
-+#endif
-+
-+ short tx_urb_index;
-+
-+ //struct buffer *rxbuffer;
-+ //struct buffer *rxbufferhead;
-+ //int rxringcount;
-+ //u16 rxbuffersize;
-+
-+ //struct sk_buff *rx_skb;
-+
-+ //short rx_skb_complete;
-+
-+ //u32 rx_prevlen;
-+ //atomic_t tx_lp_pending;
-+ //atomic_t tx_np_pending;
-+ atomic_t tx_pending[0x10];//UART_PRIORITY+1
-+
-+#if 0
-+ /*TX stuff*/
-+ u32 *txlpring;
-+ u32 *txhpring;
-+ u32 *txnpring;
-+ dma_addr_t txlpringdma;
-+ dma_addr_t txhpringdma;
-+ dma_addr_t txnpringdma;
-+ u32 *txlpringtail;
-+ u32 *txhpringtail;
-+ u32 *txnpringtail;
-+ u32 *txlpringhead;
-+ u32 *txhpringhead;
-+ u32 *txnpringhead;
-+ struct buffer *txlpbufs;
-+ struct buffer *txhpbufs;
-+ struct buffer *txnpbufs;
-+ struct buffer *txlpbufstail;
-+ struct buffer *txhpbufstail;
-+ struct buffer *txnpbufstail;
-+ int txringcount;
-+ int txbuffsize;
-+
-+ //struct tx_pendingbuf txnp_pending;
-+ struct tasklet_struct irq_tx_tasklet;
-+#endif
-+ struct tasklet_struct irq_rx_tasklet;
-+ struct urb *rxurb_task;
-+// u8 dma_poll_mask;
-+ //short tx_suspend;
-+
-+ /* adhoc/master mode stuff */
-+#if 0
-+ u32 *txbeacontail;
-+ dma_addr_t txbeaconringdma;
-+ u32 *txbeaconring;
-+ int txbeaconcount;
-+#endif
-+// struct ieee_tx_beacon *beacon_buf;
-+ //char *master_essid;
-+// dma_addr_t beacondmabuf;
-+ //u16 master_beaconinterval;
-+// u32 master_beaconsize;
-+ //u16 beacon_interval;
-+
-+ //2 Tx Related variables
-+ u16 ShortRetryLimit;
-+ u16 LongRetryLimit;
-+ u32 TransmitConfig;
-+ u8 RegCWinMin; // For turbo mode CW adaptive. Added by Annie, 2005-10-27.
-+
-+ //2 Rx Related variables
-+ u16 EarlyRxThreshold;
-+ u32 ReceiveConfig;
-+ u8 AcmControl;
-+
-+ u8 RFProgType;
-+
-+ u8 retry_data;
-+ u8 retry_rts;
-+ u16 rts;
-+
-+//by amy
-+ long LastSignalStrengthInPercent;
-+ long SignalStrength;
-+ long SignalQuality;
-+ u8 antenna_flag;
-+ bool flag_beacon;
-+//by amy
-+//by amy for rate adaptive
-+ struct timer_list rateadapter_timer;
-+ u16 LastRetryCnt;
-+ u16 LastRetryRate;
-+ unsigned long LastTxokCnt;
-+ unsigned long LastRxokCnt;
-+ u16 CurrRetryCnt;
-+ long RecvSignalPower;
-+ unsigned long LastTxOKBytes;
-+ u8 LastFailTxRate;
-+ long LastFailTxRateSS;
-+ u8 FailTxRateCount;
-+ u32 LastTxThroughput;
-+ unsigned long txokbytestotal;
-+ //for up rate
-+ unsigned short bTryuping;
-+ u8 CurrTxRate; //the rate before up
-+ u16 CurrRetryRate;
-+ u16 TryupingCount;
-+ u8 TryDownCountLowData;
-+ u8 TryupingCountNoData;
-+
-+ u8 CurrentOperaRate;
-+// by lizhaoming used for Radio on/off
-+#ifdef POLLING_METHOD_FOR_RADIO
-+ struct timer_list gpio_polling_timer;
-+ u8 polling_timer_on;
-+ u8 wlan_first_up_flag1;
-+#endif
-+//by amy for rate adaptive
-+//by amy for power save
-+ struct timer_list watch_dog_timer;
-+ bool bInactivePs;
-+ bool bSwRfProcessing;
-+ RT_RF_POWER_STATE eInactivePowerState;
-+ RT_RF_POWER_STATE eRFPowerState;
-+ u32 RfOffReason;
-+ bool RFChangeInProgress;
-+ bool bInHctTest;
-+ bool SetRFPowerStateInProgress;
-+ //u8 RFProgType;
-+ bool bLeisurePs;
-+ RT_PS_MODE dot11PowerSaveMode;
-+ u32 NumRxOkInPeriod;
-+ u32 NumTxOkInPeriod;
-+ u8 RegThreeWireMode;
-+ bool ps_mode;
-+//by amy for power save
-+//by amy for DIG
-+ bool bDigMechanism;
-+ bool bCCKThMechanism;
-+ u8 InitialGain;
-+ u8 StageCCKTh;
-+ u8 RegBModeGainStage;
-+ u8 RegDigOfdmFaUpTh; //added by david, 2008.3.6
-+ u8 DIG_NumberFallbackVote;
-+ u8 DIG_NumberUpgradeVote;
-+ u16 CCKUpperTh;
-+ u16 CCKLowerTh;
-+ u32 FalseAlarmRegValue; //added by david, 2008.3.6
-+//by amy for DIG
-+//{ added by david for high power, 2008.3.11
-+ int UndecoratedSmoothedSS;
-+ bool bRegHighPowerMechanism;
-+ bool bToUpdateTxPwr;
-+ u8 Z2HiPwrUpperTh;
-+ u8 Z2HiPwrLowerTh;
-+ u8 Z2RSSIHiPwrUpperTh;
-+ u8 Z2RSSIHiPwrLowerTh;
-+ // Current CCK RSSI value to determine CCK high power, asked by SD3 DZ, by Bruce, 2007-04-12.
-+ u8 CurCCKRSSI;
-+ bool bCurCCKPkt;
-+ u32 wMacRegRfPinsOutput;
-+ u32 wMacRegRfPinsSelect;
-+ TR_SWITCH_STATE TrSwitchState;
-+//}
-+//{added by david for radio on/off
-+ u8 radion;
-+//}
-+ struct ChnlAccessSetting ChannelAccessSetting;
-+#if LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0)
-+ struct work_struct reset_wq;
-+#else
-+ struct tq_struct reset_wq;
-+#endif
-+
-+#ifdef _RTL8187_EXT_PATCH_
-+ struct mshclass *mshobj;
-+#endif
-+
-+#ifdef LED
-+ /* add for led controll */
-+ u8 EEPROMCustomerID;
-+ RT_CID_TYPE CustomerID;
-+ LED_8187 Gpio0Led;
-+ LED_8187 SwLed0;
-+ LED_8187 SwLed1;
-+ u8 bEnableLedCtrl;
-+ LED_STRATEGY_8187 LedStrategy;
-+ u8 PsrValue;
-+ struct work_struct Gpio0LedWorkItem;
-+ struct work_struct SwLed0WorkItem;
-+ struct work_struct SwLed1WorkItem;
-+#endif
-+ u8 driver_upping;
-+#ifdef CPU_64BIT
-+ u8 *usb_buf;
-+ struct dma_pool *usb_pool;
-+#endif
-+
-+
-+#ifdef SW_ANTE_DIVERSITY
-+
-+//#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)
-+// struct delayed_work SwAntennaWorkItem;
-+//#else
-+// struct work_struct SwAntennaWorkItem;
-+//#endif
-+
-+ bool bAntennaDiversityTimerIssued;
-+ short antb;
-+ short diversity;
-+ bool AutoloadFailFlag;
-+ u16 EEPROMVersion;
-+ u8 EEPROMAntennaDiversity;
-+ u16 EEPROMCSThreshold;
-+ u8 EEPROMDefaultAntennaB;
-+ u8 EEPROMDigitalPhy;
-+ u32 EEPROMCSMethod;
-+ u8 EEPROMGEPRFOffState;
-+ // For HW antenna diversity, added by Roger, 2008.01.30.
-+ u32 AdMainAntennaRxOkCnt; // Main antenna Rx OK count.
-+ u32 AdAuxAntennaRxOkCnt; // Aux antenna Rx OK count.
-+ bool bHWAdSwitched; // TRUE if we has switched default antenna by HW evaluation.
-+ u8 EEPROMSwAntennaDiversity;
-+ bool EEPROMDefaultAntenna1;
-+ u8 RegSwAntennaDiversityMechanism;// 0:default from EEPROM, 1: disable, 2: enable.
-+ bool bSwAntennaDiverity;
-+ u8 RegDefaultAntenna;// 0: default from EEPROM, 1: main, 2: aux. Added by Roger, 2007.11.05.
-+ bool bDefaultAntenna1;
-+ //long SignalStrength;
-+ long Stats_SignalStrength;
-+ //long LastSignalStrengthInPercent; // In percentange, used for smoothing, e.g. Moving Average.
-+ //long SignalQuality; // in 0-100 index.
-+ long Stats_SignalQuality;
-+ //long RecvSignalPower; // in dBm.
-+ long Stats_RecvSignalPower;
-+ u8 LastRxPktAntenna; // +by amy 080312 Antenn which received the lasted packet. 0: Aux, 1:Main. Added by Roger, 2008.01.25.
-+ u32 AdRxOkCnt;
-+ long AdRxSignalStrength; // Rx signal strength for Antenna Diversity, which had been smoothing, its valid range is [0,100].
-+ u8 CurrAntennaIndex; // Index to current Antenna (both Tx and Rx).
-+ u8 AdTickCount; // Times of SwAntennaDiversityTimer happened.
-+ u8 AdCheckPeriod; // # of period SwAntennaDiversityTimer to check Rx signal strength for SW Antenna Diversity.
-+ u8 AdMinCheckPeriod; // Min value of AdCheckPeriod.
-+ u8 AdMaxCheckPeriod; // Max value of AdCheckPeriod.
-+ long AdRxSsThreshold; // Signal strength threshold to switch antenna.
-+ long AdMaxRxSsThreshold; // Max value of AdRxSsThreshold.
-+ bool bAdSwitchedChecking; // TRUE if we shall shall check Rx signal strength for last time switching antenna.
-+ long AdRxSsBeforeSwitched; // Rx signal strength before we swithed antenna.
-+ struct timer_list SwAntennaDiversityTimer;
-+#endif
-+ u8 commit;
-+
-+//#ifdef ENABLE_DOT11D
-+ u8 channel_plan;
-+//#endif
-+ u8 EEPROMSelectNewGPIO;
-+}r8180_priv;
-+
-+// for rtl8187
-+// now mirging to rtl8187B
-+/*
-+typedef enum{
-+ LOW_PRIORITY = 0x02,
-+ NORM_PRIORITY
-+ } priority_t;
-+*/
-+//for rtl8187B
-+typedef enum{
-+ BULK_PRIORITY = 0x01,
-+ //RSVD0,
-+ //RSVD1,
-+ LOW_PRIORITY,
-+ NORM_PRIORITY,
-+ VO_PRIORITY,
-+ VI_PRIORITY, //0x05
-+ BE_PRIORITY,
-+ BK_PRIORITY,
-+ RSVD2,
-+ RSVD3,
-+ BEACON_PRIORITY, //0x0A
-+ HIGH_PRIORITY,
-+ MANAGE_PRIORITY,
-+ RSVD4,
-+ RSVD5,
-+ UART_PRIORITY //0x0F
-+} priority_t;
-+
-+typedef enum{
-+ NIC_8187 = 1,
-+ NIC_8187B
-+ } nic_t;
-+
-+
-+typedef u32 AC_CODING;
-+#define AC0_BE 0 // ACI: 0x00 // Best Effort
-+#define AC1_BK 1 // ACI: 0x01 // Background
-+#define AC2_VI 2 // ACI: 0x10 // Video
-+#define AC3_VO 3 // ACI: 0x11 // Voice
-+#define AC_MAX 4 // Max: define total number; Should not to be used as a real enum.
-+
-+//
-+// ECWmin/ECWmax field.
-+// Ref: WMM spec 2.2.2: WME Parameter Element, p.13.
-+//
-+typedef union _ECW{
-+ u8 charData;
-+ struct
-+ {
-+ u8 ECWmin:4;
-+ u8 ECWmax:4;
-+ }f; // Field
-+}ECW, *PECW;
-+
-+//
-+// ACI/AIFSN Field.
-+// Ref: WMM spec 2.2.2: WME Parameter Element, p.12.
-+//
-+typedef union _ACI_AIFSN{
-+ u8 charData;
-+
-+ struct
-+ {
-+ u8 AIFSN:4;
-+ u8 ACM:1;
-+ u8 ACI:2;
-+ u8 Reserved:1;
-+ }f; // Field
-+}ACI_AIFSN, *PACI_AIFSN;
-+
-+//
-+// AC Parameters Record Format.
-+// Ref: WMM spec 2.2.2: WME Parameter Element, p.12.
-+//
-+typedef union _AC_PARAM{
-+ u32 longData;
-+ u8 charData[4];
-+
-+ struct
-+ {
-+ ACI_AIFSN AciAifsn;
-+ ECW Ecw;
-+ u16 TXOPLimit;
-+ }f; // Field
-+}AC_PARAM, *PAC_PARAM;
-+
-+#ifdef JOHN_HWSEC
-+struct ssid_thread {
-+ struct net_device *dev;
-+ u8 name[IW_ESSID_MAX_SIZE + 1];
-+};
-+#endif
-+
-+short rtl8180_tx(struct net_device *dev,u32* skbuf, int len,priority_t priority,short morefrag,short rate);
-+
-+#ifdef JOHN_TKIP
-+u32 read_cam(struct net_device *dev, u8 addr);
-+void write_cam(struct net_device *dev, u8 addr, u32 data);
-+#endif
-+u8 read_nic_byte(struct net_device *dev, int x);
-+u8 read_nic_byte_E(struct net_device *dev, int x);
-+u32 read_nic_dword(struct net_device *dev, int x);
-+u16 read_nic_word(struct net_device *dev, int x) ;
-+void write_nic_byte(struct net_device *dev, int x,u8 y);
-+void write_nic_byte_E(struct net_device *dev, int x,u8 y);
-+void write_nic_word(struct net_device *dev, int x,u16 y);
-+void write_nic_dword(struct net_device *dev, int x,u32 y);
-+void force_pci_posting(struct net_device *dev);
-+
-+void rtl8180_rtx_disable(struct net_device *);
-+void rtl8180_rx_enable(struct net_device *);
-+void rtl8180_tx_enable(struct net_device *);
-+
-+void rtl8180_disassociate(struct net_device *dev);
-+//void fix_rx_fifo(struct net_device *dev);
-+void rtl8185_set_rf_pins_enable(struct net_device *dev,u32 a);
-+
-+void rtl8180_set_anaparam(struct net_device *dev,u32 a);
-+void rtl8185_set_anaparam2(struct net_device *dev,u32 a);
-+void rtl8180_update_msr(struct net_device *dev);
-+int rtl8180_down(struct net_device *dev);
-+int rtl8180_up(struct net_device *dev);
-+void rtl8180_commit(struct net_device *dev);
-+void rtl8180_set_chan(struct net_device *dev,short ch);
-+void write_phy(struct net_device *dev, u8 adr, u8 data);
-+void write_phy_cck(struct net_device *dev, u8 adr, u32 data);
-+void write_phy_ofdm(struct net_device *dev, u8 adr, u32 data);
-+void rtl8185_tx_antenna(struct net_device *dev, u8 ant);
-+void rtl8187_set_rxconf(struct net_device *dev);
-+bool MgntActSet_RF_State(struct net_device *dev,RT_RF_POWER_STATE StateToSet,u32 ChangeSource);
-+void IPSEnter(struct net_device *dev);
-+void IPSLeave(struct net_device *dev);
-+#ifdef POLLING_METHOD_FOR_RADIO
-+void gpio_change_polling(unsigned long data);
-+#endif
-+bool SetRFPowerState(struct net_device *dev,RT_RF_POWER_STATE eRFPowerState);
-+void rtl8180_patch_ieee80211_wx_sync_scan_wq(struct ieee80211_device *ieee);
-+#ifdef _RTL8187_EXT_PATCH_
-+extern int r8180_wx_set_channel(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra);
-+#endif
-+#ifdef JOHN_TKIP
-+void EnableHWSecurityConfig8187(struct net_device *dev);
-+void setKey(struct net_device *dev, u8 EntryNo, u8 KeyIndex, u16 KeyType, u8 *MacAddr, u8 DefaultKey, u32 *KeyContent );
-+
-+#endif
-+
-+#endif
-diff -Nur linux-2.6.30.5.orig/drivers/net/wireless/rtl8187b/r8187_led.c linux-2.6.30.5/drivers/net/wireless/rtl8187b/r8187_led.c
---- linux-2.6.30.5.orig/drivers/net/wireless/rtl8187b/r8187_led.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.30.5/drivers/net/wireless/rtl8187b/r8187_led.c 2009-08-23 19:01:04.000000000 +0200
-@@ -0,0 +1,1629 @@
-+/*++
-+Copyright (c) Realtek Semiconductor Corp. All rights reserved.
-+
-+Module Name:
-+ r8187_led.c
-+
-+Abstract:
-+ RTL8187 LED control functions
-+
-+Major Change History:
-+ When Who What
-+ ---------- --------------- -------------------------------
-+ 2006-09-07 Xiong Created
-+
-+Notes:
-+
-+--*/
-+
-+/*--------------------------Include File------------------------------------*/
-+#include "ieee80211/ieee80211.h"
-+#include "r8180_hw.h"
-+#include "r8187.h"
-+#include "r8180_93cx6.h"
-+#include "r8187_led.h"
-+
-+/**
-+*
-+* Initialization function for Sw Leds controll.
-+*
-+* \param dev The net device for this driver.
-+* \return void.
-+*
-+* Note:
-+*
-+*/
-+
-+void
-+InitSwLeds(
-+ struct net_device *dev
-+ )
-+{
-+
-+ struct r8180_priv *priv = ieee80211_priv(dev);
-+ u16 usValue;
-+// printk("========>%s()\n", __FUNCTION__);
-+
-+// priv->CustomerID = RT_CID_87B_DELL; //by lizhaoming for DELL 2008.6.3
-+ priv->CustomerID = RT_CID_DEFAULT; //just set to default now
-+ priv->bEnableLedCtrl = 1;
-+ priv->PsrValue = read_nic_byte(dev, PSR);
-+ usValue = eprom_read(dev, EEPROM_SW_REVD_OFFSET >> 1);
-+ priv->EEPROMCustomerID = (u8)( usValue & EEPROM_CID_MASK );
-+ DMESG("EEPROM Customer ID: %02X", priv->EEPROMCustomerID);
-+
-+ if(priv->CustomerID == RT_CID_DEFAULT)
-+ { // If we have not yet change priv->CustomerID in register,
-+ // we initialzie it from that of EEPROM with proper translation, 2006.07.03, by rcnjko.
-+ switch(priv->EEPROMCustomerID)
-+ {
-+ case EEPROM_CID_RSVD0:
-+ case EEPROM_CID_RSVD1:
-+ priv->CustomerID = RT_CID_DEFAULT;
-+ break;
-+
-+ case EEPROM_CID_ALPHA0:
-+ priv->CustomerID = RT_CID_8187_ALPHA0;
-+ break;
-+
-+ case EEPROM_CID_SERCOMM_PS:
-+ priv->CustomerID = RT_CID_8187_SERCOMM_PS;
-+ break;
-+
-+ case EEPROM_CID_HW_LED:
-+ priv->CustomerID = RT_CID_8187_HW_LED;
-+ break;
-+
-+ case EEPROM_CID_QMI:
-+ priv->CustomerID = RT_CID_87B_QMI;
-+ break;
-+
-+ case EEPROM_CID_DELL:
-+ priv->CustomerID = RT_CID_87B_DELL;
-+ break;
-+
-+ default:
-+ // Invalid value, so, we use default value instead.
-+ priv->CustomerID = RT_CID_DEFAULT;
-+ break;
-+ }
-+ }
-+ switch(priv->CustomerID)
-+ {
-+ case RT_CID_DEFAULT:
-+ priv->LedStrategy = SW_LED_MODE0;
-+ break;
-+
-+ case RT_CID_8187_ALPHA0:
-+ priv->LedStrategy = SW_LED_MODE1;
-+ break;
-+
-+ case RT_CID_8187_SERCOMM_PS:
-+ priv->LedStrategy = SW_LED_MODE3;
-+ break;
-+
-+ case RT_CID_87B_QMI:
-+ priv->LedStrategy = SW_LED_MODE4;
-+ break;
-+
-+ case RT_CID_87B_DELL:
-+ priv->LedStrategy = SW_LED_MODE5;
-+ break;
-+
-+ case RT_CID_8187_HW_LED:
-+ priv->LedStrategy = HW_LED;
-+ break;
-+
-+ default:
-+ priv->LedStrategy = SW_LED_MODE0;
-+ break;
-+ }
-+
-+ InitLed8187(dev,
-+ &(priv->Gpio0Led),
-+ LED_PIN_GPIO0,
-+ Gpio0LedBlinkTimerCallback);
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20)
-+ INIT_WORK(&priv->Gpio0LedWorkItem,
-+ (void(*)(void*))Gpio0LedWorkItemCallback, dev);
-+
-+ InitLed8187(dev,
-+ &(priv->SwLed0),
-+ LED_PIN_LED0,
-+ SwLed0BlinkTimerCallback);
-+ INIT_WORK(&priv->SwLed0WorkItem,
-+ (void(*)(void*))SwLed0WorkItemCallback, dev);
-+
-+ InitLed8187(dev,
-+ &(priv->SwLed1),
-+ LED_PIN_LED1,
-+ SwLed1BlinkTimerCallback);
-+ INIT_WORK(&priv->SwLed1WorkItem,
-+ (void(*)(void*))SwLed1WorkItemCallback, dev);
-+#else
-+INIT_WORK(&priv->Gpio0LedWorkItem,
-+ Gpio0LedWorkItemCallback);
-+
-+ InitLed8187(dev,
-+ &(priv->SwLed0),
-+ LED_PIN_LED0,
-+ SwLed0BlinkTimerCallback);
-+ INIT_WORK(&priv->SwLed0WorkItem,
-+ SwLed0WorkItemCallback);
-+
-+ InitLed8187(dev,
-+ &(priv->SwLed1),
-+ LED_PIN_LED1,
-+ SwLed1BlinkTimerCallback);
-+ INIT_WORK(&priv->SwLed1WorkItem,
-+ SwLed1WorkItemCallback);
-+#endif
-+}
-+
-+void
-+DeInitSwLeds(
-+ struct net_device *dev
-+ )
-+{
-+ struct r8180_priv *priv = ieee80211_priv(dev);
-+
-+// printk("=========>%s In\n", __FUNCTION__);
-+ DeInitLed8187(dev, &(priv->Gpio0Led));
-+ DeInitLed8187(dev, &(priv->SwLed0));
-+ DeInitLed8187(dev, &(priv->SwLed1));
-+}
-+
-+void
-+InitLed8187(
-+ struct net_device *dev,
-+ PLED_8187 pLed,
-+ LED_PIN_8187 LedPin,
-+ void * BlinkCallBackFunc)
-+{
-+// printk("=========>%s In\n", __FUNCTION__);
-+ pLed->LedPin = LedPin;
-+
-+ pLed->bLedOn = 0;
-+ pLed->CurrLedState = LED_OFF;
-+
-+ pLed->bLedBlinkInProgress = 0;
-+ pLed->BlinkTimes = 0;
-+ pLed->BlinkingLedState = LED_OFF;
-+
-+ init_timer(&(pLed->BlinkTimer));
-+ pLed->BlinkTimer.data = (unsigned long)dev;
-+ pLed->BlinkTimer.function = BlinkCallBackFunc;
-+ //PlatformInitializeTimer(dev, &(pLed->BlinkTimer), BlinkCallBackFunc);
-+}
-+
-+void
-+DeInitLed8187(
-+ struct net_device *dev,
-+ PLED_8187 pLed)
-+{
-+ //printk("=========>%s In\n", __FUNCTION__);
-+ //PlatformCancelTimer(dev, &(pLed->BlinkTimer));
-+ del_timer_sync(&(pLed->BlinkTimer));
-+ // We should reset bLedBlinkInProgress if we cancel the LedControlTimer, 2005.03.10, by rcnjko.
-+ pLed->bLedBlinkInProgress = 0;
-+}
-+
-+void
-+LedControl8187(
-+ struct net_device *dev,
-+ LED_CTL_MODE LedAction
-+)
-+{
-+ struct r8180_priv *priv = ieee80211_priv(dev);
-+// printk("=========>%s In\n", __FUNCTION__);
-+ if( priv->bEnableLedCtrl == 0)
-+ return;
-+
-+
-+ if( priv->eRFPowerState != eRfOn &&
-+ (LedAction == LED_CTL_TX || LedAction == LED_CTL_RX ||
-+ LedAction == LED_CTL_SITE_SURVEY ||
-+ LedAction == LED_CTL_LINK ||
-+ LedAction == LED_CTL_NO_LINK) )
-+ {
-+ return;
-+ }
-+
-+
-+ switch(priv->LedStrategy)
-+ {
-+ case SW_LED_MODE0:
-+ SwLedControlMode0(dev, LedAction);
-+ break;
-+
-+ case SW_LED_MODE1:
-+ SwLedControlMode1(dev, LedAction);
-+ break;
-+
-+ case SW_LED_MODE2:
-+ SwLedControlMode2(dev, LedAction);
-+ break;
-+
-+ case SW_LED_MODE3:
-+ SwLedControlMode3(dev, LedAction);
-+ break;
-+ case SW_LED_MODE4:
-+ SwLedControlMode4(dev, LedAction);
-+ break;
-+
-+ case SW_LED_MODE5:
-+ SwLedControlMode5(dev, LedAction);
-+ break;
-+
-+ default:
-+ break;
-+ }
-+}
-+
-+
-+//
-+// Description:
-+// Implement each led action for SW_LED_MODE0.
-+// This is default strategy.
-+//
-+void
-+SwLedControlMode0(
-+ struct net_device *dev,
-+ LED_CTL_MODE LedAction
-+)
-+{
-+ struct r8180_priv *priv = ieee80211_priv(dev);
-+ PLED_8187 pLed = &(priv->Gpio0Led);
-+
-+// printk("===+++++++++++++++======>%s In\n", __FUNCTION__);
-+ // Decide led state
-+ switch(LedAction)
-+ {
-+ case LED_CTL_TX:
-+ case LED_CTL_RX:
-+ if( pLed->bLedBlinkInProgress == 0 )
-+ {
-+ pLed->CurrLedState = LED_BLINK_NORMAL;
-+ pLed->BlinkTimes = 2;
-+ // printk("===========>LED_CTL_TX/RX \n");
-+ }
-+ else
-+ {
-+ return;
-+ }
-+ break;
-+
-+ case LED_CTL_SITE_SURVEY:
-+ if( pLed->bLedBlinkInProgress == 0 )
-+ {
-+ pLed->CurrLedState = LED_BLINK_SLOWLY;
-+ // pLed->BlinkTimes = 10;
-+ //printk("===========>LED_CTL_SURVEY \n");
-+ }
-+ else
-+ {
-+ return;
-+ }
-+ break;
-+
-+ case LED_CTL_LINK:
-+ // printk("===========>associate commplite LED_CTL_LINK\n");
-+ pLed->CurrLedState = LED_ON;
-+ break;
-+
-+ case LED_CTL_NO_LINK:
-+ pLed->CurrLedState = LED_OFF;
-+ break;
-+
-+ case LED_CTL_POWER_ON:
-+ // printk("===========>LED_CTL_POWER_ON\n");
-+ pLed->CurrLedState = LED_POWER_ON_BLINK;
-+ break;
-+
-+ case LED_CTL_POWER_OFF:
-+ pLed->CurrLedState = LED_OFF;
-+ break;
-+
-+ default:
-+ return;
-+ break;
-+ }
-+
-+ // Change led state.
-+ switch(pLed->CurrLedState)
-+ {
-+ case LED_ON:
-+ if( pLed->bLedBlinkInProgress == 0 )
-+ {
-+ SwLedOn(dev, pLed);
-+ }
-+ break;
-+
-+ case LED_OFF://modified by lizhaoming 2008.6.23
-+ // if( pLed->bLedBlinkInProgress == 0 )
-+ // {
-+ // SwLedOff(dev, pLed);
-+ // }
-+
-+ if(pLed->bLedBlinkInProgress )/////////lizhaoming
-+ {
-+ del_timer_sync(&(pLed->BlinkTimer));
-+ pLed->bLedBlinkInProgress = FALSE;
-+ }
-+ SwLedOff(dev, pLed);
-+ break;
-+
-+ case LED_BLINK_NORMAL:
-+ if( pLed->bLedBlinkInProgress == 0 )
-+ {
-+ pLed->bLedBlinkInProgress = 1;
-+ if( pLed->bLedOn )
-+ pLed->BlinkingLedState = LED_OFF;
-+ else
-+ pLed->BlinkingLedState = LED_ON;
-+
-+ //pLed->BlinkTimer.expires = jiffies + LED_BLINK_NORMAL_INTERVAL;
-+ //add_timer(&(pLed->BlinkTimer));
-+ mod_timer(&pLed->BlinkTimer, jiffies + MSECS(LED_BLINK_NORMAL_INTERVAL));
-+ //PlatformSetTimer(dev, &(pLed->BlinkTimer), LED_BLINK_NORMAL_INTERVAL);
-+ }
-+ break;
-+
-+ case LED_BLINK_SLOWLY:
-+ if( pLed->bLedBlinkInProgress == 0 )
-+ {
-+ //printk("=======>%s SLOWLY\n", __func__);
-+ pLed->bLedBlinkInProgress = 1;
-+ // if( pLed->bLedOn )
-+ pLed->BlinkingLedState = LED_OFF;//for LED_SHIN is LED on
-+ // else
-+ // pLed->BlinkingLedState = LED_ON;
-+
-+ mod_timer(&pLed->BlinkTimer, jiffies + MSECS(LED_BLINK_SLOWLY_INTERVAL));
-+ }
-+ break;
-+
-+ case LED_POWER_ON_BLINK:
-+ SwLedOn(dev, pLed);
-+#ifdef LED_SHIN
-+ mdelay(100);
-+ SwLedOff(dev, pLed);
-+#endif
-+ break;
-+
-+ default:
-+ break;
-+ }
-+}
-+
-+//
-+// Description:
-+// Implement each led action for SW_LED_MODE1.
-+// For example, this is applied by ALPHA.
-+//
-+void
-+SwLedControlMode1(
-+ struct net_device *dev,
-+ LED_CTL_MODE LedAction
-+)
-+{
-+ struct r8180_priv *priv = ieee80211_priv(dev);
-+ PLED_8187 pLed0 = &(priv->SwLed0);
-+ PLED_8187 pLed1 = &(priv->SwLed1);
-+// printk("=====++++++++++++++++++++++====>%s In\n", __FUNCTION__);
-+
-+ switch(LedAction)
-+ {
-+ case LED_CTL_TX:
-+ if( pLed0->bLedBlinkInProgress == 0 )
-+ {
-+ pLed0->CurrLedState = LED_BLINK_NORMAL;
-+ pLed0->BlinkTimes = 2;
-+ pLed0->bLedBlinkInProgress = 1;
-+ if( pLed0->bLedOn )
-+ pLed0->BlinkingLedState = LED_OFF;
-+ else
-+ pLed0->BlinkingLedState = LED_ON;
-+
-+ //pLed0->BlinkTimer.expires = jiffies + LED_BLINK_NORMAL_INTERVAL;
-+ //add_timer(&(pLed0->BlinkTimer));
-+ mod_timer(&pLed0->BlinkTimer, jiffies + MSECS(LED_BLINK_NORMAL_INTERVAL));
-+ //PlatformSetTimer(dev, &(pLed0->BlinkTimer), LED_BLINK_NORMAL_INTERVAL);
-+ }
-+ break;
-+
-+ case LED_CTL_LINK:
-+ pLed0->CurrLedState = LED_ON;
-+ if( pLed0->bLedBlinkInProgress == 0 )
-+ {
-+ SwLedOn(dev, pLed0);
-+ }
-+ break;
-+
-+ case LED_CTL_NO_LINK:
-+ pLed0->CurrLedState = LED_OFF;
-+ if( pLed0->bLedBlinkInProgress == 0 )
-+ {
-+ SwLedOff(dev, pLed0);
-+ }
-+ break;
-+
-+ case LED_CTL_POWER_ON:
-+ pLed0->CurrLedState = LED_OFF;
-+ SwLedOff(dev, pLed0);
-+
-+ pLed1->CurrLedState = LED_ON;
-+ SwLedOn(dev, pLed1);
-+
-+ break;
-+
-+ case LED_CTL_POWER_OFF:
-+ pLed0->CurrLedState = LED_OFF;
-+ SwLedOff(dev, pLed0);
-+
-+ pLed1->CurrLedState = LED_OFF;
-+ SwLedOff(dev, pLed1);
-+ break;
-+
-+ case LED_CTL_SITE_SURVEY:
-+ if( pLed0->bLedBlinkInProgress == 0 )
-+ {
-+ pLed0->CurrLedState = LED_BLINK_SLOWLY;;
-+ pLed0->BlinkTimes = 10;
-+ pLed0->bLedBlinkInProgress = 1;
-+ if( pLed0->bLedOn )
-+ pLed0->BlinkingLedState = LED_OFF;
-+ else
-+ pLed0->BlinkingLedState = LED_ON;
-+
-+ //pLed0->BlinkTimer.expires = jiffies + LED_BLINK_SLOWLY_INTERVAL;
-+ //add_timer(&(pLed0->BlinkTimer));
-+ mod_timer(&pLed0->BlinkTimer, jiffies + MSECS(LED_BLINK_SLOWLY_INTERVAL));
-+ //PlatformSetTimer(dev, &(pLed0->BlinkTimer), LED_BLINK_SLOWLY_INTERVAL);
-+ }
-+ break;
-+
-+ default:
-+ break;
-+ }
-+}
-+
-+//
-+// Description:
-+// Implement each led action for SW_LED_MODE2,
-+// which is customized for AzWave 8187 minicard.
-+// 2006.04.03, by rcnjko.
-+//
-+void
-+SwLedControlMode2(
-+ struct net_device *dev,
-+ LED_CTL_MODE LedAction
-+)
-+{
-+ struct r8180_priv *priv = ieee80211_priv(dev);
-+ PLED_8187 pLed = &(priv->Gpio0Led);
-+
-+// printk("====+++++++++++++++++++++=====>%s In\n", __FUNCTION__);
-+ // Decide led state
-+ switch(LedAction)
-+ {
-+ case LED_CTL_TX:
-+ case LED_CTL_RX:
-+ if( pLed->bLedBlinkInProgress == 0 )
-+ {
-+ pLed->bLedBlinkInProgress = 1;
-+
-+ pLed->CurrLedState = LED_BLINK_NORMAL;
-+ pLed->BlinkTimes = 2;
-+
-+ if( pLed->bLedOn )
-+ pLed->BlinkingLedState = LED_OFF;
-+ else
-+ pLed->BlinkingLedState = LED_ON;
-+
-+ //pLed->BlinkTimer.expires = jiffies + LED_BLINK_NORMAL_INTERVAL;
-+ //add_timer(&(pLed->BlinkTimer));
-+ mod_timer(&pLed->BlinkTimer, jiffies + MSECS(LED_BLINK_NORMAL_INTERVAL));
-+ //PlatformSetTimer(dev, &(pLed->BlinkTimer), LED_BLINK_NORMAL_INTERVAL);
-+ }
-+ break;
-+
-+ case LED_CTL_SITE_SURVEY:
-+ if( pLed->bLedBlinkInProgress == 0 )
-+ {
-+ pLed->bLedBlinkInProgress = 1;
-+
-+ //if( dev->MgntInfo.mAssoc ||
-+ // dev->MgntInfo.mIbss )
-+ //{
-+ pLed->CurrLedState = LED_SCAN_BLINK;
-+ pLed->BlinkTimes = 4;
-+ //}
-+ //else
-+ //{
-+ // pLed->CurrLedState = LED_NO_LINK_BLINK;
-+ // pLed->BlinkTimes = 24;
-+ //}
-+
-+ if( pLed->bLedOn )
-+ {
-+ pLed->BlinkingLedState = LED_OFF;
-+ //pLed->BlinkTimer.expires = jiffies + LED_CM2_BLINK_ON_INTERVAL;
-+ //add_timer(&(pLed->BlinkTimer));
-+ mod_timer(&pLed->BlinkTimer, jiffies + MSECS(LED_CM2_BLINK_ON_INTERVAL));
-+ //PlatformSetTimer(dev, &(pLed->BlinkTimer), LED_CM2_BLINK_ON_INTERVAL);
-+ }
-+ else
-+ {
-+ pLed->BlinkingLedState = LED_ON;
-+ //pLed->BlinkTimer.expires = jiffies + LED_CM2_BLINK_OFF_INTERVAL;
-+ //add_timer(&(pLed->BlinkTimer));
-+ mod_timer(&pLed->BlinkTimer, jiffies + MSECS(LED_CM2_BLINK_OFF_INTERVAL));
-+ //PlatformSetTimer(dev, &(pLed->BlinkTimer), LED_CM2_BLINK_OFF_INTERVAL);
-+ }
-+ }
-+ else
-+ {
-+ if(pLed->CurrLedState != LED_NO_LINK_BLINK)
-+ {
-+ pLed->CurrLedState = LED_SCAN_BLINK;
-+ /*
-+ if( dev->MgntInfo.mAssoc ||
-+ dev->MgntInfo.mIbss )
-+ {
-+ pLed->CurrLedState = LED_SCAN_BLINK;
-+ }
-+ else
-+ {
-+ pLed->CurrLedState = LED_NO_LINK_BLINK;
-+ }
-+ */
-+ }
-+ }
-+ break;
-+
-+ case LED_CTL_NO_LINK:
-+ if( pLed->bLedBlinkInProgress == 0 )
-+ {
-+ pLed->bLedBlinkInProgress = 1;
-+
-+ pLed->CurrLedState = LED_NO_LINK_BLINK;
-+ pLed->BlinkTimes = 24;
-+
-+ if( pLed->bLedOn )
-+ {
-+ pLed->BlinkingLedState = LED_OFF;
-+ //pLed->BlinkTimer.expires = jiffies + LED_CM2_BLINK_ON_INTERVAL;
-+ //add_timer(&(pLed->BlinkTimer));
-+ mod_timer(&pLed->BlinkTimer, jiffies + MSECS(LED_CM2_BLINK_ON_INTERVAL));
-+ //PlatformSetTimer(dev, &(pLed->BlinkTimer), LED_CM2_BLINK_ON_INTERVAL);
-+ }
-+ else
-+ {
-+ pLed->BlinkingLedState = LED_ON;
-+ //pLed->BlinkTimer.expires = jiffies + LED_CM2_BLINK_OFF_INTERVAL;
-+ //add_timer(&(pLed->BlinkTimer));
-+ mod_timer(&pLed->BlinkTimer, jiffies + MSECS(LED_CM2_BLINK_OFF_INTERVAL));
-+ //PlatformSetTimer(dev, &(pLed->BlinkTimer), LED_CM2_BLINK_OFF_INTERVAL);
-+ }
-+ }
-+ else
-+ {
-+ pLed->CurrLedState = LED_NO_LINK_BLINK;
-+ }
-+ break;
-+
-+ case LED_CTL_LINK:
-+ pLed->CurrLedState = LED_ON;
-+ if( pLed->bLedBlinkInProgress == 0 )
-+ {
-+ SwLedOn(dev, pLed);
-+ }
-+ break;
-+
-+ case LED_CTL_POWER_OFF:
-+ pLed->CurrLedState = LED_OFF;
-+ if( pLed->bLedBlinkInProgress == 0 )
-+ {
-+ SwLedOff(dev, pLed);
-+ }
-+ break;
-+
-+ default:
-+ break;
-+ }
-+}
-+
-+
-+//
-+// Description:
-+// Implement each led action for SW_LED_MODE3,
-+// which is customized for Sercomm Printer Server case.
-+// 2006.04.21, by rcnjko.
-+//
-+void
-+SwLedControlMode3(
-+ struct net_device *dev,
-+ LED_CTL_MODE LedAction
-+)
-+{
-+ struct r8180_priv *priv = ieee80211_priv(dev);
-+ PLED_8187 pLed = &(priv->Gpio0Led);
-+
-+// printk("=====+++++++++++++++++++====>%s In\n", __FUNCTION__);
-+ // Decide led state
-+ switch(LedAction)
-+ {
-+ case LED_CTL_TX:
-+ case LED_CTL_RX:
-+ if( pLed->bLedBlinkInProgress == 0 )
-+ {
-+ pLed->bLedBlinkInProgress = 1;
-+
-+ pLed->CurrLedState = LED_BLINK_CM3;
-+ pLed->BlinkTimes = 2;
-+
-+ if( pLed->bLedOn )
-+ pLed->BlinkingLedState = LED_OFF;
-+ else
-+ pLed->BlinkingLedState = LED_ON;
-+
-+ //pLed->BlinkTimer.expires = jiffies + LED_CM3_BLINK_INTERVAL;
-+ //add_timer(&(pLed->BlinkTimer));
-+ mod_timer(&pLed->BlinkTimer, jiffies + MSECS(LED_CM3_BLINK_INTERVAL));
-+ //PlatformSetTimer(dev, &(pLed->BlinkTimer), LED_CM3_BLINK_INTERVAL);
-+ }
-+ break;
-+
-+ case LED_CTL_SITE_SURVEY:
-+ if( pLed->bLedBlinkInProgress == 0 )
-+ {
-+ pLed->bLedBlinkInProgress = 1;
-+
-+ pLed->CurrLedState = LED_BLINK_CM3;
-+ pLed->BlinkTimes = 10;
-+
-+ if( pLed->bLedOn )
-+ pLed->BlinkingLedState = LED_OFF;
-+ else
-+ pLed->BlinkingLedState = LED_ON;
-+
-+ //pLed->BlinkTimer.expires = jiffies + LED_CM3_BLINK_INTERVAL;
-+ //add_timer(&(pLed->BlinkTimer));
-+ mod_timer(&pLed->BlinkTimer, jiffies + MSECS(LED_CM3_BLINK_INTERVAL));
-+ //PlatformSetTimer(dev, &(pLed->BlinkTimer), LED_CM3_BLINK_INTERVAL);
-+ }
-+ break;
-+
-+ case LED_CTL_LINK:
-+ pLed->CurrLedState = LED_ON;
-+ if( pLed->bLedBlinkInProgress == 0 )
-+ {
-+ SwLedOn(dev, pLed);
-+ }
-+ break;
-+
-+ case LED_CTL_NO_LINK:
-+ pLed->CurrLedState = LED_OFF;
-+ if( pLed->bLedBlinkInProgress == 0 )
-+ {
-+ SwLedOff(dev, pLed);
-+ }
-+ break;
-+
-+ case LED_CTL_POWER_ON:
-+ pLed->CurrLedState = LED_POWER_ON_BLINK;
-+ SwLedOn(dev, pLed);
-+ mdelay(100);
-+ SwLedOff(dev, pLed);
-+ break;
-+
-+ case LED_CTL_POWER_OFF:
-+ pLed->CurrLedState = LED_OFF;
-+ if( pLed->bLedBlinkInProgress == 0 )
-+ {
-+ SwLedOff(dev, pLed);
-+ }
-+ break;
-+
-+ default:
-+ break;
-+ }
-+}
-+
-+// added by lizhaoming 2008.6.2
-+//
-+// Description:
-+// Implement each led action for SW_LED_MODE4,
-+// which is customized for QMI 8187B minicard.
-+// 2008.04.21, by chiyokolin.
-+//
-+void
-+SwLedControlMode4(
-+ struct net_device *dev,
-+ LED_CTL_MODE LedAction
-+ )
-+{
-+ struct r8180_priv *priv = ieee80211_priv(dev);
-+ PLED_8187 pLed = &(priv->Gpio0Led);
-+
-+ //printk("=====+++++++++++++++++++++====>%s In\n", __FUNCTION__);
-+ // Decide led state
-+ switch(LedAction)
-+ {
-+ case LED_CTL_TX:
-+ case LED_CTL_RX:
-+ //if( pLed->bLedBlinkInProgress == false && !priv->bScanInProgress)//?????
-+ if( pLed->bLedBlinkInProgress == 0)
-+ {
-+ pLed->bLedBlinkInProgress = 1;
-+
-+ pLed->CurrLedState = LED_BLINK_NORMAL;
-+ pLed->BlinkTimes = 2;
-+
-+ if( pLed->bLedOn )
-+ pLed->BlinkingLedState = LED_OFF;
-+ else
-+ pLed->BlinkingLedState = LED_ON;
-+
-+ //pLed->BlinkTimer.expires = jiffies + LED_BLINK_NORMAL_INTERVAL;
-+ //add_timer(&(pLed->BlinkTimer));
-+ mod_timer(&pLed->BlinkTimer, jiffies + MSECS(LED_BLINK_NORMAL_INTERVAL));
-+ //PlatformSetTimer(Adapter, &(pLed->BlinkTimer), LED_BLINK_NORMAL_INTERVAL);
-+ }
-+ else
-+ //printk("----->LED_CTL_RX/TX bLedBlinkInProgress\n");
-+
-+ break;
-+
-+ case LED_CTL_SITE_SURVEY:
-+ if( pLed->bLedBlinkInProgress == 0 )
-+ {
-+
-+ pLed->bLedBlinkInProgress = 1;
-+ //if( priv->MgntInfo.mAssoc || priv->MgntInfo.mIbss )//////////??????
-+ //{
-+ pLed->CurrLedState = LED_SCAN_BLINK;
-+ pLed->BlinkTimes = 10;
-+
-+ pLed->BlinkingLedState = LED_ON;
-+
-+ //pLed->BlinkTimer.expires = jiffies + LED_BLINK_NORMAL_INTERVAL;
-+ //add_timer(&(pLed->BlinkTimer));
-+ mod_timer(&pLed->BlinkTimer, jiffies + MSECS(LED_BLINK_NORMAL_INTERVAL));
-+ //PlatformSetTimer(Adapter, &(pLed->BlinkTimer), LED_BLINK_NORMAL_INTERVAL);
-+ //}
-+ //else
-+ //{
-+ // pLed->CurrLedState = LED_NO_LINK_BLINK;
-+ // pLed->BlinkTimes = 24;
-+ //
-+ // if( pLed->bLedOn )
-+ // {
-+ // pLed->BlinkingLedState = LED_OFF;
-+ //
-+ // pLed->BlinkTimer.expires = jiffies + LED_CM4_BLINK_ON_INTERVAL;
-+ // add_timer(&(pLed->BlinkTimer));
-+ // //PlatformSetTimer(Adapter, &(pLed->BlinkTimer), LED_CM4_BLINK_ON_INTERVAL);
-+ // }
-+ // else
-+ // {
-+ // pLed->BlinkingLedState = LED_ON;
-+
-+ // pLed->BlinkTimer.expires = jiffies + LED_CM4_BLINK_OFF_INTERVAL;
-+ // add_timer(&(pLed->BlinkTimer));
-+ // //PlatformSetTimer(Adapter, &(pLed->BlinkTimer), LED_CM4_BLINK_OFF_INTERVAL);
-+ // }
-+ //}
-+ }
-+ else
-+ {
-+ if(pLed->CurrLedState != LED_NO_LINK_BLINK)
-+ {
-+ //if( priv->MgntInfo.mAssoc || priv->MgntInfo.mIbss )//???????????
-+ //{
-+ //}
-+ //else
-+ //{
-+ // pLed->CurrLedState = LED_NO_LINK_BLINK;
-+ //}
-+ }
-+
-+ //printk("----->LED_CTL_SITE_SURVEY bLedBlinkInProgress\n");
-+ }
-+ break;
-+
-+ case LED_CTL_NO_LINK:
-+ if( pLed->bLedBlinkInProgress == 0 )
-+ {
-+ pLed->bLedBlinkInProgress = 1;
-+
-+ pLed->CurrLedState = LED_NO_LINK_BLINK;
-+ pLed->BlinkTimes = 24;
-+
-+ if( pLed->bLedOn )
-+ {
-+ pLed->BlinkingLedState = LED_OFF;
-+
-+ //pLed->BlinkTimer.expires = jiffies + LED_CM4_BLINK_ON_INTERVAL;
-+ //add_timer(&(pLed->BlinkTimer));
-+ mod_timer(&pLed->BlinkTimer, jiffies + MSECS(LED_CM4_BLINK_ON_INTERVAL));
-+ //PlatformSetTimer(Adapter, &(pLed->BlinkTimer), LED_CM4_BLINK_ON_INTERVAL);
-+ }
-+ else
-+ {
-+ pLed->BlinkingLedState = LED_ON;
-+
-+ //pLed->BlinkTimer.expires = jiffies + LED_CM4_BLINK_OFF_INTERVAL;
-+ //add_timer(&(pLed->BlinkTimer));
-+ mod_timer(&pLed->BlinkTimer, jiffies + MSECS(LED_CM4_BLINK_OFF_INTERVAL));
-+ //PlatformSetTimer(Adapter, &(pLed->BlinkTimer), LED_CM4_BLINK_OFF_INTERVAL);
-+ }
-+ }
-+ else
-+ {
-+ pLed->CurrLedState = LED_NO_LINK_BLINK;
-+ //printk("----->LED_CTL_NO_LINK bLedBlinkInProgress\n");
-+ }
-+ break;
-+
-+ case LED_CTL_LINK:
-+ pLed->CurrLedState = LED_ON;
-+ if( pLed->bLedBlinkInProgress == 0)
-+ {
-+ SwLedOn(dev, pLed);
-+ }
-+ else
-+ ;//printk("----->LED_CTL_LINK bLedBlinkInProgress\n");
-+
-+ break;
-+
-+ case LED_CTL_POWER_OFF:
-+ pLed->CurrLedState = LED_OFF;
-+ if(pLed->bLedBlinkInProgress)
-+ {
-+ printk("----->LED_CTL_POWER_OFF bLedBlinkInProgress\n");
-+
-+ //PlatformCancelTimer(Adapter, &(pLed->BlinkTimer));
-+ del_timer_sync(&(pLed->BlinkTimer));
-+ pLed->bLedBlinkInProgress = 0;
-+ }
-+ SwLedOff(dev, pLed);
-+ break;
-+
-+ default:
-+ break;
-+ }
-+}
-+
-+
-+
-+//added by lizhaoming 2008.6.3
-+//
-+// Description:
-+// Implement each led action for SW_LED_MODE5,
-+// which is customized for DELL 8187B minicard.
-+// 2008.04.24, by chiyokolin.
-+//
-+void
-+SwLedControlMode5(
-+ struct net_device *dev,
-+ LED_CTL_MODE LedAction
-+ )
-+{
-+ struct r8180_priv *priv = ieee80211_priv(dev);
-+ PLED_8187 pLed = &(priv->Gpio0Led);
-+
-+ // Decide led state
-+ //printk("====++++++++++++++++++++++=====>%s In\n", __FUNCTION__);
-+ switch(LedAction)
-+ {
-+ case LED_CTL_TX:
-+ case LED_CTL_RX:
-+ case LED_CTL_SITE_SURVEY:
-+ case LED_CTL_POWER_ON:
-+ case LED_CTL_NO_LINK:
-+ case LED_CTL_LINK:
-+ pLed->CurrLedState = LED_ON;
-+ if( pLed->bLedBlinkInProgress == 0 )
-+ {
-+ pLed->bLedBlinkInProgress = 1;
-+ if(! pLed->bLedOn )
-+ pLed->BlinkingLedState = LED_ON;
-+ else
-+ break;
-+
-+ //printk("====++++++++++++++++++++++=====>%s In LED:%d\n", __FUNCTION__, pLed->bLedOn);
-+ //pLed->BlinkTimer.expires = jiffies + LED_BLINK_NORMAL_INTERVAL;
-+ //add_timer(&(pLed->BlinkTimer));
-+ mod_timer(&pLed->BlinkTimer, jiffies + MSECS(LED_BLINK_NORMAL_INTERVAL));
-+ // SwLedOn(dev, pLed);
-+ }
-+ else
-+ ;//printk("----->LED_CTL_LINK bLedBlinkInProgress\n");
-+
-+ break;
-+
-+ case LED_CTL_POWER_OFF:
-+ pLed->CurrLedState = LED_OFF;
-+ // printk("<====++++++++++++++++++++++=====%s In LED:%d\n", __FUNCTION__, pLed->bLedOn);
-+ if(pLed->bLedBlinkInProgress)
-+ {
-+ // printk("----->LED_CTL_POWER_OFF bLedBlinkInProgress\n");
-+
-+ //PlatformCancelTimer(Adapter, &(pLed->BlinkTimer));
-+ del_timer_sync(&(pLed->BlinkTimer));
-+ pLed->bLedBlinkInProgress = 0;
-+ }
-+ SwLedOff(dev, pLed);
-+ break;
-+
-+ default:
-+ break;
-+ }
-+}
-+
-+//
-+// Callback fuction of the timer, Gpio0Led.BlinkTimer.
-+//
-+void
-+Gpio0LedBlinkTimerCallback(
-+ unsigned long data
-+ )
-+{
-+ struct net_device *dev = (struct net_device *)data;
-+ struct r8180_priv *priv = ieee80211_priv(dev);
-+
-+// printk("=========>%s In\n", __FUNCTION__);
-+ PlatformSwLedBlink(dev, &(priv->Gpio0Led));
-+}
-+
-+
-+
-+//
-+// Callback fuction of the timer, SwLed0.BlinkTimer.
-+//
-+void
-+SwLed0BlinkTimerCallback(
-+ unsigned long data
-+ )
-+{
-+ struct net_device *dev = (struct net_device *)data;
-+ struct r8180_priv *priv = ieee80211_priv(dev);
-+
-+// printk("=========>%s In\n", __FUNCTION__);
-+ PlatformSwLedBlink(dev, &(priv->SwLed0));
-+}
-+
-+
-+
-+//
-+// Callback fuction of the timer, SwLed1.BlinkTimer.
-+//
-+void
-+SwLed1BlinkTimerCallback(
-+ unsigned long data
-+ )
-+{
-+ struct net_device *dev = (struct net_device *)data;
-+ struct r8180_priv *priv = ieee80211_priv(dev);
-+
-+// printk("=========>%s In\n", __FUNCTION__);
-+ PlatformSwLedBlink(dev, &(priv->SwLed1));
-+}
-+
-+void
-+PlatformSwLedBlink(
-+ struct net_device *dev,
-+ PLED_8187 pLed
-+ )
-+{
-+ struct r8180_priv *priv = ieee80211_priv(dev);
-+
-+// printk("=========>%s In\n", __FUNCTION__);
-+ switch(pLed->LedPin)
-+ {
-+ case LED_PIN_GPIO0:
-+ schedule_work(&(priv->Gpio0LedWorkItem));
-+ break;
-+
-+ case LED_PIN_LED0:
-+ schedule_work(&(priv->SwLed0WorkItem));
-+ break;
-+
-+ case LED_PIN_LED1:
-+ schedule_work(&(priv->SwLed1WorkItem));
-+ break;
-+
-+ default:
-+ break;
-+ }
-+}
-+
-+//
-+// Callback fucntion of the workitem for SW LEDs.
-+// 2006.03.01, by rcnjko.
-+//
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)
-+void Gpio0LedWorkItemCallback(struct work_struct *work)
-+{
-+ struct r8180_priv *priv = container_of(work, struct r8180_priv,Gpio0LedWorkItem);
-+ struct net_device *dev = priv->ieee80211->dev;
-+#else
-+void
-+Gpio0LedWorkItemCallback(
-+ void * Context
-+ )
-+{
-+ struct net_device *dev = (struct net_device *)Context;
-+ struct r8180_priv *priv = ieee80211_priv(dev);
-+#endif
-+ PLED_8187 pLed = &(priv->Gpio0Led);
-+ if (priv == NULL || dev == NULL){
-+// printk("=========>%s In\n", __FUNCTION__);
-+ //printk("ft=====================>%s()\n", __FUNCTION__);
-+ }
-+
-+#if 0 // by lizahoming 2008.6.3
-+ if(priv->LedStrategy == SW_LED_MODE2)
-+ SwLedCm2Blink(dev, pLed);
-+ else
-+ SwLedBlink(dev, pLed);
-+#endif
-+
-+#if 1 // by lizahoming 2008.6.3
-+ switch(priv->LedStrategy)
-+ {
-+ case SW_LED_MODE2:
-+ SwLedCm2Blink(dev, pLed);
-+ break;
-+ case SW_LED_MODE4:
-+ SwLedCm4Blink(dev, pLed);
-+ break;
-+ default:
-+ SwLedBlink(dev, pLed);
-+ break;
-+ }
-+#endif
-+
-+ //LeaveCallbackOfRtWorkItem( &(usbdevice->Gpio0LedWorkItem) );
-+}
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)
-+void SwLed0WorkItemCallback(struct work_struct *work)
-+{
-+ //struct r8180_priv *priv = container_of(work, struct r8180_priv, SwLed0WorkItem);
-+ //struct net_device *dev = priv->dev;
-+#else
-+void SwLed0WorkItemCallback(void * Context)
-+{
-+ //struct net_device *dev = (struct net_device *)Context;
-+ //struct r8180_priv *priv = ieee80211_priv(dev);
-+#endif
-+ //SwLedBlink(dev, &(priv->SwLed0));
-+// printk("=========>%s In\n", __FUNCTION__);
-+
-+ //LeaveCallbackOfRtWorkItem( &(usbdevice->SwLed0WorkItem) );
-+}
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)
-+void SwLed1WorkItemCallback(struct work_struct *work)
-+{
-+ //struct r8180_priv *priv = container_of(work, struct r8180_priv, SwLed1WorkItem);
-+// struct net_device *dev = priv->dev;
-+#else
-+void
-+SwLed1WorkItemCallback(
-+ void * Context
-+ )
-+{
-+ //struct net_device *dev = (struct net_device *)Context;
-+ //struct r8180_priv *priv = ieee80211_priv(dev);
-+#endif
-+// printk("=========>%s In\n", __FUNCTION__);
-+ //SwLedBlink(dev, &(priv->SwLed1));
-+
-+ //LeaveCallbackOfRtWorkItem( &(usbdevice->SwLed1WorkItem) );
-+}
-+
-+//
-+// Implementation of LED blinking behavior.
-+// It toggle off LED and schedule corresponding timer if necessary.
-+//
-+void
-+SwLedBlink(
-+ struct net_device *dev,
-+ PLED_8187 pLed
-+ )
-+{
-+ u8 bStopBlinking = 0;
-+
-+ //printk("=========>%s In state:%d\n", __FUNCTION__, pLed->CurrLedState);
-+ // Change LED according to BlinkingLedState specified.
-+ if( pLed->BlinkingLedState == LED_ON )
-+ {
-+ SwLedOn(dev, pLed);
-+// printk("Blinktimes (%d): turn on\n", pLed->BlinkTimes);
-+ }
-+ else
-+ {
-+ SwLedOff(dev, pLed);
-+// printk("Blinktimes (%d): turn off\n", pLed->BlinkTimes);
-+ }
-+
-+ // Determine if we shall change LED state again.
-+//by lizhaoming for LED BLINK SLOWLY
-+ if(pLed->CurrLedState == LED_BLINK_SLOWLY)
-+ {
-+ bStopBlinking = 0;
-+ } else {
-+ pLed->BlinkTimes--;
-+ if( pLed->BlinkTimes == 0 )
-+ {
-+ bStopBlinking = 1;
-+ }
-+ else
-+ {
-+ if( pLed->CurrLedState != LED_BLINK_NORMAL &&
-+ pLed->CurrLedState != LED_BLINK_SLOWLY &&
-+ pLed->CurrLedState != LED_BLINK_CM3 )
-+ {
-+ bStopBlinking = 1;
-+ }
-+ }
-+ }
-+
-+ if(bStopBlinking)
-+ {
-+ if( pLed->CurrLedState == LED_ON && pLed->bLedOn == 0)
-+ {
-+ SwLedOn(dev, pLed);
-+ }
-+ else if(pLed->CurrLedState == LED_OFF && pLed->bLedOn == 1)
-+ {
-+ SwLedOff(dev, pLed);
-+ }
-+
-+ pLed->BlinkTimes = 0;
-+ pLed->bLedBlinkInProgress = 0;
-+ }
-+ else
-+ {
-+ // Assign LED state to toggle.
-+ if( pLed->BlinkingLedState == LED_ON )
-+ pLed->BlinkingLedState = LED_OFF;
-+ else
-+ pLed->BlinkingLedState = LED_ON;
-+
-+ // Schedule a timer to toggle LED state.
-+ switch( pLed->CurrLedState )
-+ {
-+ case LED_BLINK_NORMAL:
-+ //printk("LED_BLINK_NORMAL:Blinktimes (%d): turn off\n", pLed->BlinkTimes+1);
-+ //pLed->BlinkTimer.expires = jiffies + LED_BLINK_NORMAL_INTERVAL;
-+ //add_timer(&(pLed->BlinkTimer));
-+ mod_timer(&pLed->BlinkTimer, jiffies + MSECS(LED_BLINK_NORMAL_INTERVAL));
-+ //PlatformSetTimer(dev, &(pLed->BlinkTimer), LED_BLINK_NORMAL_INTERVAL);
-+ break;
-+
-+ case LED_BLINK_SLOWLY:
-+ if( pLed->bLedOn == 1 )
-+ {
-+ //printk("LED_BLINK_SLOWLY:turn off\n");
-+ //pLed->BlinkTimer.expires = jiffies + LED_BLINK_SLOWLY_INTERVAL+50;//for pcie mini card spec page 33, 250ms
-+ //add_timer(&(pLed->BlinkTimer));
-+ mod_timer(&pLed->BlinkTimer, jiffies + MSECS(LED_BLINK_SLOWLY_INTERVAL+50));
-+ pLed->BlinkingLedState = LED_OFF;
-+ } else {
-+ //printk("LED_BLINK_SLOWLY:turn on\n");
-+ //pLed->BlinkTimer.expires = jiffies + 5000;//for pcie mini card spec page 33, 5s
-+ //add_timer(&(pLed->BlinkTimer));
-+ mod_timer(&pLed->BlinkTimer, jiffies + MSECS(5000));
-+ pLed->BlinkingLedState = LED_ON;
-+ }
-+ break;
-+
-+ case LED_BLINK_CM3:
-+ //printk("LED_BLINK_CM3:Blinktimes (%d): turn off\n", pLed->BlinkTimes+1);
-+ //pLed->BlinkTimer.expires = jiffies + LED_CM3_BLINK_INTERVAL;
-+ //add_timer(&(pLed->BlinkTimer));
-+ mod_timer(&pLed->BlinkTimer, jiffies + MSECS(LED_CM3_BLINK_INTERVAL));
-+ //PlatformSetTimer(dev, &(pLed->BlinkTimer), LED_CM3_BLINK_INTERVAL);
-+ break;
-+
-+ default:
-+ //printk("LED_BLINK_default:Blinktimes (%d): turn off\n", pLed->BlinkTimes+1);
-+ //pLed->BlinkTimer.expires = jiffies + LED_BLINK_SLOWLY_INTERVAL;
-+ //add_timer(&(pLed->BlinkTimer));
-+ mod_timer(&pLed->BlinkTimer, jiffies + MSECS(LED_BLINK_SLOWLY_INTERVAL));
-+ //PlatformSetTimer(dev, &(pLed->BlinkTimer), LED_BLINK_SLOWLY_INTERVAL);
-+ break;
-+ }
-+ }
-+}
-+
-+
-+
-+//
-+// Implementation of LED blinking behavior for SwLedControlMode2.
-+//
-+void
-+SwLedCm2Blink(
-+ struct net_device *dev,
-+ PLED_8187 pLed
-+ )
-+{
-+ struct r8180_priv *priv = ieee80211_priv(dev);
-+ //PMGNT_INFO priv = &(dev->MgntInfo);
-+ u8 bStopBlinking = 0;
-+
-+ //printk("========+++++++++++++=>%s In\n", __FUNCTION__);
-+ //To avoid LED blinking when rf is off, add by lizhaoming 2008.6.2
-+ if((priv->eRFPowerState == eRfOff) && (priv->RfOffReason>RF_CHANGE_BY_IPS))
-+ {
-+ SwLedOff(dev, pLed);
-+
-+ //pLed->BlinkTimer.expires = jiffies + LED_CM2_BLINK_ON_INTERVAL;
-+ //add_timer(&(pLed->BlinkTimer));
-+ mod_timer(&pLed->BlinkTimer, jiffies + MSECS(LED_CM2_BLINK_ON_INTERVAL));
-+ //PlatformSetTimer(Adapter, &(pLed->BlinkTimer), LED_CM2_BLINK_ON_INTERVAL);
-+ //printk(" Hw/Soft Radio Off, turn off Led\n");
-+ return;
-+ }
-+
-+ // Change LED according to BlinkingLedState specified.
-+ if( pLed->BlinkingLedState == LED_ON )
-+ {
-+ SwLedOn(dev, pLed);
-+ //DMESG("Blinktimes (%d): turn on\n", pLed->BlinkTimes);
-+ }
-+ else
-+ {
-+ SwLedOff(dev, pLed);
-+ //DMESG("Blinktimes (%d): turn off\n", pLed->BlinkTimes);
-+ }
-+
-+ //Add by lizhaoming for avoid BlinkTimers <0, 2008.6.2
-+ if(pLed->BlinkTimes > 0)
-+ {//by lizhaoming 2008.6.2
-+ // Determine if we shall change LED state again.
-+ pLed->BlinkTimes--;
-+ }//by lizhaoming 2008.6.2
-+
-+ switch(pLed->CurrLedState)
-+ {
-+ case LED_BLINK_NORMAL:
-+ if(pLed->BlinkTimes == 0)
-+ {
-+ bStopBlinking = 1;
-+ }
-+ break;
-+/* CM2 scan blink and no link blind now not be supported
-+ case LED_SCAN_BLINK:
-+ if( (priv->mAssoc || priv->mIbss) && // Linked.
-+ (!priv->bScanInProgress) && // Not in scan stage.
-+ (pLed->BlinkTimes % 2 == 0)) // Even
-+ {
-+ bStopBlinking = 1;
-+ }
-+ break;
-+
-+ case LED_NO_LINK_BLINK:
-+ //Revised miniCard Ad-hoc mode "Slow Blink" by Isaiah 2006-08-03
-+ //if( (priv->mAssoc || priv->mIbss) ) // Linked.
-+ if( priv->mAssoc)
-+ {
-+ bStopBlinking = 1;
-+ }
-+ else if(priv->mIbss && priv->bMediaConnect )
-+ {
-+ bStopBlinking = 1;
-+ }
-+ break;
-+*/
-+ default:
-+ bStopBlinking = 1;
-+ break;
-+ }
-+
-+ if(bStopBlinking)
-+ {
-+/*
-+ if( priv->eRFPowerState != eRfOn )
-+ {
-+ SwLedOff(dev, pLed);
-+ }
-+ else if( priv->bMediaConnect == 1 && pLed->bLedOn == 0)
-+ {
-+ SwLedOn(dev, pLed);
-+ }
-+ else if( priv->bMediaConnect == 0 && pLed->bLedOn == 1)
-+ {
-+ SwLedOff(dev, pLed);
-+ }
-+*/
-+ pLed->BlinkTimes = 0;
-+ pLed->bLedBlinkInProgress = 0;
-+ }
-+ else
-+ {
-+ // Assign LED state to toggle.
-+ if( pLed->BlinkingLedState == LED_ON )
-+ pLed->BlinkingLedState = LED_OFF;
-+ else
-+ pLed->BlinkingLedState = LED_ON;
-+
-+ // Schedule a timer to toggle LED state.
-+ switch( pLed->CurrLedState )
-+ {
-+ case LED_BLINK_NORMAL:
-+ //pLed->BlinkTimer.expires = jiffies + LED_BLINK_NORMAL_INTERVAL;
-+ //add_timer(&(pLed->BlinkTimer));
-+ mod_timer(&pLed->BlinkTimer, jiffies + MSECS(LED_BLINK_NORMAL_INTERVAL));
-+ //PlatformSetTimer(dev, &(pLed->BlinkTimer), LED_BLINK_NORMAL_INTERVAL);
-+ break;
-+
-+ case LED_BLINK_SLOWLY:
-+ //pLed->BlinkTimer.expires = jiffies + LED_BLINK_SLOWLY_INTERVAL;
-+ //add_timer(&(pLed->BlinkTimer));
-+ mod_timer(&pLed->BlinkTimer, jiffies + MSECS(LED_BLINK_SLOWLY_INTERVAL));
-+ //PlatformSetTimer(dev, &(pLed->BlinkTimer), LED_BLINK_SLOWLY_INTERVAL);
-+ break;
-+
-+ case LED_SCAN_BLINK:
-+ case LED_NO_LINK_BLINK:
-+ if( pLed->bLedOn ) {
-+ //pLed->BlinkTimer.expires = jiffies + LED_CM2_BLINK_ON_INTERVAL;
-+ //add_timer(&(pLed->BlinkTimer));
-+ mod_timer(&pLed->BlinkTimer, jiffies + MSECS(LED_CM2_BLINK_ON_INTERVAL));
-+ //PlatformSetTimer(dev, &(pLed->BlinkTimer), LED_CM2_BLINK_ON_INTERVAL);
-+ } else {
-+ //pLed->BlinkTimer.expires = jiffies + LED_CM2_BLINK_OFF_INTERVAL;
-+ //add_timer(&(pLed->BlinkTimer));
-+ mod_timer(&pLed->BlinkTimer, jiffies + MSECS(LED_CM2_BLINK_OFF_INTERVAL));
-+ //PlatformSetTimer(dev, &(pLed->BlinkTimer), LED_CM2_BLINK_OFF_INTERVAL);
-+ }
-+ break;
-+
-+ default:
-+ //RT_ASSERT(0, ("SwLedCm2Blink(): unexpected state!\n"));
-+ //pLed->BlinkTimer.expires = jiffies + LED_BLINK_SLOWLY_INTERVAL;
-+ //add_timer(&(pLed->BlinkTimer));
-+ mod_timer(&pLed->BlinkTimer, jiffies + MSECS(LED_BLINK_SLOWLY_INTERVAL));
-+ //PlatformSetTimer(dev, &(pLed->BlinkTimer), LED_BLINK_SLOWLY_INTERVAL);
-+ break;
-+ }
-+ }
-+}
-+
-+// added by lizhaoming 2008.6.2
-+//
-+// Description:
-+// Implement LED blinking behavior for SW_LED_MODE4.
-+//
-+void
-+SwLedCm4Blink(
-+ struct net_device *dev,
-+ PLED_8187 pLed
-+ )
-+{
-+ struct r8180_priv *priv = ieee80211_priv(dev);
-+ u8 bStopBlinking = 0;
-+
-+ printk("======++++++++++++++++++======>%s In\n", __FUNCTION__);
-+ //To avoid LED blinking when rf is off, add by Maddest 20080307
-+ if((priv->eRFPowerState == eRfOff) && (priv->RfOffReason>RF_CHANGE_BY_IPS))
-+ {
-+ SwLedOff(dev, pLed);
-+
-+ //pLed->BlinkTimer.expires = jiffies + LED_CM4_BLINK_ON_INTERVAL;
-+ //add_timer(&(pLed->BlinkTimer));
-+ mod_timer(&pLed->BlinkTimer, jiffies + MSECS(LED_CM4_BLINK_ON_INTERVAL));
-+ //PlatformSetTimer(Adapter, &(pLed->BlinkTimer), LED_CM4_BLINK_ON_INTERVAL);
-+ printk(" Hw/Soft Radio Off, turn off Led\n");
-+ return;
-+ }
-+ // Change LED according to BlinkingLedState specified.
-+ if( pLed->BlinkingLedState == LED_ON )
-+ {
-+ if(!pLed->bLedOn)
-+ {
-+ SwLedOn(dev, pLed);
-+ }
-+ printk("Blinktimes (%d): turn on\n", pLed->BlinkTimes);
-+ }
-+ else
-+ {
-+ SwLedOff(dev, pLed);
-+ printk("Blinktimes (%d): turn off\n", pLed->BlinkTimes);
-+ }
-+
-+ //Add by Maddest for avoid BlinkTimers <0, 20080307;
-+ if(pLed->BlinkTimes > 0)
-+ {
-+ // Determine if we shall change LED state again.
-+ pLed->BlinkTimes--;
-+ }
-+ printk("pLed->CurrLedState %d pLed->BlinkTimes %d\n", pLed->CurrLedState,pLed->BlinkTimes);
-+ switch(pLed->CurrLedState)
-+ {
-+ case LED_BLINK_NORMAL:
-+ if(pLed->BlinkTimes == 0)
-+ {
-+ bStopBlinking = 1;
-+ }
-+ break;
-+
-+/* CM2 scan blink and no link blind now not be supported
-+ case LED_SCAN_BLINK:
-+ if( (priv->mAssoc || priv->mIbss) && // Linked.//????????????
-+ (!priv->bScanInProgress) && // Not in scan stage.//????????????
-+ (pLed->BlinkTimes % 2 == 0)) // Even
-+ {
-+ bStopBlinking = 1;
-+ }
-+ break;
-+
-+ case LED_NO_LINK_BLINK:
-+ //Revised miniCard Ad-hoc mode "Slow Blink" by Isaiah 2006-08-03
-+ //if( (pMgntInfo->mAssoc || pMgntInfo->mIbss) ) // Linked.
-+ if( priv->mAssoc) //????????????
-+ {
-+ bStopBlinking = 1;
-+ }
-+ else if(priv->mIbss && priv->bMediaConnect )//????????????
-+ {
-+ bStopBlinking = 1;
-+ }
-+ break;
-+*/
-+
-+ default:
-+ bStopBlinking = 1;
-+ break;
-+ }
-+
-+ if(bStopBlinking)
-+ {
-+ /*
-+ if( priv->eRFPowerState != eRfOn )
-+ {
-+ SwLedOff(dev, pLed);
-+ }
-+ else if( priv->bMediaConnect == true && pLed->bLedOn == false)//????????????
-+ {
-+ SwLedOn(dev, pLed);
-+ }
-+ else if( priv->bMediaConnect == false && pLed->bLedOn == true)//????????????
-+ {
-+ SwLedOff(dev, pLed);
-+ }
-+ */
-+
-+ pLed->BlinkTimes = 0;
-+ pLed->bLedBlinkInProgress = 0;
-+ }
-+ else
-+ {
-+ // Assign LED state to toggle.
-+ if( pLed->BlinkingLedState == LED_ON )
-+ pLed->BlinkingLedState = LED_OFF;
-+ else
-+ pLed->BlinkingLedState = LED_ON;
-+
-+ // Schedule a timer to toggle LED state.
-+ switch( pLed->CurrLedState )
-+ {
-+ case LED_BLINK_NORMAL:
-+ //pLed->BlinkTimer.expires = jiffies + LED_BLINK_NORMAL_INTERVAL;
-+ //add_timer(&(pLed->BlinkTimer));
-+ mod_timer(&pLed->BlinkTimer, jiffies + MSECS(LED_BLINK_NORMAL_INTERVAL));
-+ //PlatformSetTimer(Adapter, &(pLed->BlinkTimer), LED_BLINK_NORMAL_INTERVAL);
-+ break;
-+
-+ case LED_BLINK_SLOWLY:
-+ //pLed->BlinkTimer.expires = jiffies + LED_BLINK_SLOWLY_INTERVAL;
-+ //add_timer(&(pLed->BlinkTimer));
-+ mod_timer(&pLed->BlinkTimer, jiffies + MSECS(LED_BLINK_SLOWLY_INTERVAL));
-+ //PlatformSetTimer(Adapter, &(pLed->BlinkTimer), LED_BLINK_SLOWLY_INTERVAL);
-+ break;
-+
-+ case LED_SCAN_BLINK:
-+ pLed->BlinkingLedState = LED_ON;
-+ //pLed->BlinkTimer.expires = jiffies + LED_BLINK_NORMAL_INTERVAL;
-+ //add_timer(&(pLed->BlinkTimer));
-+ mod_timer(&pLed->BlinkTimer, jiffies + MSECS(LED_BLINK_NORMAL_INTERVAL));
-+ //PlatformSetTimer(Adapter, &(pLed->BlinkTimer), LED_BLINK_NORMAL_INTERVAL);
-+
-+ case LED_NO_LINK_BLINK:
-+ if( pLed->bLedOn ){
-+ //pLed->BlinkTimer.expires = jiffies + LED_CM4_BLINK_ON_INTERVAL;
-+ //add_timer(&(pLed->BlinkTimer));
-+ mod_timer(&pLed->BlinkTimer, jiffies + MSECS(LED_CM4_BLINK_ON_INTERVAL));
-+ //PlatformSetTimer(Adapter, &(pLed->BlinkTimer), LED_CM4_BLINK_ON_INTERVAL);
-+ }else{
-+ //pLed->BlinkTimer.expires = jiffies + LED_CM4_BLINK_OFF_INTERVAL;
-+ //add_timer(&(pLed->BlinkTimer));
-+ mod_timer(&pLed->BlinkTimer, jiffies + MSECS(LED_CM4_BLINK_OFF_INTERVAL));
-+ //PlatformSetTimer(Adapter, &(pLed->BlinkTimer), LED_CM4_BLINK_OFF_INTERVAL);
-+ }
-+ break;
-+
-+ default:
-+ printk("SwLedCm2Blink(): unexpected state!\n");
-+ //pLed->BlinkTimer.expires = jiffies + LED_BLINK_SLOWLY_INTERVAL;
-+ //add_timer(&(pLed->BlinkTimer));
-+ mod_timer(&pLed->BlinkTimer, jiffies + MSECS(LED_BLINK_SLOWLY_INTERVAL));
-+ //PlatformSetTimer(Adapter, &(pLed->BlinkTimer), LED_BLINK_SLOWLY_INTERVAL);
-+ break;
-+ }
-+ }
-+}
-+
-+void
-+SwLedOn(
-+ struct net_device *dev,
-+ PLED_8187 pLed
-+)
-+{
-+ struct r8180_priv *priv = ieee80211_priv(dev);
-+// printk("=========>%s(), pin:%d\n", __FUNCTION__, pLed->LedPin);
-+ switch(pLed->LedPin)
-+ {
-+ case LED_PIN_GPIO0:
-+ write_nic_byte(dev,0x0091,0x01);
-+ write_nic_byte(dev,0x0090,0x00); // write 0 : LED on
-+ break;
-+
-+ case LED_PIN_LED0:
-+ priv->PsrValue &= ~(0x01 << 4);
-+ write_nic_byte(dev, PSR, priv->PsrValue);
-+ break;
-+
-+ case LED_PIN_LED1:
-+ priv->PsrValue &= ~(0x01 << 5);
-+ write_nic_byte(dev, PSR, priv->PsrValue);
-+ break;
-+
-+ default:
-+ break;
-+ }
-+
-+ pLed->bLedOn = 1;
-+}
-+
-+void
-+SwLedOff(
-+ struct net_device *dev,
-+ PLED_8187 pLed
-+)
-+{
-+ struct r8180_priv *priv = ieee80211_priv(dev);
-+
-+
-+ //printk("=========>%s(), pin:%d\n", __FUNCTION__, pLed->LedPin);
-+ switch(pLed->LedPin)
-+ {
-+ case LED_PIN_GPIO0:
-+ write_nic_byte(dev,0x0091,0x01);
-+ write_nic_byte(dev,0x0090,0x01); // write 1 : LED off
-+ break;
-+
-+ case LED_PIN_LED0:
-+ priv->PsrValue |= (0x01 << 4);
-+ write_nic_byte(dev, PSR, priv->PsrValue);
-+ break;
-+
-+ case LED_PIN_LED1:
-+ priv->PsrValue |= (0x01 << 5);
-+ write_nic_byte(dev, PSR, priv->PsrValue);
-+ break;
-+
-+ default:
-+ break;
-+ }
-+
-+ pLed->bLedOn = 0;
-+}
-+
-diff -Nur linux-2.6.30.5.orig/drivers/net/wireless/rtl8187b/r8187_led.h linux-2.6.30.5/drivers/net/wireless/rtl8187b/r8187_led.h
---- linux-2.6.30.5.orig/drivers/net/wireless/rtl8187b/r8187_led.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.30.5/drivers/net/wireless/rtl8187b/r8187_led.h 2009-08-23 19:01:04.000000000 +0200
-@@ -0,0 +1,276 @@
-+/*++
-+
-+Copyright (c) Microsoft Corporation. All rights reserved.
-+
-+Module Name:
-+ r8187_led.h
-+
-+Abstract:
-+ definitions and stuctures for rtl8187 led control.
-+
-+Major Change History:
-+ When Who What
-+ ---------- ------ ----------------------------------------------
-+ 2006-09-07 Xiong Created
-+
-+Notes:
-+
-+--*/
-+
-+#ifndef R8187_LED_H
-+#define R8187_LED_H
-+
-+#include <linux/types.h>
-+#include <linux/timer.h>
-+
-+
-+/*--------------------------Define -------------------------------------------*/
-+//
-+// 0x7E-0x7F is reserved for SW customization. 2006.04.21, by rcnjko.
-+//
-+// BIT[0-7] is for CustomerID where value 0x00 and 0xFF is reserved for Realtek.
-+#define EEPROM_SW_REVD_OFFSET 0x7E
-+
-+#define EEPROM_CID_MASK 0x00FF
-+#define EEPROM_CID_RSVD0 0x00
-+#define EEPROM_CID_RSVD1 0xFF
-+#define EEPROM_CID_ALPHA0 0x01
-+#define EEPROM_CID_SERCOMM_PS 0x02
-+#define EEPROM_CID_HW_LED 0x03
-+
-+#define EEPROM_CID_QMI 0x07 //Added by lizhaoming 2008.6.3
-+#define EEPROM_CID_DELL 0x08 //Added by lizhaoming 2008.6.3
-+
-+#define LED_BLINK_NORMAL_INTERVAL 100 //by lizhaoming 50 -> 100
-+#define LED_BLINK_SLOWLY_INTERVAL 200
-+
-+// Customized for AzWave, 2006.04.03, by rcnjko.
-+#define LED_CM2_BLINK_ON_INTERVAL 250
-+#define LED_CM2_BLINK_OFF_INTERVAL 4750
-+//
-+
-+// Customized for Sercomm Printer Server case, 2006.04.21, by rcnjko.
-+#define LED_CM3_BLINK_INTERVAL 1500
-+
-+// by lizhaoming 2008.6.3: Customized for QMI.
-+//
-+#define LED_CM4_BLINK_ON_INTERVAL 500
-+#define LED_CM4_BLINK_OFF_INTERVAL 4500
-+
-+
-+/*--------------------------Define MACRO--------------------------------------*/
-+
-+
-+/*------------------------------Define Struct---------------------------------*/
-+typedef enum _LED_STATE_8187{
-+ LED_UNKNOWN = 0,
-+ LED_ON = 1,
-+ LED_OFF = 2,
-+ LED_BLINK_NORMAL = 3,
-+ LED_BLINK_SLOWLY = 4,
-+ LED_POWER_ON_BLINK = 5,
-+ LED_SCAN_BLINK = 6, // LED is blinking during scanning period, the # of times to blink is depend on time for scanning.
-+ LED_NO_LINK_BLINK = 7, // LED is blinking during no link state.
-+ LED_BLINK_CM3 = 8, // Customzied for Sercomm Printer Server case
-+}LED_STATE_8187;
-+
-+typedef enum _RT_CID_TYPE {
-+ RT_CID_DEFAULT,
-+ RT_CID_8187_ALPHA0,
-+ RT_CID_8187_SERCOMM_PS,
-+ RT_CID_8187_HW_LED,
-+
-+ RT_CID_87B_QMI , //Added by lizhaoming 2008.6.3
-+ RT_CID_87B_DELL, //Added by lizhaoming 2008.6.3
-+
-+} RT_CID_TYPE;
-+
-+typedef enum _LED_STRATEGY_8187{
-+ SW_LED_MODE0, // SW control 1 LED via GPIO0. It is default option.
-+ SW_LED_MODE1, // 2 LEDs, through LED0 and LED1. For ALPHA.
-+ SW_LED_MODE2, // SW control 1 LED via GPIO0, customized for AzWave 8187 minicard.
-+ SW_LED_MODE3, // SW control 1 LED via GPIO0, customized for Sercomm Printer Server case.
-+ SW_LED_MODE4, //added by lizhaoming for bluetooth 2008.6.3
-+ SW_LED_MODE5, //added by lizhaoming for bluetooth 2008.6.3
-+ HW_LED, // HW control 2 LEDs, LED0 and LED1 (there are 4 different control modes, see MAC.CONFIG1 for details.)
-+}LED_STRATEGY_8187, *PLED_STRATEGY_8187;
-+
-+typedef enum _LED_PIN_8187{
-+ LED_PIN_GPIO0,
-+ LED_PIN_LED0,
-+ LED_PIN_LED1
-+}LED_PIN_8187;
-+
-+//by lizhaoming for LED 2008.6.23 into ieee80211.h
-+//typedef enum _LED_CTL_MODE {
-+// LED_CTL_POWER_ON,
-+// LED_CTL_POWER_OFF,
-+// LED_CTL_LINK,
-+// LED_CTL_NO_LINK,
-+// LED_CTL_TX,
-+// LED_CTL_RX,
-+// LED_CTL_SITE_SURVEY,
-+//} LED_CTL_MODE;
-+
-+typedef struct _LED_8187{
-+ LED_PIN_8187 LedPin; // Identify how to implement this SW led.
-+
-+ LED_STATE_8187 CurrLedState; // Current LED state.
-+ u8 bLedOn; // TRUE if LED is ON, FALSE if LED is OFF.
-+
-+ u8 bLedBlinkInProgress; // TRUE if it is blinking, FALSE o.w..
-+ u32 BlinkTimes; // Number of times to toggle led state for blinking.
-+ LED_STATE_8187 BlinkingLedState; // Next state for blinking, either LED_ON or LED_OFF are.
-+ struct timer_list BlinkTimer; // Timer object for led blinking.
-+} LED_8187, *PLED_8187;
-+
-+
-+
-+/*------------------------Export global variable------------------------------*/
-+
-+
-+/*------------------------------Funciton declaration--------------------------*/
-+void
-+InitSwLeds(
-+ struct net_device *dev
-+ );
-+
-+void
-+DeInitSwLeds(
-+ struct net_device *dev
-+ );
-+
-+void
-+InitLed8187(
-+ struct net_device *dev,
-+ PLED_8187 pLed,
-+ LED_PIN_8187 LedPin,
-+ void * BlinkCallBackFunc);
-+
-+void
-+DeInitLed8187(
-+ struct net_device *dev,
-+ PLED_8187 pLed);
-+
-+void
-+LedControl8187(
-+ struct net_device *dev,
-+ LED_CTL_MODE LedAction
-+);
-+
-+void
-+SwLedControlMode0(
-+ struct net_device *dev,
-+ LED_CTL_MODE LedAction
-+);
-+
-+void
-+SwLedControlMode1(
-+ struct net_device *dev,
-+ LED_CTL_MODE LedAction
-+);
-+
-+void
-+SwLedControlMode2(
-+ struct net_device *dev,
-+ LED_CTL_MODE LedAction
-+);
-+
-+void
-+SwLedControlMode3(
-+ struct net_device *dev,
-+ LED_CTL_MODE LedAction
-+);
-+
-+
-+void
-+SwLedControlMode4(
-+ struct net_device *dev,
-+ LED_CTL_MODE LedAction
-+);
-+
-+
-+void
-+SwLedControlMode5(
-+ struct net_device *dev,
-+ LED_CTL_MODE LedAction
-+);
-+
-+void
-+Gpio0LedBlinkTimerCallback(
-+ unsigned long data
-+ );
-+
-+void
-+SwLed0BlinkTimerCallback(
-+ unsigned long data
-+ );
-+
-+void
-+SwLed1BlinkTimerCallback(
-+ unsigned long data
-+ );
-+
-+void
-+PlatformSwLedBlink(
-+ struct net_device *dev,
-+ PLED_8187 pLed
-+ );
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20)
-+void
-+Gpio0LedWorkItemCallback(
-+ void * Context
-+ );
-+
-+void
-+SwLed0WorkItemCallback(
-+ void * Context
-+ );
-+
-+void
-+SwLed1WorkItemCallback(
-+ void * Context
-+ );
-+#else
-+void
-+Gpio0LedWorkItemCallback(struct work_struct *work);
-+
-+void
-+SwLed0WorkItemCallback(struct work_struct *work);
-+
-+void
-+SwLed1WorkItemCallback(struct work_struct *work);
-+
-+#endif
-+void
-+SwLedBlink(
-+ struct net_device *dev,
-+ PLED_8187 pLed
-+ );
-+
-+void
-+SwLedCm2Blink(
-+ struct net_device *dev,
-+ PLED_8187 pLed
-+ );
-+
-+void
-+SwLedCm4Blink(
-+ struct net_device *dev,
-+ PLED_8187 pLed
-+ );
-+
-+void
-+SwLedOn(
-+ struct net_device *dev,
-+ PLED_8187 pLed
-+);
-+
-+void
-+SwLedOff(
-+ struct net_device *dev,
-+ PLED_8187 pLed
-+);
-+
-+
-+#endif
-diff -Nur linux-2.6.30.5.orig/drivers/net/wireless/rtl8187b/readme linux-2.6.30.5/drivers/net/wireless/rtl8187b/readme
---- linux-2.6.30.5.orig/drivers/net/wireless/rtl8187b/readme 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.30.5/drivers/net/wireless/rtl8187b/readme 2009-08-23 19:01:04.000000000 +0200
-@@ -0,0 +1,124 @@
-+rtl8187 Linux kernel driver
-+Released under the terms of GNU General Public Licence (GPL)
-+Copyright(c) Andrea Merello - 2004,2005
-+
-+Portions of this driver are based on other projects, please see the notes
-+in the source files for detail.
-+A special thanks go to Realtek corp for their support and to David Young
-+------------------------------------------------------------------------------
-+
-+This is an attempt to write somethig that can make rtl8187 usb dongle wifi card
-+on Linux using only opensource stuff.
-+The rtl8225 radio is supported.
-+
-+It's in early development stage so don't expect too much from it
-+(also use it at your own risk!)
-+This should be considered just a fragment of code.. using it on your(any)
-+system is at your own risk! Please note that I never supported the idea to
-+use it in any way, so i cannot be considered responsible in any way for
-+anything deriving by it usage.
-+
-+Anyway for now we have monitor mode and managed mode
-+basically working! This isn't necessary stable, but seems to work..
-+
-+This driver is still under development and very far from perfect. It should work on x86,
-+Other archs are untested..
-+
-+To compile the driver simply run make.
-+
-+The driver contains also the ieee80211.h and ieee80211_crypt.h from the ieee stack.
-+Note that for some reasons this stack is NOT the same that will be included in newer
-+2.6 kernel. I will try to port to this stack as soon as it will have enought features
-+to support 8187 cards.
-+Please note that you will have to make sure the two .h files are the same of the ieee
-+stack.
-+In other words when you download from the CVS this driver and the ieee80211 stack a good
-+idea is to copy the ieee80211.h and ieee80211_crypt.h from the ieee directory to the drv
-+directory
-+
-+Warning during compile are OK
-+
-+To wake up the nic run:
-+
-+ ifconfig <ifacename> up
-+
-+(where <ifacename> is your network device for wlan card).
-+
-+Please note that the default interface name is wlanX.
-+
-+Please note thet this will take several seconds..
-+
-+If you would like to set the interface name to something else you may use the
-+'devname=' module parameter. For example:
-+
-+ insmod r8187.ko ifname=eth%d
-+
-+will set the interface name of this device to something like eth0.
-+
-+Once the nic is up it can be put in a monitor mode by running:
-+
-+ iwconfig <ifacename> mode monitor
-+
-+and channel number may be changed by running:
-+
-+ iwconfig <ifacename> channel XX
-+
-+
-+In monitor mode a choice may be made via iwpriv if the nic should pass packets
-+with bad crc or drop them.
-+
-+To put the nic in managed mode run:
-+
-+ iwconfig <ifacename> mode managed
-+
-+In managed mode there is support for
-+
-+ iwlist scan
-+
-+that should report the currently available networks.
-+Please note that in managed mode channels cannot be changed manually.
-+
-+To associate with a network
-+
-+ iwconfig <ifacename> essid XXXXX
-+
-+where XXXXX is the network essid (name) reported by 'iwlist scan'. Please
-+note that essid is case sensitive.
-+
-+If your network is not broadcasting the ESSID, then you need to specify *also*
-+the AP MAC address
-+
-+ iwconfig <ifacename> ap XX:XX:XX:XX:XX:XX
-+
-+The driver accepts another boolean parameter: hwseqnum
-+If set to 1 it lets the card HW take care of the sequence number of the TXed
-+frames. Altought in managed mode I can't see an important reason to use HW to
-+do that, when we'll start to TX beacons in master (AP) and ad-hoc modes most
-+probably it will be extremely useful (since most probably we will use two HW
-+queues).
-+
-+I'm unsure if it will work correctly on all NICs.. reports are *VERY, VERY* apreciated..
-+
-+
-+ WEP
-+ ===
-+
-+WEP encryption should work. For now it's done by host, not by the nic. Key can be set with:
-+Key can be set with
-+
-+ iwconfig <ifacename> key 12345...
-+
-+WEP is supported via software thanks to the ipw stack.
-+
-+Shared and open authentication are supported
-+
-+ IWPRIV
-+ ======
-+
-+This driver supports some private handlers:
-+-badcrc: let you choose to kill or to pass to the upper layer frames with bad crc in monitor mode
-+-activescan: if 0 the driver will avoid to send probe requests, sanning will be only on beacon basis
-+
-+
-+If you have some question/comments please feel free to write me.
-+
-diff -Nur linux-2.6.30.5.orig/drivers/platform/Kconfig linux-2.6.30.5/drivers/platform/Kconfig
---- linux-2.6.30.5.orig/drivers/platform/Kconfig 2009-08-16 23:19:38.000000000 +0200
-+++ linux-2.6.30.5/drivers/platform/Kconfig 2009-08-23 19:01:04.000000000 +0200
-@@ -3,3 +3,7 @@
- if X86
- source "drivers/platform/x86/Kconfig"
- endif
-+
-+if MACH_LOONGSON
-+source "drivers/platform/loongson/Kconfig"
-+endif
-diff -Nur linux-2.6.30.5.orig/drivers/platform/loongson/ec_kb3310b/ec_bat.c linux-2.6.30.5/drivers/platform/loongson/ec_kb3310b/ec_bat.c
---- linux-2.6.30.5.orig/drivers/platform/loongson/ec_kb3310b/ec_bat.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.30.5/drivers/platform/loongson/ec_kb3310b/ec_bat.c 2009-08-23 19:01:04.000000000 +0200
-@@ -0,0 +1,388 @@
-+/*
-+ * EC(Embedded Controller) KB3310B battery management driver on Linux
-+ *
-+ * Author: liujl <liujl@lemote.com>
-+ * Date : 2008-03-17
-+ *
-+ * NOTE: The SDA0/SCL0 in KB3310B are used to communicate with the battery
-+ * IC, Here we use DS2786 IC to handle the battery management. All the
-+ * resources for handle battery management in KB3310B are:
-+ * 1, one SMBus interface with port 0
-+ * 2, gpio40 output for charge enable
-+ */
-+
-+#include <linux/module.h>
-+#include <linux/poll.h>
-+#include <linux/proc_fs.h>
-+#include <linux/miscdevice.h>
-+#include <linux/capability.h>
-+#include <linux/sched.h>
-+#include <linux/device.h>
-+#include <linux/kernel.h>
-+#include <linux/list.h>
-+#include <linux/init.h>
-+#include <linux/completion.h>
-+#include <linux/kthread.h>
-+#include <linux/delay.h>
-+#include <linux/timer.h>
-+
-+#include <asm/delay.h>
-+
-+#include "ec.h"
-+#include "ec_misc_fn.h"
-+
-+#ifndef APM_32_BIT_SUPPORT
-+#define APM_32_BIT_SUPPORT 0x0002
-+#endif
-+
-+/* The EC Battery device, here is his minor number. */
-+#define ECBAT_MINOR_DEV MISC_DYNAMIC_MINOR
-+
-+/*
-+ * apm threshold : percent unit.
-+ */
-+#define BAT_MAX_THRESHOLD 99
-+#define BAT_MIN_THRESHOLD 5
-+
-+/*
-+ * This structure gets filled in by the machine specific 'get_power_status'
-+ * implementation. Any fields which are not set default to a safe value.
-+ */
-+struct apm_pwr_info {
-+ unsigned char ac_line_status;
-+#define APM_AC_OFFLINE 0
-+#define APM_AC_ONLINE 1
-+#define APM_AC_BACKUP 2
-+#define APM_AC_UNKNOWN 0xff
-+
-+ unsigned char battery_status;
-+#define APM_BATTERY_STATUS_HIGH 0
-+#define APM_BATTERY_STATUS_LOW 1
-+#define APM_BATTERY_STATUS_CRITICAL 2
-+#define APM_BATTERY_STATUS_CHARGING 3
-+#define APM_BATTERY_STATUS_NOT_PRESENT 4
-+#define APM_BATTERY_STATUS_UNKNOWN 0xff
-+
-+ unsigned char battery_flag;
-+#define APM_BATTERY_FLAG_HIGH (1 << 0)
-+#define APM_BATTERY_FLAG_LOW (1 << 1)
-+#define APM_BATTERY_FLAG_CRITICAL (1 << 2)
-+#define APM_BATTERY_FLAG_CHARGING (1 << 3)
-+#define APM_BATTERY_FLAG_NOT_PRESENT (1 << 7)
-+#define APM_BATTERY_FLAG_UNKNOWN 0xff
-+
-+ int battery_life;
-+ int time;
-+ int units;
-+#define APM_UNITS_MINS 0
-+#define APM_UNITS_SECS 1
-+#define APM_UNITS_UNKNOWN -1
-+
-+ /* battery designed capacity */
-+ unsigned int bat_design_cap;
-+ /* battery designed voltage */
-+ unsigned int bat_design_vol;
-+ /* battery capacity after full charged */
-+ unsigned int bat_full_charged_cap;
-+ /* battery vendor number */
-+ unsigned char bat_vendor;
-+ /* battery cell count */
-+ unsigned char bat_cell_count;
-+
-+ /* battery dynamic charge/discharge voltage */
-+ unsigned int bat_voltage;
-+ /* battery dynamic charge/discharge current */
-+ int bat_current;
-+ /* battery current temperature */
-+ unsigned int bat_temperature;
-+};
-+
-+static struct task_struct *battery_tsk;
-+
-+static DEFINE_MUTEX(bat_info_lock);
-+struct bat_info {
-+ unsigned int ac_in;
-+ unsigned int bat_in;
-+ unsigned int bat_flag;
-+ /* we use capacity for caculating the life and time */
-+ unsigned int curr_bat_cap;
-+
-+ /* battery designed capacity */
-+ unsigned int bat_design_cap;
-+ /* battery designed voltage */
-+ unsigned int bat_design_vol;
-+ /* battery capacity after full charged */
-+ unsigned int bat_full_charged_cap;
-+ /* battery vendor number */
-+ unsigned char bat_vendor;
-+ /* battery cell count */
-+ unsigned char bat_cell_count;
-+
-+ /* battery dynamic charge/discharge voltage */
-+ unsigned int bat_voltage;
-+ /* battery dynamic charge/discharge current */
-+ int bat_current;
-+ /* battery current temperature */
-+ unsigned int bat_temperature;
-+} bat_info = {
-+ .ac_in = APM_AC_UNKNOWN,
-+ .bat_in = APM_BATTERY_STATUS_UNKNOWN,
-+ .curr_bat_cap = 0,
-+ /* fixed value */
-+ .bat_design_cap = 0,
-+ .bat_full_charged_cap = 0,
-+ .bat_design_vol = 0,
-+ .bat_vendor = 0,
-+ .bat_cell_count = 0,
-+ /* rest variable */
-+ .bat_voltage = 0,
-+ .bat_current = 0,
-+ .bat_temperature = 0
-+};
-+
-+/*
-+ * 1.4 :
-+ * 1, 89inch basic work version.
-+ * 2, you should set xorg.conf ServerFlag of "NoPM" to true
-+ * 1.5 :
-+ * 1, bat_flag is added to struct bat_info.
-+ * 2, BAT_MIN_THRESHOLD is changed to 5%.
-+ */
-+static const char driver_version[] = VERSION; /* no spaces */
-+
-+static struct miscdevice apm_device = {
-+ .minor = ECBAT_MINOR_DEV,
-+ .name = "apm_bios",
-+ .fops = NULL
-+};
-+
-+#ifdef CONFIG_PROC_FS
-+static int bat_proc_read(char *page, char **start, off_t off, int count,
-+ int *eof, void *data);
-+static struct proc_dir_entry *bat_proc_entry;
-+
-+static int bat_proc_read(char *page, char **start, off_t off, int count,
-+ int *eof, void *data)
-+{
-+ struct apm_pwr_info info;
-+ char *units;
-+ int ret;
-+
-+ mutex_lock(&bat_info_lock);
-+ info.battery_life = bat_info.curr_bat_cap;
-+ info.ac_line_status = bat_info.ac_in;
-+ info.battery_status = bat_info.bat_in;
-+ info.battery_flag = bat_info.bat_flag;
-+ info.bat_voltage = bat_info.bat_voltage;
-+ if (bat_info.bat_current & 0x8000)
-+ info.bat_current = 0xffff - bat_info.bat_current;
-+ else
-+ info.bat_current = bat_info.bat_current;
-+ info.bat_temperature = bat_info.bat_temperature;
-+
-+ /* this should be charged according to the capacity-time flow. */
-+ if (info.battery_status != APM_BATTERY_STATUS_NOT_PRESENT)
-+ info.time = ((bat_info.curr_bat_cap - 3) * 54 + 142) / 60;
-+ else
-+ info.time = 0x00;
-+ info.units = APM_UNITS_MINS;
-+
-+ mutex_unlock(&bat_info_lock);
-+ switch (info.units) {
-+ default:
-+ units = "?";
-+ break;
-+ case 0:
-+ units = "min";
-+ break;
-+ case 1:
-+ units = "sec";
-+ break;
-+ }
-+
-+ ret =
-+ sprintf(page,
-+ "%s 1.2 0x%02x 0x%02x 0x%02x 0x%02x %d%% %d %s %dmV %dmA %d\n",
-+ driver_version, APM_32_BIT_SUPPORT, info.ac_line_status,
-+ info.battery_status, info.battery_flag, info.battery_life,
-+ info.time, units, info.bat_voltage, info.bat_current,
-+ info.bat_temperature);
-+
-+ ret -= off;
-+ if (ret < off + count)
-+ *eof = 1;
-+ *start = page + off;
-+ if (ret > count)
-+ ret = count;
-+ if (ret < 0)
-+ ret = 0;
-+
-+ return ret;
-+}
-+#endif
-+
-+static int battery_manager(void *arg)
-+{
-+ unsigned char bat_charge;
-+ unsigned char power_flag;
-+ unsigned char bat_status;
-+ unsigned char charge_status;
-+
-+ /* read out the fixed value */
-+ bat_info.bat_design_cap = (ec_read(REG_BAT_DESIGN_CAP_HIGH) << 8)
-+ | ec_read(REG_BAT_DESIGN_CAP_LOW);
-+ bat_info.bat_full_charged_cap = (ec_read(REG_BAT_FULLCHG_CAP_HIGH) << 8)
-+ | ec_read(REG_BAT_FULLCHG_CAP_LOW);
-+ bat_info.bat_design_vol = (ec_read(REG_BAT_DESIGN_VOL_HIGH) << 8)
-+ | ec_read(REG_BAT_DESIGN_VOL_LOW);
-+ bat_info.bat_vendor = ec_read(REG_BAT_VENDOR);
-+ bat_info.bat_cell_count = ec_read(REG_BAT_CELL_COUNT);
-+ if (bat_info.bat_vendor != 0) {
-+ printk(KERN_INFO
-+ "battery vendor(%s), cells count(%d), "
-+ "with designed capacity(%d),designed voltage(%d),"
-+ " full charged capacity(%d)\n",
-+ (bat_info.bat_vendor ==
-+ FLAG_BAT_VENDOR_SANYO) ? "SANYO" : "SIMPLO",
-+ (bat_info.bat_cell_count == FLAG_BAT_CELL_3S1P) ? 3 : 6,
-+ bat_info.bat_design_cap, bat_info.bat_design_vol,
-+ bat_info.bat_full_charged_cap);
-+ }
-+
-+ PRINTK_DBG(KERN_DEBUG "Battery manager thread started.\n");
-+ while (1) {
-+ set_current_state(TASK_INTERRUPTIBLE);
-+ /* schedule every 1s, it is better for changed to 1s. */
-+ schedule_timeout(HZ * 1);
-+
-+ if (kthread_should_stop())
-+ break;
-+
-+ mutex_lock(&bat_info_lock);
-+
-+ bat_charge = ec_read(REG_BAT_CHARGE);
-+ power_flag = ec_read(REG_BAT_POWER);
-+ bat_status = ec_read(REG_BAT_STATUS);
-+ charge_status = ec_read(REG_BAT_CHARGE_STATUS);
-+ bat_info.bat_voltage =
-+ (ec_read(REG_BAT_VOLTAGE_HIGH) << 8) |
-+ (ec_read(REG_BAT_VOLTAGE_LOW));
-+ bat_info.bat_current =
-+ (ec_read(REG_BAT_CURRENT_HIGH) << 8) |
-+ (ec_read(REG_BAT_CURRENT_LOW));
-+ bat_info.bat_temperature =
-+ (ec_read(REG_BAT_TEMPERATURE_HIGH) << 8) |
-+ (ec_read(REG_BAT_TEMPERATURE_LOW));
-+ bat_info.curr_bat_cap =
-+ (ec_read(REG_BAT_RELATIVE_CAP_HIGH) << 8) |
-+ (ec_read(REG_BAT_RELATIVE_CAP_LOW));
-+
-+ bat_info.ac_in =
-+ (power_flag & BIT_BAT_POWER_ACIN) ? APM_AC_ONLINE :
-+ APM_AC_OFFLINE;
-+ if (!(bat_status & BIT_BAT_STATUS_IN)) {
-+ /* there is no battery inserted */
-+ bat_info.bat_in = APM_BATTERY_STATUS_NOT_PRESENT;
-+ bat_info.bat_flag = APM_BATTERY_FLAG_NOT_PRESENT;
-+ } else {
-+ /* there is adapter inserted */
-+ if (bat_info.ac_in == APM_AC_ONLINE) {
-+ /* if the battery is not fully charged */
-+ if (!(bat_status & BIT_BAT_STATUS_FULL)) {
-+ bat_info.bat_in =
-+ APM_BATTERY_STATUS_CHARGING;
-+ bat_info.bat_flag =
-+ APM_BATTERY_FLAG_CHARGING;
-+ } else {
-+ /* if the battery is fully charged */
-+ bat_info.bat_in =
-+ APM_BATTERY_STATUS_HIGH;
-+ bat_info.bat_flag =
-+ APM_BATTERY_FLAG_HIGH;
-+ bat_info.curr_bat_cap = 100;
-+ }
-+ } else {
-+ /* if the battery is too low */
-+ if (bat_status & BIT_BAT_STATUS_LOW) {
-+ bat_info.bat_in =
-+ APM_BATTERY_STATUS_LOW;
-+ bat_info.bat_flag =
-+ APM_BATTERY_FLAG_LOW;
-+ if (bat_info.curr_bat_cap <=
-+ BAT_MIN_THRESHOLD) {
-+ bat_info.bat_in =
-+ APM_BATTERY_STATUS_CRITICAL;
-+ bat_info.bat_flag =
-+ APM_BATTERY_FLAG_CRITICAL;
-+ }
-+ /* we should power off the system now */
-+ } else {
-+ /* assume the battery is high enough. */
-+ bat_info.bat_in =
-+ APM_BATTERY_STATUS_HIGH;
-+ bat_info.bat_flag =
-+ APM_BATTERY_FLAG_HIGH;
-+ }
-+ }
-+ }
-+ mutex_unlock(&bat_info_lock);
-+ }
-+
-+ PRINTK_DBG(KERN_DEBUG "Battery Management thread exit.\n");
-+ return 0;
-+}
-+
-+static int __init apm_init(void)
-+{
-+ int ret;
-+
-+ printk(KERN_ERR
-+ "APM of battery on KB3310B Embedded Controller init.\n");
-+
-+ battery_tsk = kthread_create(battery_manager, NULL, "battery_manager");
-+ if (IS_ERR(battery_tsk)) {
-+ ret = PTR_ERR(battery_tsk);
-+ kthread_stop(battery_tsk);
-+ battery_tsk = NULL;
-+ printk(KERN_ERR "ecbat : battery management error.\n");
-+ return ret;
-+ }
-+ battery_tsk->flags |= PF_NOFREEZE;
-+ wake_up_process(battery_tsk);
-+
-+#ifdef CONFIG_PROC_FS
-+ bat_proc_entry = NULL;
-+ bat_proc_entry = create_proc_entry("apm", S_IWUSR | S_IRUGO, NULL);
-+ if (bat_proc_entry == NULL) {
-+ printk(KERN_ERR "EC BAT : register /proc/apm failed.\n");
-+ return -EINVAL;
-+ }
-+ bat_proc_entry->read_proc = bat_proc_read;
-+ bat_proc_entry->write_proc = NULL;
-+ bat_proc_entry->data = NULL;
-+#endif
-+
-+ ret = misc_register(&apm_device);
-+ if (ret != 0) {
-+ remove_proc_entry("apm", NULL);
-+ kthread_stop(battery_tsk);
-+ printk(KERN_ERR "ecbat : misc register error.\n");
-+ }
-+ return ret;
-+}
-+
-+static void __exit apm_exit(void)
-+{
-+ misc_deregister(&apm_device);
-+#ifdef CONFIG_PROC_FS
-+ remove_proc_entry("apm", NULL);
-+#endif
-+ kthread_stop(battery_tsk);
-+}
-+
-+module_init(apm_init);
-+module_exit(apm_exit);
-+
-+MODULE_AUTHOR("liujl <liujl@lemote.com>");
-+MODULE_DESCRIPTION("Advanced Power Management For Kb3310");
-+MODULE_LICENSE("GPL");
-diff -Nur linux-2.6.30.5.orig/drivers/platform/loongson/ec_kb3310b/ec_ft.c linux-2.6.30.5/drivers/platform/loongson/ec_kb3310b/ec_ft.c
---- linux-2.6.30.5.orig/drivers/platform/loongson/ec_kb3310b/ec_ft.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.30.5/drivers/platform/loongson/ec_kb3310b/ec_ft.c 2009-08-23 19:01:04.000000000 +0200
-@@ -0,0 +1,216 @@
-+/*
-+ * EC(Embedded Controller) KB3310B Fan and Temperature management driver on
-+ * Linux
-+ *
-+ * Author: liujl <liujl@lemote.com>
-+ * Date : 2008-06-23
-+ *
-+ * NOTE: The SDA1/SCL1 in KB3310B are used to communicate with the
-+ * Temperature IC, Here we use ADT75 IC to handle the temperature management.
-+ * and the Fan is controller by ADT75AZ, but the status is reflected to the
-+ * KB3310 FANFB All the resources for handle battery management in KB3310B:
-+ * 1, one SMBus interface with port 1
-+ * 2, gpio14 input alternate for FANFB
-+ */
-+
-+#include <linux/module.h>
-+#include <linux/poll.h>
-+#include <linux/slab.h>
-+#include <linux/proc_fs.h>
-+#include <linux/miscdevice.h>
-+#include <linux/capability.h>
-+#include <linux/sched.h>
-+#include <linux/device.h>
-+#include <linux/kernel.h>
-+#include <linux/list.h>
-+#include <linux/init.h>
-+#include <linux/completion.h>
-+#include <linux/kthread.h>
-+#include <linux/delay.h>
-+#include <linux/timer.h>
-+#include <asm/delay.h>
-+
-+#include "ec.h"
-+#include "ec_misc_fn.h"
-+
-+#define EC_FT_DEV "ft"
-+/* The EC Battery device is one of the misc device, here is his minor number. */
-+#define ECFT_MINOR_DEV MISC_DYNAMIC_MINOR
-+#define PROC_FT_DIR "ft"
-+
-+static struct task_struct *ft_tsk;
-+static DEFINE_MUTEX(ft_info_lock);
-+
-+/* driver version */
-+static const char driver_version[] = VERSION;
-+
-+/* fan speed divider */
-+#define FAN_SPEED_DIVIDER 480000 /* (60*1000*1000/62.5/2)*/
-+
-+/* fan status : on or off */
-+#define FAN_STATUS_ON 0x01
-+#define FAN_STATUS_OFF 0x00
-+/* fan is not running */
-+#define FAN_SPEED_NONE 0x00
-+/* temperature negative or positive */
-+#define TEMPERATURE_POSITIVE 0x00
-+#define TEMPERATURE_NEGATIVE 0x01
-+/* temperature value is zero */
-+#define TEMPERATURE_NONE 0x00
-+struct ft_info {
-+ u8 fan_on;
-+ u16 fan_speed;
-+ u8 temperature_pn;
-+ u8 temperature;
-+} ft_info = {
-+ .fan_on = FAN_STATUS_ON,
-+ .fan_speed = FAN_SPEED_NONE,
-+ .temperature_pn = TEMPERATURE_POSITIVE,
-+ .temperature = TEMPERATURE_NONE
-+};
-+
-+static struct miscdevice ft_device = {
-+ .minor = ECFT_MINOR_DEV,
-+ .name = EC_FT_DEV,
-+ .fops = NULL
-+};
-+
-+#ifdef CONFIG_PROC_FS
-+static int ft_proc_read(char *page, char **start, off_t off, int count,
-+ int *eof, void *data);
-+static struct proc_dir_entry *ft_proc_entry;
-+
-+static int ft_proc_read(char *page, char **start, off_t off, int count,
-+ int *eof, void *data)
-+{
-+ struct ft_info info;
-+ int ret;
-+
-+ mutex_lock(&ft_info_lock);
-+ info.fan_on = ft_info.fan_on;
-+ if (info.fan_on == FAN_STATUS_ON)
-+ info.fan_speed = ft_info.fan_speed;
-+ else
-+ info.fan_speed = 0x00;
-+ info.temperature_pn = ft_info.temperature_pn;
-+ info.temperature = ft_info.temperature;
-+ mutex_unlock(&ft_info_lock);
-+
-+ ret =
-+ sprintf(page, "%s 0x%02x %d 0x%02x %d\n", driver_version,
-+ info.fan_on, info.fan_speed, info.temperature_pn,
-+ info.temperature);
-+
-+ ret -= off;
-+ if (ret < off + count)
-+ *eof = 1;
-+
-+ *start = page + off;
-+ if (ret > count)
-+ ret = count;
-+ if (ret < 0)
-+ ret = 0;
-+
-+ return ret;
-+}
-+#endif
-+
-+static int ft_manager(void *arg)
-+{
-+ u8 val, reg_val;
-+
-+ PRINTK_DBG(KERN_DEBUG "Fan & Temperature Management thread started.\n");
-+ while (1) {
-+ set_current_state(TASK_INTERRUPTIBLE);
-+ /* schedule every 1s */
-+ schedule_timeout(HZ); /* 1s */
-+
-+ if (kthread_should_stop())
-+ break;
-+
-+ mutex_lock(&ft_info_lock);
-+
-+ val = ec_read(REG_FAN_STATUS);
-+ ft_info.fan_speed =
-+ FAN_SPEED_DIVIDER /
-+ (((ec_read(REG_FAN_SPEED_HIGH) & 0x0f) << 8) |
-+ ec_read(REG_FAN_SPEED_LOW));
-+ reg_val = ec_read(REG_TEMPERATURE_VALUE);
-+
-+ if (val)
-+ ft_info.fan_on = FAN_STATUS_ON;
-+ else
-+ ft_info.fan_on = FAN_STATUS_OFF;
-+
-+ if (reg_val & (1 << 7)) {
-+ ft_info.temperature = (reg_val & 0x7f) - 128;
-+ ft_info.temperature_pn = TEMPERATURE_NEGATIVE;
-+ } else {
-+ ft_info.temperature = (reg_val & 0xff);
-+ ft_info.temperature_pn = TEMPERATURE_POSITIVE;
-+ }
-+ mutex_unlock(&ft_info_lock);
-+ }
-+
-+ PRINTK_DBG(KERN_DEBUG "Fan and Temperature Management thread exit.\n");
-+
-+ return 0;
-+
-+}
-+
-+static int __init ft_init(void)
-+{
-+ int ret;
-+
-+ printk(KERN_INFO
-+ "Fan and Temperature on KB3310B Embedded Controller init.\n");
-+ ft_tsk = kthread_create(ft_manager, NULL, "ft_manager");
-+ if (IS_ERR(ft_tsk)) {
-+ ret = PTR_ERR(ft_tsk);
-+ kthread_stop(ft_tsk);
-+ ft_tsk = NULL;
-+ printk(KERN_ERR "ecft : ft management error.\n");
-+ return ret;
-+ }
-+ ft_tsk->flags |= PF_NOFREEZE;
-+ wake_up_process(ft_tsk);
-+
-+#ifdef CONFIG_PROC_FS
-+ ft_proc_entry = NULL;
-+ ft_proc_entry = create_proc_entry(EC_FT_DEV, S_IWUSR | S_IRUGO, NULL);
-+ if (ft_proc_entry == NULL) {
-+ printk(KERN_ERR "EC FT : register /proc/ft failed.\n");
-+ return -EINVAL;
-+ }
-+ ft_proc_entry->read_proc = ft_proc_read;
-+ ft_proc_entry->write_proc = NULL;
-+ ft_proc_entry->data = NULL;
-+#endif
-+
-+ ret = misc_register(&ft_device);
-+ if (ret != 0) {
-+#ifdef CONFIG_PROC_FS
-+ remove_proc_entry(EC_FT_DEV, NULL);
-+#endif
-+ kthread_stop(ft_tsk);
-+ printk(KERN_ERR "ecft : fan&temperature register error.\n");
-+ }
-+
-+ return ret;
-+}
-+
-+static void __exit ft_exit(void)
-+{
-+ misc_deregister(&ft_device);
-+#ifdef CONFIG_PROC_FS
-+ remove_proc_entry(EC_FT_DEV, NULL);
-+#endif
-+ kthread_stop(ft_tsk);
-+}
-+
-+module_init(ft_init);
-+module_exit(ft_exit);
-+
-+MODULE_AUTHOR("liujl <liujl@lemote.com>");
-+MODULE_DESCRIPTION("Advanced Fan and Temperature Management For Kb3310");
-+MODULE_LICENSE("GPL");
-diff -Nur linux-2.6.30.5.orig/drivers/platform/loongson/ec_kb3310b/ec.h linux-2.6.30.5/drivers/platform/loongson/ec_kb3310b/ec.h
---- linux-2.6.30.5.orig/drivers/platform/loongson/ec_kb3310b/ec.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.30.5/drivers/platform/loongson/ec_kb3310b/ec.h 2009-08-23 19:01:04.000000000 +0200
-@@ -0,0 +1,218 @@
-+/*
-+ * EC(Embedded Controller) KB3310B misc device driver header for Linux
-+ * Author: liujl <liujl@lemote.com>
-+ * Date : 2008-03-14
-+ *
-+ * EC relative header file. All the EC registers should be defined here.
-+ */
-+
-+#include <asm/uaccess.h>
-+#include <asm/io.h>
-+#include <asm/system.h>
-+
-+#define VERSION "1.37"
-+
-+/*
-+ * The following registers are determined by the EC index configuration.
-+ * 1, fill the PORT_HIGH as EC register high part.
-+ * 2, fill the PORT_LOW as EC register low part.
-+ * 3, fill the PORT_DATA as EC register write data or get the data from it.
-+ */
-+#define EC_IO_PORT_HIGH 0x0381
-+#define EC_IO_PORT_LOW 0x0382
-+#define EC_IO_PORT_DATA 0x0383
-+
-+/* ec registers range */
-+#define EC_MAX_REGADDR 0xFFFF
-+#define EC_MIN_REGADDR 0xF000
-+/* #define EC_RAM_ADDR 0xF400 */
-+#define EC_RAM_ADDR 0xF800
-+
-+/* temperature & fan registers */
-+#define REG_TEMPERATURE_VALUE 0xF458 /* current temperature value */
-+#define REG_FAN_CONTROL 0xF4D2 /* fan control */
-+#define BIT_FAN_CONTROL_ON (1 << 0)
-+#define BIT_FAN_CONTROL_OFF (0 << 0)
-+#define REG_FAN_STATUS 0xF4DA /* fan status */
-+#define BIT_FAN_STATUS_ON (1 << 0)
-+#define BIT_FAN_STATUS_OFF (0 << 0)
-+#define REG_FAN_SPEED_HIGH 0xFE22 /* fan speed high byte */
-+#define REG_FAN_SPEED_LOW 0xFE23 /* fan speed low byte */
-+#define REG_FAN_SPEED_LEVEL 0xF4E4 /* fan speed level, from 1 to 5 */
-+
-+/* battery registers */
-+#define REG_BAT_DESIGN_CAP_HIGH 0xF77D /* design capacity high byte */
-+#define REG_BAT_DESIGN_CAP_LOW 0xF77E /* design capacity low byte */
-+#define REG_BAT_FULLCHG_CAP_HIGH 0xF780 /* full charged capacity high byte */
-+#define REG_BAT_FULLCHG_CAP_LOW 0xF781 /* full charged capacity low byte */
-+#define REG_BAT_DESIGN_VOL_HIGH 0xF782 /* design voltage high byte */
-+#define REG_BAT_DESIGN_VOL_LOW 0xF783 /* design voltage low byte */
-+#define REG_BAT_CURRENT_HIGH 0xF784 /* battery in/out current high byte */
-+#define REG_BAT_CURRENT_LOW 0xF785 /* battery in/out current low byte */
-+#define REG_BAT_VOLTAGE_HIGH 0xF786 /* battery current voltage high byte */
-+#define REG_BAT_VOLTAGE_LOW 0xF787 /* battery current voltage low byte */
-+#define REG_BAT_TEMPERATURE_HIGH 0xF788 /* battery current temperature high byte */
-+#define REG_BAT_TEMPERATURE_LOW 0xF789 /* battery current temperature low byte */
-+#define REG_BAT_RELATIVE_CAP_HIGH 0xF492 /* relative capacity high byte */
-+#define REG_BAT_RELATIVE_CAP_LOW 0xF493 /* relative capacity low byte */
-+#define REG_BAT_VENDOR 0xF4C4 /* battery vendor number */
-+#define FLAG_BAT_VENDOR_SANYO 0x01
-+#define FLAG_BAT_VENDOR_SIMPLO 0x02
-+#define REG_BAT_CELL_COUNT 0xF4C6 /* how many cells in one battery */
-+#define FLAG_BAT_CELL_3S1P 0x03
-+#define FLAG_BAT_CELL_3S2P 0x06
-+#define REG_BAT_CHARGE 0xF4A2 /* macroscope battery charging */
-+#define FLAG_BAT_CHARGE_DISCHARGE 0x01
-+#define FLAG_BAT_CHARGE_CHARGE 0x02
-+#define FLAG_BAT_CHARGE_ACPOWER 0x00
-+#define REG_BAT_STATUS 0xF4B0
-+#define BIT_BAT_STATUS_LOW (1 << 5)
-+#define BIT_BAT_STATUS_DESTROY (1 << 2)
-+#define BIT_BAT_STATUS_FULL (1 << 1)
-+#define BIT_BAT_STATUS_IN (1 << 0)
-+#define REG_BAT_CHARGE_STATUS 0xF4B1
-+#define BIT_BAT_CHARGE_STATUS_OVERTEMP (1 << 2) /* over temperature */
-+#define BIT_BAT_CHARGE_STATUS_PRECHG (1 << 1) /* pre-charge the battery */
-+#define REG_BAT_STATE 0xF482
-+#define BIT_BAT_STATE_CHARGING (1 << 1)
-+#define BIT_BAT_STATE_DISCHARGING (1 << 0)
-+#define REG_BAT_POWER 0xF440
-+#define BIT_BAT_POWER_S3 (1 << 2) /* enter s3 standby mode */
-+#define BIT_BAT_POWER_ON (1 << 1) /* system is on */
-+#define BIT_BAT_POWER_ACIN (1 << 0) /* adapter is inserted */
-+
-+/* other registers */
-+#define REG_AUDIO_MUTE 0xF4E7 /* audio mute : rd/wr */
-+#define BIT_AUDIO_MUTE_ON (1 << 0)
-+#define BIT_AUDIO_MUTE_OFF (0 << 0)
-+#define REG_AUDIO_BEEP 0xF4D0 /* audio beep and reset : rd/wr */
-+#define BIT_AUDIO_BEEP_ON (1 << 0)
-+#define BIT_AUDIO_BEEP_OFF (0 << 0)
-+#define REG_USB0_FLAG 0xF461 /* usb0 port power or not : rd/wr */
-+#define BIT_USB0_FLAG_ON (1 << 0)
-+#define BIT_USB0_FLAG_OFF (0 << 0)
-+#define REG_USB1_FLAG 0xF462 /* usb1 port power or not : rd/wr */
-+#define BIT_USB1_FLAG_ON (1 << 0)
-+#define BIT_USB1_FLAG_OFF (0 << 0)
-+#define REG_USB2_FLAG 0xF463 /* usb2 port power or not : rd/wr */
-+#define BIT_USB2_FLAG_ON (1 << 0)
-+#define BIT_USB2_FLAG_OFF (0 << 0)
-+#define REG_CRT_DETECT 0xF4AD /* detected CRT exist or not */
-+#define BIT_CRT_DETECT_PLUG (1 << 0)
-+#define BIT_CRT_DETECT_UNPLUG (0 << 0)
-+#define REG_LID_DETECT 0xF4BD /* detected LID is on or not */
-+#define BIT_LID_DETECT_ON (1 << 0)
-+#define BIT_LID_DETECT_OFF (0 << 0)
-+#define REG_RESET 0xF4EC /* reset the machine auto-clear : rd/wr */
-+#define BIT_RESET_ON (1 << 0)
-+#define BIT_RESET_OFF (0 << 0)
-+#define REG_LED 0xF4C8 /* light the led : rd/wr */
-+#define BIT_LED_RED_POWER (1 << 0)
-+#define BIT_LED_ORANGE_POWER (1 << 1)
-+#define BIT_LED_GREEN_CHARGE (1 << 2)
-+#define BIT_LED_RED_CHARGE (1 << 3)
-+#define BIT_LED_NUMLOCK (1 << 4)
-+#define REG_LED_TEST 0xF4C2 /* test led mode, all led on or off */
-+#define BIT_LED_TEST_IN (1 << 0)
-+#define BIT_LED_TEST_OUT (0 << 0)
-+#define REG_DISPLAY_BRIGHTNESS 0xF4F5 /* 9 stages LCD backlight brightness adjust */
-+#define FLAG_DISPLAY_BRIGHTNESS_LEVEL_0 0
-+#define FLAG_DISPLAY_BRIGHTNESS_LEVEL_1 1
-+#define FLAG_DISPLAY_BRIGHTNESS_LEVEL_2 2
-+#define FLAG_DISPLAY_BRIGHTNESS_LEVEL_3 3
-+#define FLAG_DISPLAY_BRIGHTNESS_LEVEL_4 4
-+#define FLAG_DISPLAY_BRIGHTNESS_LEVEL_5 5
-+#define FLAG_DISPLAY_BRIGHTNESS_LEVEL_6 6
-+#define FLAG_DISPLAY_BRIGHTNESS_LEVEL_7 7
-+#define FLAG_DISPLAY_BRIGHTNESS_LEVEL_8 8
-+#define REG_CAMERA_STATUS 0xF46A /* camera is in ON/OFF status. */
-+#define BIT_CAMERA_STATUS_ON (1 << 0)
-+#define BIT_CAMERA_STATUS_OFF (0 << 0)
-+#define REG_CAMERA_CONTROL 0xF7B7 /* control camera to ON/OFF. */
-+#define BIT_CAMERA_CONTROL_OFF (1 << 1)
-+#define BIT_CAMERA_CONTROL_ON (1 << 1)
-+#define REG_AUDIO_VOLUME 0xF46C /* The register to show volume level */
-+#define FLAG_AUDIO_VOLUME_LEVEL_0 0
-+#define FLAG_AUDIO_VOLUME_LEVEL_1 1
-+#define FLAG_AUDIO_VOLUME_LEVEL_2 2
-+#define FLAG_AUDIO_VOLUME_LEVEL_3 3
-+#define FLAG_AUDIO_VOLUME_LEVEL_4 4
-+#define FLAG_AUDIO_VOLUME_LEVEL_5 5
-+#define FLAG_AUDIO_VOLUME_LEVEL_6 6
-+#define FLAG_AUDIO_VOLUME_LEVEL_7 7
-+#define FLAG_AUDIO_VOLUME_LEVEL_8 8
-+#define FLAG_AUDIO_VOLUME_LEVEL_9 9
-+#define FLAG_AUDIO_VOLUME_LEVEL_10 0x0A
-+#define REG_WLAN_STATUS 0xF4FA /* Wlan Status */
-+#define BIT_WLAN_STATUS_ON (1 << 0)
-+#define BIT_WLAN_STATUS_OFF (0 << 0)
-+#define REG_DISPLAY_LCD 0xF79F /* Black screen Status */
-+#define BIT_DISPLAY_LCD_ON (1 << 0)
-+#define BIT_DISPLAY_LCD_OFF (0 << 0)
-+#define REG_BACKLIGHT_CTRL 0xF7BD /* LCD backlight control: off/restore */
-+#define BIT_BACKLIGHT_ON (1 << 0)
-+#define BIT_BACKLIGHT_OFF (0 << 0)
-+
-+/* SCI Event Number from EC */
-+#define SCI_EVENT_NUM_LID 0x23 /* press the lid or not */
-+#define SCI_EVENT_NUM_DISPLAY_TOGGLE 0x24 /* Fn+F3 for display switch */
-+#define SCI_EVENT_NUM_SLEEP 0x25 /* Fn+F1 for entering sleep mode */
-+#define SCI_EVENT_NUM_OVERTEMP 0x26 /* Over-temperature happened */
-+#define SCI_EVENT_NUM_CRT_DETECT 0x27 /* CRT is connected */
-+#define SCI_EVENT_NUM_CAMERA 0x28 /* Camera is on or off */
-+#define SCI_EVENT_NUM_USB_OC2 0x29 /* USB2 Over Current occurred */
-+#define SCI_EVENT_NUM_USB_OC0 0x2A /* USB0 Over Current occurred */
-+#define SCI_EVENT_NUM_AC_BAT 0x2E /* ac & battery relative issue */
-+#define BIT_AC_BAT_BAT_IN 0
-+#define BIT_AC_BAT_AC_IN 1
-+#define BIT_AC_BAT_INIT_CAP 2
-+#define BIT_AC_BAT_CHARGE_MODE 3
-+#define BIT_AC_BAT_STOP_CHARGE 4
-+#define BIT_AC_BAT_BAT_LOW 5
-+#define BIT_AC_BAT_BAT_FULL 6
-+#define SCI_EVENT_NUM_DISPLAY_BRIGHTNESS 0x2D /* LCD backlight brightness adjust */
-+#define SCI_EVENT_NUM_AUDIO_VOLUME 0x2F /* Volume adjust */
-+#define SCI_EVENT_NUM_WLAN 0x30 /* Wlan is on or off */
-+#define SCI_EVENT_NUM_AUDIO_MUTE 0x2C /* Mute is on or off */
-+#define SCI_EVENT_NUM_BLACK_SCREEN 0x2B /* Black screen is on or off */
-+
-+#define SCI_INDEX_LID 0x00
-+#define SCI_INDEX_DISPLAY_TOGGLE 0x01
-+#define SCI_INDEX_SLEEP 0x02
-+#define SCI_INDEX_OVERTEMP 0x03
-+#define SCI_INDEX_CRT_DETECT 0x04
-+#define SCI_INDEX_CAMERA 0x05
-+#define SCI_INDEX_USB_OC2 0x06
-+#define SCI_INDEX_USB_OC0 0x07
-+#define SCI_INDEX_AC_BAT 0x08
-+#define SCI_INDEX_DISPLAY_BRIGHTNESS_INC 0x09
-+#define SCI_INDEX_DISPLAY_BRIGHTNESS_DEC 0x0A
-+#define SCI_INDEX_AUDIO_VOLUME_INC 0x0B
-+#define SCI_INDEX_AUDIO_VOLUME_DEC 0x0C
-+#define SCI_INDEX_WLAN 0x0D
-+#define SCI_INDEX_AUDIO_MUTE 0x0E
-+#define SCI_INDEX_BLACK_SCREEN 0x0F
-+
-+#define SCI_MAX_EVENT_COUNT 0x10
-+
-+/* EC access port for sci communication */
-+#define EC_CMD_PORT 0x66
-+#define EC_STS_PORT 0x66
-+#define EC_DAT_PORT 0x62
-+#define CMD_INIT_IDLE_MODE 0xdd
-+#define CMD_EXIT_IDLE_MODE 0xdf
-+#define CMD_INIT_RESET_MODE 0xd8
-+#define CMD_REBOOT_SYSTEM 0x8c
-+#define CMD_GET_EVENT_NUM 0x84
-+#define CMD_PROGRAM_PIECE 0xda
-+
-+/* #define DEBUG_PRINTK */
-+
-+#ifdef DEBUG_PRINTK
-+#define PRINTK_DBG(args...) printk(args)
-+#else
-+#define PRINTK_DBG(args...)
-+#endif
-+
-+extern void _rdmsr(u32 addr, u32 *hi, u32 *lo);
-+extern void _wrmsr(u32 addr, u32 hi, u32 lo);
-diff -Nur linux-2.6.30.5.orig/drivers/platform/loongson/ec_kb3310b/ec_misc.c linux-2.6.30.5/drivers/platform/loongson/ec_kb3310b/ec_misc.c
---- linux-2.6.30.5.orig/drivers/platform/loongson/ec_kb3310b/ec_misc.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.30.5/drivers/platform/loongson/ec_kb3310b/ec_misc.c 2009-08-23 19:01:04.000000000 +0200
-@@ -0,0 +1,913 @@
-+/*
-+ * EC(Embedded Controller) KB3310B misc device driver on Linux
-+ * Author: liujl <liujl@lemote.com>
-+ * Date : 2008-04-20
-+ *
-+ * NOTE :
-+ * 1, The EC resources accessing and programming are supported.
-+ */
-+
-+#include <linux/module.h>
-+#include <linux/poll.h>
-+#include <linux/slab.h>
-+#include <linux/proc_fs.h>
-+#include <linux/miscdevice.h>
-+#include <linux/apm_bios.h>
-+#include <linux/capability.h>
-+#include <linux/sched.h>
-+#include <linux/pm.h>
-+#include <linux/apm-emulation.h>
-+#include <linux/device.h>
-+#include <linux/kernel.h>
-+#include <linux/list.h>
-+#include <linux/init.h>
-+#include <linux/completion.h>
-+#include <linux/kthread.h>
-+#include <linux/delay.h>
-+#include <linux/timer.h>
-+
-+#include <asm/delay.h>
-+
-+#include "ec.h"
-+#include "ec_misc.h"
-+
-+/* open for using rom protection action */
-+#define EC_ROM_PROTECTION
-+
-+/* this spinlock is dedicated for ec_read & ec_write function */
-+DEFINE_SPINLOCK(index_access_lock);
-+/* this spinlock is dedicated for 62&66 ports access */
-+DEFINE_SPINLOCK(port_access_lock);
-+/* information used for programming */
-+struct ec_info ecinfo;
-+
-+/* read a byte from EC registers throught index-io */
-+unsigned char ec_read(unsigned short addr)
-+{
-+ unsigned char value;
-+ unsigned long flags;
-+
-+ spin_lock_irqsave(&index_access_lock, flags);
-+ outb((addr & 0xff00) >> 8, EC_IO_PORT_HIGH);
-+ outb((addr & 0x00ff), EC_IO_PORT_LOW);
-+ value = inb(EC_IO_PORT_DATA);
-+ spin_unlock_irqrestore(&index_access_lock, flags);
-+
-+ return value;
-+}
-+EXPORT_SYMBOL_GPL(ec_read);
-+
-+/* write a byte to EC registers throught index-io */
-+void ec_write(unsigned short addr, unsigned char val)
-+{
-+ unsigned long flags;
-+
-+ spin_lock_irqsave(&index_access_lock, flags);
-+ outb((addr & 0xff00) >> 8, EC_IO_PORT_HIGH);
-+ outb((addr & 0x00ff), EC_IO_PORT_LOW);
-+ outb(val, EC_IO_PORT_DATA);
-+ inb(EC_IO_PORT_DATA); /* flush the write action */
-+ spin_unlock_irqrestore(&index_access_lock, flags);
-+
-+ return;
-+}
-+EXPORT_SYMBOL_GPL(ec_write);
-+
-+/*
-+ * ec_query_seq
-+ * this function is used for ec command writing and corresponding status query
-+ */
-+int ec_query_seq(unsigned char cmd)
-+{
-+ int timeout;
-+ unsigned char status;
-+ unsigned long flags;
-+ int ret = 0;
-+
-+ spin_lock_irqsave(&port_access_lock, flags);
-+
-+ /* make chip goto reset mode */
-+ udelay(EC_REG_DELAY);
-+ outb(cmd, EC_CMD_PORT);
-+ udelay(EC_REG_DELAY);
-+
-+ /* check if the command is received by ec */
-+ timeout = EC_CMD_TIMEOUT;
-+ status = inb(EC_STS_PORT);
-+ while (timeout--) {
-+ if (status & (1 << 1)) {
-+ status = inb(EC_STS_PORT);
-+ udelay(EC_REG_DELAY);
-+ continue;
-+ }
-+ break;
-+ }
-+
-+ if (timeout <= 0) {
-+ printk(KERN_ERR "EC QUERY SEQ : deadable error : timeout...\n");
-+ ret = -EINVAL;
-+ } else {
-+ PRINTK_DBG(KERN_INFO
-+ "(%x/%d)ec issued command %d status : 0x%x\n",
-+ timeout, EC_CMD_TIMEOUT - timeout, cmd, status);
-+ }
-+
-+ spin_unlock_irqrestore(&port_access_lock, flags);
-+
-+ return ret;
-+}
-+EXPORT_SYMBOL_GPL(ec_query_seq);
-+
-+/* enable the chip reset mode */
-+static int ec_init_reset_mode(void)
-+{
-+ int timeout;
-+ unsigned char status = 0;
-+ int ret = 0;
-+
-+ /* make chip goto reset mode */
-+ ret = ec_query_seq(CMD_INIT_RESET_MODE);
-+ if (ret < 0) {
-+ printk(KERN_ERR "ec init reset mode failed.\n");
-+ goto out;
-+ }
-+
-+ /* make the action take active */
-+ timeout = EC_CMD_TIMEOUT;
-+ status = ec_read(REG_POWER_MODE) & FLAG_RESET_MODE;
-+ while (timeout--) {
-+ if (status) {
-+ udelay(EC_REG_DELAY);
-+ break;
-+ }
-+ status = ec_read(REG_POWER_MODE) & FLAG_RESET_MODE;
-+ udelay(EC_REG_DELAY);
-+ }
-+ if (timeout <= 0) {
-+ printk(KERN_ERR "ec rom fixup : can't check reset status.\n");
-+ ret = -EINVAL;
-+ } else {
-+ PRINTK_DBG(KERN_INFO "(%d/%d)reset 0xf710 : 0x%x\n", timeout,
-+ EC_CMD_TIMEOUT - timeout, status);
-+ }
-+
-+ /* set MCU to reset mode */
-+ udelay(EC_REG_DELAY);
-+ status = ec_read(REG_PXCFG);
-+ status |= (1 << 0);
-+ ec_write(REG_PXCFG, status);
-+ udelay(EC_REG_DELAY);
-+
-+ /* disable FWH/LPC */
-+ udelay(EC_REG_DELAY);
-+ status = ec_read(REG_LPCCFG);
-+ status &= ~(1 << 7);
-+ ec_write(REG_LPCCFG, status);
-+ udelay(EC_REG_DELAY);
-+
-+ PRINTK_DBG(KERN_INFO "entering reset mode ok..............\n");
-+
-+ out:
-+ return ret;
-+}
-+
-+/* make ec exit from reset mode */
-+static void ec_exit_reset_mode(void)
-+{
-+ unsigned char regval;
-+
-+ udelay(EC_REG_DELAY);
-+ regval = ec_read(REG_LPCCFG);
-+ regval |= (1 << 7);
-+ ec_write(REG_LPCCFG, regval);
-+ regval = ec_read(REG_PXCFG);
-+ regval &= ~(1 << 0);
-+ ec_write(REG_PXCFG, regval);
-+ PRINTK_DBG(KERN_INFO "exit reset mode ok..................\n");
-+
-+ return;
-+}
-+
-+/* make ec disable WDD */
-+static void ec_disable_WDD(void)
-+{
-+ unsigned char status;
-+
-+ udelay(EC_REG_DELAY);
-+ status = ec_read(REG_WDTCFG);
-+ ec_write(REG_WDTPF, 0x03);
-+ ec_write(REG_WDTCFG, (status & 0x80) | 0x48);
-+ PRINTK_DBG(KERN_INFO "Disable WDD ok..................\n");
-+
-+ return;
-+}
-+
-+/* make ec enable WDD */
-+static void ec_enable_WDD(void)
-+{
-+ unsigned char status;
-+
-+ udelay(EC_REG_DELAY);
-+ status = ec_read(REG_WDTCFG);
-+ ec_write(REG_WDT, 0x28); /* set WDT 5sec(0x28) */
-+ ec_write(REG_WDTCFG, (status & 0x80) | 0x03);
-+ PRINTK_DBG(KERN_INFO "Enable WDD ok..................\n");
-+
-+ return;
-+}
-+
-+/* make ec goto idle mode */
-+static int ec_init_idle_mode(void)
-+{
-+ int timeout;
-+ unsigned char status = 0;
-+ int ret = 0;
-+
-+ ec_query_seq(CMD_INIT_IDLE_MODE);
-+
-+ /* make the action take active */
-+ timeout = EC_CMD_TIMEOUT;
-+ status = ec_read(REG_POWER_MODE) & FLAG_IDLE_MODE;
-+ while (timeout--) {
-+ if (status) {
-+ udelay(EC_REG_DELAY);
-+ break;
-+ }
-+ status = ec_read(REG_POWER_MODE) & FLAG_IDLE_MODE;
-+ udelay(EC_REG_DELAY);
-+ }
-+ if (timeout <= 0) {
-+ printk(KERN_ERR "ec rom fixup : can't check out the status.\n");
-+ ret = -EINVAL;
-+ } else {
-+ PRINTK_DBG(KERN_INFO "(%d/%d)0xf710 : 0x%x\n", timeout,
-+ EC_CMD_TIMEOUT - timeout, ec_read(REG_POWER_MODE));
-+ }
-+
-+ PRINTK_DBG(KERN_INFO "entering idle mode ok...................\n");
-+
-+ return ret;
-+}
-+
-+/* make ec exit from idle mode */
-+static int ec_exit_idle_mode(void)
-+{
-+
-+ ec_query_seq(CMD_EXIT_IDLE_MODE);
-+
-+ PRINTK_DBG(KERN_INFO "exit idle mode ok...................\n");
-+
-+ return 0;
-+}
-+
-+static int ec_instruction_cycle(void)
-+{
-+ unsigned long timeout;
-+ int ret = 0;
-+
-+ timeout = EC_FLASH_TIMEOUT;
-+ while (timeout-- >= 0) {
-+ if (!(ec_read(REG_XBISPICFG) & SPICFG_SPI_BUSY))
-+ break;
-+ }
-+ if (timeout <= 0) {
-+ printk(KERN_ERR
-+ "EC_INSTRUCTION_CYCLE : timeout for check flag.\n");
-+ ret = -EINVAL;
-+ goto out;
-+ }
-+
-+ out:
-+ return ret;
-+}
-+
-+/* To see if the ec is in busy state or not. */
-+static inline int ec_flash_busy(unsigned long timeout)
-+{
-+ /* assurance the first command be going to rom */
-+ if (ec_instruction_cycle() < 0)
-+ return EC_STATE_BUSY;
-+#if 1
-+ timeout = timeout / EC_MAX_DELAY_UNIT;
-+ while (timeout-- > 0) {
-+ /* check the rom's status of busy flag */
-+ ec_write(REG_XBISPICMD, SPICMD_READ_STATUS);
-+ if (ec_instruction_cycle() < 0)
-+ return EC_STATE_BUSY;
-+ if ((ec_read(REG_XBISPIDAT) & 0x01) == 0x00)
-+ return EC_STATE_IDLE;
-+ udelay(EC_MAX_DELAY_UNIT);
-+ }
-+ if (timeout <= 0) {
-+ printk(KERN_ERR
-+ "EC_FLASH_BUSY : timeout for check rom flag.\n");
-+ return EC_STATE_BUSY;
-+ }
-+#else
-+ /* check the rom's status of busy flag */
-+ ec_write(REG_XBISPICMD, SPICMD_READ_STATUS);
-+ if (ec_instruction_cycle() < 0)
-+ return EC_STATE_BUSY;
-+
-+ timeout = timeout / EC_MAX_DELAY_UNIT;
-+ while (timeout-- > 0) {
-+ if ((ec_read(REG_XBISPIDAT) & 0x01) == 0x00)
-+ return EC_STATE_IDLE;
-+ udelay(EC_MAX_DELAY_UNIT);
-+ }
-+ if (timeout <= 0) {
-+ printk(KERN_ERR
-+ "EC_FLASH_BUSY : timeout for check rom flag.\n");
-+ return EC_STATE_BUSY;
-+ }
-+#endif
-+
-+ return EC_STATE_IDLE;
-+}
-+
-+static int rom_instruction_cycle(unsigned char cmd)
-+{
-+ unsigned long timeout = 0;
-+
-+ switch (cmd) {
-+ case SPICMD_READ_STATUS:
-+ case SPICMD_WRITE_ENABLE:
-+ case SPICMD_WRITE_DISABLE:
-+ case SPICMD_READ_BYTE:
-+ case SPICMD_HIGH_SPEED_READ:
-+ timeout = 0;
-+ break;
-+ case SPICMD_WRITE_STATUS:
-+ timeout = 300 * 1000;
-+ break;
-+ case SPICMD_BYTE_PROGRAM:
-+ timeout = 5 * 1000;
-+ break;
-+ case SPICMD_SST_SEC_ERASE:
-+ case SPICMD_SEC_ERASE:
-+ timeout = 1000 * 1000;
-+ break;
-+ case SPICMD_SST_BLK_ERASE:
-+ case SPICMD_BLK_ERASE:
-+ timeout = 3 * 1000 * 1000;
-+ break;
-+ case SPICMD_SST_CHIP_ERASE:
-+ case SPICMD_CHIP_ERASE:
-+ timeout = 20 * 1000 * 1000;
-+ break;
-+ default:
-+ timeout = EC_SPICMD_STANDARD_TIMEOUT;
-+ }
-+ if (timeout == 0)
-+ return ec_instruction_cycle();
-+ if (timeout < EC_SPICMD_STANDARD_TIMEOUT)
-+ timeout = EC_SPICMD_STANDARD_TIMEOUT;
-+
-+ return ec_flash_busy(timeout);
-+}
-+
-+/* delay for start/stop action */
-+static void delay_spi(int n)
-+{
-+ while (n--)
-+ inb(EC_IO_PORT_HIGH);
-+}
-+
-+/* start the action to spi rom function */
-+static void ec_start_spi(void)
-+{
-+ unsigned char val;
-+
-+ delay_spi(SPI_FINISH_WAIT_TIME);
-+ val = ec_read(REG_XBISPICFG) | SPICFG_EN_SPICMD | SPICFG_AUTO_CHECK;
-+ ec_write(REG_XBISPICFG, val);
-+ delay_spi(SPI_FINISH_WAIT_TIME);
-+}
-+
-+/* stop the action to spi rom function */
-+static void ec_stop_spi(void)
-+{
-+ unsigned char val;
-+
-+ delay_spi(SPI_FINISH_WAIT_TIME);
-+ val =
-+ ec_read(REG_XBISPICFG) & (~(SPICFG_EN_SPICMD | SPICFG_AUTO_CHECK));
-+ ec_write(REG_XBISPICFG, val);
-+ delay_spi(SPI_FINISH_WAIT_TIME);
-+}
-+
-+/* read one byte from xbi interface */
-+static int ec_read_byte(unsigned int addr, unsigned char *byte)
-+{
-+ int ret = 0;
-+
-+ /* enable spicmd writing. */
-+ ec_start_spi();
-+
-+ /* enable write spi flash */
-+ ec_write(REG_XBISPICMD, SPICMD_WRITE_ENABLE);
-+ if (rom_instruction_cycle(SPICMD_WRITE_ENABLE) == EC_STATE_BUSY) {
-+ printk(KERN_ERR "EC_READ_BYTE : SPICMD_WRITE_ENABLE failed.\n");
-+ ret = -EINVAL;
-+ goto out;
-+ }
-+
-+ /* write the address */
-+ ec_write(REG_XBISPIA2, (addr & 0xff0000) >> 16);
-+ ec_write(REG_XBISPIA1, (addr & 0x00ff00) >> 8);
-+ ec_write(REG_XBISPIA0, (addr & 0x0000ff) >> 0);
-+ /* start action */
-+ ec_write(REG_XBISPICMD, SPICMD_HIGH_SPEED_READ);
-+ if (rom_instruction_cycle(SPICMD_HIGH_SPEED_READ) == EC_STATE_BUSY) {
-+ printk(KERN_ERR
-+ "EC_READ_BYTE : SPICMD_HIGH_SPEED_READ failed.\n");
-+ ret = -EINVAL;
-+ goto out;
-+ }
-+
-+ *byte = ec_read(REG_XBISPIDAT);
-+
-+ out:
-+ /* disable spicmd writing. */
-+ ec_stop_spi();
-+
-+ return ret;
-+}
-+
-+/* write one byte to ec rom */
-+static int ec_write_byte(unsigned int addr, unsigned char byte)
-+{
-+ int ret = 0;
-+
-+ /* enable spicmd writing. */
-+ ec_start_spi();
-+
-+ /* enable write spi flash */
-+ ec_write(REG_XBISPICMD, SPICMD_WRITE_ENABLE);
-+ if (rom_instruction_cycle(SPICMD_WRITE_ENABLE) == EC_STATE_BUSY) {
-+ printk(KERN_ERR
-+ "EC_WRITE_BYTE : SPICMD_WRITE_ENABLE failed.\n");
-+ ret = -EINVAL;
-+ goto out;
-+ }
-+
-+ /* write the address */
-+ ec_write(REG_XBISPIA2, (addr & 0xff0000) >> 16);
-+ ec_write(REG_XBISPIA1, (addr & 0x00ff00) >> 8);
-+ ec_write(REG_XBISPIA0, (addr & 0x0000ff) >> 0);
-+ ec_write(REG_XBISPIDAT, byte);
-+ /* start action */
-+ ec_write(REG_XBISPICMD, SPICMD_BYTE_PROGRAM);
-+ if (rom_instruction_cycle(SPICMD_BYTE_PROGRAM) == EC_STATE_BUSY) {
-+ printk(KERN_ERR
-+ "EC_WRITE_BYTE : SPICMD_BYTE_PROGRAM failed.\n");
-+ ret = -EINVAL;
-+ goto out;
-+ }
-+
-+ out:
-+ /* disable spicmd writing. */
-+ ec_stop_spi();
-+
-+ return ret;
-+}
-+
-+/* unprotect SPI ROM */
-+/* EC_ROM_unprotect function code */
-+static int EC_ROM_unprotect(void)
-+{
-+ unsigned char status;
-+
-+ /* enable write spi flash */
-+ ec_write(REG_XBISPICMD, SPICMD_WRITE_ENABLE);
-+ if (rom_instruction_cycle(SPICMD_WRITE_ENABLE) == EC_STATE_BUSY) {
-+ printk(KERN_ERR
-+ "EC_UNIT_ERASE : SPICMD_WRITE_ENABLE failed.\n");
-+ return 1;
-+ }
-+
-+ /* unprotect the status register of rom */
-+ ec_write(REG_XBISPICMD, SPICMD_READ_STATUS);
-+ if (rom_instruction_cycle(SPICMD_READ_STATUS) == EC_STATE_BUSY) {
-+ printk(KERN_ERR "EC_UNIT_ERASE : SPICMD_READ_STATUS failed.\n");
-+ return 1;
-+ }
-+ status = ec_read(REG_XBISPIDAT);
-+ ec_write(REG_XBISPIDAT, status & 0x02);
-+ if (ec_instruction_cycle() < 0) {
-+ printk(KERN_ERR "EC_UNIT_ERASE : write status value failed.\n");
-+ return 1;
-+ }
-+
-+ ec_write(REG_XBISPICMD, SPICMD_WRITE_STATUS);
-+ if (rom_instruction_cycle(SPICMD_WRITE_STATUS) == EC_STATE_BUSY) {
-+ printk(KERN_ERR
-+ "EC_UNIT_ERASE : SPICMD_WRITE_STATUS failed.\n");
-+ return 1;
-+ }
-+
-+ /* enable write spi flash */
-+ ec_write(REG_XBISPICMD, SPICMD_WRITE_ENABLE);
-+ if (rom_instruction_cycle(SPICMD_WRITE_ENABLE) == EC_STATE_BUSY) {
-+ printk(KERN_ERR
-+ "EC_UNIT_ERASE : SPICMD_WRITE_ENABLE failed.\n");
-+ return 1;
-+ }
-+
-+ return 0;
-+}
-+
-+/* erase one block or chip or sector as needed */
-+static int ec_unit_erase(unsigned char erase_cmd, unsigned int addr)
-+{
-+ unsigned char status;
-+ int ret = 0, i = 0;
-+ int unprotect_count = 3;
-+ int check_flag = 0;
-+
-+ /* enable spicmd writing. */
-+ ec_start_spi();
-+
-+#ifdef EC_ROM_PROTECTION
-+ /* added for re-check SPICMD_READ_STATUS */
-+ while (unprotect_count-- > 0) {
-+ if (EC_ROM_unprotect()) {
-+ ret = -EINVAL;
-+ goto out;
-+ }
-+
-+ /* first time:500ms --> 5.5sec -->10.5sec */
-+ for (i = 0; i < ((2 - unprotect_count) * 100 + 10); i++)
-+ udelay(50000);
-+ ec_write(REG_XBISPICMD, SPICMD_READ_STATUS);
-+ if (rom_instruction_cycle(SPICMD_READ_STATUS)
-+ == EC_STATE_BUSY) {
-+ printk(KERN_ERR
-+ "EC_PROGRAM_ROM : SPICMD_READ_STATUS failed.\n");
-+ } else {
-+ status = ec_read(REG_XBISPIDAT);
-+ PRINTK_DBG(KERN_INFO "Read unprotect status : 0x%x\n",
-+ status);
-+ if ((status & 0x1C) == 0x00) {
-+ PRINTK_DBG(KERN_INFO
-+ "Read unprotect status OK1 : 0x%x\n",
-+ status & 0x1C);
-+ check_flag = 1;
-+ break;
-+ }
-+ }
-+ }
-+
-+ if (!check_flag) {
-+ printk(KERN_INFO "SPI ROM unprotect fail.\n");
-+ return 1;
-+ }
-+#endif
-+
-+ /* block address fill */
-+ if (erase_cmd == SPICMD_BLK_ERASE) {
-+ ec_write(REG_XBISPIA2, (addr & 0x00ff0000) >> 16);
-+ ec_write(REG_XBISPIA1, (addr & 0x0000ff00) >> 8);
-+ ec_write(REG_XBISPIA0, (addr & 0x000000ff) >> 0);
-+ }
-+
-+ /* erase the whole chip first */
-+ ec_write(REG_XBISPICMD, erase_cmd);
-+ if (rom_instruction_cycle(erase_cmd) == EC_STATE_BUSY) {
-+ printk(KERN_ERR "EC_UNIT_ERASE : erase failed.\n");
-+ ret = -EINVAL;
-+ goto out;
-+ }
-+
-+ out:
-+ /* disable spicmd writing. */
-+ ec_stop_spi();
-+
-+ return ret;
-+}
-+
-+/* update the whole rom content with H/W mode
-+ * PLEASE USING ec_unit_erase() FIRSTLY
-+ */
-+static int ec_program_rom(struct ec_info *info, int flag)
-+{
-+ unsigned int addr = 0;
-+ unsigned long size = 0;
-+ unsigned char *ptr = NULL;
-+ unsigned char data;
-+ unsigned char val = 0;
-+ int ret = 0;
-+ int i, j;
-+ unsigned char status;
-+
-+ /* modify for program serial No.
-+ * set IE_START_ADDR & use idle mode,
-+ * disable WDD
-+ */
-+ if (flag == PROGRAM_FLAG_ROM) {
-+ ret = ec_init_reset_mode();
-+ addr = info->start_addr + EC_START_ADDR;
-+ PRINTK_DBG(KERN_INFO "PROGRAM_FLAG_ROM..............\n");
-+ } else if (flag == PROGRAM_FLAG_IE) {
-+ ret = ec_init_idle_mode();
-+ ec_disable_WDD();
-+ addr = info->start_addr + IE_START_ADDR;
-+ PRINTK_DBG(KERN_INFO "PROGRAM_FLAG_IE..............\n");
-+ } else {
-+ return 0;
-+ }
-+
-+ if (ret < 0) {
-+ if (flag == PROGRAM_FLAG_IE)
-+ ec_enable_WDD();
-+ return ret;
-+ }
-+
-+ size = info->size;
-+ ptr = info->buf;
-+ PRINTK_DBG(KERN_INFO "starting update ec ROM..............\n");
-+
-+ ret = ec_unit_erase(SPICMD_BLK_ERASE, addr);
-+ if (ret) {
-+ printk(KERN_ERR "program ec : erase block failed.\n");
-+ goto out;
-+ }
-+ PRINTK_DBG(KERN_ERR "program ec : erase block OK.\n");
-+
-+ i = 0;
-+ while (i < size) {
-+ data = *(ptr + i);
-+ ec_write_byte(addr, data);
-+ ec_read_byte(addr, &val);
-+ if (val != data) {
-+ ec_write_byte(addr, data);
-+ ec_read_byte(addr, &val);
-+ if (val != data) {
-+ printk(KERN_INFO
-+ "EC : Second flash program failed at:\t");
-+ printk(KERN_INFO
-+ "addr : 0x%x, source : 0x%x, dest: 0x%x\n",
-+ addr, data, val);
-+ printk(KERN_INFO "This should not happen... STOP\n");
-+ break;
-+ }
-+ }
-+ i++;
-+ addr++;
-+ }
-+
-+#ifdef EC_ROM_PROTECTION
-+ /* we should start spi access firstly */
-+ ec_start_spi();
-+
-+ /* enable write spi flash */
-+ ec_write(REG_XBISPICMD, SPICMD_WRITE_ENABLE);
-+ if (rom_instruction_cycle(SPICMD_WRITE_ENABLE) == EC_STATE_BUSY) {
-+ printk(KERN_ERR
-+ "EC_PROGRAM_ROM : SPICMD_WRITE_ENABLE failed.\n");
-+ goto out1;
-+ }
-+
-+ /* protect the status register of rom */
-+ ec_write(REG_XBISPICMD, SPICMD_READ_STATUS);
-+ if (rom_instruction_cycle(SPICMD_READ_STATUS) == EC_STATE_BUSY) {
-+ printk(KERN_ERR
-+ "EC_PROGRAM_ROM : SPICMD_READ_STATUS failed.\n");
-+ goto out1;
-+ }
-+ status = ec_read(REG_XBISPIDAT);
-+
-+ ec_write(REG_XBISPIDAT, status | 0x1C);
-+ if (ec_instruction_cycle() < 0) {
-+ printk(KERN_ERR
-+ "EC_PROGRAM_ROM : write status value failed.\n");
-+ goto out1;
-+ }
-+
-+ ec_write(REG_XBISPICMD, SPICMD_WRITE_STATUS);
-+ if (rom_instruction_cycle(SPICMD_WRITE_STATUS) == EC_STATE_BUSY) {
-+ printk(KERN_ERR
-+ "EC_PROGRAM_ROM : SPICMD_WRITE_STATUS failed.\n");
-+ goto out1;
-+ }
-+#endif
-+
-+ /* disable the write action to spi rom */
-+ ec_write(REG_XBISPICMD, SPICMD_WRITE_DISABLE);
-+ if (rom_instruction_cycle(SPICMD_WRITE_DISABLE) == EC_STATE_BUSY) {
-+ printk(KERN_ERR
-+ "EC_PROGRAM_ROM : SPICMD_WRITE_DISABLE failed.\n");
-+ goto out1;
-+ }
-+
-+ out1:
-+ /* we should stop spi access firstly */
-+ ec_stop_spi();
-+ out:
-+ /* for security */
-+ for (j = 0; j < 2000; j++)
-+ udelay(1000);
-+
-+ /* modify for program serial No.
-+ * after program No exit idle mode
-+ * and enable WDD
-+ */
-+ if (flag == PROGRAM_FLAG_ROM) {
-+ /* exit from the reset mode */
-+ ec_exit_reset_mode();
-+ } else {
-+ /* ec exit from idle mode */
-+ ret = ec_exit_idle_mode();
-+ ec_enable_WDD();
-+ if (ret < 0)
-+ return ret;
-+ }
-+
-+ return 0;
-+}
-+
-+/* ioctl */
-+static int misc_ioctl(struct inode *inode, struct file *filp, u_int cmd,
-+ u_long arg)
-+{
-+ void __user *ptr = (void __user *)arg;
-+ struct ec_reg *ecreg = (struct ec_reg *)(filp->private_data);
-+ int ret = 0;
-+
-+ switch (cmd) {
-+ case IOCTL_RDREG:
-+ ret = copy_from_user(ecreg, ptr, sizeof(struct ec_reg));
-+ if (ret) {
-+ printk(KERN_ERR "reg read : copy from user error.\n");
-+ return -EFAULT;
-+ }
-+ if ((ecreg->addr > EC_MAX_REGADDR)
-+ || (ecreg->addr < EC_MIN_REGADDR)) {
-+ printk(KERN_ERR
-+ "reg read : out of register address range.\n");
-+ return -EINVAL;
-+ }
-+ ecreg->val = ec_read(ecreg->addr);
-+ ret = copy_to_user(ptr, ecreg, sizeof(struct ec_reg));
-+ if (ret) {
-+ printk(KERN_ERR "reg read : copy to user error.\n");
-+ return -EFAULT;
-+ }
-+ break;
-+ case IOCTL_WRREG:
-+ ret = copy_from_user(ecreg, ptr, sizeof(struct ec_reg));
-+ if (ret) {
-+ printk(KERN_ERR "reg write : copy from user error.\n");
-+ return -EFAULT;
-+ }
-+ if ((ecreg->addr > EC_MAX_REGADDR)
-+ || (ecreg->addr < EC_MIN_REGADDR)) {
-+ printk(KERN_ERR
-+ "reg write : out of register address range.\n");
-+ return -EINVAL;
-+ }
-+ ec_write(ecreg->addr, ecreg->val);
-+ break;
-+ case IOCTL_READ_EC:
-+ ret = copy_from_user(ecreg, ptr, sizeof(struct ec_reg));
-+ if (ret) {
-+ printk(KERN_ERR "spi read : copy from user error.\n");
-+ return -EFAULT;
-+ }
-+ if ((ecreg->addr > EC_RAM_ADDR)
-+ && (ecreg->addr < EC_MAX_REGADDR)) {
-+ printk(KERN_ERR
-+ "spi read : out of register address range.\n");
-+ return -EINVAL;
-+ }
-+ ec_read_byte(ecreg->addr, &(ecreg->val));
-+ ret = copy_to_user(ptr, ecreg, sizeof(struct ec_reg));
-+ if (ret) {
-+ printk(KERN_ERR "spi read : copy to user error.\n");
-+ return -EFAULT;
-+ }
-+ break;
-+ case IOCTL_PROGRAM_IE:
-+ ecinfo.start_addr = EC_START_ADDR;
-+ ecinfo.size = EC_CONTENT_MAX_SIZE;
-+ ecinfo.buf = (u8 *) kmalloc(ecinfo.size, GFP_KERNEL);
-+ if (ecinfo.buf == NULL) {
-+ printk(KERN_ERR "program ie : kmalloc failed.\n");
-+ return -ENOMEM;
-+ }
-+ ret = copy_from_user(ecinfo.buf, (u8 *) ptr, ecinfo.size);
-+ if (ret) {
-+ printk(KERN_ERR "program ie : copy from user error.\n");
-+ kfree(ecinfo.buf);
-+ ecinfo.buf = NULL;
-+ return -EFAULT;
-+ }
-+
-+ /* use ec_program_rom to write serial No */
-+ ec_program_rom(&ecinfo, PROGRAM_FLAG_IE);
-+
-+ kfree(ecinfo.buf);
-+ ecinfo.buf = NULL;
-+ break;
-+ case IOCTL_PROGRAM_EC:
-+ ecinfo.start_addr = EC_START_ADDR;
-+ if (get_user((ecinfo.size), (u32 *) ptr)) {
-+ printk(KERN_ERR "program ec : get user error.\n");
-+ return -EFAULT;
-+ }
-+ if ((ecinfo.size) > EC_CONTENT_MAX_SIZE) {
-+ printk(KERN_ERR "program ec : size out of limited.\n");
-+ return -EINVAL;
-+ }
-+ ecinfo.buf = (u8 *) kmalloc(ecinfo.size, GFP_KERNEL);
-+ if (ecinfo.buf == NULL) {
-+ printk(KERN_ERR "program ec : kmalloc failed.\n");
-+ return -ENOMEM;
-+ }
-+ ret = copy_from_user(ecinfo.buf, ((u8 *) ptr + 4), ecinfo.size);
-+ if (ret) {
-+ printk(KERN_ERR "program ec : copy from user error.\n");
-+ kfree(ecinfo.buf);
-+ ecinfo.buf = NULL;
-+ return -EFAULT;
-+ }
-+
-+ ec_program_rom(&ecinfo, PROGRAM_FLAG_ROM);
-+
-+ kfree(ecinfo.buf);
-+ ecinfo.buf = NULL;
-+ break;
-+
-+ default:
-+ break;
-+ }
-+
-+ return 0;
-+}
-+
-+static long misc_compat_ioctl(struct file *file, unsigned int cmd,
-+ unsigned long arg)
-+{
-+ return misc_ioctl(file->f_dentry->d_inode, file, cmd, arg);
-+}
-+
-+static int misc_open(struct inode *inode, struct file *filp)
-+{
-+ struct ec_reg *ecreg = NULL;
-+ ecreg = kmalloc(sizeof(struct ec_reg), GFP_KERNEL);
-+ if (ecreg)
-+ filp->private_data = ecreg;
-+
-+ return ecreg ? 0 : -ENOMEM;
-+}
-+
-+static int misc_release(struct inode *inode, struct file *filp)
-+{
-+ struct ec_reg *ecreg = (struct ec_reg *)(filp->private_data);
-+
-+ filp->private_data = NULL;
-+ kfree(ecreg);
-+
-+ return 0;
-+}
-+
-+static const struct file_operations ecmisc_fops = {
-+ .open = misc_open,
-+ .release = misc_release,
-+ .read = NULL,
-+ .write = NULL,
-+#ifdef CONFIG_64BIT
-+ .compat_ioctl = misc_compat_ioctl,
-+#else
-+ .ioctl = misc_ioctl,
-+#endif
-+};
-+
-+static struct miscdevice ecmisc_device = {
-+ .minor = ECMISC_MINOR_DEV,
-+ .name = EC_MISC_DEV,
-+ .fops = &ecmisc_fops
-+};
-+
-+static int __init ecmisc_init(void)
-+{
-+ int ret;
-+
-+ printk(KERN_INFO "EC misc device init.\n");
-+ ret = misc_register(&ecmisc_device);
-+
-+ return ret;
-+}
-+
-+static void __exit ecmisc_exit(void)
-+{
-+ printk(KERN_INFO "EC misc device exit.\n");
-+ misc_deregister(&ecmisc_device);
-+}
-+
-+module_init(ecmisc_init);
-+module_exit(ecmisc_exit);
-+
-+MODULE_AUTHOR("liujl <liujl@lemote.com>");
-+MODULE_DESCRIPTION("KB3310 resources misc Management");
-+MODULE_LICENSE("GPL");
-diff -Nur linux-2.6.30.5.orig/drivers/platform/loongson/ec_kb3310b/ec_misc_fn.h linux-2.6.30.5/drivers/platform/loongson/ec_kb3310b/ec_misc_fn.h
---- linux-2.6.30.5.orig/drivers/platform/loongson/ec_kb3310b/ec_misc_fn.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.30.5/drivers/platform/loongson/ec_kb3310b/ec_misc_fn.h 2009-08-23 19:01:04.000000000 +0200
-@@ -0,0 +1,16 @@
-+
-+/*
-+ * EC(Embedded Controller) KB3310B misc device export functions header file
-+ *
-+ * Author: liujl <liujl@lemote.com>
-+ * Date : 2009-03-16
-+ *
-+ * EC relative export header file.
-+ */
-+
-+/* the general ec index-io port read action */
-+extern unsigned char ec_read(unsigned short addr);
-+/* the general ec index-io port write action */
-+extern void ec_write(unsigned short addr, unsigned char val);
-+/* query sequence of 62/66 port access routine */
-+extern int ec_query_seq(unsigned char cmd);
-diff -Nur linux-2.6.30.5.orig/drivers/platform/loongson/ec_kb3310b/ec_misc.h linux-2.6.30.5/drivers/platform/loongson/ec_kb3310b/ec_misc.h
---- linux-2.6.30.5.orig/drivers/platform/loongson/ec_kb3310b/ec_misc.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.30.5/drivers/platform/loongson/ec_kb3310b/ec_misc.h 2009-08-23 19:01:04.000000000 +0200
-@@ -0,0 +1,191 @@
-+/*
-+ * EC(Embedded Controller) KB3310B Misc device driver header file in linux
-+ * Author : liujl <liujl@lemote.com>
-+ * Date : 2008-04-20
-+ *
-+ * NOTE :
-+ * 1, The application layer for reading, writing ec registers and code
-+ * program are supported.
-+ */
-+
-+/* ec delay time 500us for register and status access */
-+#define EC_REG_DELAY 500 /* unit : us */
-+
-+/* version burned address */
-+#define VER_ADDR 0xf7a1
-+#define VER_MAX_SIZE 7
-+#define EC_ROM_MAX_SIZE 0x10000
-+
-+/* ec internal register */
-+#define REG_POWER_MODE 0xF710
-+#define FLAG_NORMAL_MODE 0x00
-+#define FLAG_IDLE_MODE 0x01
-+#define FLAG_RESET_MODE 0x02
-+
-+/* ec update program flag */
-+#define PROGRAM_FLAG_NONE 0x00
-+#define PROGRAM_FLAG_IE 0x01
-+#define PROGRAM_FLAG_ROM 0x02
-+
-+/* XBI relative registers */
-+#define REG_XBISEG0 0xFEA0
-+#define REG_XBISEG1 0xFEA1
-+#define REG_XBIRSV2 0xFEA2
-+#define REG_XBIRSV3 0xFEA3
-+#define REG_XBIRSV4 0xFEA4
-+#define REG_XBICFG 0xFEA5
-+#define REG_XBICS 0xFEA6
-+#define REG_XBIWE 0xFEA7
-+#define REG_XBISPIA0 0xFEA8
-+#define REG_XBISPIA1 0xFEA9
-+#define REG_XBISPIA2 0xFEAA
-+#define REG_XBISPIDAT 0xFEAB
-+#define REG_XBISPICMD 0xFEAC
-+#define REG_XBISPICFG 0xFEAD
-+#define REG_XBISPIDATR 0xFEAE
-+#define REG_XBISPICFG2 0xFEAF
-+
-+/* commands definition for REG_XBISPICMD */
-+#define SPICMD_WRITE_STATUS 0x01
-+#define SPICMD_BYTE_PROGRAM 0x02
-+#define SPICMD_READ_BYTE 0x03
-+#define SPICMD_WRITE_DISABLE 0x04
-+#define SPICMD_READ_STATUS 0x05
-+#define SPICMD_WRITE_ENABLE 0x06
-+#define SPICMD_HIGH_SPEED_READ 0x0B
-+#define SPICMD_POWER_DOWN 0xB9
-+#define SPICMD_SST_EWSR 0x50
-+#define SPICMD_SST_SEC_ERASE 0x20
-+#define SPICMD_SST_BLK_ERASE 0x52
-+#define SPICMD_SST_CHIP_ERASE 0x60
-+#define SPICMD_FRDO 0x3B
-+#define SPICMD_SEC_ERASE 0xD7
-+#define SPICMD_BLK_ERASE 0xD8
-+#define SPICMD_CHIP_ERASE 0xC7
-+
-+/* bits definition for REG_XBISPICFG */
-+#define SPICFG_AUTO_CHECK 0x01
-+#define SPICFG_SPI_BUSY 0x02
-+#define SPICFG_DUMMY_READ 0x04
-+#define SPICFG_EN_SPICMD 0x08
-+#define SPICFG_LOW_SPICS 0x10
-+#define SPICFG_EN_SHORT_READ 0x20
-+#define SPICFG_EN_OFFSET_READ 0x40
-+#define SPICFG_EN_FAST_READ 0x80
-+
-+/* SMBUS relative register block according to the EC datasheet. */
-+#define REG_SMBTCRC 0xff92
-+#define REG_SMBPIN 0xff93
-+#define REG_SMBCFG 0xff94
-+#define REG_SMBEN 0xff95
-+#define REG_SMBPF 0xff96
-+#define REG_SMBRCRC 0xff97
-+#define REG_SMBPRTCL 0xff98
-+#define REG_SMBSTS 0xff99
-+#define REG_SMBADR 0xff9a
-+#define REG_SMBCMD 0xff9b
-+#define REG_SMBDAT_START 0xff9c
-+#define REG_SMBDAT_END 0xffa3
-+#define SMBDAT_SIZE 8
-+#define REG_SMBRSA 0xffa4
-+#define REG_SMBCNT 0xffbc
-+#define REG_SMBAADR 0xffbd
-+#define REG_SMBADAT0 0xffbe
-+#define REG_SMBADAT1 0xffbf
-+
-+/* watchdog timer registers */
-+#define REG_WDTCFG 0xfe80
-+#define REG_WDTPF 0xfe81
-+#define REG_WDT 0xfe82
-+
-+/* lpc configure register */
-+#define REG_LPCCFG 0xfe95
-+
-+/* 8051 reg */
-+#define REG_PXCFG 0xff14
-+
-+/* Fan register in KB3310 */
-+#define REG_ECFAN_SPEED_LEVEL 0xf4e4
-+#define REG_ECFAN_SWITCH 0xf4d2
-+
-+/* the ec flash rom id number */
-+#define EC_ROM_PRODUCT_ID_SPANSION 0x01
-+#define EC_ROM_PRODUCT_ID_MXIC 0xC2
-+#define EC_ROM_PRODUCT_ID_AMIC 0x37
-+#define EC_ROM_PRODUCT_ID_EONIC 0x1C
-+
-+/* Ec misc device name */
-+#define EC_MISC_DEV "ec_misc"
-+
-+/* Ec misc device minor number */
-+#define ECMISC_MINOR_DEV MISC_DYNAMIC_MINOR
-+
-+#define EC_IOC_MAGIC 'E'
-+/* misc ioctl operations */
-+#define IOCTL_RDREG _IOR(EC_IOC_MAGIC, 1, int)
-+#define IOCTL_WRREG _IOW(EC_IOC_MAGIC, 2, int)
-+#define IOCTL_READ_EC _IOR(EC_IOC_MAGIC, 3, int)
-+#define IOCTL_PROGRAM_IE _IOW(EC_IOC_MAGIC, 4, int)
-+#define IOCTL_PROGRAM_EC _IOW(EC_IOC_MAGIC, 5, int)
-+
-+/* start address for programming of EC content or IE */
-+/* ec running code start address */
-+#define EC_START_ADDR 0x00000000
-+/* ec information element storing address */
-+#define IE_START_ADDR 0x00020000
-+
-+/* EC state */
-+#define EC_STATE_IDLE 0x00 /* ec in idle state */
-+#define EC_STATE_BUSY 0x01 /* ec in busy state */
-+
-+/* timeout value for programming */
-+#define EC_FLASH_TIMEOUT 0x1000 /* ec program timeout */
-+/* command checkout timeout including cmd to port or state flag check */
-+#define EC_CMD_TIMEOUT 0x1000
-+#define EC_SPICMD_STANDARD_TIMEOUT (4 * 1000) /* unit : us */
-+#define EC_MAX_DELAY_UNIT (10) /* every time for polling */
-+#define SPI_FINISH_WAIT_TIME 10
-+/* EC content max size */
-+#define EC_CONTENT_MAX_SIZE (64 * 1024)
-+#define IE_CONTENT_MAX_SIZE (0x100000 - IE_START_ADDR)
-+
-+/*
-+ * piece structure :
-+ * ------------------------------
-+ * | 1byte | 3 bytes | 28 bytes |
-+ * | flag | addr | data |
-+ * ------------------------------
-+ * flag :
-+ * bit0 : '1' for first piece, '0' for other
-+ * addr :
-+ * address for EC to burn the data to(rom address)
-+ * data :
-+ * data which we should burn to the ec rom
-+ *
-+ * NOTE:
-+ * so far max size should be 256B, or we should change the address-1 value.
-+ * piece is used for IE program
-+ */
-+#define PIECE_SIZE (32 - 1 - 3)
-+#define FIRST_PIECE_YES 1
-+#define FIRST_PIECE_NO 0
-+/* piece program status reg from ec firmware */
-+#define PIECE_STATUS_REG 0xF77C
-+/* piece program status reg done flag */
-+#define PIECE_STATUS_PROGRAM_DONE 0x80
-+/* piece program status reg error flag */
-+#define PIECE_STATUS_PROGRAM_ERROR 0x40
-+/* 32bytes should be stored here */
-+#define PIECE_START_ADDR 0xF800
-+
-+/* the register operation access struct */
-+struct ec_reg {
-+ u32 addr; /* the address of kb3310 registers */
-+ u8 val; /* the register value */
-+};
-+
-+struct ec_info {
-+ u32 start_addr;
-+ u32 size;
-+ u8 *buf;
-+};
-diff -Nur linux-2.6.30.5.orig/drivers/platform/loongson/ec_kb3310b/ec_sci.c linux-2.6.30.5/drivers/platform/loongson/ec_kb3310b/ec_sci.c
---- linux-2.6.30.5.orig/drivers/platform/loongson/ec_kb3310b/ec_sci.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.30.5/drivers/platform/loongson/ec_kb3310b/ec_sci.c 2009-08-23 19:01:04.000000000 +0200
-@@ -0,0 +1,1026 @@
-+/*
-+ * EC(Embedded Controller) KB3310B SCI EVENT management driver on Linux
-+ * Author : liujl <liujl@lemote.com>
-+ * Date : 2008-10-22
-+ *
-+ * NOTE : Until now, I have no idea for setting the interrupt to edge sensitive
-+ * mode, amd's help should be needed for handling this problem
-+ * So, I assume that the interrupt width is 120us
-+ */
-+
-+#include <linux/interrupt.h>
-+#include <linux/module.h>
-+#include <linux/slab.h>
-+#include <linux/proc_fs.h>
-+#include <linux/miscdevice.h>
-+#include <linux/capability.h>
-+#include <linux/sched.h>
-+#include <linux/device.h>
-+#include <linux/kernel.h>
-+#include <linux/list.h>
-+#include <linux/init.h>
-+#include <linux/completion.h>
-+#include <linux/kthread.h>
-+#include <linux/delay.h>
-+#include <linux/timer.h>
-+#include <linux/errno.h>
-+#include <linux/pci.h>
-+#include <linux/ioport.h>
-+#include <linux/poll.h>
-+#include <linux/mutex.h>
-+#include <linux/wait.h>
-+#include <linux/spinlock.h>
-+
-+#include <asm/delay.h>
-+
-+#include "ec.h"
-+#include "ec_misc_fn.h"
-+
-+/* inode information */
-+#define EC_SCI_MINOR_DEV MISC_DYNAMIC_MINOR
-+#define EC_SCI_DEV "sci"
-+#define SCI_IRQ_NUM 0x0A
-+#define CS5536_GPIO_SIZE 256
-+
-+/* ec delay time 500us for register and status access */
-+/* unit : us */
-+#define EC_REG_DELAY 300
-+
-+struct ec_sci_reg {
-+ u32 addr;
-+ u8 val;
-+};
-+struct ec_sci_reg ecreg;
-+
-+struct sci_device {
-+ /* the sci number get from ec */
-+ unsigned char sci_number;
-+
-+ /* sci count */
-+ unsigned char sci_num_array[SCI_MAX_EVENT_COUNT];
-+
-+ /* irq relative */
-+ unsigned char irq;
-+ unsigned char irq_data;
-+
-+ /* device name */
-+ unsigned char name[10];
-+
-+ /* gpio base registers and length */
-+ unsigned long gpio_base;
-+ unsigned long gpio_size;
-+
-+ /* lock & wait_queue */
-+ wait_queue_head_t wq;
-+ spinlock_t lock;
-+
-+ /* storage initial value of sci status register
-+ * sci_init_value[0] as brightness
-+ * sci_init_value[1] as volume
-+ */
-+ unsigned char sci_init_value[2];
-+};
-+struct sci_device *sci_device;
-+
-+#ifdef CONFIG_PROC_FS
-+static ssize_t sci_proc_read(struct file *file, char *buf, size_t len,
-+ loff_t *ppos);
-+static ssize_t sci_proc_write(struct file *file, const char *buf, size_t len,
-+ loff_t *ppos);
-+static unsigned int sci_poll(struct file *fp, poll_table *wait);
-+static struct proc_dir_entry *sci_proc_entry;
-+static const struct file_operations sci_proc_fops = {
-+ .read = sci_proc_read,
-+ .poll = sci_poll,
-+ .write = sci_proc_write,
-+};
-+
-+#define SCI_ACTION_COUNT 15
-+#define SCI_ACTION_WIDTH 14
-+char sci_action[SCI_ACTION_COUNT][SCI_ACTION_WIDTH] = {
-+ "DISPLAY : LCD",
-+ "DISPLAY : CRT",
-+ "DISPLAY : ALL",
-+ "DISPLAY : CHG",
-+ "AUDIO : CHG",
-+ "MACHINE : OFF",
-+ "MACHINE : RES",
-+ "CAMERA : ON",
-+ "CAMERA : OFF",
-+ "LCDLED : ON",
-+ "LCDLED : OFF",
-+ "LCDBL : ON",
-+ "LCDBL : OFF",
-+ "NONE",
-+ "NONE"
-+};
-+
-+static enum {
-+ CMD_DISPLAY_LCD = 0,
-+ CMD_DISPLAY_CRT,
-+ CMD_DISPLAY_ALL,
-+ CMD_DISPLAY_CHANGE_BRIGHTNESS,
-+ CMD_AUDIO_CHANGE_VOLUME,
-+ CMD_MACHINE_OFF,
-+ CMD_MACHINE_RESET,
-+ CMD_CAMERA_ON,
-+ CMD_CAMERA_OFF,
-+ CMD_LCDLED_PWRON,
-+ CMD_LCDLED_PWROFF,
-+ CMD_LCDBL_ON,
-+ CMD_LCDBL_OFF,
-+ CMD_NONE
-+} sci_cmd;
-+
-+#endif
-+
-+static void sci_display_lcd(void)
-+{
-+ unsigned char value;
-+
-+ outb(0x21, 0x3c4);
-+ value = inb(0x3c5);
-+ value |= (1 << 7);
-+ outb(0x21, 0x3c4);
-+ outb(value, 0x3c5);
-+
-+ outb(0x31, 0x3c4);
-+ value = inb(0x3c5);
-+ value = (value & 0xf8) | 0x01;
-+ outb(0x31, 0x3c4);
-+ outb(value, 0x3c5);
-+
-+ return;
-+}
-+
-+static void sci_display_crt(void)
-+{
-+ unsigned char value;
-+
-+ outb(0x21, 0x3c4);
-+ value = inb(0x3c5);
-+ value &= ~(1 << 7);
-+ outb(0x21, 0x3c4);
-+ outb(value, 0x3c5);
-+
-+ outb(0x31, 0x3c4);
-+ value = inb(0x3c5);
-+ value = (value & 0xf8) | 0x02;
-+ outb(0x31, 0x3c4);
-+ outb(value, 0x3c5);
-+
-+ return;
-+}
-+
-+static void sci_display_all(void)
-+{
-+ unsigned char value;
-+
-+ outb(0x21, 0x3c4);
-+ value = inb(0x3c5);
-+ value &= ~(1 << 7);
-+ outb(0x21, 0x3c4);
-+ outb(value, 0x3c5);
-+
-+ outb(0x31, 0x3c4);
-+ value = inb(0x3c5);
-+ value = (value & 0xf8) | 0x03;
-+ outb(0x31, 0x3c4);
-+ outb(value, 0x3c5);
-+
-+ return;
-+}
-+
-+static void sci_lcd_op(unsigned char flag)
-+{
-+ unsigned char value;
-+
-+ /* default display crt */
-+ outb(0x21, 0x3c4);
-+ value = inb(0x3c5);
-+ value &= ~(1 << 7);
-+ outb(0x21, 0x3c4);
-+ outb(value, 0x3c5);
-+
-+ if (flag == CMD_LCDLED_PWRON) {
-+ /* open lcd output */
-+ outb(0x31, 0x3c4);
-+ value = inb(0x3c5);
-+ value = (value & 0xf8) | 0x03;
-+ outb(0x31, 0x3c4);
-+ outb(value, 0x3c5);
-+ } else if (flag == CMD_LCDLED_PWROFF) {
-+ /* close lcd output */
-+ outb(0x31, 0x3c4);
-+ value = inb(0x3c5);
-+ value = (value & 0xf8) | 0x02;
-+ outb(0x31, 0x3c4);
-+ outb(value, 0x3c5);
-+ } else if (flag == CMD_LCDBL_ON)
-+ /* LCD backlight on */
-+ ec_write(REG_BACKLIGHT_CTRL, BIT_BACKLIGHT_ON);
-+ else if (flag == CMD_LCDBL_OFF)
-+ /* LCD backlight off */
-+ ec_write(REG_BACKLIGHT_CTRL, BIT_BACKLIGHT_OFF);
-+
-+ return;
-+}
-+
-+static void sci_display_change_brightness(void)
-+{
-+ ec_write(REG_DISPLAY_BRIGHTNESS, FLAG_DISPLAY_BRIGHTNESS_LEVEL_4);
-+ return;
-+}
-+
-+static void sci_audio_change_volume(void)
-+{
-+ ec_write(REG_AUDIO_VOLUME, FLAG_AUDIO_VOLUME_LEVEL_5);
-+ return;
-+}
-+
-+static void sci_camera_on_off(void)
-+{
-+ unsigned char val;
-+ val = ec_read(REG_CAMERA_CONTROL);
-+ ec_write(REG_CAMERA_CONTROL, val | (1 << 1));
-+ return;
-+}
-+
-+static void sci_machine_off(void)
-+{
-+#ifdef CONFIG_64BIT
-+ /* cpu-gpio0 output low */
-+ *((unsigned int *)(0xffffffffbfe0011c)) &= ~0x00000001;
-+ /* cpu-gpio0 as output */
-+ *((unsigned int *)(0xffffffffbfe00120)) &= ~0x00000001;
-+#else
-+ /* cpu-gpio0 output low */
-+ *((unsigned int *)(0xbfe0011c)) &= ~0x00000001;
-+ /* cpu-gpio0 as output */
-+ *((unsigned int *)(0xbfe00120)) &= ~0x00000001;
-+#endif /* end ifdef CONFIG_64BIT */
-+ return;
-+}
-+
-+static void sci_machine_reset(void)
-+{
-+ ec_write(REG_RESET, BIT_RESET_ON);
-+ return;
-+}
-+
-+/* static const char driver_version[] = "1.0"; */
-+static const char driver_version[] = VERSION;
-+
-+#ifdef CONFIG_PROC_FS
-+#define PROC_BUF_SIZE 128
-+unsigned char proc_buf[PROC_BUF_SIZE];
-+
-+/*
-+ * sci_proc_read :
-+ * read information from sci device and suppied to upper layer
-+ * The format is as following :
-+ * driver_version 1.0
-+ * DISPLAY BRIGHTNESS INCREASE
-+ * DISPLAY BRIGHTNESS DECREASE
-+ * AUDIO VOLUME INCREASE
-+ * AUDIO VOLUME DECREASE
-+ * MUTE 0x00 close, 0x01 open
-+ * WLAN 0x00 close, 0x01 open
-+ * LID 0x00 close, 0x01 open
-+ * DISPLAY TOGGLE
-+ * BLACK SCREEN
-+ * SLEEP
-+ * OVER TEMPERATURE
-+ * CRT DETECT
-+ * CAMERA 0x00 close, 0x01 open
-+ * USB OC2
-+ * USB OC0
-+ * BAT IN
-+ * AC IN
-+ * INIT CAP
-+ * CHARGE MODE
-+ * STOP CHARGE
-+ * BAT LOW
-+ * BAT FULL
-+ */
-+static ssize_t sci_proc_read(struct file *file, char *buf, size_t len,
-+ loff_t *ppos)
-+{
-+ unsigned char event[SCI_MAX_EVENT_COUNT];
-+ int ret = 0;
-+ int i;
-+ int count = 0;
-+ DECLARE_WAITQUEUE(wait, current);
-+
-+ PRINTK_DBG("0 irq_data %d\n", sci_device->irq_data);
-+
-+ if (sci_device->irq_data == 0) {
-+ add_wait_queue(&(sci_device->wq), &wait);
-+
-+ while (!sci_device->irq_data) {
-+ set_current_state(TASK_INTERRUPTIBLE);
-+ schedule();
-+ }
-+ remove_wait_queue(&(sci_device->wq), &wait);
-+ }
-+
-+ PRINTK_DBG("1 irq_data %d\n", sci_device->irq_data);
-+ __set_current_state(TASK_RUNNING);
-+
-+ for (i = 0; i < SCI_MAX_EVENT_COUNT; i++)
-+ event[i] = sci_device->sci_num_array[i];
-+
-+ ret = sprintf(proc_buf,
-+ "%s 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x "
-+ "0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x "
-+ "0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x\n",
-+ driver_version, event[SCI_INDEX_DISPLAY_BRIGHTNESS_INC],
-+ event[SCI_INDEX_DISPLAY_BRIGHTNESS_DEC],
-+ event[SCI_INDEX_AUDIO_VOLUME_INC],
-+ event[SCI_INDEX_AUDIO_VOLUME_DEC],
-+ event[SCI_INDEX_AUDIO_MUTE], event[SCI_INDEX_WLAN],
-+ event[SCI_INDEX_LID], event[SCI_INDEX_DISPLAY_TOGGLE],
-+ event[SCI_INDEX_BLACK_SCREEN], event[SCI_INDEX_SLEEP],
-+ event[SCI_INDEX_OVERTEMP], event[SCI_INDEX_CRT_DETECT],
-+ event[SCI_INDEX_CAMERA], event[SCI_INDEX_USB_OC2],
-+ event[SCI_INDEX_USB_OC0],
-+ (event[SCI_INDEX_AC_BAT] & 0x01) >> BIT_AC_BAT_BAT_IN,
-+ (event[SCI_INDEX_AC_BAT] & 0x02) >> BIT_AC_BAT_AC_IN,
-+ (event[SCI_INDEX_AC_BAT] & 0x04) >> BIT_AC_BAT_INIT_CAP,
-+ (event[SCI_INDEX_AC_BAT] & 0x08) >>
-+ BIT_AC_BAT_CHARGE_MODE,
-+ (event[SCI_INDEX_AC_BAT] & 0x10) >>
-+ BIT_AC_BAT_STOP_CHARGE,
-+ (event[SCI_INDEX_AC_BAT] & 0x20) >> BIT_AC_BAT_BAT_LOW,
-+ (event[SCI_INDEX_AC_BAT] & 0x40) >> BIT_AC_BAT_BAT_FULL);
-+
-+ count = strlen(proc_buf);
-+ sci_device->irq_data = 0;
-+
-+ if (len < count)
-+ return -ENOMEM;
-+ if (PROC_BUF_SIZE < count)
-+ return -ENOMEM;
-+
-+ if (copy_to_user(buf, proc_buf, count))
-+ return -EFAULT;
-+
-+ return count;
-+}
-+
-+/*
-+ * sci_proc_write :
-+ * get the upper layer's action and take action.
-+ */
-+static ssize_t sci_proc_write(struct file *file, const char *buf, size_t len,
-+ loff_t *ppos)
-+{
-+ int i;
-+
-+ if (len > PROC_BUF_SIZE)
-+ return -ENOMEM;
-+ if (copy_from_user(proc_buf, buf, len))
-+ return -EFAULT;
-+ proc_buf[len] = '\0';
-+
-+ PRINTK_DBG("proc_buf : %s\n", proc_buf);
-+ for (i = 0; i < SCI_ACTION_COUNT; i++) {
-+ if (strncmp(proc_buf, sci_action[i], strlen(sci_action[i])) ==
-+ 0) {
-+ sci_cmd = i;
-+ break;
-+ }
-+ }
-+ if (i == SCI_ACTION_COUNT)
-+ sci_cmd = CMD_NONE;
-+ PRINTK_DBG("sci_cmd: %d\n", sci_cmd);
-+ switch (sci_cmd) {
-+ case CMD_DISPLAY_LCD:
-+ sci_display_lcd();
-+ PRINTK_DBG(KERN_DEBUG "CMD_DISPLAY_LCD");
-+ break;
-+ case CMD_DISPLAY_CRT:
-+ sci_display_crt();
-+ PRINTK_DBG(KERN_DEBUG "CMD_DISPLAY_CRT");
-+ break;
-+ case CMD_DISPLAY_ALL:
-+ sci_display_all();
-+ PRINTK_DBG(KERN_DEBUG "CMD_DISPLAY_ALL");
-+ break;
-+ case CMD_DISPLAY_CHANGE_BRIGHTNESS:
-+ sci_display_change_brightness();
-+ PRINTK_DBG(KERN_DEBUG "CMD_DISPLAY_CHANGE_BRIGHTNESS");
-+ break;
-+ case CMD_AUDIO_CHANGE_VOLUME:
-+ sci_audio_change_volume();
-+ PRINTK_DBG(KERN_DEBUG "CMD_AUDIO_CHANGE_VOLUME");
-+ break;
-+ case CMD_MACHINE_OFF:
-+ sci_machine_off();
-+ PRINTK_DBG(KERN_DEBUG "CMD_MACHINE_OFF");
-+ break;
-+ case CMD_MACHINE_RESET:
-+ sci_machine_reset();
-+ PRINTK_DBG(KERN_DEBUG "CMD_MACHINE_RESET");
-+ break;
-+ case CMD_CAMERA_ON:
-+ sci_camera_on_off();
-+ PRINTK_DBG(KERN_DEBUG "CMD_CAMERA_ON");
-+ break;
-+ case CMD_CAMERA_OFF:
-+ sci_camera_on_off();
-+ PRINTK_DBG(KERN_DEBUG "CMD_CAMERA_OFF");
-+ break;
-+ case CMD_LCDLED_PWRON:
-+ sci_lcd_op(CMD_LCDLED_PWRON);
-+ PRINTK_DBG(KERN_DEBUG "CMD_LCDLED_PWRON");
-+ break;
-+ case CMD_LCDLED_PWROFF:
-+ sci_lcd_op(CMD_LCDLED_PWROFF);
-+ PRINTK_DBG(KERN_DEBUG "CMD_LCDLED_PWROFF");
-+ break;
-+ case CMD_LCDBL_ON:
-+ sci_lcd_op(CMD_LCDBL_ON);
-+ PRINTK_DBG(KERN_DEBUG "CMD_LCDBL_ON");
-+ break;
-+ case CMD_LCDBL_OFF:
-+ sci_lcd_op(CMD_LCDBL_OFF);
-+ PRINTK_DBG(KERN_DEBUG "CMD_LCDBL_OFF");
-+ break;
-+ default:
-+ printk(KERN_ERR "EC SCI : Not supported cmd.\n");
-+ return -EINVAL;
-+ }
-+
-+ return len;
-+}
-+#endif
-+
-+/*
-+ * sci_query_event_num :
-+ * using query command to ec to get the proper event number
-+ */
-+static int sci_query_event_num(void)
-+{
-+ int ret = 0;
-+
-+ ret = ec_query_seq(CMD_GET_EVENT_NUM);
-+ return ret;
-+}
-+
-+/*
-+ * sci_get_event_num :
-+ * get sci event number from ec
-+ * NOTE : this routine must follow the sci_query_event_num
-+ * function in the interrupt
-+ */
-+int sci_get_event_num(void)
-+{
-+ int timeout = 100;
-+ unsigned char value;
-+ unsigned char status;
-+
-+ udelay(EC_REG_DELAY);
-+ status = inb(EC_STS_PORT);
-+ udelay(EC_REG_DELAY);
-+ while (timeout--) {
-+ if (!(status & (1 << 0))) {
-+ status = inb(EC_STS_PORT);
-+ udelay(EC_REG_DELAY);
-+ continue;
-+ }
-+ break;
-+ }
-+ if (timeout <= 0) {
-+ PRINTK_DBG("fixup sci : get event number timeout.\n");
-+ return -EINVAL;
-+ }
-+ value = inb(EC_DAT_PORT);
-+ udelay(EC_REG_DELAY);
-+
-+ return value;
-+}
-+EXPORT_SYMBOL(sci_get_event_num);
-+
-+/*
-+ * sci_parse_num :
-+ * parse the event number routine, and store all the information
-+ * to the sci_num_array[] for upper layer using
-+ */
-+static int sci_parse_num(struct sci_device *sci_device)
-+{
-+ unsigned char val;
-+
-+ sci_device->sci_num_array[SCI_INDEX_DISPLAY_TOGGLE] = 0x0;
-+ sci_device->sci_num_array[SCI_INDEX_SLEEP] = 0x0;
-+ sci_device->sci_num_array[SCI_INDEX_DISPLAY_BRIGHTNESS_DEC] = 0;
-+ sci_device->sci_num_array[SCI_INDEX_DISPLAY_BRIGHTNESS_INC] = 0;
-+ sci_device->sci_num_array[SCI_INDEX_AUDIO_VOLUME_INC] = 0;
-+ sci_device->sci_num_array[SCI_INDEX_AUDIO_VOLUME_DEC] = 0;
-+
-+ sci_device->sci_num_array[SCI_INDEX_CAMERA] = 0x0;
-+ sci_device->sci_num_array[SCI_INDEX_WLAN] = ec_read(REG_WLAN_STATUS);
-+ sci_device->sci_num_array[SCI_INDEX_AUDIO_MUTE] =
-+ ec_read(REG_AUDIO_MUTE);
-+ sci_device->sci_num_array[SCI_INDEX_BLACK_SCREEN] =
-+ ec_read(REG_DISPLAY_LCD);
-+ sci_device->sci_num_array[SCI_INDEX_CRT_DETECT] =
-+ ec_read(REG_CRT_DETECT);
-+ if (ec_read(REG_BAT_POWER) & BIT_BAT_POWER_ACIN) {
-+ sci_device->sci_num_array[SCI_INDEX_AC_BAT] |=
-+ 1 << BIT_AC_BAT_AC_IN;
-+ } else {
-+ sci_device->sci_num_array[SCI_INDEX_AC_BAT] &=
-+ ~(1 << BIT_AC_BAT_AC_IN);
-+ }
-+
-+ switch (sci_device->sci_number) {
-+ case SCI_EVENT_NUM_LID:
-+ sci_device->sci_num_array[SCI_INDEX_LID] =
-+ ec_read(REG_LID_DETECT);
-+ break;
-+ case SCI_EVENT_NUM_DISPLAY_TOGGLE:
-+ sci_device->sci_num_array[SCI_INDEX_DISPLAY_TOGGLE] = 0x01;
-+ break;
-+ case SCI_EVENT_NUM_SLEEP:
-+ sci_device->sci_num_array[SCI_INDEX_SLEEP] = 0x01;
-+ break;
-+ case SCI_EVENT_NUM_OVERTEMP:
-+ sci_device->sci_num_array[SCI_INDEX_OVERTEMP] =
-+ (ec_read(REG_BAT_CHARGE_STATUS) &
-+ BIT_BAT_CHARGE_STATUS_OVERTEMP) >> 2;
-+ break;
-+ case SCI_EVENT_NUM_CRT_DETECT:
-+ sci_device->sci_num_array[SCI_INDEX_CRT_DETECT] =
-+ ec_read(REG_CRT_DETECT);
-+ break;
-+ case SCI_EVENT_NUM_CAMERA:
-+ sci_device->sci_num_array[SCI_INDEX_CAMERA] = 0x1;
-+ break;
-+ case SCI_EVENT_NUM_USB_OC2:
-+ sci_device->sci_num_array[SCI_INDEX_USB_OC2] =
-+ ec_read(REG_USB2_FLAG);
-+ break;
-+ case SCI_EVENT_NUM_USB_OC0:
-+ sci_device->sci_num_array[SCI_INDEX_USB_OC0] =
-+ ec_read(REG_USB0_FLAG);
-+ break;
-+ case SCI_EVENT_NUM_AC_BAT:
-+ if (ec_read(REG_BAT_STATUS) & BIT_BAT_STATUS_IN) {
-+ sci_device->sci_num_array[SCI_INDEX_AC_BAT] |=
-+ 1 << BIT_AC_BAT_BAT_IN;
-+ } else {
-+ sci_device->sci_num_array[SCI_INDEX_AC_BAT] &=
-+ ~(1 << BIT_AC_BAT_BAT_IN);
-+ }
-+
-+ if (ec_read(REG_BAT_POWER) & BIT_BAT_POWER_ACIN) {
-+ sci_device->sci_num_array[SCI_INDEX_AC_BAT] |=
-+ 1 << BIT_AC_BAT_AC_IN;
-+ } else {
-+ sci_device->sci_num_array[SCI_INDEX_AC_BAT] &=
-+ ~(1 << BIT_AC_BAT_AC_IN);
-+ }
-+
-+ /* init_bat_cap will not be included here. */
-+
-+ if (ec_read(REG_BAT_CHARGE_STATUS) &
-+ BIT_BAT_CHARGE_STATUS_PRECHG) {
-+ sci_device->sci_num_array[SCI_INDEX_AC_BAT] |=
-+ 1 << BIT_AC_BAT_CHARGE_MODE;
-+ } else {
-+ sci_device->sci_num_array[SCI_INDEX_AC_BAT] &=
-+ ~(1 << BIT_AC_BAT_CHARGE_MODE);
-+ }
-+
-+ if (ec_read(REG_BAT_STATE) & BIT_BAT_STATE_DISCHARGING) {
-+ sci_device->sci_num_array[SCI_INDEX_AC_BAT] |=
-+ 1 << BIT_AC_BAT_STOP_CHARGE;
-+ } else {
-+ sci_device->sci_num_array[SCI_INDEX_AC_BAT] &=
-+ ~(1 << BIT_AC_BAT_STOP_CHARGE);
-+ }
-+
-+ if (ec_read(REG_BAT_STATUS) & BIT_BAT_STATUS_LOW) {
-+ sci_device->sci_num_array[SCI_INDEX_AC_BAT] |=
-+ 1 << BIT_AC_BAT_BAT_LOW;
-+ } else {
-+ sci_device->sci_num_array[SCI_INDEX_AC_BAT] &=
-+ ~(1 << BIT_AC_BAT_BAT_LOW);
-+ }
-+
-+ if (ec_read(REG_BAT_STATUS) & BIT_BAT_STATUS_FULL) {
-+ sci_device->sci_num_array[SCI_INDEX_AC_BAT] |=
-+ 1 << BIT_AC_BAT_BAT_FULL;
-+ } else {
-+ sci_device->sci_num_array[SCI_INDEX_AC_BAT] &=
-+ ~(1 << BIT_AC_BAT_BAT_FULL);
-+ }
-+ break;
-+ case SCI_EVENT_NUM_DISPLAY_BRIGHTNESS:
-+ val = ec_read(REG_DISPLAY_BRIGHTNESS);
-+ if ((val == 0x00) || (val < sci_device->sci_init_value[0])) {
-+ sci_device->
-+ sci_num_array[SCI_INDEX_DISPLAY_BRIGHTNESS_DEC] = 1;
-+ sci_device->sci_init_value[0] = val;
-+ } else if ((val == 0x08)
-+ || (val > sci_device->sci_init_value[0])) {
-+ sci_device->
-+ sci_num_array[SCI_INDEX_DISPLAY_BRIGHTNESS_INC] = 1;
-+ sci_device->sci_init_value[0] = val;
-+ }
-+ break;
-+ case SCI_EVENT_NUM_AUDIO_VOLUME:
-+ val = ec_read(REG_AUDIO_VOLUME);
-+ if ((val == 0x00) || (val < sci_device->sci_init_value[1])) {
-+ sci_device->sci_num_array[SCI_INDEX_AUDIO_VOLUME_DEC] =
-+ 1;
-+ sci_device->sci_init_value[1] = val;
-+ } else if ((val == 0x0a)
-+ || (val > sci_device->sci_init_value[1])) {
-+ sci_device->sci_num_array[SCI_INDEX_AUDIO_VOLUME_INC] =
-+ 1;
-+ sci_device->sci_init_value[1] = val;
-+ }
-+ break;
-+ case SCI_EVENT_NUM_WLAN:
-+ sci_device->sci_num_array[SCI_INDEX_WLAN] =
-+ ec_read(REG_WLAN_STATUS);
-+ break;
-+ case SCI_EVENT_NUM_AUDIO_MUTE:
-+ sci_device->sci_num_array[SCI_INDEX_AUDIO_MUTE] =
-+ ec_read(REG_AUDIO_MUTE);
-+ break;
-+ case SCI_EVENT_NUM_BLACK_SCREEN:
-+ sci_device->sci_num_array[SCI_INDEX_BLACK_SCREEN] =
-+ ec_read(REG_DISPLAY_LCD);
-+ break;
-+
-+ default:
-+ PRINTK_DBG(KERN_ERR "EC SCI : not supported SCI NUMBER.\n");
-+ return -EINVAL;
-+ break;
-+ }
-+
-+ return 0;
-+}
-+
-+/*
-+ * sci_int_routine : sci main interrupt routine
-+ * we will do the query and get event number together
-+ * so the interrupt routine should be longer than 120us
-+ * now at least 3ms elpase for it.
-+ */
-+static irqreturn_t sci_int_routine(int irq, void *dev_id)
-+{
-+ int ret;
-+
-+ if (sci_device->irq != irq) {
-+ PRINTK_DBG(KERN_ERR "EC SCI :spurious irq.\n");
-+ return IRQ_NONE;
-+ }
-+
-+ /* query the event number */
-+ ret = sci_query_event_num();
-+ if (ret < 0) {
-+ PRINTK_DBG("ret 1: %d\n", ret);
-+ return IRQ_NONE;
-+ }
-+
-+ ret = sci_get_event_num();
-+ if (ret < 0) {
-+ PRINTK_DBG("ret 2: %d\n", ret);
-+ return IRQ_NONE;
-+ }
-+ sci_device->sci_number = ret;
-+
-+ PRINTK_DBG(KERN_INFO "sci_number :0x%x\n", sci_device->sci_number);
-+
-+ /* parse the event number and wake the queue */
-+ if ((sci_device->sci_number != 0x00)
-+ && (sci_device->sci_number != 0xff)) {
-+ ret = sci_parse_num(sci_device);
-+ PRINTK_DBG("ret 3: %d\n", ret);
-+ if (!ret)
-+ sci_device->irq_data = 1;
-+ else
-+ sci_device->irq_data = 0;
-+
-+ wake_up_interruptible(&(sci_device->wq));
-+ PRINTK_DBG("interrupitble\n");
-+ }
-+
-+ return IRQ_HANDLED;
-+}
-+
-+static int sci_open(struct inode *inode, struct file *filp)
-+{
-+ PRINTK_DBG(KERN_INFO "SCI : open ok.\n");
-+ return 0;
-+}
-+
-+static int sci_release(struct inode *inode, struct file *filp)
-+{
-+ PRINTK_DBG(KERN_INFO "SCI : close ok.\n");
-+ return 0;
-+}
-+
-+/*
-+ * sci_poll : poll routine for upper layer using
-+ */
-+static unsigned int sci_poll(struct file *fp, poll_table * wait)
-+{
-+ int mask = 0;
-+
-+ /* printk("current task %p\n", current); */
-+ poll_wait(fp, &(sci_device->wq), wait);
-+ if (sci_device->irq_data) {
-+ /* printk("current task 1 %p\n", current); */
-+ mask = POLLIN | POLLRDNORM;
-+ }
-+
-+ return mask;
-+}
-+
-+static int sci_ioctl(struct inode *inode, struct file *filp, unsigned long cmd,
-+ unsigned long arg)
-+{
-+ void __user *ptr = (void __user *)arg;
-+ int ret = 0;
-+
-+ switch (cmd) {
-+/* case IOCTL_GET_INIT_STATE : */
-+ case 1:
-+ ret = copy_from_user(&ecreg, ptr, sizeof(struct ec_sci_reg));
-+ if (ret) {
-+ printk(KERN_ERR "read from user error.\n");
-+ return -EFAULT;
-+ }
-+ if (ecreg.addr < 0xf400 || ecreg.addr > 0xffff)
-+ return -EINVAL;
-+ ecreg.val = ec_read(ecreg.addr);
-+ ret = copy_to_user(ptr, &ecreg, sizeof(struct ec_sci_reg));
-+ if (ret) {
-+ printk(KERN_ERR "reg read : copy to user error.\n");
-+ return -EFAULT;
-+ }
-+ break;
-+ default:
-+ break;
-+ }
-+
-+ return 0;
-+}
-+
-+static long sci_compat_ioctl(struct file *file, unsigned int cmd,
-+ unsigned long arg)
-+{
-+ return sci_ioctl(file->f_dentry->d_inode, file, cmd, arg);
-+}
-+
-+static const struct file_operations sci_fops = {
-+#ifdef CONFIG_64BIT
-+ .compat_ioctl = sci_compat_ioctl,
-+#else
-+ .ioclt = sci_ioctl,
-+#endif
-+ .open = sci_open,
-+ .poll = sci_poll,
-+ .release = sci_release,
-+};
-+
-+static struct miscdevice sci_dev = {
-+ .minor = EC_SCI_MINOR_DEV,
-+ .name = EC_SCI_DEV,
-+ .fops = &sci_fops
-+};
-+
-+static struct pci_device_id sci_pci_tbl[] = {
-+ {PCI_DEVICE(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_CS5536_ISA)},
-+ {}
-+};
-+
-+MODULE_DEVICE_TABLE(pci, sci_pci_tbl);
-+
-+/*
-+ * sci_low_level_init :
-+ * config and init some msr and gpio register properly.
-+ */
-+static int sci_low_level_init(struct sci_device *scidev)
-+{
-+ u32 hi, lo;
-+ u32 gpio_base = scidev->gpio_base;
-+ int ret = 0;
-+ unsigned long flags;
-+
-+ /* filter the former kb3310 interrupt for security */
-+ ret = sci_query_event_num();
-+ if (ret) {
-+ PRINTK_DBG(KERN_ERR
-+ "sci low level init query event num failed.\n");
-+ return ret;
-+ }
-+
-+ /* for filtering next number interrupt */
-+ udelay(10000);
-+
-+ /* set gpio native registers and msrs for GPIO27 SCI EVENT PIN
-+ * gpio :
-+ * input, pull-up, no-invert, event-count and value 0,
-+ * no-filter, no edge mode
-+ * gpio27 map to Virtual gpio0
-+ * msr :
-+ * no primary and lpc
-+ * Unrestricted Z input to IG10 from Virtual gpio 0.
-+ */
-+ local_irq_save(flags);
-+ _rdmsr(0x80000024, &hi, &lo);
-+ lo &= ~(1 << 10);
-+ _wrmsr(0x80000024, hi, lo);
-+ _rdmsr(0x80000025, &hi, &lo);
-+ lo &= ~(1 << 10);
-+ _wrmsr(0x80000025, hi, lo);
-+ _rdmsr(0x80000023, &hi, &lo);
-+ lo |= (0x0a << 0);
-+ _wrmsr(0x80000023, hi, lo);
-+ local_irq_restore(flags);
-+
-+ /* set gpio27 as sci interrupt :
-+ * input, pull-up, no-fliter, no-negedge, invert
-+ * the sci event is just about 120us
-+ */
-+ asm(".set noreorder\n");
-+ /* input enable */
-+ outl(0x00000800, (gpio_base | 0xA0));
-+ /* revert the input */
-+ outl(0x00000800, (gpio_base | 0xA4));
-+ /* event-int enable */
-+ outl(0x00000800, (gpio_base | 0xB8));
-+ asm(".set reorder\n");
-+
-+ return 0;
-+}
-+
-+/*
-+ * sci_pci_init :
-+ * pci init routine
-+ */
-+static int __devinit sci_pci_init(struct pci_dev *pdev,
-+ const struct pci_device_id *ent)
-+{
-+ u32 gpio_base;
-+ int ret = -EIO;
-+ int i;
-+
-+ /* init the sci device */
-+ sci_device = kmalloc(sizeof(struct sci_device), GFP_KERNEL);
-+ if (sci_device == NULL) {
-+ PRINTK_DBG(KERN_ERR
-+ "EC SCI : get memory for sci_device failed.\n");
-+ return -ENOMEM;
-+ }
-+ init_waitqueue_head(&(sci_device->wq));
-+ spin_lock_init(&sci_device->lock);
-+ sci_device->irq = SCI_IRQ_NUM;
-+ sci_device->irq_data = 0x00;
-+ sci_device->sci_number = 0x00;
-+ strcpy(sci_device->name, EC_SCI_DEV);
-+
-+ sci_device->sci_init_value[0] = ec_read(REG_DISPLAY_BRIGHTNESS);
-+ sci_device->sci_init_value[1] = ec_read(REG_AUDIO_VOLUME);
-+
-+ for (i = 0; i < SCI_MAX_EVENT_COUNT; i++)
-+ sci_device->sci_num_array[i] = 0x00;
-+
-+ /* enable pci device and get the GPIO resources */
-+ ret = pci_enable_device(pdev);
-+ if (ret) {
-+ PRINTK_DBG(KERN_ERR "EC SCI : enable pci device failed.\n");
-+ ret = -ENODEV;
-+ goto out_pdev;
-+ }
-+
-+ gpio_base = 0x0000;
-+ gpio_base = pci_resource_start(pdev, 1);
-+ gpio_base &= ~0x0003;
-+ if (gpio_base == 0x0000) {
-+ PRINTK_DBG(KERN_ERR "EC SCI : get resource failed.\n");
-+ ret = -ENODEV;
-+ goto out_resource;
-+ }
-+ if (request_region(gpio_base, CS5536_GPIO_SIZE, EC_SCI_DEV) == NULL) {
-+ PRINTK_DBG(KERN_ERR
-+ "EC SCI : base 0x%x, length 0x%x already in use.\n",
-+ gpio_base, CS5536_GPIO_SIZE);
-+ goto out_resource;
-+ }
-+ sci_device->gpio_base = gpio_base;
-+ sci_device->gpio_size = CS5536_GPIO_SIZE;
-+
-+ /* init the relative gpio and msrs */
-+ ret = sci_low_level_init(sci_device);
-+ if (ret < 0) {
-+ printk(KERN_ERR "EC SCI : low level init failed.\n");
-+ goto out_irq;
-+ }
-+
-+ /* alloc the interrupt for sci not pci */
-+ ret =
-+ request_irq(sci_device->irq, sci_int_routine, IRQF_SHARED,
-+ sci_device->name, sci_device);
-+ if (ret) {
-+ printk(KERN_ERR "EC SCI : request irq %d failed.\n",
-+ sci_device->irq);
-+ ret = -EFAULT;
-+ goto out_irq;
-+ }
-+
-+ /* register the misc device */
-+ ret = misc_register(&sci_dev);
-+ if (ret != 0) {
-+ printk(KERN_ERR "EC SCI : misc register failed.\n");
-+ ret = -EFAULT;
-+ goto out_misc;
-+ }
-+
-+ ret = 0;
-+ PRINTK_DBG(KERN_INFO "sci probe ok...\n");
-+ goto out;
-+
-+ out_misc:
-+ free_irq(sci_device->irq, sci_device);
-+ out_irq:
-+ release_region(sci_device->gpio_base, sci_device->gpio_size);
-+ out_resource:
-+ pci_disable_device(pdev);
-+ out_pdev:
-+ kfree(sci_device);
-+ out:
-+ return ret;
-+}
-+
-+static void __devexit sci_pci_remove(struct pci_dev *pdev)
-+{
-+ misc_deregister(&sci_dev);
-+ free_irq(sci_device->irq, sci_device);
-+ release_region(sci_device->gpio_base, sci_device->gpio_size);
-+ pci_disable_device(pdev);
-+ kfree(sci_device);
-+
-+ return;
-+}
-+
-+static struct pci_driver sci_driver = {
-+ .name = EC_SCI_DEV,
-+ .id_table = sci_pci_tbl,
-+ .probe = sci_pci_init,
-+ .remove = __devexit_p(sci_pci_remove),
-+};
-+
-+static int __init sci_init(void)
-+{
-+ int ret = 0;
-+
-+#ifdef CONFIG_PROC_FS
-+ sci_proc_entry = NULL;
-+ sci_proc_entry = create_proc_entry(EC_SCI_DEV, S_IWUSR | S_IRUGO, NULL);
-+ if (sci_proc_entry == NULL) {
-+ printk(KERN_ERR "EC SCI : register /proc/sci failed.\n");
-+ return -EINVAL;
-+ }
-+ sci_proc_entry->proc_fops = &sci_proc_fops;
-+#endif
-+
-+ ret = pci_register_driver(&sci_driver);
-+ if (ret) {
-+ printk(KERN_ERR "EC SCI : registrer pci driver error.\n");
-+#ifdef CONFIG_PROC_FS
-+ remove_proc_entry(EC_SCI_DEV, NULL);
-+#endif
-+ return ret;
-+ }
-+
-+ printk(KERN_INFO
-+ "SCI event handler on KB3310B Embedded Controller init.\n");
-+
-+ return ret;
-+}
-+
-+static void __exit sci_exit(void)
-+{
-+#ifdef CONFIG_PROC_FS
-+ remove_proc_entry(EC_SCI_DEV, NULL);
-+#endif
-+ pci_unregister_driver(&sci_driver);
-+ printk(KERN_INFO
-+ "SCI event handler on KB3310B Embedded Controller exit.\n");
-+
-+ return;
-+}
-+
-+module_init(sci_init);
-+module_exit(sci_exit);
-+
-+MODULE_AUTHOR("liujl <liujl@lemote.com>");
-+MODULE_DESCRIPTION("SCI Event Management for KB3310");
-+MODULE_LICENSE("GPL");
-diff -Nur linux-2.6.30.5.orig/drivers/platform/loongson/ec_kb3310b/io_msr_debug.c linux-2.6.30.5/drivers/platform/loongson/ec_kb3310b/io_msr_debug.c
---- linux-2.6.30.5.orig/drivers/platform/loongson/ec_kb3310b/io_msr_debug.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.30.5/drivers/platform/loongson/ec_kb3310b/io_msr_debug.c 2009-08-23 19:01:04.000000000 +0200
-@@ -0,0 +1,198 @@
-+/*
-+ * Debug IO and MSR resources driver on Linux
-+ *
-+ * Author: liujl <liujl@lemote.com>
-+ * huangw <huangw@lemote.com>
-+ * Date : 2009-03-03
-+ *
-+ * NOTE :
-+ * 1, The IO and the MSR resources accessing read/write are supported.
-+ */
-+
-+#include <linux/module.h>
-+#include <linux/poll.h>
-+#include <linux/slab.h>
-+#include <linux/proc_fs.h>
-+#include <linux/miscdevice.h>
-+#include <linux/apm_bios.h>
-+#include <linux/capability.h>
-+#include <linux/sched.h>
-+#include <linux/pm.h>
-+#include <linux/apm-emulation.h>
-+#include <linux/device.h>
-+#include <linux/kernel.h>
-+#include <linux/list.h>
-+#include <linux/init.h>
-+#include <linux/completion.h>
-+#include <linux/kthread.h>
-+#include <linux/delay.h>
-+#include <linux/timer.h>
-+
-+#include <asm/delay.h>
-+
-+#include "ec.h"
-+
-+struct io_msr_reg {
-+ u32 addr; /* the address of IO and MSR registers */
-+ u8 val; /* the register value for IO */
-+ u32 hi; /* the register value for MSR's high part */
-+ u32 lo; /* the register value for MSR's low part */
-+};
-+
-+#define IOCTL_RDMSR _IOR('F', 5, int)
-+#define IOCTL_WRMSR _IOR('F', 6, int)
-+#define IOCTL_RDIO _IOR('F', 7, int)
-+#define IOCTL_WRIO _IOR('F', 8, int)
-+
-+/* ec io space range */
-+#define IO_MAX_ADDR 0xBFD0FFFF
-+#define IO_MIN_ADDR 0xBFD00000
-+
-+static int io_msr_ioctl(struct inode *inode, struct file *filp, u_int cmd,
-+ u_long arg)
-+{
-+ void __user *ptr = (void __user *)arg;
-+ struct io_msr_reg *iomsrreg = (struct io_msr_reg *)(filp->private_data);
-+ int ret = 0;
-+
-+ switch (cmd) {
-+ case IOCTL_RDIO:
-+ ret = copy_from_user(iomsrreg, ptr, sizeof(struct io_msr_reg));
-+ if (ret) {
-+ printk(KERN_ERR "IO read : copy from user error.\n");
-+ return -EFAULT;
-+ }
-+
-+ if (iomsrreg->addr > IO_MAX_ADDR
-+ || iomsrreg->addr < IO_MIN_ADDR) {
-+ printk(KERN_ERR "IO read : out of IO address range.\n");
-+ return -EINVAL;
-+ }
-+#ifdef CONFIG_64BIT
-+ iomsrreg->val =
-+ *((unsigned char *)(iomsrreg->
-+ addr | 0xffffffff00000000));
-+#else
-+ iomsrreg->val = *((unsigned char *)(iomsrreg->addr));
-+#endif
-+ ret = copy_to_user(ptr, iomsrreg, sizeof(struct io_msr_reg));
-+ if (ret) {
-+ printk(KERN_ERR "IO read : copy to user error.\n");
-+ return -EFAULT;
-+ }
-+ break;
-+ case IOCTL_WRIO:
-+ ret = copy_from_user(iomsrreg, ptr, sizeof(struct io_msr_reg));
-+ if (ret) {
-+ printk(KERN_ERR "IO write : copy from user error.\n");
-+ return -EFAULT;
-+ }
-+
-+ if (iomsrreg->addr > IO_MAX_ADDR
-+ || iomsrreg->addr < IO_MIN_ADDR) {
-+ printk(KERN_ERR
-+ "IO write : out of IO address range.\n");
-+ return -EINVAL;
-+ }
-+#ifdef CONFIG_64BIT
-+ *((unsigned char *)(iomsrreg->addr | 0xffffffff00000000)) =
-+ iomsrreg->val;
-+#else
-+ *((unsigned char *)(iomsrreg->addr)) = iomsrreg->val;
-+#endif
-+ break;
-+ case IOCTL_RDMSR:
-+ ret = copy_from_user(iomsrreg, ptr, sizeof(struct io_msr_reg));
-+ if (ret) {
-+ printk(KERN_ERR "MSR read : copy from user error.\n");
-+ return -EFAULT;
-+ }
-+ _rdmsr(iomsrreg->addr, &(iomsrreg->hi), &(iomsrreg->lo));
-+ ret = copy_to_user(ptr, iomsrreg, sizeof(struct io_msr_reg));
-+ if (ret) {
-+ printk(KERN_ERR "MSR read : copy to user error.\n");
-+ return -EFAULT;
-+ }
-+ break;
-+ case IOCTL_WRMSR:
-+ ret = copy_from_user(iomsrreg, ptr, sizeof(struct io_msr_reg));
-+ if (ret) {
-+ printk(KERN_ERR "MSR write : copy from user error.\n");
-+ return -EFAULT;
-+ }
-+ _wrmsr(iomsrreg->addr, iomsrreg->hi, iomsrreg->lo);
-+ break;
-+
-+ default:
-+ break;
-+ }
-+
-+ return 0;
-+}
-+
-+static long io_msr_compat_ioctl(struct file *file, unsigned int cmd,
-+ unsigned long arg)
-+{
-+ return io_msr_ioctl(file->f_dentry->d_inode, file, cmd, arg);
-+}
-+
-+static int io_msr_open(struct inode *inode, struct file *filp)
-+{
-+ struct io_msr_reg *iomsrreg = NULL;
-+ iomsrreg = kmalloc(sizeof(struct io_msr_reg), GFP_KERNEL);
-+ if (iomsrreg)
-+ filp->private_data = iomsrreg;
-+
-+ return iomsrreg ? 0 : -ENOMEM;
-+}
-+
-+static int io_msr_release(struct inode *inode, struct file *filp)
-+{
-+ struct io_msr_reg *iomsrreg = (struct io_msr_reg *)(filp->private_data);
-+
-+ filp->private_data = NULL;
-+ kfree(iomsrreg);
-+
-+ return 0;
-+}
-+
-+static const struct file_operations io_msr_fops = {
-+ .open = io_msr_open,
-+ .release = io_msr_release,
-+ .read = NULL,
-+ .write = NULL,
-+#ifdef CONFIG_64BIT
-+ .compat_ioctl = io_msr_compat_ioctl,
-+#else
-+ .ioctl = io_msr_ioctl,
-+#endif
-+};
-+
-+static struct miscdevice io_msr_device = {
-+ .minor = MISC_DYNAMIC_MINOR,
-+ .name = "io_msr_dev",
-+ .fops = &io_msr_fops
-+};
-+
-+static int __init io_msr_init(void)
-+{
-+ int ret;
-+
-+ printk(KERN_INFO "IO and MSR read/write device init.\n");
-+ ret = misc_register(&io_msr_device);
-+
-+ return ret;
-+}
-+
-+static void __exit io_msr_exit(void)
-+{
-+ printk(KERN_INFO "IO and MSR read/write device exit.\n");
-+ misc_deregister(&io_msr_device);
-+}
-+
-+module_init(io_msr_init);
-+module_exit(io_msr_exit);
-+
-+MODULE_AUTHOR("liujl <liujl@lemote.com>");
-+MODULE_DESCRIPTION("IO and MSR resources debug");
-+MODULE_LICENSE("GPL");
-diff -Nur linux-2.6.30.5.orig/drivers/platform/loongson/ec_kb3310b/Makefile linux-2.6.30.5/drivers/platform/loongson/ec_kb3310b/Makefile
---- linux-2.6.30.5.orig/drivers/platform/loongson/ec_kb3310b/Makefile 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.30.5/drivers/platform/loongson/ec_kb3310b/Makefile 2009-08-23 19:01:04.000000000 +0200
-@@ -0,0 +1,14 @@
-+#
-+# Embedded Controller(kb3310b) Driver for Yeeloong laptop
-+#
-+
-+obj-$(CONFIG_EC_KB3310B) += ec_miscd.o ec_batd.o ec_ftd.o ec_scid.o
-+
-+ec_miscd-objs := ec_misc.o
-+ec_batd-objs := ec_bat.o
-+ec_ftd-objs := ec_ft.o
-+ec_scid-objs := ec_sci.o
-+
-+obj-$(CONFIG_EC_KB3310B_DEBUG) += io_msr_debugd.o
-+
-+io_msr_debugd-objs := io_msr_debug.o
-diff -Nur linux-2.6.30.5.orig/drivers/platform/loongson/Kconfig linux-2.6.30.5/drivers/platform/loongson/Kconfig
---- linux-2.6.30.5.orig/drivers/platform/loongson/Kconfig 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.30.5/drivers/platform/loongson/Kconfig 2009-08-23 19:01:04.000000000 +0200
-@@ -0,0 +1,68 @@
-+#
-+# Loongson Platform Specific Drivers
-+#
-+
-+menuconfig LOONGSON_PLATFORM_DEVICES
-+ bool "Loongson Platform Specific Device Drivers"
-+ default y
-+ ---help---
-+ Say Y here to get to see options for device drivers for various
-+ loongson platforms, including vendor-specific laptop extension drivers.
-+ This option alone does not add any kernel code.
-+
-+ If you say N, all options in this submenu will be skipped and disabled.
-+
-+if LOONGSON_PLATFORM_DEVICES
-+
-+config EC_KB3310B
-+ tristate "Embedded Controller: Kb3310b support"
-+ depends on LEMOTE_YEELOONG2F
-+ default y
-+ ---help---
-+ This is a driver for yeeloong laptops. It adds the kb3310b support:
-+ i.e. battery management, fan & temperature mangement, sci event
-+ management and ec rom flushing.
-+
-+ This driver is orignally written by Liu junliang <liujl@lemote.com>
-+ and maintained by huangwei <huangw@lemote.com> currently.
-+
-+ The original git repository is: http://dev.lemote.com/code/ec_module
-+
-+config EC_KB3310B_DEBUG
-+ tristate "Embedded Controller: Kb3310b debug support"
-+ depends on EC_KB3310B
-+ default n
-+ ---help---
-+ This is a driver for yeeloong laptops. It adds the kb3310b debug
-+ support.
-+
-+ This driver is orignally written by Liu junliang <liujl@lemote.com>
-+ and maintained by huangwei <huangw@lemote.com> currently.
-+
-+ The original git repository is: http://dev.lemote.com/code/ec_module
-+
-+config PMON_FLASH
-+ tristate "MTD map driver for flushing PMON in Linux"
-+ depends on MTD && MTD_PARTITIONS
-+ default y
-+ ---help---
-+ This is a driver for flushing the bootloader(pmon) of
-+ fuloong2e,fuloong2f,yeeloong2f in Linux.
-+
-+ Here is a basic usage:
-+
-+ 1. load necessary modules
-+
-+ $ modprobe mtd
-+ $ modprobe mtdblock
-+ $ modprobe pmon_flashd
-+
-+ 2. read the flash
-+
-+ $ dd if=/dev/mtdblock0 of=pmon.bin
-+
-+ 3. write the falsh
-+
-+ $ dd if=pmon.bin of=/dev/mtdblock0
-+
-+endif # LOONGSON_PLATFORM_DEVICES
-diff -Nur linux-2.6.30.5.orig/drivers/platform/loongson/Makefile linux-2.6.30.5/drivers/platform/loongson/Makefile
---- linux-2.6.30.5.orig/drivers/platform/loongson/Makefile 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.30.5/drivers/platform/loongson/Makefile 2009-08-23 19:01:04.000000000 +0200
-@@ -0,0 +1,6 @@
-+#
-+# loongson platform specific drivers
-+#
-+
-+obj-$(CONFIG_EC_KB3310B) += ec_kb3310b/
-+obj-$(CONFIG_PMON_FLASH) += pmon_flash/
-diff -Nur linux-2.6.30.5.orig/drivers/platform/loongson/pmon_flash/Makefile linux-2.6.30.5/drivers/platform/loongson/pmon_flash/Makefile
---- linux-2.6.30.5.orig/drivers/platform/loongson/pmon_flash/Makefile 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.30.5/drivers/platform/loongson/pmon_flash/Makefile 2009-08-23 19:01:04.000000000 +0200
-@@ -0,0 +1,7 @@
-+#
-+# MTD map driver for flushing pmon flash
-+#
-+
-+obj-$(CONFIG_PMON_FLASH) += pmon_flashd.o
-+
-+pmon_flashd-objs := pmon_flash.o
-diff -Nur linux-2.6.30.5.orig/drivers/platform/loongson/pmon_flash/pmon_flash.c linux-2.6.30.5/drivers/platform/loongson/pmon_flash/pmon_flash.c
---- linux-2.6.30.5.orig/drivers/platform/loongson/pmon_flash/pmon_flash.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.30.5/drivers/platform/loongson/pmon_flash/pmon_flash.c 2009-08-23 19:01:04.000000000 +0200
-@@ -0,0 +1,85 @@
-+/*
-+ * Copyright www.lemote.com
-+ *
-+ * 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.
-+ */
-+
-+#include <linux/module.h>
-+#include <linux/types.h>
-+#include <linux/kernel.h>
-+#include <linux/init.h>
-+#include <asm/io.h>
-+#include <linux/mtd/mtd.h>
-+#include <linux/mtd/map.h>
-+#include <linux/mtd/partitions.h>
-+
-+#define FLASH_PHYS_ADDR 0x1fc00000
-+#define FLASH_SIZE 0x080000
-+
-+#define FLASH_PARTITION0_ADDR 0x00000000
-+#define FLASH_PARTITION0_SIZE 0x00080000
-+
-+struct map_info flash_map = {
-+ .name = "flash device",
-+ .size = FLASH_SIZE,
-+ .bankwidth = 1,
-+};
-+
-+struct mtd_partition flash_parts[] = {
-+ {
-+ .name = "Bootloader",
-+ .offset = FLASH_PARTITION0_ADDR,
-+ .size = FLASH_PARTITION0_SIZE},
-+};
-+
-+#define PARTITION_COUNT ARRAY_SIZE(flash_parts)
-+
-+static struct mtd_info *mymtd;
-+
-+int __init init_flash(void)
-+{
-+ printk(KERN_NOTICE "Flash flash device: %x at %x\n",
-+ FLASH_SIZE, FLASH_PHYS_ADDR);
-+
-+ flash_map.phys = FLASH_PHYS_ADDR;
-+ flash_map.virt = ioremap(FLASH_PHYS_ADDR, FLASH_SIZE);
-+
-+ if (!flash_map.virt) {
-+ printk(KERN_NOTICE "Failed to ioremap\n");
-+ return -EIO;
-+ }
-+
-+ simple_map_init(&flash_map);
-+
-+ mymtd = do_map_probe("cfi_probe", &flash_map);
-+ if (mymtd) {
-+ add_mtd_partitions(mymtd, flash_parts, PARTITION_COUNT);
-+ printk(KERN_NOTICE "pmon flash device initialized\n");
-+ return 0;
-+ }
-+
-+ iounmap((void *)flash_map.virt);
-+ return -ENXIO;
-+}
-+
-+static void __exit cleanup_flash(void)
-+{
-+ if (mymtd) {
-+ del_mtd_partitions(mymtd);
-+ map_destroy(mymtd);
-+ }
-+ if (flash_map.virt) {
-+ iounmap((void *)flash_map.virt);
-+ flash_map.virt = 0;
-+ }
-+}
-+
-+module_init(init_flash);
-+module_exit(cleanup_flash);
-+
-+MODULE_LICENSE("GPL");
-+MODULE_AUTHOR("Yanhua");
-+MODULE_DESCRIPTION("MTD map driver for pmon programming module");
-diff -Nur linux-2.6.30.5.orig/drivers/platform/Makefile linux-2.6.30.5/drivers/platform/Makefile
---- linux-2.6.30.5.orig/drivers/platform/Makefile 2009-08-16 23:19:38.000000000 +0200
-+++ linux-2.6.30.5/drivers/platform/Makefile 2009-08-23 19:01:04.000000000 +0200
-@@ -3,3 +3,4 @@
- #
-
- obj-$(CONFIG_X86) += x86/
-+obj-$(CONFIG_MACH_LOONGSON) += loongson/
-diff -Nur linux-2.6.30.5.orig/drivers/rtc/rtc-cmos.c linux-2.6.30.5/drivers/rtc/rtc-cmos.c
---- linux-2.6.30.5.orig/drivers/rtc/rtc-cmos.c 2009-08-16 23:19:38.000000000 +0200
-+++ linux-2.6.30.5/drivers/rtc/rtc-cmos.c 2009-08-23 19:01:04.000000000 +0200
-@@ -691,7 +691,8 @@
- */
- #if defined(CONFIG_ATARI)
- address_space = 64;
--#elif defined(__i386__) || defined(__x86_64__) || defined(__arm__) || defined(__sparc__)
-+#elif defined(__i386__) || defined(__x86_64__) || defined(__arm__) \
-+ || defined(__sparc__) || defined(__mips__)
- address_space = 128;
- #else
- #warning Assuming 128 bytes of RTC+NVRAM address space, not 64 bytes.
-@@ -756,9 +757,8 @@
- /* FIXME teach the alarm code how to handle binary mode;
- * <asm-generic/rtc.h> doesn't know 12-hour mode either.
- */
-- if (is_valid_irq(rtc_irq) &&
-- (!(rtc_control & RTC_24H) || (rtc_control & (RTC_DM_BINARY)))) {
-- dev_dbg(dev, "only 24-hr BCD mode supported\n");
-+ if (is_valid_irq(rtc_irq) && !(rtc_control & RTC_24H)) {
-+ dev_dbg(dev, "only 24-hr supported\n");
- retval = -ENXIO;
- goto cleanup1;
- }
-diff -Nur linux-2.6.30.5.orig/drivers/video/Kconfig linux-2.6.30.5/drivers/video/Kconfig
---- linux-2.6.30.5.orig/drivers/video/Kconfig 2009-08-16 23:19:38.000000000 +0200
-+++ linux-2.6.30.5/drivers/video/Kconfig 2009-08-23 19:01:04.000000000 +0200
-@@ -1930,6 +1930,28 @@
- Turn on debugging messages. Note that you can set/unset at run time
- through sysfs
-
-+config FB_SM7XX
-+ tristate "Silicon Motion SM7XX Frame Buffer Support"
-+ depends on FB
-+ select FB_CFB_FILLRECT
-+ select FB_CFB_COPYAREA
-+ select FB_CFB_IMAGEBLIT
-+ help
-+ Frame Buffer driver for the Silicon Motion SM7XX serial graphic card.
-+
-+config FB_SM7XX_ACCEL
-+ bool "Siliconmotion Acceleration functions (EXPERIMENTAL)"
-+ depends on FB_SM7XX && EXPERIMENTAL
-+ help
-+ This will compile the Trident frame buffer device with
-+ acceleration functions.
-+
-+config FB_SM7XX_DUALHEAD
-+ bool "Siliconmotion dualhead support (EXPERIMENTAL)"
-+ depends on FB_SM7XX && EXPERIMENTAL
-+ help
-+ This will enable the dualhead support of SM7XX
-+
- config FB_SM501
- tristate "Silicon Motion SM501 framebuffer support"
- depends on FB && MFD_SM501
-diff -Nur linux-2.6.30.5.orig/drivers/video/Makefile linux-2.6.30.5/drivers/video/Makefile
---- linux-2.6.30.5.orig/drivers/video/Makefile 2009-08-16 23:19:38.000000000 +0200
-+++ linux-2.6.30.5/drivers/video/Makefile 2009-08-23 19:01:04.000000000 +0200
-@@ -70,6 +70,7 @@
- obj-$(CONFIG_FB_TCX) += tcx.o sbuslib.o
- obj-$(CONFIG_FB_LEO) += leo.o sbuslib.o
- obj-$(CONFIG_FB_SGIVW) += sgivwfb.o
-+obj-$(CONFIG_FB_SM7XX) += sm7xx/
- obj-$(CONFIG_FB_ACORN) += acornfb.o
- obj-$(CONFIG_FB_ATARI) += atafb.o c2p_iplan2.o atafb_mfb.o \
- atafb_iplan2p2.o atafb_iplan2p4.o atafb_iplan2p8.o
-diff -Nur linux-2.6.30.5.orig/drivers/video/sm7xx/Makefile linux-2.6.30.5/drivers/video/sm7xx/Makefile
---- linux-2.6.30.5.orig/drivers/video/sm7xx/Makefile 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.30.5/drivers/video/sm7xx/Makefile 2009-08-23 19:01:04.000000000 +0200
-@@ -0,0 +1,3 @@
-+obj-$(CONFIG_FB_SM7XX) += sm7xx.o
-+
-+sm7xx-y := smtcfb.o
-diff -Nur linux-2.6.30.5.orig/drivers/video/sm7xx/smtc2d.c linux-2.6.30.5/drivers/video/sm7xx/smtc2d.c
---- linux-2.6.30.5.orig/drivers/video/sm7xx/smtc2d.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.30.5/drivers/video/sm7xx/smtc2d.c 2009-08-23 19:01:04.000000000 +0200
-@@ -0,0 +1,979 @@
-+/*
-+ * smtc2d.c -- Silicon Motion SM7xx 2D drawing engine functions.
-+ *
-+ * Copyright (C) 2006 Silicon Motion Technology Corp.
-+ * Author: Boyod boyod.yang@siliconmotion.com.cn
-+ *
-+ * Copyright (C) 2009 Lemote, Inc. & Institute of Computing Technology
-+ * Author: Wu Zhangjin, wuzj@lemote.com
-+ *
-+ * This file is subject to the terms and conditions of the GNU General Public
-+ * License. See the file COPYING in the main directory of this archive for
-+ * more details.
-+ *
-+ * Version 0.10.26192.21.01
-+ * - Add PowerPC support
-+ * - Add 2D support for Lynx -
-+ * Verified on 2.6.19.2
-+ * Boyod.yang <boyod.yang@siliconmotion.com.cn>
-+ */
-+
-+unsigned char smtc_de_busy;
-+
-+void SMTC_write2Dreg(unsigned long nOffset, unsigned long nData)
-+{
-+ writel(nData, smtc_2DBaseAddress + nOffset);
-+}
-+
-+unsigned long SMTC_read2Dreg(unsigned long nOffset)
-+{
-+ return readl(smtc_2DBaseAddress + nOffset);
-+}
-+
-+void SMTC_write2Ddataport(unsigned long nOffset, unsigned long nData)
-+{
-+ writel(nData, smtc_2Ddataport + nOffset);
-+}
-+
-+/**********************************************************************
-+ *
-+ * deInit
-+ *
-+ * Purpose
-+ * Drawing engine initialization.
-+ *
-+ **********************************************************************/
-+
-+void deInit(unsigned int nModeWidth, unsigned int nModeHeight,
-+ unsigned int bpp)
-+{
-+ /* Get current power configuration. */
-+ unsigned char clock;
-+ clock = smtc_seqr(0x21);
-+
-+ /* initialize global 'mutex lock' variable */
-+ smtc_de_busy = 0;
-+
-+ /* Enable 2D Drawing Engine */
-+ smtc_seqw(0x21, clock & 0xF8);
-+
-+ SMTC_write2Dreg(DE_CLIP_TL,
-+ FIELD_VALUE(0, DE_CLIP_TL, TOP, 0) |
-+ FIELD_SET(0, DE_CLIP_TL, STATUS, DISABLE) |
-+ FIELD_SET(0, DE_CLIP_TL, INHIBIT, OUTSIDE) |
-+ FIELD_VALUE(0, DE_CLIP_TL, LEFT, 0));
-+
-+ if (bpp >= 24) {
-+ SMTC_write2Dreg(DE_PITCH,
-+ FIELD_VALUE(0, DE_PITCH, DESTINATION,
-+ nModeWidth * 3) | FIELD_VALUE(0,
-+ DE_PITCH,
-+ SOURCE,
-+ nModeWidth
-+ * 3));
-+ } else {
-+ SMTC_write2Dreg(DE_PITCH,
-+ FIELD_VALUE(0, DE_PITCH, DESTINATION,
-+ nModeWidth) | FIELD_VALUE(0,
-+ DE_PITCH,
-+ SOURCE,
-+ nModeWidth));
-+ }
-+
-+ SMTC_write2Dreg(DE_WINDOW_WIDTH,
-+ FIELD_VALUE(0, DE_WINDOW_WIDTH, DESTINATION,
-+ nModeWidth) | FIELD_VALUE(0,
-+ DE_WINDOW_WIDTH,
-+ SOURCE,
-+ nModeWidth));
-+
-+ switch (bpp) {
-+ case 8:
-+ SMTC_write2Dreg(DE_STRETCH_FORMAT,
-+ FIELD_SET(0, DE_STRETCH_FORMAT, PATTERN_XY,
-+ NORMAL) | FIELD_VALUE(0,
-+ DE_STRETCH_FORMAT,
-+ PATTERN_Y,
-+ 0) |
-+ FIELD_VALUE(0, DE_STRETCH_FORMAT, PATTERN_X,
-+ 0) | FIELD_SET(0, DE_STRETCH_FORMAT,
-+ PIXEL_FORMAT,
-+ 8) | FIELD_SET(0,
-+ DE_STRETCH_FORMAT,
-+ ADDRESSING,
-+ XY) |
-+ FIELD_VALUE(0, DE_STRETCH_FORMAT,
-+ SOURCE_HEIGHT, 3));
-+ break;
-+ case 24:
-+ SMTC_write2Dreg(DE_STRETCH_FORMAT,
-+ FIELD_SET(0, DE_STRETCH_FORMAT, PATTERN_XY,
-+ NORMAL) | FIELD_VALUE(0,
-+ DE_STRETCH_FORMAT,
-+ PATTERN_Y,
-+ 0) |
-+ FIELD_VALUE(0, DE_STRETCH_FORMAT, PATTERN_X,
-+ 0) | FIELD_SET(0, DE_STRETCH_FORMAT,
-+ PIXEL_FORMAT,
-+ 24) | FIELD_SET(0,
-+ DE_STRETCH_FORMAT,
-+ ADDRESSING,
-+ XY) |
-+ FIELD_VALUE(0, DE_STRETCH_FORMAT,
-+ SOURCE_HEIGHT, 3));
-+ break;
-+ case 16:
-+ default:
-+ SMTC_write2Dreg(DE_STRETCH_FORMAT,
-+ FIELD_SET(0, DE_STRETCH_FORMAT, PATTERN_XY,
-+ NORMAL) | FIELD_VALUE(0,
-+ DE_STRETCH_FORMAT,
-+ PATTERN_Y,
-+ 0) |
-+ FIELD_VALUE(0, DE_STRETCH_FORMAT, PATTERN_X,
-+ 0) | FIELD_SET(0, DE_STRETCH_FORMAT,
-+ PIXEL_FORMAT,
-+ 16) | FIELD_SET(0,
-+ DE_STRETCH_FORMAT,
-+ ADDRESSING,
-+ XY) |
-+ FIELD_VALUE(0, DE_STRETCH_FORMAT,
-+ SOURCE_HEIGHT, 3));
-+ break;
-+ }
-+
-+ SMTC_write2Dreg(DE_MASKS,
-+ FIELD_VALUE(0, DE_MASKS, BYTE_MASK, 0xFFFF) |
-+ FIELD_VALUE(0, DE_MASKS, BIT_MASK, 0xFFFF));
-+ SMTC_write2Dreg(DE_COLOR_COMPARE_MASK,
-+ FIELD_VALUE(0, DE_COLOR_COMPARE_MASK, MASKS, \
-+ 0xFFFFFF));
-+ SMTC_write2Dreg(DE_COLOR_COMPARE,
-+ FIELD_VALUE(0, DE_COLOR_COMPARE, COLOR, 0xFFFFFF));
-+}
-+
-+void deVerticalLine(unsigned long dst_base,
-+ unsigned long dst_pitch,
-+ unsigned long nX,
-+ unsigned long nY,
-+ unsigned long dst_height, unsigned long nColor)
-+{
-+ deWaitForNotBusy();
-+
-+ SMTC_write2Dreg(DE_WINDOW_DESTINATION_BASE,
-+ FIELD_VALUE(0, DE_WINDOW_DESTINATION_BASE, ADDRESS,
-+ dst_base));
-+
-+ SMTC_write2Dreg(DE_PITCH,
-+ FIELD_VALUE(0, DE_PITCH, DESTINATION, dst_pitch) |
-+ FIELD_VALUE(0, DE_PITCH, SOURCE, dst_pitch));
-+
-+ SMTC_write2Dreg(DE_WINDOW_WIDTH,
-+ FIELD_VALUE(0, DE_WINDOW_WIDTH, DESTINATION,
-+ dst_pitch) | FIELD_VALUE(0, DE_WINDOW_WIDTH,
-+ SOURCE,
-+ dst_pitch));
-+
-+ SMTC_write2Dreg(DE_FOREGROUND,
-+ FIELD_VALUE(0, DE_FOREGROUND, COLOR, nColor));
-+
-+ SMTC_write2Dreg(DE_DESTINATION,
-+ FIELD_SET(0, DE_DESTINATION, WRAP, DISABLE) |
-+ FIELD_VALUE(0, DE_DESTINATION, X, nX) |
-+ FIELD_VALUE(0, DE_DESTINATION, Y, nY));
-+
-+ SMTC_write2Dreg(DE_DIMENSION,
-+ FIELD_VALUE(0, DE_DIMENSION, X, 1) |
-+ FIELD_VALUE(0, DE_DIMENSION, Y_ET, dst_height));
-+
-+ SMTC_write2Dreg(DE_CONTROL,
-+ FIELD_SET(0, DE_CONTROL, STATUS, START) |
-+ FIELD_SET(0, DE_CONTROL, DIRECTION, LEFT_TO_RIGHT) |
-+ FIELD_SET(0, DE_CONTROL, MAJOR, Y) |
-+ FIELD_SET(0, DE_CONTROL, STEP_X, NEGATIVE) |
-+ FIELD_SET(0, DE_CONTROL, STEP_Y, POSITIVE) |
-+ FIELD_SET(0, DE_CONTROL, LAST_PIXEL, OFF) |
-+ FIELD_SET(0, DE_CONTROL, COMMAND, SHORT_STROKE) |
-+ FIELD_SET(0, DE_CONTROL, ROP_SELECT, ROP2) |
-+ FIELD_VALUE(0, DE_CONTROL, ROP, 0x0C));
-+
-+ smtc_de_busy = 1;
-+}
-+
-+void deHorizontalLine(unsigned long dst_base,
-+ unsigned long dst_pitch,
-+ unsigned long nX,
-+ unsigned long nY,
-+ unsigned long dst_width, unsigned long nColor)
-+{
-+ deWaitForNotBusy();
-+
-+ SMTC_write2Dreg(DE_WINDOW_DESTINATION_BASE,
-+ FIELD_VALUE(0, DE_WINDOW_DESTINATION_BASE, ADDRESS,
-+ dst_base));
-+
-+ SMTC_write2Dreg(DE_PITCH,
-+ FIELD_VALUE(0, DE_PITCH, DESTINATION, dst_pitch) |
-+ FIELD_VALUE(0, DE_PITCH, SOURCE, dst_pitch));
-+
-+ SMTC_write2Dreg(DE_WINDOW_WIDTH,
-+ FIELD_VALUE(0, DE_WINDOW_WIDTH, DESTINATION,
-+ dst_pitch) | FIELD_VALUE(0, DE_WINDOW_WIDTH,
-+ SOURCE,
-+ dst_pitch));
-+ SMTC_write2Dreg(DE_FOREGROUND,
-+ FIELD_VALUE(0, DE_FOREGROUND, COLOR, nColor));
-+ SMTC_write2Dreg(DE_DESTINATION,
-+ FIELD_SET(0, DE_DESTINATION, WRAP,
-+ DISABLE) | FIELD_VALUE(0, DE_DESTINATION, X,
-+ nX) | FIELD_VALUE(0,
-+ DE_DESTINATION,
-+ Y,
-+ nY));
-+ SMTC_write2Dreg(DE_DIMENSION,
-+ FIELD_VALUE(0, DE_DIMENSION, X,
-+ dst_width) | FIELD_VALUE(0, DE_DIMENSION,
-+ Y_ET, 1));
-+ SMTC_write2Dreg(DE_CONTROL,
-+ FIELD_SET(0, DE_CONTROL, STATUS, START) | FIELD_SET(0,
-+ DE_CONTROL,
-+ DIRECTION,
-+ RIGHT_TO_LEFT)
-+ | FIELD_SET(0, DE_CONTROL, MAJOR, X) | FIELD_SET(0,
-+ DE_CONTROL,
-+ STEP_X,
-+ POSITIVE)
-+ | FIELD_SET(0, DE_CONTROL, STEP_Y,
-+ NEGATIVE) | FIELD_SET(0, DE_CONTROL,
-+ LAST_PIXEL,
-+ OFF) | FIELD_SET(0,
-+ DE_CONTROL,
-+ COMMAND,
-+ SHORT_STROKE)
-+ | FIELD_SET(0, DE_CONTROL, ROP_SELECT,
-+ ROP2) | FIELD_VALUE(0, DE_CONTROL, ROP,
-+ 0x0C));
-+
-+ smtc_de_busy = 1;
-+}
-+
-+void deLine(unsigned long dst_base,
-+ unsigned long dst_pitch,
-+ unsigned long nX1,
-+ unsigned long nY1,
-+ unsigned long nX2, unsigned long nY2, unsigned long nColor)
-+{
-+ unsigned long nCommand =
-+ FIELD_SET(0, DE_CONTROL, STATUS, START) |
-+ FIELD_SET(0, DE_CONTROL, DIRECTION, LEFT_TO_RIGHT) |
-+ FIELD_SET(0, DE_CONTROL, MAJOR, X) |
-+ FIELD_SET(0, DE_CONTROL, STEP_X, POSITIVE) |
-+ FIELD_SET(0, DE_CONTROL, STEP_Y, POSITIVE) |
-+ FIELD_SET(0, DE_CONTROL, LAST_PIXEL, OFF) |
-+ FIELD_SET(0, DE_CONTROL, ROP_SELECT, ROP2) |
-+ FIELD_VALUE(0, DE_CONTROL, ROP, 0x0C);
-+ unsigned long DeltaX;
-+ unsigned long DeltaY;
-+
-+ /* Calculate delta X */
-+ if (nX1 <= nX2)
-+ DeltaX = nX2 - nX1;
-+ else {
-+ DeltaX = nX1 - nX2;
-+ nCommand = FIELD_SET(nCommand, DE_CONTROL, STEP_X, NEGATIVE);
-+ }
-+
-+ /* Calculate delta Y */
-+ if (nY1 <= nY2)
-+ DeltaY = nY2 - nY1;
-+ else {
-+ DeltaY = nY1 - nY2;
-+ nCommand = FIELD_SET(nCommand, DE_CONTROL, STEP_Y, NEGATIVE);
-+ }
-+
-+ /* Determine the major axis */
-+ if (DeltaX < DeltaY)
-+ nCommand = FIELD_SET(nCommand, DE_CONTROL, MAJOR, Y);
-+
-+ /* Vertical line? */
-+ if (nX1 == nX2)
-+ deVerticalLine(dst_base, dst_pitch, nX1, nY1, DeltaY, nColor);
-+
-+ /* Horizontal line? */
-+ else if (nY1 == nY2)
-+ deHorizontalLine(dst_base, dst_pitch, nX1, nY1, \
-+ DeltaX, nColor);
-+
-+ /* Diagonal line? */
-+ else if (DeltaX == DeltaY) {
-+ deWaitForNotBusy();
-+
-+ SMTC_write2Dreg(DE_WINDOW_DESTINATION_BASE,
-+ FIELD_VALUE(0, DE_WINDOW_DESTINATION_BASE,
-+ ADDRESS, dst_base));
-+
-+ SMTC_write2Dreg(DE_PITCH,
-+ FIELD_VALUE(0, DE_PITCH, DESTINATION,
-+ dst_pitch) | FIELD_VALUE(0,
-+ DE_PITCH,
-+ SOURCE,
-+ dst_pitch));
-+
-+ SMTC_write2Dreg(DE_WINDOW_WIDTH,
-+ FIELD_VALUE(0, DE_WINDOW_WIDTH, DESTINATION,
-+ dst_pitch) | FIELD_VALUE(0,
-+ DE_WINDOW_WIDTH,
-+ SOURCE,
-+ dst_pitch));
-+
-+ SMTC_write2Dreg(DE_FOREGROUND,
-+ FIELD_VALUE(0, DE_FOREGROUND, COLOR, nColor));
-+
-+ SMTC_write2Dreg(DE_DESTINATION,
-+ FIELD_SET(0, DE_DESTINATION, WRAP, DISABLE) |
-+ FIELD_VALUE(0, DE_DESTINATION, X, 1) |
-+ FIELD_VALUE(0, DE_DESTINATION, Y, nY1));
-+
-+ SMTC_write2Dreg(DE_DIMENSION,
-+ FIELD_VALUE(0, DE_DIMENSION, X, 1) |
-+ FIELD_VALUE(0, DE_DIMENSION, Y_ET, DeltaX));
-+
-+ SMTC_write2Dreg(DE_CONTROL,
-+ FIELD_SET(nCommand, DE_CONTROL, COMMAND,
-+ SHORT_STROKE));
-+ }
-+
-+ /* Generic line */
-+ else {
-+ unsigned int k1, k2, et, w;
-+ if (DeltaX < DeltaY) {
-+ k1 = 2 * DeltaX;
-+ et = k1 - DeltaY;
-+ k2 = et - DeltaY;
-+ w = DeltaY + 1;
-+ } else {
-+ k1 = 2 * DeltaY;
-+ et = k1 - DeltaX;
-+ k2 = et - DeltaX;
-+ w = DeltaX + 1;
-+ }
-+
-+ deWaitForNotBusy();
-+
-+ SMTC_write2Dreg(DE_WINDOW_DESTINATION_BASE,
-+ FIELD_VALUE(0, DE_WINDOW_DESTINATION_BASE,
-+ ADDRESS, dst_base));
-+
-+ SMTC_write2Dreg(DE_PITCH,
-+ FIELD_VALUE(0, DE_PITCH, DESTINATION,
-+ dst_pitch) | FIELD_VALUE(0,
-+ DE_PITCH,
-+ SOURCE,
-+ dst_pitch));
-+
-+ SMTC_write2Dreg(DE_WINDOW_WIDTH,
-+ FIELD_VALUE(0, DE_WINDOW_WIDTH, DESTINATION,
-+ dst_pitch) | FIELD_VALUE(0,
-+ DE_WINDOW_WIDTH,
-+ SOURCE,
-+ dst_pitch));
-+
-+ SMTC_write2Dreg(DE_FOREGROUND,
-+ FIELD_VALUE(0, DE_FOREGROUND, COLOR, nColor));
-+
-+ SMTC_write2Dreg(DE_SOURCE,
-+ FIELD_SET(0, DE_SOURCE, WRAP, DISABLE) |
-+ FIELD_VALUE(0, DE_SOURCE, X_K1, k1) |
-+ FIELD_VALUE(0, DE_SOURCE, Y_K2, k2));
-+
-+ SMTC_write2Dreg(DE_DESTINATION,
-+ FIELD_SET(0, DE_DESTINATION, WRAP, DISABLE) |
-+ FIELD_VALUE(0, DE_DESTINATION, X, nX1) |
-+ FIELD_VALUE(0, DE_DESTINATION, Y, nY1));
-+
-+ SMTC_write2Dreg(DE_DIMENSION,
-+ FIELD_VALUE(0, DE_DIMENSION, X, w) |
-+ FIELD_VALUE(0, DE_DIMENSION, Y_ET, et));
-+
-+ SMTC_write2Dreg(DE_CONTROL,
-+ FIELD_SET(nCommand, DE_CONTROL, COMMAND,
-+ LINE_DRAW));
-+ }
-+
-+ smtc_de_busy = 1;
-+}
-+
-+void deFillRect(unsigned long dst_base,
-+ unsigned long dst_pitch,
-+ unsigned long dst_X,
-+ unsigned long dst_Y,
-+ unsigned long dst_width,
-+ unsigned long dst_height, unsigned long nColor)
-+{
-+ deWaitForNotBusy();
-+
-+ SMTC_write2Dreg(DE_WINDOW_DESTINATION_BASE,
-+ FIELD_VALUE(0, DE_WINDOW_DESTINATION_BASE, ADDRESS,
-+ dst_base));
-+
-+ if (dst_pitch) {
-+ SMTC_write2Dreg(DE_PITCH,
-+ FIELD_VALUE(0, DE_PITCH, DESTINATION,
-+ dst_pitch) | FIELD_VALUE(0,
-+ DE_PITCH,
-+ SOURCE,
-+ dst_pitch));
-+
-+ SMTC_write2Dreg(DE_WINDOW_WIDTH,
-+ FIELD_VALUE(0, DE_WINDOW_WIDTH, DESTINATION,
-+ dst_pitch) | FIELD_VALUE(0,
-+ DE_WINDOW_WIDTH,
-+ SOURCE,
-+ dst_pitch));
-+ }
-+
-+ SMTC_write2Dreg(DE_FOREGROUND,
-+ FIELD_VALUE(0, DE_FOREGROUND, COLOR, nColor));
-+
-+ SMTC_write2Dreg(DE_DESTINATION,
-+ FIELD_SET(0, DE_DESTINATION, WRAP, DISABLE) |
-+ FIELD_VALUE(0, DE_DESTINATION, X, dst_X) |
-+ FIELD_VALUE(0, DE_DESTINATION, Y, dst_Y));
-+
-+ SMTC_write2Dreg(DE_DIMENSION,
-+ FIELD_VALUE(0, DE_DIMENSION, X, dst_width) |
-+ FIELD_VALUE(0, DE_DIMENSION, Y_ET, dst_height));
-+
-+ SMTC_write2Dreg(DE_CONTROL,
-+ FIELD_SET(0, DE_CONTROL, STATUS, START) |
-+ FIELD_SET(0, DE_CONTROL, DIRECTION, LEFT_TO_RIGHT) |
-+ FIELD_SET(0, DE_CONTROL, LAST_PIXEL, OFF) |
-+ FIELD_SET(0, DE_CONTROL, COMMAND, RECTANGLE_FILL) |
-+ FIELD_SET(0, DE_CONTROL, ROP_SELECT, ROP2) |
-+ FIELD_VALUE(0, DE_CONTROL, ROP, 0x0C));
-+
-+ smtc_de_busy = 1;
-+}
-+
-+/**********************************************************************
-+ *
-+ * deRotatePattern
-+ *
-+ * Purpose
-+ * Rotate the given pattern if necessary
-+ *
-+ * Parameters
-+ * [in]
-+ * pPattern - Pointer to DE_SURFACE structure containing
-+ * pattern attributes
-+ * patternX - X position (0-7) of pattern origin
-+ * patternY - Y position (0-7) of pattern origin
-+ *
-+ * [out]
-+ * pattern_dstaddr - Pointer to pre-allocated buffer containing
-+ * rotated pattern
-+ *
-+ **********************************************************************/
-+void deRotatePattern(unsigned char *pattern_dstaddr,
-+ unsigned long pattern_src_addr,
-+ unsigned long pattern_BPP,
-+ unsigned long pattern_stride, int patternX, int patternY)
-+{
-+ unsigned int i;
-+ unsigned long pattern[PATTERN_WIDTH * PATTERN_HEIGHT];
-+ unsigned int x, y;
-+ unsigned char *pjPatByte;
-+
-+ if (pattern_dstaddr != NULL) {
-+ deWaitForNotBusy();
-+
-+ if (patternX || patternY) {
-+ /* Rotate pattern */
-+ pjPatByte = (unsigned char *)pattern;
-+
-+ switch (pattern_BPP) {
-+ case 8:
-+ {
-+ for (y = 0; y < 8; y++) {
-+ unsigned char *pjBuffer =
-+ pattern_dstaddr +
-+ ((patternY + y) & 7) * 8;
-+ for (x = 0; x < 8; x++) {
-+ pjBuffer[(patternX +
-+ x) & 7] =
-+ pjPatByte[x];
-+ }
-+ pjPatByte += pattern_stride;
-+ }
-+ break;
-+ }
-+
-+ case 16:
-+ {
-+ for (y = 0; y < 8; y++) {
-+ unsigned short *pjBuffer =
-+ (unsigned short *)
-+ pattern_dstaddr +
-+ ((patternY + y) & 7) * 8;
-+ for (x = 0; x < 8; x++) {
-+ pjBuffer[(patternX +
-+ x) & 7] =
-+ ((unsigned short *)
-+ pjPatByte)[x];
-+ }
-+ pjPatByte += pattern_stride;
-+ }
-+ break;
-+ }
-+
-+ case 32:
-+ {
-+ for (y = 0; y < 8; y++) {
-+ unsigned long *pjBuffer =
-+ (unsigned long *)
-+ pattern_dstaddr +
-+ ((patternY + y) & 7) * 8;
-+ for (x = 0; x < 8; x++) {
-+ pjBuffer[(patternX +
-+ x) & 7] =
-+ ((unsigned long *)
-+ pjPatByte)[x];
-+ }
-+ pjPatByte += pattern_stride;
-+ }
-+ break;
-+ }
-+ }
-+ } else {
-+ /*Don't rotate,just copy pattern into pattern_dstaddr*/
-+ for (i = 0; i < (pattern_BPP * 2); i++) {
-+ ((unsigned long *)pattern_dstaddr)[i] =
-+ pattern[i];
-+ }
-+ }
-+
-+ }
-+}
-+
-+/**********************************************************************
-+ *
-+ * deCopy
-+ *
-+ * Purpose
-+ * Copy a rectangular area of the source surface to a destination surface
-+ *
-+ * Remarks
-+ * Source bitmap must have the same color depth (BPP) as the destination
-+ * bitmap.
-+ *
-+**********************************************************************/
-+void deCopy(unsigned long dst_base,
-+ unsigned long dst_pitch,
-+ unsigned long dst_BPP,
-+ unsigned long dst_X,
-+ unsigned long dst_Y,
-+ unsigned long dst_width,
-+ unsigned long dst_height,
-+ unsigned long src_base,
-+ unsigned long src_pitch,
-+ unsigned long src_X,
-+ unsigned long src_Y, pTransparent pTransp, unsigned char nROP2)
-+{
-+ unsigned long nDirection = 0;
-+ unsigned long nTransparent = 0;
-+ /* Direction of ROP2 operation:
-+ * 1 = Left to Right,
-+ * (-1) = Right to Left
-+ */
-+ unsigned long opSign = 1;
-+ /* xWidth is in pixels */
-+ unsigned long xWidth = 192 / (dst_BPP / 8);
-+ unsigned long de_ctrl = 0;
-+
-+ deWaitForNotBusy();
-+
-+ SMTC_write2Dreg(DE_WINDOW_DESTINATION_BASE,
-+ FIELD_VALUE(0, DE_WINDOW_DESTINATION_BASE, ADDRESS,
-+ dst_base));
-+
-+ SMTC_write2Dreg(DE_WINDOW_SOURCE_BASE,
-+ FIELD_VALUE(0, DE_WINDOW_SOURCE_BASE, ADDRESS,
-+ src_base));
-+
-+ if (dst_pitch && src_pitch) {
-+ SMTC_write2Dreg(DE_PITCH,
-+ FIELD_VALUE(0, DE_PITCH, DESTINATION,
-+ dst_pitch) | FIELD_VALUE(0,
-+ DE_PITCH,
-+ SOURCE,
-+ src_pitch));
-+
-+ SMTC_write2Dreg(DE_WINDOW_WIDTH,
-+ FIELD_VALUE(0, DE_WINDOW_WIDTH, DESTINATION,
-+ dst_pitch) | FIELD_VALUE(0,
-+ DE_WINDOW_WIDTH,
-+ SOURCE,
-+ src_pitch));
-+ }
-+
-+ /* Set transparent bits if necessary */
-+ if (pTransp != NULL) {
-+ nTransparent =
-+ pTransp->match | pTransp->select | pTransp->control;
-+
-+ /* Set color compare register */
-+ SMTC_write2Dreg(DE_COLOR_COMPARE,
-+ FIELD_VALUE(0, DE_COLOR_COMPARE, COLOR,
-+ pTransp->color));
-+ }
-+
-+ /* Determine direction of operation */
-+ if (src_Y < dst_Y) {
-+ /* +----------+
-+ |S |
-+ | +----------+
-+ | | | |
-+ | | | |
-+ +---|------+ |
-+ | D |
-+ +----------+ */
-+
-+ nDirection = BOTTOM_TO_TOP;
-+ } else if (src_Y > dst_Y) {
-+ /* +----------+
-+ |D |
-+ | +----------+
-+ | | | |
-+ | | | |
-+ +---|------+ |
-+ | S |
-+ +----------+ */
-+
-+ nDirection = TOP_TO_BOTTOM;
-+ } else {
-+ /* src_Y == dst_Y */
-+
-+ if (src_X <= dst_X) {
-+ /* +------+---+------+
-+ |S | | D|
-+ | | | |
-+ | | | |
-+ | | | |
-+ +------+---+------+ */
-+
-+ nDirection = RIGHT_TO_LEFT;
-+ } else {
-+ /* src_X > dst_X */
-+
-+ /* +------+---+------+
-+ |D | | S|
-+ | | | |
-+ | | | |
-+ | | | |
-+ +------+---+------+ */
-+
-+ nDirection = LEFT_TO_RIGHT;
-+ }
-+ }
-+
-+ if ((nDirection == BOTTOM_TO_TOP) || (nDirection == RIGHT_TO_LEFT)) {
-+ src_X += dst_width - 1;
-+ src_Y += dst_height - 1;
-+ dst_X += dst_width - 1;
-+ dst_Y += dst_height - 1;
-+ opSign = (-1);
-+ }
-+
-+ if (dst_BPP >= 24) {
-+ src_X *= 3;
-+ src_Y *= 3;
-+ dst_X *= 3;
-+ dst_Y *= 3;
-+ dst_width *= 3;
-+ if ((nDirection == BOTTOM_TO_TOP)
-+ || (nDirection == RIGHT_TO_LEFT)) {
-+ src_X += 2;
-+ dst_X += 2;
-+ }
-+ }
-+
-+ /* Workaround for 192 byte hw bug */
-+ if ((nROP2 != 0x0C) && ((dst_width * (dst_BPP / 8)) >= 192)) {
-+ /*
-+ * Perform the ROP2 operation in chunks of (xWidth *
-+ * dst_height)
-+ */
-+ while (1) {
-+ deWaitForNotBusy();
-+
-+ SMTC_write2Dreg(DE_SOURCE,
-+ FIELD_SET(0, DE_SOURCE, WRAP, DISABLE) |
-+ FIELD_VALUE(0, DE_SOURCE, X_K1, src_X) |
-+ FIELD_VALUE(0, DE_SOURCE, Y_K2, src_Y));
-+
-+ SMTC_write2Dreg(DE_DESTINATION,
-+ FIELD_SET(0, DE_DESTINATION, WRAP,
-+ DISABLE) | FIELD_VALUE(0,
-+ DE_DESTINATION,
-+ X,
-+ dst_X)
-+ | FIELD_VALUE(0, DE_DESTINATION, Y,
-+ dst_Y));
-+
-+ SMTC_write2Dreg(DE_DIMENSION,
-+ FIELD_VALUE(0, DE_DIMENSION, X,
-+ xWidth) | FIELD_VALUE(0,
-+ DE_DIMENSION,
-+ Y_ET,
-+ dst_height));
-+
-+ de_ctrl =
-+ FIELD_VALUE(0, DE_CONTROL, ROP,
-+ nROP2) | nTransparent | FIELD_SET(0,
-+ DE_CONTROL,
-+ ROP_SELECT,
-+ ROP2)
-+ | FIELD_SET(0, DE_CONTROL, COMMAND,
-+ BITBLT) | ((nDirection ==
-+ 1) ? FIELD_SET(0,
-+ DE_CONTROL,
-+ DIRECTION,
-+ RIGHT_TO_LEFT)
-+ : FIELD_SET(0, DE_CONTROL,
-+ DIRECTION,
-+ LEFT_TO_RIGHT)) |
-+ FIELD_SET(0, DE_CONTROL, STATUS, START);
-+
-+ SMTC_write2Dreg(DE_CONTROL, de_ctrl);
-+
-+ src_X += (opSign * xWidth);
-+ dst_X += (opSign * xWidth);
-+ dst_width -= xWidth;
-+
-+ if (dst_width <= 0) {
-+ /* ROP2 operation is complete */
-+ break;
-+ }
-+
-+ if (xWidth > dst_width)
-+ xWidth = dst_width;
-+ }
-+ } else {
-+ deWaitForNotBusy();
-+ SMTC_write2Dreg(DE_SOURCE,
-+ FIELD_SET(0, DE_SOURCE, WRAP, DISABLE) |
-+ FIELD_VALUE(0, DE_SOURCE, X_K1, src_X) |
-+ FIELD_VALUE(0, DE_SOURCE, Y_K2, src_Y));
-+
-+ SMTC_write2Dreg(DE_DESTINATION,
-+ FIELD_SET(0, DE_DESTINATION, WRAP, DISABLE) |
-+ FIELD_VALUE(0, DE_DESTINATION, X, dst_X) |
-+ FIELD_VALUE(0, DE_DESTINATION, Y, dst_Y));
-+
-+ SMTC_write2Dreg(DE_DIMENSION,
-+ FIELD_VALUE(0, DE_DIMENSION, X, dst_width) |
-+ FIELD_VALUE(0, DE_DIMENSION, Y_ET, dst_height));
-+
-+ de_ctrl = FIELD_VALUE(0, DE_CONTROL, ROP, nROP2) |
-+ nTransparent |
-+ FIELD_SET(0, DE_CONTROL, ROP_SELECT, ROP2) |
-+ FIELD_SET(0, DE_CONTROL, COMMAND, BITBLT) |
-+ ((nDirection == 1) ? FIELD_SET(0, DE_CONTROL, DIRECTION,
-+ RIGHT_TO_LEFT)
-+ : FIELD_SET(0, DE_CONTROL, DIRECTION,
-+ LEFT_TO_RIGHT)) | FIELD_SET(0, DE_CONTROL,
-+ STATUS, START);
-+ SMTC_write2Dreg(DE_CONTROL, de_ctrl);
-+ }
-+
-+ smtc_de_busy = 1;
-+}
-+
-+/*
-+ * This function sets the pixel format that will apply to the 2D Engine.
-+ */
-+void deSetPixelFormat(unsigned long bpp)
-+{
-+ unsigned long de_format;
-+
-+ de_format = SMTC_read2Dreg(DE_STRETCH_FORMAT);
-+
-+ switch (bpp) {
-+ case 8:
-+ de_format =
-+ FIELD_SET(de_format, DE_STRETCH_FORMAT, PIXEL_FORMAT, 8);
-+ break;
-+ default:
-+ case 16:
-+ de_format =
-+ FIELD_SET(de_format, DE_STRETCH_FORMAT, PIXEL_FORMAT, 16);
-+ break;
-+ case 32:
-+ de_format =
-+ FIELD_SET(de_format, DE_STRETCH_FORMAT, PIXEL_FORMAT, 32);
-+ break;
-+ }
-+
-+ SMTC_write2Dreg(DE_STRETCH_FORMAT, de_format);
-+}
-+
-+/*
-+ * System memory to Video memory monochrome expansion.
-+ *
-+ * Source is monochrome image in system memory. This function expands the
-+ * monochrome data to color image in video memory.
-+ */
-+
-+long deSystemMem2VideoMemMonoBlt(const char *pSrcbuf,
-+ long srcDelta,
-+ unsigned long startBit,
-+ unsigned long dBase,
-+ unsigned long dPitch,
-+ unsigned long bpp,
-+ unsigned long dx, unsigned long dy,
-+ unsigned long width, unsigned long height,
-+ unsigned long fColor,
-+ unsigned long bColor,
-+ unsigned long rop2) {
-+ unsigned long bytePerPixel;
-+ unsigned long ulBytesPerScan;
-+ unsigned long ul4BytesPerScan;
-+ unsigned long ulBytesRemain;
-+ unsigned long de_ctrl = 0;
-+ unsigned char ajRemain[4];
-+ long i, j;
-+
-+ bytePerPixel = bpp / 8;
-+
-+ /* Just make sure the start bit is within legal range */
-+ startBit &= 7;
-+
-+ ulBytesPerScan = (width + startBit + 7) / 8;
-+ ul4BytesPerScan = ulBytesPerScan & ~3;
-+ ulBytesRemain = ulBytesPerScan & 3;
-+
-+ if (smtc_de_busy)
-+ deWaitForNotBusy();
-+
-+ /*
-+ * 2D Source Base. Use 0 for HOST Blt.
-+ */
-+
-+ SMTC_write2Dreg(DE_WINDOW_SOURCE_BASE, 0);
-+
-+ /*
-+ * 2D Destination Base.
-+ *
-+ * It is an address offset (128 bit aligned) from the beginning of
-+ * frame buffer.
-+ */
-+
-+ SMTC_write2Dreg(DE_WINDOW_DESTINATION_BASE, dBase);
-+
-+ if (dPitch) {
-+
-+ /*
-+ * Program pitch (distance between the 1st points of two
-+ * adjacent lines).
-+ *
-+ * Note that input pitch is BYTE value, but the 2D Pitch
-+ * register uses pixel values. Need Byte to pixel convertion.
-+ */
-+
-+ SMTC_write2Dreg(DE_PITCH,
-+ FIELD_VALUE(0, DE_PITCH, DESTINATION,
-+ dPitch /
-+ bytePerPixel) | FIELD_VALUE(0,
-+ DE_PITCH,
-+ SOURCE,
-+ dPitch /
-+ bytePerPixel));
-+
-+ /* Screen Window width in Pixels.
-+ *
-+ * 2D engine uses this value to calculate the linear address in
-+ * frame buffer for a given point.
-+ */
-+
-+ SMTC_write2Dreg(DE_WINDOW_WIDTH,
-+ FIELD_VALUE(0, DE_WINDOW_WIDTH, DESTINATION,
-+ (dPitch /
-+ bytePerPixel)) | FIELD_VALUE(0,
-+ DE_WINDOW_WIDTH,
-+ SOURCE,
-+ (dPitch
-+ /
-+ bytePerPixel)));
-+ }
-+ /* Note: For 2D Source in Host Write, only X_K1 field is needed, and
-+ * Y_K2 field is not used. For mono bitmap, use startBit for X_K1.
-+ */
-+
-+ SMTC_write2Dreg(DE_SOURCE,
-+ FIELD_SET(0, DE_SOURCE, WRAP, DISABLE) |
-+ FIELD_VALUE(0, DE_SOURCE, X_K1, startBit) |
-+ FIELD_VALUE(0, DE_SOURCE, Y_K2, 0));
-+
-+ SMTC_write2Dreg(DE_DESTINATION,
-+ FIELD_SET(0, DE_DESTINATION, WRAP, DISABLE) |
-+ FIELD_VALUE(0, DE_DESTINATION, X, dx) |
-+ FIELD_VALUE(0, DE_DESTINATION, Y, dy));
-+
-+ SMTC_write2Dreg(DE_DIMENSION,
-+ FIELD_VALUE(0, DE_DIMENSION, X, width) |
-+ FIELD_VALUE(0, DE_DIMENSION, Y_ET, height));
-+
-+ SMTC_write2Dreg(DE_FOREGROUND, fColor);
-+ SMTC_write2Dreg(DE_BACKGROUND, bColor);
-+
-+ if (bpp)
-+ deSetPixelFormat(bpp);
-+ /* Set the pixel format of the destination */
-+
-+ de_ctrl = FIELD_VALUE(0, DE_CONTROL, ROP, rop2) |
-+ FIELD_SET(0, DE_CONTROL, ROP_SELECT, ROP2) |
-+ FIELD_SET(0, DE_CONTROL, COMMAND, HOST_WRITE) |
-+ FIELD_SET(0, DE_CONTROL, HOST, MONO) |
-+ FIELD_SET(0, DE_CONTROL, STATUS, START);
-+
-+ SMTC_write2Dreg(DE_CONTROL, de_ctrl | deGetTransparency());
-+
-+ /* Write MONO data (line by line) to 2D Engine data port */
-+ for (i = 0; i < height; i++) {
-+ /* For each line, send the data in chunks of 4 bytes */
-+ for (j = 0; j < (ul4BytesPerScan / 4); j++)
-+ SMTC_write2Ddataport(0,
-+ *(unsigned long *)(pSrcbuf +
-+ (j * 4)));
-+
-+ if (ulBytesRemain) {
-+ memcpy(ajRemain, pSrcbuf + ul4BytesPerScan,
-+ ulBytesRemain);
-+ SMTC_write2Ddataport(0, *(unsigned long *)ajRemain);
-+ }
-+
-+ pSrcbuf += srcDelta;
-+ }
-+ smtc_de_busy = 1;
-+
-+ return 0;
-+}
-+
-+/*
-+ * This function gets the transparency status from DE_CONTROL register.
-+ * It returns a double word with the transparent fields properly set,
-+ * while other fields are 0.
-+ */
-+unsigned long deGetTransparency(void)
-+{
-+ unsigned long de_ctrl;
-+
-+ de_ctrl = SMTC_read2Dreg(DE_CONTROL);
-+
-+ de_ctrl &=
-+ FIELD_MASK(DE_CONTROL_TRANSPARENCY_MATCH) |
-+ FIELD_MASK(DE_CONTROL_TRANSPARENCY_SELECT) |
-+ FIELD_MASK(DE_CONTROL_TRANSPARENCY);
-+
-+ return de_ctrl;
-+}
-diff -Nur linux-2.6.30.5.orig/drivers/video/sm7xx/smtc2d.h linux-2.6.30.5/drivers/video/sm7xx/smtc2d.h
---- linux-2.6.30.5.orig/drivers/video/sm7xx/smtc2d.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.30.5/drivers/video/sm7xx/smtc2d.h 2009-08-23 19:01:04.000000000 +0200
-@@ -0,0 +1,530 @@
-+/*
-+ * smtc2d.h -- Silicon Motion SM7xx 2D drawing engine functions.
-+ *
-+ * Copyright (C) 2006 Silicon Motion Technology Corp.
-+ * Author: Ge Wang, gewang@siliconmotion.com
-+ *
-+ * Copyright (C) 2009 Lemote, Inc. & Institute of Computing Technology
-+ * Author: Wu Zhangjin, wuzj@lemote.com
-+ *
-+ * This file is subject to the terms and conditions of the GNU General Public
-+ * License. See the file COPYING in the main directory of this archive for
-+ * more details.
-+ */
-+
-+#ifndef NULL
-+#define NULL 0
-+#endif
-+
-+/* Internal macros */
-+
-+#define _F_START(f) (0 ? f)
-+#define _F_END(f) (1 ? f)
-+#define _F_SIZE(f) (1 + _F_END(f) - _F_START(f))
-+#define _F_MASK(f) (((1ULL << _F_SIZE(f)) - 1) << _F_START(f))
-+#define _F_NORMALIZE(v, f) (((v) & _F_MASK(f)) >> _F_START(f))
-+#define _F_DENORMALIZE(v, f) (((v) << _F_START(f)) & _F_MASK(f))
-+
-+/* Global macros */
-+
-+#define FIELD_GET(x, reg, field) \
-+( \
-+ _F_NORMALIZE((x), reg ## _ ## field) \
-+)
-+
-+#define FIELD_SET(x, reg, field, value) \
-+( \
-+ (x & ~_F_MASK(reg ## _ ## field)) \
-+ | _F_DENORMALIZE(reg ## _ ## field ## _ ## value, reg ## _ ## field) \
-+)
-+
-+#define FIELD_VALUE(x, reg, field, value) \
-+( \
-+ (x & ~_F_MASK(reg ## _ ## field)) \
-+ | _F_DENORMALIZE(value, reg ## _ ## field) \
-+)
-+
-+#define FIELD_CLEAR(reg, field) \
-+( \
-+ ~_F_MASK(reg ## _ ## field) \
-+)
-+
-+/* Field Macros */
-+
-+#define FIELD_START(field) (0 ? field)
-+#define FIELD_END(field) (1 ? field)
-+#define FIELD_SIZE(field) \
-+ (1 + FIELD_END(field) - FIELD_START(field))
-+
-+#define FIELD_MASK(field) \
-+ (((1 << (FIELD_SIZE(field)-1)) \
-+ | ((1 << (FIELD_SIZE(field)-1)) - 1)) \
-+ << FIELD_START(field))
-+
-+#define FIELD_NORMALIZE(reg, field) \
-+ (((reg) & FIELD_MASK(field)) >> FIELD_START(field))
-+
-+#define FIELD_DENORMALIZE(field, value) \
-+ (((value) << FIELD_START(field)) & FIELD_MASK(field))
-+
-+#define FIELD_INIT(reg, field, value) \
-+ FIELD_DENORMALIZE(reg ## _ ## field, \
-+ reg ## _ ## field ## _ ## value)
-+
-+#define FIELD_INIT_VAL(reg, field, value) \
-+ (FIELD_DENORMALIZE(reg ## _ ## field, value))
-+
-+#define FIELD_VAL_SET(x, r, f, v) ({ \
-+ x = (x & ~FIELD_MASK(r ## _ ## f)) \
-+ | FIELD_DENORMALIZE(r ## _ ## f, r ## _ ## f ## _ ## v) \
-+})
-+
-+#define RGB(r, g, b) ((unsigned long)(((r) << 16) | ((g) << 8) | (b)))
-+
-+/* Transparent info definition */
-+typedef struct {
-+ unsigned long match; /* Matching pixel is OPAQUE/TRANSPARENT */
-+ unsigned long select; /* Transparency controlled by SRC/DST */
-+ unsigned long control; /* ENABLE/DISABLE transparency */
-+ unsigned long color; /* Transparent color */
-+} Transparent, *pTransparent;
-+
-+#define PIXEL_DEPTH_1_BP 0 /* 1 bit per pixel */
-+#define PIXEL_DEPTH_8_BPP 1 /* 8 bits per pixel */
-+#define PIXEL_DEPTH_16_BPP 2 /* 16 bits per pixel */
-+#define PIXEL_DEPTH_32_BPP 3 /* 32 bits per pixel */
-+#define PIXEL_DEPTH_YUV422 8 /* 16 bits per pixel YUV422 */
-+#define PIXEL_DEPTH_YUV420 9 /* 16 bits per pixel YUV420 */
-+
-+#define PATTERN_WIDTH 8
-+#define PATTERN_HEIGHT 8
-+
-+#define TOP_TO_BOTTOM 0
-+#define BOTTOM_TO_TOP 1
-+#define RIGHT_TO_LEFT BOTTOM_TO_TOP
-+#define LEFT_TO_RIGHT TOP_TO_BOTTOM
-+
-+/* Constants used in Transparent structure */
-+#define MATCH_OPAQUE 0x00000000
-+#define MATCH_TRANSPARENT 0x00000400
-+#define SOURCE 0x00000000
-+#define DESTINATION 0x00000200
-+
-+/* 2D registers. */
-+
-+#define DE_SOURCE 0x000000
-+#define DE_SOURCE_WRAP 31 : 31
-+#define DE_SOURCE_WRAP_DISABLE 0
-+#define DE_SOURCE_WRAP_ENABLE 1
-+#define DE_SOURCE_X_K1 29 : 16
-+#define DE_SOURCE_Y_K2 15 : 0
-+
-+#define DE_DESTINATION 0x000004
-+#define DE_DESTINATION_WRAP 31 : 31
-+#define DE_DESTINATION_WRAP_DISABLE 0
-+#define DE_DESTINATION_WRAP_ENABLE 1
-+#define DE_DESTINATION_X 28 : 16
-+#define DE_DESTINATION_Y 15 : 0
-+
-+#define DE_DIMENSION 0x000008
-+#define DE_DIMENSION_X 28 : 16
-+#define DE_DIMENSION_Y_ET 15 : 0
-+
-+#define DE_CONTROL 0x00000C
-+#define DE_CONTROL_STATUS 31 : 31
-+#define DE_CONTROL_STATUS_STOP 0
-+#define DE_CONTROL_STATUS_START 1
-+#define DE_CONTROL_PATTERN 30 : 30
-+#define DE_CONTROL_PATTERN_MONO 0
-+#define DE_CONTROL_PATTERN_COLOR 1
-+#define DE_CONTROL_UPDATE_DESTINATION_X 29 : 29
-+#define DE_CONTROL_UPDATE_DESTINATION_X_DISABLE 0
-+#define DE_CONTROL_UPDATE_DESTINATION_X_ENABLE 1
-+#define DE_CONTROL_QUICK_START 28 : 28
-+#define DE_CONTROL_QUICK_START_DISABLE 0
-+#define DE_CONTROL_QUICK_START_ENABLE 1
-+#define DE_CONTROL_DIRECTION 27 : 27
-+#define DE_CONTROL_DIRECTION_LEFT_TO_RIGHT 0
-+#define DE_CONTROL_DIRECTION_RIGHT_TO_LEFT 1
-+#define DE_CONTROL_MAJOR 26 : 26
-+#define DE_CONTROL_MAJOR_X 0
-+#define DE_CONTROL_MAJOR_Y 1
-+#define DE_CONTROL_STEP_X 25 : 25
-+#define DE_CONTROL_STEP_X_POSITIVE 1
-+#define DE_CONTROL_STEP_X_NEGATIVE 0
-+#define DE_CONTROL_STEP_Y 24 : 24
-+#define DE_CONTROL_STEP_Y_POSITIVE 1
-+#define DE_CONTROL_STEP_Y_NEGATIVE 0
-+#define DE_CONTROL_STRETCH 23 : 23
-+#define DE_CONTROL_STRETCH_DISABLE 0
-+#define DE_CONTROL_STRETCH_ENABLE 1
-+#define DE_CONTROL_HOST 22 : 22
-+#define DE_CONTROL_HOST_COLOR 0
-+#define DE_CONTROL_HOST_MONO 1
-+#define DE_CONTROL_LAST_PIXEL 21 : 21
-+#define DE_CONTROL_LAST_PIXEL_OFF 0
-+#define DE_CONTROL_LAST_PIXEL_ON 1
-+#define DE_CONTROL_COMMAND 20 : 16
-+#define DE_CONTROL_COMMAND_BITBLT 0
-+#define DE_CONTROL_COMMAND_RECTANGLE_FILL 1
-+#define DE_CONTROL_COMMAND_DE_TILE 2
-+#define DE_CONTROL_COMMAND_TRAPEZOID_FILL 3
-+#define DE_CONTROL_COMMAND_ALPHA_BLEND 4
-+#define DE_CONTROL_COMMAND_RLE_STRIP 5
-+#define DE_CONTROL_COMMAND_SHORT_STROKE 6
-+#define DE_CONTROL_COMMAND_LINE_DRAW 7
-+#define DE_CONTROL_COMMAND_HOST_WRITE 8
-+#define DE_CONTROL_COMMAND_HOST_READ 9
-+#define DE_CONTROL_COMMAND_HOST_WRITE_BOTTOM_UP 10
-+#define DE_CONTROL_COMMAND_ROTATE 11
-+#define DE_CONTROL_COMMAND_FONT 12
-+#define DE_CONTROL_COMMAND_TEXTURE_LOAD 15
-+#define DE_CONTROL_ROP_SELECT 15 : 15
-+#define DE_CONTROL_ROP_SELECT_ROP3 0
-+#define DE_CONTROL_ROP_SELECT_ROP2 1
-+#define DE_CONTROL_ROP2_SOURCE 14 : 14
-+#define DE_CONTROL_ROP2_SOURCE_BITMAP 0
-+#define DE_CONTROL_ROP2_SOURCE_PATTERN 1
-+#define DE_CONTROL_MONO_DATA 13 : 12
-+#define DE_CONTROL_MONO_DATA_NOT_PACKED 0
-+#define DE_CONTROL_MONO_DATA_8_PACKED 1
-+#define DE_CONTROL_MONO_DATA_16_PACKED 2
-+#define DE_CONTROL_MONO_DATA_32_PACKED 3
-+#define DE_CONTROL_REPEAT_ROTATE 11 : 11
-+#define DE_CONTROL_REPEAT_ROTATE_DISABLE 0
-+#define DE_CONTROL_REPEAT_ROTATE_ENABLE 1
-+#define DE_CONTROL_TRANSPARENCY_MATCH 10 : 10
-+#define DE_CONTROL_TRANSPARENCY_MATCH_OPAQUE 0
-+#define DE_CONTROL_TRANSPARENCY_MATCH_TRANSPARENT 1
-+#define DE_CONTROL_TRANSPARENCY_SELECT 9 : 9
-+#define DE_CONTROL_TRANSPARENCY_SELECT_SOURCE 0
-+#define DE_CONTROL_TRANSPARENCY_SELECT_DESTINATION 1
-+#define DE_CONTROL_TRANSPARENCY 8 : 8
-+#define DE_CONTROL_TRANSPARENCY_DISABLE 0
-+#define DE_CONTROL_TRANSPARENCY_ENABLE 1
-+#define DE_CONTROL_ROP 7 : 0
-+
-+/* Pseudo fields. */
-+
-+#define DE_CONTROL_SHORT_STROKE_DIR 27 : 24
-+#define DE_CONTROL_SHORT_STROKE_DIR_225 0
-+#define DE_CONTROL_SHORT_STROKE_DIR_135 1
-+#define DE_CONTROL_SHORT_STROKE_DIR_315 2
-+#define DE_CONTROL_SHORT_STROKE_DIR_45 3
-+#define DE_CONTROL_SHORT_STROKE_DIR_270 4
-+#define DE_CONTROL_SHORT_STROKE_DIR_90 5
-+#define DE_CONTROL_SHORT_STROKE_DIR_180 8
-+#define DE_CONTROL_SHORT_STROKE_DIR_0 10
-+#define DE_CONTROL_ROTATION 25 : 24
-+#define DE_CONTROL_ROTATION_0 0
-+#define DE_CONTROL_ROTATION_270 1
-+#define DE_CONTROL_ROTATION_90 2
-+#define DE_CONTROL_ROTATION_180 3
-+
-+#define DE_PITCH 0x000010
-+#define DE_PITCH_DESTINATION 28 : 16
-+#define DE_PITCH_SOURCE 12 : 0
-+
-+#define DE_FOREGROUND 0x000014
-+#define DE_FOREGROUND_COLOR 31 : 0
-+
-+#define DE_BACKGROUND 0x000018
-+#define DE_BACKGROUND_COLOR 31 : 0
-+
-+#define DE_STRETCH_FORMAT 0x00001C
-+#define DE_STRETCH_FORMAT_PATTERN_XY 30 : 30
-+#define DE_STRETCH_FORMAT_PATTERN_XY_NORMAL 0
-+#define DE_STRETCH_FORMAT_PATTERN_XY_OVERWRITE 1
-+#define DE_STRETCH_FORMAT_PATTERN_Y 29 : 27
-+#define DE_STRETCH_FORMAT_PATTERN_X 25 : 23
-+#define DE_STRETCH_FORMAT_PIXEL_FORMAT 21 : 20
-+#define DE_STRETCH_FORMAT_PIXEL_FORMAT_8 0
-+#define DE_STRETCH_FORMAT_PIXEL_FORMAT_16 1
-+#define DE_STRETCH_FORMAT_PIXEL_FORMAT_24 3
-+#define DE_STRETCH_FORMAT_PIXEL_FORMAT_32 2
-+#define DE_STRETCH_FORMAT_ADDRESSING 19 : 16
-+#define DE_STRETCH_FORMAT_ADDRESSING_XY 0
-+#define DE_STRETCH_FORMAT_ADDRESSING_LINEAR 15
-+#define DE_STRETCH_FORMAT_SOURCE_HEIGHT 11 : 0
-+
-+#define DE_COLOR_COMPARE 0x000020
-+#define DE_COLOR_COMPARE_COLOR 23 : 0
-+
-+#define DE_COLOR_COMPARE_MASK 0x000024
-+#define DE_COLOR_COMPARE_MASK_MASKS 23 : 0
-+
-+#define DE_MASKS 0x000028
-+#define DE_MASKS_BYTE_MASK 31 : 16
-+#define DE_MASKS_BIT_MASK 15 : 0
-+
-+#define DE_CLIP_TL 0x00002C
-+#define DE_CLIP_TL_TOP 31 : 16
-+#define DE_CLIP_TL_STATUS 13 : 13
-+#define DE_CLIP_TL_STATUS_DISABLE 0
-+#define DE_CLIP_TL_STATUS_ENABLE 1
-+#define DE_CLIP_TL_INHIBIT 12 : 12
-+#define DE_CLIP_TL_INHIBIT_OUTSIDE 0
-+#define DE_CLIP_TL_INHIBIT_INSIDE 1
-+#define DE_CLIP_TL_LEFT 11 : 0
-+
-+#define DE_CLIP_BR 0x000030
-+#define DE_CLIP_BR_BOTTOM 31 : 16
-+#define DE_CLIP_BR_RIGHT 12 : 0
-+
-+#define DE_MONO_PATTERN_LOW 0x000034
-+#define DE_MONO_PATTERN_LOW_PATTERN 31 : 0
-+
-+#define DE_MONO_PATTERN_HIGH 0x000038
-+#define DE_MONO_PATTERN_HIGH_PATTERN 31 : 0
-+
-+#define DE_WINDOW_WIDTH 0x00003C
-+#define DE_WINDOW_WIDTH_DESTINATION 28 : 16
-+#define DE_WINDOW_WIDTH_SOURCE 12 : 0
-+
-+#define DE_WINDOW_SOURCE_BASE 0x000040
-+#define DE_WINDOW_SOURCE_BASE_EXT 27 : 27
-+#define DE_WINDOW_SOURCE_BASE_EXT_LOCAL 0
-+#define DE_WINDOW_SOURCE_BASE_EXT_EXTERNAL 1
-+#define DE_WINDOW_SOURCE_BASE_CS 26 : 26
-+#define DE_WINDOW_SOURCE_BASE_CS_0 0
-+#define DE_WINDOW_SOURCE_BASE_CS_1 1
-+#define DE_WINDOW_SOURCE_BASE_ADDRESS 25 : 0
-+
-+#define DE_WINDOW_DESTINATION_BASE 0x000044
-+#define DE_WINDOW_DESTINATION_BASE_EXT 27 : 27
-+#define DE_WINDOW_DESTINATION_BASE_EXT_LOCAL 0
-+#define DE_WINDOW_DESTINATION_BASE_EXT_EXTERNAL 1
-+#define DE_WINDOW_DESTINATION_BASE_CS 26 : 26
-+#define DE_WINDOW_DESTINATION_BASE_CS_0 0
-+#define DE_WINDOW_DESTINATION_BASE_CS_1 1
-+#define DE_WINDOW_DESTINATION_BASE_ADDRESS 25 : 0
-+
-+#define DE_ALPHA 0x000048
-+#define DE_ALPHA_VALUE 7 : 0
-+
-+#define DE_WRAP 0x00004C
-+#define DE_WRAP_X 31 : 16
-+#define DE_WRAP_Y 15 : 0
-+
-+#define DE_STATUS 0x000050
-+#define DE_STATUS_CSC 1 : 1
-+#define DE_STATUS_CSC_CLEAR 0
-+#define DE_STATUS_CSC_NOT_ACTIVE 0
-+#define DE_STATUS_CSC_ACTIVE 1
-+#define DE_STATUS_2D 0 : 0
-+#define DE_STATUS_2D_CLEAR 0
-+#define DE_STATUS_2D_NOT_ACTIVE 0
-+#define DE_STATUS_2D_ACTIVE 1
-+
-+/* Color Space Conversion registers. */
-+
-+#define CSC_Y_SOURCE_BASE 0x0000C8
-+#define CSC_Y_SOURCE_BASE_EXT 27 : 27
-+#define CSC_Y_SOURCE_BASE_EXT_LOCAL 0
-+#define CSC_Y_SOURCE_BASE_EXT_EXTERNAL 1
-+#define CSC_Y_SOURCE_BASE_CS 26 : 26
-+#define CSC_Y_SOURCE_BASE_CS_0 0
-+#define CSC_Y_SOURCE_BASE_CS_1 1
-+#define CSC_Y_SOURCE_BASE_ADDRESS 25 : 0
-+
-+#define CSC_CONSTANTS 0x0000CC
-+#define CSC_CONSTANTS_Y 31 : 24
-+#define CSC_CONSTANTS_R 23 : 16
-+#define CSC_CONSTANTS_G 15 : 8
-+#define CSC_CONSTANTS_B 7 : 0
-+
-+#define CSC_Y_SOURCE_X 0x0000D0
-+#define CSC_Y_SOURCE_X_INTEGER 26 : 16
-+#define CSC_Y_SOURCE_X_FRACTION 15 : 3
-+
-+#define CSC_Y_SOURCE_Y 0x0000D4
-+#define CSC_Y_SOURCE_Y_INTEGER 27 : 16
-+#define CSC_Y_SOURCE_Y_FRACTION 15 : 3
-+
-+#define CSC_U_SOURCE_BASE 0x0000D8
-+#define CSC_U_SOURCE_BASE_EXT 27 : 27
-+#define CSC_U_SOURCE_BASE_EXT_LOCAL 0
-+#define CSC_U_SOURCE_BASE_EXT_EXTERNAL 1
-+#define CSC_U_SOURCE_BASE_CS 26 : 26
-+#define CSC_U_SOURCE_BASE_CS_0 0
-+#define CSC_U_SOURCE_BASE_CS_1 1
-+#define CSC_U_SOURCE_BASE_ADDRESS 25 : 0
-+
-+#define CSC_V_SOURCE_BASE 0x0000DC
-+#define CSC_V_SOURCE_BASE_EXT 27 : 27
-+#define CSC_V_SOURCE_BASE_EXT_LOCAL 0
-+#define CSC_V_SOURCE_BASE_EXT_EXTERNAL 1
-+#define CSC_V_SOURCE_BASE_CS 26 : 26
-+#define CSC_V_SOURCE_BASE_CS_0 0
-+#define CSC_V_SOURCE_BASE_CS_1 1
-+#define CSC_V_SOURCE_BASE_ADDRESS 25 : 0
-+
-+#define CSC_SOURCE_DIMENSION 0x0000E0
-+#define CSC_SOURCE_DIMENSION_X 31 : 16
-+#define CSC_SOURCE_DIMENSION_Y 15 : 0
-+
-+#define CSC_SOURCE_PITCH 0x0000E4
-+#define CSC_SOURCE_PITCH_Y 31 : 16
-+#define CSC_SOURCE_PITCH_UV 15 : 0
-+
-+#define CSC_DESTINATION 0x0000E8
-+#define CSC_DESTINATION_WRAP 31 : 31
-+#define CSC_DESTINATION_WRAP_DISABLE 0
-+#define CSC_DESTINATION_WRAP_ENABLE 1
-+#define CSC_DESTINATION_X 27 : 16
-+#define CSC_DESTINATION_Y 11 : 0
-+
-+#define CSC_DESTINATION_DIMENSION 0x0000EC
-+#define CSC_DESTINATION_DIMENSION_X 31 : 16
-+#define CSC_DESTINATION_DIMENSION_Y 15 : 0
-+
-+#define CSC_DESTINATION_PITCH 0x0000F0
-+#define CSC_DESTINATION_PITCH_X 31 : 16
-+#define CSC_DESTINATION_PITCH_Y 15 : 0
-+
-+#define CSC_SCALE_FACTOR 0x0000F4
-+#define CSC_SCALE_FACTOR_HORIZONTAL 31 : 16
-+#define CSC_SCALE_FACTOR_VERTICAL 15 : 0
-+
-+#define CSC_DESTINATION_BASE 0x0000F8
-+#define CSC_DESTINATION_BASE_EXT 27 : 27
-+#define CSC_DESTINATION_BASE_EXT_LOCAL 0
-+#define CSC_DESTINATION_BASE_EXT_EXTERNAL 1
-+#define CSC_DESTINATION_BASE_CS 26 : 26
-+#define CSC_DESTINATION_BASE_CS_0 0
-+#define CSC_DESTINATION_BASE_CS_1 1
-+#define CSC_DESTINATION_BASE_ADDRESS 25 : 0
-+
-+#define CSC_CONTROL 0x0000FC
-+#define CSC_CONTROL_STATUS 31 : 31
-+#define CSC_CONTROL_STATUS_STOP 0
-+#define CSC_CONTROL_STATUS_START 1
-+#define CSC_CONTROL_SOURCE_FORMAT 30 : 28
-+#define CSC_CONTROL_SOURCE_FORMAT_YUV422 0
-+#define CSC_CONTROL_SOURCE_FORMAT_YUV420I 1
-+#define CSC_CONTROL_SOURCE_FORMAT_YUV420 2
-+#define CSC_CONTROL_SOURCE_FORMAT_YVU9 3
-+#define CSC_CONTROL_SOURCE_FORMAT_IYU1 4
-+#define CSC_CONTROL_SOURCE_FORMAT_IYU2 5
-+#define CSC_CONTROL_SOURCE_FORMAT_RGB565 6
-+#define CSC_CONTROL_SOURCE_FORMAT_RGB8888 7
-+#define CSC_CONTROL_DESTINATION_FORMAT 27 : 26
-+#define CSC_CONTROL_DESTINATION_FORMAT_RGB565 0
-+#define CSC_CONTROL_DESTINATION_FORMAT_RGB8888 1
-+#define CSC_CONTROL_HORIZONTAL_FILTER 25 : 25
-+#define CSC_CONTROL_HORIZONTAL_FILTER_DISABLE 0
-+#define CSC_CONTROL_HORIZONTAL_FILTER_ENABLE 1
-+#define CSC_CONTROL_VERTICAL_FILTER 24 : 24
-+#define CSC_CONTROL_VERTICAL_FILTER_DISABLE 0
-+#define CSC_CONTROL_VERTICAL_FILTER_ENABLE 1
-+#define CSC_CONTROL_BYTE_ORDER 23 : 23
-+#define CSC_CONTROL_BYTE_ORDER_YUYV 0
-+#define CSC_CONTROL_BYTE_ORDER_UYVY 1
-+
-+#define DE_DATA_PORT_501 0x110000
-+#define DE_DATA_PORT_712 0x400000
-+#define DE_DATA_PORT_722 0x6000
-+
-+/* point to virtual Memory Map IO starting address */
-+extern char *smtc_RegBaseAddress;
-+/* point to virtual video memory starting address */
-+extern char *smtc_VRAMBaseAddress;
-+extern unsigned char smtc_de_busy;
-+
-+extern unsigned long memRead32(unsigned long nOffset);
-+extern void memWrite32(unsigned long nOffset, unsigned long nData);
-+extern unsigned long SMTC_read2Dreg(unsigned long nOffset);
-+
-+/* 2D functions */
-+extern void deInit(unsigned int nModeWidth, unsigned int nModeHeight,
-+ unsigned int bpp);
-+
-+extern void deWaitForNotBusy(void);
-+
-+extern void deVerticalLine(unsigned long dst_base,
-+ unsigned long dst_pitch,
-+ unsigned long nX,
-+ unsigned long nY,
-+ unsigned long dst_height,
-+ unsigned long nColor);
-+
-+extern void deHorizontalLine(unsigned long dst_base,
-+ unsigned long dst_pitch,
-+ unsigned long nX,
-+ unsigned long nY,
-+ unsigned long dst_width,
-+ unsigned long nColor);
-+
-+extern void deLine(unsigned long dst_base,
-+ unsigned long dst_pitch,
-+ unsigned long nX1,
-+ unsigned long nY1,
-+ unsigned long nX2,
-+ unsigned long nY2,
-+ unsigned long nColor);
-+
-+extern void deFillRect(unsigned long dst_base,
-+ unsigned long dst_pitch,
-+ unsigned long dst_X,
-+ unsigned long dst_Y,
-+ unsigned long dst_width,
-+ unsigned long dst_height,
-+ unsigned long nColor);
-+
-+extern void deRotatePattern(unsigned char *pattern_dstaddr,
-+ unsigned long pattern_src_addr,
-+ unsigned long pattern_BPP,
-+ unsigned long pattern_stride,
-+ int patternX,
-+ int patternY);
-+
-+extern void deCopy(unsigned long dst_base,
-+ unsigned long dst_pitch,
-+ unsigned long dst_BPP,
-+ unsigned long dst_X,
-+ unsigned long dst_Y,
-+ unsigned long dst_width,
-+ unsigned long dst_height,
-+ unsigned long src_base,
-+ unsigned long src_pitch,
-+ unsigned long src_X,
-+ unsigned long src_Y,
-+ pTransparent pTransp,
-+ unsigned char nROP2);
-+
-+/*
-+ * System memory to Video memory monochrome expansion.
-+ *
-+ * Source is monochrome image in system memory. This function expands the
-+ * monochrome data to color image in video memory.
-+ *
-+ * @pSrcbuf: pointer to start of source buffer in system memory
-+ * @srcDelta: Pitch value (in bytes) of the source buffer, +ive means top
-+ * down and -ive mean button up
-+ * @startBit: Mono data can start at any bit in a byte, this value should
-+ * be 0 to 7
-+ * @dBase: Address of destination : offset in frame buffer
-+ * @dPitch: Pitch value of destination surface in BYTE
-+ * @bpp: Color depth of destination surface
-+ * @dx, dy: Starting coordinate of destination surface
-+ * @width, height: width and height of rectange in pixel value
-+ * @fColor,bColor: Foreground, Background color (corresponding to a 1, 0 in
-+ * the monochrome data)
-+ * @rop2: ROP value
-+ */
-+
-+extern long deSystemMem2VideoMemMonoBlt(
-+ const char *pSrcbuf,
-+ long srcDelta,
-+ unsigned long startBit,
-+ unsigned long dBase,
-+ unsigned long dPitch,
-+ unsigned long bpp,
-+ unsigned long dx, unsigned long dy,
-+ unsigned long width, unsigned long height,
-+ unsigned long fColor,
-+ unsigned long bColor,
-+ unsigned long rop2);
-+
-+extern unsigned long deGetTransparency(void);
-+extern void deSetPixelFormat(unsigned long bpp);
-diff -Nur linux-2.6.30.5.orig/drivers/video/sm7xx/smtcfb.c linux-2.6.30.5/drivers/video/sm7xx/smtcfb.c
---- linux-2.6.30.5.orig/drivers/video/sm7xx/smtcfb.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.30.5/drivers/video/sm7xx/smtcfb.c 2009-08-23 19:01:04.000000000 +0200
-@@ -0,0 +1,1138 @@
-+/*
-+ * smtcfb.c -- Silicon Motion SM7xx frame buffer device
-+ *
-+ * Copyright (C) 2006 Silicon Motion Technology Corp.
-+ * Authors: Ge Wang, gewang@siliconmotion.com
-+ * Boyod boyod.yang@siliconmotion.com.cn
-+ *
-+ * Copyright (C) 2009 Lemote, Inc. & Institute of Computing Technology
-+ * Author: Wu Zhangjin, wuzj@lemote.com
-+ *
-+ * This file is subject to the terms and conditions of the GNU General Public
-+ * License. See the file COPYING in the main directory of this archive for
-+ * more details.
-+ *
-+ * Version 0.10.26192.21.01
-+ * - Add PowerPC/Big endian support
-+ * - Add 2D support for Lynx
-+ * - Verified on2.6.19.2 Boyod.yang <boyod.yang@siliconmotion.com.cn>
-+ *
-+ * Version 0.09.2621.00.01
-+ * - Only support Linux Kernel's version 2.6.21.
-+ * Boyod.yang <boyod.yang@siliconmotion.com.cn>
-+ *
-+ * Version 0.09
-+ * - Only support Linux Kernel's version 2.6.12.
-+ * Boyod.yang <boyod.yang@siliconmotion.com.cn>
-+ */
-+
-+#ifndef __KERNEL__
-+#define __KERNEL__
-+#endif
-+
-+#include <linux/io.h>
-+#include <linux/fb.h>
-+#include <linux/pci.h>
-+#include <linux/init.h>
-+#include <linux/uaccess.h>
-+#include <linux/screen_info.h>
-+
-+#ifdef CONFIG_PM
-+#include <linux/pm.h>
-+#endif
-+
-+struct screen_info smtc_screen_info;
-+
-+#include "smtcfb.h"
-+#include "smtc2d.h"
-+
-+#ifdef DEBUG
-+#define smdbg(format, arg...) printk(KERN_DEBUG format , ## arg)
-+#else
-+#define smdbg(format, arg...)
-+#endif
-+
-+/*
-+* Private structure
-+*/
-+struct smtcfb_info {
-+ /*
-+ * The following is a pointer to be passed into the
-+ * functions below. The modules outside the main
-+ * voyager.c driver have no knowledge as to what
-+ * is within this structure.
-+ */
-+ struct fb_info fb;
-+ struct display_switch *dispsw;
-+ struct pci_dev *dev;
-+ signed int currcon;
-+
-+ struct {
-+ u8 red, green, blue;
-+ } palette[NR_RGB];
-+
-+ u_int palette_size;
-+};
-+
-+struct par_info {
-+ /*
-+ * Hardware
-+ */
-+ u16 chipID;
-+ unsigned char __iomem *m_pMMIO;
-+ char __iomem *m_pLFB;
-+ char *m_pDPR;
-+ char *m_pVPR;
-+ char *m_pCPR;
-+
-+ u_int width;
-+ u_int height;
-+ u_int hz;
-+ u_long BaseAddressInVRAM;
-+ u8 chipRevID;
-+};
-+
-+struct vesa_mode_table {
-+ char mode_index[15];
-+ u16 lfb_width;
-+ u16 lfb_height;
-+ u16 lfb_depth;
-+};
-+
-+static struct vesa_mode_table vesa_mode[] = {
-+ {"640x480x8", 640, 480, 8},
-+ {"800x480x8", 800, 480, 8},
-+ {"800x600x8", 800, 600, 8},
-+ {"1024x768x8", 1024, 768, 8},
-+ {"1280x1024x8", 1280, 1024, 8},
-+
-+ {"640x480x16", 640, 480, 16},
-+ {"800x480x16", 800, 480, 16},
-+ {"800x600x16", 800, 600, 16},
-+ {"1024x768x16", 1024, 768, 16},
-+ {"1280x1024x16", 1280, 1024, 16},
-+
-+ {"640x480x24", 640, 480, 24},
-+ {"800x480x24", 800, 480, 24},
-+ {"800x600x24", 800, 600, 24},
-+ {"1024x768x24", 1024, 768, 24},
-+ {"1280x1024x24", 1280, 1024, 24},
-+};
-+
-+char __iomem *smtc_RegBaseAddress; /* Memory Map IO starting address */
-+char __iomem *smtc_VRAMBaseAddress; /* video memory starting address */
-+
-+char *smtc_2DBaseAddress; /* 2D engine starting address */
-+char *smtc_2Ddataport; /* 2D data port offset */
-+short smtc_2Dacceleration;
-+
-+static u32 colreg[17];
-+static struct par_info hw; /* hardware information */
-+
-+#if defined(CONFIG_FB_SM7XX_DUALHEAD)
-+
-+static u32 colreg2[17];
-+/* hardware information for second display (CRT) */
-+static struct par_info hw2;
-+/* fb_info for second display (CRT) */
-+struct smtcfb_info smtcfb_info2;
-+
-+#endif /* CONFIG_FB_SM501_DUALHEAD */
-+
-+u16 smtc_ChipIDs[] = {
-+ 0x710,
-+ 0x712,
-+ 0x720
-+};
-+
-+int sm712be_flag;
-+
-+#define numSMTCchipIDs (sizeof(smtc_ChipIDs) / sizeof(u16))
-+
-+void deWaitForNotBusy(void)
-+{
-+ unsigned long i = 0x1000000;
-+ while (i--) {
-+ if ((smtc_seqr(0x16) & 0x18) == 0x10)
-+ break;
-+ }
-+ smtc_de_busy = 0;
-+}
-+
-+static void sm712_set_timing(struct smtcfb_info *sfb,
-+ struct par_info *ppar_info)
-+{
-+ int i = 0, j = 0;
-+ u32 m_nScreenStride;
-+
-+ smdbg("\nppar_info->width = %d ppar_info->height = %d"
-+ "sfb->fb.var.bits_per_pixel = %d ppar_info->hz = %d\n",
-+ ppar_info->width, ppar_info->height,
-+ sfb->fb.var.bits_per_pixel, ppar_info->hz);
-+
-+ for (j = 0; j < numVGAModes; j++) {
-+ if (VGAMode[j].mmSizeX == ppar_info->width &&
-+ VGAMode[j].mmSizeY == ppar_info->height &&
-+ VGAMode[j].bpp == sfb->fb.var.bits_per_pixel &&
-+ VGAMode[j].hz == ppar_info->hz) {
-+
-+ smdbg("\nVGAMode[j].mmSizeX = %d VGAMode[j].mmSizeY ="
-+ "%d VGAMode[j].bpp = %d"
-+ "VGAMode[j].hz=%d\n",
-+ VGAMode[j].mmSizeX, VGAMode[j].mmSizeY,
-+ VGAMode[j].bpp, VGAMode[j].hz);
-+
-+ smdbg("VGAMode index=%d\n", j);
-+
-+ smtc_mmiowb(0x0, 0x3c6);
-+
-+ smtc_seqw(0, 0x1);
-+
-+ smtc_mmiowb(VGAMode[j].Init_MISC, 0x3c2);
-+
-+ /* init SEQ register SR00 - SR04 */
-+ for (i = 0; i < SIZE_SR00_SR04; i++)
-+ smtc_seqw(i, VGAMode[j].Init_SR00_SR04[i]);
-+
-+ /* init SEQ register SR10 - SR24 */
-+ for (i = 0; i < SIZE_SR10_SR24; i++)
-+ smtc_seqw(i + 0x10,
-+ VGAMode[j].Init_SR10_SR24[i]);
-+
-+ /* init SEQ register SR30 - SR75 */
-+ for (i = 0; i < SIZE_SR30_SR75; i++)
-+ if (((i + 0x30) != 0x62) \
-+ && ((i + 0x30) != 0x6a) \
-+ && ((i + 0x30) != 0x6b))
-+ smtc_seqw(i + 0x30,
-+ VGAMode[j].Init_SR30_SR75[i]);
-+
-+ /* init SEQ register SR80 - SR93 */
-+ for (i = 0; i < SIZE_SR80_SR93; i++)
-+ smtc_seqw(i + 0x80,
-+ VGAMode[j].Init_SR80_SR93[i]);
-+
-+ /* init SEQ register SRA0 - SRAF */
-+ for (i = 0; i < SIZE_SRA0_SRAF; i++)
-+ smtc_seqw(i + 0xa0,
-+ VGAMode[j].Init_SRA0_SRAF[i]);
-+
-+ /* init Graphic register GR00 - GR08 */
-+ for (i = 0; i < SIZE_GR00_GR08; i++)
-+ smtc_grphw(i, VGAMode[j].Init_GR00_GR08[i]);
-+
-+ /* init Attribute register AR00 - AR14 */
-+ for (i = 0; i < SIZE_AR00_AR14; i++)
-+ smtc_attrw(i, VGAMode[j].Init_AR00_AR14[i]);
-+
-+ /* init CRTC register CR00 - CR18 */
-+ for (i = 0; i < SIZE_CR00_CR18; i++)
-+ smtc_crtcw(i, VGAMode[j].Init_CR00_CR18[i]);
-+
-+ /* init CRTC register CR30 - CR4D */
-+ for (i = 0; i < SIZE_CR30_CR4D; i++)
-+ smtc_crtcw(i + 0x30,
-+ VGAMode[j].Init_CR30_CR4D[i]);
-+
-+ /* init CRTC register CR90 - CRA7 */
-+ for (i = 0; i < SIZE_CR90_CRA7; i++)
-+ smtc_crtcw(i + 0x90,
-+ VGAMode[j].Init_CR90_CRA7[i]);
-+ }
-+ }
-+ smtc_mmiowb(0x67, 0x3c2);
-+
-+ /* set VPR registers */
-+ writel(0x0, ppar_info->m_pVPR + 0x0C);
-+ writel(0x0, ppar_info->m_pVPR + 0x40);
-+
-+ /* set data width */
-+ m_nScreenStride =
-+ (ppar_info->width * sfb->fb.var.bits_per_pixel) / 64;
-+ switch (sfb->fb.var.bits_per_pixel) {
-+ case 8:
-+ writel(0x0, ppar_info->m_pVPR + 0x0);
-+ break;
-+ case 16:
-+ writel(0x00020000, ppar_info->m_pVPR + 0x0);
-+ break;
-+ case 24:
-+ writel(0x00040000, ppar_info->m_pVPR + 0x0);
-+ break;
-+ case 32:
-+ writel(0x00030000, ppar_info->m_pVPR + 0x0);
-+ break;
-+ }
-+ writel((u32) (((m_nScreenStride + 2) << 16) | m_nScreenStride),
-+ ppar_info->m_pVPR + 0x10);
-+
-+}
-+
-+static void sm712_setpalette(int regno, unsigned red, unsigned green,
-+ unsigned blue, struct fb_info *info)
-+{
-+ struct par_info *cur_par = (struct par_info *)info->par;
-+
-+ if (cur_par->BaseAddressInVRAM)
-+ /*
-+ * second display palette for dual head. Enable CRT RAM, 6-bit
-+ * RAM
-+ */
-+ smtc_seqw(0x66, (smtc_seqr(0x66) & 0xC3) | 0x20);
-+ else
-+ /* primary display palette. Enable LCD RAM only, 6-bit RAM */
-+ smtc_seqw(0x66, (smtc_seqr(0x66) & 0xC3) | 0x10);
-+ smtc_mmiowb(regno, dac_reg);
-+ smtc_mmiowb(red >> 10, dac_val);
-+ smtc_mmiowb(green >> 10, dac_val);
-+ smtc_mmiowb(blue >> 10, dac_val);
-+}
-+
-+static void smtc_set_timing(struct smtcfb_info *sfb, struct par_info
-+ *ppar_info)
-+{
-+ switch (ppar_info->chipID) {
-+ case 0x710:
-+ case 0x712:
-+ case 0x720:
-+ sm712_set_timing(sfb, ppar_info);
-+ break;
-+ }
-+}
-+
-+static struct fb_var_screeninfo smtcfb_var = {
-+ .xres = 1024,
-+ .yres = 600,
-+ .xres_virtual = 1024,
-+ .yres_virtual = 600,
-+ .bits_per_pixel = 16,
-+ .red = {16, 8, 0},
-+ .green = {8, 8, 0},
-+ .blue = {0, 8, 0},
-+ .activate = FB_ACTIVATE_NOW,
-+ .height = -1,
-+ .width = -1,
-+ .vmode = FB_VMODE_NONINTERLACED,
-+};
-+
-+static struct fb_fix_screeninfo smtcfb_fix = {
-+ .id = "sm712fb",
-+ .type = FB_TYPE_PACKED_PIXELS,
-+ .visual = FB_VISUAL_TRUECOLOR,
-+ .line_length = 800 * 3,
-+ .accel = FB_ACCEL_SMI_LYNX,
-+};
-+
-+/* chan_to_field
-+ *
-+ * convert a colour value into a field position
-+ *
-+ * from pxafb.c
-+ */
-+
-+static inline unsigned int chan_to_field(unsigned int chan,
-+ struct fb_bitfield *bf)
-+{
-+ chan &= 0xffff;
-+ chan >>= 16 - bf->length;
-+ return chan << bf->offset;
-+}
-+
-+static int smtc_setcolreg(unsigned regno, unsigned red, unsigned green,
-+ unsigned blue, unsigned trans, struct fb_info *info)
-+{
-+ struct smtcfb_info *sfb = (struct smtcfb_info *)info;
-+ u32 val;
-+
-+ if (regno > 255)
-+ return 1;
-+
-+ switch (sfb->fb.fix.visual) {
-+ case FB_VISUAL_DIRECTCOLOR:
-+ case FB_VISUAL_TRUECOLOR:
-+ /*
-+ * 16/32 bit true-colour, use pseuo-palette for 16 base color
-+ */
-+ if (regno < 16) {
-+ if (sfb->fb.var.bits_per_pixel == 16) {
-+ u32 *pal = sfb->fb.pseudo_palette;
-+ val = chan_to_field(red, &sfb->fb.var.red);
-+ val |= chan_to_field(green, \
-+ &sfb->fb.var.green);
-+ val |= chan_to_field(blue, &sfb->fb.var.blue);
-+#ifdef __BIG_ENDIAN
-+ pal[regno] =
-+ ((red & 0xf800) >> 8) |
-+ ((green & 0xe000) >> 13) |
-+ ((green & 0x1c00) << 3) |
-+ ((blue & 0xf800) >> 3);
-+#else
-+ pal[regno] = val;
-+#endif
-+ } else {
-+ u32 *pal = sfb->fb.pseudo_palette;
-+ val = chan_to_field(red, &sfb->fb.var.red);
-+ val |= chan_to_field(green, \
-+ &sfb->fb.var.green);
-+ val |= chan_to_field(blue, &sfb->fb.var.blue);
-+#ifdef __BIG_ENDIAN
-+ val =
-+ (val & 0xff00ff00 >> 8) |
-+ (val & 0x00ff00ff << 8);
-+#endif
-+ pal[regno] = val;
-+ }
-+ }
-+ break;
-+
-+ case FB_VISUAL_PSEUDOCOLOR:
-+ /* color depth 8 bit */
-+ sm712_setpalette(regno, red, green, blue, info);
-+ break;
-+
-+ default:
-+ return 1; /* unknown type */
-+ }
-+
-+ return 0;
-+
-+}
-+
-+#ifdef __BIG_ENDIAN
-+static ssize_t smtcfb_read(struct fb_info *info, char __user * buf, size_t
-+ count, loff_t *ppos)
-+{
-+ unsigned long p = *ppos;
-+
-+ u32 *buffer, *dst;
-+ u32 __iomem *src;
-+ int c, i, cnt = 0, err = 0;
-+ unsigned long total_size;
-+
-+ if (!info || !info->screen_base)
-+ return -ENODEV;
-+
-+ if (info->state != FBINFO_STATE_RUNNING)
-+ return -EPERM;
-+
-+ total_size = info->screen_size;
-+
-+ if (total_size == 0)
-+ total_size = info->fix.smem_len;
-+
-+ if (p >= total_size)
-+ return 0;
-+
-+ if (count >= total_size)
-+ count = total_size;
-+
-+ if (count + p > total_size)
-+ count = total_size - p;
-+
-+ buffer = kmalloc((count > PAGE_SIZE) ? PAGE_SIZE : count, GFP_KERNEL);
-+ if (!buffer)
-+ return -ENOMEM;
-+
-+ src = (u32 __iomem *) (info->screen_base + p);
-+
-+ if (info->fbops->fb_sync)
-+ info->fbops->fb_sync(info);
-+
-+ while (count) {
-+ c = (count > PAGE_SIZE) ? PAGE_SIZE : count;
-+ dst = buffer;
-+ for (i = c >> 2; i--;) {
-+ *dst = fb_readl(src++);
-+ *dst =
-+ (*dst & 0xff00ff00 >> 8) |
-+ (*dst & 0x00ff00ff << 8);
-+ dst++;
-+ }
-+ if (c & 3) {
-+ u8 *dst8 = (u8 *) dst;
-+ u8 __iomem *src8 = (u8 __iomem *) src;
-+
-+ for (i = c & 3; i--;) {
-+ if (i & 1) {
-+ *dst8++ = fb_readb(++src8);
-+ } else {
-+ *dst8++ = fb_readb(--src8);
-+ src8 += 2;
-+ }
-+ }
-+ src = (u32 __iomem *) src8;
-+ }
-+
-+ if (copy_to_user(buf, buffer, c)) {
-+ err = -EFAULT;
-+ break;
-+ }
-+ *ppos += c;
-+ buf += c;
-+ cnt += c;
-+ count -= c;
-+ }
-+
-+ kfree(buffer);
-+
-+ return (err) ? err : cnt;
-+}
-+
-+static ssize_t
-+smtcfb_write(struct fb_info *info, const char __user *buf, size_t count,
-+ loff_t *ppos)
-+{
-+ unsigned long p = *ppos;
-+
-+ u32 *buffer, *src;
-+ u32 __iomem *dst;
-+ int c, i, cnt = 0, err = 0;
-+ unsigned long total_size;
-+
-+ if (!info || !info->screen_base)
-+ return -ENODEV;
-+
-+ if (info->state != FBINFO_STATE_RUNNING)
-+ return -EPERM;
-+
-+ total_size = info->screen_size;
-+
-+ if (total_size == 0)
-+ total_size = info->fix.smem_len;
-+
-+ if (p > total_size)
-+ return -EFBIG;
-+
-+ if (count > total_size) {
-+ err = -EFBIG;
-+ count = total_size;
-+ }
-+
-+ if (count + p > total_size) {
-+ if (!err)
-+ err = -ENOSPC;
-+
-+ count = total_size - p;
-+ }
-+
-+ buffer = kmalloc((count > PAGE_SIZE) ? PAGE_SIZE : count, GFP_KERNEL);
-+ if (!buffer)
-+ return -ENOMEM;
-+
-+ dst = (u32 __iomem *) (info->screen_base + p);
-+
-+ if (info->fbops->fb_sync)
-+ info->fbops->fb_sync(info);
-+
-+ while (count) {
-+ c = (count > PAGE_SIZE) ? PAGE_SIZE : count;
-+ src = buffer;
-+
-+ if (copy_from_user(src, buf, c)) {
-+ err = -EFAULT;
-+ break;
-+ }
-+
-+ for (i = c >> 2; i--;) {
-+ fb_writel((*src & 0xff00ff00 >> 8) |
-+ (*src & 0x00ff00ff << 8), dst++);
-+ src++;
-+ }
-+ if (c & 3) {
-+ u8 *src8 = (u8 *) src;
-+ u8 __iomem *dst8 = (u8 __iomem *) dst;
-+
-+ for (i = c & 3; i--;) {
-+ if (i & 1) {
-+ fb_writeb(*src8++, ++dst8);
-+ } else {
-+ fb_writeb(*src8++, --dst8);
-+ dst8 += 2;
-+ }
-+ }
-+ dst = (u32 __iomem *) dst8;
-+ }
-+
-+ *ppos += c;
-+ buf += c;
-+ cnt += c;
-+ count -= c;
-+ }
-+
-+ kfree(buffer);
-+
-+ return (cnt) ? cnt : err;
-+}
-+#endif /* ! __BIG_ENDIAN */
-+
-+#include "smtc2d.c"
-+
-+void smtcfb_copyarea(struct fb_info *info, const struct fb_copyarea *area)
-+{
-+ struct par_info *p = (struct par_info *)info->par;
-+
-+ if (smtc_2Dacceleration) {
-+ if (!area->width || !area->height)
-+ return;
-+
-+ deCopy(p->BaseAddressInVRAM, 0, info->var.bits_per_pixel,
-+ area->dx, area->dy, area->width, area->height,
-+ p->BaseAddressInVRAM, 0, area->sx, area->sy, 0, 0xC);
-+
-+ } else
-+ cfb_copyarea(info, area);
-+}
-+
-+void smtcfb_fillrect(struct fb_info *info, const struct fb_fillrect *rect)
-+{
-+ struct par_info *p = (struct par_info *)info->par;
-+
-+ if (smtc_2Dacceleration) {
-+ if (!rect->width || !rect->height)
-+ return;
-+ if (info->var.bits_per_pixel >= 24)
-+ deFillRect(p->BaseAddressInVRAM, 0, rect->dx * 3,
-+ rect->dy * 3, rect->width * 3, rect->height,
-+ rect->color);
-+ else
-+ deFillRect(p->BaseAddressInVRAM, 0, rect->dx, rect->dy,
-+ rect->width, rect->height, rect->color);
-+ } else
-+ cfb_fillrect(info, rect);
-+}
-+
-+void smtcfb_imageblit(struct fb_info *info, const struct fb_image *image)
-+{
-+ struct par_info *p = (struct par_info *)info->par;
-+ u32 bg_col = 0, fg_col = 0;
-+
-+ if ((smtc_2Dacceleration) && (image->depth == 1)) {
-+ if (smtc_de_busy)
-+ deWaitForNotBusy();
-+
-+ switch (info->var.bits_per_pixel) {
-+ case 8:
-+ bg_col = image->bg_color;
-+ fg_col = image->fg_color;
-+ break;
-+ case 16:
-+ bg_col =
-+ ((u32 *) (info->pseudo_palette))[image->bg_color];
-+ fg_col =
-+ ((u32 *) (info->pseudo_palette))[image->fg_color];
-+ break;
-+ case 32:
-+ bg_col =
-+ ((u32 *) (info->pseudo_palette))[image->bg_color];
-+ fg_col =
-+ ((u32 *) (info->pseudo_palette))[image->fg_color];
-+ break;
-+ }
-+
-+ deSystemMem2VideoMemMonoBlt(
-+ image->data,
-+ image->width / 8,
-+ 0,
-+ p->BaseAddressInVRAM,
-+ 0,
-+ 0,
-+ image->dx, image->dy,
-+ image->width, image->height,
-+ fg_col, bg_col,
-+ 0x0C);
-+
-+ } else
-+ cfb_imageblit(info, image);
-+}
-+
-+static struct fb_ops smtcfb_ops = {
-+ .owner = THIS_MODULE,
-+ .fb_setcolreg = smtc_setcolreg,
-+ .fb_fillrect = smtcfb_fillrect,
-+ .fb_imageblit = smtcfb_imageblit,
-+ .fb_copyarea = smtcfb_copyarea,
-+#ifdef __BIG_ENDIAN
-+ .fb_read = smtcfb_read,
-+ .fb_write = smtcfb_write,
-+#endif
-+
-+};
-+
-+void smtcfb_setmode(struct smtcfb_info *sfb)
-+{
-+ switch (sfb->fb.var.bits_per_pixel) {
-+ case 32:
-+ sfb->fb.fix.visual = FB_VISUAL_TRUECOLOR;
-+ sfb->fb.fix.line_length = sfb->fb.var.xres * 4;
-+ sfb->fb.var.red.length = 8;
-+ sfb->fb.var.green.length = 8;
-+ sfb->fb.var.blue.length = 8;
-+ sfb->fb.var.red.offset = 16;
-+ sfb->fb.var.green.offset = 8;
-+ sfb->fb.var.blue.offset = 0;
-+
-+ break;
-+ case 8:
-+ sfb->fb.fix.visual = FB_VISUAL_PSEUDOCOLOR;
-+ sfb->fb.fix.line_length = sfb->fb.var.xres;
-+ sfb->fb.var.red.offset = 5;
-+ sfb->fb.var.red.length = 3;
-+ sfb->fb.var.green.offset = 2;
-+ sfb->fb.var.green.length = 3;
-+ sfb->fb.var.blue.offset = 0;
-+ sfb->fb.var.blue.length = 2;
-+ break;
-+ case 24:
-+ sfb->fb.fix.visual = FB_VISUAL_TRUECOLOR;
-+ sfb->fb.fix.line_length = sfb->fb.var.xres * 3;
-+ sfb->fb.var.red.length = 8;
-+ sfb->fb.var.green.length = 8;
-+ sfb->fb.var.blue.length = 8;
-+
-+ sfb->fb.var.red.offset = 16;
-+ sfb->fb.var.green.offset = 8;
-+ sfb->fb.var.blue.offset = 0;
-+
-+ break;
-+ case 16:
-+ default:
-+ sfb->fb.fix.visual = FB_VISUAL_TRUECOLOR;
-+ sfb->fb.fix.line_length = sfb->fb.var.xres * 2;
-+
-+ sfb->fb.var.red.length = 5;
-+ sfb->fb.var.green.length = 6;
-+ sfb->fb.var.blue.length = 5;
-+
-+ sfb->fb.var.red.offset = 11;
-+ sfb->fb.var.green.offset = 5;
-+ sfb->fb.var.blue.offset = 0;
-+
-+ break;
-+ }
-+
-+ hw.width = sfb->fb.var.xres;
-+ hw.height = sfb->fb.var.yres;
-+ hw.hz = 60;
-+ smtc_set_timing(sfb, &hw);
-+ if (smtc_2Dacceleration) {
-+ printk("2D acceleration enabled!\n");
-+ /* Init smtc drawing engine */
-+ deInit(sfb->fb.var.xres, sfb->fb.var.yres,
-+ sfb->fb.var.bits_per_pixel);
-+ }
-+}
-+
-+#if defined(CONFIG_FB_SM7XX_DUALHEAD)
-+void smtc_head2_init(struct smtcfb_info *sfb)
-+{
-+ smtcfb_info2 = *sfb;
-+ smtcfb_info2.fb.pseudo_palette = &colreg2;
-+ smtcfb_info2.fb.par = &hw2;
-+ sprintf(smtcfb_info2.fb.fix.id, "sm%Xfb2", hw.chipID);
-+ hw2.chipID = hw.chipID;
-+ hw2.chipRevID = hw.chipRevID;
-+ hw2.width = smtcfb_info2.fb.var.xres;
-+ hw2.height = smtcfb_info2.fb.var.yres;
-+ hw2.hz = 60;
-+ hw2.m_pMMIO = smtc_RegBaseAddress;
-+
-+ /*hard code 2nd head starting from half VRAM size postion */
-+ hw2.BaseAddressInVRAM = smtcfb_info2.fb.fix.smem_len / 2;
-+
-+ hw2.m_pLFB = smtc_VRAMBaseAddress + hw2.BaseAddressInVRAM;
-+ smtcfb_info2.fb.screen_base = hw2.m_pLFB;
-+
-+ writel(hw2.BaseAddressInVRAM >> 3, hw2.m_pVPR + 0x10);
-+}
-+#endif
-+
-+/*
-+ * Alloc struct smtcfb_info and assign the default value
-+ */
-+static struct smtcfb_info *__devinit smtc_alloc_fb_info(struct pci_dev *dev,
-+ char *name)
-+{
-+ struct smtcfb_info *sfb;
-+
-+ sfb = kmalloc(sizeof(struct smtcfb_info), GFP_KERNEL);
-+
-+ if (!sfb)
-+ return NULL;
-+
-+ memset(sfb, 0, sizeof(struct smtcfb_info));
-+
-+ sfb->currcon = -1;
-+ sfb->dev = dev;
-+
-+ /*** Init sfb->fb with default value ***/
-+ sfb->fb.flags = FBINFO_FLAG_DEFAULT;
-+ sfb->fb.fbops = &smtcfb_ops;
-+ sfb->fb.var = smtcfb_var;
-+ sfb->fb.fix = smtcfb_fix;
-+
-+ strcpy(sfb->fb.fix.id, name);
-+
-+ sfb->fb.fix.type = FB_TYPE_PACKED_PIXELS;
-+ sfb->fb.fix.type_aux = 0;
-+ sfb->fb.fix.xpanstep = 0;
-+ sfb->fb.fix.ypanstep = 0;
-+ sfb->fb.fix.ywrapstep = 0;
-+ sfb->fb.fix.accel = FB_ACCEL_SMI_LYNX;
-+
-+ sfb->fb.var.nonstd = 0;
-+ sfb->fb.var.activate = FB_ACTIVATE_NOW;
-+ sfb->fb.var.height = -1;
-+ sfb->fb.var.width = -1;
-+ /* text mode acceleration */
-+ sfb->fb.var.accel_flags = FB_ACCELF_TEXT;
-+ sfb->fb.var.vmode = FB_VMODE_NONINTERLACED;
-+ sfb->fb.par = &hw;
-+ sfb->fb.pseudo_palette = colreg;
-+
-+ return sfb;
-+}
-+
-+/*
-+ * Unmap in the memory mapped IO registers
-+ */
-+
-+static void __devinit smtc_unmap_mmio(struct smtcfb_info *sfb)
-+{
-+ if (sfb && smtc_RegBaseAddress)
-+ smtc_RegBaseAddress = NULL;
-+}
-+
-+/*
-+ * Map in the screen memory
-+ */
-+
-+static int __devinit smtc_map_smem(struct smtcfb_info *sfb,
-+ struct pci_dev *dev, u_long smem_len)
-+{
-+ if (sfb->fb.var.bits_per_pixel == 32) {
-+#ifdef __BIG_ENDIAN
-+ sfb->fb.fix.smem_start = pci_resource_start(dev, 0)
-+ + 0x800000;
-+#else
-+ sfb->fb.fix.smem_start = pci_resource_start(dev, 0);
-+#endif
-+ } else {
-+ sfb->fb.fix.smem_start = pci_resource_start(dev, 0);
-+ }
-+
-+ sfb->fb.fix.smem_len = smem_len;
-+
-+ sfb->fb.screen_base = smtc_VRAMBaseAddress;
-+
-+ if (!sfb->fb.screen_base) {
-+ printk(KERN_INFO "%s: unable to map screen memory\n",
-+ sfb->fb.fix.id);
-+ return -ENOMEM;
-+ }
-+
-+ return 0;
-+}
-+
-+/*
-+ * Unmap in the screen memory
-+ *
-+ */
-+static void __devinit smtc_unmap_smem(struct smtcfb_info *sfb)
-+{
-+ if (sfb && sfb->fb.screen_base) {
-+ iounmap(sfb->fb.screen_base);
-+ sfb->fb.screen_base = NULL;
-+ }
-+}
-+
-+/*
-+ * We need to wake up the LynxEM+, and make sure its in linear memory mode.
-+ */
-+static inline void __devinit sm7xx_init_hw(void)
-+{
-+ outb_p(0x18, 0x3c4);
-+ outb_p(0x11, 0x3c5);
-+}
-+
-+static void __devinit smtc_free_fb_info(struct smtcfb_info *sfb)
-+{
-+ if (sfb) {
-+ fb_alloc_cmap(&sfb->fb.cmap, 0, 0);
-+ kfree(sfb);
-+ }
-+}
-+
-+static int __init smtcfb_init(void)
-+{
-+ struct smtcfb_info *sfb;
-+ u_long smem_size = 0x00800000; /* default 8MB */
-+ char name[16];
-+ int err, i = 0;
-+ unsigned long pFramebufferPhysical;
-+ struct pci_dev *pdev = NULL;
-+
-+ printk(KERN_INFO
-+ "Silicon Motion display driver " SMTC_LINUX_FB_VERSION "\n");
-+
-+ /* init the global variable */
-+ smtc_2Dacceleration = 0; /* default no 2D acceleration */
-+
-+ do {
-+ pdev = pci_get_device(0x126f, smtc_ChipIDs[i], pdev);
-+ if (pdev == NULL) {
-+ i++;
-+ } else {
-+ hw.chipID = smtc_ChipIDs[i];
-+ break;
-+ }
-+ } while (i < numSMTCchipIDs);
-+
-+ err = pci_enable_device(pdev); /* enable SMTC chip */
-+
-+ if (err)
-+ return err;
-+
-+ err = -ENOMEM;
-+
-+ sprintf(name, "sm%Xfb", hw.chipID);
-+
-+ sfb = smtc_alloc_fb_info(pdev, name);
-+
-+ if (!sfb)
-+ goto failed;
-+
-+ sm7xx_init_hw();
-+
-+ /*get mode parameter from smtc_screen_info */
-+ if (smtc_screen_info.lfb_width != 0) {
-+ sfb->fb.var.xres = smtc_screen_info.lfb_width;
-+ sfb->fb.var.yres = smtc_screen_info.lfb_height;
-+ sfb->fb.var.bits_per_pixel = smtc_screen_info.lfb_depth;
-+ } else {
-+ /* default resolution 1024x600 16bit mode */
-+ sfb->fb.var.xres = SCREEN_X_RES;
-+ sfb->fb.var.yres = SCREEN_Y_RES;
-+ sfb->fb.var.bits_per_pixel = SCREEN_BPP;
-+ }
-+
-+ smdbg("\nsfb->fb.var.bits_per_pixel = %d sm712be_flag = %d\n",
-+ sfb->fb.var.bits_per_pixel, sm712be_flag);
-+#ifdef __BIG_ENDIAN
-+ if (sm712be_flag == 1 && sfb->fb.var.bits_per_pixel == 24)
-+ sfb->fb.var.bits_per_pixel = (smtc_screen_info.lfb_depth = 32);
-+#endif
-+ /* Map address and memory detection */
-+ pFramebufferPhysical = pci_resource_start(pdev, 0);
-+ pci_read_config_byte(pdev, PCI_REVISION_ID, &hw.chipRevID);
-+
-+ switch (hw.chipID) {
-+ case 0x710:
-+ case 0x712:
-+ sfb->fb.fix.mmio_start = pFramebufferPhysical + 0x00400000;
-+ sfb->fb.fix.mmio_len = 0x00400000;
-+ smem_size = SM712_VIDEOMEMORYSIZE;
-+#ifdef __BIG_ENDIAN
-+ hw.m_pLFB = (smtc_VRAMBaseAddress =
-+ ioremap(pFramebufferPhysical, 0x00c00000));
-+#else
-+ hw.m_pLFB = (smtc_VRAMBaseAddress =
-+ ioremap(pFramebufferPhysical, 0x00800000));
-+#endif
-+ hw.m_pMMIO = (smtc_RegBaseAddress =
-+ smtc_VRAMBaseAddress + 0x00700000);
-+ smtc_2DBaseAddress = (hw.m_pDPR =
-+ smtc_VRAMBaseAddress + 0x00408000);
-+ smtc_2Ddataport = smtc_VRAMBaseAddress + DE_DATA_PORT_712;
-+ hw.m_pVPR = hw.m_pLFB + 0x0040c000;
-+ if (sfb->fb.var.bits_per_pixel == 32) {
-+#ifdef __BIG_ENDIAN
-+ smtc_VRAMBaseAddress += 0x800000;
-+ hw.m_pLFB += 0x800000;
-+ printk(KERN_INFO
-+ "\nsmtc_VRAMBaseAddress=%p hw.m_pLFB=%p\n",
-+ smtc_VRAMBaseAddress, hw.m_pLFB);
-+#endif
-+ }
-+ if (!smtc_RegBaseAddress) {
-+
-+ printk(KERN_INFO
-+ "%s: unable to map memory mapped IO\n",
-+ sfb->fb.fix.id);
-+
-+ return -ENOMEM;
-+ }
-+
-+ /* set MCLK = 14.31818 * (0x16 / 0x2) */
-+ smtc_seqw(0x6a, 0x16);
-+ smtc_seqw(0x6b, 0x02);
-+ smtc_seqw(0x62, 0x3e);
-+ /* enable PCI burst */
-+ smtc_seqw(0x17, 0x20);
-+ /* enabel word swap */
-+ if (sfb->fb.var.bits_per_pixel == 32) {
-+#ifdef __BIG_ENDIAN
-+ smtc_seqw(0x17, 0x30);
-+#endif
-+ }
-+#ifdef CONFIG_FB_SM7XX_ACCEL
-+ smtc_2Dacceleration = 1;
-+#endif
-+
-+ break;
-+
-+ case 0x720:
-+ sfb->fb.fix.mmio_start = pFramebufferPhysical;
-+ sfb->fb.fix.mmio_len = 0x00200000;
-+ smem_size = SM722_VIDEOMEMORYSIZE;
-+ smtc_2DBaseAddress = (hw.m_pDPR =
-+ ioremap(pFramebufferPhysical, 0x00a00000));
-+ hw.m_pLFB = (smtc_VRAMBaseAddress =
-+ smtc_2DBaseAddress + 0x00200000);
-+ hw.m_pMMIO = (smtc_RegBaseAddress =
-+ smtc_2DBaseAddress + 0x000c0000);
-+ smtc_2Ddataport = smtc_2DBaseAddress + DE_DATA_PORT_722;
-+ hw.m_pVPR = smtc_2DBaseAddress + 0x800;
-+
-+ smtc_seqw(0x62, 0xff);
-+ smtc_seqw(0x6a, 0x0d);
-+ smtc_seqw(0x6b, 0x02);
-+ smtc_2Dacceleration = 0;
-+ break;
-+ default:
-+ printk(KERN_INFO
-+ "No valid Silicon Motion display chip was detected!\n");
-+
-+ smtc_free_fb_info(sfb);
-+ return err;
-+ }
-+
-+ /* can support 32 bpp */
-+ if (15 == sfb->fb.var.bits_per_pixel)
-+ sfb->fb.var.bits_per_pixel = 16;
-+
-+ sfb->fb.var.xres_virtual = sfb->fb.var.xres;
-+
-+ sfb->fb.var.yres_virtual = sfb->fb.var.yres;
-+ err = smtc_map_smem(sfb, pdev, smem_size);
-+ if (err)
-+ goto failed;
-+
-+ smtcfb_setmode(sfb);
-+ /* Primary display starting from 0 postion */
-+ hw.BaseAddressInVRAM = 0;
-+ sfb->fb.par = &hw;
-+
-+ mutex_init(&sfb->fb.lock);
-+ mutex_init(&sfb->fb.mm_lock);
-+
-+ err = register_framebuffer(&sfb->fb);
-+ if (err < 0)
-+ goto failed;
-+
-+ printk(KERN_INFO "Silicon Motion SM%X Rev%X primary display mode"
-+ "%dx%d-%d Init Complete.\n", hw.chipID, hw.chipRevID,
-+ sfb->fb.var.xres, sfb->fb.var.yres,
-+ sfb->fb.var.bits_per_pixel);
-+
-+#if defined(CONFIG_FB_SM7XX_DUALHEAD)
-+ smtc_head2_init(sfb);
-+ err = register_framebuffer(&smtcfb_info2.fb);
-+
-+ /* if second head display fails, also fails the primary display */
-+ if (err < 0) {
-+ printk(KERN_INFO
-+ "Silicon Motion, Inc. second head init fail\n");
-+ goto failed;
-+ }
-+
-+ printk(KERN_INFO "Silicon Motion SM%X Rev%X secondary display mode"
-+ "%dx%d-%d Init Complete.\n", hw.chipID, hw.chipRevID,
-+ hw2.width, hw2.height,
-+ smtcfb_info2.fb.var.bits_per_pixel);
-+#endif
-+
-+ return 0;
-+
-+ failed:
-+ printk(KERN_INFO "Silicon Motion, Inc. primary display init fail\n");
-+
-+ smtc_unmap_smem(sfb);
-+ smtc_unmap_mmio(sfb);
-+ smtc_free_fb_info(sfb);
-+
-+ return err;
-+}
-+
-+static void __exit smtcfb_exit(void)
-+{
-+}
-+
-+module_init(smtcfb_init);
-+module_exit(smtcfb_exit);
-+
-+/*
-+ * sm712be_setup - process command line options
-+ * @options: string of options
-+ * Returns zero.
-+ *
-+ */
-+static int __init sm712be_setup(char *options)
-+{
-+ sm712be_flag = 0;
-+ if (!options || !*options) {
-+ smdbg("\n No sm712be parameter\n");
-+ return -EINVAL;
-+ }
-+ if (strstr(options, "enable") != NULL)
-+ sm712be_flag = 1;
-+
-+ smdbg("\nsm712be_setup = %s sm712be_flag = %d\n", options,
-+ sm712be_flag);
-+
-+ return 0;
-+}
-+
-+__setup("sm712be=", sm712be_setup);
-+
-+/*
-+ * sm712vga_setup - process command line options, get vga parameter
-+ * @options: string of options
-+ * Returns zero.
-+ *
-+ */
-+static int __init sm712vga_setup(char *options)
-+{
-+ int index;
-+ sm712be_flag = 0;
-+
-+ if (!options || !*options) {
-+ smdbg("\n No vga parameter\n");
-+ return -EINVAL;
-+ }
-+
-+ smtc_screen_info.lfb_width = 0;
-+ smtc_screen_info.lfb_height = 0;
-+ smtc_screen_info.lfb_depth = 0;
-+
-+ smdbg("\nsm712vga_setup = %s\n", options);
-+
-+ for (index = 0;
-+ index < (sizeof(vesa_mode) / sizeof(struct vesa_mode_table));
-+ index++) {
-+ if (strstr(options, vesa_mode[index].mode_index)) {
-+ smtc_screen_info.lfb_width = vesa_mode[index].lfb_width;
-+ smtc_screen_info.lfb_height =
-+ vesa_mode[index].lfb_height;
-+ smtc_screen_info.lfb_depth = vesa_mode[index].lfb_depth;
-+ return 0;
-+ }
-+ }
-+
-+ return -1;
-+}
-+
-+__setup("vga=", sm712vga_setup);
-+
-+MODULE_AUTHOR("Siliconmotion ");
-+MODULE_DESCRIPTION("Framebuffer driver for SMI Graphic Cards");
-+MODULE_LICENSE("GPL");
-diff -Nur linux-2.6.30.5.orig/drivers/video/sm7xx/smtcfb.h linux-2.6.30.5/drivers/video/sm7xx/smtcfb.h
---- linux-2.6.30.5.orig/drivers/video/sm7xx/smtcfb.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.30.5/drivers/video/sm7xx/smtcfb.h 2009-08-23 19:01:04.000000000 +0200
-@@ -0,0 +1,793 @@
-+/*
-+ * smtcfb.h -- Silicon Motion SM7xx frame buffer device
-+ *
-+ * Copyright (C) 2006 Silicon Motion Technology Corp.
-+ * Authors: Ge Wang, gewang@siliconmotion.com
-+ * Boyod boyod.yang@siliconmotion.com.cn
-+ *
-+ * Copyright (C) 2009 Lemote, Inc. & Institute of Computing Technology
-+ * Author: Wu Zhangjin, wuzj@lemote.com
-+ *
-+ * This file is subject to the terms and conditions of the GNU General Public
-+ * License. See the file COPYING in the main directory of this archive for
-+ * more details.
-+ */
-+
-+#define SMTC_LINUX_FB_VERSION "version 0.11.2619.21.01 July 27, 2008"
-+
-+#define NR_PALETTE 256
-+#define NR_RGB 2
-+
-+#define FB_ACCEL_SMI_LYNX 88
-+
-+#ifdef __BIG_ENDIAN
-+#define PC_VGA 0
-+#else
-+#define PC_VGA 1
-+#endif
-+
-+#define SCREEN_X_RES 1024
-+#define SCREEN_Y_RES 600
-+#define SCREEN_BPP 16
-+
-+#ifndef FIELD_OFFSET
-+#define FIELD_OFSFET(type, field) \
-+ ((unsigned long) (PUCHAR) & (((type *)0)->field))
-+#endif
-+
-+/*Assume SM712 graphics chip has 4MB VRAM */
-+#define SM712_VIDEOMEMORYSIZE 0x00400000
-+/*Assume SM722 graphics chip has 8MB VRAM */
-+#define SM722_VIDEOMEMORYSIZE 0x00800000
-+
-+#define dac_reg (0x3c8)
-+#define dac_val (0x3c9)
-+
-+extern char *smtc_RegBaseAddress;
-+#define smtc_mmiowb(dat, reg) writeb(dat, smtc_RegBaseAddress + reg)
-+#define smtc_mmioww(dat, reg) writew(dat, smtc_RegBaseAddress + reg)
-+#define smtc_mmiowl(dat, reg) writel(dat, smtc_RegBaseAddress + reg)
-+
-+#define smtc_mmiorb(reg) readb(smtc_RegBaseAddress + reg)
-+#define smtc_mmiorw(reg) readw(smtc_RegBaseAddress + reg)
-+#define smtc_mmiorl(reg) readl(smtc_RegBaseAddress + reg)
-+
-+#define SIZE_SR00_SR04 (0x04 - 0x00 + 1)
-+#define SIZE_SR10_SR24 (0x24 - 0x10 + 1)
-+#define SIZE_SR30_SR75 (0x75 - 0x30 + 1)
-+#define SIZE_SR80_SR93 (0x93 - 0x80 + 1)
-+#define SIZE_SRA0_SRAF (0xAF - 0xA0 + 1)
-+#define SIZE_GR00_GR08 (0x08 - 0x00 + 1)
-+#define SIZE_AR00_AR14 (0x14 - 0x00 + 1)
-+#define SIZE_CR00_CR18 (0x18 - 0x00 + 1)
-+#define SIZE_CR30_CR4D (0x4D - 0x30 + 1)
-+#define SIZE_CR90_CRA7 (0xA7 - 0x90 + 1)
-+#define SIZE_VPR (0x6C + 1)
-+#define SIZE_DPR (0x44 + 1)
-+
-+static inline void smtc_crtcw(int reg, int val)
-+{
-+ smtc_mmiowb(reg, 0x3d4);
-+ smtc_mmiowb(val, 0x3d5);
-+}
-+
-+static inline unsigned int smtc_crtcr(int reg)
-+{
-+ smtc_mmiowb(reg, 0x3d4);
-+ return smtc_mmiorb(0x3d5);
-+}
-+
-+static inline void smtc_grphw(int reg, int val)
-+{
-+ smtc_mmiowb(reg, 0x3ce);
-+ smtc_mmiowb(val, 0x3cf);
-+}
-+
-+static inline unsigned int smtc_grphr(int reg)
-+{
-+ smtc_mmiowb(reg, 0x3ce);
-+ return smtc_mmiorb(0x3cf);
-+}
-+
-+static inline void smtc_attrw(int reg, int val)
-+{
-+ smtc_mmiorb(0x3da);
-+ smtc_mmiowb(reg, 0x3c0);
-+ smtc_mmiorb(0x3c1);
-+ smtc_mmiowb(val, 0x3c0);
-+}
-+
-+static inline void smtc_seqw(int reg, int val)
-+{
-+ smtc_mmiowb(reg, 0x3c4);
-+ smtc_mmiowb(val, 0x3c5);
-+}
-+
-+static inline unsigned int smtc_seqr(int reg)
-+{
-+ smtc_mmiowb(reg, 0x3c4);
-+ return smtc_mmiorb(0x3c5);
-+}
-+
-+/* The next structure holds all information relevant for a specific video mode.
-+ */
-+
-+struct ModeInit {
-+ int mmSizeX;
-+ int mmSizeY;
-+ int bpp;
-+ int hz;
-+ unsigned char Init_MISC;
-+ unsigned char Init_SR00_SR04[SIZE_SR00_SR04];
-+ unsigned char Init_SR10_SR24[SIZE_SR10_SR24];
-+ unsigned char Init_SR30_SR75[SIZE_SR30_SR75];
-+ unsigned char Init_SR80_SR93[SIZE_SR80_SR93];
-+ unsigned char Init_SRA0_SRAF[SIZE_SRA0_SRAF];
-+ unsigned char Init_GR00_GR08[SIZE_GR00_GR08];
-+ unsigned char Init_AR00_AR14[SIZE_AR00_AR14];
-+ unsigned char Init_CR00_CR18[SIZE_CR00_CR18];
-+ unsigned char Init_CR30_CR4D[SIZE_CR30_CR4D];
-+ unsigned char Init_CR90_CRA7[SIZE_CR90_CRA7];
-+};
-+
-+/**********************************************************************
-+ SM712 Mode table.
-+ **********************************************************************/
-+struct ModeInit VGAMode[] = {
-+ {
-+ /* mode#0: 640 x 480 16Bpp 60Hz */
-+ 640, 480, 16, 60,
-+ /* Init_MISC */
-+ 0xE3,
-+ { /* Init_SR0_SR4 */
-+ 0x03, 0x01, 0x0F, 0x00, 0x0E,
-+ },
-+ { /* Init_SR10_SR24 */
-+ 0xFF, 0xBE, 0xEF, 0xFF, 0x00, 0x0E, 0x17, 0x2C,
-+ 0x99, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0xC4, 0x30, 0x02, 0x01, 0x01,
-+ },
-+ { /* Init_SR30_SR75 */
-+ 0x32, 0x03, 0xA0, 0x09, 0xC0, 0x32, 0x32, 0x32,
-+ 0x32, 0x32, 0x32, 0x32, 0x00, 0x00, 0x03, 0xFF,
-+ 0x00, 0xFC, 0x00, 0x00, 0x20, 0x18, 0x00, 0xFC,
-+ 0x20, 0x0C, 0x44, 0x20, 0x00, 0x32, 0x32, 0x32,
-+ 0x04, 0x24, 0x63, 0x4F, 0x52, 0x0B, 0xDF, 0xEA,
-+ 0x04, 0x50, 0x19, 0x32, 0x32, 0x00, 0x00, 0x32,
-+ 0x01, 0x80, 0x7E, 0x1A, 0x1A, 0x00, 0x00, 0x00,
-+ 0x50, 0x03, 0x74, 0x14, 0x07, 0x82, 0x07, 0x04,
-+ 0x00, 0x45, 0x30, 0x30, 0x40, 0x30,
-+ },
-+ { /* Init_SR80_SR93 */
-+ 0xFF, 0x07, 0x00, 0x6F, 0x7F, 0x7F, 0xFF, 0x32,
-+ 0xF7, 0x00, 0x00, 0x00, 0xEF, 0xFF, 0x32, 0x32,
-+ 0x00, 0x00, 0x00, 0x00,
-+ },
-+ { /* Init_SRA0_SRAF */
-+ 0x00, 0xFF, 0xBF, 0xFF, 0xFF, 0xED, 0xED, 0xED,
-+ 0x7B, 0xFF, 0xFF, 0xFF, 0xBF, 0xEF, 0xFF, 0xDF,
-+ },
-+ { /* Init_GR00_GR08 */
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x05, 0x0F,
-+ 0xFF,
-+ },
-+ { /* Init_AR00_AR14 */
-+ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
-+ 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
-+ 0x41, 0x00, 0x0F, 0x00, 0x00,
-+ },
-+ { /* Init_CR00_CR18 */
-+ 0x5F, 0x4F, 0x4F, 0x00, 0x53, 0x1F, 0x0B, 0x3E,
-+ 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0xEA, 0x0C, 0xDF, 0x50, 0x40, 0xDF, 0x00, 0xE3,
-+ 0xFF,
-+ },
-+ { /* Init_CR30_CR4D */
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0x03, 0x20,
-+ 0x00, 0x00, 0x00, 0x40, 0x00, 0xE7, 0xFF, 0xFD,
-+ 0x5F, 0x4F, 0x00, 0x54, 0x00, 0x0B, 0xDF, 0x00,
-+ 0xEA, 0x0C, 0x2E, 0x00, 0x4F, 0xDF,
-+ },
-+ { /* Init_CR90_CRA7 */
-+ 0x56, 0xDD, 0x5E, 0xEA, 0x87, 0x44, 0x8F, 0x55,
-+ 0x0A, 0x8F, 0x55, 0x0A, 0x00, 0x00, 0x18, 0x00,
-+ 0x11, 0x10, 0x0B, 0x0A, 0x0A, 0x0A, 0x0A, 0x00,
-+ },
-+ },
-+ {
-+ /* mode#1: 640 x 480 24Bpp 60Hz */
-+ 640, 480, 24, 60,
-+ /* Init_MISC */
-+ 0xE3,
-+ { /* Init_SR0_SR4 */
-+ 0x03, 0x01, 0x0F, 0x00, 0x0E,
-+ },
-+ { /* Init_SR10_SR24 */
-+ 0xFF, 0xBE, 0xEF, 0xFF, 0x00, 0x0E, 0x17, 0x2C,
-+ 0x99, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0xC4, 0x30, 0x02, 0x01, 0x01,
-+ },
-+ { /* Init_SR30_SR75 */
-+ 0x32, 0x03, 0xA0, 0x09, 0xC0, 0x32, 0x32, 0x32,
-+ 0x32, 0x32, 0x32, 0x32, 0x00, 0x00, 0x03, 0xFF,
-+ 0x00, 0xFC, 0x00, 0x00, 0x20, 0x18, 0x00, 0xFC,
-+ 0x20, 0x0C, 0x44, 0x20, 0x00, 0x32, 0x32, 0x32,
-+ 0x04, 0x24, 0x63, 0x4F, 0x52, 0x0B, 0xDF, 0xEA,
-+ 0x04, 0x50, 0x19, 0x32, 0x32, 0x00, 0x00, 0x32,
-+ 0x01, 0x80, 0x7E, 0x1A, 0x1A, 0x00, 0x00, 0x00,
-+ 0x50, 0x03, 0x74, 0x14, 0x07, 0x82, 0x07, 0x04,
-+ 0x00, 0x45, 0x30, 0x30, 0x40, 0x30,
-+ },
-+ { /* Init_SR80_SR93 */
-+ 0xFF, 0x07, 0x00, 0x6F, 0x7F, 0x7F, 0xFF, 0x32,
-+ 0xF7, 0x00, 0x00, 0x00, 0xEF, 0xFF, 0x32, 0x32,
-+ 0x00, 0x00, 0x00, 0x00,
-+ },
-+ { /* Init_SRA0_SRAF */
-+ 0x00, 0xFF, 0xBF, 0xFF, 0xFF, 0xED, 0xED, 0xED,
-+ 0x7B, 0xFF, 0xFF, 0xFF, 0xBF, 0xEF, 0xFF, 0xDF,
-+ },
-+ { /* Init_GR00_GR08 */
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x05, 0x0F,
-+ 0xFF,
-+ },
-+ { /* Init_AR00_AR14 */
-+ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
-+ 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
-+ 0x41, 0x00, 0x0F, 0x00, 0x00,
-+ },
-+ { /* Init_CR00_CR18 */
-+ 0x5F, 0x4F, 0x4F, 0x00, 0x53, 0x1F, 0x0B, 0x3E,
-+ 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0xEA, 0x0C, 0xDF, 0x50, 0x40, 0xDF, 0x00, 0xE3,
-+ 0xFF,
-+ },
-+ { /* Init_CR30_CR4D */
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0x03, 0x20,
-+ 0x00, 0x00, 0x00, 0x40, 0x00, 0xE7, 0xFF, 0xFD,
-+ 0x5F, 0x4F, 0x00, 0x54, 0x00, 0x0B, 0xDF, 0x00,
-+ 0xEA, 0x0C, 0x2E, 0x00, 0x4F, 0xDF,
-+ },
-+ { /* Init_CR90_CRA7 */
-+ 0x56, 0xDD, 0x5E, 0xEA, 0x87, 0x44, 0x8F, 0x55,
-+ 0x0A, 0x8F, 0x55, 0x0A, 0x00, 0x00, 0x18, 0x00,
-+ 0x11, 0x10, 0x0B, 0x0A, 0x0A, 0x0A, 0x0A, 0x00,
-+ },
-+ },
-+ {
-+ /* mode#0: 640 x 480 32Bpp 60Hz */
-+ 640, 480, 32, 60,
-+ /* Init_MISC */
-+ 0xE3,
-+ { /* Init_SR0_SR4 */
-+ 0x03, 0x01, 0x0F, 0x00, 0x0E,
-+ },
-+ { /* Init_SR10_SR24 */
-+ 0xFF, 0xBE, 0xEF, 0xFF, 0x00, 0x0E, 0x17, 0x2C,
-+ 0x99, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0xC4, 0x30, 0x02, 0x01, 0x01,
-+ },
-+ { /* Init_SR30_SR75 */
-+ 0x32, 0x03, 0xA0, 0x09, 0xC0, 0x32, 0x32, 0x32,
-+ 0x32, 0x32, 0x32, 0x32, 0x00, 0x00, 0x03, 0xFF,
-+ 0x00, 0xFC, 0x00, 0x00, 0x20, 0x18, 0x00, 0xFC,
-+ 0x20, 0x0C, 0x44, 0x20, 0x00, 0x32, 0x32, 0x32,
-+ 0x04, 0x24, 0x63, 0x4F, 0x52, 0x0B, 0xDF, 0xEA,
-+ 0x04, 0x50, 0x19, 0x32, 0x32, 0x00, 0x00, 0x32,
-+ 0x01, 0x80, 0x7E, 0x1A, 0x1A, 0x00, 0x00, 0x00,
-+ 0x50, 0x03, 0x74, 0x14, 0x07, 0x82, 0x07, 0x04,
-+ 0x00, 0x45, 0x30, 0x30, 0x40, 0x30,
-+ },
-+ { /* Init_SR80_SR93 */
-+ 0xFF, 0x07, 0x00, 0x6F, 0x7F, 0x7F, 0xFF, 0x32,
-+ 0xF7, 0x00, 0x00, 0x00, 0xEF, 0xFF, 0x32, 0x32,
-+ 0x00, 0x00, 0x00, 0x00,
-+ },
-+ { /* Init_SRA0_SRAF */
-+ 0x00, 0xFF, 0xBF, 0xFF, 0xFF, 0xED, 0xED, 0xED,
-+ 0x7B, 0xFF, 0xFF, 0xFF, 0xBF, 0xEF, 0xFF, 0xDF,
-+ },
-+ { /* Init_GR00_GR08 */
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x05, 0x0F,
-+ 0xFF,
-+ },
-+ { /* Init_AR00_AR14 */
-+ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
-+ 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
-+ 0x41, 0x00, 0x0F, 0x00, 0x00,
-+ },
-+ { /* Init_CR00_CR18 */
-+ 0x5F, 0x4F, 0x4F, 0x00, 0x53, 0x1F, 0x0B, 0x3E,
-+ 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0xEA, 0x0C, 0xDF, 0x50, 0x40, 0xDF, 0x00, 0xE3,
-+ 0xFF,
-+ },
-+ { /* Init_CR30_CR4D */
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0x03, 0x20,
-+ 0x00, 0x00, 0x00, 0x40, 0x00, 0xE7, 0xFF, 0xFD,
-+ 0x5F, 0x4F, 0x00, 0x54, 0x00, 0x0B, 0xDF, 0x00,
-+ 0xEA, 0x0C, 0x2E, 0x00, 0x4F, 0xDF,
-+ },
-+ { /* Init_CR90_CRA7 */
-+ 0x56, 0xDD, 0x5E, 0xEA, 0x87, 0x44, 0x8F, 0x55,
-+ 0x0A, 0x8F, 0x55, 0x0A, 0x00, 0x00, 0x18, 0x00,
-+ 0x11, 0x10, 0x0B, 0x0A, 0x0A, 0x0A, 0x0A, 0x00,
-+ },
-+ },
-+
-+ { /* mode#2: 800 x 600 16Bpp 60Hz */
-+ 800, 600, 16, 60,
-+ /* Init_MISC */
-+ 0x2B,
-+ { /* Init_SR0_SR4 */
-+ 0x03, 0x01, 0x0F, 0x03, 0x0E,
-+ },
-+ { /* Init_SR10_SR24 */
-+ 0xFF, 0xBE, 0xEE, 0xFF, 0x00, 0x0E, 0x17, 0x2C,
-+ 0x99, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0xC4, 0x30, 0x02, 0x01, 0x01,
-+ },
-+ { /* Init_SR30_SR75 */
-+ 0x34, 0x03, 0x20, 0x09, 0xC0, 0x24, 0x24, 0x24,
-+ 0x24, 0x24, 0x24, 0x24, 0x00, 0x00, 0x03, 0xFF,
-+ 0x00, 0xFC, 0x00, 0x00, 0x20, 0x38, 0x00, 0xFC,
-+ 0x20, 0x0C, 0x44, 0x20, 0x00, 0x24, 0x24, 0x24,
-+ 0x04, 0x48, 0x83, 0x63, 0x68, 0x72, 0x57, 0x58,
-+ 0x04, 0x55, 0x59, 0x24, 0x24, 0x00, 0x00, 0x24,
-+ 0x01, 0x80, 0x7A, 0x1A, 0x1A, 0x00, 0x00, 0x00,
-+ 0x50, 0x03, 0x74, 0x14, 0x1C, 0x85, 0x35, 0x13,
-+ 0x02, 0x45, 0x30, 0x35, 0x40, 0x20,
-+ },
-+ { /* Init_SR80_SR93 */
-+ 0x00, 0x00, 0x00, 0x6F, 0x7F, 0x7F, 0xFF, 0x24,
-+ 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x24, 0x24,
-+ 0x00, 0x00, 0x00, 0x00,
-+ },
-+ { /* Init_SRA0_SRAF */
-+ 0x00, 0xFF, 0xBF, 0xFF, 0xFF, 0xED, 0xED, 0xED,
-+ 0x7B, 0xFF, 0xFF, 0xFF, 0xBF, 0xEF, 0xBF, 0xDF,
-+ },
-+ { /* Init_GR00_GR08 */
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x05, 0x0F,
-+ 0xFF,
-+ },
-+ { /* Init_AR00_AR14 */
-+ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
-+ 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
-+ 0x41, 0x00, 0x0F, 0x00, 0x00,
-+ },
-+ { /* Init_CR00_CR18 */
-+ 0x7F, 0x63, 0x63, 0x00, 0x68, 0x18, 0x72, 0xF0,
-+ 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x58, 0x0C, 0x57, 0x64, 0x40, 0x57, 0x00, 0xE3,
-+ 0xFF,
-+ },
-+ { /* Init_CR30_CR4D */
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0x03, 0x20,
-+ 0x00, 0x00, 0x00, 0x40, 0x00, 0xE7, 0xBF, 0xFD,
-+ 0x7F, 0x63, 0x00, 0x69, 0x18, 0x72, 0x57, 0x00,
-+ 0x58, 0x0C, 0xE0, 0x20, 0x63, 0x57,
-+ },
-+ { /* Init_CR90_CRA7 */
-+ 0x56, 0x4B, 0x5E, 0x55, 0x86, 0x9D, 0x8E, 0xAA,
-+ 0xDB, 0x2A, 0xDF, 0x33, 0x00, 0x00, 0x18, 0x00,
-+ 0x20, 0x1F, 0x1A, 0x19, 0x0F, 0x0F, 0x0F, 0x00,
-+ },
-+ },
-+ { /* mode#3: 800 x 600 24Bpp 60Hz */
-+ 800, 600, 24, 60,
-+ 0x2B,
-+ { /* Init_SR0_SR4 */
-+ 0x03, 0x01, 0x0F, 0x03, 0x0E,
-+ },
-+ { /* Init_SR10_SR24 */
-+ 0xFF, 0xBE, 0xEE, 0xFF, 0x00, 0x0E, 0x17, 0x2C,
-+ 0x99, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0xC4, 0x30, 0x02, 0x01, 0x01,
-+ },
-+ { /* Init_SR30_SR75 */
-+ 0x36, 0x03, 0x20, 0x09, 0xC0, 0x36, 0x36, 0x36,
-+ 0x36, 0x36, 0x36, 0x36, 0x00, 0x00, 0x03, 0xFF,
-+ 0x00, 0xFC, 0x00, 0x00, 0x20, 0x18, 0x00, 0xFC,
-+ 0x20, 0x0C, 0x44, 0x20, 0x00, 0x36, 0x36, 0x36,
-+ 0x04, 0x48, 0x83, 0x63, 0x68, 0x72, 0x57, 0x58,
-+ 0x04, 0x55, 0x59, 0x36, 0x36, 0x00, 0x00, 0x36,
-+ 0x01, 0x80, 0x7E, 0x1A, 0x1A, 0x00, 0x00, 0x00,
-+ 0x50, 0x03, 0x74, 0x14, 0x1C, 0x85, 0x35, 0x13,
-+ 0x02, 0x45, 0x30, 0x30, 0x40, 0x20,
-+ },
-+ { /* Init_SR80_SR93 */
-+ 0xFF, 0x07, 0x00, 0x6F, 0x7F, 0x7F, 0xFF, 0x36,
-+ 0xF7, 0x00, 0x00, 0x00, 0xEF, 0xFF, 0x36, 0x36,
-+ 0x00, 0x00, 0x00, 0x00,
-+ },
-+ { /* Init_SRA0_SRAF */
-+ 0x00, 0xFF, 0xBF, 0xFF, 0xFF, 0xED, 0xED, 0xED,
-+ 0x7B, 0xFF, 0xFF, 0xFF, 0xBF, 0xEF, 0xBF, 0xDF,
-+ },
-+ { /* Init_GR00_GR08 */
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x05, 0x0F,
-+ 0xFF,
-+ },
-+ { /* Init_AR00_AR14 */
-+ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
-+ 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
-+ 0x41, 0x00, 0x0F, 0x00, 0x00,
-+ },
-+ { /* Init_CR00_CR18 */
-+ 0x7F, 0x63, 0x63, 0x00, 0x68, 0x18, 0x72, 0xF0,
-+ 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x58, 0x0C, 0x57, 0x64, 0x40, 0x57, 0x00, 0xE3,
-+ 0xFF,
-+ },
-+ { /* Init_CR30_CR4D */
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0x03, 0x20,
-+ 0x00, 0x00, 0x00, 0x40, 0x00, 0xE7, 0xBF, 0xFD,
-+ 0x7F, 0x63, 0x00, 0x69, 0x18, 0x72, 0x57, 0x00,
-+ 0x58, 0x0C, 0xE0, 0x20, 0x63, 0x57,
-+ },
-+ { /* Init_CR90_CRA7 */
-+ 0x56, 0x4B, 0x5E, 0x55, 0x86, 0x9D, 0x8E, 0xAA,
-+ 0xDB, 0x2A, 0xDF, 0x33, 0x00, 0x00, 0x18, 0x00,
-+ 0x20, 0x1F, 0x1A, 0x19, 0x0F, 0x0F, 0x0F, 0x00,
-+ },
-+ },
-+ { /* mode#7: 800 x 600 32Bpp 60Hz */
-+ 800, 600, 32, 60,
-+ /* Init_MISC */
-+ 0x2B,
-+ { /* Init_SR0_SR4 */
-+ 0x03, 0x01, 0x0F, 0x03, 0x0E,
-+ },
-+ { /* Init_SR10_SR24 */
-+ 0xFF, 0xBE, 0xEE, 0xFF, 0x00, 0x0E, 0x17, 0x2C,
-+ 0x99, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0xC4, 0x30, 0x02, 0x01, 0x01,
-+ },
-+ { /* Init_SR30_SR75 */
-+ 0x34, 0x03, 0x20, 0x09, 0xC0, 0x24, 0x24, 0x24,
-+ 0x24, 0x24, 0x24, 0x24, 0x00, 0x00, 0x03, 0xFF,
-+ 0x00, 0xFC, 0x00, 0x00, 0x20, 0x38, 0x00, 0xFC,
-+ 0x20, 0x0C, 0x44, 0x20, 0x00, 0x24, 0x24, 0x24,
-+ 0x04, 0x48, 0x83, 0x63, 0x68, 0x72, 0x57, 0x58,
-+ 0x04, 0x55, 0x59, 0x24, 0x24, 0x00, 0x00, 0x24,
-+ 0x01, 0x80, 0x7A, 0x1A, 0x1A, 0x00, 0x00, 0x00,
-+ 0x50, 0x03, 0x74, 0x14, 0x1C, 0x85, 0x35, 0x13,
-+ 0x02, 0x45, 0x30, 0x35, 0x40, 0x20,
-+ },
-+ { /* Init_SR80_SR93 */
-+ 0x00, 0x00, 0x00, 0x6F, 0x7F, 0x7F, 0xFF, 0x24,
-+ 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x24, 0x24,
-+ 0x00, 0x00, 0x00, 0x00,
-+ },
-+ { /* Init_SRA0_SRAF */
-+ 0x00, 0xFF, 0xBF, 0xFF, 0xFF, 0xED, 0xED, 0xED,
-+ 0x7B, 0xFF, 0xFF, 0xFF, 0xBF, 0xEF, 0xBF, 0xDF,
-+ },
-+ { /* Init_GR00_GR08 */
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x05, 0x0F,
-+ 0xFF,
-+ },
-+ { /* Init_AR00_AR14 */
-+ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
-+ 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
-+ 0x41, 0x00, 0x0F, 0x00, 0x00,
-+ },
-+ { /* Init_CR00_CR18 */
-+ 0x7F, 0x63, 0x63, 0x00, 0x68, 0x18, 0x72, 0xF0,
-+ 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x58, 0x0C, 0x57, 0x64, 0x40, 0x57, 0x00, 0xE3,
-+ 0xFF,
-+ },
-+ { /* Init_CR30_CR4D */
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0x03, 0x20,
-+ 0x00, 0x00, 0x00, 0x40, 0x00, 0xE7, 0xBF, 0xFD,
-+ 0x7F, 0x63, 0x00, 0x69, 0x18, 0x72, 0x57, 0x00,
-+ 0x58, 0x0C, 0xE0, 0x20, 0x63, 0x57,
-+ },
-+ { /* Init_CR90_CRA7 */
-+ 0x56, 0x4B, 0x5E, 0x55, 0x86, 0x9D, 0x8E, 0xAA,
-+ 0xDB, 0x2A, 0xDF, 0x33, 0x00, 0x00, 0x18, 0x00,
-+ 0x20, 0x1F, 0x1A, 0x19, 0x0F, 0x0F, 0x0F, 0x00,
-+ },
-+ },
-+ /* We use 1024x768 table to light 1024x600 panel for lemote */
-+ { /* mode#4: 1024 x 600 16Bpp 60Hz */
-+ 1024, 600, 16, 60,
-+ /* Init_MISC */
-+ 0xEB,
-+ { /* Init_SR0_SR4 */
-+ 0x03, 0x01, 0x0F, 0x00, 0x0E,
-+ },
-+ { /* Init_SR10_SR24 */
-+ 0xC8, 0x40, 0x14, 0x60, 0x00, 0x0A, 0x17, 0x20,
-+ 0x51, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0xC4, 0x30, 0x02, 0x00, 0x01,
-+ },
-+ { /* Init_SR30_SR75 */
-+ 0x22, 0x03, 0x24, 0x09, 0xC0, 0x22, 0x22, 0x22,
-+ 0x22, 0x22, 0x22, 0x22, 0x00, 0x00, 0x03, 0xFF,
-+ 0x00, 0xFC, 0x00, 0x00, 0x20, 0x18, 0x00, 0xFC,
-+ 0x20, 0x0C, 0x44, 0x20, 0x00, 0x22, 0x22, 0x22,
-+ 0x06, 0x68, 0xA7, 0x7F, 0x83, 0x24, 0xFF, 0x03,
-+ 0x00, 0x60, 0x59, 0x22, 0x22, 0x00, 0x00, 0x22,
-+ 0x01, 0x80, 0x7A, 0x1A, 0x1A, 0x00, 0x00, 0x00,
-+ 0x50, 0x03, 0x16, 0x02, 0x0D, 0x82, 0x09, 0x02,
-+ 0x04, 0x45, 0x3F, 0x30, 0x40, 0x20,
-+ },
-+ { /* Init_SR80_SR93 */
-+ 0xFF, 0x07, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x3A,
-+ 0xF7, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x3A, 0x3A,
-+ 0x00, 0x00, 0x00, 0x00,
-+ },
-+ { /* Init_SRA0_SRAF */
-+ 0x00, 0xFB, 0x9F, 0x01, 0x00, 0xED, 0xED, 0xED,
-+ 0x7B, 0xFB, 0xFF, 0xFF, 0x97, 0xEF, 0xBF, 0xDF,
-+ },
-+ { /* Init_GR00_GR08 */
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x05, 0x0F,
-+ 0xFF,
-+ },
-+ { /* Init_AR00_AR14 */
-+ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
-+ 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
-+ 0x41, 0x00, 0x0F, 0x00, 0x00,
-+ },
-+ { /* Init_CR00_CR18 */
-+ 0xA3, 0x7F, 0x7F, 0x00, 0x85, 0x16, 0x24, 0xF5,
-+ 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x03, 0x09, 0xFF, 0x80, 0x40, 0xFF, 0x00, 0xE3,
-+ 0xFF,
-+ },
-+ { /* Init_CR30_CR4D */
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x02, 0x20,
-+ 0x00, 0x00, 0x00, 0x40, 0x00, 0xFF, 0xBF, 0xFF,
-+ 0xA3, 0x7F, 0x00, 0x82, 0x0b, 0x6f, 0x57, 0x00,
-+ 0x5c, 0x0f, 0xE0, 0xe0, 0x7F, 0x57,
-+ },
-+ { /* Init_CR90_CRA7 */
-+ 0x55, 0xD9, 0x5D, 0xE1, 0x86, 0x1B, 0x8E, 0x26,
-+ 0xDA, 0x8D, 0xDE, 0x94, 0x00, 0x00, 0x18, 0x00,
-+ 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x15, 0x03,
-+ },
-+ },
-+ { /* mode#5: 1024 x 768 24Bpp 60Hz */
-+ 1024, 768, 24, 60,
-+ /* Init_MISC */
-+ 0xEB,
-+ { /* Init_SR0_SR4 */
-+ 0x03, 0x01, 0x0F, 0x03, 0x0E,
-+ },
-+ { /* Init_SR10_SR24 */
-+ 0xF3, 0xB6, 0xC0, 0xDD, 0x00, 0x0E, 0x17, 0x2C,
-+ 0x99, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0xC4, 0x30, 0x02, 0x01, 0x01,
-+ },
-+ { /* Init_SR30_SR75 */
-+ 0x38, 0x03, 0x20, 0x09, 0xC0, 0x3A, 0x3A, 0x3A,
-+ 0x3A, 0x3A, 0x3A, 0x3A, 0x00, 0x00, 0x03, 0xFF,
-+ 0x00, 0xFC, 0x00, 0x00, 0x20, 0x18, 0x00, 0xFC,
-+ 0x20, 0x0C, 0x44, 0x20, 0x00, 0x00, 0x00, 0x3A,
-+ 0x06, 0x68, 0xA7, 0x7F, 0x83, 0x24, 0xFF, 0x03,
-+ 0x00, 0x60, 0x59, 0x3A, 0x3A, 0x00, 0x00, 0x3A,
-+ 0x01, 0x80, 0x7E, 0x1A, 0x1A, 0x00, 0x00, 0x00,
-+ 0x50, 0x03, 0x74, 0x14, 0x3B, 0x0D, 0x09, 0x02,
-+ 0x04, 0x45, 0x30, 0x30, 0x40, 0x20,
-+ },
-+ { /* Init_SR80_SR93 */
-+ 0xFF, 0x07, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x3A,
-+ 0xF7, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x3A, 0x3A,
-+ 0x00, 0x00, 0x00, 0x00,
-+ },
-+ { /* Init_SRA0_SRAF */
-+ 0x00, 0xFB, 0x9F, 0x01, 0x00, 0xED, 0xED, 0xED,
-+ 0x7B, 0xFB, 0xFF, 0xFF, 0x97, 0xEF, 0xBF, 0xDF,
-+ },
-+ { /* Init_GR00_GR08 */
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x05, 0x0F,
-+ 0xFF,
-+ },
-+ { /* Init_AR00_AR14 */
-+ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
-+ 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
-+ 0x41, 0x00, 0x0F, 0x00, 0x00,
-+ },
-+ { /* Init_CR00_CR18 */
-+ 0xA3, 0x7F, 0x7F, 0x00, 0x85, 0x16, 0x24, 0xF5,
-+ 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x03, 0x09, 0xFF, 0x80, 0x40, 0xFF, 0x00, 0xE3,
-+ 0xFF,
-+ },
-+ { /* Init_CR30_CR4D */
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x02, 0x20,
-+ 0x00, 0x00, 0x00, 0x40, 0x00, 0xFF, 0xBF, 0xFF,
-+ 0xA3, 0x7F, 0x00, 0x86, 0x15, 0x24, 0xFF, 0x00,
-+ 0x01, 0x07, 0xE5, 0x20, 0x7F, 0xFF,
-+ },
-+ { /* Init_CR90_CRA7 */
-+ 0x55, 0xD9, 0x5D, 0xE1, 0x86, 0x1B, 0x8E, 0x26,
-+ 0xDA, 0x8D, 0xDE, 0x94, 0x00, 0x00, 0x18, 0x00,
-+ 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x15, 0x03,
-+ },
-+ },
-+ { /* mode#4: 1024 x 768 32Bpp 60Hz */
-+ 1024, 768, 32, 60,
-+ /* Init_MISC */
-+ 0xEB,
-+ { /* Init_SR0_SR4 */
-+ 0x03, 0x01, 0x0F, 0x03, 0x0E,
-+ },
-+ { /* Init_SR10_SR24 */
-+ 0xF3, 0xB6, 0xC0, 0xDD, 0x00, 0x0E, 0x17, 0x2C,
-+ 0x99, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0xC4, 0x32, 0x02, 0x01, 0x01,
-+ },
-+ { /* Init_SR30_SR75 */
-+ 0x38, 0x03, 0x20, 0x09, 0xC0, 0x3A, 0x3A, 0x3A,
-+ 0x3A, 0x3A, 0x3A, 0x3A, 0x00, 0x00, 0x03, 0xFF,
-+ 0x00, 0xFC, 0x00, 0x00, 0x20, 0x18, 0x00, 0xFC,
-+ 0x20, 0x0C, 0x44, 0x20, 0x00, 0x00, 0x00, 0x3A,
-+ 0x06, 0x68, 0xA7, 0x7F, 0x83, 0x24, 0xFF, 0x03,
-+ 0x00, 0x60, 0x59, 0x3A, 0x3A, 0x00, 0x00, 0x3A,
-+ 0x01, 0x80, 0x7E, 0x1A, 0x1A, 0x00, 0x00, 0x00,
-+ 0x50, 0x03, 0x74, 0x14, 0x3B, 0x0D, 0x09, 0x02,
-+ 0x04, 0x45, 0x30, 0x30, 0x40, 0x20,
-+ },
-+ { /* Init_SR80_SR93 */
-+ 0xFF, 0x07, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x3A,
-+ 0xF7, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x3A, 0x3A,
-+ 0x00, 0x00, 0x00, 0x00,
-+ },
-+ { /* Init_SRA0_SRAF */
-+ 0x00, 0xFB, 0x9F, 0x01, 0x00, 0xED, 0xED, 0xED,
-+ 0x7B, 0xFB, 0xFF, 0xFF, 0x97, 0xEF, 0xBF, 0xDF,
-+ },
-+ { /* Init_GR00_GR08 */
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x05, 0x0F,
-+ 0xFF,
-+ },
-+ { /* Init_AR00_AR14 */
-+ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
-+ 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
-+ 0x41, 0x00, 0x0F, 0x00, 0x00,
-+ },
-+ { /* Init_CR00_CR18 */
-+ 0xA3, 0x7F, 0x7F, 0x00, 0x85, 0x16, 0x24, 0xF5,
-+ 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x03, 0x09, 0xFF, 0x80, 0x40, 0xFF, 0x00, 0xE3,
-+ 0xFF,
-+ },
-+ { /* Init_CR30_CR4D */
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x02, 0x20,
-+ 0x00, 0x00, 0x00, 0x40, 0x00, 0xFF, 0xBF, 0xFF,
-+ 0xA3, 0x7F, 0x00, 0x86, 0x15, 0x24, 0xFF, 0x00,
-+ 0x01, 0x07, 0xE5, 0x20, 0x7F, 0xFF,
-+ },
-+ { /* Init_CR90_CRA7 */
-+ 0x55, 0xD9, 0x5D, 0xE1, 0x86, 0x1B, 0x8E, 0x26,
-+ 0xDA, 0x8D, 0xDE, 0x94, 0x00, 0x00, 0x18, 0x00,
-+ 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x15, 0x03,
-+ },
-+ },
-+ { /* mode#6: 320 x 240 16Bpp 60Hz */
-+ 320, 240, 16, 60,
-+ /* Init_MISC */
-+ 0xEB,
-+ { /* Init_SR0_SR4 */
-+ 0x03, 0x01, 0x0F, 0x03, 0x0E,
-+ },
-+ { /* Init_SR10_SR24 */
-+ 0xF3, 0xB6, 0xC0, 0xDD, 0x00, 0x0E, 0x17, 0x2C,
-+ 0x99, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0xC4, 0x32, 0x02, 0x01, 0x01,
-+ },
-+ { /* Init_SR30_SR75 */
-+ 0x38, 0x03, 0x20, 0x09, 0xC0, 0x3A, 0x3A, 0x3A,
-+ 0x3A, 0x3A, 0x3A, 0x3A, 0x00, 0x00, 0x03, 0xFF,
-+ 0x00, 0xFC, 0x00, 0x00, 0x20, 0x18, 0x00, 0xFC,
-+ 0x20, 0x0C, 0x44, 0x20, 0x00, 0x00, 0x00, 0x3A,
-+ 0x06, 0x68, 0xA7, 0x7F, 0x83, 0x24, 0xFF, 0x03,
-+ 0x00, 0x60, 0x59, 0x3A, 0x3A, 0x00, 0x00, 0x3A,
-+ 0x01, 0x80, 0x7E, 0x1A, 0x1A, 0x00, 0x00, 0x00,
-+ 0x50, 0x03, 0x74, 0x14, 0x08, 0x43, 0x08, 0x43,
-+ 0x04, 0x45, 0x30, 0x30, 0x40, 0x20,
-+ },
-+ { /* Init_SR80_SR93 */
-+ 0xFF, 0x07, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x3A,
-+ 0xF7, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x3A, 0x3A,
-+ 0x00, 0x00, 0x00, 0x00,
-+ },
-+ { /* Init_SRA0_SRAF */
-+ 0x00, 0xFB, 0x9F, 0x01, 0x00, 0xED, 0xED, 0xED,
-+ 0x7B, 0xFB, 0xFF, 0xFF, 0x97, 0xEF, 0xBF, 0xDF,
-+ },
-+ { /* Init_GR00_GR08 */
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x05, 0x0F,
-+ 0xFF,
-+ },
-+ { /* Init_AR00_AR14 */
-+ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
-+ 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
-+ 0x41, 0x00, 0x0F, 0x00, 0x00,
-+ },
-+ { /* Init_CR00_CR18 */
-+ 0xA3, 0x7F, 0x7F, 0x00, 0x85, 0x16, 0x24, 0xF5,
-+ 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x03, 0x09, 0xFF, 0x80, 0x40, 0xFF, 0x00, 0xE3,
-+ 0xFF,
-+ },
-+ { /* Init_CR30_CR4D */
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x02, 0x20,
-+ 0x00, 0x00, 0x30, 0x40, 0x00, 0xFF, 0xBF, 0xFF,
-+ 0x2E, 0x27, 0x00, 0x2b, 0x0c, 0x0F, 0xEF, 0x00,
-+ 0xFe, 0x0f, 0x01, 0xC0, 0x27, 0xEF,
-+ },
-+ { /* Init_CR90_CRA7 */
-+ 0x55, 0xD9, 0x5D, 0xE1, 0x86, 0x1B, 0x8E, 0x26,
-+ 0xDA, 0x8D, 0xDE, 0x94, 0x00, 0x00, 0x18, 0x00,
-+ 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x15, 0x03,
-+ },
-+ },
-+
-+ { /* mode#8: 320 x 240 32Bpp 60Hz */
-+ 320, 240, 32, 60,
-+ /* Init_MISC */
-+ 0xEB,
-+ { /* Init_SR0_SR4 */
-+ 0x03, 0x01, 0x0F, 0x03, 0x0E,
-+ },
-+ { /* Init_SR10_SR24 */
-+ 0xF3, 0xB6, 0xC0, 0xDD, 0x00, 0x0E, 0x17, 0x2C,
-+ 0x99, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0xC4, 0x32, 0x02, 0x01, 0x01,
-+ },
-+ { /* Init_SR30_SR75 */
-+ 0x38, 0x03, 0x20, 0x09, 0xC0, 0x3A, 0x3A, 0x3A,
-+ 0x3A, 0x3A, 0x3A, 0x3A, 0x00, 0x00, 0x03, 0xFF,
-+ 0x00, 0xFC, 0x00, 0x00, 0x20, 0x18, 0x00, 0xFC,
-+ 0x20, 0x0C, 0x44, 0x20, 0x00, 0x00, 0x00, 0x3A,
-+ 0x06, 0x68, 0xA7, 0x7F, 0x83, 0x24, 0xFF, 0x03,
-+ 0x00, 0x60, 0x59, 0x3A, 0x3A, 0x00, 0x00, 0x3A,
-+ 0x01, 0x80, 0x7E, 0x1A, 0x1A, 0x00, 0x00, 0x00,
-+ 0x50, 0x03, 0x74, 0x14, 0x08, 0x43, 0x08, 0x43,
-+ 0x04, 0x45, 0x30, 0x30, 0x40, 0x20,
-+ },
-+ { /* Init_SR80_SR93 */
-+ 0xFF, 0x07, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x3A,
-+ 0xF7, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x3A, 0x3A,
-+ 0x00, 0x00, 0x00, 0x00,
-+ },
-+ { /* Init_SRA0_SRAF */
-+ 0x00, 0xFB, 0x9F, 0x01, 0x00, 0xED, 0xED, 0xED,
-+ 0x7B, 0xFB, 0xFF, 0xFF, 0x97, 0xEF, 0xBF, 0xDF,
-+ },
-+ { /* Init_GR00_GR08 */
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x05, 0x0F,
-+ 0xFF,
-+ },
-+ { /* Init_AR00_AR14 */
-+ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
-+ 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
-+ 0x41, 0x00, 0x0F, 0x00, 0x00,
-+ },
-+ { /* Init_CR00_CR18 */
-+ 0xA3, 0x7F, 0x7F, 0x00, 0x85, 0x16, 0x24, 0xF5,
-+ 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x03, 0x09, 0xFF, 0x80, 0x40, 0xFF, 0x00, 0xE3,
-+ 0xFF,
-+ },
-+ { /* Init_CR30_CR4D */
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x02, 0x20,
-+ 0x00, 0x00, 0x30, 0x40, 0x00, 0xFF, 0xBF, 0xFF,
-+ 0x2E, 0x27, 0x00, 0x2b, 0x0c, 0x0F, 0xEF, 0x00,
-+ 0xFe, 0x0f, 0x01, 0xC0, 0x27, 0xEF,
-+ },
-+ { /* Init_CR90_CRA7 */
-+ 0x55, 0xD9, 0x5D, 0xE1, 0x86, 0x1B, 0x8E, 0x26,
-+ 0xDA, 0x8D, 0xDE, 0x94, 0x00, 0x00, 0x18, 0x00,
-+ 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x15, 0x03,
-+ },
-+ },
-+};
-+
-+#define numVGAModes (sizeof(VGAMode) / sizeof(struct ModeInit))
-diff -Nur linux-2.6.30.5.orig/include/linux/fb.h linux-2.6.30.5/include/linux/fb.h
---- linux-2.6.30.5.orig/include/linux/fb.h 2009-08-16 23:19:38.000000000 +0200
-+++ linux-2.6.30.5/include/linux/fb.h 2009-08-23 19:01:04.000000000 +0200
-@@ -814,6 +814,7 @@
- int node;
- int flags;
- struct mutex lock; /* Lock for open/release/ioctl funcs */
-+ struct mutex mm_lock; /* Lock for fb_mmap and smem_* fields */
- struct fb_var_screeninfo var; /* Current var */
- struct fb_fix_screeninfo fix; /* Current fix */
- struct fb_monspecs monspecs; /* Current Monitor specs */
-diff -Nur linux-2.6.30.5.orig/sound/core/pcm_native.c linux-2.6.30.5/sound/core/pcm_native.c
---- linux-2.6.30.5.orig/sound/core/pcm_native.c 2009-08-16 23:19:38.000000000 +0200
-+++ linux-2.6.30.5/sound/core/pcm_native.c 2009-08-23 19:01:04.000000000 +0200
-@@ -3091,7 +3091,11 @@
- return VM_FAULT_SIGBUS;
- } else {
- vaddr = runtime->dma_area + offset;
-+#if defined(__mips__) && defined(CONFIG_DMA_NONCOHERENT)
-+ page = virt_to_page(CAC_ADDR(vaddr));
-+#else
- page = virt_to_page(vaddr);
-+#endif
- }
- get_page(page);
- vmf->page = page;
-@@ -3206,6 +3210,11 @@
- if (PCM_RUNTIME_CHECK(substream))
- return -ENXIO;
-
-+#if defined(__mips__) && defined(CONFIG_DMA_NONCOHERENT)
-+ /* all mmap using uncached mode */
-+ area->vm_page_prot = pgprot_noncached(area->vm_page_prot);
-+ area->vm_flags |= (VM_RESERVED | VM_IO);
-+#endif
- offset = area->vm_pgoff << PAGE_SHIFT;
- switch (offset) {
- case SNDRV_PCM_MMAP_OFFSET_STATUS:
-diff -Nur linux-2.6.30.5.orig/sound/core/sgbuf.c linux-2.6.30.5/sound/core/sgbuf.c
---- linux-2.6.30.5.orig/sound/core/sgbuf.c 2009-08-16 23:19:38.000000000 +0200
-+++ linux-2.6.30.5/sound/core/sgbuf.c 2009-08-23 19:01:04.000000000 +0200
-@@ -114,7 +114,11 @@
- if (!i)
- table->addr |= chunk; /* mark head */
- table++;
-+#if defined(__mips__) && defined(CONFIG_DMA_NONCOHERENT)
-+ *pgtable++ = virt_to_page(CAC_ADDR(tmpb.area));
-+#else
- *pgtable++ = virt_to_page(tmpb.area);
-+#endif
- tmpb.area += PAGE_SIZE;
- tmpb.addr += PAGE_SIZE;
- }
-@@ -125,7 +129,12 @@
- }
-
- sgbuf->size = size;
-+#if defined(__mips__) && defined(CONFIG_DMA_NONCOHERENT)
-+ dmab->area = vmap(sgbuf->page_table, sgbuf->pages, \
-+ VM_MAP | VM_IO, pgprot_noncached(PAGE_KERNEL));
-+#else
- dmab->area = vmap(sgbuf->page_table, sgbuf->pages, VM_MAP, PAGE_KERNEL);
-+#endif
- if (! dmab->area)
- goto _failed;
- if (res_size)
-diff -Nur linux-2.6.30.5.orig/sound/pci/Kconfig linux-2.6.30.5/sound/pci/Kconfig
---- linux-2.6.30.5.orig/sound/pci/Kconfig 2009-08-16 23:19:38.000000000 +0200
-+++ linux-2.6.30.5/sound/pci/Kconfig 2009-08-23 19:01:04.000000000 +0200
-@@ -259,7 +259,6 @@
-
- config SND_CS5535AUDIO
- tristate "CS5535/CS5536 Audio"
-- depends on X86 && !X86_64
- select SND_PCM
- select SND_AC97_CODEC
- help