diff options
29 files changed, 68983 insertions, 0 deletions
diff --git a/meta/packages/linux/linux-rp-2.6.25+2.6.26-rc4/binutils-buildid-arm.patch b/meta/packages/linux/linux-rp-2.6.25+2.6.26-rc4/binutils-buildid-arm.patch new file mode 100644 index 0000000000..68e35e89e1 --- /dev/null +++ b/meta/packages/linux/linux-rp-2.6.25+2.6.26-rc4/binutils-buildid-arm.patch | |||
| @@ -0,0 +1,16 @@ | |||
| 1 | --- | ||
| 2 | arch/arm/kernel/vmlinux.lds.S | 1 + | ||
| 3 | 1 file changed, 1 insertion(+) | ||
| 4 | |||
| 5 | Index: linux-2.6.22/arch/arm/kernel/vmlinux.lds.S | ||
| 6 | =================================================================== | ||
| 7 | --- linux-2.6.22.orig/arch/arm/kernel/vmlinux.lds.S 2007-09-11 18:32:29.000000000 +0200 | ||
| 8 | +++ linux-2.6.22/arch/arm/kernel/vmlinux.lds.S 2007-09-11 18:33:42.000000000 +0200 | ||
| 9 | @@ -94,6 +94,7 @@ | ||
| 10 | TEXT_TEXT | ||
| 11 | SCHED_TEXT | ||
| 12 | LOCK_TEXT | ||
| 13 | + *(.note.*) | ||
| 14 | #ifdef CONFIG_MMU | ||
| 15 | *(.fixup) | ||
| 16 | #endif | ||
diff --git a/meta/packages/linux/linux-rp-2.6.25+2.6.26-rc4/connectplus-prevent-oops-HACK.patch b/meta/packages/linux/linux-rp-2.6.25+2.6.26-rc4/connectplus-prevent-oops-HACK.patch new file mode 100644 index 0000000000..b5439c62e7 --- /dev/null +++ b/meta/packages/linux/linux-rp-2.6.25+2.6.26-rc4/connectplus-prevent-oops-HACK.patch | |||
| @@ -0,0 +1,17 @@ | |||
| 1 | Index: linux-2.6.21/drivers/net/wireless/hostap/hostap_hw.c | ||
| 2 | =================================================================== | ||
| 3 | --- linux-2.6.21.orig/drivers/net/wireless/hostap/hostap_hw.c 2007-07-07 12:45:39.000000000 +0100 | ||
| 4 | +++ linux-2.6.21/drivers/net/wireless/hostap/hostap_hw.c 2007-07-07 12:47:30.000000000 +0100 | ||
| 5 | @@ -2666,6 +2666,12 @@ | ||
| 6 | iface = netdev_priv(dev); | ||
| 7 | local = iface->local; | ||
| 8 | |||
| 9 | + if(dev->base_addr == 0) | ||
| 10 | + { | ||
| 11 | + printk(KERN_DEBUG "%s: IRQ before base_addr set\n", dev->name); | ||
| 12 | + return IRQ_HANDLED; | ||
| 13 | + } | ||
| 14 | + | ||
| 15 | prism2_io_debug_add(dev, PRISM2_IO_DEBUG_CMD_INTERRUPT, 0, 0); | ||
| 16 | |||
| 17 | if (local->func->card_present && !local->func->card_present(local)) { | ||
diff --git a/meta/packages/linux/linux-rp-2.6.25+2.6.26-rc4/connectplus-remove-ide-HACK.patch b/meta/packages/linux/linux-rp-2.6.25+2.6.26-rc4/connectplus-remove-ide-HACK.patch new file mode 100644 index 0000000000..4414b21191 --- /dev/null +++ b/meta/packages/linux/linux-rp-2.6.25+2.6.26-rc4/connectplus-remove-ide-HACK.patch | |||
| @@ -0,0 +1,12 @@ | |||
| 1 | Index: linux-2.6.13/drivers/ide/legacy/ide-cs.c | ||
| 2 | =================================================================== | ||
| 3 | --- linux-2.6.13.orig/drivers/ide/legacy/ide-cs.c 2005-09-01 22:43:46.000000000 +0100 | ||
| 4 | +++ linux-2.6.13/drivers/ide/legacy/ide-cs.c 2005-09-01 22:45:46.000000000 +0100 | ||
| 5 | @@ -488,7 +488,6 @@ | ||
| 6 | PCMCIA_DEVICE_PROD_ID123("KODAK Picture Card ", "KODAK ", "V100K", 0x94a0d8f3, 0xe4fc3ea0, 0xe5e7eed4), | ||
| 7 | PCMCIA_DEVICE_PROD_ID1("STI Flash", 0xe4a13209), | ||
| 8 | PCMCIA_DEVICE_PROD_ID12("STI", "Flash 5.0", 0xbf2df18d, 0x8cb57a0e), | ||
| 9 | - PCMCIA_MFC_DEVICE_PROD_ID12(1, "SanDisk", "ConnectPlus", 0x7a954bd9, 0x74be00c6), | ||
| 10 | PCMCIA_DEVICE_NULL, | ||
| 11 | }; | ||
| 12 | MODULE_DEVICE_TABLE(pcmcia, ide_ids); | ||
diff --git a/meta/packages/linux/linux-rp-2.6.25+2.6.26-rc4/defconfig-akita b/meta/packages/linux/linux-rp-2.6.25+2.6.26-rc4/defconfig-akita new file mode 100644 index 0000000000..e630a9abff --- /dev/null +++ b/meta/packages/linux/linux-rp-2.6.25+2.6.26-rc4/defconfig-akita | |||
| @@ -0,0 +1,1741 @@ | |||
| 1 | # | ||
| 2 | # Automatically generated make config: don't edit | ||
| 3 | # Linux kernel version: 2.6.24-rc8 | ||
| 4 | # Sun Jan 20 18:29:33 2008 | ||
| 5 | # | ||
| 6 | CONFIG_ARM=y | ||
| 7 | CONFIG_SYS_SUPPORTS_APM_EMULATION=y | ||
| 8 | CONFIG_GENERIC_GPIO=y | ||
| 9 | CONFIG_GENERIC_TIME=y | ||
| 10 | CONFIG_GENERIC_CLOCKEVENTS=y | ||
| 11 | CONFIG_MMU=y | ||
| 12 | # CONFIG_NO_IOPORT is not set | ||
| 13 | CONFIG_GENERIC_HARDIRQS=y | ||
| 14 | CONFIG_STACKTRACE_SUPPORT=y | ||
| 15 | CONFIG_LOCKDEP_SUPPORT=y | ||
| 16 | CONFIG_TRACE_IRQFLAGS_SUPPORT=y | ||
| 17 | CONFIG_HARDIRQS_SW_RESEND=y | ||
| 18 | CONFIG_GENERIC_IRQ_PROBE=y | ||
| 19 | CONFIG_RWSEM_GENERIC_SPINLOCK=y | ||
| 20 | # CONFIG_ARCH_HAS_ILOG2_U32 is not set | ||
| 21 | # CONFIG_ARCH_HAS_ILOG2_U64 is not set | ||
| 22 | CONFIG_GENERIC_HWEIGHT=y | ||
| 23 | CONFIG_GENERIC_CALIBRATE_DELAY=y | ||
| 24 | CONFIG_ZONE_DMA=y | ||
| 25 | CONFIG_ARCH_MTD_XIP=y | ||
| 26 | CONFIG_VECTORS_BASE=0xffff0000 | ||
| 27 | CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" | ||
| 28 | |||
| 29 | # | ||
| 30 | # General setup | ||
| 31 | # | ||
| 32 | CONFIG_EXPERIMENTAL=y | ||
| 33 | CONFIG_BROKEN_ON_SMP=y | ||
| 34 | CONFIG_LOCK_KERNEL=y | ||
| 35 | CONFIG_INIT_ENV_ARG_LIMIT=32 | ||
| 36 | CONFIG_LOCALVERSION="" | ||
| 37 | # CONFIG_LOCALVERSION_AUTO is not set | ||
| 38 | CONFIG_SWAP=y | ||
| 39 | CONFIG_SYSVIPC=y | ||
| 40 | CONFIG_SYSVIPC_SYSCTL=y | ||
| 41 | # CONFIG_POSIX_MQUEUE is not set | ||
| 42 | CONFIG_BSD_PROCESS_ACCT=y | ||
| 43 | CONFIG_BSD_PROCESS_ACCT_V3=y | ||
| 44 | # CONFIG_TASKSTATS is not set | ||
| 45 | # CONFIG_USER_NS is not set | ||
| 46 | # CONFIG_PID_NS is not set | ||
| 47 | # CONFIG_AUDIT is not set | ||
| 48 | # CONFIG_IKCONFIG is not set | ||
| 49 | CONFIG_LOG_BUF_SHIFT=14 | ||
| 50 | # CONFIG_CGROUPS is not set | ||
| 51 | CONFIG_FAIR_GROUP_SCHED=y | ||
| 52 | CONFIG_FAIR_USER_SCHED=y | ||
| 53 | # CONFIG_FAIR_CGROUP_SCHED is not set | ||
| 54 | CONFIG_SYSFS_DEPRECATED=y | ||
| 55 | # CONFIG_RELAY is not set | ||
| 56 | # CONFIG_BLK_DEV_INITRD is not set | ||
| 57 | CONFIG_CC_OPTIMIZE_FOR_SIZE=y | ||
| 58 | CONFIG_SYSCTL=y | ||
| 59 | CONFIG_EMBEDDED=y | ||
| 60 | CONFIG_UID16=y | ||
| 61 | CONFIG_SYSCTL_SYSCALL=y | ||
| 62 | CONFIG_KALLSYMS=y | ||
| 63 | # CONFIG_KALLSYMS_ALL is not set | ||
| 64 | # CONFIG_KALLSYMS_EXTRA_PASS is not set | ||
| 65 | CONFIG_HOTPLUG=y | ||
| 66 | CONFIG_PRINTK=y | ||
| 67 | CONFIG_BUG=y | ||
| 68 | CONFIG_ELF_CORE=y | ||
| 69 | CONFIG_BASE_FULL=y | ||
| 70 | CONFIG_FUTEX=y | ||
| 71 | CONFIG_ANON_INODES=y | ||
| 72 | CONFIG_EPOLL=y | ||
| 73 | CONFIG_SIGNALFD=y | ||
| 74 | CONFIG_EVENTFD=y | ||
| 75 | CONFIG_SHMEM=y | ||
| 76 | CONFIG_VM_EVENT_COUNTERS=y | ||
| 77 | CONFIG_SLAB=y | ||
| 78 | # CONFIG_SLUB is not set | ||
| 79 | # CONFIG_SLOB is not set | ||
| 80 | CONFIG_SLABINFO=y | ||
| 81 | CONFIG_RT_MUTEXES=y | ||
| 82 | # CONFIG_TINY_SHMEM is not set | ||
| 83 | CONFIG_BASE_SMALL=0 | ||
| 84 | CONFIG_MODULES=y | ||
| 85 | CONFIG_MODULE_UNLOAD=y | ||
| 86 | CONFIG_MODULE_FORCE_UNLOAD=y | ||
| 87 | # CONFIG_MODVERSIONS is not set | ||
| 88 | # CONFIG_MODULE_SRCVERSION_ALL is not set | ||
| 89 | CONFIG_KMOD=y | ||
| 90 | CONFIG_BLOCK=y | ||
| 91 | # CONFIG_LBD is not set | ||
| 92 | # CONFIG_BLK_DEV_IO_TRACE is not set | ||
| 93 | # CONFIG_LSF is not set | ||
| 94 | # CONFIG_BLK_DEV_BSG is not set | ||
| 95 | |||
| 96 | # | ||
| 97 | # IO Schedulers | ||
| 98 | # | ||
| 99 | CONFIG_IOSCHED_NOOP=y | ||
| 100 | CONFIG_IOSCHED_AS=y | ||
| 101 | CONFIG_IOSCHED_DEADLINE=m | ||
| 102 | CONFIG_IOSCHED_CFQ=m | ||
| 103 | CONFIG_DEFAULT_AS=y | ||
| 104 | # CONFIG_DEFAULT_DEADLINE is not set | ||
| 105 | # CONFIG_DEFAULT_CFQ is not set | ||
| 106 | # CONFIG_DEFAULT_NOOP is not set | ||
| 107 | CONFIG_DEFAULT_IOSCHED="anticipatory" | ||
| 108 | |||
| 109 | # | ||
| 110 | # System Type | ||
| 111 | # | ||
| 112 | # CONFIG_ARCH_AAEC2000 is not set | ||
| 113 | # CONFIG_ARCH_INTEGRATOR is not set | ||
| 114 | # CONFIG_ARCH_REALVIEW is not set | ||
| 115 | # CONFIG_ARCH_VERSATILE is not set | ||
| 116 | # CONFIG_ARCH_AT91 is not set | ||
| 117 | # CONFIG_ARCH_CLPS7500 is not set | ||
| 118 | # CONFIG_ARCH_CLPS711X is not set | ||
| 119 | # CONFIG_ARCH_CO285 is not set | ||
| 120 | # CONFIG_ARCH_EBSA110 is not set | ||
| 121 | # CONFIG_ARCH_EP93XX is not set | ||
| 122 | # CONFIG_ARCH_FOOTBRIDGE is not set | ||
| 123 | # CONFIG_ARCH_NETX is not set | ||
| 124 | # CONFIG_ARCH_H720X is not set | ||
| 125 | # CONFIG_ARCH_IMX is not set | ||
| 126 | # CONFIG_ARCH_IOP13XX is not set | ||
| 127 | # CONFIG_ARCH_IOP32X is not set | ||
| 128 | # CONFIG_ARCH_IOP33X is not set | ||
| 129 | # CONFIG_ARCH_IXP23XX is not set | ||
| 130 | # CONFIG_ARCH_IXP2000 is not set | ||
| 131 | # CONFIG_ARCH_IXP4XX is not set | ||
| 132 | # CONFIG_ARCH_L7200 is not set | ||
| 133 | # CONFIG_ARCH_KS8695 is not set | ||
| 134 | # CONFIG_ARCH_NS9XXX is not set | ||
| 135 | # CONFIG_ARCH_MXC is not set | ||
| 136 | # CONFIG_ARCH_PNX4008 is not set | ||
| 137 | CONFIG_ARCH_PXA=y | ||
| 138 | # CONFIG_ARCH_RPC is not set | ||
| 139 | # CONFIG_ARCH_SA1100 is not set | ||
| 140 | # CONFIG_ARCH_S3C2410 is not set | ||
| 141 | # CONFIG_ARCH_SHARK is not set | ||
| 142 | # CONFIG_ARCH_LH7A40X is not set | ||
| 143 | # CONFIG_ARCH_DAVINCI is not set | ||
| 144 | # CONFIG_ARCH_OMAP is not set | ||
| 145 | |||
| 146 | # | ||
| 147 | # Intel PXA2xx/PXA3xx Implementations | ||
| 148 | # | ||
| 149 | # CONFIG_ARCH_LUBBOCK is not set | ||
| 150 | # CONFIG_MACH_LOGICPD_PXA270 is not set | ||
| 151 | # CONFIG_MACH_MAINSTONE is not set | ||
| 152 | # CONFIG_ARCH_PXA_IDP is not set | ||
| 153 | CONFIG_PXA_SHARPSL=y | ||
| 154 | # CONFIG_MACH_TRIZEPS4 is not set | ||
| 155 | # CONFIG_MACH_EM_X270 is not set | ||
| 156 | # CONFIG_MACH_ZYLONITE is not set | ||
| 157 | # CONFIG_MACH_ARMCORE is not set | ||
| 158 | # CONFIG_PXA_SHARPSL_25x is not set | ||
| 159 | CONFIG_PXA_SHARPSL_27x=y | ||
| 160 | # CONFIG_MACH_HX2750 is not set | ||
| 161 | CONFIG_MACH_AKITA=y | ||
| 162 | CONFIG_MACH_SPITZ=y | ||
| 163 | CONFIG_MACH_BORZOI=y | ||
| 164 | CONFIG_PXA27x=y | ||
| 165 | CONFIG_PXA_SHARP_Cxx00=y | ||
| 166 | CONFIG_PXA_SSP=y | ||
| 167 | # CONFIG_PXA_KEYS is not set | ||
| 168 | |||
| 169 | # | ||
| 170 | # Boot options | ||
| 171 | # | ||
| 172 | |||
| 173 | # | ||
| 174 | # Power management | ||
| 175 | # | ||
| 176 | |||
| 177 | # | ||
| 178 | # Processor Type | ||
| 179 | # | ||
| 180 | CONFIG_CPU_32=y | ||
| 181 | CONFIG_CPU_XSCALE=y | ||
| 182 | CONFIG_CPU_32v5=y | ||
| 183 | CONFIG_CPU_ABRT_EV5T=y | ||
| 184 | CONFIG_CPU_CACHE_VIVT=y | ||
| 185 | CONFIG_CPU_TLB_V4WBI=y | ||
| 186 | CONFIG_CPU_CP15=y | ||
| 187 | CONFIG_CPU_CP15_MMU=y | ||
| 188 | |||
| 189 | # | ||
| 190 | # Processor Features | ||
| 191 | # | ||
| 192 | CONFIG_ARM_THUMB=y | ||
| 193 | # CONFIG_CPU_DCACHE_DISABLE is not set | ||
| 194 | # CONFIG_OUTER_CACHE is not set | ||
| 195 | CONFIG_IWMMXT=y | ||
| 196 | CONFIG_XSCALE_PMU=y | ||
| 197 | CONFIG_SHARP_PARAM=y | ||
| 198 | CONFIG_SHARPSL_PM=y | ||
| 199 | CONFIG_SHARP_SCOOP=y | ||
| 200 | |||
| 201 | # | ||
| 202 | # Bus support | ||
| 203 | # | ||
| 204 | # CONFIG_PCI_SYSCALL is not set | ||
| 205 | # CONFIG_ARCH_SUPPORTS_MSI is not set | ||
| 206 | CONFIG_PCCARD=m | ||
| 207 | # CONFIG_PCMCIA_DEBUG is not set | ||
| 208 | CONFIG_PCMCIA=m | ||
| 209 | CONFIG_PCMCIA_LOAD_CIS=y | ||
| 210 | CONFIG_PCMCIA_IOCTL=y | ||
| 211 | |||
| 212 | # | ||
| 213 | # PC-card bridges | ||
| 214 | # | ||
| 215 | CONFIG_PCMCIA_PXA2XX=m | ||
| 216 | |||
| 217 | # | ||
| 218 | # Kernel Features | ||
| 219 | # | ||
| 220 | CONFIG_TICK_ONESHOT=y | ||
| 221 | CONFIG_NO_HZ=y | ||
| 222 | CONFIG_HIGH_RES_TIMERS=y | ||
| 223 | CONFIG_GENERIC_CLOCKEVENTS_BUILD=y | ||
| 224 | CONFIG_PREEMPT=y | ||
| 225 | CONFIG_HZ=100 | ||
| 226 | CONFIG_AEABI=y | ||
| 227 | CONFIG_OABI_COMPAT=y | ||
| 228 | # CONFIG_ARCH_DISCONTIGMEM_ENABLE is not set | ||
| 229 | CONFIG_SELECT_MEMORY_MODEL=y | ||
| 230 | CONFIG_FLATMEM_MANUAL=y | ||
| 231 | # CONFIG_DISCONTIGMEM_MANUAL is not set | ||
| 232 | # CONFIG_SPARSEMEM_MANUAL is not set | ||
| 233 | CONFIG_FLATMEM=y | ||
| 234 | CONFIG_FLAT_NODE_MEM_MAP=y | ||
| 235 | # CONFIG_SPARSEMEM_STATIC is not set | ||
| 236 | # CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set | ||
| 237 | CONFIG_SPLIT_PTLOCK_CPUS=4096 | ||
| 238 | # CONFIG_RESOURCES_64BIT is not set | ||
| 239 | CONFIG_ZONE_DMA_FLAG=1 | ||
| 240 | CONFIG_BOUNCE=y | ||
| 241 | CONFIG_VIRT_TO_BUS=y | ||
| 242 | CONFIG_ALIGNMENT_TRAP=y | ||
| 243 | |||
| 244 | # | ||
| 245 | # Boot options | ||
| 246 | # | ||
| 247 | CONFIG_ZBOOT_ROM_TEXT=0x0 | ||
| 248 | CONFIG_ZBOOT_ROM_BSS=0x0 | ||
| 249 | CONFIG_CMDLINE="console=ttyS0,115200n8 console=tty1 noinitrd root=/dev/mtdblock2 rootfstype=jffs2 fbcon=rotate:1 dyntick=enable debug" | ||
| 250 | # CONFIG_XIP_KERNEL is not set | ||
| 251 | CONFIG_KEXEC=y | ||
| 252 | CONFIG_ATAGS_PROC=y | ||
| 253 | |||
| 254 | # | ||
| 255 | # CPU Frequency scaling | ||
| 256 | # | ||
| 257 | # CONFIG_CPU_FREQ is not set | ||
| 258 | |||
| 259 | # | ||
| 260 | # Floating point emulation | ||
| 261 | # | ||
| 262 | |||
| 263 | # | ||
| 264 | # At least one emulation must be selected | ||
| 265 | # | ||
| 266 | CONFIG_FPE_NWFPE=y | ||
| 267 | # CONFIG_FPE_NWFPE_XP is not set | ||
| 268 | # CONFIG_FPE_FASTFPE is not set | ||
| 269 | |||
| 270 | # | ||
| 271 | # Userspace binary formats | ||
| 272 | # | ||
| 273 | CONFIG_BINFMT_ELF=y | ||
| 274 | CONFIG_BINFMT_AOUT=m | ||
| 275 | CONFIG_BINFMT_MISC=m | ||
| 276 | |||
| 277 | # | ||
| 278 | # Power management options | ||
| 279 | # | ||
| 280 | CONFIG_PM=y | ||
| 281 | # CONFIG_PM_LEGACY is not set | ||
| 282 | # CONFIG_PM_DEBUG is not set | ||
| 283 | CONFIG_PM_SLEEP=y | ||
| 284 | CONFIG_SUSPEND_UP_POSSIBLE=y | ||
| 285 | CONFIG_SUSPEND=y | ||
| 286 | CONFIG_APM_EMULATION=y | ||
| 287 | CONFIG_INPUT_APMPOWER=y | ||
| 288 | |||
| 289 | # | ||
| 290 | # Networking | ||
| 291 | # | ||
| 292 | CONFIG_NET=y | ||
| 293 | |||
| 294 | # | ||
| 295 | # Networking options | ||
| 296 | # | ||
| 297 | CONFIG_PACKET=m | ||
| 298 | CONFIG_PACKET_MMAP=y | ||
| 299 | CONFIG_UNIX=y | ||
| 300 | CONFIG_XFRM=y | ||
| 301 | CONFIG_XFRM_USER=m | ||
| 302 | # CONFIG_XFRM_SUB_POLICY is not set | ||
| 303 | # CONFIG_XFRM_MIGRATE is not set | ||
| 304 | # CONFIG_NET_KEY is not set | ||
| 305 | CONFIG_INET=y | ||
| 306 | # CONFIG_IP_MULTICAST is not set | ||
| 307 | # CONFIG_IP_ADVANCED_ROUTER is not set | ||
| 308 | CONFIG_IP_FIB_HASH=y | ||
| 309 | # CONFIG_IP_PNP is not set | ||
| 310 | # CONFIG_NET_IPIP is not set | ||
| 311 | # CONFIG_NET_IPGRE is not set | ||
| 312 | # CONFIG_ARPD is not set | ||
| 313 | CONFIG_SYN_COOKIES=y | ||
| 314 | # CONFIG_INET_AH is not set | ||
| 315 | # CONFIG_INET_ESP is not set | ||
| 316 | # CONFIG_INET_IPCOMP is not set | ||
| 317 | # CONFIG_INET_XFRM_TUNNEL is not set | ||
| 318 | CONFIG_INET_TUNNEL=m | ||
| 319 | CONFIG_INET_XFRM_MODE_TRANSPORT=m | ||
| 320 | CONFIG_INET_XFRM_MODE_TUNNEL=m | ||
| 321 | CONFIG_INET_XFRM_MODE_BEET=m | ||
| 322 | # CONFIG_INET_LRO is not set | ||
| 323 | CONFIG_INET_DIAG=m | ||
| 324 | CONFIG_INET_TCP_DIAG=m | ||
| 325 | # CONFIG_TCP_CONG_ADVANCED is not set | ||
| 326 | CONFIG_TCP_CONG_CUBIC=y | ||
| 327 | CONFIG_DEFAULT_TCP_CONG="cubic" | ||
| 328 | # CONFIG_TCP_MD5SIG is not set | ||
| 329 | # CONFIG_IP_VS is not set | ||
| 330 | CONFIG_IPV6=m | ||
| 331 | # CONFIG_IPV6_PRIVACY is not set | ||
| 332 | # CONFIG_IPV6_ROUTER_PREF is not set | ||
| 333 | # CONFIG_IPV6_OPTIMISTIC_DAD is not set | ||
| 334 | CONFIG_INET6_AH=m | ||
| 335 | CONFIG_INET6_ESP=m | ||
| 336 | CONFIG_INET6_IPCOMP=m | ||
| 337 | # CONFIG_IPV6_MIP6 is not set | ||
| 338 | CONFIG_INET6_XFRM_TUNNEL=m | ||
| 339 | CONFIG_INET6_TUNNEL=m | ||
| 340 | CONFIG_INET6_XFRM_MODE_TRANSPORT=m | ||
| 341 | CONFIG_INET6_XFRM_MODE_TUNNEL=m | ||
| 342 | CONFIG_INET6_XFRM_MODE_BEET=m | ||
| 343 | # CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION is not set | ||
| 344 | CONFIG_IPV6_SIT=m | ||
| 345 | CONFIG_IPV6_TUNNEL=m | ||
| 346 | # CONFIG_IPV6_MULTIPLE_TABLES is not set | ||
| 347 | # CONFIG_NETWORK_SECMARK is not set | ||
| 348 | CONFIG_NETFILTER=y | ||
| 349 | # CONFIG_NETFILTER_DEBUG is not set | ||
| 350 | |||
| 351 | # | ||
| 352 | # Core Netfilter Configuration | ||
| 353 | # | ||
| 354 | # CONFIG_NETFILTER_NETLINK is not set | ||
| 355 | # CONFIG_NF_CONNTRACK_ENABLED is not set | ||
| 356 | # CONFIG_NF_CONNTRACK is not set | ||
| 357 | CONFIG_NETFILTER_XTABLES=m | ||
| 358 | # CONFIG_NETFILTER_XT_TARGET_CLASSIFY is not set | ||
| 359 | # CONFIG_NETFILTER_XT_TARGET_DSCP is not set | ||
| 360 | # CONFIG_NETFILTER_XT_TARGET_MARK is not set | ||
| 361 | # CONFIG_NETFILTER_XT_TARGET_NFQUEUE is not set | ||
| 362 | # CONFIG_NETFILTER_XT_TARGET_NFLOG is not set | ||
| 363 | # CONFIG_NETFILTER_XT_TARGET_TRACE is not set | ||
| 364 | # CONFIG_NETFILTER_XT_TARGET_TCPMSS is not set | ||
| 365 | # CONFIG_NETFILTER_XT_MATCH_COMMENT is not set | ||
| 366 | # CONFIG_NETFILTER_XT_MATCH_DCCP is not set | ||
| 367 | # CONFIG_NETFILTER_XT_MATCH_DSCP is not set | ||
| 368 | # CONFIG_NETFILTER_XT_MATCH_ESP is not set | ||
| 369 | # CONFIG_NETFILTER_XT_MATCH_LENGTH is not set | ||
| 370 | # CONFIG_NETFILTER_XT_MATCH_LIMIT is not set | ||
| 371 | # CONFIG_NETFILTER_XT_MATCH_MAC is not set | ||
| 372 | # CONFIG_NETFILTER_XT_MATCH_MARK is not set | ||
| 373 | # CONFIG_NETFILTER_XT_MATCH_POLICY is not set | ||
| 374 | # CONFIG_NETFILTER_XT_MATCH_MULTIPORT is not set | ||
| 375 | # CONFIG_NETFILTER_XT_MATCH_PKTTYPE is not set | ||
| 376 | # CONFIG_NETFILTER_XT_MATCH_QUOTA is not set | ||
| 377 | # CONFIG_NETFILTER_XT_MATCH_REALM is not set | ||
| 378 | # CONFIG_NETFILTER_XT_MATCH_SCTP is not set | ||
| 379 | # CONFIG_NETFILTER_XT_MATCH_STATISTIC is not set | ||
| 380 | # CONFIG_NETFILTER_XT_MATCH_STRING is not set | ||
| 381 | # CONFIG_NETFILTER_XT_MATCH_TCPMSS is not set | ||
| 382 | # CONFIG_NETFILTER_XT_MATCH_TIME is not set | ||
| 383 | # CONFIG_NETFILTER_XT_MATCH_U32 is not set | ||
| 384 | # CONFIG_NETFILTER_XT_MATCH_HASHLIMIT is not set | ||
| 385 | |||
| 386 | # | ||
| 387 | # IP: Netfilter Configuration | ||
| 388 | # | ||
| 389 | CONFIG_IP_NF_QUEUE=m | ||
| 390 | CONFIG_IP_NF_IPTABLES=m | ||
| 391 | CONFIG_IP_NF_MATCH_IPRANGE=m | ||
| 392 | CONFIG_IP_NF_MATCH_TOS=m | ||
| 393 | CONFIG_IP_NF_MATCH_RECENT=m | ||
| 394 | CONFIG_IP_NF_MATCH_ECN=m | ||
| 395 | CONFIG_IP_NF_MATCH_AH=m | ||
| 396 | CONFIG_IP_NF_MATCH_TTL=m | ||
| 397 | CONFIG_IP_NF_MATCH_OWNER=m | ||
| 398 | CONFIG_IP_NF_MATCH_ADDRTYPE=m | ||
| 399 | CONFIG_IP_NF_FILTER=m | ||
| 400 | CONFIG_IP_NF_TARGET_REJECT=m | ||
| 401 | CONFIG_IP_NF_TARGET_LOG=m | ||
| 402 | CONFIG_IP_NF_TARGET_ULOG=m | ||
| 403 | CONFIG_IP_NF_MANGLE=m | ||
| 404 | CONFIG_IP_NF_TARGET_TOS=m | ||
| 405 | CONFIG_IP_NF_TARGET_ECN=m | ||
| 406 | CONFIG_IP_NF_TARGET_TTL=m | ||
| 407 | CONFIG_IP_NF_RAW=m | ||
| 408 | CONFIG_IP_NF_ARPTABLES=m | ||
| 409 | CONFIG_IP_NF_ARPFILTER=m | ||
| 410 | CONFIG_IP_NF_ARP_MANGLE=m | ||
| 411 | |||
| 412 | # | ||
| 413 | # IPv6: Netfilter Configuration (EXPERIMENTAL) | ||
| 414 | # | ||
| 415 | # CONFIG_IP6_NF_QUEUE is not set | ||
| 416 | # CONFIG_IP6_NF_IPTABLES is not set | ||
| 417 | # CONFIG_IP_DCCP is not set | ||
| 418 | # CONFIG_IP_SCTP is not set | ||
| 419 | # CONFIG_TIPC is not set | ||
| 420 | # CONFIG_ATM is not set | ||
| 421 | # CONFIG_BRIDGE is not set | ||
| 422 | # CONFIG_VLAN_8021Q is not set | ||
| 423 | # CONFIG_DECNET is not set | ||
| 424 | # CONFIG_LLC2 is not set | ||
| 425 | # CONFIG_IPX is not set | ||
| 426 | # CONFIG_ATALK is not set | ||
| 427 | # CONFIG_X25 is not set | ||
| 428 | # CONFIG_LAPB is not set | ||
| 429 | # CONFIG_ECONET is not set | ||
| 430 | # CONFIG_WAN_ROUTER is not set | ||
| 431 | # CONFIG_NET_SCHED is not set | ||
| 432 | |||
| 433 | # | ||
| 434 | # Network testing | ||
| 435 | # | ||
| 436 | # CONFIG_NET_PKTGEN is not set | ||
| 437 | # CONFIG_HAMRADIO is not set | ||
| 438 | CONFIG_IRDA=m | ||
| 439 | |||
| 440 | # | ||
| 441 | # IrDA protocols | ||
| 442 | # | ||
| 443 | CONFIG_IRLAN=m | ||
| 444 | CONFIG_IRNET=m | ||
| 445 | CONFIG_IRCOMM=m | ||
| 446 | # CONFIG_IRDA_ULTRA is not set | ||
| 447 | |||
| 448 | # | ||
| 449 | # IrDA options | ||
| 450 | # | ||
| 451 | # CONFIG_IRDA_CACHE_LAST_LSAP is not set | ||
| 452 | # CONFIG_IRDA_FAST_RR is not set | ||
| 453 | # CONFIG_IRDA_DEBUG is not set | ||
| 454 | |||
| 455 | # | ||
| 456 | # Infrared-port device drivers | ||
| 457 | # | ||
| 458 | |||
| 459 | # | ||
| 460 | # SIR device drivers | ||
| 461 | # | ||
| 462 | # CONFIG_IRTTY_SIR is not set | ||
| 463 | |||
| 464 | # | ||
| 465 | # Dongle support | ||
| 466 | # | ||
| 467 | # CONFIG_KINGSUN_DONGLE is not set | ||
| 468 | # CONFIG_KSDAZZLE_DONGLE is not set | ||
| 469 | # CONFIG_KS959_DONGLE is not set | ||
| 470 | |||
| 471 | # | ||
| 472 | # Old SIR device drivers | ||
| 473 | # | ||
| 474 | # CONFIG_IRPORT_SIR is not set | ||
| 475 | |||
| 476 | # | ||
| 477 | # Old Serial dongle support | ||
| 478 | # | ||
| 479 | |||
| 480 | # | ||
| 481 | # FIR device drivers | ||
| 482 | # | ||
| 483 | # CONFIG_USB_IRDA is not set | ||
| 484 | # CONFIG_SIGMATEL_FIR is not set | ||
| 485 | CONFIG_PXA_FICP=m | ||
| 486 | # CONFIG_MCS_FIR is not set | ||
| 487 | CONFIG_BT=m | ||
| 488 | CONFIG_BT_L2CAP=m | ||
| 489 | CONFIG_BT_SCO=m | ||
| 490 | CONFIG_BT_RFCOMM=m | ||
| 491 | CONFIG_BT_RFCOMM_TTY=y | ||
| 492 | CONFIG_BT_BNEP=m | ||
| 493 | CONFIG_BT_BNEP_MC_FILTER=y | ||
| 494 | CONFIG_BT_BNEP_PROTO_FILTER=y | ||
| 495 | CONFIG_BT_HIDP=m | ||
| 496 | |||
| 497 | # | ||
| 498 | # Bluetooth device drivers | ||
| 499 | # | ||
| 500 | CONFIG_BT_HCIUSB=m | ||
| 501 | # CONFIG_BT_HCIUSB_SCO is not set | ||
| 502 | # CONFIG_BT_HCIBTSDIO is not set | ||
| 503 | CONFIG_BT_HCIUART=m | ||
| 504 | CONFIG_BT_HCIUART_H4=y | ||
| 505 | CONFIG_BT_HCIUART_BCSP=y | ||
| 506 | # CONFIG_BT_HCIUART_LL is not set | ||
| 507 | CONFIG_BT_HCIBCM203X=m | ||
| 508 | CONFIG_BT_HCIBPA10X=m | ||
| 509 | CONFIG_BT_HCIBFUSB=m | ||
| 510 | CONFIG_BT_HCIDTL1=m | ||
| 511 | CONFIG_BT_HCIBT3C=m | ||
| 512 | CONFIG_BT_HCIBLUECARD=m | ||
| 513 | CONFIG_BT_HCIBTUART=m | ||
| 514 | CONFIG_BT_HCIVHCI=m | ||
| 515 | # CONFIG_AF_RXRPC is not set | ||
| 516 | |||
| 517 | # | ||
| 518 | # Wireless | ||
| 519 | # | ||
| 520 | # CONFIG_CFG80211 is not set | ||
| 521 | CONFIG_WIRELESS_EXT=y | ||
| 522 | # CONFIG_MAC80211 is not set | ||
| 523 | CONFIG_IEEE80211=m | ||
| 524 | # CONFIG_IEEE80211_DEBUG is not set | ||
| 525 | CONFIG_IEEE80211_CRYPT_WEP=m | ||
| 526 | CONFIG_IEEE80211_CRYPT_CCMP=m | ||
| 527 | CONFIG_IEEE80211_CRYPT_TKIP=m | ||
| 528 | CONFIG_IEEE80211_SOFTMAC=m | ||
| 529 | # CONFIG_IEEE80211_SOFTMAC_DEBUG is not set | ||
| 530 | # CONFIG_RFKILL is not set | ||
| 531 | # CONFIG_NET_9P is not set | ||
| 532 | |||
| 533 | # | ||
| 534 | # Device Drivers | ||
| 535 | # | ||
| 536 | |||
| 537 | # | ||
| 538 | # Generic Driver Options | ||
| 539 | # | ||
| 540 | CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" | ||
| 541 | CONFIG_STANDALONE=y | ||
| 542 | CONFIG_PREVENT_FIRMWARE_BUILD=y | ||
| 543 | CONFIG_FW_LOADER=y | ||
| 544 | # CONFIG_DEBUG_DRIVER is not set | ||
| 545 | # CONFIG_DEBUG_DEVRES is not set | ||
| 546 | # CONFIG_SYS_HYPERVISOR is not set | ||
| 547 | # CONFIG_CONNECTOR is not set | ||
| 548 | CONFIG_MTD=y | ||
| 549 | # CONFIG_MTD_DEBUG is not set | ||
| 550 | # CONFIG_MTD_CONCAT is not set | ||
| 551 | CONFIG_MTD_PARTITIONS=y | ||
| 552 | # CONFIG_MTD_REDBOOT_PARTS is not set | ||
| 553 | CONFIG_MTD_CMDLINE_PARTS=y | ||
| 554 | # CONFIG_MTD_AFS_PARTS is not set | ||
| 555 | |||
| 556 | # | ||
| 557 | # User Modules And Translation Layers | ||
| 558 | # | ||
| 559 | CONFIG_MTD_CHAR=y | ||
| 560 | CONFIG_MTD_BLKDEVS=y | ||
| 561 | CONFIG_MTD_BLOCK=y | ||
| 562 | # CONFIG_FTL is not set | ||
| 563 | # CONFIG_NFTL is not set | ||
| 564 | # CONFIG_INFTL is not set | ||
| 565 | # CONFIG_RFD_FTL is not set | ||
| 566 | # CONFIG_SSFDC is not set | ||
| 567 | # CONFIG_MTD_OOPS is not set | ||
| 568 | |||
| 569 | # | ||
| 570 | # RAM/ROM/Flash chip drivers | ||
| 571 | # | ||
| 572 | # CONFIG_MTD_CFI is not set | ||
| 573 | # CONFIG_MTD_JEDECPROBE is not set | ||
| 574 | CONFIG_MTD_MAP_BANK_WIDTH_1=y | ||
| 575 | CONFIG_MTD_MAP_BANK_WIDTH_2=y | ||
| 576 | CONFIG_MTD_MAP_BANK_WIDTH_4=y | ||
| 577 | # CONFIG_MTD_MAP_BANK_WIDTH_8 is not set | ||
| 578 | # CONFIG_MTD_MAP_BANK_WIDTH_16 is not set | ||
| 579 | # CONFIG_MTD_MAP_BANK_WIDTH_32 is not set | ||
| 580 | CONFIG_MTD_CFI_I1=y | ||
| 581 | CONFIG_MTD_CFI_I2=y | ||
| 582 | # CONFIG_MTD_CFI_I4 is not set | ||
| 583 | # CONFIG_MTD_CFI_I8 is not set | ||
| 584 | # CONFIG_MTD_RAM is not set | ||
| 585 | CONFIG_MTD_ROM=y | ||
| 586 | # CONFIG_MTD_ABSENT is not set | ||
| 587 | |||
| 588 | # | ||
| 589 | # Mapping drivers for chip access | ||
| 590 | # | ||
| 591 | CONFIG_MTD_COMPLEX_MAPPINGS=y | ||
| 592 | # CONFIG_MTD_PHYSMAP is not set | ||
| 593 | CONFIG_MTD_SHARP_SL=y | ||
| 594 | # CONFIG_MTD_PLATRAM is not set | ||
| 595 | |||
| 596 | # | ||
| 597 | # Self-contained MTD device drivers | ||
| 598 | # | ||
| 599 | # CONFIG_MTD_SLRAM is not set | ||
| 600 | # CONFIG_MTD_PHRAM is not set | ||
| 601 | # CONFIG_MTD_MTDRAM is not set | ||
| 602 | # CONFIG_MTD_BLOCK2MTD is not set | ||
| 603 | |||
| 604 | # | ||
| 605 | # Disk-On-Chip Device Drivers | ||
| 606 | # | ||
| 607 | # CONFIG_MTD_DOC2000 is not set | ||
| 608 | # CONFIG_MTD_DOC2001 is not set | ||
| 609 | # CONFIG_MTD_DOC2001PLUS is not set | ||
| 610 | CONFIG_MTD_NAND=y | ||
| 611 | CONFIG_MTD_NAND_VERIFY_WRITE=y | ||
| 612 | # CONFIG_MTD_NAND_ECC_SMC is not set | ||
| 613 | # CONFIG_MTD_NAND_MUSEUM_IDS is not set | ||
| 614 | # CONFIG_MTD_NAND_H1900 is not set | ||
| 615 | CONFIG_MTD_NAND_IDS=y | ||
| 616 | # CONFIG_MTD_NAND_DISKONCHIP is not set | ||
| 617 | CONFIG_MTD_NAND_SHARPSL=y | ||
| 618 | # CONFIG_MTD_NAND_NANDSIM is not set | ||
| 619 | # CONFIG_MTD_NAND_PLATFORM is not set | ||
| 620 | # CONFIG_MTD_ALAUDA is not set | ||
| 621 | # CONFIG_MTD_ONENAND is not set | ||
| 622 | |||
| 623 | # | ||
| 624 | # UBI - Unsorted block images | ||
| 625 | # | ||
| 626 | # CONFIG_MTD_UBI is not set | ||
| 627 | # CONFIG_PARPORT is not set | ||
| 628 | CONFIG_BLK_DEV=y | ||
| 629 | # CONFIG_BLK_DEV_COW_COMMON is not set | ||
| 630 | CONFIG_BLK_DEV_LOOP=y | ||
| 631 | # CONFIG_BLK_DEV_CRYPTOLOOP is not set | ||
| 632 | # CONFIG_BLK_DEV_NBD is not set | ||
| 633 | # CONFIG_BLK_DEV_UB is not set | ||
| 634 | # CONFIG_BLK_DEV_RAM is not set | ||
| 635 | # CONFIG_CDROM_PKTCDVD is not set | ||
| 636 | # CONFIG_ATA_OVER_ETH is not set | ||
| 637 | CONFIG_MISC_DEVICES=y | ||
| 638 | # CONFIG_EEPROM_93CX6 is not set | ||
| 639 | CONFIG_IDE=y | ||
| 640 | CONFIG_IDE_MAX_HWIFS=4 | ||
| 641 | CONFIG_BLK_DEV_IDE=y | ||
| 642 | |||
| 643 | # | ||
| 644 | # Please see Documentation/ide.txt for help/info on IDE drives | ||
| 645 | # | ||
| 646 | # CONFIG_BLK_DEV_IDE_SATA is not set | ||
| 647 | CONFIG_BLK_DEV_IDEDISK=y | ||
| 648 | # CONFIG_IDEDISK_MULTI_MODE is not set | ||
| 649 | CONFIG_BLK_DEV_IDECS=m | ||
| 650 | # CONFIG_BLK_DEV_IDECD is not set | ||
| 651 | # CONFIG_BLK_DEV_IDETAPE is not set | ||
| 652 | # CONFIG_BLK_DEV_IDEFLOPPY is not set | ||
| 653 | # CONFIG_BLK_DEV_IDESCSI is not set | ||
| 654 | # CONFIG_IDE_TASK_IOCTL is not set | ||
| 655 | CONFIG_IDE_PROC_FS=y | ||
| 656 | |||
| 657 | # | ||
| 658 | # IDE chipset support/bugfixes | ||
| 659 | # | ||
| 660 | CONFIG_IDE_GENERIC=y | ||
| 661 | # CONFIG_BLK_DEV_PLATFORM is not set | ||
| 662 | # CONFIG_IDE_ARM is not set | ||
| 663 | # CONFIG_BLK_DEV_IDEDMA is not set | ||
| 664 | CONFIG_IDE_ARCH_OBSOLETE_INIT=y | ||
| 665 | # CONFIG_BLK_DEV_HD is not set | ||
| 666 | |||
| 667 | # | ||
| 668 | # SCSI device support | ||
| 669 | # | ||
| 670 | # CONFIG_RAID_ATTRS is not set | ||
| 671 | CONFIG_SCSI=m | ||
| 672 | CONFIG_SCSI_DMA=y | ||
| 673 | # CONFIG_SCSI_TGT is not set | ||
| 674 | # CONFIG_SCSI_NETLINK is not set | ||
| 675 | CONFIG_SCSI_PROC_FS=y | ||
| 676 | |||
| 677 | # | ||
| 678 | # SCSI support type (disk, tape, CD-ROM) | ||
| 679 | # | ||
| 680 | CONFIG_BLK_DEV_SD=m | ||
| 681 | CONFIG_CHR_DEV_ST=m | ||
| 682 | CONFIG_CHR_DEV_OSST=m | ||
| 683 | CONFIG_BLK_DEV_SR=m | ||
| 684 | # CONFIG_BLK_DEV_SR_VENDOR is not set | ||
| 685 | CONFIG_CHR_DEV_SG=m | ||
| 686 | # CONFIG_CHR_DEV_SCH is not set | ||
| 687 | |||
| 688 | # | ||
| 689 | # Some SCSI devices (e.g. CD jukebox) support multiple LUNs | ||
| 690 | # | ||
| 691 | CONFIG_SCSI_MULTI_LUN=y | ||
| 692 | # CONFIG_SCSI_CONSTANTS is not set | ||
| 693 | # CONFIG_SCSI_LOGGING is not set | ||
| 694 | # CONFIG_SCSI_SCAN_ASYNC is not set | ||
| 695 | CONFIG_SCSI_WAIT_SCAN=m | ||
| 696 | |||
| 697 | # | ||
| 698 | # SCSI Transports | ||
| 699 | # | ||
| 700 | # CONFIG_SCSI_SPI_ATTRS is not set | ||
| 701 | # CONFIG_SCSI_FC_ATTRS is not set | ||
| 702 | # CONFIG_SCSI_ISCSI_ATTRS is not set | ||
| 703 | # CONFIG_SCSI_SAS_LIBSAS is not set | ||
| 704 | # CONFIG_SCSI_SRP_ATTRS is not set | ||
| 705 | CONFIG_SCSI_LOWLEVEL=y | ||
| 706 | # CONFIG_ISCSI_TCP is not set | ||
| 707 | # CONFIG_SCSI_DEBUG is not set | ||
| 708 | # CONFIG_SCSI_LOWLEVEL_PCMCIA is not set | ||
| 709 | # CONFIG_ATA is not set | ||
| 710 | CONFIG_MD=y | ||
| 711 | # CONFIG_BLK_DEV_MD is not set | ||
| 712 | CONFIG_BLK_DEV_DM=m | ||
| 713 | # CONFIG_DM_DEBUG is not set | ||
| 714 | CONFIG_DM_CRYPT=m | ||
| 715 | CONFIG_DM_SNAPSHOT=m | ||
| 716 | CONFIG_DM_MIRROR=m | ||
| 717 | CONFIG_DM_ZERO=m | ||
| 718 | CONFIG_DM_MULTIPATH=m | ||
| 719 | CONFIG_DM_MULTIPATH_EMC=m | ||
| 720 | # CONFIG_DM_MULTIPATH_RDAC is not set | ||
| 721 | # CONFIG_DM_MULTIPATH_HP is not set | ||
| 722 | # CONFIG_DM_DELAY is not set | ||
| 723 | # CONFIG_DM_UEVENT is not set | ||
| 724 | CONFIG_NETDEVICES=y | ||
| 725 | # CONFIG_NETDEVICES_MULTIQUEUE is not set | ||
| 726 | # CONFIG_DUMMY is not set | ||
| 727 | # CONFIG_BONDING is not set | ||
| 728 | # CONFIG_MACVLAN is not set | ||
| 729 | # CONFIG_EQUALIZER is not set | ||
| 730 | CONFIG_TUN=m | ||
| 731 | # CONFIG_VETH is not set | ||
| 732 | # CONFIG_PHYLIB is not set | ||
| 733 | CONFIG_NET_ETHERNET=y | ||
| 734 | CONFIG_MII=m | ||
| 735 | # CONFIG_AX88796 is not set | ||
| 736 | # CONFIG_SMC91X is not set | ||
| 737 | # CONFIG_DM9000 is not set | ||
| 738 | # CONFIG_SMC911X is not set | ||
| 739 | # CONFIG_IBM_NEW_EMAC_ZMII is not set | ||
| 740 | # CONFIG_IBM_NEW_EMAC_RGMII is not set | ||
| 741 | # CONFIG_IBM_NEW_EMAC_TAH is not set | ||
| 742 | # CONFIG_IBM_NEW_EMAC_EMAC4 is not set | ||
| 743 | # CONFIG_B44 is not set | ||
| 744 | # CONFIG_NETDEV_1000 is not set | ||
| 745 | # CONFIG_NETDEV_10000 is not set | ||
| 746 | |||
| 747 | # | ||
| 748 | # Wireless LAN | ||
| 749 | # | ||
| 750 | # CONFIG_WLAN_PRE80211 is not set | ||
| 751 | CONFIG_WLAN_80211=y | ||
| 752 | # CONFIG_PCMCIA_RAYCS is not set | ||
| 753 | # CONFIG_LIBERTAS is not set | ||
| 754 | CONFIG_HERMES=m | ||
| 755 | CONFIG_PCMCIA_HERMES=m | ||
| 756 | CONFIG_PCMCIA_SPECTRUM=m | ||
| 757 | # CONFIG_ATMEL is not set | ||
| 758 | CONFIG_AIRO_CS=m | ||
| 759 | # CONFIG_PCMCIA_WL3501 is not set | ||
| 760 | # CONFIG_USB_ZD1201 is not set | ||
| 761 | CONFIG_HOSTAP=m | ||
| 762 | CONFIG_HOSTAP_FIRMWARE=y | ||
| 763 | # CONFIG_HOSTAP_FIRMWARE_NVRAM is not set | ||
| 764 | CONFIG_HOSTAP_CS=m | ||
| 765 | |||
| 766 | # | ||
| 767 | # USB Network Adapters | ||
| 768 | # | ||
| 769 | CONFIG_USB_CATC=m | ||
| 770 | CONFIG_USB_KAWETH=m | ||
| 771 | CONFIG_USB_PEGASUS=m | ||
| 772 | CONFIG_USB_RTL8150=m | ||
| 773 | CONFIG_USB_USBNET=m | ||
| 774 | CONFIG_USB_NET_AX8817X=m | ||
| 775 | CONFIG_USB_NET_CDCETHER=m | ||
| 776 | # CONFIG_USB_NET_DM9601 is not set | ||
| 777 | # CONFIG_USB_NET_GL620A is not set | ||
| 778 | CONFIG_USB_NET_NET1080=m | ||
| 779 | # CONFIG_USB_NET_PLUSB is not set | ||
| 780 | # CONFIG_USB_NET_MCS7830 is not set | ||
| 781 | # CONFIG_USB_NET_RNDIS_HOST is not set | ||
| 782 | # CONFIG_USB_NET_CDC_SUBSET is not set | ||
| 783 | CONFIG_USB_NET_ZAURUS=m | ||
| 784 | CONFIG_NET_PCMCIA=y | ||
| 785 | # CONFIG_PCMCIA_3C589 is not set | ||
| 786 | # CONFIG_PCMCIA_3C574 is not set | ||
| 787 | # CONFIG_PCMCIA_FMVJ18X is not set | ||
| 788 | CONFIG_PCMCIA_PCNET=m | ||
| 789 | # CONFIG_PCMCIA_NMCLAN is not set | ||
| 790 | # CONFIG_PCMCIA_SMC91C92 is not set | ||
| 791 | # CONFIG_PCMCIA_XIRC2PS is not set | ||
| 792 | # CONFIG_PCMCIA_AXNET is not set | ||
| 793 | # CONFIG_WAN is not set | ||
| 794 | CONFIG_PPP=m | ||
| 795 | # CONFIG_PPP_MULTILINK is not set | ||
| 796 | # CONFIG_PPP_FILTER is not set | ||
| 797 | CONFIG_PPP_ASYNC=m | ||
| 798 | # CONFIG_PPP_SYNC_TTY is not set | ||
| 799 | CONFIG_PPP_DEFLATE=m | ||
| 800 | CONFIG_PPP_BSDCOMP=m | ||
| 801 | # CONFIG_PPP_MPPE is not set | ||
| 802 | # CONFIG_PPPOE is not set | ||
| 803 | # CONFIG_PPPOL2TP is not set | ||
| 804 | # CONFIG_SLIP is not set | ||
| 805 | CONFIG_SLHC=m | ||
| 806 | # CONFIG_SHAPER is not set | ||
| 807 | # CONFIG_NETCONSOLE is not set | ||
| 808 | # CONFIG_NETPOLL is not set | ||
| 809 | # CONFIG_NET_POLL_CONTROLLER is not set | ||
| 810 | # CONFIG_ISDN is not set | ||
| 811 | |||
| 812 | # | ||
| 813 | # Input device support | ||
| 814 | # | ||
| 815 | CONFIG_INPUT=y | ||
| 816 | # CONFIG_INPUT_FF_MEMLESS is not set | ||
| 817 | # CONFIG_INPUT_POLLDEV is not set | ||
| 818 | |||
| 819 | # | ||
| 820 | # Userland interfaces | ||
| 821 | # | ||
| 822 | CONFIG_INPUT_MOUSEDEV=m | ||
| 823 | # CONFIG_INPUT_MOUSEDEV_PSAUX is not set | ||
| 824 | CONFIG_INPUT_MOUSEDEV_SCREEN_X=640 | ||
| 825 | CONFIG_INPUT_MOUSEDEV_SCREEN_Y=480 | ||
| 826 | # CONFIG_INPUT_JOYDEV is not set | ||
| 827 | CONFIG_INPUT_EVDEV=y | ||
| 828 | # CONFIG_INPUT_EVBUG is not set | ||
| 829 | CONFIG_INPUT_POWER=y | ||
| 830 | |||
| 831 | # | ||
| 832 | # Input Device Drivers | ||
| 833 | # | ||
| 834 | CONFIG_INPUT_KEYBOARD=y | ||
| 835 | # CONFIG_KEYBOARD_ATKBD is not set | ||
| 836 | # CONFIG_KEYBOARD_SUNKBD is not set | ||
| 837 | # CONFIG_KEYBOARD_LKKBD is not set | ||
| 838 | # CONFIG_KEYBOARD_XTKBD is not set | ||
| 839 | # CONFIG_KEYBOARD_NEWTON is not set | ||
| 840 | # CONFIG_KEYBOARD_STOWAWAY is not set | ||
| 841 | # CONFIG_KEYBOARD_CORGI is not set | ||
| 842 | CONFIG_KEYBOARD_SPITZ=y | ||
| 843 | # CONFIG_KEYBOARD_PXA27x is not set | ||
| 844 | # CONFIG_KEYBOARD_GPIO is not set | ||
| 845 | # CONFIG_INPUT_MOUSE is not set | ||
| 846 | # CONFIG_INPUT_JOYSTICK is not set | ||
| 847 | # CONFIG_INPUT_TABLET is not set | ||
| 848 | CONFIG_INPUT_TOUCHSCREEN=y | ||
| 849 | CONFIG_TOUCHSCREEN_CORGI=y | ||
| 850 | # CONFIG_TOUCHSCREEN_FUJITSU is not set | ||
| 851 | # CONFIG_TOUCHSCREEN_GUNZE is not set | ||
| 852 | # CONFIG_TOUCHSCREEN_ELO is not set | ||
| 853 | # CONFIG_TOUCHSCREEN_MTOUCH is not set | ||
| 854 | # CONFIG_TOUCHSCREEN_MK712 is not set | ||
| 855 | # CONFIG_TOUCHSCREEN_PENMOUNT is not set | ||
| 856 | # CONFIG_TOUCHSCREEN_TOUCHRIGHT is not set | ||
| 857 | # CONFIG_TOUCHSCREEN_TOUCHWIN is not set | ||
| 858 | # CONFIG_TOUCHSCREEN_UCB1400 is not set | ||
| 859 | # CONFIG_TOUCHSCREEN_USB_COMPOSITE is not set | ||
| 860 | CONFIG_INPUT_MISC=y | ||
| 861 | # CONFIG_INPUT_ATI_REMOTE is not set | ||
| 862 | # CONFIG_INPUT_ATI_REMOTE2 is not set | ||
| 863 | # CONFIG_INPUT_KEYSPAN_REMOTE is not set | ||
| 864 | # CONFIG_INPUT_POWERMATE is not set | ||
| 865 | # CONFIG_INPUT_YEALINK is not set | ||
| 866 | CONFIG_INPUT_UINPUT=m | ||
| 867 | |||
| 868 | # | ||
| 869 | # Hardware I/O ports | ||
| 870 | # | ||
| 871 | # CONFIG_SERIO is not set | ||
| 872 | # CONFIG_GAMEPORT is not set | ||
| 873 | |||
| 874 | # | ||
| 875 | # Character devices | ||
| 876 | # | ||
| 877 | CONFIG_VT=y | ||
| 878 | CONFIG_VT_CONSOLE=y | ||
| 879 | CONFIG_HW_CONSOLE=y | ||
| 880 | # CONFIG_VT_HW_CONSOLE_BINDING is not set | ||
| 881 | # CONFIG_SERIAL_NONSTANDARD is not set | ||
| 882 | |||
| 883 | # | ||
| 884 | # Serial drivers | ||
| 885 | # | ||
| 886 | CONFIG_SERIAL_8250=m | ||
| 887 | CONFIG_SERIAL_8250_CS=m | ||
| 888 | CONFIG_SERIAL_8250_NR_UARTS=4 | ||
| 889 | CONFIG_SERIAL_8250_RUNTIME_UARTS=4 | ||
| 890 | # CONFIG_SERIAL_8250_EXTENDED is not set | ||
| 891 | |||
| 892 | # | ||
| 893 | # Non-8250 serial port support | ||
| 894 | # | ||
| 895 | CONFIG_SERIAL_PXA=y | ||
| 896 | CONFIG_SERIAL_PXA_CONSOLE=y | ||
| 897 | CONFIG_SERIAL_CORE=y | ||
| 898 | CONFIG_SERIAL_CORE_CONSOLE=y | ||
| 899 | CONFIG_UNIX98_PTYS=y | ||
| 900 | # CONFIG_LEGACY_PTYS is not set | ||
| 901 | # CONFIG_IPMI_HANDLER is not set | ||
| 902 | CONFIG_HW_RANDOM=m | ||
| 903 | # CONFIG_NVRAM is not set | ||
| 904 | # CONFIG_R3964 is not set | ||
| 905 | |||
| 906 | # | ||
| 907 | # PCMCIA character devices | ||
| 908 | # | ||
| 909 | # CONFIG_SYNCLINK_CS is not set | ||
| 910 | # CONFIG_CARDMAN_4000 is not set | ||
| 911 | # CONFIG_CARDMAN_4040 is not set | ||
| 912 | # CONFIG_RAW_DRIVER is not set | ||
| 913 | # CONFIG_TCG_TPM is not set | ||
| 914 | CONFIG_I2C=y | ||
| 915 | CONFIG_I2C_BOARDINFO=y | ||
| 916 | # CONFIG_I2C_CHARDEV is not set | ||
| 917 | |||
| 918 | # | ||
| 919 | # I2C Algorithms | ||
| 920 | # | ||
| 921 | CONFIG_I2C_ALGOBIT=y | ||
| 922 | # CONFIG_I2C_ALGOPCF is not set | ||
| 923 | # CONFIG_I2C_ALGOPCA is not set | ||
| 924 | |||
| 925 | # | ||
| 926 | # I2C Hardware Bus support | ||
| 927 | # | ||
| 928 | # CONFIG_I2C_GPIO is not set | ||
| 929 | CONFIG_I2C_PXA=y | ||
| 930 | # CONFIG_I2C_PXA_SLAVE is not set | ||
| 931 | # CONFIG_I2C_OCORES is not set | ||
| 932 | # CONFIG_I2C_PARPORT_LIGHT is not set | ||
| 933 | # CONFIG_I2C_SIMTEC is not set | ||
| 934 | # CONFIG_I2C_TAOS_EVM is not set | ||
| 935 | # CONFIG_I2C_STUB is not set | ||
| 936 | # CONFIG_I2C_TINY_USB is not set | ||
| 937 | |||
| 938 | # | ||
| 939 | # Miscellaneous I2C Chip support | ||
| 940 | # | ||
| 941 | # CONFIG_SENSORS_DS1337 is not set | ||
| 942 | # CONFIG_SENSORS_DS1374 is not set | ||
| 943 | # CONFIG_DS1682 is not set | ||
| 944 | # CONFIG_SENSORS_EEPROM is not set | ||
| 945 | # CONFIG_SENSORS_PCF8574 is not set | ||
| 946 | # CONFIG_SENSORS_PCA9539 is not set | ||
| 947 | # CONFIG_SENSORS_PCF8591 is not set | ||
| 948 | # CONFIG_SENSORS_MAX6875 is not set | ||
| 949 | # CONFIG_SENSORS_TSL2550 is not set | ||
| 950 | # CONFIG_I2C_DEBUG_CORE is not set | ||
| 951 | # CONFIG_I2C_DEBUG_ALGO is not set | ||
| 952 | # CONFIG_I2C_DEBUG_BUS is not set | ||
| 953 | # CONFIG_I2C_DEBUG_CHIP is not set | ||
| 954 | |||
| 955 | # | ||
| 956 | # SPI support | ||
| 957 | # | ||
| 958 | # CONFIG_SPI is not set | ||
| 959 | # CONFIG_SPI_MASTER is not set | ||
| 960 | # CONFIG_W1 is not set | ||
| 961 | # CONFIG_POWER_SUPPLY is not set | ||
| 962 | # CONFIG_HWMON is not set | ||
| 963 | # CONFIG_WATCHDOG is not set | ||
| 964 | |||
| 965 | # | ||
| 966 | # Sonics Silicon Backplane | ||
| 967 | # | ||
| 968 | CONFIG_SSB_POSSIBLE=y | ||
| 969 | # CONFIG_SSB is not set | ||
| 970 | |||
| 971 | # | ||
| 972 | # Multifunction device drivers | ||
| 973 | # | ||
| 974 | # CONFIG_MFD_SM501 is not set | ||
| 975 | # CONFIG_HTC_ASIC3 is not set | ||
| 976 | # CONFIG_HTC_ASIC3_DS1WM is not set | ||
| 977 | |||
| 978 | # | ||
| 979 | # Multimedia devices | ||
| 980 | # | ||
| 981 | CONFIG_VIDEO_DEV=m | ||
| 982 | CONFIG_VIDEO_V4L1=y | ||
| 983 | CONFIG_VIDEO_V4L1_COMPAT=y | ||
| 984 | CONFIG_VIDEO_V4L2=y | ||
| 985 | CONFIG_VIDEO_CAPTURE_DRIVERS=y | ||
| 986 | # CONFIG_VIDEO_ADV_DEBUG is not set | ||
| 987 | CONFIG_VIDEO_HELPER_CHIPS_AUTO=y | ||
| 988 | # CONFIG_VIDEO_VIVI is not set | ||
| 989 | # CONFIG_VIDEO_CPIA is not set | ||
| 990 | # CONFIG_VIDEO_CPIA2 is not set | ||
| 991 | # CONFIG_VIDEO_SAA5246A is not set | ||
| 992 | # CONFIG_VIDEO_SAA5249 is not set | ||
| 993 | # CONFIG_TUNER_3036 is not set | ||
| 994 | CONFIG_V4L_USB_DRIVERS=y | ||
| 995 | # CONFIG_VIDEO_PVRUSB2 is not set | ||
| 996 | # CONFIG_VIDEO_EM28XX is not set | ||
| 997 | # CONFIG_VIDEO_USBVISION is not set | ||
| 998 | CONFIG_VIDEO_USBVIDEO=m | ||
| 999 | CONFIG_USB_VICAM=m | ||
| 1000 | CONFIG_USB_IBMCAM=m | ||
| 1001 | CONFIG_USB_KONICAWC=m | ||
| 1002 | # CONFIG_USB_QUICKCAM_MESSENGER is not set | ||
| 1003 | # CONFIG_USB_ET61X251 is not set | ||
| 1004 | # CONFIG_VIDEO_OVCAMCHIP is not set | ||
| 1005 | # CONFIG_USB_W9968CF is not set | ||
| 1006 | CONFIG_USB_OV511=m | ||
| 1007 | CONFIG_USB_SE401=m | ||
| 1008 | CONFIG_USB_SN9C102=m | ||
| 1009 | CONFIG_USB_STV680=m | ||
| 1010 | # CONFIG_USB_ZC0301 is not set | ||
| 1011 | # CONFIG_USB_PWC is not set | ||
| 1012 | # CONFIG_USB_ZR364XX is not set | ||
| 1013 | CONFIG_RADIO_ADAPTERS=y | ||
| 1014 | CONFIG_USB_DSBR=m | ||
| 1015 | # CONFIG_DVB_CORE is not set | ||
| 1016 | CONFIG_DAB=y | ||
| 1017 | CONFIG_USB_DABUSB=m | ||
| 1018 | |||
| 1019 | # | ||
| 1020 | # Graphics support | ||
| 1021 | # | ||
| 1022 | # CONFIG_VGASTATE is not set | ||
| 1023 | CONFIG_VIDEO_OUTPUT_CONTROL=m | ||
| 1024 | CONFIG_FB=y | ||
| 1025 | # CONFIG_FIRMWARE_EDID is not set | ||
| 1026 | # CONFIG_FB_DDC is not set | ||
| 1027 | CONFIG_FB_CFB_FILLRECT=y | ||
| 1028 | CONFIG_FB_CFB_COPYAREA=y | ||
| 1029 | CONFIG_FB_CFB_IMAGEBLIT=y | ||
| 1030 | # CONFIG_FB_CFB_REV_PIXELS_IN_BYTE is not set | ||
| 1031 | # CONFIG_FB_SYS_FILLRECT is not set | ||
| 1032 | # CONFIG_FB_SYS_COPYAREA is not set | ||
| 1033 | # CONFIG_FB_SYS_IMAGEBLIT is not set | ||
| 1034 | # CONFIG_FB_SYS_FOPS is not set | ||
| 1035 | # CONFIG_FB_DEFERRED_IO is not set | ||
| 1036 | # CONFIG_FB_SVGALIB is not set | ||
| 1037 | # CONFIG_FB_MACMODES is not set | ||
| 1038 | # CONFIG_FB_BACKLIGHT is not set | ||
| 1039 | # CONFIG_FB_MODE_HELPERS is not set | ||
| 1040 | # CONFIG_FB_TILEBLITTING is not set | ||
| 1041 | |||
| 1042 | # | ||
| 1043 | # Frame buffer hardware drivers | ||
| 1044 | # | ||
| 1045 | # CONFIG_FB_S1D13XXX is not set | ||
| 1046 | CONFIG_FB_PXA=y | ||
| 1047 | CONFIG_FB_PXA_LCD_QVGA=y | ||
| 1048 | # CONFIG_FB_PXA_LCD_VGA is not set | ||
| 1049 | CONFIG_FB_PXA_OVERLAY=y | ||
| 1050 | # CONFIG_FB_PXA_PARAMETERS is not set | ||
| 1051 | # CONFIG_FB_MBX is not set | ||
| 1052 | # CONFIG_FB_W100 is not set | ||
| 1053 | # CONFIG_FB_VIRTUAL is not set | ||
| 1054 | CONFIG_BACKLIGHT_LCD_SUPPORT=y | ||
| 1055 | # CONFIG_LCD_CLASS_DEVICE is not set | ||
| 1056 | CONFIG_BACKLIGHT_CLASS_DEVICE=y | ||
| 1057 | CONFIG_BACKLIGHT_CORGI=y | ||
| 1058 | |||
| 1059 | # | ||
| 1060 | # Display device support | ||
| 1061 | # | ||
| 1062 | # CONFIG_DISPLAY_SUPPORT is not set | ||
| 1063 | |||
| 1064 | # | ||
| 1065 | # Console display driver support | ||
| 1066 | # | ||
| 1067 | # CONFIG_VGA_CONSOLE is not set | ||
| 1068 | CONFIG_DUMMY_CONSOLE=y | ||
| 1069 | CONFIG_FRAMEBUFFER_CONSOLE=y | ||
| 1070 | # CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY is not set | ||
| 1071 | CONFIG_FRAMEBUFFER_CONSOLE_ROTATION=y | ||
| 1072 | CONFIG_FONTS=y | ||
| 1073 | # CONFIG_FONT_8x8 is not set | ||
| 1074 | CONFIG_FONT_8x16=y | ||
| 1075 | # CONFIG_FONT_6x11 is not set | ||
| 1076 | # CONFIG_FONT_7x14 is not set | ||
| 1077 | # CONFIG_FONT_PEARL_8x8 is not set | ||
| 1078 | # CONFIG_FONT_ACORN_8x8 is not set | ||
| 1079 | # CONFIG_FONT_MINI_4x6 is not set | ||
| 1080 | # CONFIG_FONT_SUN8x16 is not set | ||
| 1081 | # CONFIG_FONT_SUN12x22 is not set | ||
| 1082 | # CONFIG_FONT_10x18 is not set | ||
| 1083 | CONFIG_LOGO=y | ||
| 1084 | # CONFIG_LOGO_LINUX_MONO is not set | ||
| 1085 | # CONFIG_LOGO_LINUX_VGA16 is not set | ||
| 1086 | # CONFIG_LOGO_LINUX_CLUT224 is not set | ||
| 1087 | CONFIG_LOGO_OHAND_CLUT224=y | ||
| 1088 | |||
| 1089 | # | ||
| 1090 | # Sound | ||
| 1091 | # | ||
| 1092 | CONFIG_SOUND=m | ||
| 1093 | |||
| 1094 | # | ||
| 1095 | # Advanced Linux Sound Architecture | ||
| 1096 | # | ||
| 1097 | CONFIG_SND=m | ||
| 1098 | CONFIG_SND_TIMER=m | ||
| 1099 | CONFIG_SND_PCM=m | ||
| 1100 | CONFIG_SND_HWDEP=m | ||
| 1101 | CONFIG_SND_RAWMIDI=m | ||
| 1102 | CONFIG_SND_SEQUENCER=m | ||
| 1103 | # CONFIG_SND_SEQ_DUMMY is not set | ||
| 1104 | CONFIG_SND_OSSEMUL=y | ||
| 1105 | CONFIG_SND_MIXER_OSS=m | ||
| 1106 | CONFIG_SND_PCM_OSS=m | ||
| 1107 | CONFIG_SND_PCM_OSS_PLUGINS=y | ||
| 1108 | # CONFIG_SND_SEQUENCER_OSS is not set | ||
| 1109 | # CONFIG_SND_DYNAMIC_MINORS is not set | ||
| 1110 | CONFIG_SND_SUPPORT_OLD_API=y | ||
| 1111 | CONFIG_SND_VERBOSE_PROCFS=y | ||
| 1112 | # CONFIG_SND_VERBOSE_PRINTK is not set | ||
| 1113 | # CONFIG_SND_DEBUG is not set | ||
| 1114 | |||
| 1115 | # | ||
| 1116 | # Generic devices | ||
| 1117 | # | ||
| 1118 | # CONFIG_SND_AC97_CODEC is not set | ||
| 1119 | # CONFIG_SND_DUMMY is not set | ||
| 1120 | # CONFIG_SND_VIRMIDI is not set | ||
| 1121 | # CONFIG_SND_MTPAV is not set | ||
| 1122 | # CONFIG_SND_SERIAL_U16550 is not set | ||
| 1123 | # CONFIG_SND_MPU401 is not set | ||
| 1124 | |||
| 1125 | # | ||
| 1126 | # ALSA ARM devices | ||
| 1127 | # | ||
| 1128 | CONFIG_SND_PXA2XX_PCM=m | ||
| 1129 | CONFIG_SND_PXA2XX_AC97=m | ||
| 1130 | |||
| 1131 | # | ||
| 1132 | # USB devices | ||
| 1133 | # | ||
| 1134 | CONFIG_SND_USB_AUDIO=m | ||
| 1135 | # CONFIG_SND_USB_CAIAQ is not set | ||
| 1136 | |||
| 1137 | # | ||
| 1138 | # PCMCIA devices | ||
| 1139 | # | ||
| 1140 | # CONFIG_SND_VXPOCKET is not set | ||
| 1141 | # CONFIG_SND_PDAUDIOCF is not set | ||
| 1142 | |||
| 1143 | # | ||
| 1144 | # System on Chip audio support | ||
| 1145 | # | ||
| 1146 | CONFIG_SND_SOC=m | ||
| 1147 | CONFIG_SND_PXA2XX_SOC=m | ||
| 1148 | CONFIG_SND_PXA2XX_SOC_I2S=m | ||
| 1149 | CONFIG_SND_PXA2XX_SOC_SPITZ=m | ||
| 1150 | |||
| 1151 | # | ||
| 1152 | # SoC Audio support for SuperH | ||
| 1153 | # | ||
| 1154 | CONFIG_SND_SOC_WM8750=m | ||
| 1155 | |||
| 1156 | # | ||
| 1157 | # Open Sound System | ||
| 1158 | # | ||
| 1159 | # CONFIG_SOUND_PRIME is not set | ||
| 1160 | # CONFIG_AC97_BUS is not set | ||
| 1161 | CONFIG_HID_SUPPORT=y | ||
| 1162 | CONFIG_HID=m | ||
| 1163 | # CONFIG_HID_DEBUG is not set | ||
| 1164 | # CONFIG_HIDRAW is not set | ||
| 1165 | |||
| 1166 | # | ||
| 1167 | # USB Input Devices | ||
| 1168 | # | ||
| 1169 | CONFIG_USB_HID=m | ||
| 1170 | # CONFIG_USB_HIDINPUT_POWERBOOK is not set | ||
| 1171 | # CONFIG_HID_FF is not set | ||
| 1172 | # CONFIG_USB_HIDDEV is not set | ||
| 1173 | |||
| 1174 | # | ||
| 1175 | # USB HID Boot Protocol drivers | ||
| 1176 | # | ||
| 1177 | CONFIG_USB_KBD=m | ||
| 1178 | CONFIG_USB_MOUSE=m | ||
| 1179 | CONFIG_USB_SUPPORT=y | ||
| 1180 | CONFIG_USB_ARCH_HAS_HCD=y | ||
| 1181 | CONFIG_USB_ARCH_HAS_OHCI=y | ||
| 1182 | # CONFIG_USB_ARCH_HAS_EHCI is not set | ||
| 1183 | CONFIG_USB=m | ||
| 1184 | # CONFIG_USB_DEBUG is not set | ||
| 1185 | |||
| 1186 | # | ||
| 1187 | # Miscellaneous USB options | ||
| 1188 | # | ||
| 1189 | CONFIG_USB_DEVICEFS=y | ||
| 1190 | CONFIG_USB_DEVICE_CLASS=y | ||
| 1191 | # CONFIG_USB_DYNAMIC_MINORS is not set | ||
| 1192 | # CONFIG_USB_SUSPEND is not set | ||
| 1193 | # CONFIG_USB_PERSIST is not set | ||
| 1194 | # CONFIG_USB_OTG is not set | ||
| 1195 | |||
| 1196 | # | ||
| 1197 | # USB Host Controller Drivers | ||
| 1198 | # | ||
| 1199 | # CONFIG_USB_ISP116X_HCD is not set | ||
| 1200 | CONFIG_USB_OHCI_HCD=m | ||
| 1201 | # CONFIG_USB_OHCI_BIG_ENDIAN_DESC is not set | ||
| 1202 | # CONFIG_USB_OHCI_BIG_ENDIAN_MMIO is not set | ||
| 1203 | CONFIG_USB_OHCI_LITTLE_ENDIAN=y | ||
| 1204 | CONFIG_USB_SL811_HCD=m | ||
| 1205 | CONFIG_USB_SL811_CS=m | ||
| 1206 | # CONFIG_USB_R8A66597_HCD is not set | ||
| 1207 | |||
| 1208 | # | ||
| 1209 | # USB Device Class drivers | ||
| 1210 | # | ||
| 1211 | CONFIG_USB_ACM=m | ||
| 1212 | CONFIG_USB_PRINTER=m | ||
| 1213 | |||
| 1214 | # | ||
| 1215 | # NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' | ||
| 1216 | # | ||
| 1217 | |||
| 1218 | # | ||
| 1219 | # may also be needed; see USB_STORAGE Help for more information | ||
| 1220 | # | ||
| 1221 | CONFIG_USB_STORAGE=m | ||
| 1222 | # CONFIG_USB_STORAGE_DEBUG is not set | ||
| 1223 | # CONFIG_USB_STORAGE_DATAFAB is not set | ||
| 1224 | # CONFIG_USB_STORAGE_FREECOM is not set | ||
| 1225 | # CONFIG_USB_STORAGE_ISD200 is not set | ||
| 1226 | # CONFIG_USB_STORAGE_DPCM is not set | ||
| 1227 | # CONFIG_USB_STORAGE_USBAT is not set | ||
| 1228 | # CONFIG_USB_STORAGE_SDDR09 is not set | ||
| 1229 | # CONFIG_USB_STORAGE_SDDR55 is not set | ||
| 1230 | # CONFIG_USB_STORAGE_JUMPSHOT is not set | ||
| 1231 | # CONFIG_USB_STORAGE_ALAUDA is not set | ||
| 1232 | # CONFIG_USB_STORAGE_KARMA is not set | ||
| 1233 | # CONFIG_USB_LIBUSUAL is not set | ||
| 1234 | |||
| 1235 | # | ||
| 1236 | # USB Imaging devices | ||
| 1237 | # | ||
| 1238 | CONFIG_USB_MDC800=m | ||
| 1239 | CONFIG_USB_MICROTEK=m | ||
| 1240 | CONFIG_USB_MON=y | ||
| 1241 | |||
| 1242 | # | ||
| 1243 | # USB port drivers | ||
| 1244 | # | ||
| 1245 | |||
| 1246 | # | ||
| 1247 | # USB Serial Converter support | ||
| 1248 | # | ||
| 1249 | CONFIG_USB_SERIAL=m | ||
| 1250 | CONFIG_USB_SERIAL_GENERIC=y | ||
| 1251 | # CONFIG_USB_SERIAL_AIRCABLE is not set | ||
| 1252 | # CONFIG_USB_SERIAL_AIRPRIME is not set | ||
| 1253 | # CONFIG_USB_SERIAL_ARK3116 is not set | ||
| 1254 | CONFIG_USB_SERIAL_BELKIN=m | ||
| 1255 | # CONFIG_USB_SERIAL_CH341 is not set | ||
| 1256 | # CONFIG_USB_SERIAL_WHITEHEAT is not set | ||
| 1257 | CONFIG_USB_SERIAL_DIGI_ACCELEPORT=m | ||
| 1258 | # CONFIG_USB_SERIAL_CP2101 is not set | ||
| 1259 | CONFIG_USB_SERIAL_CYPRESS_M8=m | ||
| 1260 | CONFIG_USB_SERIAL_EMPEG=m | ||
| 1261 | CONFIG_USB_SERIAL_FTDI_SIO=m | ||
| 1262 | # CONFIG_USB_SERIAL_FUNSOFT is not set | ||
| 1263 | CONFIG_USB_SERIAL_VISOR=m | ||
| 1264 | CONFIG_USB_SERIAL_IPAQ=m | ||
| 1265 | CONFIG_USB_SERIAL_IR=m | ||
| 1266 | CONFIG_USB_SERIAL_EDGEPORT=m | ||
| 1267 | CONFIG_USB_SERIAL_EDGEPORT_TI=m | ||
| 1268 | CONFIG_USB_SERIAL_GARMIN=m | ||
| 1269 | CONFIG_USB_SERIAL_IPW=m | ||
| 1270 | CONFIG_USB_SERIAL_KEYSPAN_PDA=m | ||
| 1271 | CONFIG_USB_SERIAL_KEYSPAN=m | ||
| 1272 | # CONFIG_USB_SERIAL_KEYSPAN_MPR is not set | ||
| 1273 | # CONFIG_USB_SERIAL_KEYSPAN_USA28 is not set | ||
| 1274 | # CONFIG_USB_SERIAL_KEYSPAN_USA28X is not set | ||
| 1275 | # CONFIG_USB_SERIAL_KEYSPAN_USA28XA is not set | ||
| 1276 | # CONFIG_USB_SERIAL_KEYSPAN_USA28XB is not set | ||
| 1277 | # CONFIG_USB_SERIAL_KEYSPAN_USA19 is not set | ||
| 1278 | # CONFIG_USB_SERIAL_KEYSPAN_USA18X is not set | ||
| 1279 | # CONFIG_USB_SERIAL_KEYSPAN_USA19W is not set | ||
| 1280 | # CONFIG_USB_SERIAL_KEYSPAN_USA19QW is not set | ||
| 1281 | # CONFIG_USB_SERIAL_KEYSPAN_USA19QI is not set | ||
| 1282 | # CONFIG_USB_SERIAL_KEYSPAN_USA49W is not set | ||
| 1283 | # CONFIG_USB_SERIAL_KEYSPAN_USA49WLC is not set | ||
| 1284 | CONFIG_USB_SERIAL_KLSI=m | ||
| 1285 | CONFIG_USB_SERIAL_KOBIL_SCT=m | ||
| 1286 | CONFIG_USB_SERIAL_MCT_U232=m | ||
| 1287 | # CONFIG_USB_SERIAL_MOS7720 is not set | ||
| 1288 | # CONFIG_USB_SERIAL_MOS7840 is not set | ||
| 1289 | # CONFIG_USB_SERIAL_NAVMAN is not set | ||
| 1290 | CONFIG_USB_SERIAL_PL2303=m | ||
| 1291 | # CONFIG_USB_SERIAL_OTI6858 is not set | ||
| 1292 | # CONFIG_USB_SERIAL_HP4X is not set | ||
| 1293 | CONFIG_USB_SERIAL_SAFE=m | ||
| 1294 | # CONFIG_USB_SERIAL_SAFE_PADDED is not set | ||
| 1295 | # CONFIG_USB_SERIAL_SIERRAWIRELESS is not set | ||
| 1296 | CONFIG_USB_SERIAL_TI=m | ||
| 1297 | CONFIG_USB_SERIAL_CYBERJACK=m | ||
| 1298 | CONFIG_USB_SERIAL_XIRCOM=m | ||
| 1299 | # CONFIG_USB_SERIAL_OPTION is not set | ||
| 1300 | CONFIG_USB_SERIAL_OMNINET=m | ||
| 1301 | # CONFIG_USB_SERIAL_DEBUG is not set | ||
| 1302 | CONFIG_USB_EZUSB=y | ||
| 1303 | |||
| 1304 | # | ||
| 1305 | # USB Miscellaneous drivers | ||
| 1306 | # | ||
| 1307 | CONFIG_USB_EMI62=m | ||
| 1308 | CONFIG_USB_EMI26=m | ||
| 1309 | # CONFIG_USB_ADUTUX is not set | ||
| 1310 | CONFIG_USB_AUERSWALD=m | ||
| 1311 | CONFIG_USB_RIO500=m | ||
| 1312 | CONFIG_USB_LEGOTOWER=m | ||
| 1313 | CONFIG_USB_LCD=m | ||
| 1314 | # CONFIG_USB_BERRY_CHARGE is not set | ||
| 1315 | CONFIG_USB_LED=m | ||
| 1316 | # CONFIG_USB_CYPRESS_CY7C63 is not set | ||
| 1317 | CONFIG_USB_CYTHERM=m | ||
| 1318 | # CONFIG_USB_PHIDGET is not set | ||
| 1319 | CONFIG_USB_IDMOUSE=m | ||
| 1320 | # CONFIG_USB_FTDI_ELAN is not set | ||
| 1321 | # CONFIG_USB_APPLEDISPLAY is not set | ||
| 1322 | # CONFIG_USB_LD is not set | ||
| 1323 | # CONFIG_USB_TRANCEVIBRATOR is not set | ||
| 1324 | # CONFIG_USB_IOWARRIOR is not set | ||
| 1325 | # CONFIG_USB_TEST is not set | ||
| 1326 | |||
| 1327 | # | ||
| 1328 | # USB DSL modem support | ||
| 1329 | # | ||
| 1330 | |||
| 1331 | # | ||
| 1332 | # USB Gadget Support | ||
| 1333 | # | ||
| 1334 | CONFIG_USB_GADGET=m | ||
| 1335 | # CONFIG_USB_GADGET_DEBUG is not set | ||
| 1336 | # CONFIG_USB_GADGET_DEBUG_FILES is not set | ||
| 1337 | CONFIG_USB_GADGET_SELECTED=y | ||
| 1338 | # CONFIG_USB_GADGET_AMD5536UDC is not set | ||
| 1339 | # CONFIG_USB_GADGET_ATMEL_USBA is not set | ||
| 1340 | # CONFIG_USB_GADGET_FSL_USB2 is not set | ||
| 1341 | # CONFIG_USB_GADGET_NET2280 is not set | ||
| 1342 | # CONFIG_USB_GADGET_PXA2XX is not set | ||
| 1343 | # CONFIG_USB_GADGET_M66592 is not set | ||
| 1344 | CONFIG_USB_GADGET_PXA27X=y | ||
| 1345 | CONFIG_USB_PXA27X=m | ||
| 1346 | # CONFIG_USB_GADGET_GOKU is not set | ||
| 1347 | # CONFIG_USB_GADGET_LH7A40X is not set | ||
| 1348 | # CONFIG_USB_GADGET_OMAP is not set | ||
| 1349 | # CONFIG_USB_GADGET_S3C2410 is not set | ||
| 1350 | # CONFIG_USB_GADGET_AT91 is not set | ||
| 1351 | # CONFIG_USB_GADGET_DUMMY_HCD is not set | ||
| 1352 | # CONFIG_USB_GADGET_DUALSPEED is not set | ||
| 1353 | CONFIG_USB_ZERO=m | ||
| 1354 | CONFIG_USB_ETH=m | ||
| 1355 | CONFIG_USB_ETH_RNDIS=y | ||
| 1356 | CONFIG_USB_GADGETFS=m | ||
| 1357 | CONFIG_USB_FILE_STORAGE=m | ||
| 1358 | # CONFIG_USB_FILE_STORAGE_TEST is not set | ||
| 1359 | CONFIG_USB_G_SERIAL=m | ||
| 1360 | # CONFIG_USB_MIDI_GADGET is not set | ||
| 1361 | CONFIG_MMC=y | ||
| 1362 | # CONFIG_MMC_DEBUG is not set | ||
| 1363 | CONFIG_MMC_UNSAFE_RESUME=y | ||
| 1364 | |||
| 1365 | # | ||
| 1366 | # MMC/SD Card Drivers | ||
| 1367 | # | ||
| 1368 | CONFIG_MMC_BLOCK=y | ||
| 1369 | CONFIG_MMC_BLOCK_BOUNCE=y | ||
| 1370 | # CONFIG_SDIO_UART is not set | ||
| 1371 | |||
| 1372 | # | ||
| 1373 | # MMC/SD Host Controller Drivers | ||
| 1374 | # | ||
| 1375 | CONFIG_MMC_PXA=y | ||
| 1376 | CONFIG_NEW_LEDS=y | ||
| 1377 | CONFIG_LEDS_CLASS=y | ||
| 1378 | |||
| 1379 | # | ||
| 1380 | # LED drivers | ||
| 1381 | # | ||
| 1382 | CONFIG_LEDS_SPITZ=y | ||
| 1383 | # CONFIG_LEDS_TOSA is not set | ||
| 1384 | # CONFIG_LEDS_GPIO is not set | ||
| 1385 | |||
| 1386 | # | ||
| 1387 | # LED Triggers | ||
| 1388 | # | ||
| 1389 | CONFIG_LEDS_TRIGGERS=y | ||
| 1390 | CONFIG_LEDS_TRIGGER_TIMER=y | ||
| 1391 | CONFIG_LEDS_TRIGGER_IDE_DISK=y | ||
| 1392 | # CONFIG_LEDS_TRIGGER_HEARTBEAT is not set | ||
| 1393 | CONFIG_RTC_LIB=y | ||
| 1394 | CONFIG_RTC_CLASS=y | ||
| 1395 | CONFIG_RTC_HCTOSYS=y | ||
| 1396 | CONFIG_RTC_HCTOSYS_DEVICE="rtc0" | ||
| 1397 | # CONFIG_RTC_DEBUG is not set | ||
| 1398 | |||
| 1399 | # | ||
| 1400 | # RTC interfaces | ||
| 1401 | # | ||
| 1402 | CONFIG_RTC_INTF_SYSFS=y | ||
| 1403 | CONFIG_RTC_INTF_PROC=y | ||
| 1404 | CONFIG_RTC_INTF_DEV=y | ||
| 1405 | # CONFIG_RTC_INTF_DEV_UIE_EMUL is not set | ||
| 1406 | # CONFIG_RTC_DRV_TEST is not set | ||
| 1407 | |||
| 1408 | # | ||
| 1409 | # I2C RTC drivers | ||
| 1410 | # | ||
| 1411 | # CONFIG_RTC_DRV_DS1307 is not set | ||
| 1412 | # CONFIG_RTC_DRV_DS1374 is not set | ||
| 1413 | # CONFIG_RTC_DRV_DS1672 is not set | ||
| 1414 | # CONFIG_RTC_DRV_MAX6900 is not set | ||
| 1415 | # CONFIG_RTC_DRV_RS5C372 is not set | ||
| 1416 | # CONFIG_RTC_DRV_ISL1208 is not set | ||
| 1417 | # CONFIG_RTC_DRV_X1205 is not set | ||
| 1418 | # CONFIG_RTC_DRV_PCF8563 is not set | ||
| 1419 | # CONFIG_RTC_DRV_PCF8583 is not set | ||
| 1420 | # CONFIG_RTC_DRV_M41T80 is not set | ||
| 1421 | |||
| 1422 | # | ||
| 1423 | # SPI RTC drivers | ||
| 1424 | # | ||
| 1425 | |||
| 1426 | # | ||
| 1427 | # Platform RTC drivers | ||
| 1428 | # | ||
| 1429 | # CONFIG_RTC_DRV_CMOS is not set | ||
| 1430 | # CONFIG_RTC_DRV_DS1553 is not set | ||
| 1431 | # CONFIG_RTC_DRV_STK17TA8 is not set | ||
| 1432 | # CONFIG_RTC_DRV_DS1742 is not set | ||
| 1433 | # CONFIG_RTC_DRV_M48T86 is not set | ||
| 1434 | # CONFIG_RTC_DRV_M48T59 is not set | ||
| 1435 | # CONFIG_RTC_DRV_V3020 is not set | ||
| 1436 | |||
| 1437 | # | ||
| 1438 | # on-CPU RTC drivers | ||
| 1439 | # | ||
| 1440 | CONFIG_RTC_DRV_SA1100=y | ||
| 1441 | |||
| 1442 | # | ||
| 1443 | # File systems | ||
| 1444 | # | ||
| 1445 | CONFIG_EXT2_FS=y | ||
| 1446 | # CONFIG_EXT2_FS_XATTR is not set | ||
| 1447 | # CONFIG_EXT2_FS_XIP is not set | ||
| 1448 | CONFIG_EXT3_FS=m | ||
| 1449 | # CONFIG_EXT3_FS_XATTR is not set | ||
| 1450 | # CONFIG_EXT4DEV_FS is not set | ||
| 1451 | CONFIG_JBD=m | ||
| 1452 | # CONFIG_REISERFS_FS is not set | ||
| 1453 | # CONFIG_JFS_FS is not set | ||
| 1454 | # CONFIG_FS_POSIX_ACL is not set | ||
| 1455 | # CONFIG_XFS_FS is not set | ||
| 1456 | # CONFIG_GFS2_FS is not set | ||
| 1457 | # CONFIG_OCFS2_FS is not set | ||
| 1458 | # CONFIG_MINIX_FS is not set | ||
| 1459 | # CONFIG_ROMFS_FS is not set | ||
| 1460 | CONFIG_INOTIFY=y | ||
| 1461 | CONFIG_INOTIFY_USER=y | ||
| 1462 | # CONFIG_QUOTA is not set | ||
| 1463 | CONFIG_DNOTIFY=y | ||
| 1464 | # CONFIG_AUTOFS_FS is not set | ||
| 1465 | # CONFIG_AUTOFS4_FS is not set | ||
| 1466 | # CONFIG_FUSE_FS is not set | ||
| 1467 | |||
| 1468 | # | ||
| 1469 | # CD-ROM/DVD Filesystems | ||
| 1470 | # | ||
| 1471 | # CONFIG_ISO9660_FS is not set | ||
| 1472 | # CONFIG_UDF_FS is not set | ||
| 1473 | |||
| 1474 | # | ||
| 1475 | # DOS/FAT/NT Filesystems | ||
| 1476 | # | ||
| 1477 | CONFIG_FAT_FS=y | ||
| 1478 | # CONFIG_MSDOS_FS is not set | ||
| 1479 | CONFIG_VFAT_FS=y | ||
| 1480 | CONFIG_FAT_DEFAULT_CODEPAGE=437 | ||
| 1481 | CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" | ||
| 1482 | # CONFIG_NTFS_FS is not set | ||
| 1483 | |||
| 1484 | # | ||
| 1485 | # Pseudo filesystems | ||
| 1486 | # | ||
| 1487 | CONFIG_PROC_FS=y | ||
| 1488 | CONFIG_PROC_SYSCTL=y | ||
| 1489 | CONFIG_SYSFS=y | ||
| 1490 | CONFIG_TMPFS=y | ||
| 1491 | # CONFIG_TMPFS_POSIX_ACL is not set | ||
| 1492 | # CONFIG_HUGETLB_PAGE is not set | ||
| 1493 | # CONFIG_CONFIGFS_FS is not set | ||
| 1494 | |||
| 1495 | # | ||
| 1496 | # Miscellaneous filesystems | ||
| 1497 | # | ||
| 1498 | # CONFIG_ADFS_FS is not set | ||
| 1499 | # CONFIG_AFFS_FS is not set | ||
| 1500 | # CONFIG_HFS_FS is not set | ||
| 1501 | # CONFIG_HFSPLUS_FS is not set | ||
| 1502 | # CONFIG_BEFS_FS is not set | ||
| 1503 | # CONFIG_BFS_FS is not set | ||
| 1504 | # CONFIG_EFS_FS is not set | ||
| 1505 | CONFIG_JFFS2_FS=y | ||
| 1506 | CONFIG_JFFS2_FS_DEBUG=0 | ||
| 1507 | CONFIG_JFFS2_FS_WRITEBUFFER=y | ||
| 1508 | # CONFIG_JFFS2_FS_WBUF_VERIFY is not set | ||
| 1509 | CONFIG_JFFS2_SUMMARY=y | ||
| 1510 | # CONFIG_JFFS2_FS_XATTR is not set | ||
| 1511 | # CONFIG_JFFS2_SYSFS is not set | ||
| 1512 | CONFIG_JFFS2_COMPRESSION_OPTIONS=y | ||
| 1513 | CONFIG_JFFS2_ZLIB=y | ||
| 1514 | CONFIG_JFFS2_LZO=y | ||
| 1515 | CONFIG_JFFS2_RTIME=y | ||
| 1516 | CONFIG_JFFS2_RUBIN=y | ||
| 1517 | # CONFIG_JFFS2_CMODE_NONE is not set | ||
| 1518 | CONFIG_JFFS2_CMODE_PRIORITY=y | ||
| 1519 | # CONFIG_JFFS2_CMODE_SIZE is not set | ||
| 1520 | # CONFIG_JFFS2_CMODE_FAVOURLZO is not set | ||
| 1521 | CONFIG_CRAMFS=m | ||
| 1522 | CONFIG_SQUASHFS=m | ||
| 1523 | # CONFIG_SQUASHFS_EMBEDDED is not set | ||
| 1524 | CONFIG_SQUASHFS_FRAGMENT_CACHE_SIZE=3 | ||
| 1525 | # CONFIG_VXFS_FS is not set | ||
| 1526 | # CONFIG_HPFS_FS is not set | ||
| 1527 | # CONFIG_QNX4FS_FS is not set | ||
| 1528 | # CONFIG_SYSV_FS is not set | ||
| 1529 | # CONFIG_UFS_FS is not set | ||
| 1530 | CONFIG_NETWORK_FILESYSTEMS=y | ||
| 1531 | CONFIG_NFS_FS=m | ||
| 1532 | CONFIG_NFS_V3=y | ||
| 1533 | # CONFIG_NFS_V3_ACL is not set | ||
| 1534 | CONFIG_NFS_V4=y | ||
| 1535 | # CONFIG_NFS_DIRECTIO is not set | ||
| 1536 | CONFIG_NFSD=m | ||
| 1537 | CONFIG_NFSD_V3=y | ||
| 1538 | # CONFIG_NFSD_V3_ACL is not set | ||
| 1539 | CONFIG_NFSD_V4=y | ||
| 1540 | CONFIG_NFSD_TCP=y | ||
| 1541 | CONFIG_LOCKD=m | ||
| 1542 | CONFIG_LOCKD_V4=y | ||
| 1543 | CONFIG_EXPORTFS=m | ||
| 1544 | CONFIG_NFS_COMMON=y | ||
| 1545 | CONFIG_SUNRPC=m | ||
| 1546 | CONFIG_SUNRPC_GSS=m | ||
| 1547 | # CONFIG_SUNRPC_BIND34 is not set | ||
| 1548 | CONFIG_RPCSEC_GSS_KRB5=m | ||
| 1549 | # CONFIG_RPCSEC_GSS_SPKM3 is not set | ||
| 1550 | CONFIG_SMB_FS=m | ||
| 1551 | CONFIG_SMB_NLS_DEFAULT=y | ||
| 1552 | CONFIG_SMB_NLS_REMOTE="cp437" | ||
| 1553 | CONFIG_CIFS=m | ||
| 1554 | # CONFIG_CIFS_STATS is not set | ||
| 1555 | # CONFIG_CIFS_WEAK_PW_HASH is not set | ||
| 1556 | # CONFIG_CIFS_XATTR is not set | ||
| 1557 | # CONFIG_CIFS_DEBUG2 is not set | ||
| 1558 | # CONFIG_CIFS_EXPERIMENTAL is not set | ||
| 1559 | # CONFIG_NCP_FS is not set | ||
| 1560 | # CONFIG_CODA_FS is not set | ||
| 1561 | # CONFIG_AFS_FS is not set | ||
| 1562 | |||
| 1563 | # | ||
| 1564 | # Partition Types | ||
| 1565 | # | ||
| 1566 | CONFIG_PARTITION_ADVANCED=y | ||
| 1567 | # CONFIG_ACORN_PARTITION is not set | ||
| 1568 | # CONFIG_OSF_PARTITION is not set | ||
| 1569 | # CONFIG_AMIGA_PARTITION is not set | ||
| 1570 | # CONFIG_ATARI_PARTITION is not set | ||
| 1571 | # CONFIG_MAC_PARTITION is not set | ||
| 1572 | CONFIG_MSDOS_PARTITION=y | ||
| 1573 | # CONFIG_BSD_DISKLABEL is not set | ||
| 1574 | # CONFIG_MINIX_SUBPARTITION is not set | ||
| 1575 | # CONFIG_SOLARIS_X86_PARTITION is not set | ||
| 1576 | # CONFIG_UNIXWARE_DISKLABEL is not set | ||
| 1577 | # CONFIG_LDM_PARTITION is not set | ||
| 1578 | # CONFIG_SGI_PARTITION is not set | ||
| 1579 | # CONFIG_ULTRIX_PARTITION is not set | ||
| 1580 | # CONFIG_SUN_PARTITION is not set | ||
| 1581 | # CONFIG_KARMA_PARTITION is not set | ||
| 1582 | # CONFIG_EFI_PARTITION is not set | ||
| 1583 | # CONFIG_SYSV68_PARTITION is not set | ||
| 1584 | CONFIG_NLS=y | ||
| 1585 | CONFIG_NLS_DEFAULT="cp437" | ||
| 1586 | CONFIG_NLS_CODEPAGE_437=y | ||
| 1587 | CONFIG_NLS_CODEPAGE_737=m | ||
| 1588 | CONFIG_NLS_CODEPAGE_775=m | ||
| 1589 | CONFIG_NLS_CODEPAGE_850=m | ||
| 1590 | CONFIG_NLS_CODEPAGE_852=m | ||
| 1591 | CONFIG_NLS_CODEPAGE_855=m | ||
| 1592 | CONFIG_NLS_CODEPAGE_857=m | ||
| 1593 | CONFIG_NLS_CODEPAGE_860=m | ||
| 1594 | CONFIG_NLS_CODEPAGE_861=m | ||
| 1595 | CONFIG_NLS_CODEPAGE_862=m | ||
| 1596 | CONFIG_NLS_CODEPAGE_863=m | ||
| 1597 | CONFIG_NLS_CODEPAGE_864=m | ||
| 1598 | CONFIG_NLS_CODEPAGE_865=m | ||
| 1599 | CONFIG_NLS_CODEPAGE_866=m | ||
| 1600 | CONFIG_NLS_CODEPAGE_869=m | ||
| 1601 | CONFIG_NLS_CODEPAGE_936=m | ||
| 1602 | CONFIG_NLS_CODEPAGE_950=m | ||
| 1603 | CONFIG_NLS_CODEPAGE_932=m | ||
| 1604 | CONFIG_NLS_CODEPAGE_949=m | ||
| 1605 | CONFIG_NLS_CODEPAGE_874=m | ||
| 1606 | CONFIG_NLS_ISO8859_8=m | ||
| 1607 | CONFIG_NLS_CODEPAGE_1250=m | ||
| 1608 | CONFIG_NLS_CODEPAGE_1251=m | ||
| 1609 | CONFIG_NLS_ASCII=m | ||
| 1610 | CONFIG_NLS_ISO8859_1=y | ||
| 1611 | CONFIG_NLS_ISO8859_2=m | ||
| 1612 | CONFIG_NLS_ISO8859_3=m | ||
| 1613 | CONFIG_NLS_ISO8859_4=m | ||
| 1614 | CONFIG_NLS_ISO8859_5=m | ||
| 1615 | CONFIG_NLS_ISO8859_6=m | ||
| 1616 | CONFIG_NLS_ISO8859_7=m | ||
| 1617 | CONFIG_NLS_ISO8859_9=m | ||
| 1618 | CONFIG_NLS_ISO8859_13=m | ||
| 1619 | CONFIG_NLS_ISO8859_14=m | ||
| 1620 | CONFIG_NLS_ISO8859_15=m | ||
| 1621 | CONFIG_NLS_KOI8_R=m | ||
| 1622 | CONFIG_NLS_KOI8_U=m | ||
| 1623 | CONFIG_NLS_UTF8=y | ||
| 1624 | # CONFIG_DLM is not set | ||
| 1625 | CONFIG_INSTRUMENTATION=y | ||
| 1626 | CONFIG_PROFILING=y | ||
| 1627 | CONFIG_OPROFILE=m | ||
| 1628 | # CONFIG_MARKERS is not set | ||
| 1629 | |||
| 1630 | # | ||
| 1631 | # Kernel hacking | ||
| 1632 | # | ||
| 1633 | # CONFIG_PRINTK_TIME is not set | ||
| 1634 | CONFIG_ENABLE_WARN_DEPRECATED=y | ||
| 1635 | CONFIG_ENABLE_MUST_CHECK=y | ||
| 1636 | CONFIG_MAGIC_SYSRQ=y | ||
| 1637 | # CONFIG_UNUSED_SYMBOLS is not set | ||
| 1638 | # CONFIG_DEBUG_FS is not set | ||
| 1639 | # CONFIG_HEADERS_CHECK is not set | ||
| 1640 | CONFIG_DEBUG_KERNEL=y | ||
| 1641 | # CONFIG_DEBUG_SHIRQ is not set | ||
| 1642 | # CONFIG_DETECT_SOFTLOCKUP is not set | ||
| 1643 | # CONFIG_SCHED_DEBUG is not set | ||
| 1644 | # CONFIG_SCHEDSTATS is not set | ||
| 1645 | CONFIG_TIMER_STATS=y | ||
| 1646 | # CONFIG_DEBUG_SLAB is not set | ||
| 1647 | # CONFIG_DEBUG_PREEMPT is not set | ||
| 1648 | # CONFIG_DEBUG_RT_MUTEXES is not set | ||
| 1649 | # CONFIG_RT_MUTEX_TESTER is not set | ||
| 1650 | # CONFIG_DEBUG_SPINLOCK is not set | ||
| 1651 | # CONFIG_DEBUG_MUTEXES is not set | ||
| 1652 | # CONFIG_DEBUG_LOCK_ALLOC is not set | ||
| 1653 | # CONFIG_PROVE_LOCKING is not set | ||
| 1654 | # CONFIG_LOCK_STAT is not set | ||
| 1655 | # CONFIG_DEBUG_SPINLOCK_SLEEP is not set | ||
| 1656 | # CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set | ||
| 1657 | # CONFIG_DEBUG_KOBJECT is not set | ||
| 1658 | CONFIG_DEBUG_BUGVERBOSE=y | ||
| 1659 | # CONFIG_DEBUG_INFO is not set | ||
| 1660 | # CONFIG_DEBUG_VM is not set | ||
| 1661 | # CONFIG_DEBUG_LIST is not set | ||
| 1662 | # CONFIG_DEBUG_SG is not set | ||
| 1663 | CONFIG_FRAME_POINTER=y | ||
| 1664 | # CONFIG_FORCED_INLINING is not set | ||
| 1665 | # CONFIG_BOOT_PRINTK_DELAY is not set | ||
| 1666 | # CONFIG_RCU_TORTURE_TEST is not set | ||
| 1667 | # CONFIG_FAULT_INJECTION is not set | ||
| 1668 | # CONFIG_SAMPLES is not set | ||
| 1669 | # CONFIG_DEBUG_USER is not set | ||
| 1670 | CONFIG_DEBUG_ERRORS=y | ||
| 1671 | # CONFIG_DEBUG_LL is not set | ||
| 1672 | |||
| 1673 | # | ||
| 1674 | # Security options | ||
| 1675 | # | ||
| 1676 | # CONFIG_KEYS is not set | ||
| 1677 | # CONFIG_SECURITY is not set | ||
| 1678 | # CONFIG_SECURITY_FILE_CAPABILITIES is not set | ||
| 1679 | CONFIG_CRYPTO=y | ||
| 1680 | CONFIG_CRYPTO_ALGAPI=m | ||
| 1681 | CONFIG_CRYPTO_BLKCIPHER=m | ||
| 1682 | CONFIG_CRYPTO_HASH=m | ||
| 1683 | CONFIG_CRYPTO_MANAGER=m | ||
| 1684 | CONFIG_CRYPTO_HMAC=m | ||
| 1685 | # CONFIG_CRYPTO_XCBC is not set | ||
| 1686 | CONFIG_CRYPTO_NULL=m | ||
| 1687 | CONFIG_CRYPTO_MD4=m | ||
| 1688 | CONFIG_CRYPTO_MD5=m | ||
| 1689 | CONFIG_CRYPTO_SHA1=m | ||
| 1690 | CONFIG_CRYPTO_SHA256=m | ||
| 1691 | CONFIG_CRYPTO_SHA512=m | ||
| 1692 | CONFIG_CRYPTO_WP512=m | ||
| 1693 | # CONFIG_CRYPTO_TGR192 is not set | ||
| 1694 | # CONFIG_CRYPTO_GF128MUL is not set | ||
| 1695 | CONFIG_CRYPTO_ECB=m | ||
| 1696 | CONFIG_CRYPTO_CBC=m | ||
| 1697 | CONFIG_CRYPTO_PCBC=m | ||
| 1698 | # CONFIG_CRYPTO_LRW is not set | ||
| 1699 | # CONFIG_CRYPTO_XTS is not set | ||
| 1700 | # CONFIG_CRYPTO_CRYPTD is not set | ||
| 1701 | CONFIG_CRYPTO_DES=m | ||
| 1702 | # CONFIG_CRYPTO_FCRYPT is not set | ||
| 1703 | CONFIG_CRYPTO_BLOWFISH=m | ||
| 1704 | CONFIG_CRYPTO_TWOFISH=m | ||
| 1705 | CONFIG_CRYPTO_TWOFISH_COMMON=m | ||
| 1706 | CONFIG_CRYPTO_SERPENT=m | ||
| 1707 | CONFIG_CRYPTO_AES=m | ||
| 1708 | CONFIG_CRYPTO_CAST5=m | ||
| 1709 | CONFIG_CRYPTO_CAST6=m | ||
| 1710 | CONFIG_CRYPTO_TEA=m | ||
| 1711 | CONFIG_CRYPTO_ARC4=m | ||
| 1712 | CONFIG_CRYPTO_KHAZAD=m | ||
| 1713 | CONFIG_CRYPTO_ANUBIS=m | ||
| 1714 | # CONFIG_CRYPTO_SEED is not set | ||
| 1715 | CONFIG_CRYPTO_DEFLATE=m | ||
| 1716 | CONFIG_CRYPTO_LZO=m | ||
| 1717 | CONFIG_CRYPTO_MICHAEL_MIC=m | ||
| 1718 | CONFIG_CRYPTO_CRC32C=m | ||
| 1719 | CONFIG_CRYPTO_CAMELLIA=m | ||
| 1720 | CONFIG_CRYPTO_TEST=m | ||
| 1721 | # CONFIG_CRYPTO_AUTHENC is not set | ||
| 1722 | # CONFIG_CRYPTO_HW is not set | ||
| 1723 | |||
| 1724 | # | ||
| 1725 | # Library routines | ||
| 1726 | # | ||
| 1727 | CONFIG_BITREVERSE=y | ||
| 1728 | CONFIG_CRC_CCITT=y | ||
| 1729 | # CONFIG_CRC16 is not set | ||
| 1730 | # CONFIG_CRC_ITU_T is not set | ||
| 1731 | CONFIG_CRC32=y | ||
| 1732 | # CONFIG_CRC7 is not set | ||
| 1733 | CONFIG_LIBCRC32C=m | ||
| 1734 | CONFIG_ZLIB_INFLATE=y | ||
| 1735 | CONFIG_ZLIB_DEFLATE=y | ||
| 1736 | CONFIG_LZO_COMPRESS=y | ||
| 1737 | CONFIG_LZO_DECOMPRESS=y | ||
| 1738 | CONFIG_PLIST=y | ||
| 1739 | CONFIG_HAS_IOMEM=y | ||
| 1740 | CONFIG_HAS_IOPORT=y | ||
| 1741 | CONFIG_HAS_DMA=y | ||
diff --git a/meta/packages/linux/linux-rp-2.6.25+2.6.26-rc4/defconfig-bootcdx86 b/meta/packages/linux/linux-rp-2.6.25+2.6.26-rc4/defconfig-bootcdx86 new file mode 100644 index 0000000000..35e9b5cd22 --- /dev/null +++ b/meta/packages/linux/linux-rp-2.6.25+2.6.26-rc4/defconfig-bootcdx86 | |||
| @@ -0,0 +1,1994 @@ | |||
| 1 | # | ||
| 2 | # Automatically generated make config: don't edit | ||
| 3 | # Linux kernel version: 2.6.24-rc8 | ||
| 4 | # Sun Jan 20 18:34:58 2008 | ||
| 5 | # | ||
| 6 | # CONFIG_64BIT is not set | ||
| 7 | CONFIG_X86_32=y | ||
| 8 | # CONFIG_X86_64 is not set | ||
| 9 | CONFIG_X86=y | ||
| 10 | CONFIG_GENERIC_TIME=y | ||
| 11 | CONFIG_GENERIC_CMOS_UPDATE=y | ||
| 12 | CONFIG_CLOCKSOURCE_WATCHDOG=y | ||
| 13 | CONFIG_GENERIC_CLOCKEVENTS=y | ||
| 14 | CONFIG_GENERIC_CLOCKEVENTS_BROADCAST=y | ||
| 15 | CONFIG_LOCKDEP_SUPPORT=y | ||
| 16 | CONFIG_STACKTRACE_SUPPORT=y | ||
| 17 | CONFIG_SEMAPHORE_SLEEPERS=y | ||
| 18 | CONFIG_MMU=y | ||
| 19 | CONFIG_ZONE_DMA=y | ||
| 20 | CONFIG_QUICKLIST=y | ||
| 21 | CONFIG_GENERIC_ISA_DMA=y | ||
| 22 | CONFIG_GENERIC_IOMAP=y | ||
| 23 | CONFIG_GENERIC_BUG=y | ||
| 24 | CONFIG_GENERIC_HWEIGHT=y | ||
| 25 | CONFIG_ARCH_MAY_HAVE_PC_FDC=y | ||
| 26 | CONFIG_DMI=y | ||
| 27 | # CONFIG_RWSEM_GENERIC_SPINLOCK is not set | ||
| 28 | CONFIG_RWSEM_XCHGADD_ALGORITHM=y | ||
| 29 | # CONFIG_ARCH_HAS_ILOG2_U32 is not set | ||
| 30 | # CONFIG_ARCH_HAS_ILOG2_U64 is not set | ||
| 31 | CONFIG_GENERIC_CALIBRATE_DELAY=y | ||
| 32 | # CONFIG_GENERIC_TIME_VSYSCALL is not set | ||
| 33 | CONFIG_ARCH_SUPPORTS_OPROFILE=y | ||
| 34 | # CONFIG_ZONE_DMA32 is not set | ||
| 35 | CONFIG_ARCH_POPULATES_NODE_MAP=y | ||
| 36 | # CONFIG_AUDIT_ARCH is not set | ||
| 37 | CONFIG_GENERIC_HARDIRQS=y | ||
| 38 | CONFIG_GENERIC_IRQ_PROBE=y | ||
| 39 | CONFIG_GENERIC_PENDING_IRQ=y | ||
| 40 | CONFIG_X86_SMP=y | ||
| 41 | CONFIG_X86_HT=y | ||
| 42 | CONFIG_X86_BIOS_REBOOT=y | ||
| 43 | CONFIG_X86_TRAMPOLINE=y | ||
| 44 | CONFIG_KTIME_SCALAR=y | ||
| 45 | CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" | ||
| 46 | |||
| 47 | # | ||
| 48 | # General setup | ||
| 49 | # | ||
| 50 | CONFIG_EXPERIMENTAL=y | ||
| 51 | CONFIG_LOCK_KERNEL=y | ||
| 52 | CONFIG_INIT_ENV_ARG_LIMIT=32 | ||
| 53 | CONFIG_LOCALVERSION="" | ||
| 54 | # CONFIG_LOCALVERSION_AUTO is not set | ||
| 55 | CONFIG_SWAP=y | ||
| 56 | CONFIG_SYSVIPC=y | ||
| 57 | CONFIG_SYSVIPC_SYSCTL=y | ||
| 58 | CONFIG_POSIX_MQUEUE=y | ||
| 59 | # CONFIG_BSD_PROCESS_ACCT is not set | ||
| 60 | # CONFIG_TASKSTATS is not set | ||
| 61 | # CONFIG_USER_NS is not set | ||
| 62 | # CONFIG_PID_NS is not set | ||
| 63 | CONFIG_AUDIT=y | ||
| 64 | CONFIG_AUDITSYSCALL=y | ||
| 65 | CONFIG_AUDIT_TREE=y | ||
| 66 | # CONFIG_IKCONFIG is not set | ||
| 67 | CONFIG_LOG_BUF_SHIFT=15 | ||
| 68 | # CONFIG_CGROUPS is not set | ||
| 69 | CONFIG_FAIR_GROUP_SCHED=y | ||
| 70 | CONFIG_FAIR_USER_SCHED=y | ||
| 71 | # CONFIG_FAIR_CGROUP_SCHED is not set | ||
| 72 | CONFIG_SYSFS_DEPRECATED=y | ||
| 73 | # CONFIG_RELAY is not set | ||
| 74 | CONFIG_BLK_DEV_INITRD=y | ||
| 75 | CONFIG_INITRAMFS_SOURCE="" | ||
| 76 | # CONFIG_CC_OPTIMIZE_FOR_SIZE is not set | ||
| 77 | CONFIG_SYSCTL=y | ||
| 78 | CONFIG_EMBEDDED=y | ||
| 79 | CONFIG_UID16=y | ||
| 80 | CONFIG_SYSCTL_SYSCALL=y | ||
| 81 | CONFIG_KALLSYMS=y | ||
| 82 | # CONFIG_KALLSYMS_EXTRA_PASS is not set | ||
| 83 | CONFIG_HOTPLUG=y | ||
| 84 | CONFIG_PRINTK=y | ||
| 85 | CONFIG_BUG=y | ||
| 86 | CONFIG_ELF_CORE=y | ||
| 87 | CONFIG_BASE_FULL=y | ||
| 88 | CONFIG_FUTEX=y | ||
| 89 | CONFIG_ANON_INODES=y | ||
| 90 | CONFIG_EPOLL=y | ||
| 91 | CONFIG_SIGNALFD=y | ||
| 92 | CONFIG_EVENTFD=y | ||
| 93 | CONFIG_SHMEM=y | ||
| 94 | CONFIG_VM_EVENT_COUNTERS=y | ||
| 95 | CONFIG_SLAB=y | ||
| 96 | # CONFIG_SLUB is not set | ||
| 97 | # CONFIG_SLOB is not set | ||
| 98 | CONFIG_SLABINFO=y | ||
| 99 | CONFIG_RT_MUTEXES=y | ||
| 100 | # CONFIG_TINY_SHMEM is not set | ||
| 101 | CONFIG_BASE_SMALL=0 | ||
| 102 | CONFIG_MODULES=y | ||
| 103 | CONFIG_MODULE_UNLOAD=y | ||
| 104 | CONFIG_MODULE_FORCE_UNLOAD=y | ||
| 105 | # CONFIG_MODVERSIONS is not set | ||
| 106 | # CONFIG_MODULE_SRCVERSION_ALL is not set | ||
| 107 | CONFIG_KMOD=y | ||
| 108 | CONFIG_STOP_MACHINE=y | ||
| 109 | CONFIG_BLOCK=y | ||
| 110 | CONFIG_LBD=y | ||
| 111 | # CONFIG_BLK_DEV_IO_TRACE is not set | ||
| 112 | # CONFIG_LSF is not set | ||
| 113 | # CONFIG_BLK_DEV_BSG is not set | ||
| 114 | |||
| 115 | # | ||
| 116 | # IO Schedulers | ||
| 117 | # | ||
| 118 | CONFIG_IOSCHED_NOOP=y | ||
| 119 | CONFIG_IOSCHED_AS=y | ||
| 120 | CONFIG_IOSCHED_DEADLINE=m | ||
| 121 | CONFIG_IOSCHED_CFQ=m | ||
| 122 | CONFIG_DEFAULT_AS=y | ||
| 123 | # CONFIG_DEFAULT_DEADLINE is not set | ||
| 124 | # CONFIG_DEFAULT_CFQ is not set | ||
| 125 | # CONFIG_DEFAULT_NOOP is not set | ||
| 126 | CONFIG_DEFAULT_IOSCHED="anticipatory" | ||
| 127 | |||
| 128 | # | ||
| 129 | # Processor type and features | ||
| 130 | # | ||
| 131 | CONFIG_TICK_ONESHOT=y | ||
| 132 | CONFIG_NO_HZ=y | ||
| 133 | CONFIG_HIGH_RES_TIMERS=y | ||
| 134 | CONFIG_GENERIC_CLOCKEVENTS_BUILD=y | ||
| 135 | CONFIG_SMP=y | ||
| 136 | CONFIG_X86_PC=y | ||
| 137 | # CONFIG_X86_ELAN is not set | ||
| 138 | # CONFIG_X86_VOYAGER is not set | ||
| 139 | # CONFIG_X86_NUMAQ is not set | ||
| 140 | # CONFIG_X86_SUMMIT is not set | ||
| 141 | # CONFIG_X86_BIGSMP is not set | ||
| 142 | # CONFIG_X86_VISWS is not set | ||
| 143 | # CONFIG_X86_GENERICARCH is not set | ||
| 144 | # CONFIG_X86_ES7000 is not set | ||
| 145 | # CONFIG_X86_VSMP is not set | ||
| 146 | CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y | ||
| 147 | # CONFIG_PARAVIRT_GUEST is not set | ||
| 148 | # CONFIG_M386 is not set | ||
| 149 | # CONFIG_M486 is not set | ||
| 150 | # CONFIG_M586 is not set | ||
| 151 | # CONFIG_M586TSC is not set | ||
| 152 | # CONFIG_M586MMX is not set | ||
| 153 | CONFIG_M686=y | ||
| 154 | # CONFIG_MPENTIUMII is not set | ||
| 155 | # CONFIG_MPENTIUMIII is not set | ||
| 156 | # CONFIG_MPENTIUMM is not set | ||
| 157 | # CONFIG_MPENTIUM4 is not set | ||
| 158 | # CONFIG_MK6 is not set | ||
| 159 | # CONFIG_MK7 is not set | ||
| 160 | # CONFIG_MK8 is not set | ||
| 161 | # CONFIG_MCRUSOE is not set | ||
| 162 | # CONFIG_MEFFICEON is not set | ||
| 163 | # CONFIG_MWINCHIPC6 is not set | ||
| 164 | # CONFIG_MWINCHIP2 is not set | ||
| 165 | # CONFIG_MWINCHIP3D is not set | ||
| 166 | # CONFIG_MGEODEGX1 is not set | ||
| 167 | # CONFIG_MGEODE_LX is not set | ||
| 168 | # CONFIG_MCYRIXIII is not set | ||
| 169 | # CONFIG_MVIAC3_2 is not set | ||
| 170 | # CONFIG_MVIAC7 is not set | ||
| 171 | # CONFIG_MPSC is not set | ||
| 172 | # CONFIG_MCORE2 is not set | ||
| 173 | # CONFIG_GENERIC_CPU is not set | ||
| 174 | CONFIG_X86_GENERIC=y | ||
| 175 | CONFIG_X86_CMPXCHG=y | ||
| 176 | CONFIG_X86_L1_CACHE_SHIFT=7 | ||
| 177 | CONFIG_X86_XADD=y | ||
| 178 | CONFIG_X86_PPRO_FENCE=y | ||
| 179 | CONFIG_X86_WP_WORKS_OK=y | ||
| 180 | CONFIG_X86_INVLPG=y | ||
| 181 | CONFIG_X86_BSWAP=y | ||
| 182 | CONFIG_X86_POPAD_OK=y | ||
| 183 | CONFIG_X86_GOOD_APIC=y | ||
| 184 | CONFIG_X86_INTEL_USERCOPY=y | ||
| 185 | CONFIG_X86_USE_PPRO_CHECKSUM=y | ||
| 186 | CONFIG_X86_TSC=y | ||
| 187 | CONFIG_X86_CMOV=y | ||
| 188 | CONFIG_X86_MINIMUM_CPU_FAMILY=4 | ||
| 189 | CONFIG_HPET_TIMER=y | ||
| 190 | CONFIG_NR_CPUS=8 | ||
| 191 | CONFIG_SCHED_SMT=y | ||
| 192 | CONFIG_SCHED_MC=y | ||
| 193 | CONFIG_PREEMPT_NONE=y | ||
| 194 | # CONFIG_PREEMPT_VOLUNTARY is not set | ||
| 195 | # CONFIG_PREEMPT is not set | ||
| 196 | CONFIG_PREEMPT_BKL=y | ||
| 197 | CONFIG_X86_LOCAL_APIC=y | ||
| 198 | CONFIG_X86_IO_APIC=y | ||
| 199 | CONFIG_X86_MCE=y | ||
| 200 | CONFIG_X86_MCE_NONFATAL=y | ||
| 201 | CONFIG_X86_MCE_P4THERMAL=y | ||
| 202 | CONFIG_VM86=y | ||
| 203 | # CONFIG_TOSHIBA is not set | ||
| 204 | # CONFIG_I8K is not set | ||
| 205 | # CONFIG_X86_REBOOTFIXUPS is not set | ||
| 206 | # CONFIG_MICROCODE is not set | ||
| 207 | # CONFIG_X86_MSR is not set | ||
| 208 | # CONFIG_X86_CPUID is not set | ||
| 209 | CONFIG_NOHIGHMEM=y | ||
| 210 | # CONFIG_HIGHMEM4G is not set | ||
| 211 | # CONFIG_HIGHMEM64G is not set | ||
| 212 | CONFIG_VMSPLIT_3G=y | ||
| 213 | # CONFIG_VMSPLIT_3G_OPT is not set | ||
| 214 | # CONFIG_VMSPLIT_2G is not set | ||
| 215 | # CONFIG_VMSPLIT_2G_OPT is not set | ||
| 216 | # CONFIG_VMSPLIT_1G is not set | ||
| 217 | CONFIG_PAGE_OFFSET=0xC0000000 | ||
| 218 | # CONFIG_X86_PAE is not set | ||
| 219 | CONFIG_ARCH_FLATMEM_ENABLE=y | ||
| 220 | CONFIG_ARCH_SPARSEMEM_ENABLE=y | ||
| 221 | CONFIG_ARCH_SELECT_MEMORY_MODEL=y | ||
| 222 | CONFIG_SELECT_MEMORY_MODEL=y | ||
| 223 | CONFIG_FLATMEM_MANUAL=y | ||
| 224 | # CONFIG_DISCONTIGMEM_MANUAL is not set | ||
| 225 | # CONFIG_SPARSEMEM_MANUAL is not set | ||
| 226 | CONFIG_FLATMEM=y | ||
| 227 | CONFIG_FLAT_NODE_MEM_MAP=y | ||
| 228 | CONFIG_SPARSEMEM_STATIC=y | ||
| 229 | # CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set | ||
| 230 | CONFIG_SPLIT_PTLOCK_CPUS=4 | ||
| 231 | # CONFIG_RESOURCES_64BIT is not set | ||
| 232 | CONFIG_ZONE_DMA_FLAG=1 | ||
| 233 | CONFIG_BOUNCE=y | ||
| 234 | CONFIG_NR_QUICK=1 | ||
| 235 | CONFIG_VIRT_TO_BUS=y | ||
| 236 | # CONFIG_MATH_EMULATION is not set | ||
| 237 | CONFIG_MTRR=y | ||
| 238 | # CONFIG_EFI is not set | ||
| 239 | CONFIG_IRQBALANCE=y | ||
| 240 | CONFIG_SECCOMP=y | ||
| 241 | # CONFIG_HZ_100 is not set | ||
| 242 | CONFIG_HZ_250=y | ||
| 243 | # CONFIG_HZ_300 is not set | ||
| 244 | # CONFIG_HZ_1000 is not set | ||
| 245 | CONFIG_HZ=250 | ||
| 246 | CONFIG_KEXEC=y | ||
| 247 | CONFIG_PHYSICAL_START=0x100000 | ||
| 248 | # CONFIG_RELOCATABLE is not set | ||
| 249 | CONFIG_PHYSICAL_ALIGN=0x100000 | ||
| 250 | CONFIG_HOTPLUG_CPU=y | ||
| 251 | CONFIG_COMPAT_VDSO=y | ||
| 252 | |||
| 253 | # | ||
| 254 | # Power management options | ||
| 255 | # | ||
| 256 | CONFIG_PM=y | ||
| 257 | CONFIG_PM_LEGACY=y | ||
| 258 | # CONFIG_PM_DEBUG is not set | ||
| 259 | CONFIG_PM_SLEEP_SMP=y | ||
| 260 | CONFIG_PM_SLEEP=y | ||
| 261 | CONFIG_SUSPEND_SMP_POSSIBLE=y | ||
| 262 | CONFIG_SUSPEND=y | ||
| 263 | CONFIG_HIBERNATION_SMP_POSSIBLE=y | ||
| 264 | # CONFIG_HIBERNATION is not set | ||
| 265 | CONFIG_ACPI=y | ||
| 266 | CONFIG_ACPI_SLEEP=y | ||
| 267 | # CONFIG_ACPI_PROCFS is not set | ||
| 268 | CONFIG_ACPI_PROCFS_POWER=y | ||
| 269 | CONFIG_ACPI_SYSFS_POWER=y | ||
| 270 | CONFIG_ACPI_PROC_EVENT=y | ||
| 271 | CONFIG_ACPI_AC=y | ||
| 272 | CONFIG_ACPI_BATTERY=y | ||
| 273 | CONFIG_ACPI_BUTTON=y | ||
| 274 | # CONFIG_ACPI_VIDEO is not set | ||
| 275 | CONFIG_ACPI_FAN=y | ||
| 276 | # CONFIG_ACPI_DOCK is not set | ||
| 277 | CONFIG_ACPI_PROCESSOR=y | ||
| 278 | CONFIG_ACPI_HOTPLUG_CPU=y | ||
| 279 | CONFIG_ACPI_THERMAL=y | ||
| 280 | # CONFIG_ACPI_ASUS is not set | ||
| 281 | # CONFIG_ACPI_TOSHIBA is not set | ||
| 282 | CONFIG_ACPI_BLACKLIST_YEAR=0 | ||
| 283 | # CONFIG_ACPI_DEBUG is not set | ||
| 284 | CONFIG_ACPI_EC=y | ||
| 285 | CONFIG_ACPI_POWER=y | ||
| 286 | CONFIG_ACPI_SYSTEM=y | ||
| 287 | CONFIG_X86_PM_TIMER=y | ||
| 288 | CONFIG_ACPI_CONTAINER=y | ||
| 289 | # CONFIG_ACPI_SBS is not set | ||
| 290 | # CONFIG_APM is not set | ||
| 291 | |||
| 292 | # | ||
| 293 | # CPU Frequency scaling | ||
| 294 | # | ||
| 295 | # CONFIG_CPU_FREQ is not set | ||
| 296 | # CONFIG_CPU_IDLE is not set | ||
| 297 | |||
| 298 | # | ||
| 299 | # Bus options (PCI etc.) | ||
| 300 | # | ||
| 301 | CONFIG_PCI=y | ||
| 302 | # CONFIG_PCI_GOBIOS is not set | ||
| 303 | # CONFIG_PCI_GOMMCONFIG is not set | ||
| 304 | # CONFIG_PCI_GODIRECT is not set | ||
| 305 | CONFIG_PCI_GOANY=y | ||
| 306 | CONFIG_PCI_BIOS=y | ||
| 307 | CONFIG_PCI_DIRECT=y | ||
| 308 | CONFIG_PCI_MMCONFIG=y | ||
| 309 | CONFIG_PCI_DOMAINS=y | ||
| 310 | CONFIG_PCIEPORTBUS=y | ||
| 311 | CONFIG_PCIEAER=y | ||
| 312 | CONFIG_ARCH_SUPPORTS_MSI=y | ||
| 313 | CONFIG_PCI_MSI=y | ||
| 314 | CONFIG_PCI_LEGACY=y | ||
| 315 | CONFIG_HT_IRQ=y | ||
| 316 | CONFIG_ISA_DMA_API=y | ||
| 317 | CONFIG_ISA=y | ||
| 318 | # CONFIG_EISA is not set | ||
| 319 | # CONFIG_MCA is not set | ||
| 320 | # CONFIG_SCx200 is not set | ||
| 321 | CONFIG_K8_NB=y | ||
| 322 | # CONFIG_PCCARD is not set | ||
| 323 | # CONFIG_HOTPLUG_PCI is not set | ||
| 324 | |||
| 325 | # | ||
| 326 | # Executable file formats / Emulations | ||
| 327 | # | ||
| 328 | CONFIG_BINFMT_ELF=y | ||
| 329 | CONFIG_BINFMT_AOUT=m | ||
| 330 | CONFIG_BINFMT_MISC=m | ||
| 331 | |||
| 332 | # | ||
| 333 | # Networking | ||
| 334 | # | ||
| 335 | CONFIG_NET=y | ||
| 336 | |||
| 337 | # | ||
| 338 | # Networking options | ||
| 339 | # | ||
| 340 | CONFIG_PACKET=m | ||
| 341 | CONFIG_PACKET_MMAP=y | ||
| 342 | CONFIG_UNIX=y | ||
| 343 | CONFIG_XFRM=y | ||
| 344 | # CONFIG_XFRM_USER is not set | ||
| 345 | # CONFIG_XFRM_SUB_POLICY is not set | ||
| 346 | # CONFIG_XFRM_MIGRATE is not set | ||
| 347 | # CONFIG_NET_KEY is not set | ||
| 348 | CONFIG_INET=y | ||
| 349 | # CONFIG_IP_MULTICAST is not set | ||
| 350 | # CONFIG_IP_ADVANCED_ROUTER is not set | ||
| 351 | CONFIG_IP_FIB_HASH=y | ||
| 352 | CONFIG_IP_PNP=y | ||
| 353 | CONFIG_IP_PNP_DHCP=y | ||
| 354 | CONFIG_IP_PNP_BOOTP=y | ||
| 355 | # CONFIG_IP_PNP_RARP is not set | ||
| 356 | # CONFIG_NET_IPIP is not set | ||
| 357 | # CONFIG_NET_IPGRE is not set | ||
| 358 | # CONFIG_ARPD is not set | ||
| 359 | CONFIG_SYN_COOKIES=y | ||
| 360 | # CONFIG_INET_AH is not set | ||
| 361 | # CONFIG_INET_ESP is not set | ||
| 362 | # CONFIG_INET_IPCOMP is not set | ||
| 363 | # CONFIG_INET_XFRM_TUNNEL is not set | ||
| 364 | CONFIG_INET_TUNNEL=m | ||
| 365 | CONFIG_INET_XFRM_MODE_TRANSPORT=m | ||
| 366 | CONFIG_INET_XFRM_MODE_TUNNEL=m | ||
| 367 | CONFIG_INET_XFRM_MODE_BEET=m | ||
| 368 | # CONFIG_INET_LRO is not set | ||
| 369 | CONFIG_INET_DIAG=m | ||
| 370 | CONFIG_INET_TCP_DIAG=m | ||
| 371 | # CONFIG_TCP_CONG_ADVANCED is not set | ||
| 372 | CONFIG_TCP_CONG_CUBIC=y | ||
| 373 | CONFIG_DEFAULT_TCP_CONG="cubic" | ||
| 374 | # CONFIG_TCP_MD5SIG is not set | ||
| 375 | # CONFIG_IP_VS is not set | ||
| 376 | CONFIG_IPV6=m | ||
| 377 | # CONFIG_IPV6_PRIVACY is not set | ||
| 378 | # CONFIG_IPV6_ROUTER_PREF is not set | ||
| 379 | # CONFIG_IPV6_OPTIMISTIC_DAD is not set | ||
| 380 | CONFIG_INET6_AH=m | ||
| 381 | CONFIG_INET6_ESP=m | ||
| 382 | CONFIG_INET6_IPCOMP=m | ||
| 383 | # CONFIG_IPV6_MIP6 is not set | ||
| 384 | CONFIG_INET6_XFRM_TUNNEL=m | ||
| 385 | CONFIG_INET6_TUNNEL=m | ||
| 386 | CONFIG_INET6_XFRM_MODE_TRANSPORT=m | ||
| 387 | CONFIG_INET6_XFRM_MODE_TUNNEL=m | ||
| 388 | CONFIG_INET6_XFRM_MODE_BEET=m | ||
| 389 | # CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION is not set | ||
| 390 | CONFIG_IPV6_SIT=m | ||
| 391 | CONFIG_IPV6_TUNNEL=m | ||
| 392 | # CONFIG_IPV6_MULTIPLE_TABLES is not set | ||
| 393 | # CONFIG_NETWORK_SECMARK is not set | ||
| 394 | CONFIG_NETFILTER=y | ||
| 395 | # CONFIG_NETFILTER_DEBUG is not set | ||
| 396 | |||
| 397 | # | ||
| 398 | # Core Netfilter Configuration | ||
| 399 | # | ||
| 400 | # CONFIG_NETFILTER_NETLINK is not set | ||
| 401 | # CONFIG_NF_CONNTRACK_ENABLED is not set | ||
| 402 | # CONFIG_NF_CONNTRACK is not set | ||
| 403 | CONFIG_NETFILTER_XTABLES=m | ||
| 404 | # CONFIG_NETFILTER_XT_TARGET_CLASSIFY is not set | ||
| 405 | # CONFIG_NETFILTER_XT_TARGET_DSCP is not set | ||
| 406 | # CONFIG_NETFILTER_XT_TARGET_MARK is not set | ||
| 407 | # CONFIG_NETFILTER_XT_TARGET_NFQUEUE is not set | ||
| 408 | # CONFIG_NETFILTER_XT_TARGET_NFLOG is not set | ||
| 409 | # CONFIG_NETFILTER_XT_TARGET_TRACE is not set | ||
| 410 | # CONFIG_NETFILTER_XT_TARGET_TCPMSS is not set | ||
| 411 | # CONFIG_NETFILTER_XT_MATCH_COMMENT is not set | ||
| 412 | # CONFIG_NETFILTER_XT_MATCH_DCCP is not set | ||
| 413 | # CONFIG_NETFILTER_XT_MATCH_DSCP is not set | ||
| 414 | # CONFIG_NETFILTER_XT_MATCH_ESP is not set | ||
| 415 | # CONFIG_NETFILTER_XT_MATCH_LENGTH is not set | ||
| 416 | # CONFIG_NETFILTER_XT_MATCH_LIMIT is not set | ||
| 417 | # CONFIG_NETFILTER_XT_MATCH_MAC is not set | ||
| 418 | # CONFIG_NETFILTER_XT_MATCH_MARK is not set | ||
| 419 | # CONFIG_NETFILTER_XT_MATCH_POLICY is not set | ||
| 420 | # CONFIG_NETFILTER_XT_MATCH_MULTIPORT is not set | ||
| 421 | # CONFIG_NETFILTER_XT_MATCH_PKTTYPE is not set | ||
| 422 | # CONFIG_NETFILTER_XT_MATCH_QUOTA is not set | ||
| 423 | # CONFIG_NETFILTER_XT_MATCH_REALM is not set | ||
| 424 | # CONFIG_NETFILTER_XT_MATCH_SCTP is not set | ||
| 425 | # CONFIG_NETFILTER_XT_MATCH_STATISTIC is not set | ||
| 426 | # CONFIG_NETFILTER_XT_MATCH_STRING is not set | ||
| 427 | # CONFIG_NETFILTER_XT_MATCH_TCPMSS is not set | ||
| 428 | # CONFIG_NETFILTER_XT_MATCH_TIME is not set | ||
| 429 | # CONFIG_NETFILTER_XT_MATCH_U32 is not set | ||
| 430 | # CONFIG_NETFILTER_XT_MATCH_HASHLIMIT is not set | ||
| 431 | |||
| 432 | # | ||
| 433 | # IP: Netfilter Configuration | ||
| 434 | # | ||
| 435 | CONFIG_IP_NF_QUEUE=m | ||
| 436 | CONFIG_IP_NF_IPTABLES=m | ||
| 437 | CONFIG_IP_NF_MATCH_IPRANGE=m | ||
| 438 | CONFIG_IP_NF_MATCH_TOS=m | ||
| 439 | CONFIG_IP_NF_MATCH_RECENT=m | ||
| 440 | CONFIG_IP_NF_MATCH_ECN=m | ||
| 441 | CONFIG_IP_NF_MATCH_AH=m | ||
| 442 | CONFIG_IP_NF_MATCH_TTL=m | ||
| 443 | CONFIG_IP_NF_MATCH_OWNER=m | ||
| 444 | CONFIG_IP_NF_MATCH_ADDRTYPE=m | ||
| 445 | CONFIG_IP_NF_FILTER=m | ||
| 446 | CONFIG_IP_NF_TARGET_REJECT=m | ||
| 447 | CONFIG_IP_NF_TARGET_LOG=m | ||
| 448 | CONFIG_IP_NF_TARGET_ULOG=m | ||
| 449 | CONFIG_IP_NF_MANGLE=m | ||
| 450 | CONFIG_IP_NF_TARGET_TOS=m | ||
| 451 | CONFIG_IP_NF_TARGET_ECN=m | ||
| 452 | CONFIG_IP_NF_TARGET_TTL=m | ||
| 453 | CONFIG_IP_NF_RAW=m | ||
| 454 | CONFIG_IP_NF_ARPTABLES=m | ||
| 455 | CONFIG_IP_NF_ARPFILTER=m | ||
| 456 | CONFIG_IP_NF_ARP_MANGLE=m | ||
| 457 | |||
| 458 | # | ||
| 459 | # IPv6: Netfilter Configuration (EXPERIMENTAL) | ||
| 460 | # | ||
| 461 | # CONFIG_IP6_NF_QUEUE is not set | ||
| 462 | # CONFIG_IP6_NF_IPTABLES is not set | ||
| 463 | # CONFIG_IP_DCCP is not set | ||
| 464 | # CONFIG_IP_SCTP is not set | ||
| 465 | # CONFIG_TIPC is not set | ||
| 466 | # CONFIG_ATM is not set | ||
| 467 | # CONFIG_BRIDGE is not set | ||
| 468 | # CONFIG_VLAN_8021Q is not set | ||
| 469 | # CONFIG_DECNET is not set | ||
| 470 | # CONFIG_LLC2 is not set | ||
| 471 | # CONFIG_IPX is not set | ||
| 472 | # CONFIG_ATALK is not set | ||
| 473 | # CONFIG_X25 is not set | ||
| 474 | # CONFIG_LAPB is not set | ||
| 475 | # CONFIG_ECONET is not set | ||
| 476 | # CONFIG_WAN_ROUTER is not set | ||
| 477 | # CONFIG_NET_SCHED is not set | ||
| 478 | |||
| 479 | # | ||
| 480 | # Network testing | ||
| 481 | # | ||
| 482 | # CONFIG_NET_PKTGEN is not set | ||
| 483 | # CONFIG_HAMRADIO is not set | ||
| 484 | CONFIG_IRDA=m | ||
| 485 | |||
| 486 | # | ||
| 487 | # IrDA protocols | ||
| 488 | # | ||
| 489 | CONFIG_IRLAN=m | ||
| 490 | CONFIG_IRNET=m | ||
| 491 | CONFIG_IRCOMM=m | ||
| 492 | # CONFIG_IRDA_ULTRA is not set | ||
| 493 | |||
| 494 | # | ||
| 495 | # IrDA options | ||
| 496 | # | ||
| 497 | # CONFIG_IRDA_CACHE_LAST_LSAP is not set | ||
| 498 | # CONFIG_IRDA_FAST_RR is not set | ||
| 499 | # CONFIG_IRDA_DEBUG is not set | ||
| 500 | |||
| 501 | # | ||
| 502 | # Infrared-port device drivers | ||
| 503 | # | ||
| 504 | |||
| 505 | # | ||
| 506 | # SIR device drivers | ||
| 507 | # | ||
| 508 | # CONFIG_IRTTY_SIR is not set | ||
| 509 | |||
| 510 | # | ||
| 511 | # Dongle support | ||
| 512 | # | ||
| 513 | # CONFIG_KINGSUN_DONGLE is not set | ||
| 514 | # CONFIG_KSDAZZLE_DONGLE is not set | ||
| 515 | # CONFIG_KS959_DONGLE is not set | ||
| 516 | |||
| 517 | # | ||
| 518 | # Old SIR device drivers | ||
| 519 | # | ||
| 520 | |||
| 521 | # | ||
| 522 | # Old Serial dongle support | ||
| 523 | # | ||
| 524 | |||
| 525 | # | ||
| 526 | # FIR device drivers | ||
| 527 | # | ||
| 528 | # CONFIG_USB_IRDA is not set | ||
| 529 | # CONFIG_SIGMATEL_FIR is not set | ||
| 530 | # CONFIG_NSC_FIR is not set | ||
| 531 | # CONFIG_WINBOND_FIR is not set | ||
| 532 | # CONFIG_TOSHIBA_FIR is not set | ||
| 533 | # CONFIG_SMC_IRCC_FIR is not set | ||
| 534 | # CONFIG_ALI_FIR is not set | ||
| 535 | # CONFIG_VLSI_FIR is not set | ||
| 536 | # CONFIG_VIA_FIR is not set | ||
| 537 | # CONFIG_MCS_FIR is not set | ||
| 538 | CONFIG_BT=m | ||
| 539 | CONFIG_BT_L2CAP=m | ||
| 540 | CONFIG_BT_SCO=m | ||
| 541 | CONFIG_BT_RFCOMM=m | ||
| 542 | CONFIG_BT_RFCOMM_TTY=y | ||
| 543 | CONFIG_BT_BNEP=m | ||
| 544 | CONFIG_BT_BNEP_MC_FILTER=y | ||
| 545 | CONFIG_BT_BNEP_PROTO_FILTER=y | ||
| 546 | CONFIG_BT_HIDP=m | ||
| 547 | |||
| 548 | # | ||
| 549 | # Bluetooth device drivers | ||
| 550 | # | ||
| 551 | CONFIG_BT_HCIUSB=m | ||
| 552 | # CONFIG_BT_HCIUSB_SCO is not set | ||
| 553 | CONFIG_BT_HCIUART=m | ||
| 554 | CONFIG_BT_HCIUART_H4=y | ||
| 555 | CONFIG_BT_HCIUART_BCSP=y | ||
| 556 | # CONFIG_BT_HCIUART_LL is not set | ||
| 557 | CONFIG_BT_HCIBCM203X=m | ||
| 558 | CONFIG_BT_HCIBPA10X=m | ||
| 559 | CONFIG_BT_HCIBFUSB=m | ||
| 560 | CONFIG_BT_HCIVHCI=m | ||
| 561 | # CONFIG_AF_RXRPC is not set | ||
| 562 | |||
| 563 | # | ||
| 564 | # Wireless | ||
| 565 | # | ||
| 566 | # CONFIG_CFG80211 is not set | ||
| 567 | CONFIG_WIRELESS_EXT=y | ||
| 568 | # CONFIG_MAC80211 is not set | ||
| 569 | CONFIG_IEEE80211=m | ||
| 570 | # CONFIG_IEEE80211_DEBUG is not set | ||
| 571 | CONFIG_IEEE80211_CRYPT_WEP=m | ||
| 572 | CONFIG_IEEE80211_CRYPT_CCMP=m | ||
| 573 | CONFIG_IEEE80211_CRYPT_TKIP=m | ||
| 574 | CONFIG_IEEE80211_SOFTMAC=m | ||
| 575 | # CONFIG_IEEE80211_SOFTMAC_DEBUG is not set | ||
| 576 | # CONFIG_RFKILL is not set | ||
| 577 | # CONFIG_NET_9P is not set | ||
| 578 | |||
| 579 | # | ||
| 580 | # Device Drivers | ||
| 581 | # | ||
| 582 | |||
| 583 | # | ||
| 584 | # Generic Driver Options | ||
| 585 | # | ||
| 586 | CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" | ||
| 587 | CONFIG_STANDALONE=y | ||
| 588 | CONFIG_PREVENT_FIRMWARE_BUILD=y | ||
| 589 | CONFIG_FW_LOADER=y | ||
| 590 | # CONFIG_SYS_HYPERVISOR is not set | ||
| 591 | CONFIG_CONNECTOR=y | ||
| 592 | CONFIG_PROC_EVENTS=y | ||
| 593 | # CONFIG_MTD is not set | ||
| 594 | CONFIG_PARPORT=y | ||
| 595 | CONFIG_PARPORT_PC=y | ||
| 596 | # CONFIG_PARPORT_SERIAL is not set | ||
| 597 | # CONFIG_PARPORT_PC_FIFO is not set | ||
| 598 | # CONFIG_PARPORT_PC_SUPERIO is not set | ||
| 599 | # CONFIG_PARPORT_GSC is not set | ||
| 600 | # CONFIG_PARPORT_AX88796 is not set | ||
| 601 | # CONFIG_PARPORT_1284 is not set | ||
| 602 | CONFIG_PNP=y | ||
| 603 | # CONFIG_PNP_DEBUG is not set | ||
| 604 | |||
| 605 | # | ||
| 606 | # Protocols | ||
| 607 | # | ||
| 608 | # CONFIG_ISAPNP is not set | ||
| 609 | # CONFIG_PNPBIOS is not set | ||
| 610 | CONFIG_PNPACPI=y | ||
| 611 | CONFIG_BLK_DEV=y | ||
| 612 | CONFIG_BLK_DEV_FD=y | ||
| 613 | # CONFIG_BLK_DEV_XD is not set | ||
| 614 | # CONFIG_PARIDE is not set | ||
| 615 | # CONFIG_BLK_CPQ_DA is not set | ||
| 616 | # CONFIG_BLK_CPQ_CISS_DA is not set | ||
| 617 | # CONFIG_BLK_DEV_DAC960 is not set | ||
| 618 | # CONFIG_BLK_DEV_UMEM is not set | ||
| 619 | # CONFIG_BLK_DEV_COW_COMMON is not set | ||
| 620 | CONFIG_BLK_DEV_LOOP=y | ||
| 621 | # CONFIG_BLK_DEV_CRYPTOLOOP is not set | ||
| 622 | # CONFIG_BLK_DEV_NBD is not set | ||
| 623 | # CONFIG_BLK_DEV_SX8 is not set | ||
| 624 | # CONFIG_BLK_DEV_UB is not set | ||
| 625 | CONFIG_BLK_DEV_RAM=y | ||
| 626 | CONFIG_BLK_DEV_RAM_COUNT=16 | ||
| 627 | CONFIG_BLK_DEV_RAM_SIZE=65536 | ||
| 628 | CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024 | ||
| 629 | # CONFIG_CDROM_PKTCDVD is not set | ||
| 630 | # CONFIG_ATA_OVER_ETH is not set | ||
| 631 | CONFIG_MISC_DEVICES=y | ||
| 632 | # CONFIG_IBM_ASM is not set | ||
| 633 | # CONFIG_PHANTOM is not set | ||
| 634 | # CONFIG_EEPROM_93CX6 is not set | ||
| 635 | # CONFIG_SGI_IOC4 is not set | ||
| 636 | # CONFIG_TIFM_CORE is not set | ||
| 637 | # CONFIG_ASUS_LAPTOP is not set | ||
| 638 | # CONFIG_FUJITSU_LAPTOP is not set | ||
| 639 | # CONFIG_MSI_LAPTOP is not set | ||
| 640 | # CONFIG_SONY_LAPTOP is not set | ||
| 641 | # CONFIG_THINKPAD_ACPI is not set | ||
| 642 | CONFIG_IDE=y | ||
| 643 | CONFIG_IDE_MAX_HWIFS=4 | ||
| 644 | CONFIG_BLK_DEV_IDE=y | ||
| 645 | |||
| 646 | # | ||
| 647 | # Please see Documentation/ide.txt for help/info on IDE drives | ||
| 648 | # | ||
| 649 | # CONFIG_BLK_DEV_IDE_SATA is not set | ||
| 650 | # CONFIG_BLK_DEV_HD_IDE is not set | ||
| 651 | CONFIG_BLK_DEV_IDEDISK=y | ||
| 652 | CONFIG_IDEDISK_MULTI_MODE=y | ||
| 653 | CONFIG_BLK_DEV_IDECD=y | ||
| 654 | # CONFIG_BLK_DEV_IDETAPE is not set | ||
| 655 | # CONFIG_BLK_DEV_IDEFLOPPY is not set | ||
| 656 | # CONFIG_BLK_DEV_IDESCSI is not set | ||
| 657 | # CONFIG_BLK_DEV_IDEACPI is not set | ||
| 658 | # CONFIG_IDE_TASK_IOCTL is not set | ||
| 659 | CONFIG_IDE_PROC_FS=y | ||
| 660 | |||
| 661 | # | ||
| 662 | # IDE chipset support/bugfixes | ||
| 663 | # | ||
| 664 | CONFIG_IDE_GENERIC=y | ||
| 665 | # CONFIG_BLK_DEV_PLATFORM is not set | ||
| 666 | CONFIG_BLK_DEV_CMD640=y | ||
| 667 | # CONFIG_BLK_DEV_CMD640_ENHANCED is not set | ||
| 668 | # CONFIG_BLK_DEV_IDEPNP is not set | ||
| 669 | |||
| 670 | # | ||
| 671 | # PCI IDE chipsets support | ||
| 672 | # | ||
| 673 | CONFIG_BLK_DEV_IDEPCI=y | ||
| 674 | CONFIG_IDEPCI_SHARE_IRQ=y | ||
| 675 | CONFIG_IDEPCI_PCIBUS_ORDER=y | ||
| 676 | # CONFIG_BLK_DEV_OFFBOARD is not set | ||
| 677 | CONFIG_BLK_DEV_GENERIC=y | ||
| 678 | # CONFIG_BLK_DEV_OPTI621 is not set | ||
| 679 | CONFIG_BLK_DEV_RZ1000=y | ||
| 680 | CONFIG_BLK_DEV_IDEDMA_PCI=y | ||
| 681 | # CONFIG_BLK_DEV_AEC62XX is not set | ||
| 682 | # CONFIG_BLK_DEV_ALI15X3 is not set | ||
| 683 | # CONFIG_BLK_DEV_AMD74XX is not set | ||
| 684 | # CONFIG_BLK_DEV_ATIIXP is not set | ||
| 685 | # CONFIG_BLK_DEV_CMD64X is not set | ||
| 686 | # CONFIG_BLK_DEV_TRIFLEX is not set | ||
| 687 | # CONFIG_BLK_DEV_CY82C693 is not set | ||
| 688 | # CONFIG_BLK_DEV_CS5520 is not set | ||
| 689 | # CONFIG_BLK_DEV_CS5530 is not set | ||
| 690 | # CONFIG_BLK_DEV_CS5535 is not set | ||
| 691 | # CONFIG_BLK_DEV_HPT34X is not set | ||
| 692 | # CONFIG_BLK_DEV_HPT366 is not set | ||
| 693 | # CONFIG_BLK_DEV_JMICRON is not set | ||
| 694 | # CONFIG_BLK_DEV_SC1200 is not set | ||
| 695 | CONFIG_BLK_DEV_PIIX=y | ||
| 696 | # CONFIG_BLK_DEV_IT8213 is not set | ||
| 697 | # CONFIG_BLK_DEV_IT821X is not set | ||
| 698 | # CONFIG_BLK_DEV_NS87415 is not set | ||
| 699 | # CONFIG_BLK_DEV_PDC202XX_OLD is not set | ||
| 700 | # CONFIG_BLK_DEV_PDC202XX_NEW is not set | ||
| 701 | # CONFIG_BLK_DEV_SVWKS is not set | ||
| 702 | # CONFIG_BLK_DEV_SIIMAGE is not set | ||
| 703 | # CONFIG_BLK_DEV_SIS5513 is not set | ||
| 704 | # CONFIG_BLK_DEV_SLC90E66 is not set | ||
| 705 | # CONFIG_BLK_DEV_TRM290 is not set | ||
| 706 | # CONFIG_BLK_DEV_VIA82CXXX is not set | ||
| 707 | # CONFIG_BLK_DEV_TC86C001 is not set | ||
| 708 | # CONFIG_IDE_ARM is not set | ||
| 709 | |||
| 710 | # | ||
| 711 | # Other IDE chipsets support | ||
| 712 | # | ||
| 713 | |||
| 714 | # | ||
| 715 | # Note: most of these also require special kernel boot parameters | ||
| 716 | # | ||
| 717 | # CONFIG_BLK_DEV_4DRIVES is not set | ||
| 718 | # CONFIG_BLK_DEV_ALI14XX is not set | ||
| 719 | # CONFIG_BLK_DEV_DTC2278 is not set | ||
| 720 | # CONFIG_BLK_DEV_HT6560B is not set | ||
| 721 | # CONFIG_BLK_DEV_QD65XX is not set | ||
| 722 | # CONFIG_BLK_DEV_UMC8672 is not set | ||
| 723 | CONFIG_BLK_DEV_IDEDMA=y | ||
| 724 | CONFIG_IDE_ARCH_OBSOLETE_INIT=y | ||
| 725 | # CONFIG_BLK_DEV_HD is not set | ||
| 726 | |||
| 727 | # | ||
| 728 | # SCSI device support | ||
| 729 | # | ||
| 730 | # CONFIG_RAID_ATTRS is not set | ||
| 731 | CONFIG_SCSI=y | ||
| 732 | CONFIG_SCSI_DMA=y | ||
| 733 | # CONFIG_SCSI_TGT is not set | ||
| 734 | # CONFIG_SCSI_NETLINK is not set | ||
| 735 | CONFIG_SCSI_PROC_FS=y | ||
| 736 | |||
| 737 | # | ||
| 738 | # SCSI support type (disk, tape, CD-ROM) | ||
| 739 | # | ||
| 740 | CONFIG_BLK_DEV_SD=y | ||
| 741 | # CONFIG_CHR_DEV_ST is not set | ||
| 742 | # CONFIG_CHR_DEV_OSST is not set | ||
| 743 | # CONFIG_BLK_DEV_SR is not set | ||
| 744 | CONFIG_CHR_DEV_SG=y | ||
| 745 | # CONFIG_CHR_DEV_SCH is not set | ||
| 746 | |||
| 747 | # | ||
| 748 | # Some SCSI devices (e.g. CD jukebox) support multiple LUNs | ||
| 749 | # | ||
| 750 | CONFIG_SCSI_MULTI_LUN=y | ||
| 751 | # CONFIG_SCSI_CONSTANTS is not set | ||
| 752 | # CONFIG_SCSI_LOGGING is not set | ||
| 753 | # CONFIG_SCSI_SCAN_ASYNC is not set | ||
| 754 | CONFIG_SCSI_WAIT_SCAN=m | ||
| 755 | |||
| 756 | # | ||
| 757 | # SCSI Transports | ||
| 758 | # | ||
| 759 | CONFIG_SCSI_SPI_ATTRS=y | ||
| 760 | # CONFIG_SCSI_FC_ATTRS is not set | ||
| 761 | # CONFIG_SCSI_ISCSI_ATTRS is not set | ||
| 762 | # CONFIG_SCSI_SAS_LIBSAS is not set | ||
| 763 | # CONFIG_SCSI_SRP_ATTRS is not set | ||
| 764 | CONFIG_SCSI_LOWLEVEL=y | ||
| 765 | # CONFIG_ISCSI_TCP is not set | ||
| 766 | # CONFIG_BLK_DEV_3W_XXXX_RAID is not set | ||
| 767 | # CONFIG_SCSI_3W_9XXX is not set | ||
| 768 | # CONFIG_SCSI_7000FASST is not set | ||
| 769 | # CONFIG_SCSI_ACARD is not set | ||
| 770 | # CONFIG_SCSI_AHA152X is not set | ||
| 771 | # CONFIG_SCSI_AHA1542 is not set | ||
| 772 | # CONFIG_SCSI_AACRAID is not set | ||
| 773 | # CONFIG_SCSI_AIC7XXX is not set | ||
| 774 | # CONFIG_SCSI_AIC7XXX_OLD is not set | ||
| 775 | # CONFIG_SCSI_AIC79XX is not set | ||
| 776 | # CONFIG_SCSI_AIC94XX is not set | ||
| 777 | CONFIG_SCSI_DPT_I2O=m | ||
| 778 | # CONFIG_SCSI_ADVANSYS is not set | ||
| 779 | # CONFIG_SCSI_IN2000 is not set | ||
| 780 | # CONFIG_SCSI_ARCMSR is not set | ||
| 781 | # CONFIG_MEGARAID_NEWGEN is not set | ||
| 782 | # CONFIG_MEGARAID_LEGACY is not set | ||
| 783 | # CONFIG_MEGARAID_SAS is not set | ||
| 784 | # CONFIG_SCSI_HPTIOP is not set | ||
| 785 | # CONFIG_SCSI_BUSLOGIC is not set | ||
| 786 | # CONFIG_SCSI_DMX3191D is not set | ||
| 787 | # CONFIG_SCSI_DTC3280 is not set | ||
| 788 | # CONFIG_SCSI_EATA is not set | ||
| 789 | # CONFIG_SCSI_FUTURE_DOMAIN is not set | ||
| 790 | # CONFIG_SCSI_GDTH is not set | ||
| 791 | # CONFIG_SCSI_GENERIC_NCR5380 is not set | ||
| 792 | # CONFIG_SCSI_GENERIC_NCR5380_MMIO is not set | ||
| 793 | # CONFIG_SCSI_IPS is not set | ||
| 794 | # CONFIG_SCSI_INITIO is not set | ||
| 795 | # CONFIG_SCSI_INIA100 is not set | ||
| 796 | # CONFIG_SCSI_PPA is not set | ||
| 797 | # CONFIG_SCSI_IMM is not set | ||
| 798 | # CONFIG_SCSI_NCR53C406A is not set | ||
| 799 | # CONFIG_SCSI_STEX is not set | ||
| 800 | # CONFIG_SCSI_SYM53C8XX_2 is not set | ||
| 801 | # CONFIG_SCSI_PAS16 is not set | ||
| 802 | # CONFIG_SCSI_PSI240I is not set | ||
| 803 | # CONFIG_SCSI_QLOGIC_FAS is not set | ||
| 804 | # CONFIG_SCSI_QLOGIC_1280 is not set | ||
| 805 | # CONFIG_SCSI_QLA_FC is not set | ||
| 806 | # CONFIG_SCSI_QLA_ISCSI is not set | ||
| 807 | # CONFIG_SCSI_LPFC is not set | ||
| 808 | # CONFIG_SCSI_SEAGATE is not set | ||
| 809 | # CONFIG_SCSI_SYM53C416 is not set | ||
| 810 | # CONFIG_SCSI_DC395x is not set | ||
| 811 | # CONFIG_SCSI_DC390T is not set | ||
| 812 | # CONFIG_SCSI_T128 is not set | ||
| 813 | # CONFIG_SCSI_U14_34F is not set | ||
| 814 | # CONFIG_SCSI_ULTRASTOR is not set | ||
| 815 | # CONFIG_SCSI_NSP32 is not set | ||
| 816 | # CONFIG_SCSI_DEBUG is not set | ||
| 817 | # CONFIG_SCSI_SRP is not set | ||
| 818 | # CONFIG_ATA is not set | ||
| 819 | CONFIG_MD=y | ||
| 820 | # CONFIG_BLK_DEV_MD is not set | ||
| 821 | CONFIG_BLK_DEV_DM=m | ||
| 822 | # CONFIG_DM_DEBUG is not set | ||
| 823 | CONFIG_DM_CRYPT=m | ||
| 824 | CONFIG_DM_SNAPSHOT=m | ||
| 825 | CONFIG_DM_MIRROR=m | ||
| 826 | CONFIG_DM_ZERO=m | ||
| 827 | CONFIG_DM_MULTIPATH=m | ||
| 828 | CONFIG_DM_MULTIPATH_EMC=m | ||
| 829 | # CONFIG_DM_MULTIPATH_RDAC is not set | ||
| 830 | # CONFIG_DM_MULTIPATH_HP is not set | ||
| 831 | # CONFIG_DM_DELAY is not set | ||
| 832 | # CONFIG_DM_UEVENT is not set | ||
| 833 | # CONFIG_FUSION is not set | ||
| 834 | |||
| 835 | # | ||
| 836 | # IEEE 1394 (FireWire) support | ||
| 837 | # | ||
| 838 | # CONFIG_FIREWIRE is not set | ||
| 839 | # CONFIG_IEEE1394 is not set | ||
| 840 | # CONFIG_I2O is not set | ||
| 841 | # CONFIG_MACINTOSH_DRIVERS is not set | ||
| 842 | CONFIG_NETDEVICES=y | ||
| 843 | # CONFIG_NETDEVICES_MULTIQUEUE is not set | ||
| 844 | # CONFIG_DUMMY is not set | ||
| 845 | # CONFIG_BONDING is not set | ||
| 846 | # CONFIG_MACVLAN is not set | ||
| 847 | # CONFIG_EQUALIZER is not set | ||
| 848 | CONFIG_TUN=m | ||
| 849 | # CONFIG_VETH is not set | ||
| 850 | # CONFIG_NET_SB1000 is not set | ||
| 851 | # CONFIG_ARCNET is not set | ||
| 852 | # CONFIG_PHYLIB is not set | ||
| 853 | CONFIG_NET_ETHERNET=y | ||
| 854 | CONFIG_MII=y | ||
| 855 | # CONFIG_HAPPYMEAL is not set | ||
| 856 | # CONFIG_SUNGEM is not set | ||
| 857 | # CONFIG_CASSINI is not set | ||
| 858 | CONFIG_NET_VENDOR_3COM=y | ||
| 859 | # CONFIG_EL1 is not set | ||
| 860 | # CONFIG_EL2 is not set | ||
| 861 | # CONFIG_ELPLUS is not set | ||
| 862 | # CONFIG_EL16 is not set | ||
| 863 | # CONFIG_EL3 is not set | ||
| 864 | # CONFIG_3C515 is not set | ||
| 865 | CONFIG_VORTEX=m | ||
| 866 | CONFIG_TYPHOON=m | ||
| 867 | CONFIG_LANCE=m | ||
| 868 | CONFIG_NET_VENDOR_SMC=y | ||
| 869 | CONFIG_WD80x3=m | ||
| 870 | CONFIG_ULTRA=m | ||
| 871 | CONFIG_SMC9194=m | ||
| 872 | # CONFIG_NET_VENDOR_RACAL is not set | ||
| 873 | CONFIG_NET_TULIP=y | ||
| 874 | # CONFIG_DE2104X is not set | ||
| 875 | CONFIG_TULIP=m | ||
| 876 | CONFIG_TULIP_MWI=y | ||
| 877 | CONFIG_TULIP_MMIO=y | ||
| 878 | CONFIG_TULIP_NAPI=y | ||
| 879 | CONFIG_TULIP_NAPI_HW_MITIGATION=y | ||
| 880 | CONFIG_DE4X5=m | ||
| 881 | CONFIG_WINBOND_840=m | ||
| 882 | CONFIG_DM9102=m | ||
| 883 | CONFIG_ULI526X=m | ||
| 884 | CONFIG_AT1700=m | ||
| 885 | CONFIG_DEPCA=m | ||
| 886 | CONFIG_HP100=m | ||
| 887 | CONFIG_NET_ISA=y | ||
| 888 | # CONFIG_E2100 is not set | ||
| 889 | # CONFIG_EWRK3 is not set | ||
| 890 | # CONFIG_EEXPRESS is not set | ||
| 891 | # CONFIG_EEXPRESS_PRO is not set | ||
| 892 | # CONFIG_HPLAN_PLUS is not set | ||
| 893 | # CONFIG_HPLAN is not set | ||
| 894 | # CONFIG_LP486E is not set | ||
| 895 | # CONFIG_ETH16I is not set | ||
| 896 | CONFIG_NE2000=y | ||
| 897 | # CONFIG_ZNET is not set | ||
| 898 | # CONFIG_SEEQ8005 is not set | ||
| 899 | # CONFIG_IBM_NEW_EMAC_ZMII is not set | ||
| 900 | # CONFIG_IBM_NEW_EMAC_RGMII is not set | ||
| 901 | # CONFIG_IBM_NEW_EMAC_TAH is not set | ||
| 902 | # CONFIG_IBM_NEW_EMAC_EMAC4 is not set | ||
| 903 | CONFIG_NET_PCI=y | ||
| 904 | CONFIG_PCNET32=m | ||
| 905 | CONFIG_PCNET32_NAPI=y | ||
| 906 | CONFIG_AMD8111_ETH=m | ||
| 907 | CONFIG_AMD8111E_NAPI=y | ||
| 908 | CONFIG_ADAPTEC_STARFIRE=m | ||
| 909 | CONFIG_ADAPTEC_STARFIRE_NAPI=y | ||
| 910 | CONFIG_AC3200=m | ||
| 911 | CONFIG_APRICOT=m | ||
| 912 | CONFIG_B44=m | ||
| 913 | CONFIG_B44_PCI_AUTOSELECT=y | ||
| 914 | CONFIG_B44_PCICORE_AUTOSELECT=y | ||
| 915 | CONFIG_B44_PCI=y | ||
| 916 | CONFIG_FORCEDETH=m | ||
| 917 | CONFIG_FORCEDETH_NAPI=y | ||
| 918 | CONFIG_CS89x0=m | ||
| 919 | CONFIG_EEPRO100=m | ||
| 920 | CONFIG_E100=m | ||
| 921 | CONFIG_FEALNX=m | ||
| 922 | CONFIG_NATSEMI=m | ||
| 923 | CONFIG_NE2K_PCI=y | ||
| 924 | CONFIG_8139CP=m | ||
| 925 | CONFIG_8139TOO=m | ||
| 926 | CONFIG_8139TOO_PIO=y | ||
| 927 | CONFIG_8139TOO_TUNE_TWISTER=y | ||
| 928 | CONFIG_8139TOO_8129=y | ||
| 929 | # CONFIG_8139_OLD_RX_RESET is not set | ||
| 930 | CONFIG_SIS900=m | ||
| 931 | CONFIG_EPIC100=m | ||
| 932 | CONFIG_SUNDANCE=m | ||
| 933 | CONFIG_SUNDANCE_MMIO=y | ||
| 934 | CONFIG_TLAN=m | ||
| 935 | CONFIG_VIA_RHINE=m | ||
| 936 | CONFIG_VIA_RHINE_MMIO=y | ||
| 937 | CONFIG_VIA_RHINE_NAPI=y | ||
| 938 | CONFIG_SC92031=m | ||
| 939 | # CONFIG_NET_POCKET is not set | ||
| 940 | CONFIG_NETDEV_1000=y | ||
| 941 | CONFIG_ACENIC=m | ||
| 942 | CONFIG_ACENIC_OMIT_TIGON_I=y | ||
| 943 | CONFIG_DL2K=m | ||
| 944 | CONFIG_E1000=m | ||
| 945 | CONFIG_E1000_NAPI=y | ||
| 946 | # CONFIG_E1000_DISABLE_PACKET_SPLIT is not set | ||
| 947 | # CONFIG_E1000E is not set | ||
| 948 | # CONFIG_IP1000 is not set | ||
| 949 | CONFIG_NS83820=m | ||
| 950 | CONFIG_HAMACHI=m | ||
| 951 | CONFIG_YELLOWFIN=m | ||
| 952 | CONFIG_R8169=m | ||
| 953 | CONFIG_R8169_NAPI=y | ||
| 954 | CONFIG_SIS190=m | ||
| 955 | CONFIG_SKGE=m | ||
| 956 | CONFIG_SKY2=m | ||
| 957 | CONFIG_SK98LIN=m | ||
| 958 | CONFIG_VIA_VELOCITY=m | ||
| 959 | CONFIG_TIGON3=m | ||
| 960 | CONFIG_BNX2=m | ||
| 961 | CONFIG_QLA3XXX=m | ||
| 962 | CONFIG_ATL1=m | ||
| 963 | CONFIG_NETDEV_10000=y | ||
| 964 | # CONFIG_CHELSIO_T1 is not set | ||
| 965 | # CONFIG_CHELSIO_T3 is not set | ||
| 966 | # CONFIG_IXGBE is not set | ||
| 967 | # CONFIG_IXGB is not set | ||
| 968 | CONFIG_S2IO=m | ||
| 969 | # CONFIG_S2IO_NAPI is not set | ||
| 970 | # CONFIG_MYRI10GE is not set | ||
| 971 | # CONFIG_NETXEN_NIC is not set | ||
| 972 | # CONFIG_NIU is not set | ||
| 973 | # CONFIG_MLX4_CORE is not set | ||
| 974 | # CONFIG_TEHUTI is not set | ||
| 975 | # CONFIG_TR is not set | ||
| 976 | |||
| 977 | # | ||
| 978 | # Wireless LAN | ||
| 979 | # | ||
| 980 | # CONFIG_WLAN_PRE80211 is not set | ||
| 981 | CONFIG_WLAN_80211=y | ||
| 982 | # CONFIG_IPW2100 is not set | ||
| 983 | # CONFIG_IPW2200 is not set | ||
| 984 | # CONFIG_LIBERTAS is not set | ||
| 985 | # CONFIG_AIRO is not set | ||
| 986 | CONFIG_HERMES=m | ||
| 987 | # CONFIG_PLX_HERMES is not set | ||
| 988 | # CONFIG_TMD_HERMES is not set | ||
| 989 | # CONFIG_NORTEL_HERMES is not set | ||
| 990 | # CONFIG_PCI_HERMES is not set | ||
| 991 | # CONFIG_ATMEL is not set | ||
| 992 | # CONFIG_PRISM54 is not set | ||
| 993 | # CONFIG_USB_ZD1201 is not set | ||
| 994 | CONFIG_HOSTAP=m | ||
| 995 | CONFIG_HOSTAP_FIRMWARE=y | ||
| 996 | # CONFIG_HOSTAP_FIRMWARE_NVRAM is not set | ||
| 997 | # CONFIG_HOSTAP_PLX is not set | ||
| 998 | # CONFIG_HOSTAP_PCI is not set | ||
| 999 | # CONFIG_BCM43XX is not set | ||
| 1000 | # CONFIG_ZD1211RW is not set | ||
| 1001 | |||
| 1002 | # | ||
| 1003 | # USB Network Adapters | ||
| 1004 | # | ||
| 1005 | # CONFIG_USB_CATC is not set | ||
| 1006 | # CONFIG_USB_KAWETH is not set | ||
| 1007 | # CONFIG_USB_PEGASUS is not set | ||
| 1008 | # CONFIG_USB_RTL8150 is not set | ||
| 1009 | # CONFIG_USB_USBNET is not set | ||
| 1010 | # CONFIG_WAN is not set | ||
| 1011 | # CONFIG_FDDI is not set | ||
| 1012 | # CONFIG_HIPPI is not set | ||
| 1013 | # CONFIG_PLIP is not set | ||
| 1014 | CONFIG_PPP=m | ||
| 1015 | # CONFIG_PPP_MULTILINK is not set | ||
| 1016 | # CONFIG_PPP_FILTER is not set | ||
| 1017 | CONFIG_PPP_ASYNC=m | ||
| 1018 | # CONFIG_PPP_SYNC_TTY is not set | ||
| 1019 | CONFIG_PPP_DEFLATE=m | ||
| 1020 | CONFIG_PPP_BSDCOMP=m | ||
| 1021 | # CONFIG_PPP_MPPE is not set | ||
| 1022 | # CONFIG_PPPOE is not set | ||
| 1023 | # CONFIG_PPPOL2TP is not set | ||
| 1024 | # CONFIG_SLIP is not set | ||
| 1025 | CONFIG_SLHC=m | ||
| 1026 | # CONFIG_NET_FC is not set | ||
| 1027 | # CONFIG_SHAPER is not set | ||
| 1028 | # CONFIG_NETCONSOLE is not set | ||
| 1029 | # CONFIG_NETPOLL is not set | ||
| 1030 | # CONFIG_NET_POLL_CONTROLLER is not set | ||
| 1031 | # CONFIG_ISDN is not set | ||
| 1032 | # CONFIG_PHONE is not set | ||
| 1033 | |||
| 1034 | # | ||
| 1035 | # Input device support | ||
| 1036 | # | ||
| 1037 | CONFIG_INPUT=y | ||
| 1038 | # CONFIG_INPUT_FF_MEMLESS is not set | ||
| 1039 | # CONFIG_INPUT_POLLDEV is not set | ||
| 1040 | |||
| 1041 | # | ||
| 1042 | # Userland interfaces | ||
| 1043 | # | ||
| 1044 | CONFIG_INPUT_MOUSEDEV=m | ||
| 1045 | # CONFIG_INPUT_MOUSEDEV_PSAUX is not set | ||
| 1046 | CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024 | ||
| 1047 | CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 | ||
| 1048 | # CONFIG_INPUT_JOYDEV is not set | ||
| 1049 | CONFIG_INPUT_EVDEV=y | ||
| 1050 | # CONFIG_INPUT_EVBUG is not set | ||
| 1051 | |||
| 1052 | # | ||
| 1053 | # Input Device Drivers | ||
| 1054 | # | ||
| 1055 | CONFIG_INPUT_KEYBOARD=y | ||
| 1056 | CONFIG_KEYBOARD_ATKBD=y | ||
| 1057 | # CONFIG_KEYBOARD_SUNKBD is not set | ||
| 1058 | # CONFIG_KEYBOARD_LKKBD is not set | ||
| 1059 | # CONFIG_KEYBOARD_XTKBD is not set | ||
| 1060 | # CONFIG_KEYBOARD_NEWTON is not set | ||
| 1061 | # CONFIG_KEYBOARD_STOWAWAY is not set | ||
| 1062 | CONFIG_INPUT_MOUSE=y | ||
| 1063 | CONFIG_MOUSE_PS2=y | ||
| 1064 | CONFIG_MOUSE_PS2_ALPS=y | ||
| 1065 | CONFIG_MOUSE_PS2_LOGIPS2PP=y | ||
| 1066 | CONFIG_MOUSE_PS2_SYNAPTICS=y | ||
| 1067 | CONFIG_MOUSE_PS2_LIFEBOOK=y | ||
| 1068 | CONFIG_MOUSE_PS2_TRACKPOINT=y | ||
| 1069 | # CONFIG_MOUSE_PS2_TOUCHKIT is not set | ||
| 1070 | # CONFIG_MOUSE_SERIAL is not set | ||
| 1071 | # CONFIG_MOUSE_APPLETOUCH is not set | ||
| 1072 | # CONFIG_MOUSE_INPORT is not set | ||
| 1073 | # CONFIG_MOUSE_LOGIBM is not set | ||
| 1074 | # CONFIG_MOUSE_PC110PAD is not set | ||
| 1075 | # CONFIG_MOUSE_VSXXXAA is not set | ||
| 1076 | # CONFIG_INPUT_JOYSTICK is not set | ||
| 1077 | CONFIG_INPUT_TABLET=y | ||
| 1078 | # CONFIG_TABLET_USB_ACECAD is not set | ||
| 1079 | # CONFIG_TABLET_USB_AIPTEK is not set | ||
| 1080 | # CONFIG_TABLET_USB_GTCO is not set | ||
| 1081 | # CONFIG_TABLET_USB_KBTAB is not set | ||
| 1082 | CONFIG_TABLET_USB_WACOM=y | ||
| 1083 | # CONFIG_INPUT_TOUCHSCREEN is not set | ||
| 1084 | CONFIG_INPUT_MISC=y | ||
| 1085 | # CONFIG_INPUT_PCSPKR is not set | ||
| 1086 | # CONFIG_INPUT_WISTRON_BTNS is not set | ||
| 1087 | # CONFIG_INPUT_ATLAS_BTNS is not set | ||
| 1088 | # CONFIG_INPUT_ATI_REMOTE is not set | ||
| 1089 | # CONFIG_INPUT_ATI_REMOTE2 is not set | ||
| 1090 | # CONFIG_INPUT_KEYSPAN_REMOTE is not set | ||
| 1091 | # CONFIG_INPUT_POWERMATE is not set | ||
| 1092 | # CONFIG_INPUT_YEALINK is not set | ||
| 1093 | CONFIG_INPUT_UINPUT=m | ||
| 1094 | |||
| 1095 | # | ||
| 1096 | # Hardware I/O ports | ||
| 1097 | # | ||
| 1098 | CONFIG_SERIO=y | ||
| 1099 | CONFIG_SERIO_I8042=y | ||
| 1100 | # CONFIG_SERIO_SERPORT is not set | ||
| 1101 | # CONFIG_SERIO_CT82C710 is not set | ||
| 1102 | # CONFIG_SERIO_PARKBD is not set | ||
| 1103 | # CONFIG_SERIO_PCIPS2 is not set | ||
| 1104 | CONFIG_SERIO_LIBPS2=y | ||
| 1105 | # CONFIG_SERIO_RAW is not set | ||
| 1106 | # CONFIG_GAMEPORT is not set | ||
| 1107 | |||
| 1108 | # | ||
| 1109 | # Character devices | ||
| 1110 | # | ||
| 1111 | CONFIG_VT=y | ||
| 1112 | CONFIG_VT_CONSOLE=y | ||
| 1113 | CONFIG_HW_CONSOLE=y | ||
| 1114 | # CONFIG_VT_HW_CONSOLE_BINDING is not set | ||
| 1115 | # CONFIG_SERIAL_NONSTANDARD is not set | ||
| 1116 | |||
| 1117 | # | ||
| 1118 | # Serial drivers | ||
| 1119 | # | ||
| 1120 | CONFIG_SERIAL_8250=y | ||
| 1121 | # CONFIG_SERIAL_8250_CONSOLE is not set | ||
| 1122 | CONFIG_FIX_EARLYCON_MEM=y | ||
| 1123 | CONFIG_SERIAL_8250_PCI=y | ||
| 1124 | CONFIG_SERIAL_8250_PNP=y | ||
| 1125 | CONFIG_SERIAL_8250_NR_UARTS=4 | ||
| 1126 | CONFIG_SERIAL_8250_RUNTIME_UARTS=4 | ||
| 1127 | # CONFIG_SERIAL_8250_EXTENDED is not set | ||
| 1128 | |||
| 1129 | # | ||
| 1130 | # Non-8250 serial port support | ||
| 1131 | # | ||
| 1132 | CONFIG_SERIAL_CORE=y | ||
| 1133 | # CONFIG_SERIAL_JSM is not set | ||
| 1134 | CONFIG_UNIX98_PTYS=y | ||
| 1135 | # CONFIG_LEGACY_PTYS is not set | ||
| 1136 | CONFIG_PRINTER=y | ||
| 1137 | # CONFIG_LP_CONSOLE is not set | ||
| 1138 | # CONFIG_PPDEV is not set | ||
| 1139 | # CONFIG_IPMI_HANDLER is not set | ||
| 1140 | # CONFIG_HW_RANDOM is not set | ||
| 1141 | # CONFIG_NVRAM is not set | ||
| 1142 | # CONFIG_RTC is not set | ||
| 1143 | # CONFIG_GEN_RTC is not set | ||
| 1144 | # CONFIG_DTLK is not set | ||
| 1145 | # CONFIG_R3964 is not set | ||
| 1146 | # CONFIG_APPLICOM is not set | ||
| 1147 | # CONFIG_SONYPI is not set | ||
| 1148 | # CONFIG_MWAVE is not set | ||
| 1149 | # CONFIG_PC8736x_GPIO is not set | ||
| 1150 | # CONFIG_NSC_GPIO is not set | ||
| 1151 | # CONFIG_CS5535_GPIO is not set | ||
| 1152 | # CONFIG_RAW_DRIVER is not set | ||
| 1153 | # CONFIG_HPET is not set | ||
| 1154 | # CONFIG_HANGCHECK_TIMER is not set | ||
| 1155 | # CONFIG_TCG_TPM is not set | ||
| 1156 | # CONFIG_TELCLOCK is not set | ||
| 1157 | CONFIG_DEVPORT=y | ||
| 1158 | # CONFIG_I2C is not set | ||
| 1159 | |||
| 1160 | # | ||
| 1161 | # SPI support | ||
| 1162 | # | ||
| 1163 | # CONFIG_SPI is not set | ||
| 1164 | # CONFIG_SPI_MASTER is not set | ||
| 1165 | # CONFIG_W1 is not set | ||
| 1166 | CONFIG_POWER_SUPPLY=y | ||
| 1167 | # CONFIG_POWER_SUPPLY_DEBUG is not set | ||
| 1168 | # CONFIG_PDA_POWER is not set | ||
| 1169 | # CONFIG_BATTERY_DS2760 is not set | ||
| 1170 | # CONFIG_HWMON is not set | ||
| 1171 | # CONFIG_WATCHDOG is not set | ||
| 1172 | |||
| 1173 | # | ||
| 1174 | # Sonics Silicon Backplane | ||
| 1175 | # | ||
| 1176 | CONFIG_SSB_POSSIBLE=y | ||
| 1177 | CONFIG_SSB=m | ||
| 1178 | CONFIG_SSB_PCIHOST_POSSIBLE=y | ||
| 1179 | CONFIG_SSB_PCIHOST=y | ||
| 1180 | # CONFIG_SSB_SILENT is not set | ||
| 1181 | # CONFIG_SSB_DEBUG is not set | ||
| 1182 | CONFIG_SSB_DRIVER_PCICORE_POSSIBLE=y | ||
| 1183 | CONFIG_SSB_DRIVER_PCICORE=y | ||
| 1184 | |||
| 1185 | # | ||
| 1186 | # Multifunction device drivers | ||
| 1187 | # | ||
| 1188 | # CONFIG_MFD_SM501 is not set | ||
| 1189 | # CONFIG_HTC_ASIC3 is not set | ||
| 1190 | # CONFIG_HTC_ASIC3_DS1WM is not set | ||
| 1191 | |||
| 1192 | # | ||
| 1193 | # Multimedia devices | ||
| 1194 | # | ||
| 1195 | CONFIG_VIDEO_DEV=m | ||
| 1196 | CONFIG_VIDEO_V4L1=y | ||
| 1197 | CONFIG_VIDEO_V4L1_COMPAT=y | ||
| 1198 | CONFIG_VIDEO_V4L2=y | ||
| 1199 | CONFIG_VIDEO_CAPTURE_DRIVERS=y | ||
| 1200 | # CONFIG_VIDEO_ADV_DEBUG is not set | ||
| 1201 | CONFIG_VIDEO_HELPER_CHIPS_AUTO=y | ||
| 1202 | # CONFIG_VIDEO_VIVI is not set | ||
| 1203 | # CONFIG_VIDEO_PMS is not set | ||
| 1204 | # CONFIG_VIDEO_BWQCAM is not set | ||
| 1205 | # CONFIG_VIDEO_CQCAM is not set | ||
| 1206 | # CONFIG_VIDEO_CPIA is not set | ||
| 1207 | # CONFIG_VIDEO_CPIA2 is not set | ||
| 1208 | # CONFIG_VIDEO_STRADIS is not set | ||
| 1209 | CONFIG_V4L_USB_DRIVERS=y | ||
| 1210 | # CONFIG_USB_VICAM is not set | ||
| 1211 | # CONFIG_USB_IBMCAM is not set | ||
| 1212 | # CONFIG_USB_KONICAWC is not set | ||
| 1213 | # CONFIG_USB_QUICKCAM_MESSENGER is not set | ||
| 1214 | # CONFIG_USB_ET61X251 is not set | ||
| 1215 | CONFIG_USB_OV511=m | ||
| 1216 | CONFIG_USB_SE401=m | ||
| 1217 | CONFIG_USB_SN9C102=m | ||
| 1218 | CONFIG_USB_STV680=m | ||
| 1219 | # CONFIG_USB_ZC0301 is not set | ||
| 1220 | # CONFIG_USB_PWC is not set | ||
| 1221 | # CONFIG_USB_ZR364XX is not set | ||
| 1222 | CONFIG_RADIO_ADAPTERS=y | ||
| 1223 | # CONFIG_RADIO_CADET is not set | ||
| 1224 | # CONFIG_RADIO_RTRACK is not set | ||
| 1225 | # CONFIG_RADIO_RTRACK2 is not set | ||
| 1226 | # CONFIG_RADIO_AZTECH is not set | ||
| 1227 | # CONFIG_RADIO_GEMTEK is not set | ||
| 1228 | # CONFIG_RADIO_GEMTEK_PCI is not set | ||
| 1229 | # CONFIG_RADIO_MAXIRADIO is not set | ||
| 1230 | # CONFIG_RADIO_MAESTRO is not set | ||
| 1231 | # CONFIG_RADIO_SF16FMI is not set | ||
| 1232 | # CONFIG_RADIO_SF16FMR2 is not set | ||
| 1233 | # CONFIG_RADIO_TERRATEC is not set | ||
| 1234 | # CONFIG_RADIO_TRUST is not set | ||
| 1235 | # CONFIG_RADIO_TYPHOON is not set | ||
| 1236 | # CONFIG_RADIO_ZOLTRIX is not set | ||
| 1237 | CONFIG_USB_DSBR=m | ||
| 1238 | # CONFIG_DVB_CORE is not set | ||
| 1239 | CONFIG_DAB=y | ||
| 1240 | # CONFIG_USB_DABUSB is not set | ||
| 1241 | |||
| 1242 | # | ||
| 1243 | # Graphics support | ||
| 1244 | # | ||
| 1245 | CONFIG_AGP=m | ||
| 1246 | CONFIG_AGP_ALI=m | ||
| 1247 | CONFIG_AGP_ATI=m | ||
| 1248 | CONFIG_AGP_AMD=m | ||
| 1249 | CONFIG_AGP_AMD64=m | ||
| 1250 | CONFIG_AGP_INTEL=m | ||
| 1251 | CONFIG_AGP_NVIDIA=m | ||
| 1252 | CONFIG_AGP_SIS=m | ||
| 1253 | CONFIG_AGP_SWORKS=m | ||
| 1254 | CONFIG_AGP_VIA=m | ||
| 1255 | CONFIG_AGP_EFFICEON=m | ||
| 1256 | CONFIG_DRM=m | ||
| 1257 | # CONFIG_DRM_TDFX is not set | ||
| 1258 | # CONFIG_DRM_R128 is not set | ||
| 1259 | # CONFIG_DRM_RADEON is not set | ||
| 1260 | # CONFIG_DRM_I810 is not set | ||
| 1261 | # CONFIG_DRM_I830 is not set | ||
| 1262 | # CONFIG_DRM_I915 is not set | ||
| 1263 | # CONFIG_DRM_MGA is not set | ||
| 1264 | # CONFIG_DRM_SIS is not set | ||
| 1265 | # CONFIG_DRM_VIA is not set | ||
| 1266 | # CONFIG_DRM_SAVAGE is not set | ||
| 1267 | # CONFIG_VGASTATE is not set | ||
| 1268 | CONFIG_VIDEO_OUTPUT_CONTROL=m | ||
| 1269 | CONFIG_FB=y | ||
| 1270 | # CONFIG_FIRMWARE_EDID is not set | ||
| 1271 | # CONFIG_FB_DDC is not set | ||
| 1272 | CONFIG_FB_CFB_FILLRECT=m | ||
| 1273 | CONFIG_FB_CFB_COPYAREA=m | ||
| 1274 | CONFIG_FB_CFB_IMAGEBLIT=m | ||
| 1275 | # CONFIG_FB_CFB_REV_PIXELS_IN_BYTE is not set | ||
| 1276 | # CONFIG_FB_SYS_FILLRECT is not set | ||
| 1277 | # CONFIG_FB_SYS_COPYAREA is not set | ||
| 1278 | # CONFIG_FB_SYS_IMAGEBLIT is not set | ||
| 1279 | # CONFIG_FB_SYS_FOPS is not set | ||
| 1280 | # CONFIG_FB_DEFERRED_IO is not set | ||
| 1281 | # CONFIG_FB_SVGALIB is not set | ||
| 1282 | # CONFIG_FB_MACMODES is not set | ||
| 1283 | # CONFIG_FB_BACKLIGHT is not set | ||
| 1284 | CONFIG_FB_MODE_HELPERS=y | ||
| 1285 | # CONFIG_FB_TILEBLITTING is not set | ||
| 1286 | |||
| 1287 | # | ||
| 1288 | # Frame buffer hardware drivers | ||
| 1289 | # | ||
| 1290 | # CONFIG_FB_CIRRUS is not set | ||
| 1291 | # CONFIG_FB_PM2 is not set | ||
| 1292 | # CONFIG_FB_CYBER2000 is not set | ||
| 1293 | # CONFIG_FB_ARC is not set | ||
| 1294 | # CONFIG_FB_ASILIANT is not set | ||
| 1295 | # CONFIG_FB_IMSTT is not set | ||
| 1296 | # CONFIG_FB_VGA16 is not set | ||
| 1297 | CONFIG_FB_UVESA=m | ||
| 1298 | # CONFIG_FB_VESA is not set | ||
| 1299 | # CONFIG_FB_EFI is not set | ||
| 1300 | # CONFIG_FB_HECUBA is not set | ||
| 1301 | # CONFIG_FB_HGA is not set | ||
| 1302 | # CONFIG_FB_S1D13XXX is not set | ||
| 1303 | # CONFIG_FB_NVIDIA is not set | ||
| 1304 | # CONFIG_FB_RIVA is not set | ||
| 1305 | # CONFIG_FB_I810 is not set | ||
| 1306 | # CONFIG_FB_LE80578 is not set | ||
| 1307 | # CONFIG_FB_INTEL is not set | ||
| 1308 | # CONFIG_FB_MATROX is not set | ||
| 1309 | # CONFIG_FB_RADEON is not set | ||
| 1310 | # CONFIG_FB_ATY128 is not set | ||
| 1311 | # CONFIG_FB_ATY is not set | ||
| 1312 | # CONFIG_FB_S3 is not set | ||
| 1313 | # CONFIG_FB_SAVAGE is not set | ||
| 1314 | # CONFIG_FB_SIS is not set | ||
| 1315 | # CONFIG_FB_NEOMAGIC is not set | ||
| 1316 | # CONFIG_FB_KYRO is not set | ||
| 1317 | # CONFIG_FB_3DFX is not set | ||
| 1318 | # CONFIG_FB_VOODOO1 is not set | ||
| 1319 | # CONFIG_FB_VT8623 is not set | ||
| 1320 | # CONFIG_FB_CYBLA is not set | ||
| 1321 | # CONFIG_FB_TRIDENT is not set | ||
| 1322 | # CONFIG_FB_ARK is not set | ||
| 1323 | # CONFIG_FB_PM3 is not set | ||
| 1324 | # CONFIG_FB_GEODE is not set | ||
| 1325 | # CONFIG_FB_VIRTUAL is not set | ||
| 1326 | CONFIG_BACKLIGHT_LCD_SUPPORT=y | ||
| 1327 | CONFIG_LCD_CLASS_DEVICE=m | ||
| 1328 | CONFIG_BACKLIGHT_CLASS_DEVICE=m | ||
| 1329 | CONFIG_BACKLIGHT_CORGI=m | ||
| 1330 | # CONFIG_BACKLIGHT_PROGEAR is not set | ||
| 1331 | |||
| 1332 | # | ||
| 1333 | # Display device support | ||
| 1334 | # | ||
| 1335 | # CONFIG_DISPLAY_SUPPORT is not set | ||
| 1336 | |||
| 1337 | # | ||
| 1338 | # Console display driver support | ||
| 1339 | # | ||
| 1340 | CONFIG_VGA_CONSOLE=y | ||
| 1341 | # CONFIG_VGACON_SOFT_SCROLLBACK is not set | ||
| 1342 | CONFIG_VIDEO_SELECT=y | ||
| 1343 | # CONFIG_MDA_CONSOLE is not set | ||
| 1344 | CONFIG_DUMMY_CONSOLE=y | ||
| 1345 | CONFIG_FRAMEBUFFER_CONSOLE=y | ||
| 1346 | # CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY is not set | ||
| 1347 | CONFIG_FRAMEBUFFER_CONSOLE_ROTATION=y | ||
| 1348 | CONFIG_FONTS=y | ||
| 1349 | CONFIG_FONT_8x8=y | ||
| 1350 | CONFIG_FONT_8x16=y | ||
| 1351 | # CONFIG_FONT_6x11 is not set | ||
| 1352 | # CONFIG_FONT_7x14 is not set | ||
| 1353 | # CONFIG_FONT_PEARL_8x8 is not set | ||
| 1354 | # CONFIG_FONT_ACORN_8x8 is not set | ||
| 1355 | # CONFIG_FONT_MINI_4x6 is not set | ||
| 1356 | # CONFIG_FONT_SUN8x16 is not set | ||
| 1357 | # CONFIG_FONT_SUN12x22 is not set | ||
| 1358 | # CONFIG_FONT_10x18 is not set | ||
| 1359 | CONFIG_LOGO=y | ||
| 1360 | CONFIG_LOGO_LINUX_MONO=y | ||
| 1361 | CONFIG_LOGO_LINUX_VGA16=y | ||
| 1362 | # CONFIG_LOGO_LINUX_CLUT224 is not set | ||
| 1363 | CONFIG_LOGO_OHAND_CLUT224=y | ||
| 1364 | |||
| 1365 | # | ||
| 1366 | # Sound | ||
| 1367 | # | ||
| 1368 | CONFIG_SOUND=y | ||
| 1369 | |||
| 1370 | # | ||
| 1371 | # Advanced Linux Sound Architecture | ||
| 1372 | # | ||
| 1373 | CONFIG_SND=y | ||
| 1374 | CONFIG_SND_TIMER=y | ||
| 1375 | CONFIG_SND_PCM=y | ||
| 1376 | CONFIG_SND_SEQUENCER=y | ||
| 1377 | # CONFIG_SND_SEQ_DUMMY is not set | ||
| 1378 | CONFIG_SND_OSSEMUL=y | ||
| 1379 | CONFIG_SND_MIXER_OSS=y | ||
| 1380 | CONFIG_SND_PCM_OSS=y | ||
| 1381 | CONFIG_SND_PCM_OSS_PLUGINS=y | ||
| 1382 | CONFIG_SND_SEQUENCER_OSS=y | ||
| 1383 | # CONFIG_SND_DYNAMIC_MINORS is not set | ||
| 1384 | CONFIG_SND_SUPPORT_OLD_API=y | ||
| 1385 | CONFIG_SND_VERBOSE_PROCFS=y | ||
| 1386 | # CONFIG_SND_VERBOSE_PRINTK is not set | ||
| 1387 | # CONFIG_SND_DEBUG is not set | ||
| 1388 | |||
| 1389 | # | ||
| 1390 | # Generic devices | ||
| 1391 | # | ||
| 1392 | CONFIG_SND_AC97_CODEC=y | ||
| 1393 | # CONFIG_SND_DUMMY is not set | ||
| 1394 | # CONFIG_SND_VIRMIDI is not set | ||
| 1395 | # CONFIG_SND_MTPAV is not set | ||
| 1396 | # CONFIG_SND_MTS64 is not set | ||
| 1397 | # CONFIG_SND_SERIAL_U16550 is not set | ||
| 1398 | # CONFIG_SND_MPU401 is not set | ||
| 1399 | # CONFIG_SND_PORTMAN2X4 is not set | ||
| 1400 | |||
| 1401 | # | ||
| 1402 | # ISA devices | ||
| 1403 | # | ||
| 1404 | # CONFIG_SND_ADLIB is not set | ||
| 1405 | # CONFIG_SND_AD1816A is not set | ||
| 1406 | # CONFIG_SND_AD1848 is not set | ||
| 1407 | # CONFIG_SND_ALS100 is not set | ||
| 1408 | # CONFIG_SND_AZT2320 is not set | ||
| 1409 | # CONFIG_SND_CMI8330 is not set | ||
| 1410 | # CONFIG_SND_CS4231 is not set | ||
| 1411 | # CONFIG_SND_CS4232 is not set | ||
| 1412 | # CONFIG_SND_CS4236 is not set | ||
| 1413 | # CONFIG_SND_DT019X is not set | ||
| 1414 | # CONFIG_SND_ES968 is not set | ||
| 1415 | # CONFIG_SND_ES1688 is not set | ||
| 1416 | # CONFIG_SND_ES18XX is not set | ||
| 1417 | # CONFIG_SND_SC6000 is not set | ||
| 1418 | # CONFIG_SND_GUSCLASSIC is not set | ||
| 1419 | # CONFIG_SND_GUSEXTREME is not set | ||
| 1420 | # CONFIG_SND_GUSMAX is not set | ||
| 1421 | # CONFIG_SND_INTERWAVE is not set | ||
| 1422 | # CONFIG_SND_INTERWAVE_STB is not set | ||
| 1423 | # CONFIG_SND_OPL3SA2 is not set | ||
| 1424 | # CONFIG_SND_OPTI92X_AD1848 is not set | ||
| 1425 | # CONFIG_SND_OPTI92X_CS4231 is not set | ||
| 1426 | # CONFIG_SND_OPTI93X is not set | ||
| 1427 | # CONFIG_SND_MIRO is not set | ||
| 1428 | # CONFIG_SND_SB8 is not set | ||
| 1429 | # CONFIG_SND_SB16 is not set | ||
| 1430 | # CONFIG_SND_SBAWE is not set | ||
| 1431 | # CONFIG_SND_SGALAXY is not set | ||
| 1432 | # CONFIG_SND_SSCAPE is not set | ||
| 1433 | # CONFIG_SND_WAVEFRONT is not set | ||
| 1434 | |||
| 1435 | # | ||
| 1436 | # PCI devices | ||
| 1437 | # | ||
| 1438 | # CONFIG_SND_AD1889 is not set | ||
| 1439 | # CONFIG_SND_ALS300 is not set | ||
| 1440 | # CONFIG_SND_ALS4000 is not set | ||
| 1441 | # CONFIG_SND_ALI5451 is not set | ||
| 1442 | # CONFIG_SND_ATIIXP is not set | ||
| 1443 | # CONFIG_SND_ATIIXP_MODEM is not set | ||
| 1444 | # CONFIG_SND_AU8810 is not set | ||
| 1445 | # CONFIG_SND_AU8820 is not set | ||
| 1446 | # CONFIG_SND_AU8830 is not set | ||
| 1447 | # CONFIG_SND_AZT3328 is not set | ||
| 1448 | # CONFIG_SND_BT87X is not set | ||
| 1449 | # CONFIG_SND_CA0106 is not set | ||
| 1450 | # CONFIG_SND_CMIPCI is not set | ||
| 1451 | # CONFIG_SND_CS4281 is not set | ||
| 1452 | # CONFIG_SND_CS46XX is not set | ||
| 1453 | # CONFIG_SND_CS5530 is not set | ||
| 1454 | # CONFIG_SND_CS5535AUDIO is not set | ||
| 1455 | # CONFIG_SND_DARLA20 is not set | ||
| 1456 | # CONFIG_SND_GINA20 is not set | ||
| 1457 | # CONFIG_SND_LAYLA20 is not set | ||
| 1458 | # CONFIG_SND_DARLA24 is not set | ||
| 1459 | # CONFIG_SND_GINA24 is not set | ||
| 1460 | # CONFIG_SND_LAYLA24 is not set | ||
| 1461 | # CONFIG_SND_MONA is not set | ||
| 1462 | # CONFIG_SND_MIA is not set | ||
| 1463 | # CONFIG_SND_ECHO3G is not set | ||
| 1464 | # CONFIG_SND_INDIGO is not set | ||
| 1465 | # CONFIG_SND_INDIGOIO is not set | ||
| 1466 | # CONFIG_SND_INDIGODJ is not set | ||
| 1467 | # CONFIG_SND_EMU10K1 is not set | ||
| 1468 | # CONFIG_SND_EMU10K1X is not set | ||
| 1469 | # CONFIG_SND_ENS1370 is not set | ||
| 1470 | # CONFIG_SND_ENS1371 is not set | ||
| 1471 | # CONFIG_SND_ES1938 is not set | ||
| 1472 | # CONFIG_SND_ES1968 is not set | ||
| 1473 | # CONFIG_SND_FM801 is not set | ||
| 1474 | # CONFIG_SND_HDA_INTEL is not set | ||
| 1475 | # CONFIG_SND_HDSP is not set | ||
| 1476 | # CONFIG_SND_HDSPM is not set | ||
| 1477 | # CONFIG_SND_ICE1712 is not set | ||
| 1478 | # CONFIG_SND_ICE1724 is not set | ||
| 1479 | CONFIG_SND_INTEL8X0=y | ||
| 1480 | # CONFIG_SND_INTEL8X0M is not set | ||
| 1481 | # CONFIG_SND_KORG1212 is not set | ||
| 1482 | # CONFIG_SND_MAESTRO3 is not set | ||
| 1483 | # CONFIG_SND_MIXART is not set | ||
| 1484 | # CONFIG_SND_NM256 is not set | ||
| 1485 | # CONFIG_SND_PCXHR is not set | ||
| 1486 | # CONFIG_SND_RIPTIDE is not set | ||
| 1487 | # CONFIG_SND_RME32 is not set | ||
| 1488 | # CONFIG_SND_RME96 is not set | ||
| 1489 | # CONFIG_SND_RME9652 is not set | ||
| 1490 | # CONFIG_SND_SONICVIBES is not set | ||
| 1491 | # CONFIG_SND_TRIDENT is not set | ||
| 1492 | # CONFIG_SND_VIA82XX is not set | ||
| 1493 | # CONFIG_SND_VIA82XX_MODEM is not set | ||
| 1494 | # CONFIG_SND_VX222 is not set | ||
| 1495 | # CONFIG_SND_YMFPCI is not set | ||
| 1496 | # CONFIG_SND_AC97_POWER_SAVE is not set | ||
| 1497 | |||
| 1498 | # | ||
| 1499 | # USB devices | ||
| 1500 | # | ||
| 1501 | # CONFIG_SND_USB_AUDIO is not set | ||
| 1502 | # CONFIG_SND_USB_USX2Y is not set | ||
| 1503 | # CONFIG_SND_USB_CAIAQ is not set | ||
| 1504 | |||
| 1505 | # | ||
| 1506 | # System on Chip audio support | ||
| 1507 | # | ||
| 1508 | # CONFIG_SND_SOC is not set | ||
| 1509 | |||
| 1510 | # | ||
| 1511 | # SoC Audio support for SuperH | ||
| 1512 | # | ||
| 1513 | |||
| 1514 | # | ||
| 1515 | # Open Sound System | ||
| 1516 | # | ||
| 1517 | # CONFIG_SOUND_PRIME is not set | ||
| 1518 | CONFIG_AC97_BUS=y | ||
| 1519 | CONFIG_HID_SUPPORT=y | ||
| 1520 | CONFIG_HID=y | ||
| 1521 | # CONFIG_HID_DEBUG is not set | ||
| 1522 | # CONFIG_HIDRAW is not set | ||
| 1523 | |||
| 1524 | # | ||
| 1525 | # USB Input Devices | ||
| 1526 | # | ||
| 1527 | CONFIG_USB_HID=y | ||
| 1528 | # CONFIG_USB_HIDINPUT_POWERBOOK is not set | ||
| 1529 | # CONFIG_HID_FF is not set | ||
| 1530 | # CONFIG_USB_HIDDEV is not set | ||
| 1531 | CONFIG_USB_SUPPORT=y | ||
| 1532 | CONFIG_USB_ARCH_HAS_HCD=y | ||
| 1533 | CONFIG_USB_ARCH_HAS_OHCI=y | ||
| 1534 | CONFIG_USB_ARCH_HAS_EHCI=y | ||
| 1535 | CONFIG_USB=y | ||
| 1536 | # CONFIG_USB_DEBUG is not set | ||
| 1537 | |||
| 1538 | # | ||
| 1539 | # Miscellaneous USB options | ||
| 1540 | # | ||
| 1541 | CONFIG_USB_DEVICEFS=y | ||
| 1542 | CONFIG_USB_DEVICE_CLASS=y | ||
| 1543 | # CONFIG_USB_DYNAMIC_MINORS is not set | ||
| 1544 | CONFIG_USB_SUSPEND=y | ||
| 1545 | # CONFIG_USB_PERSIST is not set | ||
| 1546 | # CONFIG_USB_OTG is not set | ||
| 1547 | |||
| 1548 | # | ||
| 1549 | # USB Host Controller Drivers | ||
| 1550 | # | ||
| 1551 | CONFIG_USB_EHCI_HCD=y | ||
| 1552 | CONFIG_USB_EHCI_SPLIT_ISO=y | ||
| 1553 | # CONFIG_USB_EHCI_ROOT_HUB_TT is not set | ||
| 1554 | # CONFIG_USB_EHCI_TT_NEWSCHED is not set | ||
| 1555 | # CONFIG_USB_ISP116X_HCD is not set | ||
| 1556 | CONFIG_USB_OHCI_HCD=y | ||
| 1557 | # CONFIG_USB_OHCI_BIG_ENDIAN_DESC is not set | ||
| 1558 | # CONFIG_USB_OHCI_BIG_ENDIAN_MMIO is not set | ||
| 1559 | CONFIG_USB_OHCI_LITTLE_ENDIAN=y | ||
| 1560 | CONFIG_USB_UHCI_HCD=y | ||
| 1561 | CONFIG_USB_SL811_HCD=m | ||
| 1562 | # CONFIG_USB_R8A66597_HCD is not set | ||
| 1563 | |||
| 1564 | # | ||
| 1565 | # USB Device Class drivers | ||
| 1566 | # | ||
| 1567 | CONFIG_USB_ACM=m | ||
| 1568 | CONFIG_USB_PRINTER=m | ||
| 1569 | |||
| 1570 | # | ||
| 1571 | # NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' | ||
| 1572 | # | ||
| 1573 | |||
| 1574 | # | ||
| 1575 | # may also be needed; see USB_STORAGE Help for more information | ||
| 1576 | # | ||
| 1577 | CONFIG_USB_STORAGE=m | ||
| 1578 | # CONFIG_USB_STORAGE_DEBUG is not set | ||
| 1579 | # CONFIG_USB_STORAGE_DATAFAB is not set | ||
| 1580 | # CONFIG_USB_STORAGE_FREECOM is not set | ||
| 1581 | # CONFIG_USB_STORAGE_ISD200 is not set | ||
| 1582 | # CONFIG_USB_STORAGE_DPCM is not set | ||
| 1583 | # CONFIG_USB_STORAGE_USBAT is not set | ||
| 1584 | # CONFIG_USB_STORAGE_SDDR09 is not set | ||
| 1585 | # CONFIG_USB_STORAGE_SDDR55 is not set | ||
| 1586 | # CONFIG_USB_STORAGE_JUMPSHOT is not set | ||
| 1587 | # CONFIG_USB_STORAGE_ALAUDA is not set | ||
| 1588 | # CONFIG_USB_STORAGE_KARMA is not set | ||
| 1589 | # CONFIG_USB_LIBUSUAL is not set | ||
| 1590 | |||
| 1591 | # | ||
| 1592 | # USB Imaging devices | ||
| 1593 | # | ||
| 1594 | CONFIG_USB_MDC800=m | ||
| 1595 | CONFIG_USB_MICROTEK=m | ||
| 1596 | CONFIG_USB_MON=y | ||
| 1597 | |||
| 1598 | # | ||
| 1599 | # USB port drivers | ||
| 1600 | # | ||
| 1601 | # CONFIG_USB_USS720 is not set | ||
| 1602 | |||
| 1603 | # | ||
| 1604 | # USB Serial Converter support | ||
| 1605 | # | ||
| 1606 | CONFIG_USB_SERIAL=m | ||
| 1607 | CONFIG_USB_SERIAL_GENERIC=y | ||
| 1608 | # CONFIG_USB_SERIAL_AIRCABLE is not set | ||
| 1609 | # CONFIG_USB_SERIAL_AIRPRIME is not set | ||
| 1610 | # CONFIG_USB_SERIAL_ARK3116 is not set | ||
| 1611 | CONFIG_USB_SERIAL_BELKIN=m | ||
| 1612 | # CONFIG_USB_SERIAL_CH341 is not set | ||
| 1613 | # CONFIG_USB_SERIAL_WHITEHEAT is not set | ||
| 1614 | CONFIG_USB_SERIAL_DIGI_ACCELEPORT=m | ||
| 1615 | # CONFIG_USB_SERIAL_CP2101 is not set | ||
| 1616 | CONFIG_USB_SERIAL_CYPRESS_M8=m | ||
| 1617 | CONFIG_USB_SERIAL_EMPEG=m | ||
| 1618 | CONFIG_USB_SERIAL_FTDI_SIO=m | ||
| 1619 | # CONFIG_USB_SERIAL_FUNSOFT is not set | ||
| 1620 | CONFIG_USB_SERIAL_VISOR=m | ||
| 1621 | CONFIG_USB_SERIAL_IPAQ=m | ||
| 1622 | CONFIG_USB_SERIAL_IR=m | ||
| 1623 | CONFIG_USB_SERIAL_EDGEPORT=m | ||
| 1624 | CONFIG_USB_SERIAL_EDGEPORT_TI=m | ||
| 1625 | CONFIG_USB_SERIAL_GARMIN=m | ||
| 1626 | CONFIG_USB_SERIAL_IPW=m | ||
| 1627 | CONFIG_USB_SERIAL_KEYSPAN_PDA=m | ||
| 1628 | CONFIG_USB_SERIAL_KEYSPAN=m | ||
| 1629 | # CONFIG_USB_SERIAL_KEYSPAN_MPR is not set | ||
| 1630 | # CONFIG_USB_SERIAL_KEYSPAN_USA28 is not set | ||
| 1631 | # CONFIG_USB_SERIAL_KEYSPAN_USA28X is not set | ||
| 1632 | # CONFIG_USB_SERIAL_KEYSPAN_USA28XA is not set | ||
| 1633 | # CONFIG_USB_SERIAL_KEYSPAN_USA28XB is not set | ||
| 1634 | # CONFIG_USB_SERIAL_KEYSPAN_USA19 is not set | ||
| 1635 | # CONFIG_USB_SERIAL_KEYSPAN_USA18X is not set | ||
| 1636 | # CONFIG_USB_SERIAL_KEYSPAN_USA19W is not set | ||
| 1637 | # CONFIG_USB_SERIAL_KEYSPAN_USA19QW is not set | ||
| 1638 | # CONFIG_USB_SERIAL_KEYSPAN_USA19QI is not set | ||
| 1639 | # CONFIG_USB_SERIAL_KEYSPAN_USA49W is not set | ||
| 1640 | # CONFIG_USB_SERIAL_KEYSPAN_USA49WLC is not set | ||
| 1641 | CONFIG_USB_SERIAL_KLSI=m | ||
| 1642 | CONFIG_USB_SERIAL_KOBIL_SCT=m | ||
| 1643 | CONFIG_USB_SERIAL_MCT_U232=m | ||
| 1644 | # CONFIG_USB_SERIAL_MOS7720 is not set | ||
| 1645 | # CONFIG_USB_SERIAL_MOS7840 is not set | ||
| 1646 | # CONFIG_USB_SERIAL_NAVMAN is not set | ||
| 1647 | CONFIG_USB_SERIAL_PL2303=m | ||
| 1648 | # CONFIG_USB_SERIAL_OTI6858 is not set | ||
| 1649 | # CONFIG_USB_SERIAL_HP4X is not set | ||
| 1650 | CONFIG_USB_SERIAL_SAFE=m | ||
| 1651 | # CONFIG_USB_SERIAL_SAFE_PADDED is not set | ||
| 1652 | # CONFIG_USB_SERIAL_SIERRAWIRELESS is not set | ||
| 1653 | CONFIG_USB_SERIAL_TI=m | ||
| 1654 | CONFIG_USB_SERIAL_CYBERJACK=m | ||
| 1655 | CONFIG_USB_SERIAL_XIRCOM=m | ||
| 1656 | # CONFIG_USB_SERIAL_OPTION is not set | ||
| 1657 | CONFIG_USB_SERIAL_OMNINET=m | ||
| 1658 | # CONFIG_USB_SERIAL_DEBUG is not set | ||
| 1659 | CONFIG_USB_EZUSB=y | ||
| 1660 | |||
| 1661 | # | ||
| 1662 | # USB Miscellaneous drivers | ||
| 1663 | # | ||
| 1664 | CONFIG_USB_EMI62=m | ||
| 1665 | CONFIG_USB_EMI26=m | ||
| 1666 | # CONFIG_USB_ADUTUX is not set | ||
| 1667 | CONFIG_USB_AUERSWALD=m | ||
| 1668 | CONFIG_USB_RIO500=m | ||
| 1669 | CONFIG_USB_LEGOTOWER=m | ||
| 1670 | CONFIG_USB_LCD=m | ||
| 1671 | # CONFIG_USB_BERRY_CHARGE is not set | ||
| 1672 | CONFIG_USB_LED=m | ||
| 1673 | # CONFIG_USB_CYPRESS_CY7C63 is not set | ||
| 1674 | CONFIG_USB_CYTHERM=m | ||
| 1675 | # CONFIG_USB_PHIDGET is not set | ||
| 1676 | CONFIG_USB_IDMOUSE=m | ||
| 1677 | # CONFIG_USB_FTDI_ELAN is not set | ||
| 1678 | # CONFIG_USB_APPLEDISPLAY is not set | ||
| 1679 | # CONFIG_USB_SISUSBVGA is not set | ||
| 1680 | # CONFIG_USB_LD is not set | ||
| 1681 | # CONFIG_USB_TRANCEVIBRATOR is not set | ||
| 1682 | # CONFIG_USB_IOWARRIOR is not set | ||
| 1683 | # CONFIG_USB_TEST is not set | ||
| 1684 | |||
| 1685 | # | ||
| 1686 | # USB DSL modem support | ||
| 1687 | # | ||
| 1688 | |||
| 1689 | # | ||
| 1690 | # USB Gadget Support | ||
| 1691 | # | ||
| 1692 | # CONFIG_USB_GADGET is not set | ||
| 1693 | # CONFIG_MMC is not set | ||
| 1694 | CONFIG_NEW_LEDS=y | ||
| 1695 | CONFIG_LEDS_CLASS=y | ||
| 1696 | |||
| 1697 | # | ||
| 1698 | # LED drivers | ||
| 1699 | # | ||
| 1700 | |||
| 1701 | # | ||
| 1702 | # LED Triggers | ||
| 1703 | # | ||
| 1704 | # CONFIG_LEDS_TRIGGERS is not set | ||
| 1705 | # CONFIG_INFINIBAND is not set | ||
| 1706 | # CONFIG_EDAC is not set | ||
| 1707 | # CONFIG_RTC_CLASS is not set | ||
| 1708 | # CONFIG_DMADEVICES is not set | ||
| 1709 | # CONFIG_AUXDISPLAY is not set | ||
| 1710 | CONFIG_VIRTUALIZATION=y | ||
| 1711 | # CONFIG_KVM is not set | ||
| 1712 | # CONFIG_LGUEST is not set | ||
| 1713 | |||
| 1714 | # | ||
| 1715 | # Userspace I/O | ||
| 1716 | # | ||
| 1717 | # CONFIG_UIO is not set | ||
| 1718 | |||
| 1719 | # | ||
| 1720 | # Firmware Drivers | ||
| 1721 | # | ||
| 1722 | # CONFIG_EDD is not set | ||
| 1723 | # CONFIG_DELL_RBU is not set | ||
| 1724 | # CONFIG_DCDBAS is not set | ||
| 1725 | CONFIG_DMIID=y | ||
| 1726 | |||
| 1727 | # | ||
| 1728 | # File systems | ||
| 1729 | # | ||
| 1730 | CONFIG_EXT2_FS=y | ||
| 1731 | # CONFIG_EXT2_FS_XATTR is not set | ||
| 1732 | # CONFIG_EXT2_FS_XIP is not set | ||
| 1733 | CONFIG_EXT3_FS=y | ||
| 1734 | # CONFIG_EXT3_FS_XATTR is not set | ||
| 1735 | # CONFIG_EXT4DEV_FS is not set | ||
| 1736 | CONFIG_JBD=y | ||
| 1737 | # CONFIG_REISERFS_FS is not set | ||
| 1738 | # CONFIG_JFS_FS is not set | ||
| 1739 | # CONFIG_FS_POSIX_ACL is not set | ||
| 1740 | # CONFIG_XFS_FS is not set | ||
| 1741 | # CONFIG_GFS2_FS is not set | ||
| 1742 | # CONFIG_OCFS2_FS is not set | ||
| 1743 | # CONFIG_MINIX_FS is not set | ||
| 1744 | # CONFIG_ROMFS_FS is not set | ||
| 1745 | CONFIG_INOTIFY=y | ||
| 1746 | CONFIG_INOTIFY_USER=y | ||
| 1747 | # CONFIG_QUOTA is not set | ||
| 1748 | CONFIG_DNOTIFY=y | ||
| 1749 | # CONFIG_AUTOFS_FS is not set | ||
| 1750 | # CONFIG_AUTOFS4_FS is not set | ||
| 1751 | # CONFIG_FUSE_FS is not set | ||
| 1752 | |||
| 1753 | # | ||
| 1754 | # CD-ROM/DVD Filesystems | ||
| 1755 | # | ||
| 1756 | CONFIG_ISO9660_FS=y | ||
| 1757 | CONFIG_JOLIET=y | ||
| 1758 | # CONFIG_ZISOFS is not set | ||
| 1759 | CONFIG_UDF_FS=y | ||
| 1760 | CONFIG_UDF_NLS=y | ||
| 1761 | |||
| 1762 | # | ||
| 1763 | # DOS/FAT/NT Filesystems | ||
| 1764 | # | ||
| 1765 | CONFIG_FAT_FS=y | ||
| 1766 | # CONFIG_MSDOS_FS is not set | ||
| 1767 | CONFIG_VFAT_FS=y | ||
| 1768 | CONFIG_FAT_DEFAULT_CODEPAGE=437 | ||
| 1769 | CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" | ||
| 1770 | # CONFIG_NTFS_FS is not set | ||
| 1771 | |||
| 1772 | # | ||
| 1773 | # Pseudo filesystems | ||
| 1774 | # | ||
| 1775 | CONFIG_PROC_FS=y | ||
| 1776 | CONFIG_PROC_KCORE=y | ||
| 1777 | CONFIG_PROC_SYSCTL=y | ||
| 1778 | CONFIG_SYSFS=y | ||
| 1779 | CONFIG_TMPFS=y | ||
| 1780 | # CONFIG_TMPFS_POSIX_ACL is not set | ||
| 1781 | # CONFIG_HUGETLBFS is not set | ||
| 1782 | # CONFIG_HUGETLB_PAGE is not set | ||
| 1783 | # CONFIG_CONFIGFS_FS is not set | ||
| 1784 | |||
| 1785 | # | ||
| 1786 | # Miscellaneous filesystems | ||
| 1787 | # | ||
| 1788 | # CONFIG_ADFS_FS is not set | ||
| 1789 | # CONFIG_AFFS_FS is not set | ||
| 1790 | # CONFIG_HFS_FS is not set | ||
| 1791 | # CONFIG_HFSPLUS_FS is not set | ||
| 1792 | # CONFIG_BEFS_FS is not set | ||
| 1793 | # CONFIG_BFS_FS is not set | ||
| 1794 | # CONFIG_EFS_FS is not set | ||
| 1795 | CONFIG_CRAMFS=m | ||
| 1796 | CONFIG_SQUASHFS=m | ||
| 1797 | # CONFIG_SQUASHFS_EMBEDDED is not set | ||
| 1798 | CONFIG_SQUASHFS_FRAGMENT_CACHE_SIZE=3 | ||
| 1799 | # CONFIG_VXFS_FS is not set | ||
| 1800 | # CONFIG_HPFS_FS is not set | ||
| 1801 | # CONFIG_QNX4FS_FS is not set | ||
| 1802 | # CONFIG_SYSV_FS is not set | ||
| 1803 | # CONFIG_UFS_FS is not set | ||
| 1804 | CONFIG_NETWORK_FILESYSTEMS=y | ||
| 1805 | CONFIG_NFS_FS=y | ||
| 1806 | CONFIG_NFS_V3=y | ||
| 1807 | # CONFIG_NFS_V3_ACL is not set | ||
| 1808 | # CONFIG_NFS_V4 is not set | ||
| 1809 | # CONFIG_NFS_DIRECTIO is not set | ||
| 1810 | CONFIG_NFSD=y | ||
| 1811 | CONFIG_NFSD_V3=y | ||
| 1812 | # CONFIG_NFSD_V3_ACL is not set | ||
| 1813 | # CONFIG_NFSD_V4 is not set | ||
| 1814 | # CONFIG_NFSD_TCP is not set | ||
| 1815 | CONFIG_ROOT_NFS=y | ||
| 1816 | CONFIG_LOCKD=y | ||
| 1817 | CONFIG_LOCKD_V4=y | ||
| 1818 | CONFIG_EXPORTFS=y | ||
| 1819 | CONFIG_NFS_COMMON=y | ||
| 1820 | CONFIG_SUNRPC=y | ||
| 1821 | # CONFIG_SUNRPC_BIND34 is not set | ||
| 1822 | # CONFIG_RPCSEC_GSS_KRB5 is not set | ||
| 1823 | # CONFIG_RPCSEC_GSS_SPKM3 is not set | ||
| 1824 | CONFIG_SMB_FS=y | ||
| 1825 | # CONFIG_SMB_NLS_DEFAULT is not set | ||
| 1826 | CONFIG_CIFS=m | ||
| 1827 | # CONFIG_CIFS_STATS is not set | ||
| 1828 | # CONFIG_CIFS_WEAK_PW_HASH is not set | ||
| 1829 | # CONFIG_CIFS_XATTR is not set | ||
| 1830 | # CONFIG_CIFS_DEBUG2 is not set | ||
| 1831 | # CONFIG_CIFS_EXPERIMENTAL is not set | ||
| 1832 | # CONFIG_NCP_FS is not set | ||
| 1833 | # CONFIG_CODA_FS is not set | ||
| 1834 | # CONFIG_AFS_FS is not set | ||
| 1835 | |||
| 1836 | # | ||
| 1837 | # Partition Types | ||
| 1838 | # | ||
| 1839 | CONFIG_PARTITION_ADVANCED=y | ||
| 1840 | # CONFIG_ACORN_PARTITION is not set | ||
| 1841 | # CONFIG_OSF_PARTITION is not set | ||
| 1842 | # CONFIG_AMIGA_PARTITION is not set | ||
| 1843 | # CONFIG_ATARI_PARTITION is not set | ||
| 1844 | # CONFIG_MAC_PARTITION is not set | ||
| 1845 | CONFIG_MSDOS_PARTITION=y | ||
| 1846 | # CONFIG_BSD_DISKLABEL is not set | ||
| 1847 | # CONFIG_MINIX_SUBPARTITION is not set | ||
| 1848 | # CONFIG_SOLARIS_X86_PARTITION is not set | ||
| 1849 | # CONFIG_UNIXWARE_DISKLABEL is not set | ||
| 1850 | # CONFIG_LDM_PARTITION is not set | ||
| 1851 | # CONFIG_SGI_PARTITION is not set | ||
| 1852 | # CONFIG_ULTRIX_PARTITION is not set | ||
| 1853 | # CONFIG_SUN_PARTITION is not set | ||
| 1854 | # CONFIG_KARMA_PARTITION is not set | ||
| 1855 | # CONFIG_EFI_PARTITION is not set | ||
| 1856 | # CONFIG_SYSV68_PARTITION is not set | ||
| 1857 | CONFIG_NLS=y | ||
| 1858 | CONFIG_NLS_DEFAULT="cp437" | ||
| 1859 | CONFIG_NLS_CODEPAGE_437=y | ||
| 1860 | CONFIG_NLS_CODEPAGE_737=m | ||
| 1861 | CONFIG_NLS_CODEPAGE_775=m | ||
| 1862 | CONFIG_NLS_CODEPAGE_850=m | ||
| 1863 | CONFIG_NLS_CODEPAGE_852=m | ||
| 1864 | CONFIG_NLS_CODEPAGE_855=m | ||
| 1865 | CONFIG_NLS_CODEPAGE_857=m | ||
| 1866 | CONFIG_NLS_CODEPAGE_860=m | ||
| 1867 | CONFIG_NLS_CODEPAGE_861=m | ||
| 1868 | CONFIG_NLS_CODEPAGE_862=m | ||
| 1869 | CONFIG_NLS_CODEPAGE_863=m | ||
| 1870 | CONFIG_NLS_CODEPAGE_864=m | ||
| 1871 | CONFIG_NLS_CODEPAGE_865=m | ||
| 1872 | CONFIG_NLS_CODEPAGE_866=m | ||
| 1873 | CONFIG_NLS_CODEPAGE_869=m | ||
| 1874 | CONFIG_NLS_CODEPAGE_936=m | ||
| 1875 | CONFIG_NLS_CODEPAGE_950=m | ||
| 1876 | CONFIG_NLS_CODEPAGE_932=m | ||
| 1877 | CONFIG_NLS_CODEPAGE_949=m | ||
| 1878 | CONFIG_NLS_CODEPAGE_874=m | ||
| 1879 | CONFIG_NLS_ISO8859_8=m | ||
| 1880 | CONFIG_NLS_CODEPAGE_1250=m | ||
| 1881 | CONFIG_NLS_CODEPAGE_1251=m | ||
| 1882 | CONFIG_NLS_ASCII=m | ||
| 1883 | CONFIG_NLS_ISO8859_1=y | ||
| 1884 | CONFIG_NLS_ISO8859_2=m | ||
| 1885 | CONFIG_NLS_ISO8859_3=m | ||
| 1886 | CONFIG_NLS_ISO8859_4=m | ||
| 1887 | CONFIG_NLS_ISO8859_5=m | ||
| 1888 | CONFIG_NLS_ISO8859_6=m | ||
| 1889 | CONFIG_NLS_ISO8859_7=m | ||
| 1890 | CONFIG_NLS_ISO8859_9=m | ||
| 1891 | CONFIG_NLS_ISO8859_13=m | ||
| 1892 | CONFIG_NLS_ISO8859_14=m | ||
| 1893 | CONFIG_NLS_ISO8859_15=m | ||
| 1894 | CONFIG_NLS_KOI8_R=m | ||
| 1895 | CONFIG_NLS_KOI8_U=m | ||
| 1896 | CONFIG_NLS_UTF8=y | ||
| 1897 | # CONFIG_DLM is not set | ||
| 1898 | CONFIG_INSTRUMENTATION=y | ||
| 1899 | CONFIG_PROFILING=y | ||
| 1900 | CONFIG_OPROFILE=m | ||
| 1901 | # CONFIG_KPROBES is not set | ||
| 1902 | # CONFIG_MARKERS is not set | ||
| 1903 | |||
| 1904 | # | ||
| 1905 | # Kernel hacking | ||
| 1906 | # | ||
| 1907 | CONFIG_TRACE_IRQFLAGS_SUPPORT=y | ||
| 1908 | # CONFIG_PRINTK_TIME is not set | ||
| 1909 | CONFIG_ENABLE_WARN_DEPRECATED=y | ||
| 1910 | CONFIG_ENABLE_MUST_CHECK=y | ||
| 1911 | CONFIG_MAGIC_SYSRQ=y | ||
| 1912 | # CONFIG_UNUSED_SYMBOLS is not set | ||
| 1913 | # CONFIG_DEBUG_FS is not set | ||
| 1914 | # CONFIG_HEADERS_CHECK is not set | ||
| 1915 | # CONFIG_DEBUG_KERNEL is not set | ||
| 1916 | # CONFIG_DEBUG_BUGVERBOSE is not set | ||
| 1917 | # CONFIG_SAMPLES is not set | ||
| 1918 | CONFIG_EARLY_PRINTK=y | ||
| 1919 | CONFIG_X86_FIND_SMP_CONFIG=y | ||
| 1920 | CONFIG_X86_MPPARSE=y | ||
| 1921 | CONFIG_DOUBLEFAULT=y | ||
| 1922 | |||
| 1923 | # | ||
| 1924 | # Security options | ||
| 1925 | # | ||
| 1926 | # CONFIG_KEYS is not set | ||
| 1927 | # CONFIG_SECURITY is not set | ||
| 1928 | # CONFIG_SECURITY_FILE_CAPABILITIES is not set | ||
| 1929 | CONFIG_CRYPTO=y | ||
| 1930 | CONFIG_CRYPTO_ALGAPI=m | ||
| 1931 | CONFIG_CRYPTO_BLKCIPHER=m | ||
| 1932 | CONFIG_CRYPTO_HASH=m | ||
| 1933 | CONFIG_CRYPTO_MANAGER=m | ||
| 1934 | CONFIG_CRYPTO_HMAC=m | ||
| 1935 | # CONFIG_CRYPTO_XCBC is not set | ||
| 1936 | CONFIG_CRYPTO_NULL=m | ||
| 1937 | CONFIG_CRYPTO_MD4=m | ||
| 1938 | CONFIG_CRYPTO_MD5=m | ||
| 1939 | CONFIG_CRYPTO_SHA1=m | ||
| 1940 | CONFIG_CRYPTO_SHA256=m | ||
| 1941 | CONFIG_CRYPTO_SHA512=m | ||
| 1942 | CONFIG_CRYPTO_WP512=m | ||
| 1943 | # CONFIG_CRYPTO_TGR192 is not set | ||
| 1944 | # CONFIG_CRYPTO_GF128MUL is not set | ||
| 1945 | CONFIG_CRYPTO_ECB=m | ||
| 1946 | CONFIG_CRYPTO_CBC=m | ||
| 1947 | CONFIG_CRYPTO_PCBC=m | ||
| 1948 | # CONFIG_CRYPTO_LRW is not set | ||
| 1949 | # CONFIG_CRYPTO_XTS is not set | ||
| 1950 | # CONFIG_CRYPTO_CRYPTD is not set | ||
| 1951 | CONFIG_CRYPTO_DES=m | ||
| 1952 | # CONFIG_CRYPTO_FCRYPT is not set | ||
| 1953 | CONFIG_CRYPTO_BLOWFISH=m | ||
| 1954 | CONFIG_CRYPTO_TWOFISH=m | ||
| 1955 | CONFIG_CRYPTO_TWOFISH_COMMON=m | ||
| 1956 | # CONFIG_CRYPTO_TWOFISH_586 is not set | ||
| 1957 | CONFIG_CRYPTO_SERPENT=m | ||
| 1958 | CONFIG_CRYPTO_AES=m | ||
| 1959 | # CONFIG_CRYPTO_AES_586 is not set | ||
| 1960 | CONFIG_CRYPTO_CAST5=m | ||
| 1961 | CONFIG_CRYPTO_CAST6=m | ||
| 1962 | CONFIG_CRYPTO_TEA=m | ||
| 1963 | CONFIG_CRYPTO_ARC4=m | ||
| 1964 | CONFIG_CRYPTO_KHAZAD=m | ||
| 1965 | CONFIG_CRYPTO_ANUBIS=m | ||
| 1966 | # CONFIG_CRYPTO_SEED is not set | ||
| 1967 | CONFIG_CRYPTO_DEFLATE=m | ||
| 1968 | CONFIG_CRYPTO_LZO=m | ||
| 1969 | CONFIG_CRYPTO_MICHAEL_MIC=m | ||
| 1970 | CONFIG_CRYPTO_CRC32C=m | ||
| 1971 | CONFIG_CRYPTO_CAMELLIA=m | ||
| 1972 | CONFIG_CRYPTO_TEST=m | ||
| 1973 | # CONFIG_CRYPTO_AUTHENC is not set | ||
| 1974 | # CONFIG_CRYPTO_HW is not set | ||
| 1975 | |||
| 1976 | # | ||
| 1977 | # Library routines | ||
| 1978 | # | ||
| 1979 | CONFIG_BITREVERSE=y | ||
| 1980 | CONFIG_CRC_CCITT=y | ||
| 1981 | # CONFIG_CRC16 is not set | ||
| 1982 | # CONFIG_CRC_ITU_T is not set | ||
| 1983 | CONFIG_CRC32=y | ||
| 1984 | # CONFIG_CRC7 is not set | ||
| 1985 | CONFIG_LIBCRC32C=m | ||
| 1986 | CONFIG_AUDIT_GENERIC=y | ||
| 1987 | CONFIG_ZLIB_INFLATE=m | ||
| 1988 | CONFIG_ZLIB_DEFLATE=m | ||
| 1989 | CONFIG_LZO_COMPRESS=m | ||
| 1990 | CONFIG_LZO_DECOMPRESS=m | ||
| 1991 | CONFIG_PLIST=y | ||
| 1992 | CONFIG_HAS_IOMEM=y | ||
| 1993 | CONFIG_HAS_IOPORT=y | ||
| 1994 | CONFIG_HAS_DMA=y | ||
diff --git a/meta/packages/linux/linux-rp-2.6.25+2.6.26-rc4/defconfig-c7x0 b/meta/packages/linux/linux-rp-2.6.25+2.6.26-rc4/defconfig-c7x0 new file mode 100644 index 0000000000..6c188e7b57 --- /dev/null +++ b/meta/packages/linux/linux-rp-2.6.25+2.6.26-rc4/defconfig-c7x0 | |||
| @@ -0,0 +1,1747 @@ | |||
| 1 | # | ||
| 2 | # Automatically generated make config: don't edit | ||
| 3 | # Linux kernel version: 2.6.24-rc8 | ||
| 4 | # Sun Jan 20 18:27:11 2008 | ||
| 5 | # | ||
| 6 | CONFIG_ARM=y | ||
| 7 | CONFIG_SYS_SUPPORTS_APM_EMULATION=y | ||
| 8 | CONFIG_GENERIC_GPIO=y | ||
| 9 | CONFIG_GENERIC_TIME=y | ||
| 10 | CONFIG_GENERIC_CLOCKEVENTS=y | ||
| 11 | CONFIG_MMU=y | ||
| 12 | # CONFIG_NO_IOPORT is not set | ||
| 13 | CONFIG_GENERIC_HARDIRQS=y | ||
| 14 | CONFIG_STACKTRACE_SUPPORT=y | ||
| 15 | CONFIG_LOCKDEP_SUPPORT=y | ||
| 16 | CONFIG_TRACE_IRQFLAGS_SUPPORT=y | ||
| 17 | CONFIG_HARDIRQS_SW_RESEND=y | ||
| 18 | CONFIG_GENERIC_IRQ_PROBE=y | ||
| 19 | CONFIG_RWSEM_GENERIC_SPINLOCK=y | ||
| 20 | # CONFIG_ARCH_HAS_ILOG2_U32 is not set | ||
| 21 | # CONFIG_ARCH_HAS_ILOG2_U64 is not set | ||
| 22 | CONFIG_GENERIC_HWEIGHT=y | ||
| 23 | CONFIG_GENERIC_CALIBRATE_DELAY=y | ||
| 24 | CONFIG_ZONE_DMA=y | ||
| 25 | CONFIG_ARCH_MTD_XIP=y | ||
| 26 | CONFIG_VECTORS_BASE=0xffff0000 | ||
| 27 | CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" | ||
| 28 | |||
| 29 | # | ||
| 30 | # General setup | ||
| 31 | # | ||
| 32 | CONFIG_EXPERIMENTAL=y | ||
| 33 | CONFIG_BROKEN_ON_SMP=y | ||
| 34 | CONFIG_LOCK_KERNEL=y | ||
| 35 | CONFIG_INIT_ENV_ARG_LIMIT=32 | ||
| 36 | CONFIG_LOCALVERSION="" | ||
| 37 | # CONFIG_LOCALVERSION_AUTO is not set | ||
| 38 | CONFIG_SWAP=y | ||
| 39 | CONFIG_SYSVIPC=y | ||
| 40 | CONFIG_SYSVIPC_SYSCTL=y | ||
| 41 | # CONFIG_POSIX_MQUEUE is not set | ||
| 42 | CONFIG_BSD_PROCESS_ACCT=y | ||
| 43 | CONFIG_BSD_PROCESS_ACCT_V3=y | ||
| 44 | # CONFIG_TASKSTATS is not set | ||
| 45 | # CONFIG_USER_NS is not set | ||
| 46 | # CONFIG_PID_NS is not set | ||
| 47 | # CONFIG_AUDIT is not set | ||
| 48 | # CONFIG_IKCONFIG is not set | ||
| 49 | CONFIG_LOG_BUF_SHIFT=14 | ||
| 50 | # CONFIG_CGROUPS is not set | ||
| 51 | CONFIG_FAIR_GROUP_SCHED=y | ||
| 52 | CONFIG_FAIR_USER_SCHED=y | ||
| 53 | # CONFIG_FAIR_CGROUP_SCHED is not set | ||
| 54 | CONFIG_SYSFS_DEPRECATED=y | ||
| 55 | # CONFIG_RELAY is not set | ||
| 56 | # CONFIG_BLK_DEV_INITRD is not set | ||
| 57 | CONFIG_CC_OPTIMIZE_FOR_SIZE=y | ||
| 58 | CONFIG_SYSCTL=y | ||
| 59 | CONFIG_EMBEDDED=y | ||
| 60 | CONFIG_UID16=y | ||
| 61 | CONFIG_SYSCTL_SYSCALL=y | ||
| 62 | CONFIG_KALLSYMS=y | ||
| 63 | # CONFIG_KALLSYMS_ALL is not set | ||
| 64 | # CONFIG_KALLSYMS_EXTRA_PASS is not set | ||
| 65 | CONFIG_HOTPLUG=y | ||
| 66 | CONFIG_PRINTK=y | ||
| 67 | CONFIG_BUG=y | ||
| 68 | CONFIG_ELF_CORE=y | ||
| 69 | CONFIG_BASE_FULL=y | ||
| 70 | CONFIG_FUTEX=y | ||
| 71 | CONFIG_ANON_INODES=y | ||
| 72 | CONFIG_EPOLL=y | ||
| 73 | CONFIG_SIGNALFD=y | ||
| 74 | CONFIG_EVENTFD=y | ||
| 75 | CONFIG_SHMEM=y | ||
| 76 | CONFIG_VM_EVENT_COUNTERS=y | ||
| 77 | CONFIG_SLAB=y | ||
| 78 | # CONFIG_SLUB is not set | ||
| 79 | # CONFIG_SLOB is not set | ||
| 80 | CONFIG_SLABINFO=y | ||
| 81 | CONFIG_RT_MUTEXES=y | ||
| 82 | # CONFIG_TINY_SHMEM is not set | ||
| 83 | CONFIG_BASE_SMALL=0 | ||
| 84 | CONFIG_MODULES=y | ||
| 85 | CONFIG_MODULE_UNLOAD=y | ||
| 86 | CONFIG_MODULE_FORCE_UNLOAD=y | ||
| 87 | # CONFIG_MODVERSIONS is not set | ||
| 88 | # CONFIG_MODULE_SRCVERSION_ALL is not set | ||
| 89 | CONFIG_KMOD=y | ||
| 90 | CONFIG_BLOCK=y | ||
| 91 | # CONFIG_LBD is not set | ||
| 92 | # CONFIG_BLK_DEV_IO_TRACE is not set | ||
| 93 | # CONFIG_LSF is not set | ||
| 94 | # CONFIG_BLK_DEV_BSG is not set | ||
| 95 | |||
| 96 | # | ||
| 97 | # IO Schedulers | ||
| 98 | # | ||
| 99 | CONFIG_IOSCHED_NOOP=y | ||
| 100 | CONFIG_IOSCHED_AS=y | ||
| 101 | CONFIG_IOSCHED_DEADLINE=m | ||
| 102 | CONFIG_IOSCHED_CFQ=m | ||
| 103 | CONFIG_DEFAULT_AS=y | ||
| 104 | # CONFIG_DEFAULT_DEADLINE is not set | ||
| 105 | # CONFIG_DEFAULT_CFQ is not set | ||
| 106 | # CONFIG_DEFAULT_NOOP is not set | ||
| 107 | CONFIG_DEFAULT_IOSCHED="anticipatory" | ||
| 108 | |||
| 109 | # | ||
| 110 | # System Type | ||
| 111 | # | ||
| 112 | # CONFIG_ARCH_AAEC2000 is not set | ||
| 113 | # CONFIG_ARCH_INTEGRATOR is not set | ||
| 114 | # CONFIG_ARCH_REALVIEW is not set | ||
| 115 | # CONFIG_ARCH_VERSATILE is not set | ||
| 116 | # CONFIG_ARCH_AT91 is not set | ||
| 117 | # CONFIG_ARCH_CLPS7500 is not set | ||
| 118 | # CONFIG_ARCH_CLPS711X is not set | ||
| 119 | # CONFIG_ARCH_CO285 is not set | ||
| 120 | # CONFIG_ARCH_EBSA110 is not set | ||
| 121 | # CONFIG_ARCH_EP93XX is not set | ||
| 122 | # CONFIG_ARCH_FOOTBRIDGE is not set | ||
| 123 | # CONFIG_ARCH_NETX is not set | ||
| 124 | # CONFIG_ARCH_H720X is not set | ||
| 125 | # CONFIG_ARCH_IMX is not set | ||
| 126 | # CONFIG_ARCH_IOP13XX is not set | ||
| 127 | # CONFIG_ARCH_IOP32X is not set | ||
| 128 | # CONFIG_ARCH_IOP33X is not set | ||
| 129 | # CONFIG_ARCH_IXP23XX is not set | ||
| 130 | # CONFIG_ARCH_IXP2000 is not set | ||
| 131 | # CONFIG_ARCH_IXP4XX is not set | ||
| 132 | # CONFIG_ARCH_L7200 is not set | ||
| 133 | # CONFIG_ARCH_KS8695 is not set | ||
| 134 | # CONFIG_ARCH_NS9XXX is not set | ||
| 135 | # CONFIG_ARCH_MXC is not set | ||
| 136 | # CONFIG_ARCH_PNX4008 is not set | ||
| 137 | CONFIG_ARCH_PXA=y | ||
| 138 | # CONFIG_ARCH_RPC is not set | ||
| 139 | # CONFIG_ARCH_SA1100 is not set | ||
| 140 | # CONFIG_ARCH_S3C2410 is not set | ||
| 141 | # CONFIG_ARCH_SHARK is not set | ||
| 142 | # CONFIG_ARCH_LH7A40X is not set | ||
| 143 | # CONFIG_ARCH_DAVINCI is not set | ||
| 144 | # CONFIG_ARCH_OMAP is not set | ||
| 145 | |||
| 146 | # | ||
| 147 | # Intel PXA2xx/PXA3xx Implementations | ||
| 148 | # | ||
| 149 | # CONFIG_ARCH_LUBBOCK is not set | ||
| 150 | # CONFIG_MACH_LOGICPD_PXA270 is not set | ||
| 151 | # CONFIG_MACH_MAINSTONE is not set | ||
| 152 | # CONFIG_ARCH_PXA_IDP is not set | ||
| 153 | CONFIG_PXA_SHARPSL=y | ||
| 154 | # CONFIG_MACH_TRIZEPS4 is not set | ||
| 155 | # CONFIG_MACH_EM_X270 is not set | ||
| 156 | # CONFIG_MACH_ZYLONITE is not set | ||
| 157 | # CONFIG_MACH_ARMCORE is not set | ||
| 158 | CONFIG_PXA_SHARPSL_25x=y | ||
| 159 | # CONFIG_PXA_SHARPSL_27x is not set | ||
| 160 | # CONFIG_MACH_HX2750 is not set | ||
| 161 | # CONFIG_MACH_POODLE is not set | ||
| 162 | CONFIG_MACH_CORGI=y | ||
| 163 | CONFIG_MACH_SHEPHERD=y | ||
| 164 | CONFIG_MACH_HUSKY=y | ||
| 165 | # CONFIG_MACH_TOSA is not set | ||
| 166 | CONFIG_PXA25x=y | ||
| 167 | CONFIG_PXA_SHARP_C7xx=y | ||
| 168 | CONFIG_PXA_SSP=y | ||
| 169 | # CONFIG_PXA_KEYS is not set | ||
| 170 | |||
| 171 | # | ||
| 172 | # Boot options | ||
| 173 | # | ||
| 174 | |||
| 175 | # | ||
| 176 | # Power management | ||
| 177 | # | ||
| 178 | |||
| 179 | # | ||
| 180 | # Processor Type | ||
| 181 | # | ||
| 182 | CONFIG_CPU_32=y | ||
| 183 | CONFIG_CPU_XSCALE=y | ||
| 184 | CONFIG_CPU_32v5=y | ||
| 185 | CONFIG_CPU_ABRT_EV5T=y | ||
| 186 | CONFIG_CPU_CACHE_VIVT=y | ||
| 187 | CONFIG_CPU_TLB_V4WBI=y | ||
| 188 | CONFIG_CPU_CP15=y | ||
| 189 | CONFIG_CPU_CP15_MMU=y | ||
| 190 | |||
| 191 | # | ||
| 192 | # Processor Features | ||
| 193 | # | ||
| 194 | CONFIG_ARM_THUMB=y | ||
| 195 | # CONFIG_CPU_DCACHE_DISABLE is not set | ||
| 196 | # CONFIG_OUTER_CACHE is not set | ||
| 197 | # CONFIG_IWMMXT is not set | ||
| 198 | CONFIG_XSCALE_PMU=y | ||
| 199 | CONFIG_SHARP_PARAM=y | ||
| 200 | CONFIG_SHARPSL_PM=y | ||
| 201 | CONFIG_SHARP_SCOOP=y | ||
| 202 | |||
| 203 | # | ||
| 204 | # Bus support | ||
| 205 | # | ||
| 206 | # CONFIG_PCI_SYSCALL is not set | ||
| 207 | # CONFIG_ARCH_SUPPORTS_MSI is not set | ||
| 208 | CONFIG_PCCARD=m | ||
| 209 | # CONFIG_PCMCIA_DEBUG is not set | ||
| 210 | CONFIG_PCMCIA=m | ||
| 211 | CONFIG_PCMCIA_LOAD_CIS=y | ||
| 212 | CONFIG_PCMCIA_IOCTL=y | ||
| 213 | |||
| 214 | # | ||
| 215 | # PC-card bridges | ||
| 216 | # | ||
| 217 | CONFIG_PCMCIA_PXA2XX=m | ||
| 218 | |||
| 219 | # | ||
| 220 | # Kernel Features | ||
| 221 | # | ||
| 222 | CONFIG_TICK_ONESHOT=y | ||
| 223 | CONFIG_NO_HZ=y | ||
| 224 | CONFIG_HIGH_RES_TIMERS=y | ||
| 225 | CONFIG_GENERIC_CLOCKEVENTS_BUILD=y | ||
| 226 | CONFIG_PREEMPT=y | ||
| 227 | CONFIG_HZ=100 | ||
| 228 | CONFIG_AEABI=y | ||
| 229 | CONFIG_OABI_COMPAT=y | ||
| 230 | # CONFIG_ARCH_DISCONTIGMEM_ENABLE is not set | ||
| 231 | CONFIG_SELECT_MEMORY_MODEL=y | ||
| 232 | CONFIG_FLATMEM_MANUAL=y | ||
| 233 | # CONFIG_DISCONTIGMEM_MANUAL is not set | ||
| 234 | # CONFIG_SPARSEMEM_MANUAL is not set | ||
| 235 | CONFIG_FLATMEM=y | ||
| 236 | CONFIG_FLAT_NODE_MEM_MAP=y | ||
| 237 | # CONFIG_SPARSEMEM_STATIC is not set | ||
| 238 | # CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set | ||
| 239 | CONFIG_SPLIT_PTLOCK_CPUS=4096 | ||
| 240 | # CONFIG_RESOURCES_64BIT is not set | ||
| 241 | CONFIG_ZONE_DMA_FLAG=1 | ||
| 242 | CONFIG_BOUNCE=y | ||
| 243 | CONFIG_VIRT_TO_BUS=y | ||
| 244 | CONFIG_ALIGNMENT_TRAP=y | ||
| 245 | |||
| 246 | # | ||
| 247 | # Boot options | ||
| 248 | # | ||
| 249 | CONFIG_ZBOOT_ROM_TEXT=0x0 | ||
| 250 | CONFIG_ZBOOT_ROM_BSS=0x0 | ||
| 251 | CONFIG_CMDLINE="console=ttyS0,115200n8 console=tty1 noinitrd root=/dev/mtdblock2 rootfstype=jffs2 dyntick=enable debug" | ||
| 252 | # CONFIG_XIP_KERNEL is not set | ||
| 253 | CONFIG_KEXEC=y | ||
| 254 | CONFIG_ATAGS_PROC=y | ||
| 255 | CONFIG_CPU_FREQ_PXA25x=y | ||
| 256 | |||
| 257 | # | ||
| 258 | # CPU Frequency scaling | ||
| 259 | # | ||
| 260 | CONFIG_CPU_FREQ=y | ||
| 261 | CONFIG_CPU_FREQ_TABLE=y | ||
| 262 | CONFIG_CPU_FREQ_DEBUG=y | ||
| 263 | CONFIG_CPU_FREQ_STAT=y | ||
| 264 | # CONFIG_CPU_FREQ_STAT_DETAILS is not set | ||
| 265 | CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE=y | ||
| 266 | # CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set | ||
| 267 | # CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND is not set | ||
| 268 | # CONFIG_CPU_FREQ_DEFAULT_GOV_CONSERVATIVE is not set | ||
| 269 | CONFIG_CPU_FREQ_GOV_PERFORMANCE=y | ||
| 270 | CONFIG_CPU_FREQ_GOV_POWERSAVE=y | ||
| 271 | CONFIG_CPU_FREQ_GOV_USERSPACE=y | ||
| 272 | CONFIG_CPU_FREQ_GOV_ONDEMAND=y | ||
| 273 | CONFIG_CPU_FREQ_GOV_CONSERVATIVE=y | ||
| 274 | |||
| 275 | # | ||
| 276 | # Floating point emulation | ||
| 277 | # | ||
| 278 | |||
| 279 | # | ||
| 280 | # At least one emulation must be selected | ||
| 281 | # | ||
| 282 | CONFIG_FPE_NWFPE=y | ||
| 283 | # CONFIG_FPE_NWFPE_XP is not set | ||
| 284 | # CONFIG_FPE_FASTFPE is not set | ||
| 285 | |||
| 286 | # | ||
| 287 | # Userspace binary formats | ||
| 288 | # | ||
| 289 | CONFIG_BINFMT_ELF=y | ||
| 290 | CONFIG_BINFMT_AOUT=m | ||
| 291 | CONFIG_BINFMT_MISC=m | ||
| 292 | |||
| 293 | # | ||
| 294 | # Power management options | ||
| 295 | # | ||
| 296 | CONFIG_PM=y | ||
| 297 | # CONFIG_PM_LEGACY is not set | ||
| 298 | # CONFIG_PM_DEBUG is not set | ||
| 299 | CONFIG_PM_SLEEP=y | ||
| 300 | CONFIG_SUSPEND_UP_POSSIBLE=y | ||
| 301 | CONFIG_SUSPEND=y | ||
| 302 | CONFIG_APM_EMULATION=y | ||
| 303 | CONFIG_INPUT_APMPOWER=y | ||
| 304 | |||
| 305 | # | ||
| 306 | # Networking | ||
| 307 | # | ||
| 308 | CONFIG_NET=y | ||
| 309 | |||
| 310 | # | ||
| 311 | # Networking options | ||
| 312 | # | ||
| 313 | CONFIG_PACKET=m | ||
| 314 | CONFIG_PACKET_MMAP=y | ||
| 315 | CONFIG_UNIX=y | ||
| 316 | CONFIG_XFRM=y | ||
| 317 | CONFIG_XFRM_USER=m | ||
| 318 | # CONFIG_XFRM_SUB_POLICY is not set | ||
| 319 | # CONFIG_XFRM_MIGRATE is not set | ||
| 320 | # CONFIG_NET_KEY is not set | ||
| 321 | CONFIG_INET=y | ||
| 322 | # CONFIG_IP_MULTICAST is not set | ||
| 323 | # CONFIG_IP_ADVANCED_ROUTER is not set | ||
| 324 | CONFIG_IP_FIB_HASH=y | ||
| 325 | # CONFIG_IP_PNP is not set | ||
| 326 | # CONFIG_NET_IPIP is not set | ||
| 327 | # CONFIG_NET_IPGRE is not set | ||
| 328 | # CONFIG_ARPD is not set | ||
| 329 | CONFIG_SYN_COOKIES=y | ||
| 330 | # CONFIG_INET_AH is not set | ||
| 331 | # CONFIG_INET_ESP is not set | ||
| 332 | # CONFIG_INET_IPCOMP is not set | ||
| 333 | # CONFIG_INET_XFRM_TUNNEL is not set | ||
| 334 | CONFIG_INET_TUNNEL=m | ||
| 335 | CONFIG_INET_XFRM_MODE_TRANSPORT=m | ||
| 336 | CONFIG_INET_XFRM_MODE_TUNNEL=m | ||
| 337 | CONFIG_INET_XFRM_MODE_BEET=m | ||
| 338 | # CONFIG_INET_LRO is not set | ||
| 339 | CONFIG_INET_DIAG=m | ||
| 340 | CONFIG_INET_TCP_DIAG=m | ||
| 341 | # CONFIG_TCP_CONG_ADVANCED is not set | ||
| 342 | CONFIG_TCP_CONG_CUBIC=y | ||
| 343 | CONFIG_DEFAULT_TCP_CONG="cubic" | ||
| 344 | # CONFIG_TCP_MD5SIG is not set | ||
| 345 | # CONFIG_IP_VS is not set | ||
| 346 | CONFIG_IPV6=m | ||
| 347 | # CONFIG_IPV6_PRIVACY is not set | ||
| 348 | # CONFIG_IPV6_ROUTER_PREF is not set | ||
| 349 | # CONFIG_IPV6_OPTIMISTIC_DAD is not set | ||
| 350 | CONFIG_INET6_AH=m | ||
| 351 | CONFIG_INET6_ESP=m | ||
| 352 | CONFIG_INET6_IPCOMP=m | ||
| 353 | # CONFIG_IPV6_MIP6 is not set | ||
| 354 | CONFIG_INET6_XFRM_TUNNEL=m | ||
| 355 | CONFIG_INET6_TUNNEL=m | ||
| 356 | CONFIG_INET6_XFRM_MODE_TRANSPORT=m | ||
| 357 | CONFIG_INET6_XFRM_MODE_TUNNEL=m | ||
| 358 | CONFIG_INET6_XFRM_MODE_BEET=m | ||
| 359 | # CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION is not set | ||
| 360 | CONFIG_IPV6_SIT=m | ||
| 361 | CONFIG_IPV6_TUNNEL=m | ||
| 362 | # CONFIG_IPV6_MULTIPLE_TABLES is not set | ||
| 363 | # CONFIG_NETWORK_SECMARK is not set | ||
| 364 | CONFIG_NETFILTER=y | ||
| 365 | # CONFIG_NETFILTER_DEBUG is not set | ||
| 366 | |||
| 367 | # | ||
| 368 | # Core Netfilter Configuration | ||
| 369 | # | ||
| 370 | # CONFIG_NETFILTER_NETLINK is not set | ||
| 371 | # CONFIG_NF_CONNTRACK_ENABLED is not set | ||
| 372 | # CONFIG_NF_CONNTRACK is not set | ||
| 373 | CONFIG_NETFILTER_XTABLES=m | ||
| 374 | # CONFIG_NETFILTER_XT_TARGET_CLASSIFY is not set | ||
| 375 | # CONFIG_NETFILTER_XT_TARGET_DSCP is not set | ||
| 376 | # CONFIG_NETFILTER_XT_TARGET_MARK is not set | ||
| 377 | # CONFIG_NETFILTER_XT_TARGET_NFQUEUE is not set | ||
| 378 | # CONFIG_NETFILTER_XT_TARGET_NFLOG is not set | ||
| 379 | # CONFIG_NETFILTER_XT_TARGET_TRACE is not set | ||
| 380 | # CONFIG_NETFILTER_XT_TARGET_TCPMSS is not set | ||
| 381 | # CONFIG_NETFILTER_XT_MATCH_COMMENT is not set | ||
| 382 | # CONFIG_NETFILTER_XT_MATCH_DCCP is not set | ||
| 383 | # CONFIG_NETFILTER_XT_MATCH_DSCP is not set | ||
| 384 | # CONFIG_NETFILTER_XT_MATCH_ESP is not set | ||
| 385 | # CONFIG_NETFILTER_XT_MATCH_LENGTH is not set | ||
| 386 | # CONFIG_NETFILTER_XT_MATCH_LIMIT is not set | ||
| 387 | # CONFIG_NETFILTER_XT_MATCH_MAC is not set | ||
| 388 | # CONFIG_NETFILTER_XT_MATCH_MARK is not set | ||
| 389 | # CONFIG_NETFILTER_XT_MATCH_POLICY is not set | ||
| 390 | # CONFIG_NETFILTER_XT_MATCH_MULTIPORT is not set | ||
| 391 | # CONFIG_NETFILTER_XT_MATCH_PKTTYPE is not set | ||
| 392 | # CONFIG_NETFILTER_XT_MATCH_QUOTA is not set | ||
| 393 | # CONFIG_NETFILTER_XT_MATCH_REALM is not set | ||
| 394 | # CONFIG_NETFILTER_XT_MATCH_SCTP is not set | ||
| 395 | # CONFIG_NETFILTER_XT_MATCH_STATISTIC is not set | ||
| 396 | # CONFIG_NETFILTER_XT_MATCH_STRING is not set | ||
| 397 | # CONFIG_NETFILTER_XT_MATCH_TCPMSS is not set | ||
| 398 | # CONFIG_NETFILTER_XT_MATCH_TIME is not set | ||
| 399 | # CONFIG_NETFILTER_XT_MATCH_U32 is not set | ||
| 400 | # CONFIG_NETFILTER_XT_MATCH_HASHLIMIT is not set | ||
| 401 | |||
| 402 | # | ||
| 403 | # IP: Netfilter Configuration | ||
| 404 | # | ||
| 405 | CONFIG_IP_NF_QUEUE=m | ||
| 406 | CONFIG_IP_NF_IPTABLES=m | ||
| 407 | CONFIG_IP_NF_MATCH_IPRANGE=m | ||
| 408 | CONFIG_IP_NF_MATCH_TOS=m | ||
| 409 | CONFIG_IP_NF_MATCH_RECENT=m | ||
| 410 | CONFIG_IP_NF_MATCH_ECN=m | ||
| 411 | CONFIG_IP_NF_MATCH_AH=m | ||
| 412 | CONFIG_IP_NF_MATCH_TTL=m | ||
| 413 | CONFIG_IP_NF_MATCH_OWNER=m | ||
| 414 | CONFIG_IP_NF_MATCH_ADDRTYPE=m | ||
| 415 | CONFIG_IP_NF_FILTER=m | ||
| 416 | CONFIG_IP_NF_TARGET_REJECT=m | ||
| 417 | CONFIG_IP_NF_TARGET_LOG=m | ||
| 418 | CONFIG_IP_NF_TARGET_ULOG=m | ||
| 419 | CONFIG_IP_NF_MANGLE=m | ||
| 420 | CONFIG_IP_NF_TARGET_TOS=m | ||
| 421 | CONFIG_IP_NF_TARGET_ECN=m | ||
| 422 | CONFIG_IP_NF_TARGET_TTL=m | ||
| 423 | CONFIG_IP_NF_RAW=m | ||
| 424 | CONFIG_IP_NF_ARPTABLES=m | ||
| 425 | CONFIG_IP_NF_ARPFILTER=m | ||
| 426 | CONFIG_IP_NF_ARP_MANGLE=m | ||
| 427 | |||
| 428 | # | ||
| 429 | # IPv6: Netfilter Configuration (EXPERIMENTAL) | ||
| 430 | # | ||
| 431 | # CONFIG_IP6_NF_QUEUE is not set | ||
| 432 | # CONFIG_IP6_NF_IPTABLES is not set | ||
| 433 | # CONFIG_IP_DCCP is not set | ||
| 434 | # CONFIG_IP_SCTP is not set | ||
| 435 | # CONFIG_TIPC is not set | ||
| 436 | # CONFIG_ATM is not set | ||
| 437 | # CONFIG_BRIDGE is not set | ||
| 438 | # CONFIG_VLAN_8021Q is not set | ||
| 439 | # CONFIG_DECNET is not set | ||
| 440 | # CONFIG_LLC2 is not set | ||
| 441 | # CONFIG_IPX is not set | ||
| 442 | # CONFIG_ATALK is not set | ||
| 443 | # CONFIG_X25 is not set | ||
| 444 | # CONFIG_LAPB is not set | ||
| 445 | # CONFIG_ECONET is not set | ||
| 446 | # CONFIG_WAN_ROUTER is not set | ||
| 447 | # CONFIG_NET_SCHED is not set | ||
| 448 | |||
| 449 | # | ||
| 450 | # Network testing | ||
| 451 | # | ||
| 452 | # CONFIG_NET_PKTGEN is not set | ||
| 453 | # CONFIG_HAMRADIO is not set | ||
| 454 | CONFIG_IRDA=m | ||
| 455 | |||
| 456 | # | ||
| 457 | # IrDA protocols | ||
| 458 | # | ||
| 459 | CONFIG_IRLAN=m | ||
| 460 | CONFIG_IRNET=m | ||
| 461 | CONFIG_IRCOMM=m | ||
| 462 | # CONFIG_IRDA_ULTRA is not set | ||
| 463 | |||
| 464 | # | ||
| 465 | # IrDA options | ||
| 466 | # | ||
| 467 | # CONFIG_IRDA_CACHE_LAST_LSAP is not set | ||
| 468 | # CONFIG_IRDA_FAST_RR is not set | ||
| 469 | # CONFIG_IRDA_DEBUG is not set | ||
| 470 | |||
| 471 | # | ||
| 472 | # Infrared-port device drivers | ||
| 473 | # | ||
| 474 | |||
| 475 | # | ||
| 476 | # SIR device drivers | ||
| 477 | # | ||
| 478 | # CONFIG_IRTTY_SIR is not set | ||
| 479 | |||
| 480 | # | ||
| 481 | # Dongle support | ||
| 482 | # | ||
| 483 | # CONFIG_KINGSUN_DONGLE is not set | ||
| 484 | # CONFIG_KSDAZZLE_DONGLE is not set | ||
| 485 | # CONFIG_KS959_DONGLE is not set | ||
| 486 | |||
| 487 | # | ||
| 488 | # Old SIR device drivers | ||
| 489 | # | ||
| 490 | # CONFIG_IRPORT_SIR is not set | ||
| 491 | |||
| 492 | # | ||
| 493 | # Old Serial dongle support | ||
| 494 | # | ||
| 495 | |||
| 496 | # | ||
| 497 | # FIR device drivers | ||
| 498 | # | ||
| 499 | # CONFIG_USB_IRDA is not set | ||
| 500 | # CONFIG_SIGMATEL_FIR is not set | ||
| 501 | CONFIG_PXA_FICP=m | ||
| 502 | # CONFIG_MCS_FIR is not set | ||
| 503 | CONFIG_BT=m | ||
| 504 | CONFIG_BT_L2CAP=m | ||
| 505 | CONFIG_BT_SCO=m | ||
| 506 | CONFIG_BT_RFCOMM=m | ||
| 507 | CONFIG_BT_RFCOMM_TTY=y | ||
| 508 | CONFIG_BT_BNEP=m | ||
| 509 | CONFIG_BT_BNEP_MC_FILTER=y | ||
| 510 | CONFIG_BT_BNEP_PROTO_FILTER=y | ||
| 511 | CONFIG_BT_HIDP=m | ||
| 512 | |||
| 513 | # | ||
| 514 | # Bluetooth device drivers | ||
| 515 | # | ||
| 516 | CONFIG_BT_HCIUSB=m | ||
| 517 | # CONFIG_BT_HCIUSB_SCO is not set | ||
| 518 | # CONFIG_BT_HCIBTSDIO is not set | ||
| 519 | CONFIG_BT_HCIUART=m | ||
| 520 | CONFIG_BT_HCIUART_H4=y | ||
| 521 | CONFIG_BT_HCIUART_BCSP=y | ||
| 522 | # CONFIG_BT_HCIUART_LL is not set | ||
| 523 | CONFIG_BT_HCIBCM203X=m | ||
| 524 | CONFIG_BT_HCIBPA10X=m | ||
| 525 | CONFIG_BT_HCIBFUSB=m | ||
| 526 | CONFIG_BT_HCIDTL1=m | ||
| 527 | CONFIG_BT_HCIBT3C=m | ||
| 528 | CONFIG_BT_HCIBLUECARD=m | ||
| 529 | CONFIG_BT_HCIBTUART=m | ||
| 530 | CONFIG_BT_HCIVHCI=m | ||
| 531 | # CONFIG_AF_RXRPC is not set | ||
| 532 | |||
| 533 | # | ||
| 534 | # Wireless | ||
| 535 | # | ||
| 536 | # CONFIG_CFG80211 is not set | ||
| 537 | CONFIG_WIRELESS_EXT=y | ||
| 538 | # CONFIG_MAC80211 is not set | ||
| 539 | CONFIG_IEEE80211=m | ||
| 540 | # CONFIG_IEEE80211_DEBUG is not set | ||
| 541 | CONFIG_IEEE80211_CRYPT_WEP=m | ||
| 542 | CONFIG_IEEE80211_CRYPT_CCMP=m | ||
| 543 | CONFIG_IEEE80211_CRYPT_TKIP=m | ||
| 544 | CONFIG_IEEE80211_SOFTMAC=m | ||
| 545 | # CONFIG_IEEE80211_SOFTMAC_DEBUG is not set | ||
| 546 | # CONFIG_RFKILL is not set | ||
| 547 | # CONFIG_NET_9P is not set | ||
| 548 | |||
| 549 | # | ||
| 550 | # Device Drivers | ||
| 551 | # | ||
| 552 | |||
| 553 | # | ||
| 554 | # Generic Driver Options | ||
| 555 | # | ||
| 556 | CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" | ||
| 557 | CONFIG_STANDALONE=y | ||
| 558 | CONFIG_PREVENT_FIRMWARE_BUILD=y | ||
| 559 | CONFIG_FW_LOADER=y | ||
| 560 | # CONFIG_DEBUG_DRIVER is not set | ||
| 561 | # CONFIG_DEBUG_DEVRES is not set | ||
| 562 | # CONFIG_SYS_HYPERVISOR is not set | ||
| 563 | # CONFIG_CONNECTOR is not set | ||
| 564 | CONFIG_MTD=y | ||
| 565 | # CONFIG_MTD_DEBUG is not set | ||
| 566 | # CONFIG_MTD_CONCAT is not set | ||
| 567 | CONFIG_MTD_PARTITIONS=y | ||
| 568 | # CONFIG_MTD_REDBOOT_PARTS is not set | ||
| 569 | CONFIG_MTD_CMDLINE_PARTS=y | ||
| 570 | # CONFIG_MTD_AFS_PARTS is not set | ||
| 571 | |||
| 572 | # | ||
| 573 | # User Modules And Translation Layers | ||
| 574 | # | ||
| 575 | CONFIG_MTD_CHAR=y | ||
| 576 | CONFIG_MTD_BLKDEVS=y | ||
| 577 | CONFIG_MTD_BLOCK=y | ||
| 578 | # CONFIG_FTL is not set | ||
| 579 | # CONFIG_NFTL is not set | ||
| 580 | # CONFIG_INFTL is not set | ||
| 581 | # CONFIG_RFD_FTL is not set | ||
| 582 | # CONFIG_SSFDC is not set | ||
| 583 | # CONFIG_MTD_OOPS is not set | ||
| 584 | |||
| 585 | # | ||
| 586 | # RAM/ROM/Flash chip drivers | ||
| 587 | # | ||
| 588 | # CONFIG_MTD_CFI is not set | ||
| 589 | # CONFIG_MTD_JEDECPROBE is not set | ||
| 590 | CONFIG_MTD_MAP_BANK_WIDTH_1=y | ||
| 591 | CONFIG_MTD_MAP_BANK_WIDTH_2=y | ||
| 592 | CONFIG_MTD_MAP_BANK_WIDTH_4=y | ||
| 593 | # CONFIG_MTD_MAP_BANK_WIDTH_8 is not set | ||
| 594 | # CONFIG_MTD_MAP_BANK_WIDTH_16 is not set | ||
| 595 | # CONFIG_MTD_MAP_BANK_WIDTH_32 is not set | ||
| 596 | CONFIG_MTD_CFI_I1=y | ||
| 597 | CONFIG_MTD_CFI_I2=y | ||
| 598 | # CONFIG_MTD_CFI_I4 is not set | ||
| 599 | # CONFIG_MTD_CFI_I8 is not set | ||
| 600 | # CONFIG_MTD_RAM is not set | ||
| 601 | CONFIG_MTD_ROM=y | ||
| 602 | # CONFIG_MTD_ABSENT is not set | ||
| 603 | |||
| 604 | # | ||
| 605 | # Mapping drivers for chip access | ||
| 606 | # | ||
| 607 | CONFIG_MTD_COMPLEX_MAPPINGS=y | ||
| 608 | # CONFIG_MTD_PHYSMAP is not set | ||
| 609 | CONFIG_MTD_SHARP_SL=y | ||
| 610 | # CONFIG_MTD_PLATRAM is not set | ||
| 611 | |||
| 612 | # | ||
| 613 | # Self-contained MTD device drivers | ||
| 614 | # | ||
| 615 | # CONFIG_MTD_SLRAM is not set | ||
| 616 | # CONFIG_MTD_PHRAM is not set | ||
| 617 | # CONFIG_MTD_MTDRAM is not set | ||
| 618 | # CONFIG_MTD_BLOCK2MTD is not set | ||
| 619 | |||
| 620 | # | ||
| 621 | # Disk-On-Chip Device Drivers | ||
| 622 | # | ||
| 623 | # CONFIG_MTD_DOC2000 is not set | ||
| 624 | # CONFIG_MTD_DOC2001 is not set | ||
| 625 | # CONFIG_MTD_DOC2001PLUS is not set | ||
| 626 | CONFIG_MTD_NAND=y | ||
| 627 | CONFIG_MTD_NAND_VERIFY_WRITE=y | ||
| 628 | # CONFIG_MTD_NAND_ECC_SMC is not set | ||
| 629 | # CONFIG_MTD_NAND_MUSEUM_IDS is not set | ||
| 630 | # CONFIG_MTD_NAND_H1900 is not set | ||
| 631 | CONFIG_MTD_NAND_IDS=y | ||
| 632 | # CONFIG_MTD_NAND_DISKONCHIP is not set | ||
| 633 | CONFIG_MTD_NAND_SHARPSL=y | ||
| 634 | # CONFIG_MTD_NAND_NANDSIM is not set | ||
| 635 | # CONFIG_MTD_NAND_PLATFORM is not set | ||
| 636 | # CONFIG_MTD_ALAUDA is not set | ||
| 637 | # CONFIG_MTD_ONENAND is not set | ||
| 638 | |||
| 639 | # | ||
| 640 | # UBI - Unsorted block images | ||
| 641 | # | ||
| 642 | # CONFIG_MTD_UBI is not set | ||
| 643 | # CONFIG_PARPORT is not set | ||
| 644 | CONFIG_BLK_DEV=y | ||
| 645 | # CONFIG_BLK_DEV_COW_COMMON is not set | ||
| 646 | CONFIG_BLK_DEV_LOOP=y | ||
| 647 | # CONFIG_BLK_DEV_CRYPTOLOOP is not set | ||
| 648 | # CONFIG_BLK_DEV_NBD is not set | ||
| 649 | # CONFIG_BLK_DEV_UB is not set | ||
| 650 | # CONFIG_BLK_DEV_RAM is not set | ||
| 651 | # CONFIG_CDROM_PKTCDVD is not set | ||
| 652 | # CONFIG_ATA_OVER_ETH is not set | ||
| 653 | CONFIG_MISC_DEVICES=y | ||
| 654 | # CONFIG_EEPROM_93CX6 is not set | ||
| 655 | CONFIG_IDE=y | ||
| 656 | CONFIG_IDE_MAX_HWIFS=4 | ||
| 657 | CONFIG_BLK_DEV_IDE=y | ||
| 658 | |||
| 659 | # | ||
| 660 | # Please see Documentation/ide.txt for help/info on IDE drives | ||
| 661 | # | ||
| 662 | # CONFIG_BLK_DEV_IDE_SATA is not set | ||
| 663 | CONFIG_BLK_DEV_IDEDISK=y | ||
| 664 | # CONFIG_IDEDISK_MULTI_MODE is not set | ||
| 665 | CONFIG_BLK_DEV_IDECS=m | ||
| 666 | # CONFIG_BLK_DEV_IDECD is not set | ||
| 667 | # CONFIG_BLK_DEV_IDETAPE is not set | ||
| 668 | # CONFIG_BLK_DEV_IDEFLOPPY is not set | ||
| 669 | # CONFIG_BLK_DEV_IDESCSI is not set | ||
| 670 | # CONFIG_IDE_TASK_IOCTL is not set | ||
| 671 | CONFIG_IDE_PROC_FS=y | ||
| 672 | |||
| 673 | # | ||
| 674 | # IDE chipset support/bugfixes | ||
| 675 | # | ||
| 676 | CONFIG_IDE_GENERIC=y | ||
| 677 | # CONFIG_BLK_DEV_PLATFORM is not set | ||
| 678 | # CONFIG_IDE_ARM is not set | ||
| 679 | # CONFIG_BLK_DEV_IDEDMA is not set | ||
| 680 | CONFIG_IDE_ARCH_OBSOLETE_INIT=y | ||
| 681 | # CONFIG_BLK_DEV_HD is not set | ||
| 682 | |||
| 683 | # | ||
| 684 | # SCSI device support | ||
| 685 | # | ||
| 686 | # CONFIG_RAID_ATTRS is not set | ||
| 687 | CONFIG_SCSI=m | ||
| 688 | CONFIG_SCSI_DMA=y | ||
| 689 | # CONFIG_SCSI_TGT is not set | ||
| 690 | # CONFIG_SCSI_NETLINK is not set | ||
| 691 | CONFIG_SCSI_PROC_FS=y | ||
| 692 | |||
| 693 | # | ||
| 694 | # SCSI support type (disk, tape, CD-ROM) | ||
| 695 | # | ||
| 696 | CONFIG_BLK_DEV_SD=m | ||
| 697 | CONFIG_CHR_DEV_ST=m | ||
| 698 | CONFIG_CHR_DEV_OSST=m | ||
| 699 | CONFIG_BLK_DEV_SR=m | ||
| 700 | # CONFIG_BLK_DEV_SR_VENDOR is not set | ||
| 701 | CONFIG_CHR_DEV_SG=m | ||
| 702 | # CONFIG_CHR_DEV_SCH is not set | ||
| 703 | |||
| 704 | # | ||
| 705 | # Some SCSI devices (e.g. CD jukebox) support multiple LUNs | ||
| 706 | # | ||
| 707 | CONFIG_SCSI_MULTI_LUN=y | ||
| 708 | # CONFIG_SCSI_CONSTANTS is not set | ||
| 709 | # CONFIG_SCSI_LOGGING is not set | ||
| 710 | # CONFIG_SCSI_SCAN_ASYNC is not set | ||
| 711 | CONFIG_SCSI_WAIT_SCAN=m | ||
| 712 | |||
| 713 | # | ||
| 714 | # SCSI Transports | ||
| 715 | # | ||
| 716 | # CONFIG_SCSI_SPI_ATTRS is not set | ||
| 717 | # CONFIG_SCSI_FC_ATTRS is not set | ||
| 718 | # CONFIG_SCSI_ISCSI_ATTRS is not set | ||
| 719 | # CONFIG_SCSI_SAS_LIBSAS is not set | ||
| 720 | # CONFIG_SCSI_SRP_ATTRS is not set | ||
| 721 | CONFIG_SCSI_LOWLEVEL=y | ||
| 722 | # CONFIG_ISCSI_TCP is not set | ||
| 723 | # CONFIG_SCSI_DEBUG is not set | ||
| 724 | # CONFIG_SCSI_LOWLEVEL_PCMCIA is not set | ||
| 725 | # CONFIG_ATA is not set | ||
| 726 | CONFIG_MD=y | ||
| 727 | # CONFIG_BLK_DEV_MD is not set | ||
| 728 | CONFIG_BLK_DEV_DM=m | ||
| 729 | # CONFIG_DM_DEBUG is not set | ||
| 730 | CONFIG_DM_CRYPT=m | ||
| 731 | CONFIG_DM_SNAPSHOT=m | ||
| 732 | CONFIG_DM_MIRROR=m | ||
| 733 | CONFIG_DM_ZERO=m | ||
| 734 | CONFIG_DM_MULTIPATH=m | ||
| 735 | CONFIG_DM_MULTIPATH_EMC=m | ||
| 736 | # CONFIG_DM_MULTIPATH_RDAC is not set | ||
| 737 | # CONFIG_DM_MULTIPATH_HP is not set | ||
| 738 | # CONFIG_DM_DELAY is not set | ||
| 739 | # CONFIG_DM_UEVENT is not set | ||
| 740 | CONFIG_NETDEVICES=y | ||
| 741 | # CONFIG_NETDEVICES_MULTIQUEUE is not set | ||
| 742 | # CONFIG_DUMMY is not set | ||
| 743 | # CONFIG_BONDING is not set | ||
| 744 | # CONFIG_MACVLAN is not set | ||
| 745 | # CONFIG_EQUALIZER is not set | ||
| 746 | CONFIG_TUN=m | ||
| 747 | # CONFIG_VETH is not set | ||
| 748 | # CONFIG_PHYLIB is not set | ||
| 749 | CONFIG_NET_ETHERNET=y | ||
| 750 | CONFIG_MII=m | ||
| 751 | # CONFIG_AX88796 is not set | ||
| 752 | # CONFIG_SMC91X is not set | ||
| 753 | # CONFIG_DM9000 is not set | ||
| 754 | # CONFIG_SMC911X is not set | ||
| 755 | # CONFIG_IBM_NEW_EMAC_ZMII is not set | ||
| 756 | # CONFIG_IBM_NEW_EMAC_RGMII is not set | ||
| 757 | # CONFIG_IBM_NEW_EMAC_TAH is not set | ||
| 758 | # CONFIG_IBM_NEW_EMAC_EMAC4 is not set | ||
| 759 | # CONFIG_B44 is not set | ||
| 760 | # CONFIG_NETDEV_1000 is not set | ||
| 761 | # CONFIG_NETDEV_10000 is not set | ||
| 762 | |||
| 763 | # | ||
| 764 | # Wireless LAN | ||
| 765 | # | ||
| 766 | # CONFIG_WLAN_PRE80211 is not set | ||
| 767 | CONFIG_WLAN_80211=y | ||
| 768 | # CONFIG_PCMCIA_RAYCS is not set | ||
| 769 | # CONFIG_LIBERTAS is not set | ||
| 770 | CONFIG_HERMES=m | ||
| 771 | CONFIG_PCMCIA_HERMES=m | ||
| 772 | CONFIG_PCMCIA_SPECTRUM=m | ||
| 773 | # CONFIG_ATMEL is not set | ||
| 774 | CONFIG_AIRO_CS=m | ||
| 775 | # CONFIG_PCMCIA_WL3501 is not set | ||
| 776 | # CONFIG_USB_ZD1201 is not set | ||
| 777 | CONFIG_HOSTAP=m | ||
| 778 | CONFIG_HOSTAP_FIRMWARE=y | ||
| 779 | # CONFIG_HOSTAP_FIRMWARE_NVRAM is not set | ||
| 780 | CONFIG_HOSTAP_CS=m | ||
| 781 | |||
| 782 | # | ||
| 783 | # USB Network Adapters | ||
| 784 | # | ||
| 785 | CONFIG_USB_CATC=m | ||
| 786 | CONFIG_USB_KAWETH=m | ||
| 787 | CONFIG_USB_PEGASUS=m | ||
| 788 | CONFIG_USB_RTL8150=m | ||
| 789 | CONFIG_USB_USBNET=m | ||
| 790 | CONFIG_USB_NET_AX8817X=m | ||
| 791 | CONFIG_USB_NET_CDCETHER=m | ||
| 792 | # CONFIG_USB_NET_DM9601 is not set | ||
| 793 | # CONFIG_USB_NET_GL620A is not set | ||
| 794 | CONFIG_USB_NET_NET1080=m | ||
| 795 | # CONFIG_USB_NET_PLUSB is not set | ||
| 796 | # CONFIG_USB_NET_MCS7830 is not set | ||
| 797 | # CONFIG_USB_NET_RNDIS_HOST is not set | ||
| 798 | # CONFIG_USB_NET_CDC_SUBSET is not set | ||
| 799 | CONFIG_USB_NET_ZAURUS=m | ||
| 800 | CONFIG_NET_PCMCIA=y | ||
| 801 | # CONFIG_PCMCIA_3C589 is not set | ||
| 802 | # CONFIG_PCMCIA_3C574 is not set | ||
| 803 | # CONFIG_PCMCIA_FMVJ18X is not set | ||
| 804 | CONFIG_PCMCIA_PCNET=m | ||
| 805 | # CONFIG_PCMCIA_NMCLAN is not set | ||
| 806 | # CONFIG_PCMCIA_SMC91C92 is not set | ||
| 807 | # CONFIG_PCMCIA_XIRC2PS is not set | ||
| 808 | # CONFIG_PCMCIA_AXNET is not set | ||
| 809 | # CONFIG_WAN is not set | ||
| 810 | CONFIG_PPP=m | ||
| 811 | # CONFIG_PPP_MULTILINK is not set | ||
| 812 | # CONFIG_PPP_FILTER is not set | ||
| 813 | CONFIG_PPP_ASYNC=m | ||
| 814 | # CONFIG_PPP_SYNC_TTY is not set | ||
| 815 | CONFIG_PPP_DEFLATE=m | ||
| 816 | CONFIG_PPP_BSDCOMP=m | ||
| 817 | # CONFIG_PPP_MPPE is not set | ||
| 818 | # CONFIG_PPPOE is not set | ||
| 819 | # CONFIG_PPPOL2TP is not set | ||
| 820 | # CONFIG_SLIP is not set | ||
| 821 | CONFIG_SLHC=m | ||
| 822 | # CONFIG_SHAPER is not set | ||
| 823 | # CONFIG_NETCONSOLE is not set | ||
| 824 | # CONFIG_NETPOLL is not set | ||
| 825 | # CONFIG_NET_POLL_CONTROLLER is not set | ||
| 826 | # CONFIG_ISDN is not set | ||
| 827 | |||
| 828 | # | ||
| 829 | # Input device support | ||
| 830 | # | ||
| 831 | CONFIG_INPUT=y | ||
| 832 | # CONFIG_INPUT_FF_MEMLESS is not set | ||
| 833 | # CONFIG_INPUT_POLLDEV is not set | ||
| 834 | |||
| 835 | # | ||
| 836 | # Userland interfaces | ||
| 837 | # | ||
| 838 | CONFIG_INPUT_MOUSEDEV=m | ||
| 839 | # CONFIG_INPUT_MOUSEDEV_PSAUX is not set | ||
| 840 | CONFIG_INPUT_MOUSEDEV_SCREEN_X=640 | ||
| 841 | CONFIG_INPUT_MOUSEDEV_SCREEN_Y=480 | ||
| 842 | # CONFIG_INPUT_JOYDEV is not set | ||
| 843 | CONFIG_INPUT_EVDEV=y | ||
| 844 | # CONFIG_INPUT_EVBUG is not set | ||
| 845 | CONFIG_INPUT_POWER=y | ||
| 846 | |||
| 847 | # | ||
| 848 | # Input Device Drivers | ||
| 849 | # | ||
| 850 | CONFIG_INPUT_KEYBOARD=y | ||
| 851 | # CONFIG_KEYBOARD_ATKBD is not set | ||
| 852 | # CONFIG_KEYBOARD_SUNKBD is not set | ||
| 853 | # CONFIG_KEYBOARD_LKKBD is not set | ||
| 854 | # CONFIG_KEYBOARD_XTKBD is not set | ||
| 855 | # CONFIG_KEYBOARD_NEWTON is not set | ||
| 856 | # CONFIG_KEYBOARD_STOWAWAY is not set | ||
| 857 | CONFIG_KEYBOARD_CORGI=y | ||
| 858 | # CONFIG_KEYBOARD_SPITZ is not set | ||
| 859 | # CONFIG_KEYBOARD_GPIO is not set | ||
| 860 | # CONFIG_INPUT_MOUSE is not set | ||
| 861 | # CONFIG_INPUT_JOYSTICK is not set | ||
| 862 | # CONFIG_INPUT_TABLET is not set | ||
| 863 | CONFIG_INPUT_TOUCHSCREEN=y | ||
| 864 | CONFIG_TOUCHSCREEN_CORGI=y | ||
| 865 | # CONFIG_TOUCHSCREEN_FUJITSU is not set | ||
| 866 | # CONFIG_TOUCHSCREEN_GUNZE is not set | ||
| 867 | # CONFIG_TOUCHSCREEN_ELO is not set | ||
| 868 | # CONFIG_TOUCHSCREEN_MTOUCH is not set | ||
| 869 | # CONFIG_TOUCHSCREEN_MK712 is not set | ||
| 870 | # CONFIG_TOUCHSCREEN_PENMOUNT is not set | ||
| 871 | # CONFIG_TOUCHSCREEN_TOUCHRIGHT is not set | ||
| 872 | # CONFIG_TOUCHSCREEN_TOUCHWIN is not set | ||
| 873 | # CONFIG_TOUCHSCREEN_UCB1400 is not set | ||
| 874 | # CONFIG_TOUCHSCREEN_USB_COMPOSITE is not set | ||
| 875 | CONFIG_INPUT_MISC=y | ||
| 876 | # CONFIG_INPUT_ATI_REMOTE is not set | ||
| 877 | # CONFIG_INPUT_ATI_REMOTE2 is not set | ||
| 878 | # CONFIG_INPUT_KEYSPAN_REMOTE is not set | ||
| 879 | # CONFIG_INPUT_POWERMATE is not set | ||
| 880 | # CONFIG_INPUT_YEALINK is not set | ||
| 881 | CONFIG_INPUT_UINPUT=m | ||
| 882 | |||
| 883 | # | ||
| 884 | # Hardware I/O ports | ||
| 885 | # | ||
| 886 | # CONFIG_SERIO is not set | ||
| 887 | # CONFIG_GAMEPORT is not set | ||
| 888 | |||
| 889 | # | ||
| 890 | # Character devices | ||
| 891 | # | ||
| 892 | CONFIG_VT=y | ||
| 893 | CONFIG_VT_CONSOLE=y | ||
| 894 | CONFIG_HW_CONSOLE=y | ||
| 895 | # CONFIG_VT_HW_CONSOLE_BINDING is not set | ||
| 896 | # CONFIG_SERIAL_NONSTANDARD is not set | ||
| 897 | |||
| 898 | # | ||
| 899 | # Serial drivers | ||
| 900 | # | ||
| 901 | CONFIG_SERIAL_8250=m | ||
| 902 | CONFIG_SERIAL_8250_CS=m | ||
| 903 | CONFIG_SERIAL_8250_NR_UARTS=4 | ||
| 904 | CONFIG_SERIAL_8250_RUNTIME_UARTS=4 | ||
| 905 | # CONFIG_SERIAL_8250_EXTENDED is not set | ||
| 906 | |||
| 907 | # | ||
| 908 | # Non-8250 serial port support | ||
| 909 | # | ||
| 910 | CONFIG_SERIAL_PXA=y | ||
| 911 | CONFIG_SERIAL_PXA_CONSOLE=y | ||
| 912 | CONFIG_SERIAL_CORE=y | ||
| 913 | CONFIG_SERIAL_CORE_CONSOLE=y | ||
| 914 | CONFIG_UNIX98_PTYS=y | ||
| 915 | # CONFIG_LEGACY_PTYS is not set | ||
| 916 | # CONFIG_IPMI_HANDLER is not set | ||
| 917 | CONFIG_HW_RANDOM=m | ||
| 918 | # CONFIG_NVRAM is not set | ||
| 919 | # CONFIG_R3964 is not set | ||
| 920 | |||
| 921 | # | ||
| 922 | # PCMCIA character devices | ||
| 923 | # | ||
| 924 | # CONFIG_SYNCLINK_CS is not set | ||
| 925 | # CONFIG_CARDMAN_4000 is not set | ||
| 926 | # CONFIG_CARDMAN_4040 is not set | ||
| 927 | # CONFIG_RAW_DRIVER is not set | ||
| 928 | # CONFIG_TCG_TPM is not set | ||
| 929 | CONFIG_I2C=y | ||
| 930 | CONFIG_I2C_BOARDINFO=y | ||
| 931 | # CONFIG_I2C_CHARDEV is not set | ||
| 932 | |||
| 933 | # | ||
| 934 | # I2C Algorithms | ||
| 935 | # | ||
| 936 | CONFIG_I2C_ALGOBIT=y | ||
| 937 | # CONFIG_I2C_ALGOPCF is not set | ||
| 938 | # CONFIG_I2C_ALGOPCA is not set | ||
| 939 | |||
| 940 | # | ||
| 941 | # I2C Hardware Bus support | ||
| 942 | # | ||
| 943 | # CONFIG_I2C_GPIO is not set | ||
| 944 | CONFIG_I2C_PXA=y | ||
| 945 | # CONFIG_I2C_PXA_SLAVE is not set | ||
| 946 | # CONFIG_I2C_OCORES is not set | ||
| 947 | # CONFIG_I2C_PARPORT_LIGHT is not set | ||
| 948 | # CONFIG_I2C_SIMTEC is not set | ||
| 949 | # CONFIG_I2C_TAOS_EVM is not set | ||
| 950 | # CONFIG_I2C_STUB is not set | ||
| 951 | # CONFIG_I2C_TINY_USB is not set | ||
| 952 | |||
| 953 | # | ||
| 954 | # Miscellaneous I2C Chip support | ||
| 955 | # | ||
| 956 | # CONFIG_SENSORS_DS1337 is not set | ||
| 957 | # CONFIG_SENSORS_DS1374 is not set | ||
| 958 | # CONFIG_DS1682 is not set | ||
| 959 | # CONFIG_SENSORS_EEPROM is not set | ||
| 960 | # CONFIG_SENSORS_PCF8574 is not set | ||
| 961 | # CONFIG_SENSORS_PCA9539 is not set | ||
| 962 | # CONFIG_SENSORS_PCF8591 is not set | ||
| 963 | # CONFIG_SENSORS_MAX6875 is not set | ||
| 964 | # CONFIG_SENSORS_TSL2550 is not set | ||
| 965 | # CONFIG_I2C_DEBUG_CORE is not set | ||
| 966 | # CONFIG_I2C_DEBUG_ALGO is not set | ||
| 967 | # CONFIG_I2C_DEBUG_BUS is not set | ||
| 968 | # CONFIG_I2C_DEBUG_CHIP is not set | ||
| 969 | |||
| 970 | # | ||
| 971 | # SPI support | ||
| 972 | # | ||
| 973 | # CONFIG_SPI is not set | ||
| 974 | # CONFIG_SPI_MASTER is not set | ||
| 975 | # CONFIG_W1 is not set | ||
| 976 | # CONFIG_POWER_SUPPLY is not set | ||
| 977 | # CONFIG_HWMON is not set | ||
| 978 | # CONFIG_WATCHDOG is not set | ||
| 979 | |||
| 980 | # | ||
| 981 | # Sonics Silicon Backplane | ||
| 982 | # | ||
| 983 | CONFIG_SSB_POSSIBLE=y | ||
| 984 | # CONFIG_SSB is not set | ||
| 985 | |||
| 986 | # | ||
| 987 | # Multifunction device drivers | ||
| 988 | # | ||
| 989 | # CONFIG_MFD_SM501 is not set | ||
| 990 | |||
| 991 | # | ||
| 992 | # Multimedia devices | ||
| 993 | # | ||
| 994 | CONFIG_VIDEO_DEV=m | ||
| 995 | CONFIG_VIDEO_V4L1=y | ||
| 996 | CONFIG_VIDEO_V4L1_COMPAT=y | ||
| 997 | CONFIG_VIDEO_V4L2=y | ||
| 998 | CONFIG_VIDEO_CAPTURE_DRIVERS=y | ||
| 999 | # CONFIG_VIDEO_ADV_DEBUG is not set | ||
| 1000 | CONFIG_VIDEO_HELPER_CHIPS_AUTO=y | ||
| 1001 | # CONFIG_VIDEO_VIVI is not set | ||
| 1002 | # CONFIG_VIDEO_CPIA is not set | ||
| 1003 | # CONFIG_VIDEO_CPIA2 is not set | ||
| 1004 | # CONFIG_VIDEO_SAA5246A is not set | ||
| 1005 | # CONFIG_VIDEO_SAA5249 is not set | ||
| 1006 | # CONFIG_TUNER_3036 is not set | ||
| 1007 | CONFIG_V4L_USB_DRIVERS=y | ||
| 1008 | # CONFIG_VIDEO_PVRUSB2 is not set | ||
| 1009 | # CONFIG_VIDEO_EM28XX is not set | ||
| 1010 | # CONFIG_VIDEO_USBVISION is not set | ||
| 1011 | CONFIG_VIDEO_USBVIDEO=m | ||
| 1012 | CONFIG_USB_VICAM=m | ||
| 1013 | CONFIG_USB_IBMCAM=m | ||
| 1014 | CONFIG_USB_KONICAWC=m | ||
| 1015 | # CONFIG_USB_QUICKCAM_MESSENGER is not set | ||
| 1016 | # CONFIG_USB_ET61X251 is not set | ||
| 1017 | # CONFIG_VIDEO_OVCAMCHIP is not set | ||
| 1018 | # CONFIG_USB_W9968CF is not set | ||
| 1019 | CONFIG_USB_OV511=m | ||
| 1020 | CONFIG_USB_SE401=m | ||
| 1021 | CONFIG_USB_SN9C102=m | ||
| 1022 | CONFIG_USB_STV680=m | ||
| 1023 | # CONFIG_USB_ZC0301 is not set | ||
| 1024 | # CONFIG_USB_PWC is not set | ||
| 1025 | # CONFIG_USB_ZR364XX is not set | ||
| 1026 | CONFIG_RADIO_ADAPTERS=y | ||
| 1027 | CONFIG_USB_DSBR=m | ||
| 1028 | # CONFIG_DVB_CORE is not set | ||
| 1029 | CONFIG_DAB=y | ||
| 1030 | CONFIG_USB_DABUSB=m | ||
| 1031 | |||
| 1032 | # | ||
| 1033 | # Graphics support | ||
| 1034 | # | ||
| 1035 | # CONFIG_VGASTATE is not set | ||
| 1036 | CONFIG_VIDEO_OUTPUT_CONTROL=m | ||
| 1037 | CONFIG_FB=y | ||
| 1038 | # CONFIG_FIRMWARE_EDID is not set | ||
| 1039 | # CONFIG_FB_DDC is not set | ||
| 1040 | CONFIG_FB_CFB_FILLRECT=y | ||
| 1041 | CONFIG_FB_CFB_COPYAREA=y | ||
| 1042 | CONFIG_FB_CFB_IMAGEBLIT=y | ||
| 1043 | # CONFIG_FB_CFB_REV_PIXELS_IN_BYTE is not set | ||
| 1044 | # CONFIG_FB_SYS_FILLRECT is not set | ||
| 1045 | # CONFIG_FB_SYS_COPYAREA is not set | ||
| 1046 | # CONFIG_FB_SYS_IMAGEBLIT is not set | ||
| 1047 | # CONFIG_FB_SYS_FOPS is not set | ||
| 1048 | # CONFIG_FB_DEFERRED_IO is not set | ||
| 1049 | # CONFIG_FB_SVGALIB is not set | ||
| 1050 | # CONFIG_FB_MACMODES is not set | ||
| 1051 | # CONFIG_FB_BACKLIGHT is not set | ||
| 1052 | # CONFIG_FB_MODE_HELPERS is not set | ||
| 1053 | # CONFIG_FB_TILEBLITTING is not set | ||
| 1054 | |||
| 1055 | # | ||
| 1056 | # Frame buffer hardware drivers | ||
| 1057 | # | ||
| 1058 | # CONFIG_FB_S1D13XXX is not set | ||
| 1059 | # CONFIG_FB_PXA is not set | ||
| 1060 | # CONFIG_FB_MBX is not set | ||
| 1061 | CONFIG_FB_W100=y | ||
| 1062 | # CONFIG_FB_VIRTUAL is not set | ||
| 1063 | CONFIG_BACKLIGHT_LCD_SUPPORT=y | ||
| 1064 | # CONFIG_LCD_CLASS_DEVICE is not set | ||
| 1065 | CONFIG_BACKLIGHT_CLASS_DEVICE=y | ||
| 1066 | CONFIG_BACKLIGHT_CORGI=y | ||
| 1067 | |||
| 1068 | # | ||
| 1069 | # Display device support | ||
| 1070 | # | ||
| 1071 | # CONFIG_DISPLAY_SUPPORT is not set | ||
| 1072 | |||
| 1073 | # | ||
| 1074 | # Console display driver support | ||
| 1075 | # | ||
| 1076 | # CONFIG_VGA_CONSOLE is not set | ||
| 1077 | CONFIG_DUMMY_CONSOLE=y | ||
| 1078 | CONFIG_FRAMEBUFFER_CONSOLE=y | ||
| 1079 | # CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY is not set | ||
| 1080 | # CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set | ||
| 1081 | CONFIG_FONTS=y | ||
| 1082 | # CONFIG_FONT_8x8 is not set | ||
| 1083 | CONFIG_FONT_8x16=y | ||
| 1084 | # CONFIG_FONT_6x11 is not set | ||
| 1085 | # CONFIG_FONT_7x14 is not set | ||
| 1086 | # CONFIG_FONT_PEARL_8x8 is not set | ||
| 1087 | # CONFIG_FONT_ACORN_8x8 is not set | ||
| 1088 | # CONFIG_FONT_MINI_4x6 is not set | ||
| 1089 | # CONFIG_FONT_SUN8x16 is not set | ||
| 1090 | # CONFIG_FONT_SUN12x22 is not set | ||
| 1091 | # CONFIG_FONT_10x18 is not set | ||
| 1092 | CONFIG_LOGO=y | ||
| 1093 | # CONFIG_LOGO_LINUX_MONO is not set | ||
| 1094 | # CONFIG_LOGO_LINUX_VGA16 is not set | ||
| 1095 | # CONFIG_LOGO_LINUX_CLUT224 is not set | ||
| 1096 | CONFIG_LOGO_OHAND_CLUT224=y | ||
| 1097 | |||
| 1098 | # | ||
| 1099 | # Sound | ||
| 1100 | # | ||
| 1101 | CONFIG_SOUND=m | ||
| 1102 | |||
| 1103 | # | ||
| 1104 | # Advanced Linux Sound Architecture | ||
| 1105 | # | ||
| 1106 | CONFIG_SND=m | ||
| 1107 | CONFIG_SND_TIMER=m | ||
| 1108 | CONFIG_SND_PCM=m | ||
| 1109 | CONFIG_SND_HWDEP=m | ||
| 1110 | CONFIG_SND_RAWMIDI=m | ||
| 1111 | CONFIG_SND_SEQUENCER=m | ||
| 1112 | # CONFIG_SND_SEQ_DUMMY is not set | ||
| 1113 | CONFIG_SND_OSSEMUL=y | ||
| 1114 | CONFIG_SND_MIXER_OSS=m | ||
| 1115 | CONFIG_SND_PCM_OSS=m | ||
| 1116 | CONFIG_SND_PCM_OSS_PLUGINS=y | ||
| 1117 | # CONFIG_SND_SEQUENCER_OSS is not set | ||
| 1118 | # CONFIG_SND_DYNAMIC_MINORS is not set | ||
| 1119 | CONFIG_SND_SUPPORT_OLD_API=y | ||
| 1120 | CONFIG_SND_VERBOSE_PROCFS=y | ||
| 1121 | # CONFIG_SND_VERBOSE_PRINTK is not set | ||
| 1122 | # CONFIG_SND_DEBUG is not set | ||
| 1123 | |||
| 1124 | # | ||
| 1125 | # Generic devices | ||
| 1126 | # | ||
| 1127 | # CONFIG_SND_AC97_CODEC is not set | ||
| 1128 | # CONFIG_SND_DUMMY is not set | ||
| 1129 | # CONFIG_SND_VIRMIDI is not set | ||
| 1130 | # CONFIG_SND_MTPAV is not set | ||
| 1131 | # CONFIG_SND_SERIAL_U16550 is not set | ||
| 1132 | # CONFIG_SND_MPU401 is not set | ||
| 1133 | |||
| 1134 | # | ||
| 1135 | # ALSA ARM devices | ||
| 1136 | # | ||
| 1137 | CONFIG_SND_PXA2XX_PCM=m | ||
| 1138 | CONFIG_SND_PXA2XX_AC97=m | ||
| 1139 | |||
| 1140 | # | ||
| 1141 | # USB devices | ||
| 1142 | # | ||
| 1143 | CONFIG_SND_USB_AUDIO=m | ||
| 1144 | # CONFIG_SND_USB_CAIAQ is not set | ||
| 1145 | |||
| 1146 | # | ||
| 1147 | # PCMCIA devices | ||
| 1148 | # | ||
| 1149 | # CONFIG_SND_VXPOCKET is not set | ||
| 1150 | # CONFIG_SND_PDAUDIOCF is not set | ||
| 1151 | |||
| 1152 | # | ||
| 1153 | # System on Chip audio support | ||
| 1154 | # | ||
| 1155 | CONFIG_SND_SOC=m | ||
| 1156 | CONFIG_SND_PXA2XX_SOC=m | ||
| 1157 | CONFIG_SND_PXA2XX_SOC_I2S=m | ||
| 1158 | CONFIG_SND_PXA2XX_SOC_CORGI=m | ||
| 1159 | |||
| 1160 | # | ||
| 1161 | # SoC Audio support for SuperH | ||
| 1162 | # | ||
| 1163 | CONFIG_SND_SOC_WM8731=m | ||
| 1164 | |||
| 1165 | # | ||
| 1166 | # Open Sound System | ||
| 1167 | # | ||
| 1168 | # CONFIG_SOUND_PRIME is not set | ||
| 1169 | # CONFIG_AC97_BUS is not set | ||
| 1170 | CONFIG_HID_SUPPORT=y | ||
| 1171 | CONFIG_HID=m | ||
| 1172 | # CONFIG_HID_DEBUG is not set | ||
| 1173 | # CONFIG_HIDRAW is not set | ||
| 1174 | |||
| 1175 | # | ||
| 1176 | # USB Input Devices | ||
| 1177 | # | ||
| 1178 | CONFIG_USB_HID=m | ||
| 1179 | # CONFIG_USB_HIDINPUT_POWERBOOK is not set | ||
| 1180 | # CONFIG_HID_FF is not set | ||
| 1181 | # CONFIG_USB_HIDDEV is not set | ||
| 1182 | |||
| 1183 | # | ||
| 1184 | # USB HID Boot Protocol drivers | ||
| 1185 | # | ||
| 1186 | CONFIG_USB_KBD=m | ||
| 1187 | CONFIG_USB_MOUSE=m | ||
| 1188 | CONFIG_USB_SUPPORT=y | ||
| 1189 | CONFIG_USB_ARCH_HAS_HCD=y | ||
| 1190 | # CONFIG_USB_ARCH_HAS_OHCI is not set | ||
| 1191 | # CONFIG_USB_ARCH_HAS_EHCI is not set | ||
| 1192 | CONFIG_USB=m | ||
| 1193 | # CONFIG_USB_DEBUG is not set | ||
| 1194 | |||
| 1195 | # | ||
| 1196 | # Miscellaneous USB options | ||
| 1197 | # | ||
| 1198 | CONFIG_USB_DEVICEFS=y | ||
| 1199 | CONFIG_USB_DEVICE_CLASS=y | ||
| 1200 | # CONFIG_USB_DYNAMIC_MINORS is not set | ||
| 1201 | # CONFIG_USB_SUSPEND is not set | ||
| 1202 | # CONFIG_USB_PERSIST is not set | ||
| 1203 | # CONFIG_USB_OTG is not set | ||
| 1204 | |||
| 1205 | # | ||
| 1206 | # USB Host Controller Drivers | ||
| 1207 | # | ||
| 1208 | # CONFIG_USB_ISP116X_HCD is not set | ||
| 1209 | CONFIG_USB_SL811_HCD=m | ||
| 1210 | CONFIG_USB_SL811_CS=m | ||
| 1211 | # CONFIG_USB_R8A66597_HCD is not set | ||
| 1212 | |||
| 1213 | # | ||
| 1214 | # USB Device Class drivers | ||
| 1215 | # | ||
| 1216 | CONFIG_USB_ACM=m | ||
| 1217 | CONFIG_USB_PRINTER=m | ||
| 1218 | |||
| 1219 | # | ||
| 1220 | # NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' | ||
| 1221 | # | ||
| 1222 | |||
| 1223 | # | ||
| 1224 | # may also be needed; see USB_STORAGE Help for more information | ||
| 1225 | # | ||
| 1226 | CONFIG_USB_STORAGE=m | ||
| 1227 | # CONFIG_USB_STORAGE_DEBUG is not set | ||
| 1228 | # CONFIG_USB_STORAGE_DATAFAB is not set | ||
| 1229 | # CONFIG_USB_STORAGE_FREECOM is not set | ||
| 1230 | # CONFIG_USB_STORAGE_ISD200 is not set | ||
| 1231 | # CONFIG_USB_STORAGE_DPCM is not set | ||
| 1232 | # CONFIG_USB_STORAGE_USBAT is not set | ||
| 1233 | # CONFIG_USB_STORAGE_SDDR09 is not set | ||
| 1234 | # CONFIG_USB_STORAGE_SDDR55 is not set | ||
| 1235 | # CONFIG_USB_STORAGE_JUMPSHOT is not set | ||
| 1236 | # CONFIG_USB_STORAGE_ALAUDA is not set | ||
| 1237 | # CONFIG_USB_STORAGE_KARMA is not set | ||
| 1238 | # CONFIG_USB_LIBUSUAL is not set | ||
| 1239 | |||
| 1240 | # | ||
| 1241 | # USB Imaging devices | ||
| 1242 | # | ||
| 1243 | CONFIG_USB_MDC800=m | ||
| 1244 | CONFIG_USB_MICROTEK=m | ||
| 1245 | CONFIG_USB_MON=y | ||
| 1246 | |||
| 1247 | # | ||
| 1248 | # USB port drivers | ||
| 1249 | # | ||
| 1250 | |||
| 1251 | # | ||
| 1252 | # USB Serial Converter support | ||
| 1253 | # | ||
| 1254 | CONFIG_USB_SERIAL=m | ||
| 1255 | CONFIG_USB_SERIAL_GENERIC=y | ||
| 1256 | # CONFIG_USB_SERIAL_AIRCABLE is not set | ||
| 1257 | # CONFIG_USB_SERIAL_AIRPRIME is not set | ||
| 1258 | # CONFIG_USB_SERIAL_ARK3116 is not set | ||
| 1259 | CONFIG_USB_SERIAL_BELKIN=m | ||
| 1260 | # CONFIG_USB_SERIAL_CH341 is not set | ||
| 1261 | # CONFIG_USB_SERIAL_WHITEHEAT is not set | ||
| 1262 | CONFIG_USB_SERIAL_DIGI_ACCELEPORT=m | ||
| 1263 | # CONFIG_USB_SERIAL_CP2101 is not set | ||
| 1264 | CONFIG_USB_SERIAL_CYPRESS_M8=m | ||
| 1265 | CONFIG_USB_SERIAL_EMPEG=m | ||
| 1266 | CONFIG_USB_SERIAL_FTDI_SIO=m | ||
| 1267 | # CONFIG_USB_SERIAL_FUNSOFT is not set | ||
| 1268 | CONFIG_USB_SERIAL_VISOR=m | ||
| 1269 | CONFIG_USB_SERIAL_IPAQ=m | ||
| 1270 | CONFIG_USB_SERIAL_IR=m | ||
| 1271 | CONFIG_USB_SERIAL_EDGEPORT=m | ||
| 1272 | CONFIG_USB_SERIAL_EDGEPORT_TI=m | ||
| 1273 | CONFIG_USB_SERIAL_GARMIN=m | ||
| 1274 | CONFIG_USB_SERIAL_IPW=m | ||
| 1275 | CONFIG_USB_SERIAL_KEYSPAN_PDA=m | ||
| 1276 | CONFIG_USB_SERIAL_KEYSPAN=m | ||
| 1277 | # CONFIG_USB_SERIAL_KEYSPAN_MPR is not set | ||
| 1278 | # CONFIG_USB_SERIAL_KEYSPAN_USA28 is not set | ||
| 1279 | # CONFIG_USB_SERIAL_KEYSPAN_USA28X is not set | ||
| 1280 | # CONFIG_USB_SERIAL_KEYSPAN_USA28XA is not set | ||
| 1281 | # CONFIG_USB_SERIAL_KEYSPAN_USA28XB is not set | ||
| 1282 | # CONFIG_USB_SERIAL_KEYSPAN_USA19 is not set | ||
| 1283 | # CONFIG_USB_SERIAL_KEYSPAN_USA18X is not set | ||
| 1284 | # CONFIG_USB_SERIAL_KEYSPAN_USA19W is not set | ||
| 1285 | # CONFIG_USB_SERIAL_KEYSPAN_USA19QW is not set | ||
| 1286 | # CONFIG_USB_SERIAL_KEYSPAN_USA19QI is not set | ||
| 1287 | # CONFIG_USB_SERIAL_KEYSPAN_USA49W is not set | ||
| 1288 | # CONFIG_USB_SERIAL_KEYSPAN_USA49WLC is not set | ||
| 1289 | CONFIG_USB_SERIAL_KLSI=m | ||
| 1290 | CONFIG_USB_SERIAL_KOBIL_SCT=m | ||
| 1291 | CONFIG_USB_SERIAL_MCT_U232=m | ||
| 1292 | # CONFIG_USB_SERIAL_MOS7720 is not set | ||
| 1293 | # CONFIG_USB_SERIAL_MOS7840 is not set | ||
| 1294 | # CONFIG_USB_SERIAL_NAVMAN is not set | ||
| 1295 | CONFIG_USB_SERIAL_PL2303=m | ||
| 1296 | # CONFIG_USB_SERIAL_OTI6858 is not set | ||
| 1297 | # CONFIG_USB_SERIAL_HP4X is not set | ||
| 1298 | CONFIG_USB_SERIAL_SAFE=m | ||
| 1299 | # CONFIG_USB_SERIAL_SAFE_PADDED is not set | ||
| 1300 | # CONFIG_USB_SERIAL_SIERRAWIRELESS is not set | ||
| 1301 | CONFIG_USB_SERIAL_TI=m | ||
| 1302 | CONFIG_USB_SERIAL_CYBERJACK=m | ||
| 1303 | CONFIG_USB_SERIAL_XIRCOM=m | ||
| 1304 | # CONFIG_USB_SERIAL_OPTION is not set | ||
| 1305 | CONFIG_USB_SERIAL_OMNINET=m | ||
| 1306 | # CONFIG_USB_SERIAL_DEBUG is not set | ||
| 1307 | CONFIG_USB_EZUSB=y | ||
| 1308 | |||
| 1309 | # | ||
| 1310 | # USB Miscellaneous drivers | ||
| 1311 | # | ||
| 1312 | CONFIG_USB_EMI62=m | ||
| 1313 | CONFIG_USB_EMI26=m | ||
| 1314 | # CONFIG_USB_ADUTUX is not set | ||
| 1315 | CONFIG_USB_AUERSWALD=m | ||
| 1316 | CONFIG_USB_RIO500=m | ||
| 1317 | CONFIG_USB_LEGOTOWER=m | ||
| 1318 | CONFIG_USB_LCD=m | ||
| 1319 | # CONFIG_USB_BERRY_CHARGE is not set | ||
| 1320 | CONFIG_USB_LED=m | ||
| 1321 | # CONFIG_USB_CYPRESS_CY7C63 is not set | ||
| 1322 | CONFIG_USB_CYTHERM=m | ||
| 1323 | # CONFIG_USB_PHIDGET is not set | ||
| 1324 | CONFIG_USB_IDMOUSE=m | ||
| 1325 | # CONFIG_USB_FTDI_ELAN is not set | ||
| 1326 | # CONFIG_USB_APPLEDISPLAY is not set | ||
| 1327 | # CONFIG_USB_LD is not set | ||
| 1328 | # CONFIG_USB_TRANCEVIBRATOR is not set | ||
| 1329 | # CONFIG_USB_IOWARRIOR is not set | ||
| 1330 | # CONFIG_USB_TEST is not set | ||
| 1331 | |||
| 1332 | # | ||
| 1333 | # USB DSL modem support | ||
| 1334 | # | ||
| 1335 | |||
| 1336 | # | ||
| 1337 | # USB Gadget Support | ||
| 1338 | # | ||
| 1339 | CONFIG_USB_GADGET=y | ||
| 1340 | # CONFIG_USB_GADGET_DEBUG is not set | ||
| 1341 | # CONFIG_USB_GADGET_DEBUG_FILES is not set | ||
| 1342 | CONFIG_USB_GADGET_SELECTED=y | ||
| 1343 | # CONFIG_USB_GADGET_AMD5536UDC is not set | ||
| 1344 | # CONFIG_USB_GADGET_ATMEL_USBA is not set | ||
| 1345 | # CONFIG_USB_GADGET_FSL_USB2 is not set | ||
| 1346 | # CONFIG_USB_GADGET_NET2280 is not set | ||
| 1347 | CONFIG_USB_GADGET_PXA2XX=y | ||
| 1348 | CONFIG_USB_PXA2XX=y | ||
| 1349 | # CONFIG_USB_PXA2XX_SMALL is not set | ||
| 1350 | # CONFIG_USB_GADGET_M66592 is not set | ||
| 1351 | # CONFIG_USB_GADGET_PXA27X is not set | ||
| 1352 | # CONFIG_USB_GADGET_GOKU is not set | ||
| 1353 | # CONFIG_USB_GADGET_LH7A40X is not set | ||
| 1354 | # CONFIG_USB_GADGET_OMAP is not set | ||
| 1355 | # CONFIG_USB_GADGET_S3C2410 is not set | ||
| 1356 | # CONFIG_USB_GADGET_AT91 is not set | ||
| 1357 | # CONFIG_USB_GADGET_DUMMY_HCD is not set | ||
| 1358 | # CONFIG_USB_GADGET_DUALSPEED is not set | ||
| 1359 | CONFIG_USB_ZERO=m | ||
| 1360 | CONFIG_USB_ETH=m | ||
| 1361 | CONFIG_USB_ETH_RNDIS=y | ||
| 1362 | CONFIG_USB_GADGETFS=m | ||
| 1363 | CONFIG_USB_FILE_STORAGE=m | ||
| 1364 | # CONFIG_USB_FILE_STORAGE_TEST is not set | ||
| 1365 | CONFIG_USB_G_SERIAL=m | ||
| 1366 | # CONFIG_USB_MIDI_GADGET is not set | ||
| 1367 | CONFIG_MMC=y | ||
| 1368 | # CONFIG_MMC_DEBUG is not set | ||
| 1369 | CONFIG_MMC_UNSAFE_RESUME=y | ||
| 1370 | |||
| 1371 | # | ||
| 1372 | # MMC/SD Card Drivers | ||
| 1373 | # | ||
| 1374 | CONFIG_MMC_BLOCK=y | ||
| 1375 | CONFIG_MMC_BLOCK_BOUNCE=y | ||
| 1376 | # CONFIG_SDIO_UART is not set | ||
| 1377 | |||
| 1378 | # | ||
| 1379 | # MMC/SD Host Controller Drivers | ||
| 1380 | # | ||
| 1381 | CONFIG_MMC_PXA=y | ||
| 1382 | CONFIG_NEW_LEDS=y | ||
| 1383 | CONFIG_LEDS_CLASS=y | ||
| 1384 | |||
| 1385 | # | ||
| 1386 | # LED drivers | ||
| 1387 | # | ||
| 1388 | CONFIG_LEDS_CORGI=y | ||
| 1389 | # CONFIG_LEDS_TOSA is not set | ||
| 1390 | # CONFIG_LEDS_GPIO is not set | ||
| 1391 | |||
| 1392 | # | ||
| 1393 | # LED Triggers | ||
| 1394 | # | ||
| 1395 | CONFIG_LEDS_TRIGGERS=y | ||
| 1396 | CONFIG_LEDS_TRIGGER_TIMER=y | ||
| 1397 | CONFIG_LEDS_TRIGGER_IDE_DISK=y | ||
| 1398 | # CONFIG_LEDS_TRIGGER_HEARTBEAT is not set | ||
| 1399 | CONFIG_RTC_LIB=y | ||
| 1400 | CONFIG_RTC_CLASS=y | ||
| 1401 | CONFIG_RTC_HCTOSYS=y | ||
| 1402 | CONFIG_RTC_HCTOSYS_DEVICE="rtc0" | ||
| 1403 | # CONFIG_RTC_DEBUG is not set | ||
| 1404 | |||
| 1405 | # | ||
| 1406 | # RTC interfaces | ||
| 1407 | # | ||
| 1408 | CONFIG_RTC_INTF_SYSFS=y | ||
| 1409 | CONFIG_RTC_INTF_PROC=y | ||
| 1410 | CONFIG_RTC_INTF_DEV=y | ||
| 1411 | # CONFIG_RTC_INTF_DEV_UIE_EMUL is not set | ||
| 1412 | # CONFIG_RTC_DRV_TEST is not set | ||
| 1413 | |||
| 1414 | # | ||
| 1415 | # I2C RTC drivers | ||
| 1416 | # | ||
| 1417 | # CONFIG_RTC_DRV_DS1307 is not set | ||
| 1418 | # CONFIG_RTC_DRV_DS1374 is not set | ||
| 1419 | # CONFIG_RTC_DRV_DS1672 is not set | ||
| 1420 | # CONFIG_RTC_DRV_MAX6900 is not set | ||
| 1421 | # CONFIG_RTC_DRV_RS5C372 is not set | ||
| 1422 | # CONFIG_RTC_DRV_ISL1208 is not set | ||
| 1423 | # CONFIG_RTC_DRV_X1205 is not set | ||
| 1424 | # CONFIG_RTC_DRV_PCF8563 is not set | ||
| 1425 | # CONFIG_RTC_DRV_PCF8583 is not set | ||
| 1426 | # CONFIG_RTC_DRV_M41T80 is not set | ||
| 1427 | |||
| 1428 | # | ||
| 1429 | # SPI RTC drivers | ||
| 1430 | # | ||
| 1431 | |||
| 1432 | # | ||
| 1433 | # Platform RTC drivers | ||
| 1434 | # | ||
| 1435 | # CONFIG_RTC_DRV_CMOS is not set | ||
| 1436 | # CONFIG_RTC_DRV_DS1553 is not set | ||
| 1437 | # CONFIG_RTC_DRV_STK17TA8 is not set | ||
| 1438 | # CONFIG_RTC_DRV_DS1742 is not set | ||
| 1439 | # CONFIG_RTC_DRV_M48T86 is not set | ||
| 1440 | # CONFIG_RTC_DRV_M48T59 is not set | ||
| 1441 | # CONFIG_RTC_DRV_V3020 is not set | ||
| 1442 | |||
| 1443 | # | ||
| 1444 | # on-CPU RTC drivers | ||
| 1445 | # | ||
| 1446 | CONFIG_RTC_DRV_SA1100=y | ||
| 1447 | |||
| 1448 | # | ||
| 1449 | # File systems | ||
| 1450 | # | ||
| 1451 | CONFIG_EXT2_FS=y | ||
| 1452 | # CONFIG_EXT2_FS_XATTR is not set | ||
| 1453 | # CONFIG_EXT2_FS_XIP is not set | ||
| 1454 | CONFIG_EXT3_FS=m | ||
| 1455 | # CONFIG_EXT3_FS_XATTR is not set | ||
| 1456 | # CONFIG_EXT4DEV_FS is not set | ||
| 1457 | CONFIG_JBD=m | ||
| 1458 | # CONFIG_REISERFS_FS is not set | ||
| 1459 | # CONFIG_JFS_FS is not set | ||
| 1460 | # CONFIG_FS_POSIX_ACL is not set | ||
| 1461 | # CONFIG_XFS_FS is not set | ||
| 1462 | # CONFIG_GFS2_FS is not set | ||
| 1463 | # CONFIG_OCFS2_FS is not set | ||
| 1464 | # CONFIG_MINIX_FS is not set | ||
| 1465 | # CONFIG_ROMFS_FS is not set | ||
| 1466 | CONFIG_INOTIFY=y | ||
| 1467 | CONFIG_INOTIFY_USER=y | ||
| 1468 | # CONFIG_QUOTA is not set | ||
| 1469 | CONFIG_DNOTIFY=y | ||
| 1470 | # CONFIG_AUTOFS_FS is not set | ||
| 1471 | # CONFIG_AUTOFS4_FS is not set | ||
| 1472 | # CONFIG_FUSE_FS is not set | ||
| 1473 | |||
| 1474 | # | ||
| 1475 | # CD-ROM/DVD Filesystems | ||
| 1476 | # | ||
| 1477 | # CONFIG_ISO9660_FS is not set | ||
| 1478 | # CONFIG_UDF_FS is not set | ||
| 1479 | |||
| 1480 | # | ||
| 1481 | # DOS/FAT/NT Filesystems | ||
| 1482 | # | ||
| 1483 | CONFIG_FAT_FS=y | ||
| 1484 | # CONFIG_MSDOS_FS is not set | ||
| 1485 | CONFIG_VFAT_FS=y | ||
| 1486 | CONFIG_FAT_DEFAULT_CODEPAGE=437 | ||
| 1487 | CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" | ||
| 1488 | # CONFIG_NTFS_FS is not set | ||
| 1489 | |||
| 1490 | # | ||
| 1491 | # Pseudo filesystems | ||
| 1492 | # | ||
| 1493 | CONFIG_PROC_FS=y | ||
| 1494 | CONFIG_PROC_SYSCTL=y | ||
| 1495 | CONFIG_SYSFS=y | ||
| 1496 | CONFIG_TMPFS=y | ||
| 1497 | # CONFIG_TMPFS_POSIX_ACL is not set | ||
| 1498 | # CONFIG_HUGETLB_PAGE is not set | ||
| 1499 | # CONFIG_CONFIGFS_FS is not set | ||
| 1500 | |||
| 1501 | # | ||
| 1502 | # Miscellaneous filesystems | ||
| 1503 | # | ||
| 1504 | # CONFIG_ADFS_FS is not set | ||
| 1505 | # CONFIG_AFFS_FS is not set | ||
| 1506 | # CONFIG_HFS_FS is not set | ||
| 1507 | # CONFIG_HFSPLUS_FS is not set | ||
| 1508 | # CONFIG_BEFS_FS is not set | ||
| 1509 | # CONFIG_BFS_FS is not set | ||
| 1510 | # CONFIG_EFS_FS is not set | ||
| 1511 | CONFIG_JFFS2_FS=y | ||
| 1512 | CONFIG_JFFS2_FS_DEBUG=0 | ||
| 1513 | CONFIG_JFFS2_FS_WRITEBUFFER=y | ||
| 1514 | # CONFIG_JFFS2_FS_WBUF_VERIFY is not set | ||
| 1515 | CONFIG_JFFS2_SUMMARY=y | ||
| 1516 | # CONFIG_JFFS2_FS_XATTR is not set | ||
| 1517 | # CONFIG_JFFS2_SYSFS is not set | ||
| 1518 | CONFIG_JFFS2_COMPRESSION_OPTIONS=y | ||
| 1519 | CONFIG_JFFS2_ZLIB=y | ||
| 1520 | CONFIG_JFFS2_LZO=y | ||
| 1521 | CONFIG_JFFS2_RTIME=y | ||
| 1522 | CONFIG_JFFS2_RUBIN=y | ||
| 1523 | # CONFIG_JFFS2_CMODE_NONE is not set | ||
| 1524 | CONFIG_JFFS2_CMODE_PRIORITY=y | ||
| 1525 | # CONFIG_JFFS2_CMODE_SIZE is not set | ||
| 1526 | # CONFIG_JFFS2_CMODE_FAVOURLZO is not set | ||
| 1527 | CONFIG_CRAMFS=m | ||
| 1528 | CONFIG_SQUASHFS=m | ||
| 1529 | # CONFIG_SQUASHFS_EMBEDDED is not set | ||
| 1530 | CONFIG_SQUASHFS_FRAGMENT_CACHE_SIZE=3 | ||
| 1531 | # CONFIG_VXFS_FS is not set | ||
| 1532 | # CONFIG_HPFS_FS is not set | ||
| 1533 | # CONFIG_QNX4FS_FS is not set | ||
| 1534 | # CONFIG_SYSV_FS is not set | ||
| 1535 | # CONFIG_UFS_FS is not set | ||
| 1536 | CONFIG_NETWORK_FILESYSTEMS=y | ||
| 1537 | CONFIG_NFS_FS=m | ||
| 1538 | CONFIG_NFS_V3=y | ||
| 1539 | # CONFIG_NFS_V3_ACL is not set | ||
| 1540 | CONFIG_NFS_V4=y | ||
| 1541 | # CONFIG_NFS_DIRECTIO is not set | ||
| 1542 | CONFIG_NFSD=m | ||
| 1543 | CONFIG_NFSD_V3=y | ||
| 1544 | # CONFIG_NFSD_V3_ACL is not set | ||
| 1545 | CONFIG_NFSD_V4=y | ||
| 1546 | CONFIG_NFSD_TCP=y | ||
| 1547 | CONFIG_LOCKD=m | ||
| 1548 | CONFIG_LOCKD_V4=y | ||
| 1549 | CONFIG_EXPORTFS=m | ||
| 1550 | CONFIG_NFS_COMMON=y | ||
| 1551 | CONFIG_SUNRPC=m | ||
| 1552 | CONFIG_SUNRPC_GSS=m | ||
| 1553 | # CONFIG_SUNRPC_BIND34 is not set | ||
| 1554 | CONFIG_RPCSEC_GSS_KRB5=m | ||
| 1555 | # CONFIG_RPCSEC_GSS_SPKM3 is not set | ||
| 1556 | CONFIG_SMB_FS=m | ||
| 1557 | CONFIG_SMB_NLS_DEFAULT=y | ||
| 1558 | CONFIG_SMB_NLS_REMOTE="cp437" | ||
| 1559 | CONFIG_CIFS=m | ||
| 1560 | # CONFIG_CIFS_STATS is not set | ||
| 1561 | # CONFIG_CIFS_WEAK_PW_HASH is not set | ||
| 1562 | # CONFIG_CIFS_XATTR is not set | ||
| 1563 | # CONFIG_CIFS_DEBUG2 is not set | ||
| 1564 | # CONFIG_CIFS_EXPERIMENTAL is not set | ||
| 1565 | # CONFIG_NCP_FS is not set | ||
| 1566 | # CONFIG_CODA_FS is not set | ||
| 1567 | # CONFIG_AFS_FS is not set | ||
| 1568 | |||
| 1569 | # | ||
| 1570 | # Partition Types | ||
| 1571 | # | ||
| 1572 | CONFIG_PARTITION_ADVANCED=y | ||
| 1573 | # CONFIG_ACORN_PARTITION is not set | ||
| 1574 | # CONFIG_OSF_PARTITION is not set | ||
| 1575 | # CONFIG_AMIGA_PARTITION is not set | ||
| 1576 | # CONFIG_ATARI_PARTITION is not set | ||
| 1577 | # CONFIG_MAC_PARTITION is not set | ||
| 1578 | CONFIG_MSDOS_PARTITION=y | ||
| 1579 | # CONFIG_BSD_DISKLABEL is not set | ||
| 1580 | # CONFIG_MINIX_SUBPARTITION is not set | ||
| 1581 | # CONFIG_SOLARIS_X86_PARTITION is not set | ||
| 1582 | # CONFIG_UNIXWARE_DISKLABEL is not set | ||
| 1583 | # CONFIG_LDM_PARTITION is not set | ||
| 1584 | # CONFIG_SGI_PARTITION is not set | ||
| 1585 | # CONFIG_ULTRIX_PARTITION is not set | ||
| 1586 | # CONFIG_SUN_PARTITION is not set | ||
| 1587 | # CONFIG_KARMA_PARTITION is not set | ||
| 1588 | # CONFIG_EFI_PARTITION is not set | ||
| 1589 | # CONFIG_SYSV68_PARTITION is not set | ||
| 1590 | CONFIG_NLS=y | ||
| 1591 | CONFIG_NLS_DEFAULT="cp437" | ||
| 1592 | CONFIG_NLS_CODEPAGE_437=y | ||
| 1593 | CONFIG_NLS_CODEPAGE_737=m | ||
| 1594 | CONFIG_NLS_CODEPAGE_775=m | ||
| 1595 | CONFIG_NLS_CODEPAGE_850=m | ||
| 1596 | CONFIG_NLS_CODEPAGE_852=m | ||
| 1597 | CONFIG_NLS_CODEPAGE_855=m | ||
| 1598 | CONFIG_NLS_CODEPAGE_857=m | ||
| 1599 | CONFIG_NLS_CODEPAGE_860=m | ||
| 1600 | CONFIG_NLS_CODEPAGE_861=m | ||
| 1601 | CONFIG_NLS_CODEPAGE_862=m | ||
| 1602 | CONFIG_NLS_CODEPAGE_863=m | ||
| 1603 | CONFIG_NLS_CODEPAGE_864=m | ||
| 1604 | CONFIG_NLS_CODEPAGE_865=m | ||
| 1605 | CONFIG_NLS_CODEPAGE_866=m | ||
| 1606 | CONFIG_NLS_CODEPAGE_869=m | ||
| 1607 | CONFIG_NLS_CODEPAGE_936=m | ||
| 1608 | CONFIG_NLS_CODEPAGE_950=m | ||
| 1609 | CONFIG_NLS_CODEPAGE_932=m | ||
| 1610 | CONFIG_NLS_CODEPAGE_949=m | ||
| 1611 | CONFIG_NLS_CODEPAGE_874=m | ||
| 1612 | CONFIG_NLS_ISO8859_8=m | ||
| 1613 | CONFIG_NLS_CODEPAGE_1250=m | ||
| 1614 | CONFIG_NLS_CODEPAGE_1251=m | ||
| 1615 | CONFIG_NLS_ASCII=m | ||
| 1616 | CONFIG_NLS_ISO8859_1=y | ||
| 1617 | CONFIG_NLS_ISO8859_2=m | ||
| 1618 | CONFIG_NLS_ISO8859_3=m | ||
| 1619 | CONFIG_NLS_ISO8859_4=m | ||
| 1620 | CONFIG_NLS_ISO8859_5=m | ||
| 1621 | CONFIG_NLS_ISO8859_6=m | ||
| 1622 | CONFIG_NLS_ISO8859_7=m | ||
| 1623 | CONFIG_NLS_ISO8859_9=m | ||
| 1624 | CONFIG_NLS_ISO8859_13=m | ||
| 1625 | CONFIG_NLS_ISO8859_14=m | ||
| 1626 | CONFIG_NLS_ISO8859_15=m | ||
| 1627 | CONFIG_NLS_KOI8_R=m | ||
| 1628 | CONFIG_NLS_KOI8_U=m | ||
| 1629 | CONFIG_NLS_UTF8=y | ||
| 1630 | # CONFIG_DLM is not set | ||
| 1631 | CONFIG_INSTRUMENTATION=y | ||
| 1632 | CONFIG_PROFILING=y | ||
| 1633 | CONFIG_OPROFILE=m | ||
| 1634 | # CONFIG_MARKERS is not set | ||
| 1635 | |||
| 1636 | # | ||
| 1637 | # Kernel hacking | ||
| 1638 | # | ||
| 1639 | # CONFIG_PRINTK_TIME is not set | ||
| 1640 | CONFIG_ENABLE_WARN_DEPRECATED=y | ||
| 1641 | CONFIG_ENABLE_MUST_CHECK=y | ||
| 1642 | CONFIG_MAGIC_SYSRQ=y | ||
| 1643 | # CONFIG_UNUSED_SYMBOLS is not set | ||
| 1644 | # CONFIG_DEBUG_FS is not set | ||
| 1645 | # CONFIG_HEADERS_CHECK is not set | ||
| 1646 | CONFIG_DEBUG_KERNEL=y | ||
| 1647 | # CONFIG_DEBUG_SHIRQ is not set | ||
| 1648 | # CONFIG_DETECT_SOFTLOCKUP is not set | ||
| 1649 | # CONFIG_SCHED_DEBUG is not set | ||
| 1650 | # CONFIG_SCHEDSTATS is not set | ||
| 1651 | CONFIG_TIMER_STATS=y | ||
| 1652 | # CONFIG_DEBUG_SLAB is not set | ||
| 1653 | # CONFIG_DEBUG_PREEMPT is not set | ||
| 1654 | # CONFIG_DEBUG_RT_MUTEXES is not set | ||
| 1655 | # CONFIG_RT_MUTEX_TESTER is not set | ||
| 1656 | # CONFIG_DEBUG_SPINLOCK is not set | ||
| 1657 | # CONFIG_DEBUG_MUTEXES is not set | ||
| 1658 | # CONFIG_DEBUG_LOCK_ALLOC is not set | ||
| 1659 | # CONFIG_PROVE_LOCKING is not set | ||
| 1660 | # CONFIG_LOCK_STAT is not set | ||
| 1661 | # CONFIG_DEBUG_SPINLOCK_SLEEP is not set | ||
| 1662 | # CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set | ||
| 1663 | # CONFIG_DEBUG_KOBJECT is not set | ||
| 1664 | CONFIG_DEBUG_BUGVERBOSE=y | ||
| 1665 | # CONFIG_DEBUG_INFO is not set | ||
| 1666 | # CONFIG_DEBUG_VM is not set | ||
| 1667 | # CONFIG_DEBUG_LIST is not set | ||
| 1668 | # CONFIG_DEBUG_SG is not set | ||
| 1669 | CONFIG_FRAME_POINTER=y | ||
| 1670 | # CONFIG_FORCED_INLINING is not set | ||
| 1671 | # CONFIG_BOOT_PRINTK_DELAY is not set | ||
| 1672 | # CONFIG_RCU_TORTURE_TEST is not set | ||
| 1673 | # CONFIG_FAULT_INJECTION is not set | ||
| 1674 | # CONFIG_SAMPLES is not set | ||
| 1675 | # CONFIG_DEBUG_USER is not set | ||
| 1676 | CONFIG_DEBUG_ERRORS=y | ||
| 1677 | # CONFIG_DEBUG_LL is not set | ||
| 1678 | |||
| 1679 | # | ||
| 1680 | # Security options | ||
| 1681 | # | ||
| 1682 | # CONFIG_KEYS is not set | ||
| 1683 | # CONFIG_SECURITY is not set | ||
| 1684 | # CONFIG_SECURITY_FILE_CAPABILITIES is not set | ||
| 1685 | CONFIG_CRYPTO=y | ||
| 1686 | CONFIG_CRYPTO_ALGAPI=m | ||
| 1687 | CONFIG_CRYPTO_BLKCIPHER=m | ||
| 1688 | CONFIG_CRYPTO_HASH=m | ||
| 1689 | CONFIG_CRYPTO_MANAGER=m | ||
| 1690 | CONFIG_CRYPTO_HMAC=m | ||
| 1691 | # CONFIG_CRYPTO_XCBC is not set | ||
| 1692 | CONFIG_CRYPTO_NULL=m | ||
| 1693 | CONFIG_CRYPTO_MD4=m | ||
| 1694 | CONFIG_CRYPTO_MD5=m | ||
| 1695 | CONFIG_CRYPTO_SHA1=m | ||
| 1696 | CONFIG_CRYPTO_SHA256=m | ||
| 1697 | CONFIG_CRYPTO_SHA512=m | ||
| 1698 | CONFIG_CRYPTO_WP512=m | ||
| 1699 | # CONFIG_CRYPTO_TGR192 is not set | ||
| 1700 | # CONFIG_CRYPTO_GF128MUL is not set | ||
| 1701 | CONFIG_CRYPTO_ECB=m | ||
| 1702 | CONFIG_CRYPTO_CBC=m | ||
| 1703 | CONFIG_CRYPTO_PCBC=m | ||
| 1704 | # CONFIG_CRYPTO_LRW is not set | ||
| 1705 | # CONFIG_CRYPTO_XTS is not set | ||
| 1706 | # CONFIG_CRYPTO_CRYPTD is not set | ||
| 1707 | CONFIG_CRYPTO_DES=m | ||
| 1708 | # CONFIG_CRYPTO_FCRYPT is not set | ||
| 1709 | CONFIG_CRYPTO_BLOWFISH=m | ||
| 1710 | CONFIG_CRYPTO_TWOFISH=m | ||
| 1711 | CONFIG_CRYPTO_TWOFISH_COMMON=m | ||
| 1712 | CONFIG_CRYPTO_SERPENT=m | ||
| 1713 | CONFIG_CRYPTO_AES=m | ||
| 1714 | CONFIG_CRYPTO_CAST5=m | ||
| 1715 | CONFIG_CRYPTO_CAST6=m | ||
| 1716 | CONFIG_CRYPTO_TEA=m | ||
| 1717 | CONFIG_CRYPTO_ARC4=m | ||
| 1718 | CONFIG_CRYPTO_KHAZAD=m | ||
| 1719 | CONFIG_CRYPTO_ANUBIS=m | ||
| 1720 | # CONFIG_CRYPTO_SEED is not set | ||
| 1721 | CONFIG_CRYPTO_DEFLATE=m | ||
| 1722 | CONFIG_CRYPTO_LZO=m | ||
| 1723 | CONFIG_CRYPTO_MICHAEL_MIC=m | ||
| 1724 | CONFIG_CRYPTO_CRC32C=m | ||
| 1725 | CONFIG_CRYPTO_CAMELLIA=m | ||
| 1726 | CONFIG_CRYPTO_TEST=m | ||
| 1727 | # CONFIG_CRYPTO_AUTHENC is not set | ||
| 1728 | # CONFIG_CRYPTO_HW is not set | ||
| 1729 | |||
| 1730 | # | ||
| 1731 | # Library routines | ||
| 1732 | # | ||
| 1733 | CONFIG_BITREVERSE=y | ||
| 1734 | CONFIG_CRC_CCITT=y | ||
| 1735 | # CONFIG_CRC16 is not set | ||
| 1736 | # CONFIG_CRC_ITU_T is not set | ||
| 1737 | CONFIG_CRC32=y | ||
| 1738 | # CONFIG_CRC7 is not set | ||
| 1739 | CONFIG_LIBCRC32C=m | ||
| 1740 | CONFIG_ZLIB_INFLATE=y | ||
| 1741 | CONFIG_ZLIB_DEFLATE=y | ||
| 1742 | CONFIG_LZO_COMPRESS=y | ||
| 1743 | CONFIG_LZO_DECOMPRESS=y | ||
| 1744 | CONFIG_PLIST=y | ||
| 1745 | CONFIG_HAS_IOMEM=y | ||
| 1746 | CONFIG_HAS_IOPORT=y | ||
| 1747 | CONFIG_HAS_DMA=y | ||
diff --git a/meta/packages/linux/linux-rp-2.6.25+2.6.26-rc4/defconfig-collie b/meta/packages/linux/linux-rp-2.6.25+2.6.26-rc4/defconfig-collie new file mode 100644 index 0000000000..271bfd5881 --- /dev/null +++ b/meta/packages/linux/linux-rp-2.6.25+2.6.26-rc4/defconfig-collie | |||
| @@ -0,0 +1,1437 @@ | |||
| 1 | # | ||
| 2 | # Automatically generated make config: don't edit | ||
| 3 | # Linux kernel version: 2.6.24-rc8 | ||
| 4 | # Mon Jan 21 22:14:20 2008 | ||
| 5 | # | ||
| 6 | CONFIG_ARM=y | ||
| 7 | CONFIG_SYS_SUPPORTS_APM_EMULATION=y | ||
| 8 | CONFIG_GENERIC_GPIO=y | ||
| 9 | # CONFIG_GENERIC_TIME is not set | ||
| 10 | # CONFIG_GENERIC_CLOCKEVENTS is not set | ||
| 11 | CONFIG_MMU=y | ||
| 12 | # CONFIG_NO_IOPORT is not set | ||
| 13 | CONFIG_GENERIC_HARDIRQS=y | ||
| 14 | CONFIG_STACKTRACE_SUPPORT=y | ||
| 15 | CONFIG_LOCKDEP_SUPPORT=y | ||
| 16 | CONFIG_TRACE_IRQFLAGS_SUPPORT=y | ||
| 17 | CONFIG_HARDIRQS_SW_RESEND=y | ||
| 18 | CONFIG_GENERIC_IRQ_PROBE=y | ||
| 19 | CONFIG_RWSEM_GENERIC_SPINLOCK=y | ||
| 20 | # CONFIG_ARCH_HAS_ILOG2_U32 is not set | ||
| 21 | # CONFIG_ARCH_HAS_ILOG2_U64 is not set | ||
| 22 | CONFIG_GENERIC_HWEIGHT=y | ||
| 23 | CONFIG_GENERIC_CALIBRATE_DELAY=y | ||
| 24 | CONFIG_ZONE_DMA=y | ||
| 25 | CONFIG_ARCH_MTD_XIP=y | ||
| 26 | CONFIG_VECTORS_BASE=0xffff0000 | ||
| 27 | CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" | ||
| 28 | |||
| 29 | # | ||
| 30 | # General setup | ||
| 31 | # | ||
| 32 | CONFIG_EXPERIMENTAL=y | ||
| 33 | CONFIG_BROKEN_ON_SMP=y | ||
| 34 | CONFIG_LOCK_KERNEL=y | ||
| 35 | CONFIG_INIT_ENV_ARG_LIMIT=32 | ||
| 36 | CONFIG_LOCALVERSION="" | ||
| 37 | # CONFIG_LOCALVERSION_AUTO is not set | ||
| 38 | CONFIG_SWAP=y | ||
| 39 | CONFIG_SYSVIPC=y | ||
| 40 | CONFIG_SYSVIPC_SYSCTL=y | ||
| 41 | # CONFIG_POSIX_MQUEUE is not set | ||
| 42 | CONFIG_BSD_PROCESS_ACCT=y | ||
| 43 | CONFIG_BSD_PROCESS_ACCT_V3=y | ||
| 44 | # CONFIG_TASKSTATS is not set | ||
| 45 | # CONFIG_USER_NS is not set | ||
| 46 | # CONFIG_PID_NS is not set | ||
| 47 | # CONFIG_AUDIT is not set | ||
| 48 | # CONFIG_IKCONFIG is not set | ||
| 49 | CONFIG_LOG_BUF_SHIFT=14 | ||
| 50 | # CONFIG_CGROUPS is not set | ||
| 51 | CONFIG_FAIR_GROUP_SCHED=y | ||
| 52 | CONFIG_FAIR_USER_SCHED=y | ||
| 53 | # CONFIG_FAIR_CGROUP_SCHED is not set | ||
| 54 | # CONFIG_SYSFS_DEPRECATED is not set | ||
| 55 | # CONFIG_RELAY is not set | ||
| 56 | # CONFIG_BLK_DEV_INITRD is not set | ||
| 57 | CONFIG_CC_OPTIMIZE_FOR_SIZE=y | ||
| 58 | CONFIG_SYSCTL=y | ||
| 59 | CONFIG_EMBEDDED=y | ||
| 60 | CONFIG_UID16=y | ||
| 61 | CONFIG_SYSCTL_SYSCALL=y | ||
| 62 | CONFIG_KALLSYMS=y | ||
| 63 | # CONFIG_KALLSYMS_ALL is not set | ||
| 64 | # CONFIG_KALLSYMS_EXTRA_PASS is not set | ||
| 65 | CONFIG_HOTPLUG=y | ||
| 66 | CONFIG_PRINTK=y | ||
| 67 | CONFIG_BUG=y | ||
| 68 | # CONFIG_ELF_CORE is not set | ||
| 69 | CONFIG_BASE_FULL=y | ||
| 70 | CONFIG_FUTEX=y | ||
| 71 | CONFIG_ANON_INODES=y | ||
| 72 | CONFIG_EPOLL=y | ||
| 73 | CONFIG_SIGNALFD=y | ||
| 74 | CONFIG_EVENTFD=y | ||
| 75 | CONFIG_SHMEM=y | ||
| 76 | CONFIG_VM_EVENT_COUNTERS=y | ||
| 77 | CONFIG_SLAB=y | ||
| 78 | # CONFIG_SLUB is not set | ||
| 79 | # CONFIG_SLOB is not set | ||
| 80 | CONFIG_SLABINFO=y | ||
| 81 | CONFIG_RT_MUTEXES=y | ||
| 82 | # CONFIG_TINY_SHMEM is not set | ||
| 83 | CONFIG_BASE_SMALL=0 | ||
| 84 | CONFIG_MODULES=y | ||
| 85 | CONFIG_MODULE_UNLOAD=y | ||
| 86 | CONFIG_MODULE_FORCE_UNLOAD=y | ||
| 87 | # CONFIG_MODVERSIONS is not set | ||
| 88 | # CONFIG_MODULE_SRCVERSION_ALL is not set | ||
| 89 | CONFIG_KMOD=y | ||
| 90 | CONFIG_BLOCK=y | ||
| 91 | # CONFIG_LBD is not set | ||
| 92 | # CONFIG_BLK_DEV_IO_TRACE is not set | ||
| 93 | # CONFIG_LSF is not set | ||
| 94 | # CONFIG_BLK_DEV_BSG is not set | ||
| 95 | |||
| 96 | # | ||
| 97 | # IO Schedulers | ||
| 98 | # | ||
| 99 | CONFIG_IOSCHED_NOOP=y | ||
| 100 | CONFIG_IOSCHED_AS=y | ||
| 101 | CONFIG_IOSCHED_DEADLINE=m | ||
| 102 | CONFIG_IOSCHED_CFQ=m | ||
| 103 | CONFIG_DEFAULT_AS=y | ||
| 104 | # CONFIG_DEFAULT_DEADLINE is not set | ||
| 105 | # CONFIG_DEFAULT_CFQ is not set | ||
| 106 | # CONFIG_DEFAULT_NOOP is not set | ||
| 107 | CONFIG_DEFAULT_IOSCHED="anticipatory" | ||
| 108 | |||
| 109 | # | ||
| 110 | # System Type | ||
| 111 | # | ||
| 112 | # CONFIG_ARCH_AAEC2000 is not set | ||
| 113 | # CONFIG_ARCH_INTEGRATOR is not set | ||
| 114 | # CONFIG_ARCH_REALVIEW is not set | ||
| 115 | # CONFIG_ARCH_VERSATILE is not set | ||
| 116 | # CONFIG_ARCH_AT91 is not set | ||
| 117 | # CONFIG_ARCH_CLPS7500 is not set | ||
| 118 | # CONFIG_ARCH_CLPS711X is not set | ||
| 119 | # CONFIG_ARCH_CO285 is not set | ||
| 120 | # CONFIG_ARCH_EBSA110 is not set | ||
| 121 | # CONFIG_ARCH_EP93XX is not set | ||
| 122 | # CONFIG_ARCH_FOOTBRIDGE is not set | ||
| 123 | # CONFIG_ARCH_NETX is not set | ||
| 124 | # CONFIG_ARCH_H720X is not set | ||
| 125 | # CONFIG_ARCH_IMX is not set | ||
| 126 | # CONFIG_ARCH_IOP13XX is not set | ||
| 127 | # CONFIG_ARCH_IOP32X is not set | ||
| 128 | # CONFIG_ARCH_IOP33X is not set | ||
| 129 | # CONFIG_ARCH_IXP23XX is not set | ||
| 130 | # CONFIG_ARCH_IXP2000 is not set | ||
| 131 | # CONFIG_ARCH_IXP4XX is not set | ||
| 132 | # CONFIG_ARCH_L7200 is not set | ||
| 133 | # CONFIG_ARCH_KS8695 is not set | ||
| 134 | # CONFIG_ARCH_NS9XXX is not set | ||
| 135 | # CONFIG_ARCH_MXC is not set | ||
| 136 | # CONFIG_ARCH_PNX4008 is not set | ||
| 137 | # CONFIG_ARCH_PXA is not set | ||
| 138 | # CONFIG_ARCH_RPC is not set | ||
| 139 | CONFIG_ARCH_SA1100=y | ||
| 140 | # CONFIG_ARCH_S3C2410 is not set | ||
| 141 | # CONFIG_ARCH_SHARK is not set | ||
| 142 | # CONFIG_ARCH_LH7A40X is not set | ||
| 143 | # CONFIG_ARCH_DAVINCI is not set | ||
| 144 | # CONFIG_ARCH_OMAP is not set | ||
| 145 | |||
| 146 | # | ||
| 147 | # SA11x0 Implementations | ||
| 148 | # | ||
| 149 | # CONFIG_SA1100_ASSABET is not set | ||
| 150 | # CONFIG_SA1100_CERF is not set | ||
| 151 | CONFIG_SA1100_COLLIE=y | ||
| 152 | # CONFIG_SA1100_H3100 is not set | ||
| 153 | # CONFIG_SA1100_H3600 is not set | ||
| 154 | # CONFIG_SA1100_H3800 is not set | ||
| 155 | # CONFIG_SA1100_BADGE4 is not set | ||
| 156 | # CONFIG_SA1100_JORNADA720 is not set | ||
| 157 | # CONFIG_SA1100_HACKKIT is not set | ||
| 158 | # CONFIG_SA1100_LART is not set | ||
| 159 | # CONFIG_SA1100_PLEB is not set | ||
| 160 | # CONFIG_SA1100_SHANNON is not set | ||
| 161 | # CONFIG_SA1100_SIMPAD is not set | ||
| 162 | # CONFIG_SA1100_SSP is not set | ||
| 163 | |||
| 164 | # | ||
| 165 | # Boot options | ||
| 166 | # | ||
| 167 | |||
| 168 | # | ||
| 169 | # Power management | ||
| 170 | # | ||
| 171 | |||
| 172 | # | ||
| 173 | # Processor Type | ||
| 174 | # | ||
| 175 | CONFIG_CPU_32=y | ||
| 176 | CONFIG_CPU_SA1100=y | ||
| 177 | CONFIG_CPU_32v4=y | ||
| 178 | CONFIG_CPU_ABRT_EV4=y | ||
| 179 | CONFIG_CPU_CACHE_V4WB=y | ||
| 180 | CONFIG_CPU_CACHE_VIVT=y | ||
| 181 | CONFIG_CPU_TLB_V4WB=y | ||
| 182 | CONFIG_CPU_CP15=y | ||
| 183 | CONFIG_CPU_CP15_MMU=y | ||
| 184 | |||
| 185 | # | ||
| 186 | # Processor Features | ||
| 187 | # | ||
| 188 | # CONFIG_CPU_ICACHE_DISABLE is not set | ||
| 189 | # CONFIG_CPU_DCACHE_DISABLE is not set | ||
| 190 | # CONFIG_OUTER_CACHE is not set | ||
| 191 | CONFIG_SHARP_LOCOMO=y | ||
| 192 | CONFIG_SHARP_PARAM=y | ||
| 193 | CONFIG_SHARPSL_PM=y | ||
| 194 | CONFIG_SHARP_SCOOP=y | ||
| 195 | |||
| 196 | # | ||
| 197 | # Bus support | ||
| 198 | # | ||
| 199 | CONFIG_ISA=y | ||
| 200 | # CONFIG_PCI_SYSCALL is not set | ||
| 201 | # CONFIG_ARCH_SUPPORTS_MSI is not set | ||
| 202 | CONFIG_PCCARD=m | ||
| 203 | # CONFIG_PCMCIA_DEBUG is not set | ||
| 204 | CONFIG_PCMCIA=m | ||
| 205 | CONFIG_PCMCIA_LOAD_CIS=y | ||
| 206 | CONFIG_PCMCIA_IOCTL=y | ||
| 207 | |||
| 208 | # | ||
| 209 | # PC-card bridges | ||
| 210 | # | ||
| 211 | # CONFIG_I82365 is not set | ||
| 212 | # CONFIG_TCIC is not set | ||
| 213 | CONFIG_PCMCIA_SA1100=m | ||
| 214 | |||
| 215 | # | ||
| 216 | # Kernel Features | ||
| 217 | # | ||
| 218 | # CONFIG_TICK_ONESHOT is not set | ||
| 219 | CONFIG_PREEMPT=y | ||
| 220 | CONFIG_NO_IDLE_HZ=y | ||
| 221 | CONFIG_HZ=100 | ||
| 222 | CONFIG_AEABI=y | ||
| 223 | CONFIG_OABI_COMPAT=y | ||
| 224 | CONFIG_ARCH_DISCONTIGMEM_ENABLE=y | ||
| 225 | CONFIG_NODES_SHIFT=2 | ||
| 226 | CONFIG_SELECT_MEMORY_MODEL=y | ||
| 227 | # CONFIG_FLATMEM_MANUAL is not set | ||
| 228 | CONFIG_DISCONTIGMEM_MANUAL=y | ||
| 229 | # CONFIG_SPARSEMEM_MANUAL is not set | ||
| 230 | CONFIG_DISCONTIGMEM=y | ||
| 231 | CONFIG_FLAT_NODE_MEM_MAP=y | ||
| 232 | CONFIG_NEED_MULTIPLE_NODES=y | ||
| 233 | # CONFIG_SPARSEMEM_STATIC is not set | ||
| 234 | # CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set | ||
| 235 | CONFIG_SPLIT_PTLOCK_CPUS=4096 | ||
| 236 | # CONFIG_RESOURCES_64BIT is not set | ||
| 237 | CONFIG_ZONE_DMA_FLAG=1 | ||
| 238 | CONFIG_BOUNCE=y | ||
| 239 | CONFIG_VIRT_TO_BUS=y | ||
| 240 | # CONFIG_LEDS is not set | ||
| 241 | CONFIG_ALIGNMENT_TRAP=y | ||
| 242 | |||
| 243 | # | ||
| 244 | # Boot options | ||
| 245 | # | ||
| 246 | CONFIG_ZBOOT_ROM_TEXT=0x0 | ||
| 247 | CONFIG_ZBOOT_ROM_BSS=0x0 | ||
| 248 | CONFIG_CMDLINE="console=ttySA0,115200n8 console=tty1 noinitrd root=/dev/mtdblock2 rootfstype=jffs2 mem=32M fbcon=rotate:1 dyntick=enable debug" | ||
| 249 | # CONFIG_XIP_KERNEL is not set | ||
| 250 | CONFIG_KEXEC=y | ||
| 251 | CONFIG_ATAGS_PROC=y | ||
| 252 | |||
| 253 | # | ||
| 254 | # CPU Frequency scaling | ||
| 255 | # | ||
| 256 | # CONFIG_CPU_FREQ is not set | ||
| 257 | |||
| 258 | # | ||
| 259 | # Floating point emulation | ||
| 260 | # | ||
| 261 | |||
| 262 | # | ||
| 263 | # At least one emulation must be selected | ||
| 264 | # | ||
| 265 | CONFIG_FPE_NWFPE=y | ||
| 266 | # CONFIG_FPE_NWFPE_XP is not set | ||
| 267 | # CONFIG_FPE_FASTFPE is not set | ||
| 268 | |||
| 269 | # | ||
| 270 | # Userspace binary formats | ||
| 271 | # | ||
| 272 | CONFIG_BINFMT_ELF=y | ||
| 273 | CONFIG_BINFMT_AOUT=m | ||
| 274 | CONFIG_BINFMT_MISC=m | ||
| 275 | |||
| 276 | # | ||
| 277 | # Power management options | ||
| 278 | # | ||
| 279 | CONFIG_PM=y | ||
| 280 | # CONFIG_PM_LEGACY is not set | ||
| 281 | # CONFIG_PM_DEBUG is not set | ||
| 282 | CONFIG_PM_SLEEP=y | ||
| 283 | CONFIG_SUSPEND_UP_POSSIBLE=y | ||
| 284 | CONFIG_SUSPEND=y | ||
| 285 | CONFIG_APM_EMULATION=m | ||
| 286 | CONFIG_INPUT_APMPOWER=m | ||
| 287 | |||
| 288 | # | ||
| 289 | # Networking | ||
| 290 | # | ||
| 291 | CONFIG_NET=y | ||
| 292 | |||
| 293 | # | ||
| 294 | # Networking options | ||
| 295 | # | ||
| 296 | CONFIG_PACKET=m | ||
| 297 | CONFIG_PACKET_MMAP=y | ||
| 298 | CONFIG_UNIX=m | ||
| 299 | CONFIG_XFRM=y | ||
| 300 | CONFIG_XFRM_USER=m | ||
| 301 | # CONFIG_XFRM_SUB_POLICY is not set | ||
| 302 | # CONFIG_XFRM_MIGRATE is not set | ||
| 303 | # CONFIG_NET_KEY is not set | ||
| 304 | CONFIG_INET=y | ||
| 305 | # CONFIG_IP_MULTICAST is not set | ||
| 306 | # CONFIG_IP_ADVANCED_ROUTER is not set | ||
| 307 | CONFIG_IP_FIB_HASH=y | ||
| 308 | # CONFIG_IP_PNP is not set | ||
| 309 | # CONFIG_NET_IPIP is not set | ||
| 310 | # CONFIG_NET_IPGRE is not set | ||
| 311 | # CONFIG_ARPD is not set | ||
| 312 | CONFIG_SYN_COOKIES=y | ||
| 313 | # CONFIG_INET_AH is not set | ||
| 314 | # CONFIG_INET_ESP is not set | ||
| 315 | # CONFIG_INET_IPCOMP is not set | ||
| 316 | # CONFIG_INET_XFRM_TUNNEL is not set | ||
| 317 | CONFIG_INET_TUNNEL=m | ||
| 318 | CONFIG_INET_XFRM_MODE_TRANSPORT=m | ||
| 319 | CONFIG_INET_XFRM_MODE_TUNNEL=m | ||
| 320 | CONFIG_INET_XFRM_MODE_BEET=m | ||
| 321 | # CONFIG_INET_LRO is not set | ||
| 322 | CONFIG_INET_DIAG=m | ||
| 323 | CONFIG_INET_TCP_DIAG=m | ||
| 324 | # CONFIG_TCP_CONG_ADVANCED is not set | ||
| 325 | CONFIG_TCP_CONG_CUBIC=y | ||
| 326 | CONFIG_DEFAULT_TCP_CONG="cubic" | ||
| 327 | # CONFIG_TCP_MD5SIG is not set | ||
| 328 | # CONFIG_IP_VS is not set | ||
| 329 | CONFIG_IPV6=m | ||
| 330 | # CONFIG_IPV6_PRIVACY is not set | ||
| 331 | # CONFIG_IPV6_ROUTER_PREF is not set | ||
| 332 | # CONFIG_IPV6_OPTIMISTIC_DAD is not set | ||
| 333 | CONFIG_INET6_AH=m | ||
| 334 | CONFIG_INET6_ESP=m | ||
| 335 | CONFIG_INET6_IPCOMP=m | ||
| 336 | # CONFIG_IPV6_MIP6 is not set | ||
| 337 | CONFIG_INET6_XFRM_TUNNEL=m | ||
| 338 | CONFIG_INET6_TUNNEL=m | ||
| 339 | CONFIG_INET6_XFRM_MODE_TRANSPORT=m | ||
| 340 | CONFIG_INET6_XFRM_MODE_TUNNEL=m | ||
| 341 | CONFIG_INET6_XFRM_MODE_BEET=m | ||
| 342 | # CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION is not set | ||
| 343 | CONFIG_IPV6_SIT=m | ||
| 344 | CONFIG_IPV6_TUNNEL=m | ||
| 345 | # CONFIG_IPV6_MULTIPLE_TABLES is not set | ||
| 346 | # CONFIG_NETWORK_SECMARK is not set | ||
| 347 | CONFIG_NETFILTER=y | ||
| 348 | # CONFIG_NETFILTER_DEBUG is not set | ||
| 349 | |||
| 350 | # | ||
| 351 | # Core Netfilter Configuration | ||
| 352 | # | ||
| 353 | # CONFIG_NETFILTER_NETLINK is not set | ||
| 354 | # CONFIG_NF_CONNTRACK_ENABLED is not set | ||
| 355 | # CONFIG_NF_CONNTRACK is not set | ||
| 356 | CONFIG_NETFILTER_XTABLES=m | ||
| 357 | # CONFIG_NETFILTER_XT_TARGET_CLASSIFY is not set | ||
| 358 | # CONFIG_NETFILTER_XT_TARGET_DSCP is not set | ||
| 359 | # CONFIG_NETFILTER_XT_TARGET_MARK is not set | ||
| 360 | # CONFIG_NETFILTER_XT_TARGET_NFQUEUE is not set | ||
| 361 | # CONFIG_NETFILTER_XT_TARGET_NFLOG is not set | ||
| 362 | # CONFIG_NETFILTER_XT_TARGET_TRACE is not set | ||
| 363 | # CONFIG_NETFILTER_XT_TARGET_TCPMSS is not set | ||
| 364 | # CONFIG_NETFILTER_XT_MATCH_COMMENT is not set | ||
| 365 | # CONFIG_NETFILTER_XT_MATCH_DCCP is not set | ||
| 366 | # CONFIG_NETFILTER_XT_MATCH_DSCP is not set | ||
| 367 | # CONFIG_NETFILTER_XT_MATCH_ESP is not set | ||
| 368 | # CONFIG_NETFILTER_XT_MATCH_LENGTH is not set | ||
| 369 | # CONFIG_NETFILTER_XT_MATCH_LIMIT is not set | ||
| 370 | # CONFIG_NETFILTER_XT_MATCH_MAC is not set | ||
| 371 | # CONFIG_NETFILTER_XT_MATCH_MARK is not set | ||
| 372 | # CONFIG_NETFILTER_XT_MATCH_POLICY is not set | ||
| 373 | # CONFIG_NETFILTER_XT_MATCH_MULTIPORT is not set | ||
| 374 | # CONFIG_NETFILTER_XT_MATCH_PKTTYPE is not set | ||
| 375 | # CONFIG_NETFILTER_XT_MATCH_QUOTA is not set | ||
| 376 | # CONFIG_NETFILTER_XT_MATCH_REALM is not set | ||
| 377 | # CONFIG_NETFILTER_XT_MATCH_SCTP is not set | ||
| 378 | # CONFIG_NETFILTER_XT_MATCH_STATISTIC is not set | ||
| 379 | # CONFIG_NETFILTER_XT_MATCH_STRING is not set | ||
| 380 | # CONFIG_NETFILTER_XT_MATCH_TCPMSS is not set | ||
| 381 | # CONFIG_NETFILTER_XT_MATCH_TIME is not set | ||
| 382 | # CONFIG_NETFILTER_XT_MATCH_U32 is not set | ||
| 383 | # CONFIG_NETFILTER_XT_MATCH_HASHLIMIT is not set | ||
| 384 | |||
| 385 | # | ||
| 386 | # IP: Netfilter Configuration | ||
| 387 | # | ||
| 388 | CONFIG_IP_NF_QUEUE=m | ||
| 389 | CONFIG_IP_NF_IPTABLES=m | ||
| 390 | CONFIG_IP_NF_MATCH_IPRANGE=m | ||
| 391 | CONFIG_IP_NF_MATCH_TOS=m | ||
| 392 | CONFIG_IP_NF_MATCH_RECENT=m | ||
| 393 | CONFIG_IP_NF_MATCH_ECN=m | ||
| 394 | CONFIG_IP_NF_MATCH_AH=m | ||
| 395 | CONFIG_IP_NF_MATCH_TTL=m | ||
| 396 | CONFIG_IP_NF_MATCH_OWNER=m | ||
| 397 | CONFIG_IP_NF_MATCH_ADDRTYPE=m | ||
| 398 | CONFIG_IP_NF_FILTER=m | ||
| 399 | CONFIG_IP_NF_TARGET_REJECT=m | ||
| 400 | CONFIG_IP_NF_TARGET_LOG=m | ||
| 401 | CONFIG_IP_NF_TARGET_ULOG=m | ||
| 402 | CONFIG_IP_NF_MANGLE=m | ||
| 403 | CONFIG_IP_NF_TARGET_TOS=m | ||
| 404 | CONFIG_IP_NF_TARGET_ECN=m | ||
| 405 | CONFIG_IP_NF_TARGET_TTL=m | ||
| 406 | CONFIG_IP_NF_RAW=m | ||
| 407 | CONFIG_IP_NF_ARPTABLES=m | ||
| 408 | CONFIG_IP_NF_ARPFILTER=m | ||
| 409 | CONFIG_IP_NF_ARP_MANGLE=m | ||
| 410 | |||
| 411 | # | ||
| 412 | # IPv6: Netfilter Configuration (EXPERIMENTAL) | ||
| 413 | # | ||
| 414 | # CONFIG_IP6_NF_QUEUE is not set | ||
| 415 | # CONFIG_IP6_NF_IPTABLES is not set | ||
| 416 | # CONFIG_IP_DCCP is not set | ||
| 417 | # CONFIG_IP_SCTP is not set | ||
| 418 | # CONFIG_TIPC is not set | ||
| 419 | # CONFIG_ATM is not set | ||
| 420 | # CONFIG_BRIDGE is not set | ||
| 421 | # CONFIG_VLAN_8021Q is not set | ||
| 422 | # CONFIG_DECNET is not set | ||
| 423 | # CONFIG_LLC2 is not set | ||
| 424 | # CONFIG_IPX is not set | ||
| 425 | # CONFIG_ATALK is not set | ||
| 426 | # CONFIG_X25 is not set | ||
| 427 | # CONFIG_LAPB is not set | ||
| 428 | # CONFIG_ECONET is not set | ||
| 429 | # CONFIG_WAN_ROUTER is not set | ||
| 430 | # CONFIG_NET_SCHED is not set | ||
| 431 | |||
| 432 | # | ||
| 433 | # Network testing | ||
| 434 | # | ||
| 435 | # CONFIG_NET_PKTGEN is not set | ||
| 436 | # CONFIG_HAMRADIO is not set | ||
| 437 | CONFIG_IRDA=m | ||
| 438 | |||
| 439 | # | ||
| 440 | # IrDA protocols | ||
| 441 | # | ||
| 442 | CONFIG_IRLAN=m | ||
| 443 | CONFIG_IRNET=m | ||
| 444 | CONFIG_IRCOMM=m | ||
| 445 | # CONFIG_IRDA_ULTRA is not set | ||
| 446 | |||
| 447 | # | ||
| 448 | # IrDA options | ||
| 449 | # | ||
| 450 | # CONFIG_IRDA_CACHE_LAST_LSAP is not set | ||
| 451 | # CONFIG_IRDA_FAST_RR is not set | ||
| 452 | # CONFIG_IRDA_DEBUG is not set | ||
| 453 | |||
| 454 | # | ||
| 455 | # Infrared-port device drivers | ||
| 456 | # | ||
| 457 | |||
| 458 | # | ||
| 459 | # SIR device drivers | ||
| 460 | # | ||
| 461 | CONFIG_IRTTY_SIR=m | ||
| 462 | |||
| 463 | # | ||
| 464 | # Dongle support | ||
| 465 | # | ||
| 466 | # CONFIG_DONGLE is not set | ||
| 467 | |||
| 468 | # | ||
| 469 | # Old SIR device drivers | ||
| 470 | # | ||
| 471 | # CONFIG_IRPORT_SIR is not set | ||
| 472 | |||
| 473 | # | ||
| 474 | # Old Serial dongle support | ||
| 475 | # | ||
| 476 | |||
| 477 | # | ||
| 478 | # FIR device drivers | ||
| 479 | # | ||
| 480 | CONFIG_SA1100_FIR=m | ||
| 481 | CONFIG_BT=m | ||
| 482 | CONFIG_BT_L2CAP=m | ||
| 483 | CONFIG_BT_SCO=m | ||
| 484 | CONFIG_BT_RFCOMM=m | ||
| 485 | CONFIG_BT_RFCOMM_TTY=y | ||
| 486 | CONFIG_BT_BNEP=m | ||
| 487 | CONFIG_BT_BNEP_MC_FILTER=y | ||
| 488 | CONFIG_BT_BNEP_PROTO_FILTER=y | ||
| 489 | CONFIG_BT_HIDP=m | ||
| 490 | |||
| 491 | # | ||
| 492 | # Bluetooth device drivers | ||
| 493 | # | ||
| 494 | # CONFIG_BT_HCIBTSDIO is not set | ||
| 495 | CONFIG_BT_HCIUART=m | ||
| 496 | CONFIG_BT_HCIUART_H4=y | ||
| 497 | CONFIG_BT_HCIUART_BCSP=y | ||
| 498 | # CONFIG_BT_HCIUART_LL is not set | ||
| 499 | CONFIG_BT_HCIDTL1=m | ||
| 500 | CONFIG_BT_HCIBT3C=m | ||
| 501 | CONFIG_BT_HCIBLUECARD=m | ||
| 502 | CONFIG_BT_HCIBTUART=m | ||
| 503 | CONFIG_BT_HCIVHCI=m | ||
| 504 | # CONFIG_AF_RXRPC is not set | ||
| 505 | |||
| 506 | # | ||
| 507 | # Wireless | ||
| 508 | # | ||
| 509 | # CONFIG_CFG80211 is not set | ||
| 510 | CONFIG_WIRELESS_EXT=y | ||
| 511 | # CONFIG_MAC80211 is not set | ||
| 512 | CONFIG_IEEE80211=m | ||
| 513 | # CONFIG_IEEE80211_DEBUG is not set | ||
| 514 | CONFIG_IEEE80211_CRYPT_WEP=m | ||
| 515 | CONFIG_IEEE80211_CRYPT_CCMP=m | ||
| 516 | CONFIG_IEEE80211_CRYPT_TKIP=m | ||
| 517 | # CONFIG_IEEE80211_SOFTMAC is not set | ||
| 518 | # CONFIG_RFKILL is not set | ||
| 519 | # CONFIG_NET_9P is not set | ||
| 520 | |||
| 521 | # | ||
| 522 | # Device Drivers | ||
| 523 | # | ||
| 524 | |||
| 525 | # | ||
| 526 | # Generic Driver Options | ||
| 527 | # | ||
| 528 | CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" | ||
| 529 | CONFIG_STANDALONE=y | ||
| 530 | CONFIG_PREVENT_FIRMWARE_BUILD=y | ||
| 531 | CONFIG_FW_LOADER=y | ||
| 532 | # CONFIG_DEBUG_DRIVER is not set | ||
| 533 | # CONFIG_DEBUG_DEVRES is not set | ||
| 534 | # CONFIG_SYS_HYPERVISOR is not set | ||
| 535 | # CONFIG_CONNECTOR is not set | ||
| 536 | CONFIG_MTD=y | ||
| 537 | # CONFIG_MTD_DEBUG is not set | ||
| 538 | # CONFIG_MTD_CONCAT is not set | ||
| 539 | CONFIG_MTD_PARTITIONS=y | ||
| 540 | # CONFIG_MTD_REDBOOT_PARTS is not set | ||
| 541 | # CONFIG_MTD_CMDLINE_PARTS is not set | ||
| 542 | # CONFIG_MTD_AFS_PARTS is not set | ||
| 543 | |||
| 544 | # | ||
| 545 | # User Modules And Translation Layers | ||
| 546 | # | ||
| 547 | CONFIG_MTD_CHAR=m | ||
| 548 | CONFIG_MTD_BLKDEVS=y | ||
| 549 | CONFIG_MTD_BLOCK=y | ||
| 550 | # CONFIG_FTL is not set | ||
| 551 | # CONFIG_NFTL is not set | ||
| 552 | # CONFIG_INFTL is not set | ||
| 553 | # CONFIG_RFD_FTL is not set | ||
| 554 | # CONFIG_SSFDC is not set | ||
| 555 | # CONFIG_MTD_OOPS is not set | ||
| 556 | |||
| 557 | # | ||
| 558 | # RAM/ROM/Flash chip drivers | ||
| 559 | # | ||
| 560 | # CONFIG_MTD_CFI is not set | ||
| 561 | # CONFIG_MTD_JEDECPROBE is not set | ||
| 562 | CONFIG_MTD_MAP_BANK_WIDTH_1=y | ||
| 563 | CONFIG_MTD_MAP_BANK_WIDTH_2=y | ||
| 564 | CONFIG_MTD_MAP_BANK_WIDTH_4=y | ||
| 565 | # CONFIG_MTD_MAP_BANK_WIDTH_8 is not set | ||
| 566 | # CONFIG_MTD_MAP_BANK_WIDTH_16 is not set | ||
| 567 | # CONFIG_MTD_MAP_BANK_WIDTH_32 is not set | ||
| 568 | CONFIG_MTD_CFI_I1=y | ||
| 569 | CONFIG_MTD_CFI_I2=y | ||
| 570 | # CONFIG_MTD_CFI_I4 is not set | ||
| 571 | # CONFIG_MTD_CFI_I8 is not set | ||
| 572 | # CONFIG_MTD_RAM is not set | ||
| 573 | # CONFIG_MTD_ROM is not set | ||
| 574 | # CONFIG_MTD_ABSENT is not set | ||
| 575 | CONFIG_MTD_SHARP=y | ||
| 576 | |||
| 577 | # | ||
| 578 | # Mapping drivers for chip access | ||
| 579 | # | ||
| 580 | # CONFIG_MTD_COMPLEX_MAPPINGS is not set | ||
| 581 | CONFIG_MTD_SA1100=y | ||
| 582 | # CONFIG_MTD_PLATRAM is not set | ||
| 583 | |||
| 584 | # | ||
| 585 | # Self-contained MTD device drivers | ||
| 586 | # | ||
| 587 | # CONFIG_MTD_DATAFLASH is not set | ||
| 588 | # CONFIG_MTD_M25P80 is not set | ||
| 589 | # CONFIG_MTD_SLRAM is not set | ||
| 590 | # CONFIG_MTD_PHRAM is not set | ||
| 591 | # CONFIG_MTD_MTDRAM is not set | ||
| 592 | # CONFIG_MTD_BLOCK2MTD is not set | ||
| 593 | |||
| 594 | # | ||
| 595 | # Disk-On-Chip Device Drivers | ||
| 596 | # | ||
| 597 | # CONFIG_MTD_DOC2000 is not set | ||
| 598 | # CONFIG_MTD_DOC2001 is not set | ||
| 599 | # CONFIG_MTD_DOC2001PLUS is not set | ||
| 600 | # CONFIG_MTD_NAND is not set | ||
| 601 | # CONFIG_MTD_ONENAND is not set | ||
| 602 | |||
| 603 | # | ||
| 604 | # UBI - Unsorted block images | ||
| 605 | # | ||
| 606 | # CONFIG_MTD_UBI is not set | ||
| 607 | # CONFIG_PARPORT is not set | ||
| 608 | # CONFIG_PNP is not set | ||
| 609 | CONFIG_BLK_DEV=y | ||
| 610 | # CONFIG_BLK_DEV_COW_COMMON is not set | ||
| 611 | CONFIG_BLK_DEV_LOOP=m | ||
| 612 | # CONFIG_BLK_DEV_CRYPTOLOOP is not set | ||
| 613 | # CONFIG_BLK_DEV_NBD is not set | ||
| 614 | # CONFIG_BLK_DEV_RAM is not set | ||
| 615 | # CONFIG_CDROM_PKTCDVD is not set | ||
| 616 | # CONFIG_ATA_OVER_ETH is not set | ||
| 617 | # CONFIG_MISC_DEVICES is not set | ||
| 618 | CONFIG_IDE=m | ||
| 619 | CONFIG_IDE_MAX_HWIFS=4 | ||
| 620 | CONFIG_BLK_DEV_IDE=m | ||
| 621 | |||
| 622 | # | ||
| 623 | # Please see Documentation/ide.txt for help/info on IDE drives | ||
| 624 | # | ||
| 625 | # CONFIG_BLK_DEV_IDE_SATA is not set | ||
| 626 | CONFIG_BLK_DEV_IDEDISK=m | ||
| 627 | # CONFIG_IDEDISK_MULTI_MODE is not set | ||
| 628 | CONFIG_BLK_DEV_IDECS=m | ||
| 629 | # CONFIG_BLK_DEV_IDECD is not set | ||
| 630 | # CONFIG_BLK_DEV_IDETAPE is not set | ||
| 631 | # CONFIG_BLK_DEV_IDEFLOPPY is not set | ||
| 632 | # CONFIG_BLK_DEV_IDESCSI is not set | ||
| 633 | # CONFIG_IDE_TASK_IOCTL is not set | ||
| 634 | CONFIG_IDE_PROC_FS=y | ||
| 635 | |||
| 636 | # | ||
| 637 | # IDE chipset support/bugfixes | ||
| 638 | # | ||
| 639 | # CONFIG_IDE_GENERIC is not set | ||
| 640 | # CONFIG_BLK_DEV_PLATFORM is not set | ||
| 641 | # CONFIG_IDE_ARM is not set | ||
| 642 | |||
| 643 | # | ||
| 644 | # Other IDE chipsets support | ||
| 645 | # | ||
| 646 | |||
| 647 | # | ||
| 648 | # Note: most of these also require special kernel boot parameters | ||
| 649 | # | ||
| 650 | # CONFIG_BLK_DEV_4DRIVES is not set | ||
| 651 | # CONFIG_BLK_DEV_ALI14XX is not set | ||
| 652 | # CONFIG_BLK_DEV_DTC2278 is not set | ||
| 653 | # CONFIG_BLK_DEV_HT6560B is not set | ||
| 654 | # CONFIG_BLK_DEV_QD65XX is not set | ||
| 655 | # CONFIG_BLK_DEV_UMC8672 is not set | ||
| 656 | # CONFIG_BLK_DEV_IDEDMA is not set | ||
| 657 | CONFIG_IDE_ARCH_OBSOLETE_INIT=y | ||
| 658 | # CONFIG_BLK_DEV_HD is not set | ||
| 659 | |||
| 660 | # | ||
| 661 | # SCSI device support | ||
| 662 | # | ||
| 663 | # CONFIG_RAID_ATTRS is not set | ||
| 664 | CONFIG_SCSI=m | ||
| 665 | CONFIG_SCSI_DMA=y | ||
| 666 | # CONFIG_SCSI_TGT is not set | ||
| 667 | # CONFIG_SCSI_NETLINK is not set | ||
| 668 | CONFIG_SCSI_PROC_FS=y | ||
| 669 | |||
| 670 | # | ||
| 671 | # SCSI support type (disk, tape, CD-ROM) | ||
| 672 | # | ||
| 673 | CONFIG_BLK_DEV_SD=m | ||
| 674 | CONFIG_CHR_DEV_ST=m | ||
| 675 | CONFIG_CHR_DEV_OSST=m | ||
| 676 | CONFIG_BLK_DEV_SR=m | ||
| 677 | # CONFIG_BLK_DEV_SR_VENDOR is not set | ||
| 678 | CONFIG_CHR_DEV_SG=m | ||
| 679 | # CONFIG_CHR_DEV_SCH is not set | ||
| 680 | |||
| 681 | # | ||
| 682 | # Some SCSI devices (e.g. CD jukebox) support multiple LUNs | ||
| 683 | # | ||
| 684 | CONFIG_SCSI_MULTI_LUN=y | ||
| 685 | # CONFIG_SCSI_CONSTANTS is not set | ||
| 686 | # CONFIG_SCSI_LOGGING is not set | ||
| 687 | # CONFIG_SCSI_SCAN_ASYNC is not set | ||
| 688 | CONFIG_SCSI_WAIT_SCAN=m | ||
| 689 | |||
| 690 | # | ||
| 691 | # SCSI Transports | ||
| 692 | # | ||
| 693 | # CONFIG_SCSI_SPI_ATTRS is not set | ||
| 694 | # CONFIG_SCSI_FC_ATTRS is not set | ||
| 695 | # CONFIG_SCSI_ISCSI_ATTRS is not set | ||
| 696 | # CONFIG_SCSI_SAS_LIBSAS is not set | ||
| 697 | # CONFIG_SCSI_SRP_ATTRS is not set | ||
| 698 | CONFIG_SCSI_LOWLEVEL=y | ||
| 699 | # CONFIG_ISCSI_TCP is not set | ||
| 700 | # CONFIG_SCSI_AHA152X is not set | ||
| 701 | # CONFIG_SCSI_AIC7XXX_OLD is not set | ||
| 702 | # CONFIG_SCSI_ADVANSYS is not set | ||
| 703 | # CONFIG_SCSI_IN2000 is not set | ||
| 704 | # CONFIG_SCSI_DTC3280 is not set | ||
| 705 | # CONFIG_SCSI_FUTURE_DOMAIN is not set | ||
| 706 | # CONFIG_SCSI_GENERIC_NCR5380 is not set | ||
| 707 | # CONFIG_SCSI_GENERIC_NCR5380_MMIO is not set | ||
| 708 | # CONFIG_SCSI_NCR53C406A is not set | ||
| 709 | # CONFIG_SCSI_PAS16 is not set | ||
| 710 | # CONFIG_SCSI_PSI240I is not set | ||
| 711 | # CONFIG_SCSI_QLOGIC_FAS is not set | ||
| 712 | # CONFIG_SCSI_SYM53C416 is not set | ||
| 713 | # CONFIG_SCSI_T128 is not set | ||
| 714 | # CONFIG_SCSI_DEBUG is not set | ||
| 715 | # CONFIG_SCSI_LOWLEVEL_PCMCIA is not set | ||
| 716 | # CONFIG_ATA is not set | ||
| 717 | # CONFIG_MD is not set | ||
| 718 | CONFIG_NETDEVICES=y | ||
| 719 | # CONFIG_NETDEVICES_MULTIQUEUE is not set | ||
| 720 | # CONFIG_DUMMY is not set | ||
| 721 | # CONFIG_BONDING is not set | ||
| 722 | # CONFIG_MACVLAN is not set | ||
| 723 | # CONFIG_EQUALIZER is not set | ||
| 724 | CONFIG_TUN=m | ||
| 725 | # CONFIG_VETH is not set | ||
| 726 | # CONFIG_ARCNET is not set | ||
| 727 | # CONFIG_PHYLIB is not set | ||
| 728 | CONFIG_NET_ETHERNET=y | ||
| 729 | CONFIG_MII=m | ||
| 730 | # CONFIG_AX88796 is not set | ||
| 731 | # CONFIG_NET_VENDOR_3COM is not set | ||
| 732 | # CONFIG_NET_VENDOR_SMC is not set | ||
| 733 | # CONFIG_SMC91X is not set | ||
| 734 | # CONFIG_DM9000 is not set | ||
| 735 | # CONFIG_NET_VENDOR_RACAL is not set | ||
| 736 | # CONFIG_AT1700 is not set | ||
| 737 | # CONFIG_DEPCA is not set | ||
| 738 | # CONFIG_HP100 is not set | ||
| 739 | # CONFIG_NET_ISA is not set | ||
| 740 | # CONFIG_IBM_NEW_EMAC_ZMII is not set | ||
| 741 | # CONFIG_IBM_NEW_EMAC_RGMII is not set | ||
| 742 | # CONFIG_IBM_NEW_EMAC_TAH is not set | ||
| 743 | # CONFIG_IBM_NEW_EMAC_EMAC4 is not set | ||
| 744 | # CONFIG_NET_PCI is not set | ||
| 745 | # CONFIG_B44 is not set | ||
| 746 | CONFIG_NETDEV_1000=y | ||
| 747 | CONFIG_NETDEV_10000=y | ||
| 748 | # CONFIG_TR is not set | ||
| 749 | |||
| 750 | # | ||
| 751 | # Wireless LAN | ||
| 752 | # | ||
| 753 | # CONFIG_WLAN_PRE80211 is not set | ||
| 754 | CONFIG_WLAN_80211=y | ||
| 755 | CONFIG_PCMCIA_RAYCS=m | ||
| 756 | CONFIG_LIBERTAS=m | ||
| 757 | CONFIG_LIBERTAS_CS=m | ||
| 758 | CONFIG_LIBERTAS_SDIO=m | ||
| 759 | # CONFIG_LIBERTAS_DEBUG is not set | ||
| 760 | CONFIG_HERMES=m | ||
| 761 | CONFIG_PCMCIA_HERMES=m | ||
| 762 | CONFIG_PCMCIA_SPECTRUM=m | ||
| 763 | CONFIG_ATMEL=m | ||
| 764 | CONFIG_PCMCIA_ATMEL=m | ||
| 765 | CONFIG_AIRO_CS=m | ||
| 766 | CONFIG_PCMCIA_WL3501=m | ||
| 767 | CONFIG_HOSTAP=m | ||
| 768 | CONFIG_HOSTAP_FIRMWARE=y | ||
| 769 | # CONFIG_HOSTAP_FIRMWARE_NVRAM is not set | ||
| 770 | CONFIG_HOSTAP_CS=m | ||
| 771 | CONFIG_NET_PCMCIA=y | ||
| 772 | # CONFIG_PCMCIA_3C589 is not set | ||
| 773 | # CONFIG_PCMCIA_3C574 is not set | ||
| 774 | # CONFIG_PCMCIA_FMVJ18X is not set | ||
| 775 | CONFIG_PCMCIA_PCNET=m | ||
| 776 | # CONFIG_PCMCIA_NMCLAN is not set | ||
| 777 | # CONFIG_PCMCIA_SMC91C92 is not set | ||
| 778 | # CONFIG_PCMCIA_XIRC2PS is not set | ||
| 779 | # CONFIG_PCMCIA_AXNET is not set | ||
| 780 | # CONFIG_WAN is not set | ||
| 781 | CONFIG_PPP=m | ||
| 782 | # CONFIG_PPP_MULTILINK is not set | ||
| 783 | # CONFIG_PPP_FILTER is not set | ||
| 784 | CONFIG_PPP_ASYNC=m | ||
| 785 | # CONFIG_PPP_SYNC_TTY is not set | ||
| 786 | CONFIG_PPP_DEFLATE=m | ||
| 787 | CONFIG_PPP_BSDCOMP=m | ||
| 788 | # CONFIG_PPP_MPPE is not set | ||
| 789 | # CONFIG_PPPOE is not set | ||
| 790 | # CONFIG_PPPOL2TP is not set | ||
| 791 | # CONFIG_SLIP is not set | ||
| 792 | CONFIG_SLHC=m | ||
| 793 | # CONFIG_SHAPER is not set | ||
| 794 | # CONFIG_NETCONSOLE is not set | ||
| 795 | # CONFIG_NETPOLL is not set | ||
| 796 | # CONFIG_NET_POLL_CONTROLLER is not set | ||
| 797 | # CONFIG_ISDN is not set | ||
| 798 | |||
| 799 | # | ||
| 800 | # Input device support | ||
| 801 | # | ||
| 802 | CONFIG_INPUT=y | ||
| 803 | # CONFIG_INPUT_FF_MEMLESS is not set | ||
| 804 | # CONFIG_INPUT_POLLDEV is not set | ||
| 805 | |||
| 806 | # | ||
| 807 | # Userland interfaces | ||
| 808 | # | ||
| 809 | CONFIG_INPUT_MOUSEDEV=m | ||
| 810 | # CONFIG_INPUT_MOUSEDEV_PSAUX is not set | ||
| 811 | CONFIG_INPUT_MOUSEDEV_SCREEN_X=480 | ||
| 812 | CONFIG_INPUT_MOUSEDEV_SCREEN_Y=640 | ||
| 813 | # CONFIG_INPUT_JOYDEV is not set | ||
| 814 | CONFIG_INPUT_EVDEV=m | ||
| 815 | # CONFIG_INPUT_EVBUG is not set | ||
| 816 | CONFIG_INPUT_POWER=m | ||
| 817 | |||
| 818 | # | ||
| 819 | # Input Device Drivers | ||
| 820 | # | ||
| 821 | CONFIG_INPUT_KEYBOARD=y | ||
| 822 | # CONFIG_KEYBOARD_ATKBD is not set | ||
| 823 | # CONFIG_KEYBOARD_SUNKBD is not set | ||
| 824 | # CONFIG_KEYBOARD_LKKBD is not set | ||
| 825 | CONFIG_KEYBOARD_LOCOMO=m | ||
| 826 | # CONFIG_KEYBOARD_XTKBD is not set | ||
| 827 | # CONFIG_KEYBOARD_NEWTON is not set | ||
| 828 | # CONFIG_KEYBOARD_STOWAWAY is not set | ||
| 829 | # CONFIG_KEYBOARD_GPIO is not set | ||
| 830 | # CONFIG_INPUT_MOUSE is not set | ||
| 831 | # CONFIG_INPUT_JOYSTICK is not set | ||
| 832 | # CONFIG_INPUT_TABLET is not set | ||
| 833 | # CONFIG_INPUT_TOUCHSCREEN is not set | ||
| 834 | # CONFIG_INPUT_MISC is not set | ||
| 835 | |||
| 836 | # | ||
| 837 | # Hardware I/O ports | ||
| 838 | # | ||
| 839 | # CONFIG_SERIO is not set | ||
| 840 | # CONFIG_GAMEPORT is not set | ||
| 841 | |||
| 842 | # | ||
| 843 | # Character devices | ||
| 844 | # | ||
| 845 | CONFIG_VT=y | ||
| 846 | CONFIG_VT_CONSOLE=y | ||
| 847 | CONFIG_HW_CONSOLE=y | ||
| 848 | # CONFIG_VT_HW_CONSOLE_BINDING is not set | ||
| 849 | # CONFIG_SERIAL_NONSTANDARD is not set | ||
| 850 | |||
| 851 | # | ||
| 852 | # Serial drivers | ||
| 853 | # | ||
| 854 | CONFIG_SERIAL_8250=m | ||
| 855 | CONFIG_SERIAL_8250_CS=m | ||
| 856 | CONFIG_SERIAL_8250_NR_UARTS=4 | ||
| 857 | CONFIG_SERIAL_8250_RUNTIME_UARTS=4 | ||
| 858 | # CONFIG_SERIAL_8250_EXTENDED is not set | ||
| 859 | |||
| 860 | # | ||
| 861 | # Non-8250 serial port support | ||
| 862 | # | ||
| 863 | CONFIG_SERIAL_SA1100=y | ||
| 864 | CONFIG_SERIAL_SA1100_CONSOLE=y | ||
| 865 | CONFIG_SERIAL_CORE=y | ||
| 866 | CONFIG_SERIAL_CORE_CONSOLE=y | ||
| 867 | CONFIG_UNIX98_PTYS=y | ||
| 868 | # CONFIG_LEGACY_PTYS is not set | ||
| 869 | # CONFIG_IPMI_HANDLER is not set | ||
| 870 | CONFIG_HW_RANDOM=m | ||
| 871 | # CONFIG_NVRAM is not set | ||
| 872 | # CONFIG_DTLK is not set | ||
| 873 | # CONFIG_R3964 is not set | ||
| 874 | |||
| 875 | # | ||
| 876 | # PCMCIA character devices | ||
| 877 | # | ||
| 878 | # CONFIG_SYNCLINK_CS is not set | ||
| 879 | # CONFIG_CARDMAN_4000 is not set | ||
| 880 | # CONFIG_CARDMAN_4040 is not set | ||
| 881 | # CONFIG_RAW_DRIVER is not set | ||
| 882 | # CONFIG_TCG_TPM is not set | ||
| 883 | CONFIG_DEVPORT=y | ||
| 884 | # CONFIG_I2C is not set | ||
| 885 | |||
| 886 | # | ||
| 887 | # SPI support | ||
| 888 | # | ||
| 889 | CONFIG_SPI=y | ||
| 890 | # CONFIG_SPI_DEBUG is not set | ||
| 891 | CONFIG_SPI_MASTER=y | ||
| 892 | |||
| 893 | # | ||
| 894 | # SPI Master Controller Drivers | ||
| 895 | # | ||
| 896 | # CONFIG_SPI_BITBANG is not set | ||
| 897 | |||
| 898 | # | ||
| 899 | # SPI Protocol Masters | ||
| 900 | # | ||
| 901 | # CONFIG_SPI_AT25 is not set | ||
| 902 | # CONFIG_SPI_SPIDEV is not set | ||
| 903 | # CONFIG_SPI_TLE62X0 is not set | ||
| 904 | # CONFIG_W1 is not set | ||
| 905 | # CONFIG_POWER_SUPPLY is not set | ||
| 906 | # CONFIG_HWMON is not set | ||
| 907 | # CONFIG_WATCHDOG is not set | ||
| 908 | |||
| 909 | # | ||
| 910 | # Sonics Silicon Backplane | ||
| 911 | # | ||
| 912 | CONFIG_SSB_POSSIBLE=y | ||
| 913 | # CONFIG_SSB is not set | ||
| 914 | |||
| 915 | # | ||
| 916 | # Multifunction device drivers | ||
| 917 | # | ||
| 918 | # CONFIG_MFD_SM501 is not set | ||
| 919 | |||
| 920 | # | ||
| 921 | # Multimedia Capabilities Port drivers | ||
| 922 | # | ||
| 923 | CONFIG_MCP=y | ||
| 924 | CONFIG_MCP_SA11X0=y | ||
| 925 | CONFIG_MCP_UCB1200=y | ||
| 926 | CONFIG_MCP_UCB1200_TS=m | ||
| 927 | # CONFIG_MCP_COLLIE_TS is not set | ||
| 928 | |||
| 929 | # | ||
| 930 | # Multimedia devices | ||
| 931 | # | ||
| 932 | CONFIG_VIDEO_DEV=m | ||
| 933 | CONFIG_VIDEO_V4L1=y | ||
| 934 | CONFIG_VIDEO_V4L1_COMPAT=y | ||
| 935 | CONFIG_VIDEO_V4L2=y | ||
| 936 | CONFIG_VIDEO_CAPTURE_DRIVERS=y | ||
| 937 | # CONFIG_VIDEO_ADV_DEBUG is not set | ||
| 938 | CONFIG_VIDEO_HELPER_CHIPS_AUTO=y | ||
| 939 | # CONFIG_VIDEO_VIVI is not set | ||
| 940 | # CONFIG_VIDEO_PMS is not set | ||
| 941 | # CONFIG_VIDEO_CPIA is not set | ||
| 942 | CONFIG_RADIO_ADAPTERS=y | ||
| 943 | # CONFIG_RADIO_CADET is not set | ||
| 944 | # CONFIG_RADIO_RTRACK is not set | ||
| 945 | # CONFIG_RADIO_RTRACK2 is not set | ||
| 946 | # CONFIG_RADIO_AZTECH is not set | ||
| 947 | # CONFIG_RADIO_GEMTEK is not set | ||
| 948 | # CONFIG_RADIO_SF16FMI is not set | ||
| 949 | # CONFIG_RADIO_SF16FMR2 is not set | ||
| 950 | # CONFIG_RADIO_TERRATEC is not set | ||
| 951 | # CONFIG_RADIO_TRUST is not set | ||
| 952 | # CONFIG_RADIO_TYPHOON is not set | ||
| 953 | # CONFIG_RADIO_ZOLTRIX is not set | ||
| 954 | # CONFIG_DVB_CORE is not set | ||
| 955 | CONFIG_DAB=y | ||
| 956 | |||
| 957 | # | ||
| 958 | # Graphics support | ||
| 959 | # | ||
| 960 | # CONFIG_VGASTATE is not set | ||
| 961 | # CONFIG_VIDEO_OUTPUT_CONTROL is not set | ||
| 962 | CONFIG_FB=y | ||
| 963 | # CONFIG_FIRMWARE_EDID is not set | ||
| 964 | # CONFIG_FB_DDC is not set | ||
| 965 | CONFIG_FB_CFB_FILLRECT=y | ||
| 966 | CONFIG_FB_CFB_COPYAREA=y | ||
| 967 | CONFIG_FB_CFB_IMAGEBLIT=y | ||
| 968 | # CONFIG_FB_CFB_REV_PIXELS_IN_BYTE is not set | ||
| 969 | # CONFIG_FB_SYS_FILLRECT is not set | ||
| 970 | # CONFIG_FB_SYS_COPYAREA is not set | ||
| 971 | # CONFIG_FB_SYS_IMAGEBLIT is not set | ||
| 972 | # CONFIG_FB_SYS_FOPS is not set | ||
| 973 | # CONFIG_FB_DEFERRED_IO is not set | ||
| 974 | # CONFIG_FB_SVGALIB is not set | ||
| 975 | # CONFIG_FB_MACMODES is not set | ||
| 976 | # CONFIG_FB_BACKLIGHT is not set | ||
| 977 | # CONFIG_FB_MODE_HELPERS is not set | ||
| 978 | # CONFIG_FB_TILEBLITTING is not set | ||
| 979 | |||
| 980 | # | ||
| 981 | # Frame buffer hardware drivers | ||
| 982 | # | ||
| 983 | CONFIG_FB_SA1100=y | ||
| 984 | # CONFIG_FB_S1D13XXX is not set | ||
| 985 | # CONFIG_FB_VIRTUAL is not set | ||
| 986 | CONFIG_BACKLIGHT_LCD_SUPPORT=y | ||
| 987 | CONFIG_LCD_CLASS_DEVICE=m | ||
| 988 | # CONFIG_LCD_LTV350QV is not set | ||
| 989 | CONFIG_BACKLIGHT_CLASS_DEVICE=y | ||
| 990 | # CONFIG_BACKLIGHT_CORGI is not set | ||
| 991 | CONFIG_BACKLIGHT_LOCOMO=y | ||
| 992 | |||
| 993 | # | ||
| 994 | # Display device support | ||
| 995 | # | ||
| 996 | # CONFIG_DISPLAY_SUPPORT is not set | ||
| 997 | |||
| 998 | # | ||
| 999 | # Console display driver support | ||
| 1000 | # | ||
| 1001 | # CONFIG_VGA_CONSOLE is not set | ||
| 1002 | # CONFIG_MDA_CONSOLE is not set | ||
| 1003 | CONFIG_DUMMY_CONSOLE=y | ||
| 1004 | CONFIG_FRAMEBUFFER_CONSOLE=y | ||
| 1005 | # CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY is not set | ||
| 1006 | CONFIG_FRAMEBUFFER_CONSOLE_ROTATION=y | ||
| 1007 | CONFIG_FONTS=y | ||
| 1008 | CONFIG_FONT_8x8=y | ||
| 1009 | # CONFIG_FONT_8x16 is not set | ||
| 1010 | # CONFIG_FONT_6x11 is not set | ||
| 1011 | # CONFIG_FONT_7x14 is not set | ||
| 1012 | # CONFIG_FONT_PEARL_8x8 is not set | ||
| 1013 | # CONFIG_FONT_ACORN_8x8 is not set | ||
| 1014 | # CONFIG_FONT_MINI_4x6 is not set | ||
| 1015 | # CONFIG_FONT_SUN8x16 is not set | ||
| 1016 | # CONFIG_FONT_SUN12x22 is not set | ||
| 1017 | # CONFIG_FONT_10x18 is not set | ||
| 1018 | # CONFIG_LOGO is not set | ||
| 1019 | |||
| 1020 | # | ||
| 1021 | # Sound | ||
| 1022 | # | ||
| 1023 | CONFIG_SOUND=m | ||
| 1024 | |||
| 1025 | # | ||
| 1026 | # Advanced Linux Sound Architecture | ||
| 1027 | # | ||
| 1028 | CONFIG_SND=m | ||
| 1029 | CONFIG_SND_TIMER=m | ||
| 1030 | CONFIG_SND_PCM=m | ||
| 1031 | # CONFIG_SND_SEQUENCER is not set | ||
| 1032 | CONFIG_SND_OSSEMUL=y | ||
| 1033 | CONFIG_SND_MIXER_OSS=m | ||
| 1034 | CONFIG_SND_PCM_OSS=m | ||
| 1035 | CONFIG_SND_PCM_OSS_PLUGINS=y | ||
| 1036 | # CONFIG_SND_DYNAMIC_MINORS is not set | ||
| 1037 | CONFIG_SND_SUPPORT_OLD_API=y | ||
| 1038 | CONFIG_SND_VERBOSE_PROCFS=y | ||
| 1039 | # CONFIG_SND_VERBOSE_PRINTK is not set | ||
| 1040 | # CONFIG_SND_DEBUG is not set | ||
| 1041 | |||
| 1042 | # | ||
| 1043 | # Generic devices | ||
| 1044 | # | ||
| 1045 | CONFIG_SND_DUMMY=m | ||
| 1046 | # CONFIG_SND_MTPAV is not set | ||
| 1047 | # CONFIG_SND_SERIAL_U16550 is not set | ||
| 1048 | # CONFIG_SND_MPU401 is not set | ||
| 1049 | |||
| 1050 | # | ||
| 1051 | # ALSA ARM devices | ||
| 1052 | # | ||
| 1053 | |||
| 1054 | # | ||
| 1055 | # SPI devices | ||
| 1056 | # | ||
| 1057 | |||
| 1058 | # | ||
| 1059 | # PCMCIA devices | ||
| 1060 | # | ||
| 1061 | # CONFIG_SND_VXPOCKET is not set | ||
| 1062 | # CONFIG_SND_PDAUDIOCF is not set | ||
| 1063 | |||
| 1064 | # | ||
| 1065 | # System on Chip audio support | ||
| 1066 | # | ||
| 1067 | # CONFIG_SND_SOC is not set | ||
| 1068 | |||
| 1069 | # | ||
| 1070 | # SoC Audio support for SuperH | ||
| 1071 | # | ||
| 1072 | |||
| 1073 | # | ||
| 1074 | # Open Sound System | ||
| 1075 | # | ||
| 1076 | # CONFIG_SOUND_PRIME is not set | ||
| 1077 | CONFIG_HID_SUPPORT=y | ||
| 1078 | CONFIG_HID=m | ||
| 1079 | # CONFIG_HID_DEBUG is not set | ||
| 1080 | # CONFIG_HIDRAW is not set | ||
| 1081 | # CONFIG_USB_SUPPORT is not set | ||
| 1082 | CONFIG_MMC=m | ||
| 1083 | CONFIG_MMC_DEBUG=y | ||
| 1084 | CONFIG_MMC_UNSAFE_RESUME=y | ||
| 1085 | |||
| 1086 | # | ||
| 1087 | # MMC/SD Card Drivers | ||
| 1088 | # | ||
| 1089 | CONFIG_MMC_BLOCK=m | ||
| 1090 | CONFIG_MMC_BLOCK_BOUNCE=y | ||
| 1091 | # CONFIG_SDIO_UART is not set | ||
| 1092 | |||
| 1093 | # | ||
| 1094 | # MMC/SD Host Controller Drivers | ||
| 1095 | # | ||
| 1096 | CONFIG_MMC_SPI=m | ||
| 1097 | CONFIG_NEW_LEDS=y | ||
| 1098 | CONFIG_LEDS_CLASS=m | ||
| 1099 | |||
| 1100 | # | ||
| 1101 | # LED drivers | ||
| 1102 | # | ||
| 1103 | CONFIG_LEDS_LOCOMO=m | ||
| 1104 | # CONFIG_LEDS_GPIO is not set | ||
| 1105 | |||
| 1106 | # | ||
| 1107 | # LED Triggers | ||
| 1108 | # | ||
| 1109 | CONFIG_LEDS_TRIGGERS=y | ||
| 1110 | CONFIG_LEDS_TRIGGER_TIMER=m | ||
| 1111 | # CONFIG_LEDS_TRIGGER_IDE_DISK is not set | ||
| 1112 | CONFIG_LEDS_TRIGGER_HEARTBEAT=m | ||
| 1113 | CONFIG_RTC_LIB=y | ||
| 1114 | CONFIG_RTC_CLASS=m | ||
| 1115 | |||
| 1116 | # | ||
| 1117 | # RTC interfaces | ||
| 1118 | # | ||
| 1119 | CONFIG_RTC_INTF_SYSFS=y | ||
| 1120 | CONFIG_RTC_INTF_PROC=y | ||
| 1121 | CONFIG_RTC_INTF_DEV=y | ||
| 1122 | # CONFIG_RTC_INTF_DEV_UIE_EMUL is not set | ||
| 1123 | # CONFIG_RTC_DRV_TEST is not set | ||
| 1124 | |||
| 1125 | # | ||
| 1126 | # SPI RTC drivers | ||
| 1127 | # | ||
| 1128 | # CONFIG_RTC_DRV_RS5C348 is not set | ||
| 1129 | # CONFIG_RTC_DRV_MAX6902 is not set | ||
| 1130 | |||
| 1131 | # | ||
| 1132 | # Platform RTC drivers | ||
| 1133 | # | ||
| 1134 | # CONFIG_RTC_DRV_CMOS is not set | ||
| 1135 | # CONFIG_RTC_DRV_DS1553 is not set | ||
| 1136 | # CONFIG_RTC_DRV_STK17TA8 is not set | ||
| 1137 | # CONFIG_RTC_DRV_DS1742 is not set | ||
| 1138 | # CONFIG_RTC_DRV_M48T86 is not set | ||
| 1139 | # CONFIG_RTC_DRV_M48T59 is not set | ||
| 1140 | # CONFIG_RTC_DRV_V3020 is not set | ||
| 1141 | |||
| 1142 | # | ||
| 1143 | # on-CPU RTC drivers | ||
| 1144 | # | ||
| 1145 | CONFIG_RTC_DRV_SA1100=m | ||
| 1146 | |||
| 1147 | # | ||
| 1148 | # File systems | ||
| 1149 | # | ||
| 1150 | CONFIG_EXT2_FS=m | ||
| 1151 | # CONFIG_EXT2_FS_XATTR is not set | ||
| 1152 | # CONFIG_EXT2_FS_XIP is not set | ||
| 1153 | CONFIG_EXT3_FS=m | ||
| 1154 | CONFIG_EXT3_FS_XATTR=y | ||
| 1155 | # CONFIG_EXT3_FS_POSIX_ACL is not set | ||
| 1156 | # CONFIG_EXT3_FS_SECURITY is not set | ||
| 1157 | # CONFIG_EXT4DEV_FS is not set | ||
| 1158 | CONFIG_JBD=m | ||
| 1159 | CONFIG_FS_MBCACHE=m | ||
| 1160 | # CONFIG_REISERFS_FS is not set | ||
| 1161 | # CONFIG_JFS_FS is not set | ||
| 1162 | # CONFIG_FS_POSIX_ACL is not set | ||
| 1163 | # CONFIG_XFS_FS is not set | ||
| 1164 | # CONFIG_GFS2_FS is not set | ||
| 1165 | # CONFIG_OCFS2_FS is not set | ||
| 1166 | # CONFIG_MINIX_FS is not set | ||
| 1167 | # CONFIG_ROMFS_FS is not set | ||
| 1168 | CONFIG_INOTIFY=y | ||
| 1169 | CONFIG_INOTIFY_USER=y | ||
| 1170 | # CONFIG_QUOTA is not set | ||
| 1171 | CONFIG_DNOTIFY=y | ||
| 1172 | # CONFIG_AUTOFS_FS is not set | ||
| 1173 | # CONFIG_AUTOFS4_FS is not set | ||
| 1174 | CONFIG_FUSE_FS=m | ||
| 1175 | |||
| 1176 | # | ||
| 1177 | # CD-ROM/DVD Filesystems | ||
| 1178 | # | ||
| 1179 | # CONFIG_ISO9660_FS is not set | ||
| 1180 | # CONFIG_UDF_FS is not set | ||
| 1181 | |||
| 1182 | # | ||
| 1183 | # DOS/FAT/NT Filesystems | ||
| 1184 | # | ||
| 1185 | CONFIG_FAT_FS=m | ||
| 1186 | CONFIG_MSDOS_FS=m | ||
| 1187 | CONFIG_VFAT_FS=m | ||
| 1188 | CONFIG_FAT_DEFAULT_CODEPAGE=437 | ||
| 1189 | CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" | ||
| 1190 | # CONFIG_NTFS_FS is not set | ||
| 1191 | |||
| 1192 | # | ||
| 1193 | # Pseudo filesystems | ||
| 1194 | # | ||
| 1195 | CONFIG_PROC_FS=y | ||
| 1196 | CONFIG_PROC_SYSCTL=y | ||
| 1197 | CONFIG_SYSFS=y | ||
| 1198 | CONFIG_TMPFS=y | ||
| 1199 | # CONFIG_TMPFS_POSIX_ACL is not set | ||
| 1200 | # CONFIG_HUGETLB_PAGE is not set | ||
| 1201 | # CONFIG_CONFIGFS_FS is not set | ||
| 1202 | |||
| 1203 | # | ||
| 1204 | # Miscellaneous filesystems | ||
| 1205 | # | ||
| 1206 | # CONFIG_ADFS_FS is not set | ||
| 1207 | # CONFIG_AFFS_FS is not set | ||
| 1208 | # CONFIG_HFS_FS is not set | ||
| 1209 | # CONFIG_HFSPLUS_FS is not set | ||
| 1210 | # CONFIG_BEFS_FS is not set | ||
| 1211 | # CONFIG_BFS_FS is not set | ||
| 1212 | # CONFIG_EFS_FS is not set | ||
| 1213 | CONFIG_JFFS2_FS=y | ||
| 1214 | CONFIG_JFFS2_FS_DEBUG=0 | ||
| 1215 | CONFIG_JFFS2_FS_WRITEBUFFER=y | ||
| 1216 | # CONFIG_JFFS2_FS_WBUF_VERIFY is not set | ||
| 1217 | # CONFIG_JFFS2_SUMMARY is not set | ||
| 1218 | # CONFIG_JFFS2_FS_XATTR is not set | ||
| 1219 | # CONFIG_JFFS2_SYSFS is not set | ||
| 1220 | # CONFIG_JFFS2_COMPRESSION_OPTIONS is not set | ||
| 1221 | CONFIG_JFFS2_ZLIB=y | ||
| 1222 | # CONFIG_JFFS2_LZO is not set | ||
| 1223 | CONFIG_JFFS2_RTIME=y | ||
| 1224 | # CONFIG_JFFS2_RUBIN is not set | ||
| 1225 | CONFIG_CRAMFS=m | ||
| 1226 | CONFIG_SQUASHFS=m | ||
| 1227 | # CONFIG_SQUASHFS_EMBEDDED is not set | ||
| 1228 | CONFIG_SQUASHFS_FRAGMENT_CACHE_SIZE=3 | ||
| 1229 | # CONFIG_VXFS_FS is not set | ||
| 1230 | # CONFIG_HPFS_FS is not set | ||
| 1231 | # CONFIG_QNX4FS_FS is not set | ||
| 1232 | # CONFIG_SYSV_FS is not set | ||
| 1233 | # CONFIG_UFS_FS is not set | ||
| 1234 | CONFIG_NETWORK_FILESYSTEMS=y | ||
| 1235 | CONFIG_NFS_FS=m | ||
| 1236 | CONFIG_NFS_V3=y | ||
| 1237 | # CONFIG_NFS_V3_ACL is not set | ||
| 1238 | CONFIG_NFS_V4=y | ||
| 1239 | # CONFIG_NFS_DIRECTIO is not set | ||
| 1240 | # CONFIG_NFSD is not set | ||
| 1241 | CONFIG_LOCKD=m | ||
| 1242 | CONFIG_LOCKD_V4=y | ||
| 1243 | CONFIG_NFS_COMMON=y | ||
| 1244 | CONFIG_SUNRPC=m | ||
| 1245 | CONFIG_SUNRPC_GSS=m | ||
| 1246 | # CONFIG_SUNRPC_BIND34 is not set | ||
| 1247 | CONFIG_RPCSEC_GSS_KRB5=m | ||
| 1248 | # CONFIG_RPCSEC_GSS_SPKM3 is not set | ||
| 1249 | CONFIG_SMB_FS=m | ||
| 1250 | CONFIG_SMB_NLS_DEFAULT=y | ||
| 1251 | CONFIG_SMB_NLS_REMOTE="cp437" | ||
| 1252 | CONFIG_CIFS=m | ||
| 1253 | # CONFIG_CIFS_STATS is not set | ||
| 1254 | # CONFIG_CIFS_WEAK_PW_HASH is not set | ||
| 1255 | # CONFIG_CIFS_XATTR is not set | ||
| 1256 | # CONFIG_CIFS_DEBUG2 is not set | ||
| 1257 | # CONFIG_CIFS_EXPERIMENTAL is not set | ||
| 1258 | # CONFIG_NCP_FS is not set | ||
| 1259 | # CONFIG_CODA_FS is not set | ||
| 1260 | # CONFIG_AFS_FS is not set | ||
| 1261 | |||
| 1262 | # | ||
| 1263 | # Partition Types | ||
| 1264 | # | ||
| 1265 | CONFIG_PARTITION_ADVANCED=y | ||
| 1266 | # CONFIG_ACORN_PARTITION is not set | ||
| 1267 | # CONFIG_OSF_PARTITION is not set | ||
| 1268 | # CONFIG_AMIGA_PARTITION is not set | ||
| 1269 | # CONFIG_ATARI_PARTITION is not set | ||
| 1270 | # CONFIG_MAC_PARTITION is not set | ||
| 1271 | CONFIG_MSDOS_PARTITION=y | ||
| 1272 | # CONFIG_BSD_DISKLABEL is not set | ||
| 1273 | # CONFIG_MINIX_SUBPARTITION is not set | ||
| 1274 | # CONFIG_SOLARIS_X86_PARTITION is not set | ||
| 1275 | # CONFIG_UNIXWARE_DISKLABEL is not set | ||
| 1276 | # CONFIG_LDM_PARTITION is not set | ||
| 1277 | # CONFIG_SGI_PARTITION is not set | ||
| 1278 | # CONFIG_ULTRIX_PARTITION is not set | ||
| 1279 | # CONFIG_SUN_PARTITION is not set | ||
| 1280 | # CONFIG_KARMA_PARTITION is not set | ||
| 1281 | # CONFIG_EFI_PARTITION is not set | ||
| 1282 | # CONFIG_SYSV68_PARTITION is not set | ||
| 1283 | CONFIG_NLS=m | ||
| 1284 | CONFIG_NLS_DEFAULT="cp437" | ||
| 1285 | CONFIG_NLS_CODEPAGE_437=m | ||
| 1286 | CONFIG_NLS_CODEPAGE_737=m | ||
| 1287 | CONFIG_NLS_CODEPAGE_775=m | ||
| 1288 | CONFIG_NLS_CODEPAGE_850=m | ||
| 1289 | CONFIG_NLS_CODEPAGE_852=m | ||
| 1290 | CONFIG_NLS_CODEPAGE_855=m | ||
| 1291 | CONFIG_NLS_CODEPAGE_857=m | ||
| 1292 | CONFIG_NLS_CODEPAGE_860=m | ||
| 1293 | CONFIG_NLS_CODEPAGE_861=m | ||
| 1294 | CONFIG_NLS_CODEPAGE_862=m | ||
| 1295 | CONFIG_NLS_CODEPAGE_863=m | ||
| 1296 | CONFIG_NLS_CODEPAGE_864=m | ||
| 1297 | CONFIG_NLS_CODEPAGE_865=m | ||
| 1298 | CONFIG_NLS_CODEPAGE_866=m | ||
| 1299 | CONFIG_NLS_CODEPAGE_869=m | ||
| 1300 | CONFIG_NLS_CODEPAGE_936=m | ||
| 1301 | CONFIG_NLS_CODEPAGE_950=m | ||
| 1302 | CONFIG_NLS_CODEPAGE_932=m | ||
| 1303 | CONFIG_NLS_CODEPAGE_949=m | ||
| 1304 | CONFIG_NLS_CODEPAGE_874=m | ||
| 1305 | CONFIG_NLS_ISO8859_8=m | ||
| 1306 | CONFIG_NLS_CODEPAGE_1250=m | ||
| 1307 | CONFIG_NLS_CODEPAGE_1251=m | ||
| 1308 | CONFIG_NLS_ASCII=m | ||
| 1309 | CONFIG_NLS_ISO8859_1=m | ||
| 1310 | CONFIG_NLS_ISO8859_2=m | ||
| 1311 | CONFIG_NLS_ISO8859_3=m | ||
| 1312 | CONFIG_NLS_ISO8859_4=m | ||
| 1313 | CONFIG_NLS_ISO8859_5=m | ||
| 1314 | CONFIG_NLS_ISO8859_6=m | ||
| 1315 | CONFIG_NLS_ISO8859_7=m | ||
| 1316 | CONFIG_NLS_ISO8859_9=m | ||
| 1317 | CONFIG_NLS_ISO8859_13=m | ||
| 1318 | CONFIG_NLS_ISO8859_14=m | ||
| 1319 | CONFIG_NLS_ISO8859_15=m | ||
| 1320 | CONFIG_NLS_KOI8_R=m | ||
| 1321 | CONFIG_NLS_KOI8_U=m | ||
| 1322 | CONFIG_NLS_UTF8=m | ||
| 1323 | # CONFIG_DLM is not set | ||
| 1324 | CONFIG_INSTRUMENTATION=y | ||
| 1325 | # CONFIG_PROFILING is not set | ||
| 1326 | # CONFIG_MARKERS is not set | ||
| 1327 | |||
| 1328 | # | ||
| 1329 | # Kernel hacking | ||
| 1330 | # | ||
| 1331 | # CONFIG_PRINTK_TIME is not set | ||
| 1332 | CONFIG_ENABLE_WARN_DEPRECATED=y | ||
| 1333 | CONFIG_ENABLE_MUST_CHECK=y | ||
| 1334 | CONFIG_MAGIC_SYSRQ=y | ||
| 1335 | # CONFIG_UNUSED_SYMBOLS is not set | ||
| 1336 | # CONFIG_DEBUG_FS is not set | ||
| 1337 | # CONFIG_HEADERS_CHECK is not set | ||
| 1338 | CONFIG_DEBUG_KERNEL=y | ||
| 1339 | # CONFIG_DEBUG_SHIRQ is not set | ||
| 1340 | CONFIG_DETECT_SOFTLOCKUP=y | ||
| 1341 | CONFIG_SCHED_DEBUG=y | ||
| 1342 | # CONFIG_SCHEDSTATS is not set | ||
| 1343 | # CONFIG_TIMER_STATS is not set | ||
| 1344 | # CONFIG_DEBUG_SLAB is not set | ||
| 1345 | # CONFIG_DEBUG_PREEMPT is not set | ||
| 1346 | # CONFIG_DEBUG_RT_MUTEXES is not set | ||
| 1347 | # CONFIG_RT_MUTEX_TESTER is not set | ||
| 1348 | # CONFIG_DEBUG_SPINLOCK is not set | ||
| 1349 | # CONFIG_DEBUG_MUTEXES is not set | ||
| 1350 | # CONFIG_DEBUG_LOCK_ALLOC is not set | ||
| 1351 | # CONFIG_PROVE_LOCKING is not set | ||
| 1352 | # CONFIG_LOCK_STAT is not set | ||
| 1353 | # CONFIG_DEBUG_SPINLOCK_SLEEP is not set | ||
| 1354 | # CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set | ||
| 1355 | # CONFIG_DEBUG_KOBJECT is not set | ||
| 1356 | # CONFIG_DEBUG_BUGVERBOSE is not set | ||
| 1357 | # CONFIG_DEBUG_INFO is not set | ||
| 1358 | # CONFIG_DEBUG_VM is not set | ||
| 1359 | # CONFIG_DEBUG_LIST is not set | ||
| 1360 | # CONFIG_DEBUG_SG is not set | ||
| 1361 | CONFIG_FRAME_POINTER=y | ||
| 1362 | # CONFIG_FORCED_INLINING is not set | ||
| 1363 | # CONFIG_BOOT_PRINTK_DELAY is not set | ||
| 1364 | # CONFIG_RCU_TORTURE_TEST is not set | ||
| 1365 | # CONFIG_FAULT_INJECTION is not set | ||
| 1366 | # CONFIG_SAMPLES is not set | ||
| 1367 | # CONFIG_DEBUG_USER is not set | ||
| 1368 | CONFIG_DEBUG_ERRORS=y | ||
| 1369 | # CONFIG_DEBUG_LL is not set | ||
| 1370 | |||
| 1371 | # | ||
| 1372 | # Security options | ||
| 1373 | # | ||
| 1374 | # CONFIG_KEYS is not set | ||
| 1375 | # CONFIG_SECURITY is not set | ||
| 1376 | # CONFIG_SECURITY_FILE_CAPABILITIES is not set | ||
| 1377 | CONFIG_CRYPTO=y | ||
| 1378 | CONFIG_CRYPTO_ALGAPI=m | ||
| 1379 | CONFIG_CRYPTO_BLKCIPHER=m | ||
| 1380 | CONFIG_CRYPTO_HASH=m | ||
| 1381 | CONFIG_CRYPTO_MANAGER=m | ||
| 1382 | CONFIG_CRYPTO_HMAC=m | ||
| 1383 | # CONFIG_CRYPTO_XCBC is not set | ||
| 1384 | CONFIG_CRYPTO_NULL=m | ||
| 1385 | CONFIG_CRYPTO_MD4=m | ||
| 1386 | CONFIG_CRYPTO_MD5=m | ||
| 1387 | CONFIG_CRYPTO_SHA1=m | ||
| 1388 | CONFIG_CRYPTO_SHA256=m | ||
| 1389 | CONFIG_CRYPTO_SHA512=m | ||
| 1390 | CONFIG_CRYPTO_WP512=m | ||
| 1391 | # CONFIG_CRYPTO_TGR192 is not set | ||
| 1392 | # CONFIG_CRYPTO_GF128MUL is not set | ||
| 1393 | CONFIG_CRYPTO_ECB=m | ||
| 1394 | CONFIG_CRYPTO_CBC=m | ||
| 1395 | # CONFIG_CRYPTO_PCBC is not set | ||
| 1396 | # CONFIG_CRYPTO_LRW is not set | ||
| 1397 | # CONFIG_CRYPTO_XTS is not set | ||
| 1398 | # CONFIG_CRYPTO_CRYPTD is not set | ||
| 1399 | CONFIG_CRYPTO_DES=m | ||
| 1400 | # CONFIG_CRYPTO_FCRYPT is not set | ||
| 1401 | CONFIG_CRYPTO_BLOWFISH=m | ||
| 1402 | CONFIG_CRYPTO_TWOFISH=m | ||
| 1403 | CONFIG_CRYPTO_TWOFISH_COMMON=m | ||
| 1404 | CONFIG_CRYPTO_SERPENT=m | ||
| 1405 | CONFIG_CRYPTO_AES=m | ||
| 1406 | CONFIG_CRYPTO_CAST5=m | ||
| 1407 | CONFIG_CRYPTO_CAST6=m | ||
| 1408 | CONFIG_CRYPTO_TEA=m | ||
| 1409 | CONFIG_CRYPTO_ARC4=m | ||
| 1410 | CONFIG_CRYPTO_KHAZAD=m | ||
| 1411 | CONFIG_CRYPTO_ANUBIS=m | ||
| 1412 | # CONFIG_CRYPTO_SEED is not set | ||
| 1413 | CONFIG_CRYPTO_DEFLATE=m | ||
| 1414 | # CONFIG_CRYPTO_LZO is not set | ||
| 1415 | CONFIG_CRYPTO_MICHAEL_MIC=m | ||
| 1416 | CONFIG_CRYPTO_CRC32C=m | ||
| 1417 | # CONFIG_CRYPTO_CAMELLIA is not set | ||
| 1418 | CONFIG_CRYPTO_TEST=m | ||
| 1419 | # CONFIG_CRYPTO_AUTHENC is not set | ||
| 1420 | # CONFIG_CRYPTO_HW is not set | ||
| 1421 | |||
| 1422 | # | ||
| 1423 | # Library routines | ||
| 1424 | # | ||
| 1425 | CONFIG_BITREVERSE=y | ||
| 1426 | CONFIG_CRC_CCITT=m | ||
| 1427 | CONFIG_CRC16=m | ||
| 1428 | CONFIG_CRC_ITU_T=m | ||
| 1429 | CONFIG_CRC32=y | ||
| 1430 | CONFIG_CRC7=m | ||
| 1431 | CONFIG_LIBCRC32C=m | ||
| 1432 | CONFIG_ZLIB_INFLATE=y | ||
| 1433 | CONFIG_ZLIB_DEFLATE=y | ||
| 1434 | CONFIG_PLIST=y | ||
| 1435 | CONFIG_HAS_IOMEM=y | ||
| 1436 | CONFIG_HAS_IOPORT=y | ||
| 1437 | CONFIG_HAS_DMA=y | ||
diff --git a/meta/packages/linux/linux-rp-2.6.25+2.6.26-rc4/defconfig-htcuniversal b/meta/packages/linux/linux-rp-2.6.25+2.6.26-rc4/defconfig-htcuniversal new file mode 100644 index 0000000000..8b2a31dbb0 --- /dev/null +++ b/meta/packages/linux/linux-rp-2.6.25+2.6.26-rc4/defconfig-htcuniversal | |||
| @@ -0,0 +1,1308 @@ | |||
| 1 | # | ||
| 2 | # Automatically generated make config: don't edit | ||
| 3 | # Linux kernel version: 2.6.24-rc8 | ||
| 4 | # Sun Jan 20 21:46:02 2008 | ||
| 5 | # | ||
| 6 | CONFIG_ARM=y | ||
| 7 | CONFIG_SYS_SUPPORTS_APM_EMULATION=y | ||
| 8 | CONFIG_GENERIC_GPIO=y | ||
| 9 | CONFIG_GENERIC_TIME=y | ||
| 10 | CONFIG_GENERIC_CLOCKEVENTS=y | ||
| 11 | CONFIG_MMU=y | ||
| 12 | # CONFIG_NO_IOPORT is not set | ||
| 13 | CONFIG_GENERIC_HARDIRQS=y | ||
| 14 | CONFIG_STACKTRACE_SUPPORT=y | ||
| 15 | CONFIG_LOCKDEP_SUPPORT=y | ||
| 16 | CONFIG_TRACE_IRQFLAGS_SUPPORT=y | ||
| 17 | CONFIG_HARDIRQS_SW_RESEND=y | ||
| 18 | CONFIG_GENERIC_IRQ_PROBE=y | ||
| 19 | CONFIG_RWSEM_GENERIC_SPINLOCK=y | ||
| 20 | # CONFIG_ARCH_HAS_ILOG2_U32 is not set | ||
| 21 | # CONFIG_ARCH_HAS_ILOG2_U64 is not set | ||
| 22 | CONFIG_GENERIC_HWEIGHT=y | ||
| 23 | CONFIG_GENERIC_CALIBRATE_DELAY=y | ||
| 24 | CONFIG_ZONE_DMA=y | ||
| 25 | CONFIG_ARCH_MTD_XIP=y | ||
| 26 | CONFIG_VECTORS_BASE=0xffff0000 | ||
| 27 | CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" | ||
| 28 | |||
| 29 | # | ||
| 30 | # General setup | ||
| 31 | # | ||
| 32 | CONFIG_EXPERIMENTAL=y | ||
| 33 | CONFIG_BROKEN_ON_SMP=y | ||
| 34 | CONFIG_LOCK_KERNEL=y | ||
| 35 | CONFIG_INIT_ENV_ARG_LIMIT=32 | ||
| 36 | CONFIG_LOCALVERSION="" | ||
| 37 | # CONFIG_LOCALVERSION_AUTO is not set | ||
| 38 | CONFIG_SWAP=y | ||
| 39 | CONFIG_SYSVIPC=y | ||
| 40 | CONFIG_SYSVIPC_SYSCTL=y | ||
| 41 | # CONFIG_POSIX_MQUEUE is not set | ||
| 42 | # CONFIG_BSD_PROCESS_ACCT is not set | ||
| 43 | # CONFIG_TASKSTATS is not set | ||
| 44 | # CONFIG_USER_NS is not set | ||
| 45 | # CONFIG_PID_NS is not set | ||
| 46 | # CONFIG_AUDIT is not set | ||
| 47 | CONFIG_IKCONFIG=y | ||
| 48 | CONFIG_IKCONFIG_PROC=y | ||
| 49 | CONFIG_LOG_BUF_SHIFT=16 | ||
| 50 | # CONFIG_CGROUPS is not set | ||
| 51 | CONFIG_FAIR_GROUP_SCHED=y | ||
| 52 | CONFIG_FAIR_USER_SCHED=y | ||
| 53 | # CONFIG_FAIR_CGROUP_SCHED is not set | ||
| 54 | CONFIG_SYSFS_DEPRECATED=y | ||
| 55 | # CONFIG_RELAY is not set | ||
| 56 | # CONFIG_BLK_DEV_INITRD is not set | ||
| 57 | CONFIG_CC_OPTIMIZE_FOR_SIZE=y | ||
| 58 | CONFIG_SYSCTL=y | ||
| 59 | CONFIG_EMBEDDED=y | ||
| 60 | # CONFIG_UID16 is not set | ||
| 61 | CONFIG_SYSCTL_SYSCALL=y | ||
| 62 | CONFIG_KALLSYMS=y | ||
| 63 | # CONFIG_KALLSYMS_ALL is not set | ||
| 64 | # CONFIG_KALLSYMS_EXTRA_PASS is not set | ||
| 65 | CONFIG_HOTPLUG=y | ||
| 66 | CONFIG_PRINTK=y | ||
| 67 | CONFIG_BUG=y | ||
| 68 | CONFIG_ELF_CORE=y | ||
| 69 | CONFIG_BASE_FULL=y | ||
| 70 | CONFIG_FUTEX=y | ||
| 71 | CONFIG_ANON_INODES=y | ||
| 72 | CONFIG_EPOLL=y | ||
| 73 | CONFIG_SIGNALFD=y | ||
| 74 | CONFIG_EVENTFD=y | ||
| 75 | CONFIG_SHMEM=y | ||
| 76 | CONFIG_VM_EVENT_COUNTERS=y | ||
| 77 | CONFIG_SLAB=y | ||
| 78 | # CONFIG_SLUB is not set | ||
| 79 | # CONFIG_SLOB is not set | ||
| 80 | CONFIG_SLABINFO=y | ||
| 81 | CONFIG_RT_MUTEXES=y | ||
| 82 | # CONFIG_TINY_SHMEM is not set | ||
| 83 | CONFIG_BASE_SMALL=0 | ||
| 84 | CONFIG_MODULES=y | ||
| 85 | CONFIG_MODULE_UNLOAD=y | ||
| 86 | CONFIG_MODULE_FORCE_UNLOAD=y | ||
| 87 | # CONFIG_MODVERSIONS is not set | ||
| 88 | # CONFIG_MODULE_SRCVERSION_ALL is not set | ||
| 89 | CONFIG_KMOD=y | ||
| 90 | CONFIG_BLOCK=y | ||
| 91 | # CONFIG_LBD is not set | ||
| 92 | # CONFIG_BLK_DEV_IO_TRACE is not set | ||
| 93 | # CONFIG_LSF is not set | ||
| 94 | # CONFIG_BLK_DEV_BSG is not set | ||
| 95 | |||
| 96 | # | ||
| 97 | # IO Schedulers | ||
| 98 | # | ||
| 99 | CONFIG_IOSCHED_NOOP=y | ||
| 100 | CONFIG_IOSCHED_AS=y | ||
| 101 | CONFIG_IOSCHED_DEADLINE=y | ||
| 102 | # CONFIG_IOSCHED_CFQ is not set | ||
| 103 | CONFIG_DEFAULT_AS=y | ||
| 104 | # CONFIG_DEFAULT_DEADLINE is not set | ||
| 105 | # CONFIG_DEFAULT_CFQ is not set | ||
| 106 | # CONFIG_DEFAULT_NOOP is not set | ||
| 107 | CONFIG_DEFAULT_IOSCHED="anticipatory" | ||
| 108 | |||
| 109 | # | ||
| 110 | # System Type | ||
| 111 | # | ||
| 112 | # CONFIG_ARCH_AAEC2000 is not set | ||
| 113 | # CONFIG_ARCH_INTEGRATOR is not set | ||
| 114 | # CONFIG_ARCH_REALVIEW is not set | ||
| 115 | # CONFIG_ARCH_VERSATILE is not set | ||
| 116 | # CONFIG_ARCH_AT91 is not set | ||
| 117 | # CONFIG_ARCH_CLPS7500 is not set | ||
| 118 | # CONFIG_ARCH_CLPS711X is not set | ||
| 119 | # CONFIG_ARCH_CO285 is not set | ||
| 120 | # CONFIG_ARCH_EBSA110 is not set | ||
| 121 | # CONFIG_ARCH_EP93XX is not set | ||
| 122 | # CONFIG_ARCH_FOOTBRIDGE is not set | ||
| 123 | # CONFIG_ARCH_NETX is not set | ||
| 124 | # CONFIG_ARCH_H720X is not set | ||
| 125 | # CONFIG_ARCH_IMX is not set | ||
| 126 | # CONFIG_ARCH_IOP13XX is not set | ||
| 127 | # CONFIG_ARCH_IOP32X is not set | ||
| 128 | # CONFIG_ARCH_IOP33X is not set | ||
| 129 | # CONFIG_ARCH_IXP23XX is not set | ||
| 130 | # CONFIG_ARCH_IXP2000 is not set | ||
| 131 | # CONFIG_ARCH_IXP4XX is not set | ||
| 132 | # CONFIG_ARCH_L7200 is not set | ||
| 133 | # CONFIG_ARCH_KS8695 is not set | ||
| 134 | # CONFIG_ARCH_NS9XXX is not set | ||
| 135 | # CONFIG_ARCH_MXC is not set | ||
| 136 | # CONFIG_ARCH_PNX4008 is not set | ||
| 137 | CONFIG_ARCH_PXA=y | ||
| 138 | # CONFIG_ARCH_RPC is not set | ||
| 139 | # CONFIG_ARCH_SA1100 is not set | ||
| 140 | # CONFIG_ARCH_S3C2410 is not set | ||
| 141 | # CONFIG_ARCH_SHARK is not set | ||
| 142 | # CONFIG_ARCH_LH7A40X is not set | ||
| 143 | # CONFIG_ARCH_DAVINCI is not set | ||
| 144 | # CONFIG_ARCH_OMAP is not set | ||
| 145 | CONFIG_DMABOUNCE=y | ||
| 146 | |||
| 147 | # | ||
| 148 | # Intel PXA2xx/PXA3xx Implementations | ||
| 149 | # | ||
| 150 | CONFIG_ARCH_LUBBOCK=y | ||
| 151 | # CONFIG_MACH_LOGICPD_PXA270 is not set | ||
| 152 | # CONFIG_MACH_MAINSTONE is not set | ||
| 153 | # CONFIG_ARCH_PXA_IDP is not set | ||
| 154 | # CONFIG_PXA_SHARPSL is not set | ||
| 155 | # CONFIG_MACH_TRIZEPS4 is not set | ||
| 156 | # CONFIG_MACH_EM_X270 is not set | ||
| 157 | # CONFIG_MACH_ZYLONITE is not set | ||
| 158 | # CONFIG_MACH_ARMCORE is not set | ||
| 159 | CONFIG_PXA25x=y | ||
| 160 | # CONFIG_PXA_KEYS is not set | ||
| 161 | |||
| 162 | # | ||
| 163 | # Boot options | ||
| 164 | # | ||
| 165 | |||
| 166 | # | ||
| 167 | # Power management | ||
| 168 | # | ||
| 169 | |||
| 170 | # | ||
| 171 | # Processor Type | ||
| 172 | # | ||
| 173 | CONFIG_CPU_32=y | ||
| 174 | CONFIG_CPU_XSCALE=y | ||
| 175 | CONFIG_CPU_32v5=y | ||
| 176 | CONFIG_CPU_ABRT_EV5T=y | ||
| 177 | CONFIG_CPU_CACHE_VIVT=y | ||
| 178 | CONFIG_CPU_TLB_V4WBI=y | ||
| 179 | CONFIG_CPU_CP15=y | ||
| 180 | CONFIG_CPU_CP15_MMU=y | ||
| 181 | |||
| 182 | # | ||
| 183 | # Processor Features | ||
| 184 | # | ||
| 185 | CONFIG_ARM_THUMB=y | ||
| 186 | # CONFIG_CPU_DCACHE_DISABLE is not set | ||
| 187 | # CONFIG_OUTER_CACHE is not set | ||
| 188 | CONFIG_IWMMXT=y | ||
| 189 | CONFIG_XSCALE_PMU=y | ||
| 190 | CONFIG_SA1111=y | ||
| 191 | CONFIG_FORCE_MAX_ZONEORDER=9 | ||
| 192 | |||
| 193 | # | ||
| 194 | # Bus support | ||
| 195 | # | ||
| 196 | # CONFIG_PCI_SYSCALL is not set | ||
| 197 | # CONFIG_ARCH_SUPPORTS_MSI is not set | ||
| 198 | # CONFIG_PCCARD is not set | ||
| 199 | |||
| 200 | # | ||
| 201 | # Kernel Features | ||
| 202 | # | ||
| 203 | # CONFIG_TICK_ONESHOT is not set | ||
| 204 | # CONFIG_NO_HZ is not set | ||
| 205 | # CONFIG_HIGH_RES_TIMERS is not set | ||
| 206 | CONFIG_GENERIC_CLOCKEVENTS_BUILD=y | ||
| 207 | CONFIG_PREEMPT=y | ||
| 208 | CONFIG_HZ=100 | ||
| 209 | CONFIG_AEABI=y | ||
| 210 | CONFIG_OABI_COMPAT=y | ||
| 211 | # CONFIG_ARCH_DISCONTIGMEM_ENABLE is not set | ||
| 212 | CONFIG_SELECT_MEMORY_MODEL=y | ||
| 213 | CONFIG_FLATMEM_MANUAL=y | ||
| 214 | # CONFIG_DISCONTIGMEM_MANUAL is not set | ||
| 215 | # CONFIG_SPARSEMEM_MANUAL is not set | ||
| 216 | CONFIG_FLATMEM=y | ||
| 217 | CONFIG_FLAT_NODE_MEM_MAP=y | ||
| 218 | # CONFIG_SPARSEMEM_STATIC is not set | ||
| 219 | # CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set | ||
| 220 | CONFIG_SPLIT_PTLOCK_CPUS=4096 | ||
| 221 | # CONFIG_RESOURCES_64BIT is not set | ||
| 222 | CONFIG_ZONE_DMA_FLAG=1 | ||
| 223 | CONFIG_BOUNCE=y | ||
| 224 | CONFIG_VIRT_TO_BUS=y | ||
| 225 | # CONFIG_LEDS is not set | ||
| 226 | CONFIG_ALIGNMENT_TRAP=y | ||
| 227 | |||
| 228 | # | ||
| 229 | # Boot options | ||
| 230 | # | ||
| 231 | CONFIG_ZBOOT_ROM_TEXT=0x0 | ||
| 232 | CONFIG_ZBOOT_ROM_BSS=0x0 | ||
| 233 | CONFIG_CMDLINE="console=ttyS0,115200n8 console=tty1 noinitrd root=/dev/mtdblock2 rootfstype=jffs2 dyntick=enable debug" | ||
| 234 | # CONFIG_XIP_KERNEL is not set | ||
| 235 | CONFIG_KEXEC=y | ||
| 236 | CONFIG_ATAGS_PROC=y | ||
| 237 | CONFIG_CPU_FREQ_PXA25x=y | ||
| 238 | |||
| 239 | # | ||
| 240 | # CPU Frequency scaling | ||
| 241 | # | ||
| 242 | CONFIG_CPU_FREQ=y | ||
| 243 | CONFIG_CPU_FREQ_TABLE=y | ||
| 244 | CONFIG_CPU_FREQ_DEBUG=y | ||
| 245 | CONFIG_CPU_FREQ_STAT=y | ||
| 246 | CONFIG_CPU_FREQ_STAT_DETAILS=y | ||
| 247 | # CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE is not set | ||
| 248 | CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE=y | ||
| 249 | # CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND is not set | ||
| 250 | # CONFIG_CPU_FREQ_DEFAULT_GOV_CONSERVATIVE is not set | ||
| 251 | CONFIG_CPU_FREQ_GOV_PERFORMANCE=y | ||
| 252 | # CONFIG_CPU_FREQ_GOV_POWERSAVE is not set | ||
| 253 | CONFIG_CPU_FREQ_GOV_USERSPACE=y | ||
| 254 | # CONFIG_CPU_FREQ_GOV_ONDEMAND is not set | ||
| 255 | CONFIG_CPU_FREQ_GOV_CONSERVATIVE=y | ||
| 256 | |||
| 257 | # | ||
| 258 | # Floating point emulation | ||
| 259 | # | ||
| 260 | |||
| 261 | # | ||
| 262 | # At least one emulation must be selected | ||
| 263 | # | ||
| 264 | CONFIG_FPE_NWFPE=y | ||
| 265 | # CONFIG_FPE_NWFPE_XP is not set | ||
| 266 | # CONFIG_FPE_FASTFPE is not set | ||
| 267 | |||
| 268 | # | ||
| 269 | # Userspace binary formats | ||
| 270 | # | ||
| 271 | CONFIG_BINFMT_ELF=y | ||
| 272 | # CONFIG_BINFMT_AOUT is not set | ||
| 273 | # CONFIG_BINFMT_MISC is not set | ||
| 274 | |||
| 275 | # | ||
| 276 | # Power management options | ||
| 277 | # | ||
| 278 | CONFIG_PM=y | ||
| 279 | # CONFIG_PM_LEGACY is not set | ||
| 280 | # CONFIG_PM_DEBUG is not set | ||
| 281 | CONFIG_SUSPEND_UP_POSSIBLE=y | ||
| 282 | # CONFIG_SUSPEND is not set | ||
| 283 | CONFIG_APM_EMULATION=y | ||
| 284 | CONFIG_INPUT_APMPOWER=y | ||
| 285 | |||
| 286 | # | ||
| 287 | # Networking | ||
| 288 | # | ||
| 289 | CONFIG_NET=y | ||
| 290 | |||
| 291 | # | ||
| 292 | # Networking options | ||
| 293 | # | ||
| 294 | CONFIG_PACKET=m | ||
| 295 | CONFIG_PACKET_MMAP=y | ||
| 296 | CONFIG_UNIX=y | ||
| 297 | # CONFIG_NET_KEY is not set | ||
| 298 | CONFIG_INET=y | ||
| 299 | CONFIG_IP_MULTICAST=y | ||
| 300 | # CONFIG_IP_ADVANCED_ROUTER is not set | ||
| 301 | CONFIG_IP_FIB_HASH=y | ||
| 302 | CONFIG_IP_PNP=y | ||
| 303 | # CONFIG_IP_PNP_DHCP is not set | ||
| 304 | # CONFIG_IP_PNP_BOOTP is not set | ||
| 305 | # CONFIG_IP_PNP_RARP is not set | ||
| 306 | # CONFIG_NET_IPIP is not set | ||
| 307 | # CONFIG_NET_IPGRE is not set | ||
| 308 | # CONFIG_IP_MROUTE is not set | ||
| 309 | # CONFIG_ARPD is not set | ||
| 310 | # CONFIG_SYN_COOKIES is not set | ||
| 311 | # CONFIG_INET_AH is not set | ||
| 312 | # CONFIG_INET_ESP is not set | ||
| 313 | # CONFIG_INET_IPCOMP is not set | ||
| 314 | # CONFIG_INET_XFRM_TUNNEL is not set | ||
| 315 | # CONFIG_INET_TUNNEL is not set | ||
| 316 | # CONFIG_INET_XFRM_MODE_TRANSPORT is not set | ||
| 317 | # CONFIG_INET_XFRM_MODE_TUNNEL is not set | ||
| 318 | # CONFIG_INET_XFRM_MODE_BEET is not set | ||
| 319 | # CONFIG_INET_LRO is not set | ||
| 320 | # CONFIG_INET_DIAG is not set | ||
| 321 | # CONFIG_TCP_CONG_ADVANCED is not set | ||
| 322 | CONFIG_TCP_CONG_CUBIC=y | ||
| 323 | CONFIG_DEFAULT_TCP_CONG="cubic" | ||
| 324 | # CONFIG_TCP_MD5SIG is not set | ||
| 325 | # CONFIG_IP_VS is not set | ||
| 326 | # CONFIG_IPV6 is not set | ||
| 327 | # CONFIG_INET6_XFRM_TUNNEL is not set | ||
| 328 | # CONFIG_INET6_TUNNEL is not set | ||
| 329 | # CONFIG_NETWORK_SECMARK is not set | ||
| 330 | CONFIG_NETFILTER=y | ||
| 331 | # CONFIG_NETFILTER_DEBUG is not set | ||
| 332 | |||
| 333 | # | ||
| 334 | # Core Netfilter Configuration | ||
| 335 | # | ||
| 336 | # CONFIG_NETFILTER_NETLINK is not set | ||
| 337 | # CONFIG_NF_CONNTRACK_ENABLED is not set | ||
| 338 | # CONFIG_NF_CONNTRACK is not set | ||
| 339 | CONFIG_NETFILTER_XTABLES=m | ||
| 340 | # CONFIG_NETFILTER_XT_TARGET_CLASSIFY is not set | ||
| 341 | # CONFIG_NETFILTER_XT_TARGET_DSCP is not set | ||
| 342 | # CONFIG_NETFILTER_XT_TARGET_MARK is not set | ||
| 343 | # CONFIG_NETFILTER_XT_TARGET_NFQUEUE is not set | ||
| 344 | # CONFIG_NETFILTER_XT_TARGET_NFLOG is not set | ||
| 345 | # CONFIG_NETFILTER_XT_TARGET_TRACE is not set | ||
| 346 | # CONFIG_NETFILTER_XT_TARGET_TCPMSS is not set | ||
| 347 | # CONFIG_NETFILTER_XT_MATCH_COMMENT is not set | ||
| 348 | # CONFIG_NETFILTER_XT_MATCH_DCCP is not set | ||
| 349 | # CONFIG_NETFILTER_XT_MATCH_DSCP is not set | ||
| 350 | # CONFIG_NETFILTER_XT_MATCH_ESP is not set | ||
| 351 | # CONFIG_NETFILTER_XT_MATCH_LENGTH is not set | ||
| 352 | # CONFIG_NETFILTER_XT_MATCH_LIMIT is not set | ||
| 353 | # CONFIG_NETFILTER_XT_MATCH_MAC is not set | ||
| 354 | # CONFIG_NETFILTER_XT_MATCH_MARK is not set | ||
| 355 | # CONFIG_NETFILTER_XT_MATCH_MULTIPORT is not set | ||
| 356 | # CONFIG_NETFILTER_XT_MATCH_PKTTYPE is not set | ||
| 357 | # CONFIG_NETFILTER_XT_MATCH_QUOTA is not set | ||
| 358 | # CONFIG_NETFILTER_XT_MATCH_REALM is not set | ||
| 359 | # CONFIG_NETFILTER_XT_MATCH_SCTP is not set | ||
| 360 | # CONFIG_NETFILTER_XT_MATCH_STATISTIC is not set | ||
| 361 | # CONFIG_NETFILTER_XT_MATCH_STRING is not set | ||
| 362 | # CONFIG_NETFILTER_XT_MATCH_TCPMSS is not set | ||
| 363 | # CONFIG_NETFILTER_XT_MATCH_TIME is not set | ||
| 364 | # CONFIG_NETFILTER_XT_MATCH_U32 is not set | ||
| 365 | # CONFIG_NETFILTER_XT_MATCH_HASHLIMIT is not set | ||
| 366 | |||
| 367 | # | ||
| 368 | # IP: Netfilter Configuration | ||
| 369 | # | ||
| 370 | CONFIG_IP_NF_QUEUE=m | ||
| 371 | CONFIG_IP_NF_IPTABLES=m | ||
| 372 | CONFIG_IP_NF_MATCH_IPRANGE=m | ||
| 373 | CONFIG_IP_NF_MATCH_TOS=m | ||
| 374 | CONFIG_IP_NF_MATCH_RECENT=m | ||
| 375 | CONFIG_IP_NF_MATCH_ECN=m | ||
| 376 | CONFIG_IP_NF_MATCH_AH=m | ||
| 377 | CONFIG_IP_NF_MATCH_TTL=m | ||
| 378 | CONFIG_IP_NF_MATCH_OWNER=m | ||
| 379 | CONFIG_IP_NF_MATCH_ADDRTYPE=m | ||
| 380 | CONFIG_IP_NF_FILTER=m | ||
| 381 | CONFIG_IP_NF_TARGET_REJECT=m | ||
| 382 | CONFIG_IP_NF_TARGET_LOG=m | ||
| 383 | CONFIG_IP_NF_TARGET_ULOG=m | ||
| 384 | CONFIG_IP_NF_MANGLE=m | ||
| 385 | CONFIG_IP_NF_TARGET_TOS=m | ||
| 386 | CONFIG_IP_NF_TARGET_ECN=m | ||
| 387 | CONFIG_IP_NF_TARGET_TTL=m | ||
| 388 | CONFIG_IP_NF_RAW=m | ||
| 389 | CONFIG_IP_NF_ARPTABLES=m | ||
| 390 | CONFIG_IP_NF_ARPFILTER=m | ||
| 391 | CONFIG_IP_NF_ARP_MANGLE=m | ||
| 392 | # CONFIG_IP_DCCP is not set | ||
| 393 | # CONFIG_IP_SCTP is not set | ||
| 394 | # CONFIG_TIPC is not set | ||
| 395 | # CONFIG_ATM is not set | ||
| 396 | # CONFIG_BRIDGE is not set | ||
| 397 | # CONFIG_VLAN_8021Q is not set | ||
| 398 | # CONFIG_DECNET is not set | ||
| 399 | # CONFIG_LLC2 is not set | ||
| 400 | # CONFIG_IPX is not set | ||
| 401 | # CONFIG_ATALK is not set | ||
| 402 | # CONFIG_X25 is not set | ||
| 403 | # CONFIG_LAPB is not set | ||
| 404 | # CONFIG_ECONET is not set | ||
| 405 | # CONFIG_WAN_ROUTER is not set | ||
| 406 | # CONFIG_NET_SCHED is not set | ||
| 407 | |||
| 408 | # | ||
| 409 | # Network testing | ||
| 410 | # | ||
| 411 | # CONFIG_NET_PKTGEN is not set | ||
| 412 | # CONFIG_HAMRADIO is not set | ||
| 413 | CONFIG_IRDA=y | ||
| 414 | |||
| 415 | # | ||
| 416 | # IrDA protocols | ||
| 417 | # | ||
| 418 | CONFIG_IRLAN=y | ||
| 419 | # CONFIG_IRNET is not set | ||
| 420 | CONFIG_IRCOMM=y | ||
| 421 | CONFIG_IRDA_ULTRA=y | ||
| 422 | |||
| 423 | # | ||
| 424 | # IrDA options | ||
| 425 | # | ||
| 426 | CONFIG_IRDA_CACHE_LAST_LSAP=y | ||
| 427 | CONFIG_IRDA_FAST_RR=y | ||
| 428 | CONFIG_IRDA_DEBUG=y | ||
| 429 | |||
| 430 | # | ||
| 431 | # Infrared-port device drivers | ||
| 432 | # | ||
| 433 | |||
| 434 | # | ||
| 435 | # SIR device drivers | ||
| 436 | # | ||
| 437 | CONFIG_IRTTY_SIR=y | ||
| 438 | |||
| 439 | # | ||
| 440 | # Dongle support | ||
| 441 | # | ||
| 442 | # CONFIG_DONGLE is not set | ||
| 443 | |||
| 444 | # | ||
| 445 | # Old SIR device drivers | ||
| 446 | # | ||
| 447 | # CONFIG_IRPORT_SIR is not set | ||
| 448 | |||
| 449 | # | ||
| 450 | # Old Serial dongle support | ||
| 451 | # | ||
| 452 | |||
| 453 | # | ||
| 454 | # FIR device drivers | ||
| 455 | # | ||
| 456 | CONFIG_PXA_FICP=y | ||
| 457 | CONFIG_BT=m | ||
| 458 | CONFIG_BT_L2CAP=m | ||
| 459 | CONFIG_BT_SCO=m | ||
| 460 | CONFIG_BT_RFCOMM=m | ||
| 461 | CONFIG_BT_RFCOMM_TTY=y | ||
| 462 | CONFIG_BT_BNEP=m | ||
| 463 | CONFIG_BT_BNEP_MC_FILTER=y | ||
| 464 | CONFIG_BT_BNEP_PROTO_FILTER=y | ||
| 465 | CONFIG_BT_HIDP=m | ||
| 466 | |||
| 467 | # | ||
| 468 | # Bluetooth device drivers | ||
| 469 | # | ||
| 470 | # CONFIG_BT_HCIBTSDIO is not set | ||
| 471 | CONFIG_BT_HCIUART=m | ||
| 472 | CONFIG_BT_HCIUART_H4=y | ||
| 473 | CONFIG_BT_HCIUART_BCSP=y | ||
| 474 | # CONFIG_BT_HCIUART_LL is not set | ||
| 475 | # CONFIG_BT_HCIVHCI is not set | ||
| 476 | # CONFIG_AF_RXRPC is not set | ||
| 477 | |||
| 478 | # | ||
| 479 | # Wireless | ||
| 480 | # | ||
| 481 | # CONFIG_CFG80211 is not set | ||
| 482 | CONFIG_WIRELESS_EXT=y | ||
| 483 | # CONFIG_MAC80211 is not set | ||
| 484 | # CONFIG_IEEE80211 is not set | ||
| 485 | # CONFIG_RFKILL is not set | ||
| 486 | # CONFIG_NET_9P is not set | ||
| 487 | |||
| 488 | # | ||
| 489 | # Device Drivers | ||
| 490 | # | ||
| 491 | |||
| 492 | # | ||
| 493 | # Generic Driver Options | ||
| 494 | # | ||
| 495 | CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" | ||
| 496 | CONFIG_STANDALONE=y | ||
| 497 | CONFIG_PREVENT_FIRMWARE_BUILD=y | ||
| 498 | CONFIG_FW_LOADER=y | ||
| 499 | # CONFIG_DEBUG_DRIVER is not set | ||
| 500 | # CONFIG_DEBUG_DEVRES is not set | ||
| 501 | # CONFIG_SYS_HYPERVISOR is not set | ||
| 502 | # CONFIG_CONNECTOR is not set | ||
| 503 | CONFIG_MTD=y | ||
| 504 | CONFIG_MTD_DEBUG=y | ||
| 505 | CONFIG_MTD_DEBUG_VERBOSE=0 | ||
| 506 | # CONFIG_MTD_CONCAT is not set | ||
| 507 | CONFIG_MTD_PARTITIONS=y | ||
| 508 | # CONFIG_MTD_REDBOOT_PARTS is not set | ||
| 509 | # CONFIG_MTD_CMDLINE_PARTS is not set | ||
| 510 | # CONFIG_MTD_AFS_PARTS is not set | ||
| 511 | |||
| 512 | # | ||
| 513 | # User Modules And Translation Layers | ||
| 514 | # | ||
| 515 | # CONFIG_MTD_CHAR is not set | ||
| 516 | # CONFIG_MTD_BLKDEVS is not set | ||
| 517 | # CONFIG_MTD_BLOCK is not set | ||
| 518 | # CONFIG_MTD_BLOCK_RO is not set | ||
| 519 | # CONFIG_FTL is not set | ||
| 520 | # CONFIG_NFTL is not set | ||
| 521 | # CONFIG_INFTL is not set | ||
| 522 | # CONFIG_RFD_FTL is not set | ||
| 523 | # CONFIG_SSFDC is not set | ||
| 524 | # CONFIG_MTD_OOPS is not set | ||
| 525 | |||
| 526 | # | ||
| 527 | # RAM/ROM/Flash chip drivers | ||
| 528 | # | ||
| 529 | # CONFIG_MTD_CFI is not set | ||
| 530 | # CONFIG_MTD_JEDECPROBE is not set | ||
| 531 | CONFIG_MTD_MAP_BANK_WIDTH_1=y | ||
| 532 | CONFIG_MTD_MAP_BANK_WIDTH_2=y | ||
| 533 | CONFIG_MTD_MAP_BANK_WIDTH_4=y | ||
| 534 | # CONFIG_MTD_MAP_BANK_WIDTH_8 is not set | ||
| 535 | # CONFIG_MTD_MAP_BANK_WIDTH_16 is not set | ||
| 536 | # CONFIG_MTD_MAP_BANK_WIDTH_32 is not set | ||
| 537 | CONFIG_MTD_CFI_I1=y | ||
| 538 | CONFIG_MTD_CFI_I2=y | ||
| 539 | # CONFIG_MTD_CFI_I4 is not set | ||
| 540 | # CONFIG_MTD_CFI_I8 is not set | ||
| 541 | # CONFIG_MTD_RAM is not set | ||
| 542 | # CONFIG_MTD_ROM is not set | ||
| 543 | # CONFIG_MTD_ABSENT is not set | ||
| 544 | |||
| 545 | # | ||
| 546 | # Mapping drivers for chip access | ||
| 547 | # | ||
| 548 | # CONFIG_MTD_COMPLEX_MAPPINGS is not set | ||
| 549 | # CONFIG_MTD_SHARP_SL is not set | ||
| 550 | # CONFIG_MTD_PLATRAM is not set | ||
| 551 | |||
| 552 | # | ||
| 553 | # Self-contained MTD device drivers | ||
| 554 | # | ||
| 555 | # CONFIG_MTD_SLRAM is not set | ||
| 556 | # CONFIG_MTD_PHRAM is not set | ||
| 557 | CONFIG_MTD_MTDRAM=m | ||
| 558 | CONFIG_MTDRAM_TOTAL_SIZE=4096 | ||
| 559 | CONFIG_MTDRAM_ERASE_SIZE=128 | ||
| 560 | # CONFIG_MTD_BLOCK2MTD is not set | ||
| 561 | |||
| 562 | # | ||
| 563 | # Disk-On-Chip Device Drivers | ||
| 564 | # | ||
| 565 | # CONFIG_MTD_DOC2000 is not set | ||
| 566 | # CONFIG_MTD_DOC2001 is not set | ||
| 567 | # CONFIG_MTD_DOC2001PLUS is not set | ||
| 568 | # CONFIG_MTD_NAND is not set | ||
| 569 | # CONFIG_MTD_ONENAND is not set | ||
| 570 | |||
| 571 | # | ||
| 572 | # UBI - Unsorted block images | ||
| 573 | # | ||
| 574 | # CONFIG_MTD_UBI is not set | ||
| 575 | # CONFIG_PARPORT is not set | ||
| 576 | CONFIG_BLK_DEV=y | ||
| 577 | # CONFIG_BLK_DEV_COW_COMMON is not set | ||
| 578 | # CONFIG_BLK_DEV_LOOP is not set | ||
| 579 | # CONFIG_BLK_DEV_NBD is not set | ||
| 580 | # CONFIG_BLK_DEV_RAM is not set | ||
| 581 | # CONFIG_CDROM_PKTCDVD is not set | ||
| 582 | # CONFIG_ATA_OVER_ETH is not set | ||
| 583 | CONFIG_MISC_DEVICES=y | ||
| 584 | # CONFIG_EEPROM_93CX6 is not set | ||
| 585 | # CONFIG_IDE is not set | ||
| 586 | |||
| 587 | # | ||
| 588 | # SCSI device support | ||
| 589 | # | ||
| 590 | # CONFIG_RAID_ATTRS is not set | ||
| 591 | # CONFIG_SCSI is not set | ||
| 592 | # CONFIG_SCSI_DMA is not set | ||
| 593 | # CONFIG_SCSI_NETLINK is not set | ||
| 594 | # CONFIG_ATA is not set | ||
| 595 | # CONFIG_MD is not set | ||
| 596 | CONFIG_NETDEVICES=y | ||
| 597 | # CONFIG_NETDEVICES_MULTIQUEUE is not set | ||
| 598 | # CONFIG_DUMMY is not set | ||
| 599 | # CONFIG_BONDING is not set | ||
| 600 | # CONFIG_MACVLAN is not set | ||
| 601 | # CONFIG_EQUALIZER is not set | ||
| 602 | # CONFIG_TUN is not set | ||
| 603 | # CONFIG_VETH is not set | ||
| 604 | # CONFIG_NET_ETHERNET is not set | ||
| 605 | # CONFIG_NETDEV_1000 is not set | ||
| 606 | # CONFIG_NETDEV_10000 is not set | ||
| 607 | |||
| 608 | # | ||
| 609 | # Wireless LAN | ||
| 610 | # | ||
| 611 | CONFIG_NET_RADIO=y | ||
| 612 | # CONFIG_NET_WIRELESS_RTNETLINK is not set | ||
| 613 | # CONFIG_WLAN_PRE80211 is not set | ||
| 614 | # CONFIG_WLAN_80211 is not set | ||
| 615 | CONFIG_ACX=m | ||
| 616 | CONFIG_ACX_MEM=y | ||
| 617 | # CONFIG_ACX_CS is not set | ||
| 618 | # CONFIG_WAN is not set | ||
| 619 | CONFIG_PPP=m | ||
| 620 | # CONFIG_PPP_MULTILINK is not set | ||
| 621 | # CONFIG_PPP_FILTER is not set | ||
| 622 | CONFIG_PPP_ASYNC=m | ||
| 623 | # CONFIG_PPP_SYNC_TTY is not set | ||
| 624 | CONFIG_PPP_DEFLATE=m | ||
| 625 | CONFIG_PPP_BSDCOMP=m | ||
| 626 | CONFIG_PPP_MPPE=m | ||
| 627 | # CONFIG_PPPOE is not set | ||
| 628 | # CONFIG_PPPOL2TP is not set | ||
| 629 | # CONFIG_SLIP is not set | ||
| 630 | CONFIG_SLHC=m | ||
| 631 | # CONFIG_SHAPER is not set | ||
| 632 | # CONFIG_NETCONSOLE is not set | ||
| 633 | # CONFIG_NETPOLL is not set | ||
| 634 | # CONFIG_NET_POLL_CONTROLLER is not set | ||
| 635 | # CONFIG_ISDN is not set | ||
| 636 | |||
| 637 | # | ||
| 638 | # Input device support | ||
| 639 | # | ||
| 640 | CONFIG_INPUT=y | ||
| 641 | # CONFIG_INPUT_FF_MEMLESS is not set | ||
| 642 | # CONFIG_INPUT_POLLDEV is not set | ||
| 643 | |||
| 644 | # | ||
| 645 | # Userland interfaces | ||
| 646 | # | ||
| 647 | # CONFIG_INPUT_MOUSEDEV is not set | ||
| 648 | # CONFIG_INPUT_JOYDEV is not set | ||
| 649 | CONFIG_INPUT_EVDEV=y | ||
| 650 | # CONFIG_INPUT_EVBUG is not set | ||
| 651 | # CONFIG_INPUT_POWER is not set | ||
| 652 | |||
| 653 | # | ||
| 654 | # Input Device Drivers | ||
| 655 | # | ||
| 656 | CONFIG_INPUT_KEYBOARD=y | ||
| 657 | # CONFIG_KEYBOARD_ATKBD is not set | ||
| 658 | # CONFIG_KEYBOARD_SUNKBD is not set | ||
| 659 | # CONFIG_KEYBOARD_LKKBD is not set | ||
| 660 | # CONFIG_KEYBOARD_XTKBD is not set | ||
| 661 | # CONFIG_KEYBOARD_NEWTON is not set | ||
| 662 | # CONFIG_KEYBOARD_STOWAWAY is not set | ||
| 663 | CONFIG_KEYBOARD_GPIO=y | ||
| 664 | CONFIG_KEYBOARD_ASIC3=y | ||
| 665 | CONFIG_INPUT_MOUSE=y | ||
| 666 | # CONFIG_MOUSE_PS2 is not set | ||
| 667 | # CONFIG_MOUSE_SERIAL is not set | ||
| 668 | # CONFIG_MOUSE_APPLETOUCH is not set | ||
| 669 | # CONFIG_MOUSE_VSXXXAA is not set | ||
| 670 | # CONFIG_MOUSE_GPIO is not set | ||
| 671 | # CONFIG_INPUT_JOYSTICK is not set | ||
| 672 | # CONFIG_INPUT_TABLET is not set | ||
| 673 | CONFIG_INPUT_TOUCHSCREEN=y | ||
| 674 | # CONFIG_TOUCHSCREEN_FUJITSU is not set | ||
| 675 | # CONFIG_TOUCHSCREEN_GUNZE is not set | ||
| 676 | # CONFIG_TOUCHSCREEN_ELO is not set | ||
| 677 | # CONFIG_TOUCHSCREEN_MTOUCH is not set | ||
| 678 | # CONFIG_TOUCHSCREEN_MK712 is not set | ||
| 679 | # CONFIG_TOUCHSCREEN_PENMOUNT is not set | ||
| 680 | # CONFIG_TOUCHSCREEN_TOUCHRIGHT is not set | ||
| 681 | # CONFIG_TOUCHSCREEN_TOUCHWIN is not set | ||
| 682 | # CONFIG_TOUCHSCREEN_UCB1400 is not set | ||
| 683 | # CONFIG_TOUCHSCREEN_USB_COMPOSITE is not set | ||
| 684 | CONFIG_INPUT_MISC=y | ||
| 685 | # CONFIG_INPUT_ATI_REMOTE is not set | ||
| 686 | # CONFIG_INPUT_ATI_REMOTE2 is not set | ||
| 687 | # CONFIG_INPUT_KEYSPAN_REMOTE is not set | ||
| 688 | # CONFIG_INPUT_POWERMATE is not set | ||
| 689 | # CONFIG_INPUT_YEALINK is not set | ||
| 690 | CONFIG_INPUT_UINPUT=m | ||
| 691 | |||
| 692 | # | ||
| 693 | # Hardware I/O ports | ||
| 694 | # | ||
| 695 | # CONFIG_SERIO is not set | ||
| 696 | # CONFIG_GAMEPORT is not set | ||
| 697 | |||
| 698 | # | ||
| 699 | # Character devices | ||
| 700 | # | ||
| 701 | CONFIG_VT=y | ||
| 702 | CONFIG_VT_CONSOLE=y | ||
| 703 | CONFIG_HW_CONSOLE=y | ||
| 704 | # CONFIG_VT_HW_CONSOLE_BINDING is not set | ||
| 705 | # CONFIG_SERIAL_NONSTANDARD is not set | ||
| 706 | |||
| 707 | # | ||
| 708 | # Serial drivers | ||
| 709 | # | ||
| 710 | # CONFIG_SERIAL_8250 is not set | ||
| 711 | |||
| 712 | # | ||
| 713 | # Non-8250 serial port support | ||
| 714 | # | ||
| 715 | CONFIG_SERIAL_PXA=y | ||
| 716 | CONFIG_SERIAL_PXA_CONSOLE=y | ||
| 717 | CONFIG_SERIAL_CORE=y | ||
| 718 | CONFIG_SERIAL_CORE_CONSOLE=y | ||
| 719 | CONFIG_UNIX98_PTYS=y | ||
| 720 | CONFIG_LEGACY_PTYS=y | ||
| 721 | CONFIG_LEGACY_PTY_COUNT=32 | ||
| 722 | # CONFIG_IPMI_HANDLER is not set | ||
| 723 | # CONFIG_HW_RANDOM is not set | ||
| 724 | # CONFIG_NVRAM is not set | ||
| 725 | # CONFIG_R3964 is not set | ||
| 726 | # CONFIG_RAW_DRIVER is not set | ||
| 727 | # CONFIG_TCG_TPM is not set | ||
| 728 | CONFIG_I2C=m | ||
| 729 | CONFIG_I2C_BOARDINFO=y | ||
| 730 | # CONFIG_I2C_CHARDEV is not set | ||
| 731 | |||
| 732 | # | ||
| 733 | # I2C Algorithms | ||
| 734 | # | ||
| 735 | # CONFIG_I2C_ALGOBIT is not set | ||
| 736 | # CONFIG_I2C_ALGOPCF is not set | ||
| 737 | # CONFIG_I2C_ALGOPCA is not set | ||
| 738 | |||
| 739 | # | ||
| 740 | # I2C Hardware Bus support | ||
| 741 | # | ||
| 742 | # CONFIG_I2C_GPIO is not set | ||
| 743 | CONFIG_I2C_PXA=m | ||
| 744 | # CONFIG_I2C_PXA_SLAVE is not set | ||
| 745 | # CONFIG_I2C_OCORES is not set | ||
| 746 | # CONFIG_I2C_PARPORT_LIGHT is not set | ||
| 747 | # CONFIG_I2C_SIMTEC is not set | ||
| 748 | # CONFIG_I2C_TAOS_EVM is not set | ||
| 749 | # CONFIG_I2C_STUB is not set | ||
| 750 | |||
| 751 | # | ||
| 752 | # Miscellaneous I2C Chip support | ||
| 753 | # | ||
| 754 | # CONFIG_SENSORS_DS1337 is not set | ||
| 755 | # CONFIG_SENSORS_DS1374 is not set | ||
| 756 | # CONFIG_DS1682 is not set | ||
| 757 | # CONFIG_SENSORS_EEPROM is not set | ||
| 758 | # CONFIG_SENSORS_PCF8574 is not set | ||
| 759 | # CONFIG_SENSORS_PCA9539 is not set | ||
| 760 | # CONFIG_SENSORS_PCF8591 is not set | ||
| 761 | # CONFIG_SENSORS_MAX6875 is not set | ||
| 762 | # CONFIG_SENSORS_TSL2550 is not set | ||
| 763 | # CONFIG_I2C_DEBUG_CORE is not set | ||
| 764 | # CONFIG_I2C_DEBUG_ALGO is not set | ||
| 765 | # CONFIG_I2C_DEBUG_BUS is not set | ||
| 766 | # CONFIG_I2C_DEBUG_CHIP is not set | ||
| 767 | |||
| 768 | # | ||
| 769 | # SPI support | ||
| 770 | # | ||
| 771 | # CONFIG_SPI is not set | ||
| 772 | # CONFIG_SPI_MASTER is not set | ||
| 773 | CONFIG_W1=y | ||
| 774 | |||
| 775 | # | ||
| 776 | # 1-wire Bus Masters | ||
| 777 | # | ||
| 778 | # CONFIG_W1_MASTER_DS2482 is not set | ||
| 779 | CONFIG_W1_MASTER_DS1WM=y | ||
| 780 | |||
| 781 | # | ||
| 782 | # 1-wire Slaves | ||
| 783 | # | ||
| 784 | # CONFIG_W1_SLAVE_THERM is not set | ||
| 785 | # CONFIG_W1_SLAVE_SMEM is not set | ||
| 786 | # CONFIG_W1_SLAVE_DS2433 is not set | ||
| 787 | CONFIG_W1_SLAVE_DS2760=y | ||
| 788 | CONFIG_POWER_SUPPLY=y | ||
| 789 | # CONFIG_POWER_SUPPLY_DEBUG is not set | ||
| 790 | CONFIG_PDA_POWER=y | ||
| 791 | CONFIG_APM_POWER=y | ||
| 792 | CONFIG_BATTERY_DS2760=y | ||
| 793 | # CONFIG_HWMON is not set | ||
| 794 | # CONFIG_WATCHDOG is not set | ||
| 795 | |||
| 796 | # | ||
| 797 | # Sonics Silicon Backplane | ||
| 798 | # | ||
| 799 | CONFIG_SSB_POSSIBLE=y | ||
| 800 | # CONFIG_SSB is not set | ||
| 801 | |||
| 802 | # | ||
| 803 | # Multifunction device drivers | ||
| 804 | # | ||
| 805 | # CONFIG_MFD_SM501 is not set | ||
| 806 | CONFIG_HTC_ASIC3=y | ||
| 807 | CONFIG_HTC_ASIC3_DS1WM=y | ||
| 808 | |||
| 809 | # | ||
| 810 | # Multimedia devices | ||
| 811 | # | ||
| 812 | # CONFIG_VIDEO_DEV is not set | ||
| 813 | # CONFIG_DVB_CORE is not set | ||
| 814 | CONFIG_DAB=y | ||
| 815 | |||
| 816 | # | ||
| 817 | # Graphics support | ||
| 818 | # | ||
| 819 | # CONFIG_VGASTATE is not set | ||
| 820 | CONFIG_VIDEO_OUTPUT_CONTROL=m | ||
| 821 | CONFIG_FB=y | ||
| 822 | # CONFIG_FIRMWARE_EDID is not set | ||
| 823 | # CONFIG_FB_DDC is not set | ||
| 824 | CONFIG_FB_CFB_FILLRECT=y | ||
| 825 | CONFIG_FB_CFB_COPYAREA=y | ||
| 826 | CONFIG_FB_CFB_IMAGEBLIT=y | ||
| 827 | # CONFIG_FB_CFB_REV_PIXELS_IN_BYTE is not set | ||
| 828 | # CONFIG_FB_SYS_FILLRECT is not set | ||
| 829 | # CONFIG_FB_SYS_COPYAREA is not set | ||
| 830 | # CONFIG_FB_SYS_IMAGEBLIT is not set | ||
| 831 | # CONFIG_FB_SYS_FOPS is not set | ||
| 832 | # CONFIG_FB_DEFERRED_IO is not set | ||
| 833 | # CONFIG_FB_SVGALIB is not set | ||
| 834 | # CONFIG_FB_MACMODES is not set | ||
| 835 | # CONFIG_FB_BACKLIGHT is not set | ||
| 836 | # CONFIG_FB_MODE_HELPERS is not set | ||
| 837 | # CONFIG_FB_TILEBLITTING is not set | ||
| 838 | |||
| 839 | # | ||
| 840 | # Frame buffer hardware drivers | ||
| 841 | # | ||
| 842 | # CONFIG_FB_S1D13XXX is not set | ||
| 843 | CONFIG_FB_PXA=y | ||
| 844 | CONFIG_FB_PXA_LCD_QVGA=y | ||
| 845 | # CONFIG_FB_PXA_LCD_VGA is not set | ||
| 846 | # CONFIG_FB_PXA_OVERLAY is not set | ||
| 847 | # CONFIG_FB_PXA_PARAMETERS is not set | ||
| 848 | # CONFIG_FB_MBX is not set | ||
| 849 | # CONFIG_FB_VIRTUAL is not set | ||
| 850 | CONFIG_BACKLIGHT_LCD_SUPPORT=y | ||
| 851 | CONFIG_LCD_CLASS_DEVICE=y | ||
| 852 | CONFIG_BACKLIGHT_CLASS_DEVICE=y | ||
| 853 | CONFIG_BACKLIGHT_CORGI=y | ||
| 854 | |||
| 855 | # | ||
| 856 | # Display device support | ||
| 857 | # | ||
| 858 | # CONFIG_DISPLAY_SUPPORT is not set | ||
| 859 | |||
| 860 | # | ||
| 861 | # Console display driver support | ||
| 862 | # | ||
| 863 | # CONFIG_VGA_CONSOLE is not set | ||
| 864 | CONFIG_DUMMY_CONSOLE=y | ||
| 865 | CONFIG_FRAMEBUFFER_CONSOLE=y | ||
| 866 | # CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY is not set | ||
| 867 | CONFIG_FRAMEBUFFER_CONSOLE_ROTATION=y | ||
| 868 | CONFIG_FONTS=y | ||
| 869 | CONFIG_FONT_8x8=y | ||
| 870 | # CONFIG_FONT_8x16 is not set | ||
| 871 | # CONFIG_FONT_6x11 is not set | ||
| 872 | # CONFIG_FONT_7x14 is not set | ||
| 873 | # CONFIG_FONT_PEARL_8x8 is not set | ||
| 874 | # CONFIG_FONT_ACORN_8x8 is not set | ||
| 875 | # CONFIG_FONT_MINI_4x6 is not set | ||
| 876 | # CONFIG_FONT_SUN8x16 is not set | ||
| 877 | # CONFIG_FONT_SUN12x22 is not set | ||
| 878 | # CONFIG_FONT_10x18 is not set | ||
| 879 | CONFIG_LOGO=y | ||
| 880 | # CONFIG_LOGO_LINUX_MONO is not set | ||
| 881 | # CONFIG_LOGO_LINUX_VGA16 is not set | ||
| 882 | # CONFIG_LOGO_LINUX_CLUT224 is not set | ||
| 883 | CONFIG_LOGO_OHAND_CLUT224=y | ||
| 884 | |||
| 885 | # | ||
| 886 | # Sound | ||
| 887 | # | ||
| 888 | CONFIG_SOUND=y | ||
| 889 | |||
| 890 | # | ||
| 891 | # Advanced Linux Sound Architecture | ||
| 892 | # | ||
| 893 | CONFIG_SND=y | ||
| 894 | CONFIG_SND_TIMER=y | ||
| 895 | CONFIG_SND_PCM=y | ||
| 896 | # CONFIG_SND_SEQUENCER is not set | ||
| 897 | CONFIG_SND_OSSEMUL=y | ||
| 898 | CONFIG_SND_MIXER_OSS=y | ||
| 899 | CONFIG_SND_PCM_OSS=y | ||
| 900 | CONFIG_SND_PCM_OSS_PLUGINS=y | ||
| 901 | # CONFIG_SND_DYNAMIC_MINORS is not set | ||
| 902 | CONFIG_SND_SUPPORT_OLD_API=y | ||
| 903 | CONFIG_SND_VERBOSE_PROCFS=y | ||
| 904 | # CONFIG_SND_VERBOSE_PRINTK is not set | ||
| 905 | # CONFIG_SND_DEBUG is not set | ||
| 906 | |||
| 907 | # | ||
| 908 | # Generic devices | ||
| 909 | # | ||
| 910 | # CONFIG_SND_DUMMY is not set | ||
| 911 | # CONFIG_SND_MTPAV is not set | ||
| 912 | # CONFIG_SND_SERIAL_U16550 is not set | ||
| 913 | # CONFIG_SND_MPU401 is not set | ||
| 914 | |||
| 915 | # | ||
| 916 | # ALSA ARM devices | ||
| 917 | # | ||
| 918 | # CONFIG_SND_PXA2XX_AC97 is not set | ||
| 919 | |||
| 920 | # | ||
| 921 | # System on Chip audio support | ||
| 922 | # | ||
| 923 | # CONFIG_SND_SOC is not set | ||
| 924 | |||
| 925 | # | ||
| 926 | # SoC Audio support for SuperH | ||
| 927 | # | ||
| 928 | |||
| 929 | # | ||
| 930 | # Open Sound System | ||
| 931 | # | ||
| 932 | # CONFIG_SOUND_PRIME is not set | ||
| 933 | CONFIG_HID_SUPPORT=y | ||
| 934 | CONFIG_HID=m | ||
| 935 | # CONFIG_HID_DEBUG is not set | ||
| 936 | # CONFIG_HIDRAW is not set | ||
| 937 | CONFIG_USB_SUPPORT=y | ||
| 938 | CONFIG_USB_ARCH_HAS_HCD=y | ||
| 939 | CONFIG_USB_ARCH_HAS_OHCI=y | ||
| 940 | # CONFIG_USB_ARCH_HAS_EHCI is not set | ||
| 941 | # CONFIG_USB is not set | ||
| 942 | |||
| 943 | # | ||
| 944 | # NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' | ||
| 945 | # | ||
| 946 | |||
| 947 | # | ||
| 948 | # USB Gadget Support | ||
| 949 | # | ||
| 950 | CONFIG_USB_GADGET=y | ||
| 951 | # CONFIG_USB_GADGET_DEBUG is not set | ||
| 952 | # CONFIG_USB_GADGET_DEBUG_FILES is not set | ||
| 953 | CONFIG_USB_GADGET_SELECTED=y | ||
| 954 | # CONFIG_USB_GADGET_AMD5536UDC is not set | ||
| 955 | # CONFIG_USB_GADGET_ATMEL_USBA is not set | ||
| 956 | # CONFIG_USB_GADGET_FSL_USB2 is not set | ||
| 957 | # CONFIG_USB_GADGET_NET2280 is not set | ||
| 958 | CONFIG_USB_GADGET_PXA2XX=y | ||
| 959 | CONFIG_USB_PXA2XX=y | ||
| 960 | # CONFIG_USB_PXA2XX_SMALL is not set | ||
| 961 | # CONFIG_USB_GADGET_M66592 is not set | ||
| 962 | # CONFIG_USB_GADGET_PXA27X is not set | ||
| 963 | # CONFIG_USB_GADGET_GOKU is not set | ||
| 964 | # CONFIG_USB_GADGET_LH7A40X is not set | ||
| 965 | # CONFIG_USB_GADGET_OMAP is not set | ||
| 966 | # CONFIG_USB_GADGET_S3C2410 is not set | ||
| 967 | # CONFIG_USB_GADGET_AT91 is not set | ||
| 968 | # CONFIG_USB_GADGET_DUMMY_HCD is not set | ||
| 969 | # CONFIG_USB_GADGET_DUALSPEED is not set | ||
| 970 | # CONFIG_USB_ZERO is not set | ||
| 971 | CONFIG_USB_ETH=y | ||
| 972 | CONFIG_USB_ETH_RNDIS=y | ||
| 973 | # CONFIG_USB_GADGETFS is not set | ||
| 974 | # CONFIG_USB_FILE_STORAGE is not set | ||
| 975 | # CONFIG_USB_G_SERIAL is not set | ||
| 976 | # CONFIG_USB_MIDI_GADGET is not set | ||
| 977 | CONFIG_MMC=y | ||
| 978 | # CONFIG_MMC_DEBUG is not set | ||
| 979 | CONFIG_MMC_UNSAFE_RESUME=y | ||
| 980 | |||
| 981 | # | ||
| 982 | # MMC/SD Card Drivers | ||
| 983 | # | ||
| 984 | CONFIG_MMC_BLOCK=y | ||
| 985 | CONFIG_MMC_BLOCK_BOUNCE=y | ||
| 986 | # CONFIG_SDIO_UART is not set | ||
| 987 | |||
| 988 | # | ||
| 989 | # MMC/SD Host Controller Drivers | ||
| 990 | # | ||
| 991 | # CONFIG_MMC_PXA is not set | ||
| 992 | CONFIG_MMC_ASIC3=y | ||
| 993 | CONFIG_NEW_LEDS=y | ||
| 994 | CONFIG_LEDS_CLASS=y | ||
| 995 | |||
| 996 | # | ||
| 997 | # LED drivers | ||
| 998 | # | ||
| 999 | # CONFIG_LEDS_GPIO is not set | ||
| 1000 | CONFIG_LEDS_ASIC3=y | ||
| 1001 | |||
| 1002 | # | ||
| 1003 | # LED Triggers | ||
| 1004 | # | ||
| 1005 | CONFIG_LEDS_TRIGGERS=y | ||
| 1006 | CONFIG_LEDS_TRIGGER_TIMER=y | ||
| 1007 | # CONFIG_LEDS_TRIGGER_HEARTBEAT is not set | ||
| 1008 | CONFIG_RTC_LIB=y | ||
| 1009 | CONFIG_RTC_CLASS=y | ||
| 1010 | CONFIG_RTC_HCTOSYS=y | ||
| 1011 | CONFIG_RTC_HCTOSYS_DEVICE="rtc0" | ||
| 1012 | CONFIG_RTC_DEBUG=y | ||
| 1013 | |||
| 1014 | # | ||
| 1015 | # RTC interfaces | ||
| 1016 | # | ||
| 1017 | CONFIG_RTC_INTF_SYSFS=y | ||
| 1018 | CONFIG_RTC_INTF_PROC=y | ||
| 1019 | CONFIG_RTC_INTF_DEV=y | ||
| 1020 | # CONFIG_RTC_INTF_DEV_UIE_EMUL is not set | ||
| 1021 | # CONFIG_RTC_DRV_TEST is not set | ||
| 1022 | |||
| 1023 | # | ||
| 1024 | # I2C RTC drivers | ||
| 1025 | # | ||
| 1026 | # CONFIG_RTC_DRV_DS1307 is not set | ||
| 1027 | # CONFIG_RTC_DRV_DS1374 is not set | ||
| 1028 | # CONFIG_RTC_DRV_DS1672 is not set | ||
| 1029 | # CONFIG_RTC_DRV_MAX6900 is not set | ||
| 1030 | # CONFIG_RTC_DRV_RS5C372 is not set | ||
| 1031 | # CONFIG_RTC_DRV_ISL1208 is not set | ||
| 1032 | # CONFIG_RTC_DRV_X1205 is not set | ||
| 1033 | # CONFIG_RTC_DRV_PCF8563 is not set | ||
| 1034 | # CONFIG_RTC_DRV_PCF8583 is not set | ||
| 1035 | # CONFIG_RTC_DRV_M41T80 is not set | ||
| 1036 | |||
| 1037 | # | ||
| 1038 | # SPI RTC drivers | ||
| 1039 | # | ||
| 1040 | |||
| 1041 | # | ||
| 1042 | # Platform RTC drivers | ||
| 1043 | # | ||
| 1044 | # CONFIG_RTC_DRV_CMOS is not set | ||
| 1045 | # CONFIG_RTC_DRV_DS1553 is not set | ||
| 1046 | # CONFIG_RTC_DRV_STK17TA8 is not set | ||
| 1047 | # CONFIG_RTC_DRV_DS1742 is not set | ||
| 1048 | # CONFIG_RTC_DRV_M48T86 is not set | ||
| 1049 | # CONFIG_RTC_DRV_M48T59 is not set | ||
| 1050 | # CONFIG_RTC_DRV_V3020 is not set | ||
| 1051 | |||
| 1052 | # | ||
| 1053 | # on-CPU RTC drivers | ||
| 1054 | # | ||
| 1055 | CONFIG_RTC_DRV_SA1100=y | ||
| 1056 | |||
| 1057 | # | ||
| 1058 | # File systems | ||
| 1059 | # | ||
| 1060 | CONFIG_EXT2_FS=y | ||
| 1061 | # CONFIG_EXT2_FS_XATTR is not set | ||
| 1062 | # CONFIG_EXT2_FS_XIP is not set | ||
| 1063 | CONFIG_EXT3_FS=y | ||
| 1064 | # CONFIG_EXT3_FS_XATTR is not set | ||
| 1065 | # CONFIG_EXT4DEV_FS is not set | ||
| 1066 | CONFIG_JBD=y | ||
| 1067 | # CONFIG_REISERFS_FS is not set | ||
| 1068 | # CONFIG_JFS_FS is not set | ||
| 1069 | # CONFIG_FS_POSIX_ACL is not set | ||
| 1070 | # CONFIG_XFS_FS is not set | ||
| 1071 | # CONFIG_GFS2_FS is not set | ||
| 1072 | # CONFIG_OCFS2_FS is not set | ||
| 1073 | # CONFIG_MINIX_FS is not set | ||
| 1074 | # CONFIG_ROMFS_FS is not set | ||
| 1075 | CONFIG_INOTIFY=y | ||
| 1076 | CONFIG_INOTIFY_USER=y | ||
| 1077 | # CONFIG_QUOTA is not set | ||
| 1078 | CONFIG_DNOTIFY=y | ||
| 1079 | # CONFIG_AUTOFS_FS is not set | ||
| 1080 | # CONFIG_AUTOFS4_FS is not set | ||
| 1081 | # CONFIG_FUSE_FS is not set | ||
| 1082 | |||
| 1083 | # | ||
| 1084 | # CD-ROM/DVD Filesystems | ||
| 1085 | # | ||
| 1086 | # CONFIG_ISO9660_FS is not set | ||
| 1087 | # CONFIG_UDF_FS is not set | ||
| 1088 | |||
| 1089 | # | ||
| 1090 | # DOS/FAT/NT Filesystems | ||
| 1091 | # | ||
| 1092 | CONFIG_FAT_FS=y | ||
| 1093 | CONFIG_MSDOS_FS=y | ||
| 1094 | CONFIG_VFAT_FS=y | ||
| 1095 | CONFIG_FAT_DEFAULT_CODEPAGE=437 | ||
| 1096 | CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" | ||
| 1097 | # CONFIG_NTFS_FS is not set | ||
| 1098 | |||
| 1099 | # | ||
| 1100 | # Pseudo filesystems | ||
| 1101 | # | ||
| 1102 | CONFIG_PROC_FS=y | ||
| 1103 | CONFIG_PROC_SYSCTL=y | ||
| 1104 | CONFIG_SYSFS=y | ||
| 1105 | CONFIG_TMPFS=y | ||
| 1106 | # CONFIG_TMPFS_POSIX_ACL is not set | ||
| 1107 | # CONFIG_HUGETLB_PAGE is not set | ||
| 1108 | # CONFIG_CONFIGFS_FS is not set | ||
| 1109 | |||
| 1110 | # | ||
| 1111 | # Miscellaneous filesystems | ||
| 1112 | # | ||
| 1113 | # CONFIG_ADFS_FS is not set | ||
| 1114 | # CONFIG_AFFS_FS is not set | ||
| 1115 | # CONFIG_HFS_FS is not set | ||
| 1116 | # CONFIG_HFSPLUS_FS is not set | ||
| 1117 | # CONFIG_BEFS_FS is not set | ||
| 1118 | # CONFIG_BFS_FS is not set | ||
| 1119 | # CONFIG_EFS_FS is not set | ||
| 1120 | # CONFIG_JFFS2_FS is not set | ||
| 1121 | # CONFIG_CRAMFS is not set | ||
| 1122 | # CONFIG_SQUASHFS is not set | ||
| 1123 | # CONFIG_VXFS_FS is not set | ||
| 1124 | # CONFIG_HPFS_FS is not set | ||
| 1125 | # CONFIG_QNX4FS_FS is not set | ||
| 1126 | # CONFIG_SYSV_FS is not set | ||
| 1127 | # CONFIG_UFS_FS is not set | ||
| 1128 | CONFIG_NETWORK_FILESYSTEMS=y | ||
| 1129 | CONFIG_NFS_FS=y | ||
| 1130 | CONFIG_NFS_V3=y | ||
| 1131 | # CONFIG_NFS_V3_ACL is not set | ||
| 1132 | # CONFIG_NFS_V4 is not set | ||
| 1133 | # CONFIG_NFS_DIRECTIO is not set | ||
| 1134 | # CONFIG_NFSD is not set | ||
| 1135 | CONFIG_ROOT_NFS=y | ||
| 1136 | CONFIG_LOCKD=y | ||
| 1137 | CONFIG_LOCKD_V4=y | ||
| 1138 | CONFIG_NFS_COMMON=y | ||
| 1139 | CONFIG_SUNRPC=y | ||
| 1140 | # CONFIG_SUNRPC_BIND34 is not set | ||
| 1141 | # CONFIG_RPCSEC_GSS_KRB5 is not set | ||
| 1142 | # CONFIG_RPCSEC_GSS_SPKM3 is not set | ||
| 1143 | # CONFIG_SMB_FS is not set | ||
| 1144 | # CONFIG_CIFS is not set | ||
| 1145 | # CONFIG_NCP_FS is not set | ||
| 1146 | # CONFIG_CODA_FS is not set | ||
| 1147 | # CONFIG_AFS_FS is not set | ||
| 1148 | |||
| 1149 | # | ||
| 1150 | # Partition Types | ||
| 1151 | # | ||
| 1152 | # CONFIG_PARTITION_ADVANCED is not set | ||
| 1153 | CONFIG_MSDOS_PARTITION=y | ||
| 1154 | CONFIG_NLS=y | ||
| 1155 | CONFIG_NLS_DEFAULT="iso8859-1" | ||
| 1156 | CONFIG_NLS_CODEPAGE_437=y | ||
| 1157 | # CONFIG_NLS_CODEPAGE_737 is not set | ||
| 1158 | # CONFIG_NLS_CODEPAGE_775 is not set | ||
| 1159 | # CONFIG_NLS_CODEPAGE_850 is not set | ||
| 1160 | # CONFIG_NLS_CODEPAGE_852 is not set | ||
| 1161 | # CONFIG_NLS_CODEPAGE_855 is not set | ||
| 1162 | # CONFIG_NLS_CODEPAGE_857 is not set | ||
| 1163 | # CONFIG_NLS_CODEPAGE_860 is not set | ||
| 1164 | # CONFIG_NLS_CODEPAGE_861 is not set | ||
| 1165 | # CONFIG_NLS_CODEPAGE_862 is not set | ||
| 1166 | # CONFIG_NLS_CODEPAGE_863 is not set | ||
| 1167 | # CONFIG_NLS_CODEPAGE_864 is not set | ||
| 1168 | # CONFIG_NLS_CODEPAGE_865 is not set | ||
| 1169 | # CONFIG_NLS_CODEPAGE_866 is not set | ||
| 1170 | # CONFIG_NLS_CODEPAGE_869 is not set | ||
| 1171 | # CONFIG_NLS_CODEPAGE_936 is not set | ||
| 1172 | # CONFIG_NLS_CODEPAGE_950 is not set | ||
| 1173 | # CONFIG_NLS_CODEPAGE_932 is not set | ||
| 1174 | # CONFIG_NLS_CODEPAGE_949 is not set | ||
| 1175 | # CONFIG_NLS_CODEPAGE_874 is not set | ||
| 1176 | # CONFIG_NLS_ISO8859_8 is not set | ||
| 1177 | CONFIG_NLS_CODEPAGE_1250=y | ||
| 1178 | CONFIG_NLS_CODEPAGE_1251=y | ||
| 1179 | # CONFIG_NLS_ASCII is not set | ||
| 1180 | CONFIG_NLS_ISO8859_1=y | ||
| 1181 | # CONFIG_NLS_ISO8859_2 is not set | ||
| 1182 | # CONFIG_NLS_ISO8859_3 is not set | ||
| 1183 | # CONFIG_NLS_ISO8859_4 is not set | ||
| 1184 | # CONFIG_NLS_ISO8859_5 is not set | ||
| 1185 | # CONFIG_NLS_ISO8859_6 is not set | ||
| 1186 | # CONFIG_NLS_ISO8859_7 is not set | ||
| 1187 | # CONFIG_NLS_ISO8859_9 is not set | ||
| 1188 | # CONFIG_NLS_ISO8859_13 is not set | ||
| 1189 | # CONFIG_NLS_ISO8859_14 is not set | ||
| 1190 | # CONFIG_NLS_ISO8859_15 is not set | ||
| 1191 | # CONFIG_NLS_KOI8_R is not set | ||
| 1192 | # CONFIG_NLS_KOI8_U is not set | ||
| 1193 | CONFIG_NLS_UTF8=y | ||
| 1194 | # CONFIG_DLM is not set | ||
| 1195 | CONFIG_INSTRUMENTATION=y | ||
| 1196 | # CONFIG_PROFILING is not set | ||
| 1197 | # CONFIG_MARKERS is not set | ||
| 1198 | |||
| 1199 | # | ||
| 1200 | # Kernel hacking | ||
| 1201 | # | ||
| 1202 | CONFIG_PRINTK_TIME=y | ||
| 1203 | CONFIG_ENABLE_WARN_DEPRECATED=y | ||
| 1204 | CONFIG_ENABLE_MUST_CHECK=y | ||
| 1205 | # CONFIG_MAGIC_SYSRQ is not set | ||
| 1206 | # CONFIG_UNUSED_SYMBOLS is not set | ||
| 1207 | # CONFIG_DEBUG_FS is not set | ||
| 1208 | # CONFIG_HEADERS_CHECK is not set | ||
| 1209 | CONFIG_DEBUG_KERNEL=y | ||
| 1210 | # CONFIG_DEBUG_SHIRQ is not set | ||
| 1211 | CONFIG_DETECT_SOFTLOCKUP=y | ||
| 1212 | CONFIG_SCHED_DEBUG=y | ||
| 1213 | # CONFIG_SCHEDSTATS is not set | ||
| 1214 | # CONFIG_TIMER_STATS is not set | ||
| 1215 | # CONFIG_DEBUG_SLAB is not set | ||
| 1216 | CONFIG_DEBUG_PREEMPT=y | ||
| 1217 | # CONFIG_DEBUG_RT_MUTEXES is not set | ||
| 1218 | # CONFIG_RT_MUTEX_TESTER is not set | ||
| 1219 | # CONFIG_DEBUG_SPINLOCK is not set | ||
| 1220 | CONFIG_DEBUG_MUTEXES=y | ||
| 1221 | # CONFIG_DEBUG_LOCK_ALLOC is not set | ||
| 1222 | # CONFIG_PROVE_LOCKING is not set | ||
| 1223 | # CONFIG_LOCK_STAT is not set | ||
| 1224 | # CONFIG_DEBUG_SPINLOCK_SLEEP is not set | ||
| 1225 | # CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set | ||
| 1226 | # CONFIG_DEBUG_KOBJECT is not set | ||
| 1227 | CONFIG_DEBUG_BUGVERBOSE=y | ||
| 1228 | # CONFIG_DEBUG_INFO is not set | ||
| 1229 | CONFIG_DEBUG_VM=y | ||
| 1230 | # CONFIG_DEBUG_LIST is not set | ||
| 1231 | # CONFIG_DEBUG_SG is not set | ||
| 1232 | CONFIG_FRAME_POINTER=y | ||
| 1233 | CONFIG_FORCED_INLINING=y | ||
| 1234 | # CONFIG_BOOT_PRINTK_DELAY is not set | ||
| 1235 | # CONFIG_RCU_TORTURE_TEST is not set | ||
| 1236 | # CONFIG_FAULT_INJECTION is not set | ||
| 1237 | # CONFIG_SAMPLES is not set | ||
| 1238 | CONFIG_DEBUG_USER=y | ||
| 1239 | CONFIG_DEBUG_ERRORS=y | ||
| 1240 | CONFIG_DEBUG_LL=y | ||
| 1241 | # CONFIG_DEBUG_ICEDCC is not set | ||
| 1242 | |||
| 1243 | # | ||
| 1244 | # Security options | ||
| 1245 | # | ||
| 1246 | # CONFIG_KEYS is not set | ||
| 1247 | # CONFIG_SECURITY is not set | ||
| 1248 | # CONFIG_SECURITY_FILE_CAPABILITIES is not set | ||
| 1249 | CONFIG_CRYPTO=y | ||
| 1250 | CONFIG_CRYPTO_ALGAPI=y | ||
| 1251 | CONFIG_CRYPTO_BLKCIPHER=m | ||
| 1252 | CONFIG_CRYPTO_HASH=y | ||
| 1253 | CONFIG_CRYPTO_MANAGER=y | ||
| 1254 | CONFIG_CRYPTO_HMAC=y | ||
| 1255 | # CONFIG_CRYPTO_XCBC is not set | ||
| 1256 | # CONFIG_CRYPTO_NULL is not set | ||
| 1257 | # CONFIG_CRYPTO_MD4 is not set | ||
| 1258 | CONFIG_CRYPTO_MD5=y | ||
| 1259 | CONFIG_CRYPTO_SHA1=y | ||
| 1260 | # CONFIG_CRYPTO_SHA256 is not set | ||
| 1261 | # CONFIG_CRYPTO_SHA512 is not set | ||
| 1262 | # CONFIG_CRYPTO_WP512 is not set | ||
| 1263 | # CONFIG_CRYPTO_TGR192 is not set | ||
| 1264 | # CONFIG_CRYPTO_GF128MUL is not set | ||
| 1265 | CONFIG_CRYPTO_ECB=m | ||
| 1266 | # CONFIG_CRYPTO_CBC is not set | ||
| 1267 | CONFIG_CRYPTO_PCBC=m | ||
| 1268 | # CONFIG_CRYPTO_LRW is not set | ||
| 1269 | # CONFIG_CRYPTO_XTS is not set | ||
| 1270 | # CONFIG_CRYPTO_CRYPTD is not set | ||
| 1271 | CONFIG_CRYPTO_DES=y | ||
| 1272 | # CONFIG_CRYPTO_FCRYPT is not set | ||
| 1273 | # CONFIG_CRYPTO_BLOWFISH is not set | ||
| 1274 | # CONFIG_CRYPTO_TWOFISH is not set | ||
| 1275 | # CONFIG_CRYPTO_SERPENT is not set | ||
| 1276 | # CONFIG_CRYPTO_AES is not set | ||
| 1277 | # CONFIG_CRYPTO_CAST5 is not set | ||
| 1278 | # CONFIG_CRYPTO_CAST6 is not set | ||
| 1279 | # CONFIG_CRYPTO_TEA is not set | ||
| 1280 | CONFIG_CRYPTO_ARC4=m | ||
| 1281 | # CONFIG_CRYPTO_KHAZAD is not set | ||
| 1282 | # CONFIG_CRYPTO_ANUBIS is not set | ||
| 1283 | # CONFIG_CRYPTO_SEED is not set | ||
| 1284 | CONFIG_CRYPTO_DEFLATE=y | ||
| 1285 | # CONFIG_CRYPTO_LZO is not set | ||
| 1286 | # CONFIG_CRYPTO_MICHAEL_MIC is not set | ||
| 1287 | # CONFIG_CRYPTO_CRC32C is not set | ||
| 1288 | # CONFIG_CRYPTO_CAMELLIA is not set | ||
| 1289 | # CONFIG_CRYPTO_TEST is not set | ||
| 1290 | # CONFIG_CRYPTO_AUTHENC is not set | ||
| 1291 | CONFIG_CRYPTO_HW=y | ||
| 1292 | |||
| 1293 | # | ||
| 1294 | # Library routines | ||
| 1295 | # | ||
| 1296 | CONFIG_BITREVERSE=y | ||
| 1297 | CONFIG_CRC_CCITT=y | ||
| 1298 | # CONFIG_CRC16 is not set | ||
| 1299 | # CONFIG_CRC_ITU_T is not set | ||
| 1300 | CONFIG_CRC32=y | ||
| 1301 | # CONFIG_CRC7 is not set | ||
| 1302 | # CONFIG_LIBCRC32C is not set | ||
| 1303 | CONFIG_ZLIB_INFLATE=y | ||
| 1304 | CONFIG_ZLIB_DEFLATE=y | ||
| 1305 | CONFIG_PLIST=y | ||
| 1306 | CONFIG_HAS_IOMEM=y | ||
| 1307 | CONFIG_HAS_IOPORT=y | ||
| 1308 | CONFIG_HAS_DMA=y | ||
diff --git a/meta/packages/linux/linux-rp-2.6.25+2.6.26-rc4/defconfig-hx2000 b/meta/packages/linux/linux-rp-2.6.25+2.6.26-rc4/defconfig-hx2000 new file mode 100644 index 0000000000..0f2557c0f7 --- /dev/null +++ b/meta/packages/linux/linux-rp-2.6.25+2.6.26-rc4/defconfig-hx2000 | |||
| @@ -0,0 +1,1733 @@ | |||
| 1 | # | ||
| 2 | # Automatically generated make config: don't edit | ||
| 3 | # Linux kernel version: 2.6.24-rc8 | ||
| 4 | # Sun Jan 20 18:10:53 2008 | ||
| 5 | # | ||
| 6 | CONFIG_ARM=y | ||
| 7 | CONFIG_SYS_SUPPORTS_APM_EMULATION=y | ||
| 8 | CONFIG_GENERIC_GPIO=y | ||
| 9 | CONFIG_GENERIC_TIME=y | ||
| 10 | CONFIG_GENERIC_CLOCKEVENTS=y | ||
| 11 | CONFIG_MMU=y | ||
| 12 | # CONFIG_NO_IOPORT is not set | ||
| 13 | CONFIG_GENERIC_HARDIRQS=y | ||
| 14 | CONFIG_STACKTRACE_SUPPORT=y | ||
| 15 | CONFIG_LOCKDEP_SUPPORT=y | ||
| 16 | CONFIG_TRACE_IRQFLAGS_SUPPORT=y | ||
| 17 | CONFIG_HARDIRQS_SW_RESEND=y | ||
| 18 | CONFIG_GENERIC_IRQ_PROBE=y | ||
| 19 | CONFIG_RWSEM_GENERIC_SPINLOCK=y | ||
| 20 | # CONFIG_ARCH_HAS_ILOG2_U32 is not set | ||
| 21 | # CONFIG_ARCH_HAS_ILOG2_U64 is not set | ||
| 22 | CONFIG_GENERIC_HWEIGHT=y | ||
| 23 | CONFIG_GENERIC_CALIBRATE_DELAY=y | ||
| 24 | CONFIG_ZONE_DMA=y | ||
| 25 | CONFIG_ARCH_MTD_XIP=y | ||
| 26 | CONFIG_VECTORS_BASE=0xffff0000 | ||
| 27 | CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" | ||
| 28 | |||
| 29 | # | ||
| 30 | # General setup | ||
| 31 | # | ||
| 32 | CONFIG_EXPERIMENTAL=y | ||
| 33 | CONFIG_BROKEN_ON_SMP=y | ||
| 34 | CONFIG_LOCK_KERNEL=y | ||
| 35 | CONFIG_INIT_ENV_ARG_LIMIT=32 | ||
| 36 | CONFIG_LOCALVERSION="" | ||
| 37 | # CONFIG_LOCALVERSION_AUTO is not set | ||
| 38 | CONFIG_SWAP=y | ||
| 39 | CONFIG_SYSVIPC=y | ||
| 40 | CONFIG_SYSVIPC_SYSCTL=y | ||
| 41 | # CONFIG_POSIX_MQUEUE is not set | ||
| 42 | CONFIG_BSD_PROCESS_ACCT=y | ||
| 43 | CONFIG_BSD_PROCESS_ACCT_V3=y | ||
| 44 | # CONFIG_TASKSTATS is not set | ||
| 45 | # CONFIG_USER_NS is not set | ||
| 46 | # CONFIG_PID_NS is not set | ||
| 47 | # CONFIG_AUDIT is not set | ||
| 48 | # CONFIG_IKCONFIG is not set | ||
| 49 | CONFIG_LOG_BUF_SHIFT=14 | ||
| 50 | # CONFIG_CGROUPS is not set | ||
| 51 | CONFIG_FAIR_GROUP_SCHED=y | ||
| 52 | CONFIG_FAIR_USER_SCHED=y | ||
| 53 | # CONFIG_FAIR_CGROUP_SCHED is not set | ||
| 54 | CONFIG_SYSFS_DEPRECATED=y | ||
| 55 | # CONFIG_RELAY is not set | ||
| 56 | CONFIG_BLK_DEV_INITRD=y | ||
| 57 | CONFIG_INITRAMFS_SOURCE="" | ||
| 58 | CONFIG_CC_OPTIMIZE_FOR_SIZE=y | ||
| 59 | CONFIG_SYSCTL=y | ||
| 60 | CONFIG_EMBEDDED=y | ||
| 61 | CONFIG_UID16=y | ||
| 62 | CONFIG_SYSCTL_SYSCALL=y | ||
| 63 | CONFIG_KALLSYMS=y | ||
| 64 | # CONFIG_KALLSYMS_ALL is not set | ||
| 65 | # CONFIG_KALLSYMS_EXTRA_PASS is not set | ||
| 66 | CONFIG_HOTPLUG=y | ||
| 67 | CONFIG_PRINTK=y | ||
| 68 | CONFIG_BUG=y | ||
| 69 | CONFIG_ELF_CORE=y | ||
| 70 | CONFIG_BASE_FULL=y | ||
| 71 | CONFIG_FUTEX=y | ||
| 72 | CONFIG_ANON_INODES=y | ||
| 73 | CONFIG_EPOLL=y | ||
| 74 | CONFIG_SIGNALFD=y | ||
| 75 | CONFIG_EVENTFD=y | ||
| 76 | CONFIG_SHMEM=y | ||
| 77 | CONFIG_VM_EVENT_COUNTERS=y | ||
| 78 | CONFIG_SLAB=y | ||
| 79 | # CONFIG_SLUB is not set | ||
| 80 | # CONFIG_SLOB is not set | ||
| 81 | CONFIG_SLABINFO=y | ||
| 82 | CONFIG_RT_MUTEXES=y | ||
| 83 | # CONFIG_TINY_SHMEM is not set | ||
| 84 | CONFIG_BASE_SMALL=0 | ||
| 85 | CONFIG_MODULES=y | ||
| 86 | CONFIG_MODULE_UNLOAD=y | ||
| 87 | CONFIG_MODULE_FORCE_UNLOAD=y | ||
| 88 | # CONFIG_MODVERSIONS is not set | ||
| 89 | # CONFIG_MODULE_SRCVERSION_ALL is not set | ||
| 90 | CONFIG_KMOD=y | ||
| 91 | CONFIG_BLOCK=y | ||
| 92 | # CONFIG_LBD is not set | ||
| 93 | # CONFIG_BLK_DEV_IO_TRACE is not set | ||
| 94 | # CONFIG_LSF is not set | ||
| 95 | # CONFIG_BLK_DEV_BSG is not set | ||
| 96 | |||
| 97 | # | ||
| 98 | # IO Schedulers | ||
| 99 | # | ||
| 100 | CONFIG_IOSCHED_NOOP=y | ||
| 101 | CONFIG_IOSCHED_AS=y | ||
| 102 | CONFIG_IOSCHED_DEADLINE=m | ||
| 103 | CONFIG_IOSCHED_CFQ=m | ||
| 104 | CONFIG_DEFAULT_AS=y | ||
| 105 | # CONFIG_DEFAULT_DEADLINE is not set | ||
| 106 | # CONFIG_DEFAULT_CFQ is not set | ||
| 107 | # CONFIG_DEFAULT_NOOP is not set | ||
| 108 | CONFIG_DEFAULT_IOSCHED="anticipatory" | ||
| 109 | |||
| 110 | # | ||
| 111 | # System Type | ||
| 112 | # | ||
| 113 | # CONFIG_ARCH_AAEC2000 is not set | ||
| 114 | # CONFIG_ARCH_INTEGRATOR is not set | ||
| 115 | # CONFIG_ARCH_REALVIEW is not set | ||
| 116 | # CONFIG_ARCH_VERSATILE is not set | ||
| 117 | # CONFIG_ARCH_AT91 is not set | ||
| 118 | # CONFIG_ARCH_CLPS7500 is not set | ||
| 119 | # CONFIG_ARCH_CLPS711X is not set | ||
| 120 | # CONFIG_ARCH_CO285 is not set | ||
| 121 | # CONFIG_ARCH_EBSA110 is not set | ||
| 122 | # CONFIG_ARCH_EP93XX is not set | ||
| 123 | # CONFIG_ARCH_FOOTBRIDGE is not set | ||
| 124 | # CONFIG_ARCH_NETX is not set | ||
| 125 | # CONFIG_ARCH_H720X is not set | ||
| 126 | # CONFIG_ARCH_IMX is not set | ||
| 127 | # CONFIG_ARCH_IOP13XX is not set | ||
| 128 | # CONFIG_ARCH_IOP32X is not set | ||
| 129 | # CONFIG_ARCH_IOP33X is not set | ||
| 130 | # CONFIG_ARCH_IXP23XX is not set | ||
| 131 | # CONFIG_ARCH_IXP2000 is not set | ||
| 132 | # CONFIG_ARCH_IXP4XX is not set | ||
| 133 | # CONFIG_ARCH_L7200 is not set | ||
| 134 | # CONFIG_ARCH_KS8695 is not set | ||
| 135 | # CONFIG_ARCH_NS9XXX is not set | ||
| 136 | # CONFIG_ARCH_MXC is not set | ||
| 137 | # CONFIG_ARCH_PNX4008 is not set | ||
| 138 | CONFIG_ARCH_PXA=y | ||
| 139 | # CONFIG_ARCH_RPC is not set | ||
| 140 | # CONFIG_ARCH_SA1100 is not set | ||
| 141 | # CONFIG_ARCH_S3C2410 is not set | ||
| 142 | # CONFIG_ARCH_SHARK is not set | ||
| 143 | # CONFIG_ARCH_LH7A40X is not set | ||
| 144 | # CONFIG_ARCH_DAVINCI is not set | ||
| 145 | # CONFIG_ARCH_OMAP is not set | ||
| 146 | |||
| 147 | # | ||
| 148 | # Intel PXA2xx/PXA3xx Implementations | ||
| 149 | # | ||
| 150 | # CONFIG_ARCH_LUBBOCK is not set | ||
| 151 | # CONFIG_MACH_LOGICPD_PXA270 is not set | ||
| 152 | # CONFIG_MACH_MAINSTONE is not set | ||
| 153 | # CONFIG_ARCH_PXA_IDP is not set | ||
| 154 | # CONFIG_PXA_SHARPSL is not set | ||
| 155 | # CONFIG_MACH_TRIZEPS4 is not set | ||
| 156 | CONFIG_MACH_HX2750=y | ||
| 157 | # CONFIG_MACH_EM_X270 is not set | ||
| 158 | # CONFIG_MACH_ZYLONITE is not set | ||
| 159 | # CONFIG_MACH_ARMCORE is not set | ||
| 160 | CONFIG_PXA27x=y | ||
| 161 | CONFIG_PXA_SSP=y | ||
| 162 | CONFIG_PXA_KEYS=y | ||
| 163 | |||
| 164 | # | ||
| 165 | # Boot options | ||
| 166 | # | ||
| 167 | |||
| 168 | # | ||
| 169 | # Power management | ||
| 170 | # | ||
| 171 | |||
| 172 | # | ||
| 173 | # Processor Type | ||
| 174 | # | ||
| 175 | CONFIG_CPU_32=y | ||
| 176 | CONFIG_CPU_XSCALE=y | ||
| 177 | CONFIG_CPU_32v5=y | ||
| 178 | CONFIG_CPU_ABRT_EV5T=y | ||
| 179 | CONFIG_CPU_CACHE_VIVT=y | ||
| 180 | CONFIG_CPU_TLB_V4WBI=y | ||
| 181 | CONFIG_CPU_CP15=y | ||
| 182 | CONFIG_CPU_CP15_MMU=y | ||
| 183 | |||
| 184 | # | ||
| 185 | # Processor Features | ||
| 186 | # | ||
| 187 | CONFIG_ARM_THUMB=y | ||
| 188 | # CONFIG_CPU_DCACHE_DISABLE is not set | ||
| 189 | # CONFIG_OUTER_CACHE is not set | ||
| 190 | CONFIG_IWMMXT=y | ||
| 191 | CONFIG_XSCALE_PMU=y | ||
| 192 | |||
| 193 | # | ||
| 194 | # Bus support | ||
| 195 | # | ||
| 196 | # CONFIG_PCI_SYSCALL is not set | ||
| 197 | # CONFIG_ARCH_SUPPORTS_MSI is not set | ||
| 198 | CONFIG_PCCARD=y | ||
| 199 | # CONFIG_PCMCIA_DEBUG is not set | ||
| 200 | CONFIG_PCMCIA=y | ||
| 201 | CONFIG_PCMCIA_LOAD_CIS=y | ||
| 202 | CONFIG_PCMCIA_IOCTL=y | ||
| 203 | |||
| 204 | # | ||
| 205 | # PC-card bridges | ||
| 206 | # | ||
| 207 | CONFIG_PCMCIA_PXA2XX=y | ||
| 208 | |||
| 209 | # | ||
| 210 | # Kernel Features | ||
| 211 | # | ||
| 212 | # CONFIG_TICK_ONESHOT is not set | ||
| 213 | # CONFIG_NO_HZ is not set | ||
| 214 | # CONFIG_HIGH_RES_TIMERS is not set | ||
| 215 | CONFIG_GENERIC_CLOCKEVENTS_BUILD=y | ||
| 216 | CONFIG_PREEMPT=y | ||
| 217 | CONFIG_HZ=100 | ||
| 218 | CONFIG_AEABI=y | ||
| 219 | CONFIG_OABI_COMPAT=y | ||
| 220 | # CONFIG_ARCH_DISCONTIGMEM_ENABLE is not set | ||
| 221 | CONFIG_SELECT_MEMORY_MODEL=y | ||
| 222 | CONFIG_FLATMEM_MANUAL=y | ||
| 223 | # CONFIG_DISCONTIGMEM_MANUAL is not set | ||
| 224 | # CONFIG_SPARSEMEM_MANUAL is not set | ||
| 225 | CONFIG_FLATMEM=y | ||
| 226 | CONFIG_FLAT_NODE_MEM_MAP=y | ||
| 227 | # CONFIG_SPARSEMEM_STATIC is not set | ||
| 228 | # CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set | ||
| 229 | CONFIG_SPLIT_PTLOCK_CPUS=4096 | ||
| 230 | # CONFIG_RESOURCES_64BIT is not set | ||
| 231 | CONFIG_ZONE_DMA_FLAG=1 | ||
| 232 | CONFIG_BOUNCE=y | ||
| 233 | CONFIG_VIRT_TO_BUS=y | ||
| 234 | CONFIG_ALIGNMENT_TRAP=y | ||
| 235 | |||
| 236 | # | ||
| 237 | # Boot options | ||
| 238 | # | ||
| 239 | CONFIG_ZBOOT_ROM_TEXT=0x0 | ||
| 240 | CONFIG_ZBOOT_ROM_BSS=0x0 | ||
| 241 | CONFIG_CMDLINE="console=ttyS0,115200n8 console=tty1 noinitrd root=/dev/mtdblock2 rootfstype=jffs2 dyntick=enable debug" | ||
| 242 | # CONFIG_XIP_KERNEL is not set | ||
| 243 | CONFIG_KEXEC=y | ||
| 244 | CONFIG_ATAGS_PROC=y | ||
| 245 | |||
| 246 | # | ||
| 247 | # CPU Frequency scaling | ||
| 248 | # | ||
| 249 | # CONFIG_CPU_FREQ is not set | ||
| 250 | |||
| 251 | # | ||
| 252 | # Floating point emulation | ||
| 253 | # | ||
| 254 | |||
| 255 | # | ||
| 256 | # At least one emulation must be selected | ||
| 257 | # | ||
| 258 | CONFIG_FPE_NWFPE=y | ||
| 259 | # CONFIG_FPE_NWFPE_XP is not set | ||
| 260 | # CONFIG_FPE_FASTFPE is not set | ||
| 261 | |||
| 262 | # | ||
| 263 | # Userspace binary formats | ||
| 264 | # | ||
| 265 | CONFIG_BINFMT_ELF=y | ||
| 266 | CONFIG_BINFMT_AOUT=m | ||
| 267 | CONFIG_BINFMT_MISC=m | ||
| 268 | |||
| 269 | # | ||
| 270 | # Power management options | ||
| 271 | # | ||
| 272 | CONFIG_PM=y | ||
| 273 | # CONFIG_PM_LEGACY is not set | ||
| 274 | # CONFIG_PM_DEBUG is not set | ||
| 275 | CONFIG_PM_SLEEP=y | ||
| 276 | CONFIG_SUSPEND_UP_POSSIBLE=y | ||
| 277 | CONFIG_SUSPEND=y | ||
| 278 | CONFIG_APM_EMULATION=y | ||
| 279 | |||
| 280 | # | ||
| 281 | # Networking | ||
| 282 | # | ||
| 283 | CONFIG_NET=y | ||
| 284 | |||
| 285 | # | ||
| 286 | # Networking options | ||
| 287 | # | ||
| 288 | CONFIG_PACKET=m | ||
| 289 | CONFIG_PACKET_MMAP=y | ||
| 290 | CONFIG_UNIX=y | ||
| 291 | CONFIG_XFRM=y | ||
| 292 | # CONFIG_XFRM_USER is not set | ||
| 293 | # CONFIG_XFRM_SUB_POLICY is not set | ||
| 294 | # CONFIG_XFRM_MIGRATE is not set | ||
| 295 | # CONFIG_NET_KEY is not set | ||
| 296 | CONFIG_INET=y | ||
| 297 | # CONFIG_IP_MULTICAST is not set | ||
| 298 | # CONFIG_IP_ADVANCED_ROUTER is not set | ||
| 299 | CONFIG_IP_FIB_HASH=y | ||
| 300 | # CONFIG_IP_PNP is not set | ||
| 301 | # CONFIG_NET_IPIP is not set | ||
| 302 | # CONFIG_NET_IPGRE is not set | ||
| 303 | # CONFIG_ARPD is not set | ||
| 304 | CONFIG_SYN_COOKIES=y | ||
| 305 | # CONFIG_INET_AH is not set | ||
| 306 | # CONFIG_INET_ESP is not set | ||
| 307 | # CONFIG_INET_IPCOMP is not set | ||
| 308 | # CONFIG_INET_XFRM_TUNNEL is not set | ||
| 309 | CONFIG_INET_TUNNEL=m | ||
| 310 | CONFIG_INET_XFRM_MODE_TRANSPORT=m | ||
| 311 | CONFIG_INET_XFRM_MODE_TUNNEL=m | ||
| 312 | CONFIG_INET_XFRM_MODE_BEET=m | ||
| 313 | # CONFIG_INET_LRO is not set | ||
| 314 | CONFIG_INET_DIAG=m | ||
| 315 | CONFIG_INET_TCP_DIAG=m | ||
| 316 | # CONFIG_TCP_CONG_ADVANCED is not set | ||
| 317 | CONFIG_TCP_CONG_CUBIC=y | ||
| 318 | CONFIG_DEFAULT_TCP_CONG="cubic" | ||
| 319 | # CONFIG_TCP_MD5SIG is not set | ||
| 320 | # CONFIG_IP_VS is not set | ||
| 321 | CONFIG_IPV6=m | ||
| 322 | # CONFIG_IPV6_PRIVACY is not set | ||
| 323 | # CONFIG_IPV6_ROUTER_PREF is not set | ||
| 324 | # CONFIG_IPV6_OPTIMISTIC_DAD is not set | ||
| 325 | CONFIG_INET6_AH=m | ||
| 326 | CONFIG_INET6_ESP=m | ||
| 327 | CONFIG_INET6_IPCOMP=m | ||
| 328 | # CONFIG_IPV6_MIP6 is not set | ||
| 329 | CONFIG_INET6_XFRM_TUNNEL=m | ||
| 330 | CONFIG_INET6_TUNNEL=m | ||
| 331 | CONFIG_INET6_XFRM_MODE_TRANSPORT=m | ||
| 332 | CONFIG_INET6_XFRM_MODE_TUNNEL=m | ||
| 333 | CONFIG_INET6_XFRM_MODE_BEET=m | ||
| 334 | # CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION is not set | ||
| 335 | CONFIG_IPV6_SIT=m | ||
| 336 | CONFIG_IPV6_TUNNEL=m | ||
| 337 | # CONFIG_IPV6_MULTIPLE_TABLES is not set | ||
| 338 | # CONFIG_NETWORK_SECMARK is not set | ||
| 339 | CONFIG_NETFILTER=y | ||
| 340 | # CONFIG_NETFILTER_DEBUG is not set | ||
| 341 | |||
| 342 | # | ||
| 343 | # Core Netfilter Configuration | ||
| 344 | # | ||
| 345 | # CONFIG_NETFILTER_NETLINK is not set | ||
| 346 | # CONFIG_NF_CONNTRACK_ENABLED is not set | ||
| 347 | # CONFIG_NF_CONNTRACK is not set | ||
| 348 | CONFIG_NETFILTER_XTABLES=m | ||
| 349 | # CONFIG_NETFILTER_XT_TARGET_CLASSIFY is not set | ||
| 350 | # CONFIG_NETFILTER_XT_TARGET_DSCP is not set | ||
| 351 | # CONFIG_NETFILTER_XT_TARGET_MARK is not set | ||
| 352 | # CONFIG_NETFILTER_XT_TARGET_NFQUEUE is not set | ||
| 353 | # CONFIG_NETFILTER_XT_TARGET_NFLOG is not set | ||
| 354 | # CONFIG_NETFILTER_XT_TARGET_TRACE is not set | ||
| 355 | # CONFIG_NETFILTER_XT_TARGET_TCPMSS is not set | ||
| 356 | # CONFIG_NETFILTER_XT_MATCH_COMMENT is not set | ||
| 357 | # CONFIG_NETFILTER_XT_MATCH_DCCP is not set | ||
| 358 | # CONFIG_NETFILTER_XT_MATCH_DSCP is not set | ||
| 359 | # CONFIG_NETFILTER_XT_MATCH_ESP is not set | ||
| 360 | # CONFIG_NETFILTER_XT_MATCH_LENGTH is not set | ||
| 361 | # CONFIG_NETFILTER_XT_MATCH_LIMIT is not set | ||
| 362 | # CONFIG_NETFILTER_XT_MATCH_MAC is not set | ||
| 363 | # CONFIG_NETFILTER_XT_MATCH_MARK is not set | ||
| 364 | # CONFIG_NETFILTER_XT_MATCH_POLICY is not set | ||
| 365 | # CONFIG_NETFILTER_XT_MATCH_MULTIPORT is not set | ||
| 366 | # CONFIG_NETFILTER_XT_MATCH_PKTTYPE is not set | ||
| 367 | # CONFIG_NETFILTER_XT_MATCH_QUOTA is not set | ||
| 368 | # CONFIG_NETFILTER_XT_MATCH_REALM is not set | ||
| 369 | # CONFIG_NETFILTER_XT_MATCH_SCTP is not set | ||
| 370 | # CONFIG_NETFILTER_XT_MATCH_STATISTIC is not set | ||
| 371 | # CONFIG_NETFILTER_XT_MATCH_STRING is not set | ||
| 372 | # CONFIG_NETFILTER_XT_MATCH_TCPMSS is not set | ||
| 373 | # CONFIG_NETFILTER_XT_MATCH_TIME is not set | ||
| 374 | # CONFIG_NETFILTER_XT_MATCH_U32 is not set | ||
| 375 | # CONFIG_NETFILTER_XT_MATCH_HASHLIMIT is not set | ||
| 376 | |||
| 377 | # | ||
| 378 | # IP: Netfilter Configuration | ||
| 379 | # | ||
| 380 | CONFIG_IP_NF_QUEUE=m | ||
| 381 | CONFIG_IP_NF_IPTABLES=m | ||
| 382 | CONFIG_IP_NF_MATCH_IPRANGE=m | ||
| 383 | CONFIG_IP_NF_MATCH_TOS=m | ||
| 384 | CONFIG_IP_NF_MATCH_RECENT=m | ||
| 385 | CONFIG_IP_NF_MATCH_ECN=m | ||
| 386 | CONFIG_IP_NF_MATCH_AH=m | ||
| 387 | CONFIG_IP_NF_MATCH_TTL=m | ||
| 388 | CONFIG_IP_NF_MATCH_OWNER=m | ||
| 389 | CONFIG_IP_NF_MATCH_ADDRTYPE=m | ||
| 390 | CONFIG_IP_NF_FILTER=m | ||
| 391 | CONFIG_IP_NF_TARGET_REJECT=m | ||
| 392 | CONFIG_IP_NF_TARGET_LOG=m | ||
| 393 | CONFIG_IP_NF_TARGET_ULOG=m | ||
| 394 | CONFIG_IP_NF_MANGLE=m | ||
| 395 | CONFIG_IP_NF_TARGET_TOS=m | ||
| 396 | CONFIG_IP_NF_TARGET_ECN=m | ||
| 397 | CONFIG_IP_NF_TARGET_TTL=m | ||
| 398 | CONFIG_IP_NF_RAW=m | ||
| 399 | CONFIG_IP_NF_ARPTABLES=m | ||
| 400 | CONFIG_IP_NF_ARPFILTER=m | ||
| 401 | CONFIG_IP_NF_ARP_MANGLE=m | ||
| 402 | |||
| 403 | # | ||
| 404 | # IPv6: Netfilter Configuration (EXPERIMENTAL) | ||
| 405 | # | ||
| 406 | # CONFIG_IP6_NF_QUEUE is not set | ||
| 407 | # CONFIG_IP6_NF_IPTABLES is not set | ||
| 408 | # CONFIG_IP_DCCP is not set | ||
| 409 | # CONFIG_IP_SCTP is not set | ||
| 410 | # CONFIG_TIPC is not set | ||
| 411 | # CONFIG_ATM is not set | ||
| 412 | # CONFIG_BRIDGE is not set | ||
| 413 | # CONFIG_VLAN_8021Q is not set | ||
| 414 | # CONFIG_DECNET is not set | ||
| 415 | # CONFIG_LLC2 is not set | ||
| 416 | # CONFIG_IPX is not set | ||
| 417 | # CONFIG_ATALK is not set | ||
| 418 | # CONFIG_X25 is not set | ||
| 419 | # CONFIG_LAPB is not set | ||
| 420 | # CONFIG_ECONET is not set | ||
| 421 | # CONFIG_WAN_ROUTER is not set | ||
| 422 | # CONFIG_NET_SCHED is not set | ||
| 423 | |||
| 424 | # | ||
| 425 | # Network testing | ||
| 426 | # | ||
| 427 | # CONFIG_NET_PKTGEN is not set | ||
| 428 | # CONFIG_HAMRADIO is not set | ||
| 429 | CONFIG_IRDA=m | ||
| 430 | |||
| 431 | # | ||
| 432 | # IrDA protocols | ||
| 433 | # | ||
| 434 | CONFIG_IRLAN=m | ||
| 435 | CONFIG_IRNET=m | ||
| 436 | CONFIG_IRCOMM=m | ||
| 437 | # CONFIG_IRDA_ULTRA is not set | ||
| 438 | |||
| 439 | # | ||
| 440 | # IrDA options | ||
| 441 | # | ||
| 442 | # CONFIG_IRDA_CACHE_LAST_LSAP is not set | ||
| 443 | # CONFIG_IRDA_FAST_RR is not set | ||
| 444 | # CONFIG_IRDA_DEBUG is not set | ||
| 445 | |||
| 446 | # | ||
| 447 | # Infrared-port device drivers | ||
| 448 | # | ||
| 449 | |||
| 450 | # | ||
| 451 | # SIR device drivers | ||
| 452 | # | ||
| 453 | # CONFIG_IRTTY_SIR is not set | ||
| 454 | |||
| 455 | # | ||
| 456 | # Dongle support | ||
| 457 | # | ||
| 458 | # CONFIG_KINGSUN_DONGLE is not set | ||
| 459 | # CONFIG_KSDAZZLE_DONGLE is not set | ||
| 460 | # CONFIG_KS959_DONGLE is not set | ||
| 461 | |||
| 462 | # | ||
| 463 | # Old SIR device drivers | ||
| 464 | # | ||
| 465 | # CONFIG_IRPORT_SIR is not set | ||
| 466 | |||
| 467 | # | ||
| 468 | # Old Serial dongle support | ||
| 469 | # | ||
| 470 | |||
| 471 | # | ||
| 472 | # FIR device drivers | ||
| 473 | # | ||
| 474 | # CONFIG_USB_IRDA is not set | ||
| 475 | # CONFIG_SIGMATEL_FIR is not set | ||
| 476 | CONFIG_PXA_FICP=m | ||
| 477 | # CONFIG_MCS_FIR is not set | ||
| 478 | CONFIG_BT=m | ||
| 479 | CONFIG_BT_L2CAP=m | ||
| 480 | CONFIG_BT_SCO=m | ||
| 481 | CONFIG_BT_RFCOMM=m | ||
| 482 | CONFIG_BT_RFCOMM_TTY=y | ||
| 483 | CONFIG_BT_BNEP=m | ||
| 484 | CONFIG_BT_BNEP_MC_FILTER=y | ||
| 485 | CONFIG_BT_BNEP_PROTO_FILTER=y | ||
| 486 | CONFIG_BT_HIDP=m | ||
| 487 | |||
| 488 | # | ||
| 489 | # Bluetooth device drivers | ||
| 490 | # | ||
| 491 | CONFIG_BT_HCIUSB=m | ||
| 492 | # CONFIG_BT_HCIUSB_SCO is not set | ||
| 493 | # CONFIG_BT_HCIBTSDIO is not set | ||
| 494 | CONFIG_BT_HCIUART=m | ||
| 495 | CONFIG_BT_HCIUART_H4=y | ||
| 496 | CONFIG_BT_HCIUART_BCSP=y | ||
| 497 | # CONFIG_BT_HCIUART_LL is not set | ||
| 498 | CONFIG_BT_HCIBCM203X=m | ||
| 499 | CONFIG_BT_HCIBPA10X=m | ||
| 500 | CONFIG_BT_HCIBFUSB=m | ||
| 501 | CONFIG_BT_HCIDTL1=m | ||
| 502 | CONFIG_BT_HCIBT3C=m | ||
| 503 | CONFIG_BT_HCIBLUECARD=m | ||
| 504 | CONFIG_BT_HCIBTUART=m | ||
| 505 | CONFIG_BT_HCIVHCI=m | ||
| 506 | # CONFIG_AF_RXRPC is not set | ||
| 507 | |||
| 508 | # | ||
| 509 | # Wireless | ||
| 510 | # | ||
| 511 | # CONFIG_CFG80211 is not set | ||
| 512 | CONFIG_WIRELESS_EXT=y | ||
| 513 | # CONFIG_MAC80211 is not set | ||
| 514 | CONFIG_IEEE80211=m | ||
| 515 | # CONFIG_IEEE80211_DEBUG is not set | ||
| 516 | CONFIG_IEEE80211_CRYPT_WEP=m | ||
| 517 | CONFIG_IEEE80211_CRYPT_CCMP=m | ||
| 518 | CONFIG_IEEE80211_CRYPT_TKIP=m | ||
| 519 | CONFIG_IEEE80211_SOFTMAC=m | ||
| 520 | # CONFIG_IEEE80211_SOFTMAC_DEBUG is not set | ||
| 521 | # CONFIG_RFKILL is not set | ||
| 522 | # CONFIG_NET_9P is not set | ||
| 523 | |||
| 524 | # | ||
| 525 | # Device Drivers | ||
| 526 | # | ||
| 527 | |||
| 528 | # | ||
| 529 | # Generic Driver Options | ||
| 530 | # | ||
| 531 | CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" | ||
| 532 | CONFIG_STANDALONE=y | ||
| 533 | CONFIG_PREVENT_FIRMWARE_BUILD=y | ||
| 534 | CONFIG_FW_LOADER=y | ||
| 535 | # CONFIG_DEBUG_DRIVER is not set | ||
| 536 | # CONFIG_DEBUG_DEVRES is not set | ||
| 537 | # CONFIG_SYS_HYPERVISOR is not set | ||
| 538 | # CONFIG_CONNECTOR is not set | ||
| 539 | CONFIG_MTD=y | ||
| 540 | # CONFIG_MTD_DEBUG is not set | ||
| 541 | # CONFIG_MTD_CONCAT is not set | ||
| 542 | CONFIG_MTD_PARTITIONS=y | ||
| 543 | # CONFIG_MTD_REDBOOT_PARTS is not set | ||
| 544 | CONFIG_MTD_CMDLINE_PARTS=y | ||
| 545 | # CONFIG_MTD_AFS_PARTS is not set | ||
| 546 | |||
| 547 | # | ||
| 548 | # User Modules And Translation Layers | ||
| 549 | # | ||
| 550 | CONFIG_MTD_CHAR=y | ||
| 551 | CONFIG_MTD_BLKDEVS=y | ||
| 552 | CONFIG_MTD_BLOCK=y | ||
| 553 | # CONFIG_FTL is not set | ||
| 554 | # CONFIG_NFTL is not set | ||
| 555 | # CONFIG_INFTL is not set | ||
| 556 | # CONFIG_RFD_FTL is not set | ||
| 557 | # CONFIG_SSFDC is not set | ||
| 558 | # CONFIG_MTD_OOPS is not set | ||
| 559 | |||
| 560 | # | ||
| 561 | # RAM/ROM/Flash chip drivers | ||
| 562 | # | ||
| 563 | CONFIG_MTD_CFI=y | ||
| 564 | # CONFIG_MTD_JEDECPROBE is not set | ||
| 565 | CONFIG_MTD_GEN_PROBE=y | ||
| 566 | CONFIG_MTD_CFI_ADV_OPTIONS=y | ||
| 567 | CONFIG_MTD_CFI_NOSWAP=y | ||
| 568 | # CONFIG_MTD_CFI_BE_BYTE_SWAP is not set | ||
| 569 | # CONFIG_MTD_CFI_LE_BYTE_SWAP is not set | ||
| 570 | CONFIG_MTD_CFI_GEOMETRY=y | ||
| 571 | CONFIG_MTD_MAP_BANK_WIDTH_1=y | ||
| 572 | CONFIG_MTD_MAP_BANK_WIDTH_2=y | ||
| 573 | CONFIG_MTD_MAP_BANK_WIDTH_4=y | ||
| 574 | # CONFIG_MTD_MAP_BANK_WIDTH_8 is not set | ||
| 575 | # CONFIG_MTD_MAP_BANK_WIDTH_16 is not set | ||
| 576 | # CONFIG_MTD_MAP_BANK_WIDTH_32 is not set | ||
| 577 | CONFIG_MTD_CFI_I1=y | ||
| 578 | CONFIG_MTD_CFI_I2=y | ||
| 579 | # CONFIG_MTD_CFI_I4 is not set | ||
| 580 | # CONFIG_MTD_CFI_I8 is not set | ||
| 581 | # CONFIG_MTD_OTP is not set | ||
| 582 | CONFIG_MTD_CFI_INTELEXT=y | ||
| 583 | # CONFIG_MTD_CFI_AMDSTD is not set | ||
| 584 | # CONFIG_MTD_CFI_STAA is not set | ||
| 585 | CONFIG_MTD_CFI_UTIL=y | ||
| 586 | # CONFIG_MTD_RAM is not set | ||
| 587 | # CONFIG_MTD_ROM is not set | ||
| 588 | # CONFIG_MTD_ABSENT is not set | ||
| 589 | # CONFIG_MTD_XIP is not set | ||
| 590 | |||
| 591 | # | ||
| 592 | # Mapping drivers for chip access | ||
| 593 | # | ||
| 594 | # CONFIG_MTD_COMPLEX_MAPPINGS is not set | ||
| 595 | # CONFIG_MTD_PHYSMAP is not set | ||
| 596 | # CONFIG_MTD_PXA2XX is not set | ||
| 597 | # CONFIG_MTD_ARM_INTEGRATOR is not set | ||
| 598 | # CONFIG_MTD_SHARP_SL is not set | ||
| 599 | # CONFIG_MTD_PLATRAM is not set | ||
| 600 | |||
| 601 | # | ||
| 602 | # Self-contained MTD device drivers | ||
| 603 | # | ||
| 604 | # CONFIG_MTD_SLRAM is not set | ||
| 605 | # CONFIG_MTD_PHRAM is not set | ||
| 606 | # CONFIG_MTD_MTDRAM is not set | ||
| 607 | # CONFIG_MTD_BLOCK2MTD is not set | ||
| 608 | |||
| 609 | # | ||
| 610 | # Disk-On-Chip Device Drivers | ||
| 611 | # | ||
| 612 | # CONFIG_MTD_DOC2000 is not set | ||
| 613 | # CONFIG_MTD_DOC2001 is not set | ||
| 614 | # CONFIG_MTD_DOC2001PLUS is not set | ||
| 615 | # CONFIG_MTD_NAND is not set | ||
| 616 | # CONFIG_MTD_ONENAND is not set | ||
| 617 | |||
| 618 | # | ||
| 619 | # UBI - Unsorted block images | ||
| 620 | # | ||
| 621 | # CONFIG_MTD_UBI is not set | ||
| 622 | # CONFIG_PARPORT is not set | ||
| 623 | CONFIG_BLK_DEV=y | ||
| 624 | # CONFIG_BLK_DEV_COW_COMMON is not set | ||
| 625 | CONFIG_BLK_DEV_LOOP=y | ||
| 626 | # CONFIG_BLK_DEV_CRYPTOLOOP is not set | ||
| 627 | # CONFIG_BLK_DEV_NBD is not set | ||
| 628 | # CONFIG_BLK_DEV_UB is not set | ||
| 629 | CONFIG_BLK_DEV_RAM=y | ||
| 630 | CONFIG_BLK_DEV_RAM_COUNT=16 | ||
| 631 | CONFIG_BLK_DEV_RAM_SIZE=8192 | ||
| 632 | CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024 | ||
| 633 | # CONFIG_CDROM_PKTCDVD is not set | ||
| 634 | # CONFIG_ATA_OVER_ETH is not set | ||
| 635 | CONFIG_MISC_DEVICES=y | ||
| 636 | # CONFIG_EEPROM_93CX6 is not set | ||
| 637 | CONFIG_IDE=y | ||
| 638 | CONFIG_IDE_MAX_HWIFS=4 | ||
| 639 | CONFIG_BLK_DEV_IDE=y | ||
| 640 | |||
| 641 | # | ||
| 642 | # Please see Documentation/ide.txt for help/info on IDE drives | ||
| 643 | # | ||
| 644 | # CONFIG_BLK_DEV_IDE_SATA is not set | ||
| 645 | CONFIG_BLK_DEV_IDEDISK=y | ||
| 646 | # CONFIG_IDEDISK_MULTI_MODE is not set | ||
| 647 | CONFIG_BLK_DEV_IDECS=y | ||
| 648 | # CONFIG_BLK_DEV_IDECD is not set | ||
| 649 | # CONFIG_BLK_DEV_IDETAPE is not set | ||
| 650 | # CONFIG_BLK_DEV_IDEFLOPPY is not set | ||
| 651 | # CONFIG_BLK_DEV_IDESCSI is not set | ||
| 652 | # CONFIG_IDE_TASK_IOCTL is not set | ||
| 653 | CONFIG_IDE_PROC_FS=y | ||
| 654 | |||
| 655 | # | ||
| 656 | # IDE chipset support/bugfixes | ||
| 657 | # | ||
| 658 | CONFIG_IDE_GENERIC=y | ||
| 659 | # CONFIG_BLK_DEV_PLATFORM is not set | ||
| 660 | # CONFIG_IDE_ARM is not set | ||
| 661 | # CONFIG_BLK_DEV_IDEDMA is not set | ||
| 662 | CONFIG_IDE_ARCH_OBSOLETE_INIT=y | ||
| 663 | # CONFIG_BLK_DEV_HD is not set | ||
| 664 | |||
| 665 | # | ||
| 666 | # SCSI device support | ||
| 667 | # | ||
| 668 | # CONFIG_RAID_ATTRS is not set | ||
| 669 | CONFIG_SCSI=m | ||
| 670 | CONFIG_SCSI_DMA=y | ||
| 671 | # CONFIG_SCSI_TGT is not set | ||
| 672 | # CONFIG_SCSI_NETLINK is not set | ||
| 673 | CONFIG_SCSI_PROC_FS=y | ||
| 674 | |||
| 675 | # | ||
| 676 | # SCSI support type (disk, tape, CD-ROM) | ||
| 677 | # | ||
| 678 | CONFIG_BLK_DEV_SD=m | ||
| 679 | CONFIG_CHR_DEV_ST=m | ||
| 680 | CONFIG_CHR_DEV_OSST=m | ||
| 681 | CONFIG_BLK_DEV_SR=m | ||
| 682 | # CONFIG_BLK_DEV_SR_VENDOR is not set | ||
| 683 | CONFIG_CHR_DEV_SG=m | ||
| 684 | # CONFIG_CHR_DEV_SCH is not set | ||
| 685 | |||
| 686 | # | ||
| 687 | # Some SCSI devices (e.g. CD jukebox) support multiple LUNs | ||
| 688 | # | ||
| 689 | CONFIG_SCSI_MULTI_LUN=y | ||
| 690 | # CONFIG_SCSI_CONSTANTS is not set | ||
| 691 | # CONFIG_SCSI_LOGGING is not set | ||
| 692 | # CONFIG_SCSI_SCAN_ASYNC is not set | ||
| 693 | CONFIG_SCSI_WAIT_SCAN=m | ||
| 694 | |||
| 695 | # | ||
| 696 | # SCSI Transports | ||
| 697 | # | ||
| 698 | # CONFIG_SCSI_SPI_ATTRS is not set | ||
| 699 | # CONFIG_SCSI_FC_ATTRS is not set | ||
| 700 | # CONFIG_SCSI_ISCSI_ATTRS is not set | ||
| 701 | # CONFIG_SCSI_SAS_LIBSAS is not set | ||
| 702 | # CONFIG_SCSI_SRP_ATTRS is not set | ||
| 703 | CONFIG_SCSI_LOWLEVEL=y | ||
| 704 | # CONFIG_ISCSI_TCP is not set | ||
| 705 | # CONFIG_SCSI_DEBUG is not set | ||
| 706 | # CONFIG_SCSI_LOWLEVEL_PCMCIA is not set | ||
| 707 | # CONFIG_ATA is not set | ||
| 708 | CONFIG_MD=y | ||
| 709 | # CONFIG_BLK_DEV_MD is not set | ||
| 710 | CONFIG_BLK_DEV_DM=m | ||
| 711 | # CONFIG_DM_DEBUG is not set | ||
| 712 | CONFIG_DM_CRYPT=m | ||
| 713 | CONFIG_DM_SNAPSHOT=m | ||
| 714 | CONFIG_DM_MIRROR=m | ||
| 715 | CONFIG_DM_ZERO=m | ||
| 716 | CONFIG_DM_MULTIPATH=m | ||
| 717 | CONFIG_DM_MULTIPATH_EMC=m | ||
| 718 | # CONFIG_DM_MULTIPATH_RDAC is not set | ||
| 719 | # CONFIG_DM_MULTIPATH_HP is not set | ||
| 720 | # CONFIG_DM_DELAY is not set | ||
| 721 | # CONFIG_DM_UEVENT is not set | ||
| 722 | CONFIG_NETDEVICES=y | ||
| 723 | # CONFIG_NETDEVICES_MULTIQUEUE is not set | ||
| 724 | # CONFIG_DUMMY is not set | ||
| 725 | # CONFIG_BONDING is not set | ||
| 726 | # CONFIG_MACVLAN is not set | ||
| 727 | # CONFIG_EQUALIZER is not set | ||
| 728 | CONFIG_TUN=m | ||
| 729 | # CONFIG_VETH is not set | ||
| 730 | # CONFIG_PHYLIB is not set | ||
| 731 | CONFIG_NET_ETHERNET=y | ||
| 732 | CONFIG_MII=m | ||
| 733 | # CONFIG_AX88796 is not set | ||
| 734 | # CONFIG_SMC91X is not set | ||
| 735 | # CONFIG_DM9000 is not set | ||
| 736 | # CONFIG_SMC911X is not set | ||
| 737 | # CONFIG_IBM_NEW_EMAC_ZMII is not set | ||
| 738 | # CONFIG_IBM_NEW_EMAC_RGMII is not set | ||
| 739 | # CONFIG_IBM_NEW_EMAC_TAH is not set | ||
| 740 | # CONFIG_IBM_NEW_EMAC_EMAC4 is not set | ||
| 741 | # CONFIG_B44 is not set | ||
| 742 | # CONFIG_NETDEV_1000 is not set | ||
| 743 | # CONFIG_NETDEV_10000 is not set | ||
| 744 | |||
| 745 | # | ||
| 746 | # Wireless LAN | ||
| 747 | # | ||
| 748 | # CONFIG_WLAN_PRE80211 is not set | ||
| 749 | CONFIG_WLAN_80211=y | ||
| 750 | # CONFIG_PCMCIA_RAYCS is not set | ||
| 751 | # CONFIG_LIBERTAS is not set | ||
| 752 | CONFIG_HERMES=m | ||
| 753 | CONFIG_PCMCIA_HERMES=m | ||
| 754 | CONFIG_PCMCIA_SPECTRUM=m | ||
| 755 | # CONFIG_ATMEL is not set | ||
| 756 | CONFIG_AIRO_CS=m | ||
| 757 | # CONFIG_PCMCIA_WL3501 is not set | ||
| 758 | # CONFIG_USB_ZD1201 is not set | ||
| 759 | CONFIG_HOSTAP=m | ||
| 760 | CONFIG_HOSTAP_FIRMWARE=y | ||
| 761 | # CONFIG_HOSTAP_FIRMWARE_NVRAM is not set | ||
| 762 | CONFIG_HOSTAP_CS=m | ||
| 763 | # CONFIG_ZD1211RW is not set | ||
| 764 | |||
| 765 | # | ||
| 766 | # USB Network Adapters | ||
| 767 | # | ||
| 768 | CONFIG_USB_CATC=m | ||
| 769 | CONFIG_USB_KAWETH=m | ||
| 770 | CONFIG_USB_PEGASUS=m | ||
| 771 | CONFIG_USB_RTL8150=m | ||
| 772 | CONFIG_USB_USBNET=m | ||
| 773 | CONFIG_USB_NET_AX8817X=m | ||
| 774 | CONFIG_USB_NET_CDCETHER=m | ||
| 775 | # CONFIG_USB_NET_DM9601 is not set | ||
| 776 | # CONFIG_USB_NET_GL620A is not set | ||
| 777 | CONFIG_USB_NET_NET1080=m | ||
| 778 | # CONFIG_USB_NET_PLUSB is not set | ||
| 779 | # CONFIG_USB_NET_MCS7830 is not set | ||
| 780 | # CONFIG_USB_NET_RNDIS_HOST is not set | ||
| 781 | # CONFIG_USB_NET_CDC_SUBSET is not set | ||
| 782 | CONFIG_USB_NET_ZAURUS=m | ||
| 783 | CONFIG_NET_PCMCIA=y | ||
| 784 | # CONFIG_PCMCIA_3C589 is not set | ||
| 785 | # CONFIG_PCMCIA_3C574 is not set | ||
| 786 | # CONFIG_PCMCIA_FMVJ18X is not set | ||
| 787 | CONFIG_PCMCIA_PCNET=m | ||
| 788 | # CONFIG_PCMCIA_NMCLAN is not set | ||
| 789 | # CONFIG_PCMCIA_SMC91C92 is not set | ||
| 790 | # CONFIG_PCMCIA_XIRC2PS is not set | ||
| 791 | # CONFIG_PCMCIA_AXNET is not set | ||
| 792 | # CONFIG_WAN is not set | ||
| 793 | CONFIG_PPP=m | ||
| 794 | # CONFIG_PPP_MULTILINK is not set | ||
| 795 | # CONFIG_PPP_FILTER is not set | ||
| 796 | CONFIG_PPP_ASYNC=m | ||
| 797 | # CONFIG_PPP_SYNC_TTY is not set | ||
| 798 | CONFIG_PPP_DEFLATE=m | ||
| 799 | CONFIG_PPP_BSDCOMP=m | ||
| 800 | # CONFIG_PPP_MPPE is not set | ||
| 801 | # CONFIG_PPPOE is not set | ||
| 802 | # CONFIG_PPPOL2TP is not set | ||
| 803 | # CONFIG_SLIP is not set | ||
| 804 | CONFIG_SLHC=m | ||
| 805 | # CONFIG_SHAPER is not set | ||
| 806 | # CONFIG_NETCONSOLE is not set | ||
| 807 | # CONFIG_NETPOLL is not set | ||
| 808 | # CONFIG_NET_POLL_CONTROLLER is not set | ||
| 809 | # CONFIG_ISDN is not set | ||
| 810 | |||
| 811 | # | ||
| 812 | # Input device support | ||
| 813 | # | ||
| 814 | CONFIG_INPUT=y | ||
| 815 | # CONFIG_INPUT_FF_MEMLESS is not set | ||
| 816 | # CONFIG_INPUT_POLLDEV is not set | ||
| 817 | |||
| 818 | # | ||
| 819 | # Userland interfaces | ||
| 820 | # | ||
| 821 | CONFIG_INPUT_MOUSEDEV=m | ||
| 822 | # CONFIG_INPUT_MOUSEDEV_PSAUX is not set | ||
| 823 | CONFIG_INPUT_MOUSEDEV_SCREEN_X=240 | ||
| 824 | CONFIG_INPUT_MOUSEDEV_SCREEN_Y=320 | ||
| 825 | # CONFIG_INPUT_JOYDEV is not set | ||
| 826 | CONFIG_INPUT_EVDEV=y | ||
| 827 | # CONFIG_INPUT_EVBUG is not set | ||
| 828 | CONFIG_INPUT_POWER=y | ||
| 829 | |||
| 830 | # | ||
| 831 | # Input Device Drivers | ||
| 832 | # | ||
| 833 | CONFIG_INPUT_KEYBOARD=y | ||
| 834 | # CONFIG_KEYBOARD_ATKBD is not set | ||
| 835 | # CONFIG_KEYBOARD_SUNKBD is not set | ||
| 836 | # CONFIG_KEYBOARD_LKKBD is not set | ||
| 837 | # CONFIG_KEYBOARD_XTKBD is not set | ||
| 838 | # CONFIG_KEYBOARD_NEWTON is not set | ||
| 839 | # CONFIG_KEYBOARD_STOWAWAY is not set | ||
| 840 | CONFIG_KEYBOARD_PXA27x=m | ||
| 841 | # CONFIG_KEYBOARD_GPIO is not set | ||
| 842 | # CONFIG_INPUT_MOUSE is not set | ||
| 843 | # CONFIG_INPUT_JOYSTICK is not set | ||
| 844 | # CONFIG_INPUT_TABLET is not set | ||
| 845 | CONFIG_INPUT_TOUCHSCREEN=y | ||
| 846 | # CONFIG_TOUCHSCREEN_FUJITSU is not set | ||
| 847 | # CONFIG_TOUCHSCREEN_GUNZE is not set | ||
| 848 | # CONFIG_TOUCHSCREEN_ELO is not set | ||
| 849 | # CONFIG_TOUCHSCREEN_MTOUCH is not set | ||
| 850 | # CONFIG_TOUCHSCREEN_MK712 is not set | ||
| 851 | # CONFIG_TOUCHSCREEN_PENMOUNT is not set | ||
| 852 | # CONFIG_TOUCHSCREEN_TOUCHRIGHT is not set | ||
| 853 | # CONFIG_TOUCHSCREEN_TOUCHWIN is not set | ||
| 854 | # CONFIG_TOUCHSCREEN_UCB1400 is not set | ||
| 855 | # CONFIG_TOUCHSCREEN_USB_COMPOSITE is not set | ||
| 856 | CONFIG_TOUCHSCREEN_TSC2101=y | ||
| 857 | CONFIG_INPUT_MISC=y | ||
| 858 | # CONFIG_INPUT_ATI_REMOTE is not set | ||
| 859 | # CONFIG_INPUT_ATI_REMOTE2 is not set | ||
| 860 | # CONFIG_INPUT_KEYSPAN_REMOTE is not set | ||
| 861 | # CONFIG_INPUT_POWERMATE is not set | ||
| 862 | # CONFIG_INPUT_YEALINK is not set | ||
| 863 | CONFIG_INPUT_UINPUT=m | ||
| 864 | |||
| 865 | # | ||
| 866 | # Hardware I/O ports | ||
| 867 | # | ||
| 868 | # CONFIG_SERIO is not set | ||
| 869 | # CONFIG_GAMEPORT is not set | ||
| 870 | |||
| 871 | # | ||
| 872 | # Character devices | ||
| 873 | # | ||
| 874 | CONFIG_VT=y | ||
| 875 | CONFIG_VT_CONSOLE=y | ||
| 876 | CONFIG_HW_CONSOLE=y | ||
| 877 | # CONFIG_VT_HW_CONSOLE_BINDING is not set | ||
| 878 | # CONFIG_SERIAL_NONSTANDARD is not set | ||
| 879 | |||
| 880 | # | ||
| 881 | # Serial drivers | ||
| 882 | # | ||
| 883 | CONFIG_SERIAL_8250=m | ||
| 884 | CONFIG_SERIAL_8250_CS=m | ||
| 885 | CONFIG_SERIAL_8250_NR_UARTS=4 | ||
| 886 | CONFIG_SERIAL_8250_RUNTIME_UARTS=4 | ||
| 887 | # CONFIG_SERIAL_8250_EXTENDED is not set | ||
| 888 | |||
| 889 | # | ||
| 890 | # Non-8250 serial port support | ||
| 891 | # | ||
| 892 | CONFIG_SERIAL_PXA=y | ||
| 893 | CONFIG_SERIAL_PXA_CONSOLE=y | ||
| 894 | CONFIG_SERIAL_CORE=y | ||
| 895 | CONFIG_SERIAL_CORE_CONSOLE=y | ||
| 896 | CONFIG_UNIX98_PTYS=y | ||
| 897 | # CONFIG_LEGACY_PTYS is not set | ||
| 898 | # CONFIG_IPMI_HANDLER is not set | ||
| 899 | CONFIG_HW_RANDOM=m | ||
| 900 | # CONFIG_NVRAM is not set | ||
| 901 | # CONFIG_R3964 is not set | ||
| 902 | |||
| 903 | # | ||
| 904 | # PCMCIA character devices | ||
| 905 | # | ||
| 906 | # CONFIG_SYNCLINK_CS is not set | ||
| 907 | # CONFIG_CARDMAN_4000 is not set | ||
| 908 | # CONFIG_CARDMAN_4040 is not set | ||
| 909 | # CONFIG_RAW_DRIVER is not set | ||
| 910 | # CONFIG_TCG_TPM is not set | ||
| 911 | CONFIG_I2C=y | ||
| 912 | CONFIG_I2C_BOARDINFO=y | ||
| 913 | # CONFIG_I2C_CHARDEV is not set | ||
| 914 | |||
| 915 | # | ||
| 916 | # I2C Algorithms | ||
| 917 | # | ||
| 918 | CONFIG_I2C_ALGOBIT=y | ||
| 919 | # CONFIG_I2C_ALGOPCF is not set | ||
| 920 | # CONFIG_I2C_ALGOPCA is not set | ||
| 921 | |||
| 922 | # | ||
| 923 | # I2C Hardware Bus support | ||
| 924 | # | ||
| 925 | # CONFIG_I2C_GPIO is not set | ||
| 926 | CONFIG_I2C_PXA=y | ||
| 927 | # CONFIG_I2C_PXA_SLAVE is not set | ||
| 928 | # CONFIG_I2C_OCORES is not set | ||
| 929 | # CONFIG_I2C_PARPORT_LIGHT is not set | ||
| 930 | # CONFIG_I2C_SIMTEC is not set | ||
| 931 | # CONFIG_I2C_TAOS_EVM is not set | ||
| 932 | # CONFIG_I2C_STUB is not set | ||
| 933 | # CONFIG_I2C_TINY_USB is not set | ||
| 934 | |||
| 935 | # | ||
| 936 | # Miscellaneous I2C Chip support | ||
| 937 | # | ||
| 938 | # CONFIG_SENSORS_DS1337 is not set | ||
| 939 | # CONFIG_SENSORS_DS1374 is not set | ||
| 940 | # CONFIG_DS1682 is not set | ||
| 941 | # CONFIG_SENSORS_EEPROM is not set | ||
| 942 | # CONFIG_SENSORS_PCF8574 is not set | ||
| 943 | # CONFIG_SENSORS_PCA9539 is not set | ||
| 944 | # CONFIG_SENSORS_PCF8591 is not set | ||
| 945 | # CONFIG_SENSORS_MAX6875 is not set | ||
| 946 | # CONFIG_SENSORS_TSL2550 is not set | ||
| 947 | # CONFIG_I2C_DEBUG_CORE is not set | ||
| 948 | # CONFIG_I2C_DEBUG_ALGO is not set | ||
| 949 | # CONFIG_I2C_DEBUG_BUS is not set | ||
| 950 | # CONFIG_I2C_DEBUG_CHIP is not set | ||
| 951 | |||
| 952 | # | ||
| 953 | # SPI support | ||
| 954 | # | ||
| 955 | # CONFIG_SPI is not set | ||
| 956 | # CONFIG_SPI_MASTER is not set | ||
| 957 | # CONFIG_W1 is not set | ||
| 958 | # CONFIG_POWER_SUPPLY is not set | ||
| 959 | # CONFIG_HWMON is not set | ||
| 960 | # CONFIG_WATCHDOG is not set | ||
| 961 | |||
| 962 | # | ||
| 963 | # Sonics Silicon Backplane | ||
| 964 | # | ||
| 965 | CONFIG_SSB_POSSIBLE=y | ||
| 966 | # CONFIG_SSB is not set | ||
| 967 | |||
| 968 | # | ||
| 969 | # Multifunction device drivers | ||
| 970 | # | ||
| 971 | # CONFIG_MFD_SM501 is not set | ||
| 972 | CONFIG_MFD_TSC2101=y | ||
| 973 | # CONFIG_HTC_ASIC3 is not set | ||
| 974 | # CONFIG_HTC_ASIC3_DS1WM is not set | ||
| 975 | |||
| 976 | # | ||
| 977 | # Multimedia devices | ||
| 978 | # | ||
| 979 | CONFIG_VIDEO_DEV=m | ||
| 980 | CONFIG_VIDEO_V4L1=y | ||
| 981 | CONFIG_VIDEO_V4L1_COMPAT=y | ||
| 982 | CONFIG_VIDEO_V4L2=y | ||
| 983 | CONFIG_VIDEO_CAPTURE_DRIVERS=y | ||
| 984 | # CONFIG_VIDEO_ADV_DEBUG is not set | ||
| 985 | CONFIG_VIDEO_HELPER_CHIPS_AUTO=y | ||
| 986 | # CONFIG_VIDEO_VIVI is not set | ||
| 987 | # CONFIG_VIDEO_CPIA is not set | ||
| 988 | # CONFIG_VIDEO_CPIA2 is not set | ||
| 989 | # CONFIG_VIDEO_SAA5246A is not set | ||
| 990 | # CONFIG_VIDEO_SAA5249 is not set | ||
| 991 | # CONFIG_TUNER_3036 is not set | ||
| 992 | CONFIG_V4L_USB_DRIVERS=y | ||
| 993 | # CONFIG_VIDEO_PVRUSB2 is not set | ||
| 994 | # CONFIG_VIDEO_EM28XX is not set | ||
| 995 | # CONFIG_VIDEO_USBVISION is not set | ||
| 996 | CONFIG_VIDEO_USBVIDEO=m | ||
| 997 | CONFIG_USB_VICAM=m | ||
| 998 | CONFIG_USB_IBMCAM=m | ||
| 999 | CONFIG_USB_KONICAWC=m | ||
| 1000 | # CONFIG_USB_QUICKCAM_MESSENGER is not set | ||
| 1001 | # CONFIG_USB_ET61X251 is not set | ||
| 1002 | # CONFIG_VIDEO_OVCAMCHIP is not set | ||
| 1003 | # CONFIG_USB_W9968CF is not set | ||
| 1004 | CONFIG_USB_OV511=m | ||
| 1005 | CONFIG_USB_SE401=m | ||
| 1006 | CONFIG_USB_SN9C102=m | ||
| 1007 | CONFIG_USB_STV680=m | ||
| 1008 | # CONFIG_USB_ZC0301 is not set | ||
| 1009 | # CONFIG_USB_PWC is not set | ||
| 1010 | # CONFIG_USB_ZR364XX is not set | ||
| 1011 | CONFIG_RADIO_ADAPTERS=y | ||
| 1012 | CONFIG_USB_DSBR=m | ||
| 1013 | # CONFIG_DVB_CORE is not set | ||
| 1014 | CONFIG_DAB=y | ||
| 1015 | CONFIG_USB_DABUSB=m | ||
| 1016 | |||
| 1017 | # | ||
| 1018 | # Graphics support | ||
| 1019 | # | ||
| 1020 | # CONFIG_VGASTATE is not set | ||
| 1021 | CONFIG_VIDEO_OUTPUT_CONTROL=m | ||
| 1022 | CONFIG_FB=y | ||
| 1023 | # CONFIG_FIRMWARE_EDID is not set | ||
| 1024 | # CONFIG_FB_DDC is not set | ||
| 1025 | CONFIG_FB_CFB_FILLRECT=y | ||
| 1026 | CONFIG_FB_CFB_COPYAREA=y | ||
| 1027 | CONFIG_FB_CFB_IMAGEBLIT=y | ||
| 1028 | # CONFIG_FB_CFB_REV_PIXELS_IN_BYTE is not set | ||
| 1029 | # CONFIG_FB_SYS_FILLRECT is not set | ||
| 1030 | # CONFIG_FB_SYS_COPYAREA is not set | ||
| 1031 | # CONFIG_FB_SYS_IMAGEBLIT is not set | ||
| 1032 | # CONFIG_FB_SYS_FOPS is not set | ||
| 1033 | # CONFIG_FB_DEFERRED_IO is not set | ||
| 1034 | # CONFIG_FB_SVGALIB is not set | ||
| 1035 | # CONFIG_FB_MACMODES is not set | ||
| 1036 | # CONFIG_FB_BACKLIGHT is not set | ||
| 1037 | # CONFIG_FB_MODE_HELPERS is not set | ||
| 1038 | # CONFIG_FB_TILEBLITTING is not set | ||
| 1039 | |||
| 1040 | # | ||
| 1041 | # Frame buffer hardware drivers | ||
| 1042 | # | ||
| 1043 | # CONFIG_FB_S1D13XXX is not set | ||
| 1044 | CONFIG_FB_PXA=y | ||
| 1045 | CONFIG_FB_PXA_LCD_QVGA=y | ||
| 1046 | # CONFIG_FB_PXA_LCD_VGA is not set | ||
| 1047 | CONFIG_FB_PXA_OVERLAY=y | ||
| 1048 | # CONFIG_FB_PXA_PARAMETERS is not set | ||
| 1049 | # CONFIG_FB_MBX is not set | ||
| 1050 | # CONFIG_FB_VIRTUAL is not set | ||
| 1051 | CONFIG_BACKLIGHT_LCD_SUPPORT=y | ||
| 1052 | # CONFIG_LCD_CLASS_DEVICE is not set | ||
| 1053 | CONFIG_BACKLIGHT_CLASS_DEVICE=y | ||
| 1054 | CONFIG_BACKLIGHT_CORGI=y | ||
| 1055 | |||
| 1056 | # | ||
| 1057 | # Display device support | ||
| 1058 | # | ||
| 1059 | # CONFIG_DISPLAY_SUPPORT is not set | ||
| 1060 | |||
| 1061 | # | ||
| 1062 | # Console display driver support | ||
| 1063 | # | ||
| 1064 | # CONFIG_VGA_CONSOLE is not set | ||
| 1065 | CONFIG_DUMMY_CONSOLE=y | ||
| 1066 | CONFIG_FRAMEBUFFER_CONSOLE=y | ||
| 1067 | # CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY is not set | ||
| 1068 | CONFIG_FRAMEBUFFER_CONSOLE_ROTATION=y | ||
| 1069 | CONFIG_FONTS=y | ||
| 1070 | # CONFIG_FONT_8x8 is not set | ||
| 1071 | # CONFIG_FONT_8x16 is not set | ||
| 1072 | # CONFIG_FONT_6x11 is not set | ||
| 1073 | # CONFIG_FONT_7x14 is not set | ||
| 1074 | # CONFIG_FONT_PEARL_8x8 is not set | ||
| 1075 | # CONFIG_FONT_ACORN_8x8 is not set | ||
| 1076 | CONFIG_FONT_MINI_4x6=y | ||
| 1077 | # CONFIG_FONT_SUN8x16 is not set | ||
| 1078 | # CONFIG_FONT_SUN12x22 is not set | ||
| 1079 | # CONFIG_FONT_10x18 is not set | ||
| 1080 | CONFIG_LOGO=y | ||
| 1081 | # CONFIG_LOGO_LINUX_MONO is not set | ||
| 1082 | # CONFIG_LOGO_LINUX_VGA16 is not set | ||
| 1083 | # CONFIG_LOGO_LINUX_CLUT224 is not set | ||
| 1084 | CONFIG_LOGO_OHAND_CLUT224=y | ||
| 1085 | |||
| 1086 | # | ||
| 1087 | # Sound | ||
| 1088 | # | ||
| 1089 | CONFIG_SOUND=m | ||
| 1090 | |||
| 1091 | # | ||
| 1092 | # Advanced Linux Sound Architecture | ||
| 1093 | # | ||
| 1094 | CONFIG_SND=m | ||
| 1095 | CONFIG_SND_TIMER=m | ||
| 1096 | CONFIG_SND_PCM=m | ||
| 1097 | CONFIG_SND_HWDEP=m | ||
| 1098 | CONFIG_SND_RAWMIDI=m | ||
| 1099 | CONFIG_SND_SEQUENCER=m | ||
| 1100 | # CONFIG_SND_SEQ_DUMMY is not set | ||
| 1101 | CONFIG_SND_OSSEMUL=y | ||
| 1102 | CONFIG_SND_MIXER_OSS=m | ||
| 1103 | CONFIG_SND_PCM_OSS=m | ||
| 1104 | CONFIG_SND_PCM_OSS_PLUGINS=y | ||
| 1105 | # CONFIG_SND_SEQUENCER_OSS is not set | ||
| 1106 | # CONFIG_SND_DYNAMIC_MINORS is not set | ||
| 1107 | CONFIG_SND_SUPPORT_OLD_API=y | ||
| 1108 | CONFIG_SND_VERBOSE_PROCFS=y | ||
| 1109 | # CONFIG_SND_VERBOSE_PRINTK is not set | ||
| 1110 | # CONFIG_SND_DEBUG is not set | ||
| 1111 | |||
| 1112 | # | ||
| 1113 | # Generic devices | ||
| 1114 | # | ||
| 1115 | CONFIG_SND_AC97_CODEC=m | ||
| 1116 | # CONFIG_SND_DUMMY is not set | ||
| 1117 | # CONFIG_SND_VIRMIDI is not set | ||
| 1118 | # CONFIG_SND_MTPAV is not set | ||
| 1119 | # CONFIG_SND_SERIAL_U16550 is not set | ||
| 1120 | # CONFIG_SND_MPU401 is not set | ||
| 1121 | |||
| 1122 | # | ||
| 1123 | # ALSA ARM devices | ||
| 1124 | # | ||
| 1125 | CONFIG_SND_PXA2XX_PCM=m | ||
| 1126 | CONFIG_SND_PXA2XX_AC97=m | ||
| 1127 | |||
| 1128 | # | ||
| 1129 | # USB devices | ||
| 1130 | # | ||
| 1131 | CONFIG_SND_USB_AUDIO=m | ||
| 1132 | # CONFIG_SND_USB_CAIAQ is not set | ||
| 1133 | |||
| 1134 | # | ||
| 1135 | # PCMCIA devices | ||
| 1136 | # | ||
| 1137 | # CONFIG_SND_VXPOCKET is not set | ||
| 1138 | # CONFIG_SND_PDAUDIOCF is not set | ||
| 1139 | |||
| 1140 | # | ||
| 1141 | # System on Chip audio support | ||
| 1142 | # | ||
| 1143 | CONFIG_SND_SOC=m | ||
| 1144 | CONFIG_SND_PXA2XX_SOC=m | ||
| 1145 | |||
| 1146 | # | ||
| 1147 | # SoC Audio support for SuperH | ||
| 1148 | # | ||
| 1149 | |||
| 1150 | # | ||
| 1151 | # Open Sound System | ||
| 1152 | # | ||
| 1153 | # CONFIG_SOUND_PRIME is not set | ||
| 1154 | CONFIG_AC97_BUS=m | ||
| 1155 | CONFIG_HID_SUPPORT=y | ||
| 1156 | CONFIG_HID=m | ||
| 1157 | # CONFIG_HID_DEBUG is not set | ||
| 1158 | # CONFIG_HIDRAW is not set | ||
| 1159 | |||
| 1160 | # | ||
| 1161 | # USB Input Devices | ||
| 1162 | # | ||
| 1163 | CONFIG_USB_HID=m | ||
| 1164 | # CONFIG_USB_HIDINPUT_POWERBOOK is not set | ||
| 1165 | # CONFIG_HID_FF is not set | ||
| 1166 | # CONFIG_USB_HIDDEV is not set | ||
| 1167 | |||
| 1168 | # | ||
| 1169 | # USB HID Boot Protocol drivers | ||
| 1170 | # | ||
| 1171 | CONFIG_USB_KBD=m | ||
| 1172 | CONFIG_USB_MOUSE=m | ||
| 1173 | CONFIG_USB_SUPPORT=y | ||
| 1174 | CONFIG_USB_ARCH_HAS_HCD=y | ||
| 1175 | CONFIG_USB_ARCH_HAS_OHCI=y | ||
| 1176 | # CONFIG_USB_ARCH_HAS_EHCI is not set | ||
| 1177 | CONFIG_USB=m | ||
| 1178 | # CONFIG_USB_DEBUG is not set | ||
| 1179 | |||
| 1180 | # | ||
| 1181 | # Miscellaneous USB options | ||
| 1182 | # | ||
| 1183 | CONFIG_USB_DEVICEFS=y | ||
| 1184 | CONFIG_USB_DEVICE_CLASS=y | ||
| 1185 | # CONFIG_USB_DYNAMIC_MINORS is not set | ||
| 1186 | # CONFIG_USB_SUSPEND is not set | ||
| 1187 | # CONFIG_USB_PERSIST is not set | ||
| 1188 | # CONFIG_USB_OTG is not set | ||
| 1189 | |||
| 1190 | # | ||
| 1191 | # USB Host Controller Drivers | ||
| 1192 | # | ||
| 1193 | # CONFIG_USB_ISP116X_HCD is not set | ||
| 1194 | CONFIG_USB_OHCI_HCD=m | ||
| 1195 | # CONFIG_USB_OHCI_BIG_ENDIAN_DESC is not set | ||
| 1196 | # CONFIG_USB_OHCI_BIG_ENDIAN_MMIO is not set | ||
| 1197 | CONFIG_USB_OHCI_LITTLE_ENDIAN=y | ||
| 1198 | CONFIG_USB_SL811_HCD=m | ||
| 1199 | CONFIG_USB_SL811_CS=m | ||
| 1200 | # CONFIG_USB_R8A66597_HCD is not set | ||
| 1201 | |||
| 1202 | # | ||
| 1203 | # USB Device Class drivers | ||
| 1204 | # | ||
| 1205 | CONFIG_USB_ACM=m | ||
| 1206 | CONFIG_USB_PRINTER=m | ||
| 1207 | |||
| 1208 | # | ||
| 1209 | # NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' | ||
| 1210 | # | ||
| 1211 | |||
| 1212 | # | ||
| 1213 | # may also be needed; see USB_STORAGE Help for more information | ||
| 1214 | # | ||
| 1215 | CONFIG_USB_STORAGE=m | ||
| 1216 | # CONFIG_USB_STORAGE_DEBUG is not set | ||
| 1217 | # CONFIG_USB_STORAGE_DATAFAB is not set | ||
| 1218 | # CONFIG_USB_STORAGE_FREECOM is not set | ||
| 1219 | # CONFIG_USB_STORAGE_ISD200 is not set | ||
| 1220 | # CONFIG_USB_STORAGE_DPCM is not set | ||
| 1221 | # CONFIG_USB_STORAGE_USBAT is not set | ||
| 1222 | # CONFIG_USB_STORAGE_SDDR09 is not set | ||
| 1223 | # CONFIG_USB_STORAGE_SDDR55 is not set | ||
| 1224 | # CONFIG_USB_STORAGE_JUMPSHOT is not set | ||
| 1225 | # CONFIG_USB_STORAGE_ALAUDA is not set | ||
| 1226 | # CONFIG_USB_STORAGE_KARMA is not set | ||
| 1227 | # CONFIG_USB_LIBUSUAL is not set | ||
| 1228 | |||
| 1229 | # | ||
| 1230 | # USB Imaging devices | ||
| 1231 | # | ||
| 1232 | CONFIG_USB_MDC800=m | ||
| 1233 | CONFIG_USB_MICROTEK=m | ||
| 1234 | CONFIG_USB_MON=y | ||
| 1235 | |||
| 1236 | # | ||
| 1237 | # USB port drivers | ||
| 1238 | # | ||
| 1239 | |||
| 1240 | # | ||
| 1241 | # USB Serial Converter support | ||
| 1242 | # | ||
| 1243 | CONFIG_USB_SERIAL=m | ||
| 1244 | CONFIG_USB_SERIAL_GENERIC=y | ||
| 1245 | # CONFIG_USB_SERIAL_AIRCABLE is not set | ||
| 1246 | # CONFIG_USB_SERIAL_AIRPRIME is not set | ||
| 1247 | # CONFIG_USB_SERIAL_ARK3116 is not set | ||
| 1248 | CONFIG_USB_SERIAL_BELKIN=m | ||
| 1249 | # CONFIG_USB_SERIAL_CH341 is not set | ||
| 1250 | # CONFIG_USB_SERIAL_WHITEHEAT is not set | ||
| 1251 | CONFIG_USB_SERIAL_DIGI_ACCELEPORT=m | ||
| 1252 | # CONFIG_USB_SERIAL_CP2101 is not set | ||
| 1253 | CONFIG_USB_SERIAL_CYPRESS_M8=m | ||
| 1254 | CONFIG_USB_SERIAL_EMPEG=m | ||
| 1255 | CONFIG_USB_SERIAL_FTDI_SIO=m | ||
| 1256 | # CONFIG_USB_SERIAL_FUNSOFT is not set | ||
| 1257 | CONFIG_USB_SERIAL_VISOR=m | ||
| 1258 | CONFIG_USB_SERIAL_IPAQ=m | ||
| 1259 | CONFIG_USB_SERIAL_IR=m | ||
| 1260 | CONFIG_USB_SERIAL_EDGEPORT=m | ||
| 1261 | CONFIG_USB_SERIAL_EDGEPORT_TI=m | ||
| 1262 | CONFIG_USB_SERIAL_GARMIN=m | ||
| 1263 | CONFIG_USB_SERIAL_IPW=m | ||
| 1264 | CONFIG_USB_SERIAL_KEYSPAN_PDA=m | ||
| 1265 | CONFIG_USB_SERIAL_KEYSPAN=m | ||
| 1266 | # CONFIG_USB_SERIAL_KEYSPAN_MPR is not set | ||
| 1267 | # CONFIG_USB_SERIAL_KEYSPAN_USA28 is not set | ||
| 1268 | # CONFIG_USB_SERIAL_KEYSPAN_USA28X is not set | ||
| 1269 | # CONFIG_USB_SERIAL_KEYSPAN_USA28XA is not set | ||
| 1270 | # CONFIG_USB_SERIAL_KEYSPAN_USA28XB is not set | ||
| 1271 | # CONFIG_USB_SERIAL_KEYSPAN_USA19 is not set | ||
| 1272 | # CONFIG_USB_SERIAL_KEYSPAN_USA18X is not set | ||
| 1273 | # CONFIG_USB_SERIAL_KEYSPAN_USA19W is not set | ||
| 1274 | # CONFIG_USB_SERIAL_KEYSPAN_USA19QW is not set | ||
| 1275 | # CONFIG_USB_SERIAL_KEYSPAN_USA19QI is not set | ||
| 1276 | # CONFIG_USB_SERIAL_KEYSPAN_USA49W is not set | ||
| 1277 | # CONFIG_USB_SERIAL_KEYSPAN_USA49WLC is not set | ||
| 1278 | CONFIG_USB_SERIAL_KLSI=m | ||
| 1279 | CONFIG_USB_SERIAL_KOBIL_SCT=m | ||
| 1280 | CONFIG_USB_SERIAL_MCT_U232=m | ||
| 1281 | # CONFIG_USB_SERIAL_MOS7720 is not set | ||
| 1282 | # CONFIG_USB_SERIAL_MOS7840 is not set | ||
| 1283 | # CONFIG_USB_SERIAL_NAVMAN is not set | ||
| 1284 | CONFIG_USB_SERIAL_PL2303=m | ||
| 1285 | # CONFIG_USB_SERIAL_OTI6858 is not set | ||
| 1286 | # CONFIG_USB_SERIAL_HP4X is not set | ||
| 1287 | CONFIG_USB_SERIAL_SAFE=m | ||
| 1288 | # CONFIG_USB_SERIAL_SAFE_PADDED is not set | ||
| 1289 | # CONFIG_USB_SERIAL_SIERRAWIRELESS is not set | ||
| 1290 | CONFIG_USB_SERIAL_TI=m | ||
| 1291 | CONFIG_USB_SERIAL_CYBERJACK=m | ||
| 1292 | CONFIG_USB_SERIAL_XIRCOM=m | ||
| 1293 | # CONFIG_USB_SERIAL_OPTION is not set | ||
| 1294 | CONFIG_USB_SERIAL_OMNINET=m | ||
| 1295 | # CONFIG_USB_SERIAL_DEBUG is not set | ||
| 1296 | CONFIG_USB_EZUSB=y | ||
| 1297 | |||
| 1298 | # | ||
| 1299 | # USB Miscellaneous drivers | ||
| 1300 | # | ||
| 1301 | CONFIG_USB_EMI62=m | ||
| 1302 | CONFIG_USB_EMI26=m | ||
| 1303 | # CONFIG_USB_ADUTUX is not set | ||
| 1304 | CONFIG_USB_AUERSWALD=m | ||
| 1305 | CONFIG_USB_RIO500=m | ||
| 1306 | CONFIG_USB_LEGOTOWER=m | ||
| 1307 | CONFIG_USB_LCD=m | ||
| 1308 | # CONFIG_USB_BERRY_CHARGE is not set | ||
| 1309 | CONFIG_USB_LED=m | ||
| 1310 | # CONFIG_USB_CYPRESS_CY7C63 is not set | ||
| 1311 | CONFIG_USB_CYTHERM=m | ||
| 1312 | # CONFIG_USB_PHIDGET is not set | ||
| 1313 | CONFIG_USB_IDMOUSE=m | ||
| 1314 | # CONFIG_USB_FTDI_ELAN is not set | ||
| 1315 | # CONFIG_USB_APPLEDISPLAY is not set | ||
| 1316 | # CONFIG_USB_LD is not set | ||
| 1317 | # CONFIG_USB_TRANCEVIBRATOR is not set | ||
| 1318 | # CONFIG_USB_IOWARRIOR is not set | ||
| 1319 | # CONFIG_USB_TEST is not set | ||
| 1320 | |||
| 1321 | # | ||
| 1322 | # USB DSL modem support | ||
| 1323 | # | ||
| 1324 | |||
| 1325 | # | ||
| 1326 | # USB Gadget Support | ||
| 1327 | # | ||
| 1328 | CONFIG_USB_GADGET=y | ||
| 1329 | # CONFIG_USB_GADGET_DEBUG is not set | ||
| 1330 | # CONFIG_USB_GADGET_DEBUG_FILES is not set | ||
| 1331 | CONFIG_USB_GADGET_SELECTED=y | ||
| 1332 | # CONFIG_USB_GADGET_AMD5536UDC is not set | ||
| 1333 | # CONFIG_USB_GADGET_ATMEL_USBA is not set | ||
| 1334 | # CONFIG_USB_GADGET_FSL_USB2 is not set | ||
| 1335 | # CONFIG_USB_GADGET_NET2280 is not set | ||
| 1336 | # CONFIG_USB_GADGET_PXA2XX is not set | ||
| 1337 | # CONFIG_USB_GADGET_M66592 is not set | ||
| 1338 | CONFIG_USB_GADGET_PXA27X=y | ||
| 1339 | CONFIG_USB_PXA27X=y | ||
| 1340 | # CONFIG_USB_GADGET_GOKU is not set | ||
| 1341 | # CONFIG_USB_GADGET_LH7A40X is not set | ||
| 1342 | # CONFIG_USB_GADGET_OMAP is not set | ||
| 1343 | # CONFIG_USB_GADGET_S3C2410 is not set | ||
| 1344 | # CONFIG_USB_GADGET_AT91 is not set | ||
| 1345 | # CONFIG_USB_GADGET_DUMMY_HCD is not set | ||
| 1346 | # CONFIG_USB_GADGET_DUALSPEED is not set | ||
| 1347 | CONFIG_USB_ZERO=m | ||
| 1348 | CONFIG_USB_ETH=m | ||
| 1349 | CONFIG_USB_ETH_RNDIS=y | ||
| 1350 | CONFIG_USB_GADGETFS=m | ||
| 1351 | CONFIG_USB_FILE_STORAGE=m | ||
| 1352 | # CONFIG_USB_FILE_STORAGE_TEST is not set | ||
| 1353 | CONFIG_USB_G_SERIAL=m | ||
| 1354 | # CONFIG_USB_MIDI_GADGET is not set | ||
| 1355 | CONFIG_MMC=y | ||
| 1356 | # CONFIG_MMC_DEBUG is not set | ||
| 1357 | CONFIG_MMC_UNSAFE_RESUME=y | ||
| 1358 | |||
| 1359 | # | ||
| 1360 | # MMC/SD Card Drivers | ||
| 1361 | # | ||
| 1362 | CONFIG_MMC_BLOCK=y | ||
| 1363 | CONFIG_MMC_BLOCK_BOUNCE=y | ||
| 1364 | # CONFIG_SDIO_UART is not set | ||
| 1365 | |||
| 1366 | # | ||
| 1367 | # MMC/SD Host Controller Drivers | ||
| 1368 | # | ||
| 1369 | CONFIG_MMC_PXA=y | ||
| 1370 | CONFIG_NEW_LEDS=y | ||
| 1371 | CONFIG_LEDS_CLASS=y | ||
| 1372 | |||
| 1373 | # | ||
| 1374 | # LED drivers | ||
| 1375 | # | ||
| 1376 | # CONFIG_LEDS_GPIO is not set | ||
| 1377 | |||
| 1378 | # | ||
| 1379 | # LED Triggers | ||
| 1380 | # | ||
| 1381 | CONFIG_LEDS_TRIGGERS=y | ||
| 1382 | CONFIG_LEDS_TRIGGER_TIMER=y | ||
| 1383 | CONFIG_LEDS_TRIGGER_IDE_DISK=y | ||
| 1384 | # CONFIG_LEDS_TRIGGER_HEARTBEAT is not set | ||
| 1385 | CONFIG_RTC_LIB=y | ||
| 1386 | CONFIG_RTC_CLASS=y | ||
| 1387 | CONFIG_RTC_HCTOSYS=y | ||
| 1388 | CONFIG_RTC_HCTOSYS_DEVICE="rtc0" | ||
| 1389 | # CONFIG_RTC_DEBUG is not set | ||
| 1390 | |||
| 1391 | # | ||
| 1392 | # RTC interfaces | ||
| 1393 | # | ||
| 1394 | CONFIG_RTC_INTF_SYSFS=y | ||
| 1395 | CONFIG_RTC_INTF_PROC=y | ||
| 1396 | CONFIG_RTC_INTF_DEV=y | ||
| 1397 | # CONFIG_RTC_INTF_DEV_UIE_EMUL is not set | ||
| 1398 | # CONFIG_RTC_DRV_TEST is not set | ||
| 1399 | |||
| 1400 | # | ||
| 1401 | # I2C RTC drivers | ||
| 1402 | # | ||
| 1403 | # CONFIG_RTC_DRV_DS1307 is not set | ||
| 1404 | # CONFIG_RTC_DRV_DS1374 is not set | ||
| 1405 | # CONFIG_RTC_DRV_DS1672 is not set | ||
| 1406 | # CONFIG_RTC_DRV_MAX6900 is not set | ||
| 1407 | # CONFIG_RTC_DRV_RS5C372 is not set | ||
| 1408 | # CONFIG_RTC_DRV_ISL1208 is not set | ||
| 1409 | # CONFIG_RTC_DRV_X1205 is not set | ||
| 1410 | # CONFIG_RTC_DRV_PCF8563 is not set | ||
| 1411 | # CONFIG_RTC_DRV_PCF8583 is not set | ||
| 1412 | # CONFIG_RTC_DRV_M41T80 is not set | ||
| 1413 | |||
| 1414 | # | ||
| 1415 | # SPI RTC drivers | ||
| 1416 | # | ||
| 1417 | |||
| 1418 | # | ||
| 1419 | # Platform RTC drivers | ||
| 1420 | # | ||
| 1421 | # CONFIG_RTC_DRV_CMOS is not set | ||
| 1422 | # CONFIG_RTC_DRV_DS1553 is not set | ||
| 1423 | # CONFIG_RTC_DRV_STK17TA8 is not set | ||
| 1424 | # CONFIG_RTC_DRV_DS1742 is not set | ||
| 1425 | # CONFIG_RTC_DRV_M48T86 is not set | ||
| 1426 | # CONFIG_RTC_DRV_M48T59 is not set | ||
| 1427 | # CONFIG_RTC_DRV_V3020 is not set | ||
| 1428 | |||
| 1429 | # | ||
| 1430 | # on-CPU RTC drivers | ||
| 1431 | # | ||
| 1432 | CONFIG_RTC_DRV_SA1100=y | ||
| 1433 | |||
| 1434 | # | ||
| 1435 | # File systems | ||
| 1436 | # | ||
| 1437 | CONFIG_EXT2_FS=y | ||
| 1438 | # CONFIG_EXT2_FS_XATTR is not set | ||
| 1439 | # CONFIG_EXT2_FS_XIP is not set | ||
| 1440 | CONFIG_EXT3_FS=m | ||
| 1441 | # CONFIG_EXT3_FS_XATTR is not set | ||
| 1442 | # CONFIG_EXT4DEV_FS is not set | ||
| 1443 | CONFIG_JBD=m | ||
| 1444 | # CONFIG_REISERFS_FS is not set | ||
| 1445 | # CONFIG_JFS_FS is not set | ||
| 1446 | CONFIG_FS_POSIX_ACL=y | ||
| 1447 | # CONFIG_XFS_FS is not set | ||
| 1448 | # CONFIG_GFS2_FS is not set | ||
| 1449 | # CONFIG_OCFS2_FS is not set | ||
| 1450 | # CONFIG_MINIX_FS is not set | ||
| 1451 | # CONFIG_ROMFS_FS is not set | ||
| 1452 | CONFIG_INOTIFY=y | ||
| 1453 | CONFIG_INOTIFY_USER=y | ||
| 1454 | # CONFIG_QUOTA is not set | ||
| 1455 | CONFIG_DNOTIFY=y | ||
| 1456 | # CONFIG_AUTOFS_FS is not set | ||
| 1457 | # CONFIG_AUTOFS4_FS is not set | ||
| 1458 | # CONFIG_FUSE_FS is not set | ||
| 1459 | |||
| 1460 | # | ||
| 1461 | # CD-ROM/DVD Filesystems | ||
| 1462 | # | ||
| 1463 | # CONFIG_ISO9660_FS is not set | ||
| 1464 | # CONFIG_UDF_FS is not set | ||
| 1465 | |||
| 1466 | # | ||
| 1467 | # DOS/FAT/NT Filesystems | ||
| 1468 | # | ||
| 1469 | CONFIG_FAT_FS=y | ||
| 1470 | # CONFIG_MSDOS_FS is not set | ||
| 1471 | CONFIG_VFAT_FS=y | ||
| 1472 | CONFIG_FAT_DEFAULT_CODEPAGE=437 | ||
| 1473 | CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" | ||
| 1474 | # CONFIG_NTFS_FS is not set | ||
| 1475 | |||
| 1476 | # | ||
| 1477 | # Pseudo filesystems | ||
| 1478 | # | ||
| 1479 | CONFIG_PROC_FS=y | ||
| 1480 | CONFIG_PROC_SYSCTL=y | ||
| 1481 | CONFIG_SYSFS=y | ||
| 1482 | CONFIG_TMPFS=y | ||
| 1483 | # CONFIG_TMPFS_POSIX_ACL is not set | ||
| 1484 | # CONFIG_HUGETLB_PAGE is not set | ||
| 1485 | # CONFIG_CONFIGFS_FS is not set | ||
| 1486 | |||
| 1487 | # | ||
| 1488 | # Miscellaneous filesystems | ||
| 1489 | # | ||
| 1490 | # CONFIG_ADFS_FS is not set | ||
| 1491 | # CONFIG_AFFS_FS is not set | ||
| 1492 | # CONFIG_HFS_FS is not set | ||
| 1493 | # CONFIG_HFSPLUS_FS is not set | ||
| 1494 | # CONFIG_BEFS_FS is not set | ||
| 1495 | # CONFIG_BFS_FS is not set | ||
| 1496 | # CONFIG_EFS_FS is not set | ||
| 1497 | CONFIG_JFFS2_FS=y | ||
| 1498 | CONFIG_JFFS2_FS_DEBUG=0 | ||
| 1499 | CONFIG_JFFS2_FS_WRITEBUFFER=y | ||
| 1500 | # CONFIG_JFFS2_FS_WBUF_VERIFY is not set | ||
| 1501 | CONFIG_JFFS2_SUMMARY=y | ||
| 1502 | # CONFIG_JFFS2_FS_XATTR is not set | ||
| 1503 | # CONFIG_JFFS2_SYSFS is not set | ||
| 1504 | CONFIG_JFFS2_COMPRESSION_OPTIONS=y | ||
| 1505 | CONFIG_JFFS2_ZLIB=y | ||
| 1506 | CONFIG_JFFS2_LZO=y | ||
| 1507 | CONFIG_JFFS2_RTIME=y | ||
| 1508 | CONFIG_JFFS2_RUBIN=y | ||
| 1509 | # CONFIG_JFFS2_CMODE_NONE is not set | ||
| 1510 | CONFIG_JFFS2_CMODE_PRIORITY=y | ||
| 1511 | # CONFIG_JFFS2_CMODE_SIZE is not set | ||
| 1512 | # CONFIG_JFFS2_CMODE_FAVOURLZO is not set | ||
| 1513 | CONFIG_CRAMFS=m | ||
| 1514 | CONFIG_SQUASHFS=m | ||
| 1515 | # CONFIG_SQUASHFS_EMBEDDED is not set | ||
| 1516 | CONFIG_SQUASHFS_FRAGMENT_CACHE_SIZE=3 | ||
| 1517 | # CONFIG_VXFS_FS is not set | ||
| 1518 | # CONFIG_HPFS_FS is not set | ||
| 1519 | # CONFIG_QNX4FS_FS is not set | ||
| 1520 | # CONFIG_SYSV_FS is not set | ||
| 1521 | # CONFIG_UFS_FS is not set | ||
| 1522 | CONFIG_NETWORK_FILESYSTEMS=y | ||
| 1523 | CONFIG_NFS_FS=m | ||
| 1524 | CONFIG_NFS_V3=y | ||
| 1525 | # CONFIG_NFS_V3_ACL is not set | ||
| 1526 | CONFIG_NFS_V4=y | ||
| 1527 | # CONFIG_NFS_DIRECTIO is not set | ||
| 1528 | CONFIG_NFSD=m | ||
| 1529 | CONFIG_NFSD_V3=y | ||
| 1530 | # CONFIG_NFSD_V3_ACL is not set | ||
| 1531 | CONFIG_NFSD_V4=y | ||
| 1532 | CONFIG_NFSD_TCP=y | ||
| 1533 | CONFIG_LOCKD=m | ||
| 1534 | CONFIG_LOCKD_V4=y | ||
| 1535 | CONFIG_EXPORTFS=m | ||
| 1536 | CONFIG_NFS_COMMON=y | ||
| 1537 | CONFIG_SUNRPC=m | ||
| 1538 | CONFIG_SUNRPC_GSS=m | ||
| 1539 | # CONFIG_SUNRPC_BIND34 is not set | ||
| 1540 | CONFIG_RPCSEC_GSS_KRB5=m | ||
| 1541 | # CONFIG_RPCSEC_GSS_SPKM3 is not set | ||
| 1542 | CONFIG_SMB_FS=m | ||
| 1543 | CONFIG_SMB_NLS_DEFAULT=y | ||
| 1544 | CONFIG_SMB_NLS_REMOTE="cp437" | ||
| 1545 | CONFIG_CIFS=m | ||
| 1546 | # CONFIG_CIFS_STATS is not set | ||
| 1547 | # CONFIG_CIFS_WEAK_PW_HASH is not set | ||
| 1548 | # CONFIG_CIFS_XATTR is not set | ||
| 1549 | # CONFIG_CIFS_DEBUG2 is not set | ||
| 1550 | # CONFIG_CIFS_EXPERIMENTAL is not set | ||
| 1551 | # CONFIG_NCP_FS is not set | ||
| 1552 | # CONFIG_CODA_FS is not set | ||
| 1553 | # CONFIG_AFS_FS is not set | ||
| 1554 | |||
| 1555 | # | ||
| 1556 | # Partition Types | ||
| 1557 | # | ||
| 1558 | CONFIG_PARTITION_ADVANCED=y | ||
| 1559 | # CONFIG_ACORN_PARTITION is not set | ||
| 1560 | # CONFIG_OSF_PARTITION is not set | ||
| 1561 | # CONFIG_AMIGA_PARTITION is not set | ||
| 1562 | # CONFIG_ATARI_PARTITION is not set | ||
| 1563 | # CONFIG_MAC_PARTITION is not set | ||
| 1564 | CONFIG_MSDOS_PARTITION=y | ||
| 1565 | # CONFIG_BSD_DISKLABEL is not set | ||
| 1566 | # CONFIG_MINIX_SUBPARTITION is not set | ||
| 1567 | # CONFIG_SOLARIS_X86_PARTITION is not set | ||
| 1568 | # CONFIG_UNIXWARE_DISKLABEL is not set | ||
| 1569 | # CONFIG_LDM_PARTITION is not set | ||
| 1570 | # CONFIG_SGI_PARTITION is not set | ||
| 1571 | # CONFIG_ULTRIX_PARTITION is not set | ||
| 1572 | # CONFIG_SUN_PARTITION is not set | ||
| 1573 | # CONFIG_KARMA_PARTITION is not set | ||
| 1574 | # CONFIG_EFI_PARTITION is not set | ||
| 1575 | # CONFIG_SYSV68_PARTITION is not set | ||
| 1576 | CONFIG_NLS=y | ||
| 1577 | CONFIG_NLS_DEFAULT="cp437" | ||
| 1578 | CONFIG_NLS_CODEPAGE_437=y | ||
| 1579 | CONFIG_NLS_CODEPAGE_737=m | ||
| 1580 | CONFIG_NLS_CODEPAGE_775=m | ||
| 1581 | CONFIG_NLS_CODEPAGE_850=m | ||
| 1582 | CONFIG_NLS_CODEPAGE_852=m | ||
| 1583 | CONFIG_NLS_CODEPAGE_855=m | ||
| 1584 | CONFIG_NLS_CODEPAGE_857=m | ||
| 1585 | CONFIG_NLS_CODEPAGE_860=m | ||
| 1586 | CONFIG_NLS_CODEPAGE_861=m | ||
| 1587 | CONFIG_NLS_CODEPAGE_862=m | ||
| 1588 | CONFIG_NLS_CODEPAGE_863=m | ||
| 1589 | CONFIG_NLS_CODEPAGE_864=m | ||
| 1590 | CONFIG_NLS_CODEPAGE_865=m | ||
| 1591 | CONFIG_NLS_CODEPAGE_866=m | ||
| 1592 | CONFIG_NLS_CODEPAGE_869=m | ||
| 1593 | CONFIG_NLS_CODEPAGE_936=m | ||
| 1594 | CONFIG_NLS_CODEPAGE_950=m | ||
| 1595 | CONFIG_NLS_CODEPAGE_932=m | ||
| 1596 | CONFIG_NLS_CODEPAGE_949=m | ||
| 1597 | CONFIG_NLS_CODEPAGE_874=m | ||
| 1598 | CONFIG_NLS_ISO8859_8=m | ||
| 1599 | CONFIG_NLS_CODEPAGE_1250=m | ||
| 1600 | CONFIG_NLS_CODEPAGE_1251=m | ||
| 1601 | CONFIG_NLS_ASCII=m | ||
| 1602 | CONFIG_NLS_ISO8859_1=y | ||
| 1603 | CONFIG_NLS_ISO8859_2=m | ||
| 1604 | CONFIG_NLS_ISO8859_3=m | ||
| 1605 | CONFIG_NLS_ISO8859_4=m | ||
| 1606 | CONFIG_NLS_ISO8859_5=m | ||
| 1607 | CONFIG_NLS_ISO8859_6=m | ||
| 1608 | CONFIG_NLS_ISO8859_7=m | ||
| 1609 | CONFIG_NLS_ISO8859_9=m | ||
| 1610 | CONFIG_NLS_ISO8859_13=m | ||
| 1611 | CONFIG_NLS_ISO8859_14=m | ||
| 1612 | CONFIG_NLS_ISO8859_15=m | ||
| 1613 | CONFIG_NLS_KOI8_R=m | ||
| 1614 | CONFIG_NLS_KOI8_U=m | ||
| 1615 | CONFIG_NLS_UTF8=y | ||
| 1616 | # CONFIG_DLM is not set | ||
| 1617 | CONFIG_INSTRUMENTATION=y | ||
| 1618 | CONFIG_PROFILING=y | ||
| 1619 | CONFIG_OPROFILE=m | ||
| 1620 | # CONFIG_MARKERS is not set | ||
| 1621 | |||
| 1622 | # | ||
| 1623 | # Kernel hacking | ||
| 1624 | # | ||
| 1625 | # CONFIG_PRINTK_TIME is not set | ||
| 1626 | CONFIG_ENABLE_WARN_DEPRECATED=y | ||
| 1627 | CONFIG_ENABLE_MUST_CHECK=y | ||
| 1628 | CONFIG_MAGIC_SYSRQ=y | ||
| 1629 | # CONFIG_UNUSED_SYMBOLS is not set | ||
| 1630 | # CONFIG_DEBUG_FS is not set | ||
| 1631 | # CONFIG_HEADERS_CHECK is not set | ||
| 1632 | CONFIG_DEBUG_KERNEL=y | ||
| 1633 | # CONFIG_DEBUG_SHIRQ is not set | ||
| 1634 | # CONFIG_DETECT_SOFTLOCKUP is not set | ||
| 1635 | # CONFIG_SCHED_DEBUG is not set | ||
| 1636 | # CONFIG_SCHEDSTATS is not set | ||
| 1637 | CONFIG_TIMER_STATS=y | ||
| 1638 | # CONFIG_DEBUG_SLAB is not set | ||
| 1639 | # CONFIG_DEBUG_PREEMPT is not set | ||
| 1640 | # CONFIG_DEBUG_RT_MUTEXES is not set | ||
| 1641 | # CONFIG_RT_MUTEX_TESTER is not set | ||
| 1642 | # CONFIG_DEBUG_SPINLOCK is not set | ||
| 1643 | # CONFIG_DEBUG_MUTEXES is not set | ||
| 1644 | # CONFIG_DEBUG_LOCK_ALLOC is not set | ||
| 1645 | # CONFIG_PROVE_LOCKING is not set | ||
| 1646 | # CONFIG_LOCK_STAT is not set | ||
| 1647 | # CONFIG_DEBUG_SPINLOCK_SLEEP is not set | ||
| 1648 | # CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set | ||
| 1649 | # CONFIG_DEBUG_KOBJECT is not set | ||
| 1650 | CONFIG_DEBUG_BUGVERBOSE=y | ||
| 1651 | # CONFIG_DEBUG_INFO is not set | ||
| 1652 | # CONFIG_DEBUG_VM is not set | ||
| 1653 | # CONFIG_DEBUG_LIST is not set | ||
| 1654 | # CONFIG_DEBUG_SG is not set | ||
| 1655 | CONFIG_FRAME_POINTER=y | ||
| 1656 | # CONFIG_FORCED_INLINING is not set | ||
| 1657 | # CONFIG_BOOT_PRINTK_DELAY is not set | ||
| 1658 | # CONFIG_RCU_TORTURE_TEST is not set | ||
| 1659 | # CONFIG_FAULT_INJECTION is not set | ||
| 1660 | # CONFIG_SAMPLES is not set | ||
| 1661 | # CONFIG_DEBUG_USER is not set | ||
| 1662 | CONFIG_DEBUG_ERRORS=y | ||
| 1663 | # CONFIG_DEBUG_LL is not set | ||
| 1664 | |||
| 1665 | # | ||
| 1666 | # Security options | ||
| 1667 | # | ||
| 1668 | # CONFIG_KEYS is not set | ||
| 1669 | # CONFIG_SECURITY is not set | ||
| 1670 | # CONFIG_SECURITY_FILE_CAPABILITIES is not set | ||
| 1671 | CONFIG_CRYPTO=y | ||
| 1672 | CONFIG_CRYPTO_ALGAPI=m | ||
| 1673 | CONFIG_CRYPTO_BLKCIPHER=m | ||
| 1674 | CONFIG_CRYPTO_HASH=m | ||
| 1675 | CONFIG_CRYPTO_MANAGER=m | ||
| 1676 | CONFIG_CRYPTO_HMAC=m | ||
| 1677 | # CONFIG_CRYPTO_XCBC is not set | ||
| 1678 | CONFIG_CRYPTO_NULL=m | ||
| 1679 | CONFIG_CRYPTO_MD4=m | ||
| 1680 | CONFIG_CRYPTO_MD5=m | ||
| 1681 | CONFIG_CRYPTO_SHA1=m | ||
| 1682 | CONFIG_CRYPTO_SHA256=m | ||
| 1683 | CONFIG_CRYPTO_SHA512=m | ||
| 1684 | CONFIG_CRYPTO_WP512=m | ||
| 1685 | # CONFIG_CRYPTO_TGR192 is not set | ||
| 1686 | # CONFIG_CRYPTO_GF128MUL is not set | ||
| 1687 | CONFIG_CRYPTO_ECB=m | ||
| 1688 | CONFIG_CRYPTO_CBC=m | ||
| 1689 | CONFIG_CRYPTO_PCBC=m | ||
| 1690 | # CONFIG_CRYPTO_LRW is not set | ||
| 1691 | # CONFIG_CRYPTO_XTS is not set | ||
| 1692 | # CONFIG_CRYPTO_CRYPTD is not set | ||
| 1693 | CONFIG_CRYPTO_DES=m | ||
| 1694 | # CONFIG_CRYPTO_FCRYPT is not set | ||
| 1695 | CONFIG_CRYPTO_BLOWFISH=m | ||
| 1696 | CONFIG_CRYPTO_TWOFISH=m | ||
| 1697 | CONFIG_CRYPTO_TWOFISH_COMMON=m | ||
| 1698 | CONFIG_CRYPTO_SERPENT=m | ||
| 1699 | CONFIG_CRYPTO_AES=m | ||
| 1700 | CONFIG_CRYPTO_CAST5=m | ||
| 1701 | CONFIG_CRYPTO_CAST6=m | ||
| 1702 | CONFIG_CRYPTO_TEA=m | ||
| 1703 | CONFIG_CRYPTO_ARC4=m | ||
| 1704 | CONFIG_CRYPTO_KHAZAD=m | ||
| 1705 | CONFIG_CRYPTO_ANUBIS=m | ||
| 1706 | # CONFIG_CRYPTO_SEED is not set | ||
| 1707 | CONFIG_CRYPTO_DEFLATE=m | ||
| 1708 | CONFIG_CRYPTO_LZO=m | ||
| 1709 | CONFIG_CRYPTO_MICHAEL_MIC=m | ||
| 1710 | CONFIG_CRYPTO_CRC32C=m | ||
| 1711 | CONFIG_CRYPTO_CAMELLIA=m | ||
| 1712 | CONFIG_CRYPTO_TEST=m | ||
| 1713 | # CONFIG_CRYPTO_AUTHENC is not set | ||
| 1714 | # CONFIG_CRYPTO_HW is not set | ||
| 1715 | |||
| 1716 | # | ||
| 1717 | # Library routines | ||
| 1718 | # | ||
| 1719 | CONFIG_BITREVERSE=y | ||
| 1720 | CONFIG_CRC_CCITT=y | ||
| 1721 | # CONFIG_CRC16 is not set | ||
| 1722 | # CONFIG_CRC_ITU_T is not set | ||
| 1723 | CONFIG_CRC32=y | ||
| 1724 | # CONFIG_CRC7 is not set | ||
| 1725 | CONFIG_LIBCRC32C=m | ||
| 1726 | CONFIG_ZLIB_INFLATE=y | ||
| 1727 | CONFIG_ZLIB_DEFLATE=y | ||
| 1728 | CONFIG_LZO_COMPRESS=y | ||
| 1729 | CONFIG_LZO_DECOMPRESS=y | ||
| 1730 | CONFIG_PLIST=y | ||
| 1731 | CONFIG_HAS_IOMEM=y | ||
| 1732 | CONFIG_HAS_IOPORT=y | ||
| 1733 | CONFIG_HAS_DMA=y | ||
diff --git a/meta/packages/linux/linux-rp-2.6.25+2.6.26-rc4/defconfig-poodle b/meta/packages/linux/linux-rp-2.6.25+2.6.26-rc4/defconfig-poodle new file mode 100644 index 0000000000..7d41252b15 --- /dev/null +++ b/meta/packages/linux/linux-rp-2.6.25+2.6.26-rc4/defconfig-poodle | |||
| @@ -0,0 +1,1757 @@ | |||
| 1 | # | ||
| 2 | # Automatically generated make config: don't edit | ||
| 3 | # Linux kernel version: 2.6.24-rc8 | ||
| 4 | # Sun Jan 20 22:47:47 2008 | ||
| 5 | # | ||
| 6 | CONFIG_ARM=y | ||
| 7 | CONFIG_SYS_SUPPORTS_APM_EMULATION=y | ||
| 8 | CONFIG_GENERIC_GPIO=y | ||
| 9 | CONFIG_GENERIC_TIME=y | ||
| 10 | CONFIG_GENERIC_CLOCKEVENTS=y | ||
| 11 | CONFIG_MMU=y | ||
| 12 | # CONFIG_NO_IOPORT is not set | ||
| 13 | CONFIG_GENERIC_HARDIRQS=y | ||
| 14 | CONFIG_STACKTRACE_SUPPORT=y | ||
| 15 | CONFIG_LOCKDEP_SUPPORT=y | ||
| 16 | CONFIG_TRACE_IRQFLAGS_SUPPORT=y | ||
| 17 | CONFIG_HARDIRQS_SW_RESEND=y | ||
| 18 | CONFIG_GENERIC_IRQ_PROBE=y | ||
| 19 | CONFIG_RWSEM_GENERIC_SPINLOCK=y | ||
| 20 | # CONFIG_ARCH_HAS_ILOG2_U32 is not set | ||
| 21 | # CONFIG_ARCH_HAS_ILOG2_U64 is not set | ||
| 22 | CONFIG_GENERIC_HWEIGHT=y | ||
| 23 | CONFIG_GENERIC_CALIBRATE_DELAY=y | ||
| 24 | CONFIG_ZONE_DMA=y | ||
| 25 | CONFIG_ARCH_MTD_XIP=y | ||
| 26 | CONFIG_VECTORS_BASE=0xffff0000 | ||
| 27 | CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" | ||
| 28 | |||
| 29 | # | ||
| 30 | # General setup | ||
| 31 | # | ||
| 32 | CONFIG_EXPERIMENTAL=y | ||
| 33 | CONFIG_BROKEN_ON_SMP=y | ||
| 34 | CONFIG_LOCK_KERNEL=y | ||
| 35 | CONFIG_INIT_ENV_ARG_LIMIT=32 | ||
| 36 | CONFIG_LOCALVERSION="" | ||
| 37 | # CONFIG_LOCALVERSION_AUTO is not set | ||
| 38 | CONFIG_SWAP=y | ||
| 39 | CONFIG_SYSVIPC=y | ||
| 40 | CONFIG_SYSVIPC_SYSCTL=y | ||
| 41 | # CONFIG_POSIX_MQUEUE is not set | ||
| 42 | CONFIG_BSD_PROCESS_ACCT=y | ||
| 43 | CONFIG_BSD_PROCESS_ACCT_V3=y | ||
| 44 | # CONFIG_TASKSTATS is not set | ||
| 45 | # CONFIG_USER_NS is not set | ||
| 46 | # CONFIG_PID_NS is not set | ||
| 47 | # CONFIG_AUDIT is not set | ||
| 48 | # CONFIG_IKCONFIG is not set | ||
| 49 | CONFIG_LOG_BUF_SHIFT=14 | ||
| 50 | # CONFIG_CGROUPS is not set | ||
| 51 | CONFIG_FAIR_GROUP_SCHED=y | ||
| 52 | CONFIG_FAIR_USER_SCHED=y | ||
| 53 | # CONFIG_FAIR_CGROUP_SCHED is not set | ||
| 54 | CONFIG_SYSFS_DEPRECATED=y | ||
| 55 | # CONFIG_RELAY is not set | ||
| 56 | # CONFIG_BLK_DEV_INITRD is not set | ||
| 57 | CONFIG_CC_OPTIMIZE_FOR_SIZE=y | ||
| 58 | CONFIG_SYSCTL=y | ||
| 59 | CONFIG_EMBEDDED=y | ||
| 60 | CONFIG_UID16=y | ||
| 61 | CONFIG_SYSCTL_SYSCALL=y | ||
| 62 | CONFIG_KALLSYMS=y | ||
| 63 | # CONFIG_KALLSYMS_ALL is not set | ||
| 64 | # CONFIG_KALLSYMS_EXTRA_PASS is not set | ||
| 65 | CONFIG_HOTPLUG=y | ||
| 66 | CONFIG_PRINTK=y | ||
| 67 | CONFIG_BUG=y | ||
| 68 | CONFIG_ELF_CORE=y | ||
| 69 | CONFIG_BASE_FULL=y | ||
| 70 | CONFIG_FUTEX=y | ||
| 71 | CONFIG_ANON_INODES=y | ||
| 72 | CONFIG_EPOLL=y | ||
| 73 | CONFIG_SIGNALFD=y | ||
| 74 | CONFIG_EVENTFD=y | ||
| 75 | CONFIG_SHMEM=y | ||
| 76 | CONFIG_VM_EVENT_COUNTERS=y | ||
| 77 | CONFIG_SLAB=y | ||
| 78 | # CONFIG_SLUB is not set | ||
| 79 | # CONFIG_SLOB is not set | ||
| 80 | CONFIG_SLABINFO=y | ||
| 81 | CONFIG_RT_MUTEXES=y | ||
| 82 | # CONFIG_TINY_SHMEM is not set | ||
| 83 | CONFIG_BASE_SMALL=0 | ||
| 84 | CONFIG_MODULES=y | ||
| 85 | CONFIG_MODULE_UNLOAD=y | ||
| 86 | CONFIG_MODULE_FORCE_UNLOAD=y | ||
| 87 | # CONFIG_MODVERSIONS is not set | ||
| 88 | # CONFIG_MODULE_SRCVERSION_ALL is not set | ||
| 89 | CONFIG_KMOD=y | ||
| 90 | CONFIG_BLOCK=y | ||
| 91 | # CONFIG_LBD is not set | ||
| 92 | # CONFIG_BLK_DEV_IO_TRACE is not set | ||
| 93 | # CONFIG_LSF is not set | ||
| 94 | # CONFIG_BLK_DEV_BSG is not set | ||
| 95 | |||
| 96 | # | ||
| 97 | # IO Schedulers | ||
| 98 | # | ||
| 99 | CONFIG_IOSCHED_NOOP=y | ||
| 100 | CONFIG_IOSCHED_AS=y | ||
| 101 | CONFIG_IOSCHED_DEADLINE=m | ||
| 102 | CONFIG_IOSCHED_CFQ=m | ||
| 103 | CONFIG_DEFAULT_AS=y | ||
| 104 | # CONFIG_DEFAULT_DEADLINE is not set | ||
| 105 | # CONFIG_DEFAULT_CFQ is not set | ||
| 106 | # CONFIG_DEFAULT_NOOP is not set | ||
| 107 | CONFIG_DEFAULT_IOSCHED="anticipatory" | ||
| 108 | |||
| 109 | # | ||
| 110 | # System Type | ||
| 111 | # | ||
| 112 | # CONFIG_ARCH_AAEC2000 is not set | ||
| 113 | # CONFIG_ARCH_INTEGRATOR is not set | ||
| 114 | # CONFIG_ARCH_REALVIEW is not set | ||
| 115 | # CONFIG_ARCH_VERSATILE is not set | ||
| 116 | # CONFIG_ARCH_AT91 is not set | ||
| 117 | # CONFIG_ARCH_CLPS7500 is not set | ||
| 118 | # CONFIG_ARCH_CLPS711X is not set | ||
| 119 | # CONFIG_ARCH_CO285 is not set | ||
| 120 | # CONFIG_ARCH_EBSA110 is not set | ||
| 121 | # CONFIG_ARCH_EP93XX is not set | ||
| 122 | # CONFIG_ARCH_FOOTBRIDGE is not set | ||
| 123 | # CONFIG_ARCH_NETX is not set | ||
| 124 | # CONFIG_ARCH_H720X is not set | ||
| 125 | # CONFIG_ARCH_IMX is not set | ||
| 126 | # CONFIG_ARCH_IOP13XX is not set | ||
| 127 | # CONFIG_ARCH_IOP32X is not set | ||
| 128 | # CONFIG_ARCH_IOP33X is not set | ||
| 129 | # CONFIG_ARCH_IXP23XX is not set | ||
| 130 | # CONFIG_ARCH_IXP2000 is not set | ||
| 131 | # CONFIG_ARCH_IXP4XX is not set | ||
| 132 | # CONFIG_ARCH_L7200 is not set | ||
| 133 | # CONFIG_ARCH_KS8695 is not set | ||
| 134 | # CONFIG_ARCH_NS9XXX is not set | ||
| 135 | # CONFIG_ARCH_MXC is not set | ||
| 136 | # CONFIG_ARCH_PNX4008 is not set | ||
| 137 | CONFIG_ARCH_PXA=y | ||
| 138 | # CONFIG_ARCH_RPC is not set | ||
| 139 | # CONFIG_ARCH_SA1100 is not set | ||
| 140 | # CONFIG_ARCH_S3C2410 is not set | ||
| 141 | # CONFIG_ARCH_SHARK is not set | ||
| 142 | # CONFIG_ARCH_LH7A40X is not set | ||
| 143 | # CONFIG_ARCH_DAVINCI is not set | ||
| 144 | # CONFIG_ARCH_OMAP is not set | ||
| 145 | |||
| 146 | # | ||
| 147 | # Intel PXA2xx/PXA3xx Implementations | ||
| 148 | # | ||
| 149 | # CONFIG_ARCH_LUBBOCK is not set | ||
| 150 | # CONFIG_MACH_LOGICPD_PXA270 is not set | ||
| 151 | # CONFIG_MACH_MAINSTONE is not set | ||
| 152 | # CONFIG_ARCH_PXA_IDP is not set | ||
| 153 | CONFIG_PXA_SHARPSL=y | ||
| 154 | # CONFIG_MACH_TRIZEPS4 is not set | ||
| 155 | # CONFIG_MACH_EM_X270 is not set | ||
| 156 | # CONFIG_MACH_ZYLONITE is not set | ||
| 157 | # CONFIG_MACH_ARMCORE is not set | ||
| 158 | CONFIG_PXA_SHARPSL_25x=y | ||
| 159 | # CONFIG_PXA_SHARPSL_27x is not set | ||
| 160 | # CONFIG_MACH_HX2750 is not set | ||
| 161 | # CONFIG_MACH_HTCUNIVERSAL is not set | ||
| 162 | CONFIG_MACH_POODLE=y | ||
| 163 | # CONFIG_MACH_CORGI is not set | ||
| 164 | # CONFIG_MACH_SHEPHERD is not set | ||
| 165 | # CONFIG_MACH_HUSKY is not set | ||
| 166 | # CONFIG_MACH_TOSA is not set | ||
| 167 | CONFIG_PXA25x=y | ||
| 168 | CONFIG_PXA_SSP=y | ||
| 169 | # CONFIG_PXA_KEYS is not set | ||
| 170 | |||
| 171 | # | ||
| 172 | # Boot options | ||
| 173 | # | ||
| 174 | |||
| 175 | # | ||
| 176 | # Power management | ||
| 177 | # | ||
| 178 | |||
| 179 | # | ||
| 180 | # Processor Type | ||
| 181 | # | ||
| 182 | CONFIG_CPU_32=y | ||
| 183 | CONFIG_CPU_XSCALE=y | ||
| 184 | CONFIG_CPU_32v5=y | ||
| 185 | CONFIG_CPU_ABRT_EV5T=y | ||
| 186 | CONFIG_CPU_CACHE_VIVT=y | ||
| 187 | CONFIG_CPU_TLB_V4WBI=y | ||
| 188 | CONFIG_CPU_CP15=y | ||
| 189 | CONFIG_CPU_CP15_MMU=y | ||
| 190 | |||
| 191 | # | ||
| 192 | # Processor Features | ||
| 193 | # | ||
| 194 | CONFIG_ARM_THUMB=y | ||
| 195 | # CONFIG_CPU_DCACHE_DISABLE is not set | ||
| 196 | # CONFIG_OUTER_CACHE is not set | ||
| 197 | # CONFIG_IWMMXT is not set | ||
| 198 | CONFIG_XSCALE_PMU=y | ||
| 199 | CONFIG_SHARP_LOCOMO=y | ||
| 200 | CONFIG_SHARP_PARAM=y | ||
| 201 | CONFIG_SHARPSL_PM=y | ||
| 202 | CONFIG_SHARP_SCOOP=y | ||
| 203 | |||
| 204 | # | ||
| 205 | # Bus support | ||
| 206 | # | ||
| 207 | # CONFIG_PCI_SYSCALL is not set | ||
| 208 | # CONFIG_ARCH_SUPPORTS_MSI is not set | ||
| 209 | CONFIG_PCCARD=y | ||
| 210 | # CONFIG_PCMCIA_DEBUG is not set | ||
| 211 | CONFIG_PCMCIA=y | ||
| 212 | CONFIG_PCMCIA_LOAD_CIS=y | ||
| 213 | CONFIG_PCMCIA_IOCTL=y | ||
| 214 | |||
| 215 | # | ||
| 216 | # PC-card bridges | ||
| 217 | # | ||
| 218 | CONFIG_PCMCIA_PXA2XX=y | ||
| 219 | |||
| 220 | # | ||
| 221 | # Kernel Features | ||
| 222 | # | ||
| 223 | CONFIG_TICK_ONESHOT=y | ||
| 224 | CONFIG_NO_HZ=y | ||
| 225 | CONFIG_HIGH_RES_TIMERS=y | ||
| 226 | CONFIG_GENERIC_CLOCKEVENTS_BUILD=y | ||
| 227 | CONFIG_PREEMPT=y | ||
| 228 | CONFIG_HZ=100 | ||
| 229 | CONFIG_AEABI=y | ||
| 230 | CONFIG_OABI_COMPAT=y | ||
| 231 | # CONFIG_ARCH_DISCONTIGMEM_ENABLE is not set | ||
| 232 | CONFIG_SELECT_MEMORY_MODEL=y | ||
| 233 | CONFIG_FLATMEM_MANUAL=y | ||
| 234 | # CONFIG_DISCONTIGMEM_MANUAL is not set | ||
| 235 | # CONFIG_SPARSEMEM_MANUAL is not set | ||
| 236 | CONFIG_FLATMEM=y | ||
| 237 | CONFIG_FLAT_NODE_MEM_MAP=y | ||
| 238 | # CONFIG_SPARSEMEM_STATIC is not set | ||
| 239 | # CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set | ||
| 240 | CONFIG_SPLIT_PTLOCK_CPUS=4096 | ||
| 241 | # CONFIG_RESOURCES_64BIT is not set | ||
| 242 | CONFIG_ZONE_DMA_FLAG=1 | ||
| 243 | CONFIG_BOUNCE=y | ||
| 244 | CONFIG_VIRT_TO_BUS=y | ||
| 245 | CONFIG_ALIGNMENT_TRAP=y | ||
| 246 | |||
| 247 | # | ||
| 248 | # Boot options | ||
| 249 | # | ||
| 250 | CONFIG_ZBOOT_ROM_TEXT=0x0 | ||
| 251 | CONFIG_ZBOOT_ROM_BSS=0x0 | ||
| 252 | CONFIG_CMDLINE="console=ttyS0,115200n8 console=tty1 noinitrd root=/dev/mtdblock2 rootfstype=jffs2 fbcon=rotate:1 dyntick=enable debug" | ||
| 253 | # CONFIG_XIP_KERNEL is not set | ||
| 254 | CONFIG_KEXEC=y | ||
| 255 | CONFIG_ATAGS_PROC=y | ||
| 256 | CONFIG_CPU_FREQ_PXA25x=y | ||
| 257 | |||
| 258 | # | ||
| 259 | # CPU Frequency scaling | ||
| 260 | # | ||
| 261 | CONFIG_CPU_FREQ=y | ||
| 262 | CONFIG_CPU_FREQ_TABLE=y | ||
| 263 | CONFIG_CPU_FREQ_DEBUG=y | ||
| 264 | CONFIG_CPU_FREQ_STAT=y | ||
| 265 | # CONFIG_CPU_FREQ_STAT_DETAILS is not set | ||
| 266 | CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE=y | ||
| 267 | # CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set | ||
| 268 | # CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND is not set | ||
| 269 | # CONFIG_CPU_FREQ_DEFAULT_GOV_CONSERVATIVE is not set | ||
| 270 | CONFIG_CPU_FREQ_GOV_PERFORMANCE=y | ||
| 271 | CONFIG_CPU_FREQ_GOV_POWERSAVE=y | ||
| 272 | CONFIG_CPU_FREQ_GOV_USERSPACE=y | ||
| 273 | CONFIG_CPU_FREQ_GOV_ONDEMAND=y | ||
| 274 | CONFIG_CPU_FREQ_GOV_CONSERVATIVE=y | ||
| 275 | |||
| 276 | # | ||
| 277 | # Floating point emulation | ||
| 278 | # | ||
| 279 | |||
| 280 | # | ||
| 281 | # At least one emulation must be selected | ||
| 282 | # | ||
| 283 | CONFIG_FPE_NWFPE=y | ||
| 284 | # CONFIG_FPE_NWFPE_XP is not set | ||
| 285 | # CONFIG_FPE_FASTFPE is not set | ||
| 286 | |||
| 287 | # | ||
| 288 | # Userspace binary formats | ||
| 289 | # | ||
| 290 | CONFIG_BINFMT_ELF=y | ||
| 291 | CONFIG_BINFMT_AOUT=m | ||
| 292 | CONFIG_BINFMT_MISC=m | ||
| 293 | |||
| 294 | # | ||
| 295 | # Power management options | ||
| 296 | # | ||
| 297 | CONFIG_PM=y | ||
| 298 | # CONFIG_PM_LEGACY is not set | ||
| 299 | # CONFIG_PM_DEBUG is not set | ||
| 300 | CONFIG_PM_SLEEP=y | ||
| 301 | CONFIG_SUSPEND_UP_POSSIBLE=y | ||
| 302 | CONFIG_SUSPEND=y | ||
| 303 | CONFIG_APM_EMULATION=y | ||
| 304 | CONFIG_INPUT_APMPOWER=y | ||
| 305 | |||
| 306 | # | ||
| 307 | # Networking | ||
| 308 | # | ||
| 309 | CONFIG_NET=y | ||
| 310 | |||
| 311 | # | ||
| 312 | # Networking options | ||
| 313 | # | ||
| 314 | CONFIG_PACKET=m | ||
| 315 | CONFIG_PACKET_MMAP=y | ||
| 316 | CONFIG_UNIX=y | ||
| 317 | CONFIG_XFRM=y | ||
| 318 | CONFIG_XFRM_USER=m | ||
| 319 | # CONFIG_XFRM_SUB_POLICY is not set | ||
| 320 | # CONFIG_XFRM_MIGRATE is not set | ||
| 321 | # CONFIG_NET_KEY is not set | ||
| 322 | CONFIG_INET=y | ||
| 323 | # CONFIG_IP_MULTICAST is not set | ||
| 324 | # CONFIG_IP_ADVANCED_ROUTER is not set | ||
| 325 | CONFIG_IP_FIB_HASH=y | ||
| 326 | # CONFIG_IP_PNP is not set | ||
| 327 | # CONFIG_NET_IPIP is not set | ||
| 328 | # CONFIG_NET_IPGRE is not set | ||
| 329 | # CONFIG_ARPD is not set | ||
| 330 | CONFIG_SYN_COOKIES=y | ||
| 331 | # CONFIG_INET_AH is not set | ||
| 332 | # CONFIG_INET_ESP is not set | ||
| 333 | # CONFIG_INET_IPCOMP is not set | ||
| 334 | # CONFIG_INET_XFRM_TUNNEL is not set | ||
| 335 | CONFIG_INET_TUNNEL=m | ||
| 336 | CONFIG_INET_XFRM_MODE_TRANSPORT=m | ||
| 337 | CONFIG_INET_XFRM_MODE_TUNNEL=m | ||
| 338 | CONFIG_INET_XFRM_MODE_BEET=m | ||
| 339 | # CONFIG_INET_LRO is not set | ||
| 340 | CONFIG_INET_DIAG=m | ||
| 341 | CONFIG_INET_TCP_DIAG=m | ||
| 342 | # CONFIG_TCP_CONG_ADVANCED is not set | ||
| 343 | CONFIG_TCP_CONG_CUBIC=y | ||
| 344 | CONFIG_DEFAULT_TCP_CONG="cubic" | ||
| 345 | # CONFIG_TCP_MD5SIG is not set | ||
| 346 | # CONFIG_IP_VS is not set | ||
| 347 | CONFIG_IPV6=m | ||
| 348 | # CONFIG_IPV6_PRIVACY is not set | ||
| 349 | # CONFIG_IPV6_ROUTER_PREF is not set | ||
| 350 | # CONFIG_IPV6_OPTIMISTIC_DAD is not set | ||
| 351 | CONFIG_INET6_AH=m | ||
| 352 | CONFIG_INET6_ESP=m | ||
| 353 | CONFIG_INET6_IPCOMP=m | ||
| 354 | # CONFIG_IPV6_MIP6 is not set | ||
| 355 | CONFIG_INET6_XFRM_TUNNEL=m | ||
| 356 | CONFIG_INET6_TUNNEL=m | ||
| 357 | CONFIG_INET6_XFRM_MODE_TRANSPORT=m | ||
| 358 | CONFIG_INET6_XFRM_MODE_TUNNEL=m | ||
| 359 | CONFIG_INET6_XFRM_MODE_BEET=m | ||
| 360 | # CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION is not set | ||
| 361 | CONFIG_IPV6_SIT=m | ||
| 362 | CONFIG_IPV6_TUNNEL=m | ||
| 363 | # CONFIG_IPV6_MULTIPLE_TABLES is not set | ||
| 364 | # CONFIG_NETWORK_SECMARK is not set | ||
| 365 | CONFIG_NETFILTER=y | ||
| 366 | # CONFIG_NETFILTER_DEBUG is not set | ||
| 367 | |||
| 368 | # | ||
| 369 | # Core Netfilter Configuration | ||
| 370 | # | ||
| 371 | # CONFIG_NETFILTER_NETLINK is not set | ||
| 372 | # CONFIG_NF_CONNTRACK_ENABLED is not set | ||
| 373 | # CONFIG_NF_CONNTRACK is not set | ||
| 374 | CONFIG_NETFILTER_XTABLES=m | ||
| 375 | # CONFIG_NETFILTER_XT_TARGET_CLASSIFY is not set | ||
| 376 | # CONFIG_NETFILTER_XT_TARGET_DSCP is not set | ||
| 377 | # CONFIG_NETFILTER_XT_TARGET_MARK is not set | ||
| 378 | # CONFIG_NETFILTER_XT_TARGET_NFQUEUE is not set | ||
| 379 | # CONFIG_NETFILTER_XT_TARGET_NFLOG is not set | ||
| 380 | # CONFIG_NETFILTER_XT_TARGET_TRACE is not set | ||
| 381 | # CONFIG_NETFILTER_XT_TARGET_TCPMSS is not set | ||
| 382 | # CONFIG_NETFILTER_XT_MATCH_COMMENT is not set | ||
| 383 | # CONFIG_NETFILTER_XT_MATCH_DCCP is not set | ||
| 384 | # CONFIG_NETFILTER_XT_MATCH_DSCP is not set | ||
| 385 | # CONFIG_NETFILTER_XT_MATCH_ESP is not set | ||
| 386 | # CONFIG_NETFILTER_XT_MATCH_LENGTH is not set | ||
| 387 | # CONFIG_NETFILTER_XT_MATCH_LIMIT is not set | ||
| 388 | # CONFIG_NETFILTER_XT_MATCH_MAC is not set | ||
| 389 | # CONFIG_NETFILTER_XT_MATCH_MARK is not set | ||
| 390 | # CONFIG_NETFILTER_XT_MATCH_POLICY is not set | ||
| 391 | # CONFIG_NETFILTER_XT_MATCH_MULTIPORT is not set | ||
| 392 | # CONFIG_NETFILTER_XT_MATCH_PKTTYPE is not set | ||
| 393 | # CONFIG_NETFILTER_XT_MATCH_QUOTA is not set | ||
| 394 | # CONFIG_NETFILTER_XT_MATCH_REALM is not set | ||
| 395 | # CONFIG_NETFILTER_XT_MATCH_SCTP is not set | ||
| 396 | # CONFIG_NETFILTER_XT_MATCH_STATISTIC is not set | ||
| 397 | # CONFIG_NETFILTER_XT_MATCH_STRING is not set | ||
| 398 | # CONFIG_NETFILTER_XT_MATCH_TCPMSS is not set | ||
| 399 | # CONFIG_NETFILTER_XT_MATCH_TIME is not set | ||
| 400 | # CONFIG_NETFILTER_XT_MATCH_U32 is not set | ||
| 401 | # CONFIG_NETFILTER_XT_MATCH_HASHLIMIT is not set | ||
| 402 | |||
| 403 | # | ||
| 404 | # IP: Netfilter Configuration | ||
| 405 | # | ||
| 406 | CONFIG_IP_NF_QUEUE=m | ||
| 407 | CONFIG_IP_NF_IPTABLES=m | ||
| 408 | CONFIG_IP_NF_MATCH_IPRANGE=m | ||
| 409 | CONFIG_IP_NF_MATCH_TOS=m | ||
| 410 | CONFIG_IP_NF_MATCH_RECENT=m | ||
| 411 | CONFIG_IP_NF_MATCH_ECN=m | ||
| 412 | CONFIG_IP_NF_MATCH_AH=m | ||
| 413 | CONFIG_IP_NF_MATCH_TTL=m | ||
| 414 | CONFIG_IP_NF_MATCH_OWNER=m | ||
| 415 | CONFIG_IP_NF_MATCH_ADDRTYPE=m | ||
| 416 | CONFIG_IP_NF_FILTER=m | ||
| 417 | CONFIG_IP_NF_TARGET_REJECT=m | ||
| 418 | CONFIG_IP_NF_TARGET_LOG=m | ||
| 419 | CONFIG_IP_NF_TARGET_ULOG=m | ||
| 420 | CONFIG_IP_NF_MANGLE=m | ||
| 421 | CONFIG_IP_NF_TARGET_TOS=m | ||
| 422 | CONFIG_IP_NF_TARGET_ECN=m | ||
| 423 | CONFIG_IP_NF_TARGET_TTL=m | ||
| 424 | CONFIG_IP_NF_RAW=m | ||
| 425 | CONFIG_IP_NF_ARPTABLES=m | ||
| 426 | CONFIG_IP_NF_ARPFILTER=m | ||
| 427 | CONFIG_IP_NF_ARP_MANGLE=m | ||
| 428 | |||
| 429 | # | ||
| 430 | # IPv6: Netfilter Configuration (EXPERIMENTAL) | ||
| 431 | # | ||
| 432 | # CONFIG_IP6_NF_QUEUE is not set | ||
| 433 | # CONFIG_IP6_NF_IPTABLES is not set | ||
| 434 | # CONFIG_IP_DCCP is not set | ||
| 435 | # CONFIG_IP_SCTP is not set | ||
| 436 | # CONFIG_TIPC is not set | ||
| 437 | # CONFIG_ATM is not set | ||
| 438 | # CONFIG_BRIDGE is not set | ||
| 439 | # CONFIG_VLAN_8021Q is not set | ||
| 440 | # CONFIG_DECNET is not set | ||
| 441 | # CONFIG_LLC2 is not set | ||
| 442 | # CONFIG_IPX is not set | ||
| 443 | # CONFIG_ATALK is not set | ||
| 444 | # CONFIG_X25 is not set | ||
| 445 | # CONFIG_LAPB is not set | ||
| 446 | # CONFIG_ECONET is not set | ||
| 447 | # CONFIG_WAN_ROUTER is not set | ||
| 448 | # CONFIG_NET_SCHED is not set | ||
| 449 | |||
| 450 | # | ||
| 451 | # Network testing | ||
| 452 | # | ||
| 453 | # CONFIG_NET_PKTGEN is not set | ||
| 454 | # CONFIG_HAMRADIO is not set | ||
| 455 | CONFIG_IRDA=m | ||
| 456 | |||
| 457 | # | ||
| 458 | # IrDA protocols | ||
| 459 | # | ||
| 460 | CONFIG_IRLAN=m | ||
| 461 | CONFIG_IRNET=m | ||
| 462 | CONFIG_IRCOMM=m | ||
| 463 | # CONFIG_IRDA_ULTRA is not set | ||
| 464 | |||
| 465 | # | ||
| 466 | # IrDA options | ||
| 467 | # | ||
| 468 | # CONFIG_IRDA_CACHE_LAST_LSAP is not set | ||
| 469 | # CONFIG_IRDA_FAST_RR is not set | ||
| 470 | # CONFIG_IRDA_DEBUG is not set | ||
| 471 | |||
| 472 | # | ||
| 473 | # Infrared-port device drivers | ||
| 474 | # | ||
| 475 | |||
| 476 | # | ||
| 477 | # SIR device drivers | ||
| 478 | # | ||
| 479 | # CONFIG_IRTTY_SIR is not set | ||
| 480 | |||
| 481 | # | ||
| 482 | # Dongle support | ||
| 483 | # | ||
| 484 | # CONFIG_KINGSUN_DONGLE is not set | ||
| 485 | # CONFIG_KSDAZZLE_DONGLE is not set | ||
| 486 | # CONFIG_KS959_DONGLE is not set | ||
| 487 | |||
| 488 | # | ||
| 489 | # Old SIR device drivers | ||
| 490 | # | ||
| 491 | # CONFIG_IRPORT_SIR is not set | ||
| 492 | |||
| 493 | # | ||
| 494 | # Old Serial dongle support | ||
| 495 | # | ||
| 496 | |||
| 497 | # | ||
| 498 | # FIR device drivers | ||
| 499 | # | ||
| 500 | # CONFIG_USB_IRDA is not set | ||
| 501 | # CONFIG_SIGMATEL_FIR is not set | ||
| 502 | CONFIG_PXA_FICP=m | ||
| 503 | # CONFIG_MCS_FIR is not set | ||
| 504 | CONFIG_BT=m | ||
| 505 | CONFIG_BT_L2CAP=m | ||
| 506 | CONFIG_BT_SCO=m | ||
| 507 | CONFIG_BT_RFCOMM=m | ||
| 508 | CONFIG_BT_RFCOMM_TTY=y | ||
| 509 | CONFIG_BT_BNEP=m | ||
| 510 | CONFIG_BT_BNEP_MC_FILTER=y | ||
| 511 | CONFIG_BT_BNEP_PROTO_FILTER=y | ||
| 512 | CONFIG_BT_HIDP=m | ||
| 513 | |||
| 514 | # | ||
| 515 | # Bluetooth device drivers | ||
| 516 | # | ||
| 517 | CONFIG_BT_HCIUSB=m | ||
| 518 | # CONFIG_BT_HCIUSB_SCO is not set | ||
| 519 | # CONFIG_BT_HCIBTSDIO is not set | ||
| 520 | CONFIG_BT_HCIUART=m | ||
| 521 | CONFIG_BT_HCIUART_H4=y | ||
| 522 | CONFIG_BT_HCIUART_BCSP=y | ||
| 523 | # CONFIG_BT_HCIUART_LL is not set | ||
| 524 | CONFIG_BT_HCIBCM203X=m | ||
| 525 | CONFIG_BT_HCIBPA10X=m | ||
| 526 | CONFIG_BT_HCIBFUSB=m | ||
| 527 | CONFIG_BT_HCIDTL1=m | ||
| 528 | CONFIG_BT_HCIBT3C=m | ||
| 529 | CONFIG_BT_HCIBLUECARD=m | ||
| 530 | CONFIG_BT_HCIBTUART=m | ||
| 531 | CONFIG_BT_HCIVHCI=m | ||
| 532 | # CONFIG_AF_RXRPC is not set | ||
| 533 | |||
| 534 | # | ||
| 535 | # Wireless | ||
| 536 | # | ||
| 537 | # CONFIG_CFG80211 is not set | ||
| 538 | CONFIG_WIRELESS_EXT=y | ||
| 539 | # CONFIG_MAC80211 is not set | ||
| 540 | CONFIG_IEEE80211=m | ||
| 541 | # CONFIG_IEEE80211_DEBUG is not set | ||
| 542 | CONFIG_IEEE80211_CRYPT_WEP=m | ||
| 543 | CONFIG_IEEE80211_CRYPT_CCMP=m | ||
| 544 | CONFIG_IEEE80211_CRYPT_TKIP=m | ||
| 545 | CONFIG_IEEE80211_SOFTMAC=m | ||
| 546 | # CONFIG_IEEE80211_SOFTMAC_DEBUG is not set | ||
| 547 | # CONFIG_RFKILL is not set | ||
| 548 | # CONFIG_NET_9P is not set | ||
| 549 | |||
| 550 | # | ||
| 551 | # Device Drivers | ||
| 552 | # | ||
| 553 | |||
| 554 | # | ||
| 555 | # Generic Driver Options | ||
| 556 | # | ||
| 557 | CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" | ||
| 558 | CONFIG_STANDALONE=y | ||
| 559 | CONFIG_PREVENT_FIRMWARE_BUILD=y | ||
| 560 | CONFIG_FW_LOADER=y | ||
| 561 | # CONFIG_DEBUG_DRIVER is not set | ||
| 562 | # CONFIG_DEBUG_DEVRES is not set | ||
| 563 | # CONFIG_SYS_HYPERVISOR is not set | ||
| 564 | # CONFIG_CONNECTOR is not set | ||
| 565 | CONFIG_MTD=y | ||
| 566 | # CONFIG_MTD_DEBUG is not set | ||
| 567 | # CONFIG_MTD_CONCAT is not set | ||
| 568 | CONFIG_MTD_PARTITIONS=y | ||
| 569 | # CONFIG_MTD_REDBOOT_PARTS is not set | ||
| 570 | CONFIG_MTD_CMDLINE_PARTS=y | ||
| 571 | # CONFIG_MTD_AFS_PARTS is not set | ||
| 572 | |||
| 573 | # | ||
| 574 | # User Modules And Translation Layers | ||
| 575 | # | ||
| 576 | CONFIG_MTD_CHAR=y | ||
| 577 | CONFIG_MTD_BLKDEVS=y | ||
| 578 | CONFIG_MTD_BLOCK=y | ||
| 579 | # CONFIG_FTL is not set | ||
| 580 | # CONFIG_NFTL is not set | ||
| 581 | # CONFIG_INFTL is not set | ||
| 582 | # CONFIG_RFD_FTL is not set | ||
| 583 | # CONFIG_SSFDC is not set | ||
| 584 | # CONFIG_MTD_OOPS is not set | ||
| 585 | |||
| 586 | # | ||
| 587 | # RAM/ROM/Flash chip drivers | ||
| 588 | # | ||
| 589 | # CONFIG_MTD_CFI is not set | ||
| 590 | # CONFIG_MTD_JEDECPROBE is not set | ||
| 591 | CONFIG_MTD_MAP_BANK_WIDTH_1=y | ||
| 592 | CONFIG_MTD_MAP_BANK_WIDTH_2=y | ||
| 593 | CONFIG_MTD_MAP_BANK_WIDTH_4=y | ||
| 594 | # CONFIG_MTD_MAP_BANK_WIDTH_8 is not set | ||
| 595 | # CONFIG_MTD_MAP_BANK_WIDTH_16 is not set | ||
| 596 | # CONFIG_MTD_MAP_BANK_WIDTH_32 is not set | ||
| 597 | CONFIG_MTD_CFI_I1=y | ||
| 598 | CONFIG_MTD_CFI_I2=y | ||
| 599 | # CONFIG_MTD_CFI_I4 is not set | ||
| 600 | # CONFIG_MTD_CFI_I8 is not set | ||
| 601 | # CONFIG_MTD_RAM is not set | ||
| 602 | CONFIG_MTD_ROM=y | ||
| 603 | # CONFIG_MTD_ABSENT is not set | ||
| 604 | |||
| 605 | # | ||
| 606 | # Mapping drivers for chip access | ||
| 607 | # | ||
| 608 | CONFIG_MTD_COMPLEX_MAPPINGS=y | ||
| 609 | # CONFIG_MTD_PHYSMAP is not set | ||
| 610 | CONFIG_MTD_SHARP_SL=y | ||
| 611 | # CONFIG_MTD_PLATRAM is not set | ||
| 612 | |||
| 613 | # | ||
| 614 | # Self-contained MTD device drivers | ||
| 615 | # | ||
| 616 | # CONFIG_MTD_SLRAM is not set | ||
| 617 | # CONFIG_MTD_PHRAM is not set | ||
| 618 | # CONFIG_MTD_MTDRAM is not set | ||
| 619 | # CONFIG_MTD_BLOCK2MTD is not set | ||
| 620 | |||
| 621 | # | ||
| 622 | # Disk-On-Chip Device Drivers | ||
| 623 | # | ||
| 624 | # CONFIG_MTD_DOC2000 is not set | ||
| 625 | # CONFIG_MTD_DOC2001 is not set | ||
| 626 | # CONFIG_MTD_DOC2001PLUS is not set | ||
| 627 | CONFIG_MTD_NAND=y | ||
| 628 | CONFIG_MTD_NAND_VERIFY_WRITE=y | ||
| 629 | # CONFIG_MTD_NAND_ECC_SMC is not set | ||
| 630 | # CONFIG_MTD_NAND_MUSEUM_IDS is not set | ||
| 631 | # CONFIG_MTD_NAND_H1900 is not set | ||
| 632 | CONFIG_MTD_NAND_IDS=y | ||
| 633 | # CONFIG_MTD_NAND_DISKONCHIP is not set | ||
| 634 | CONFIG_MTD_NAND_SHARPSL=y | ||
| 635 | # CONFIG_MTD_NAND_NANDSIM is not set | ||
| 636 | # CONFIG_MTD_NAND_PLATFORM is not set | ||
| 637 | # CONFIG_MTD_ALAUDA is not set | ||
| 638 | # CONFIG_MTD_ONENAND is not set | ||
| 639 | |||
| 640 | # | ||
| 641 | # UBI - Unsorted block images | ||
| 642 | # | ||
| 643 | # CONFIG_MTD_UBI is not set | ||
| 644 | # CONFIG_PARPORT is not set | ||
| 645 | CONFIG_BLK_DEV=y | ||
| 646 | # CONFIG_BLK_DEV_COW_COMMON is not set | ||
| 647 | CONFIG_BLK_DEV_LOOP=y | ||
| 648 | # CONFIG_BLK_DEV_CRYPTOLOOP is not set | ||
| 649 | # CONFIG_BLK_DEV_NBD is not set | ||
| 650 | # CONFIG_BLK_DEV_UB is not set | ||
| 651 | # CONFIG_BLK_DEV_RAM is not set | ||
| 652 | # CONFIG_CDROM_PKTCDVD is not set | ||
| 653 | # CONFIG_ATA_OVER_ETH is not set | ||
| 654 | CONFIG_MISC_DEVICES=y | ||
| 655 | # CONFIG_EEPROM_93CX6 is not set | ||
| 656 | CONFIG_IDE=y | ||
| 657 | CONFIG_IDE_MAX_HWIFS=4 | ||
| 658 | CONFIG_BLK_DEV_IDE=y | ||
| 659 | |||
| 660 | # | ||
| 661 | # Please see Documentation/ide.txt for help/info on IDE drives | ||
| 662 | # | ||
| 663 | # CONFIG_BLK_DEV_IDE_SATA is not set | ||
| 664 | CONFIG_BLK_DEV_IDEDISK=y | ||
| 665 | # CONFIG_IDEDISK_MULTI_MODE is not set | ||
| 666 | CONFIG_BLK_DEV_IDECS=y | ||
| 667 | # CONFIG_BLK_DEV_IDECD is not set | ||
| 668 | # CONFIG_BLK_DEV_IDETAPE is not set | ||
| 669 | # CONFIG_BLK_DEV_IDEFLOPPY is not set | ||
| 670 | # CONFIG_BLK_DEV_IDESCSI is not set | ||
| 671 | # CONFIG_IDE_TASK_IOCTL is not set | ||
| 672 | CONFIG_IDE_PROC_FS=y | ||
| 673 | |||
| 674 | # | ||
| 675 | # IDE chipset support/bugfixes | ||
| 676 | # | ||
| 677 | CONFIG_IDE_GENERIC=y | ||
| 678 | # CONFIG_BLK_DEV_PLATFORM is not set | ||
| 679 | # CONFIG_IDE_ARM is not set | ||
| 680 | # CONFIG_BLK_DEV_IDEDMA is not set | ||
| 681 | CONFIG_IDE_ARCH_OBSOLETE_INIT=y | ||
| 682 | # CONFIG_BLK_DEV_HD is not set | ||
| 683 | |||
| 684 | # | ||
| 685 | # SCSI device support | ||
| 686 | # | ||
| 687 | # CONFIG_RAID_ATTRS is not set | ||
| 688 | CONFIG_SCSI=m | ||
| 689 | CONFIG_SCSI_DMA=y | ||
| 690 | # CONFIG_SCSI_TGT is not set | ||
| 691 | # CONFIG_SCSI_NETLINK is not set | ||
| 692 | CONFIG_SCSI_PROC_FS=y | ||
| 693 | |||
| 694 | # | ||
| 695 | # SCSI support type (disk, tape, CD-ROM) | ||
| 696 | # | ||
| 697 | CONFIG_BLK_DEV_SD=m | ||
| 698 | CONFIG_CHR_DEV_ST=m | ||
| 699 | CONFIG_CHR_DEV_OSST=m | ||
| 700 | CONFIG_BLK_DEV_SR=m | ||
| 701 | # CONFIG_BLK_DEV_SR_VENDOR is not set | ||
| 702 | CONFIG_CHR_DEV_SG=m | ||
| 703 | # CONFIG_CHR_DEV_SCH is not set | ||
| 704 | |||
| 705 | # | ||
| 706 | # Some SCSI devices (e.g. CD jukebox) support multiple LUNs | ||
| 707 | # | ||
| 708 | CONFIG_SCSI_MULTI_LUN=y | ||
| 709 | # CONFIG_SCSI_CONSTANTS is not set | ||
| 710 | # CONFIG_SCSI_LOGGING is not set | ||
| 711 | # CONFIG_SCSI_SCAN_ASYNC is not set | ||
| 712 | CONFIG_SCSI_WAIT_SCAN=m | ||
| 713 | |||
| 714 | # | ||
| 715 | # SCSI Transports | ||
| 716 | # | ||
| 717 | # CONFIG_SCSI_SPI_ATTRS is not set | ||
| 718 | # CONFIG_SCSI_FC_ATTRS is not set | ||
| 719 | # CONFIG_SCSI_ISCSI_ATTRS is not set | ||
| 720 | # CONFIG_SCSI_SAS_LIBSAS is not set | ||
| 721 | # CONFIG_SCSI_SRP_ATTRS is not set | ||
| 722 | CONFIG_SCSI_LOWLEVEL=y | ||
| 723 | # CONFIG_ISCSI_TCP is not set | ||
| 724 | # CONFIG_SCSI_DEBUG is not set | ||
| 725 | # CONFIG_SCSI_LOWLEVEL_PCMCIA is not set | ||
| 726 | # CONFIG_ATA is not set | ||
| 727 | CONFIG_MD=y | ||
| 728 | # CONFIG_BLK_DEV_MD is not set | ||
| 729 | CONFIG_BLK_DEV_DM=m | ||
| 730 | # CONFIG_DM_DEBUG is not set | ||
| 731 | CONFIG_DM_CRYPT=m | ||
| 732 | CONFIG_DM_SNAPSHOT=m | ||
| 733 | CONFIG_DM_MIRROR=m | ||
| 734 | CONFIG_DM_ZERO=m | ||
| 735 | CONFIG_DM_MULTIPATH=m | ||
| 736 | CONFIG_DM_MULTIPATH_EMC=m | ||
| 737 | # CONFIG_DM_MULTIPATH_RDAC is not set | ||
| 738 | # CONFIG_DM_MULTIPATH_HP is not set | ||
| 739 | # CONFIG_DM_DELAY is not set | ||
| 740 | # CONFIG_DM_UEVENT is not set | ||
| 741 | CONFIG_NETDEVICES=y | ||
| 742 | # CONFIG_NETDEVICES_MULTIQUEUE is not set | ||
| 743 | # CONFIG_DUMMY is not set | ||
| 744 | # CONFIG_BONDING is not set | ||
| 745 | # CONFIG_MACVLAN is not set | ||
| 746 | # CONFIG_EQUALIZER is not set | ||
| 747 | CONFIG_TUN=m | ||
| 748 | # CONFIG_VETH is not set | ||
| 749 | # CONFIG_PHYLIB is not set | ||
| 750 | CONFIG_NET_ETHERNET=y | ||
| 751 | CONFIG_MII=m | ||
| 752 | # CONFIG_AX88796 is not set | ||
| 753 | # CONFIG_SMC91X is not set | ||
| 754 | # CONFIG_DM9000 is not set | ||
| 755 | # CONFIG_SMC911X is not set | ||
| 756 | # CONFIG_IBM_NEW_EMAC_ZMII is not set | ||
| 757 | # CONFIG_IBM_NEW_EMAC_RGMII is not set | ||
| 758 | # CONFIG_IBM_NEW_EMAC_TAH is not set | ||
| 759 | # CONFIG_IBM_NEW_EMAC_EMAC4 is not set | ||
| 760 | # CONFIG_B44 is not set | ||
| 761 | # CONFIG_NETDEV_1000 is not set | ||
| 762 | # CONFIG_NETDEV_10000 is not set | ||
| 763 | |||
| 764 | # | ||
| 765 | # Wireless LAN | ||
| 766 | # | ||
| 767 | # CONFIG_WLAN_PRE80211 is not set | ||
| 768 | CONFIG_WLAN_80211=y | ||
| 769 | # CONFIG_PCMCIA_RAYCS is not set | ||
| 770 | # CONFIG_LIBERTAS is not set | ||
| 771 | CONFIG_HERMES=m | ||
| 772 | CONFIG_PCMCIA_HERMES=m | ||
| 773 | CONFIG_PCMCIA_SPECTRUM=m | ||
| 774 | # CONFIG_ATMEL is not set | ||
| 775 | CONFIG_AIRO_CS=m | ||
| 776 | # CONFIG_PCMCIA_WL3501 is not set | ||
| 777 | # CONFIG_USB_ZD1201 is not set | ||
| 778 | CONFIG_HOSTAP=m | ||
| 779 | CONFIG_HOSTAP_FIRMWARE=y | ||
| 780 | # CONFIG_HOSTAP_FIRMWARE_NVRAM is not set | ||
| 781 | CONFIG_HOSTAP_CS=m | ||
| 782 | # CONFIG_ZD1211RW is not set | ||
| 783 | |||
| 784 | # | ||
| 785 | # USB Network Adapters | ||
| 786 | # | ||
| 787 | CONFIG_USB_CATC=m | ||
| 788 | CONFIG_USB_KAWETH=m | ||
| 789 | CONFIG_USB_PEGASUS=m | ||
| 790 | CONFIG_USB_RTL8150=m | ||
| 791 | CONFIG_USB_USBNET=m | ||
| 792 | CONFIG_USB_NET_AX8817X=m | ||
| 793 | CONFIG_USB_NET_CDCETHER=m | ||
| 794 | # CONFIG_USB_NET_DM9601 is not set | ||
| 795 | # CONFIG_USB_NET_GL620A is not set | ||
| 796 | CONFIG_USB_NET_NET1080=m | ||
| 797 | # CONFIG_USB_NET_PLUSB is not set | ||
| 798 | # CONFIG_USB_NET_MCS7830 is not set | ||
| 799 | # CONFIG_USB_NET_RNDIS_HOST is not set | ||
| 800 | # CONFIG_USB_NET_CDC_SUBSET is not set | ||
| 801 | CONFIG_USB_NET_ZAURUS=m | ||
| 802 | CONFIG_NET_PCMCIA=y | ||
| 803 | # CONFIG_PCMCIA_3C589 is not set | ||
| 804 | # CONFIG_PCMCIA_3C574 is not set | ||
| 805 | # CONFIG_PCMCIA_FMVJ18X is not set | ||
| 806 | CONFIG_PCMCIA_PCNET=m | ||
| 807 | # CONFIG_PCMCIA_NMCLAN is not set | ||
| 808 | # CONFIG_PCMCIA_SMC91C92 is not set | ||
| 809 | # CONFIG_PCMCIA_XIRC2PS is not set | ||
| 810 | # CONFIG_PCMCIA_AXNET is not set | ||
| 811 | # CONFIG_WAN is not set | ||
| 812 | CONFIG_PPP=m | ||
| 813 | # CONFIG_PPP_MULTILINK is not set | ||
| 814 | # CONFIG_PPP_FILTER is not set | ||
| 815 | CONFIG_PPP_ASYNC=m | ||
| 816 | # CONFIG_PPP_SYNC_TTY is not set | ||
| 817 | CONFIG_PPP_DEFLATE=m | ||
| 818 | CONFIG_PPP_BSDCOMP=m | ||
| 819 | # CONFIG_PPP_MPPE is not set | ||
| 820 | # CONFIG_PPPOE is not set | ||
| 821 | # CONFIG_PPPOL2TP is not set | ||
| 822 | # CONFIG_SLIP is not set | ||
| 823 | CONFIG_SLHC=m | ||
| 824 | # CONFIG_SHAPER is not set | ||
| 825 | # CONFIG_NETCONSOLE is not set | ||
| 826 | # CONFIG_NETPOLL is not set | ||
| 827 | # CONFIG_NET_POLL_CONTROLLER is not set | ||
| 828 | # CONFIG_ISDN is not set | ||
| 829 | |||
| 830 | # | ||
| 831 | # Input device support | ||
| 832 | # | ||
| 833 | CONFIG_INPUT=y | ||
| 834 | # CONFIG_INPUT_FF_MEMLESS is not set | ||
| 835 | # CONFIG_INPUT_POLLDEV is not set | ||
| 836 | |||
| 837 | # | ||
| 838 | # Userland interfaces | ||
| 839 | # | ||
| 840 | CONFIG_INPUT_MOUSEDEV=m | ||
| 841 | # CONFIG_INPUT_MOUSEDEV_PSAUX is not set | ||
| 842 | CONFIG_INPUT_MOUSEDEV_SCREEN_X=240 | ||
| 843 | CONFIG_INPUT_MOUSEDEV_SCREEN_Y=320 | ||
| 844 | # CONFIG_INPUT_JOYDEV is not set | ||
| 845 | CONFIG_INPUT_EVDEV=y | ||
| 846 | # CONFIG_INPUT_EVBUG is not set | ||
| 847 | CONFIG_INPUT_POWER=y | ||
| 848 | |||
| 849 | # | ||
| 850 | # Input Device Drivers | ||
| 851 | # | ||
| 852 | CONFIG_INPUT_KEYBOARD=y | ||
| 853 | # CONFIG_KEYBOARD_ATKBD is not set | ||
| 854 | # CONFIG_KEYBOARD_SUNKBD is not set | ||
| 855 | # CONFIG_KEYBOARD_LKKBD is not set | ||
| 856 | CONFIG_KEYBOARD_LOCOMO=y | ||
| 857 | # CONFIG_KEYBOARD_XTKBD is not set | ||
| 858 | # CONFIG_KEYBOARD_NEWTON is not set | ||
| 859 | # CONFIG_KEYBOARD_STOWAWAY is not set | ||
| 860 | # CONFIG_KEYBOARD_CORGI is not set | ||
| 861 | # CONFIG_KEYBOARD_SPITZ is not set | ||
| 862 | # CONFIG_KEYBOARD_GPIO is not set | ||
| 863 | # CONFIG_INPUT_MOUSE is not set | ||
| 864 | # CONFIG_INPUT_JOYSTICK is not set | ||
| 865 | # CONFIG_INPUT_TABLET is not set | ||
| 866 | CONFIG_INPUT_TOUCHSCREEN=y | ||
| 867 | CONFIG_TOUCHSCREEN_CORGI=y | ||
| 868 | # CONFIG_TOUCHSCREEN_FUJITSU is not set | ||
| 869 | # CONFIG_TOUCHSCREEN_GUNZE is not set | ||
| 870 | # CONFIG_TOUCHSCREEN_ELO is not set | ||
| 871 | # CONFIG_TOUCHSCREEN_MTOUCH is not set | ||
| 872 | # CONFIG_TOUCHSCREEN_MK712 is not set | ||
| 873 | # CONFIG_TOUCHSCREEN_PENMOUNT is not set | ||
| 874 | # CONFIG_TOUCHSCREEN_TOUCHRIGHT is not set | ||
| 875 | # CONFIG_TOUCHSCREEN_TOUCHWIN is not set | ||
| 876 | # CONFIG_TOUCHSCREEN_UCB1400 is not set | ||
| 877 | # CONFIG_TOUCHSCREEN_USB_COMPOSITE is not set | ||
| 878 | CONFIG_INPUT_MISC=y | ||
| 879 | # CONFIG_INPUT_ATI_REMOTE is not set | ||
| 880 | # CONFIG_INPUT_ATI_REMOTE2 is not set | ||
| 881 | # CONFIG_INPUT_KEYSPAN_REMOTE is not set | ||
| 882 | # CONFIG_INPUT_POWERMATE is not set | ||
| 883 | # CONFIG_INPUT_YEALINK is not set | ||
| 884 | CONFIG_INPUT_UINPUT=m | ||
| 885 | |||
| 886 | # | ||
| 887 | # Hardware I/O ports | ||
| 888 | # | ||
| 889 | # CONFIG_SERIO is not set | ||
| 890 | # CONFIG_GAMEPORT is not set | ||
| 891 | |||
| 892 | # | ||
| 893 | # Character devices | ||
| 894 | # | ||
| 895 | CONFIG_VT=y | ||
| 896 | CONFIG_VT_CONSOLE=y | ||
| 897 | CONFIG_HW_CONSOLE=y | ||
| 898 | # CONFIG_VT_HW_CONSOLE_BINDING is not set | ||
| 899 | # CONFIG_SERIAL_NONSTANDARD is not set | ||
| 900 | |||
| 901 | # | ||
| 902 | # Serial drivers | ||
| 903 | # | ||
| 904 | CONFIG_SERIAL_8250=m | ||
| 905 | CONFIG_SERIAL_8250_CS=m | ||
| 906 | CONFIG_SERIAL_8250_NR_UARTS=4 | ||
| 907 | CONFIG_SERIAL_8250_RUNTIME_UARTS=4 | ||
| 908 | # CONFIG_SERIAL_8250_EXTENDED is not set | ||
| 909 | |||
| 910 | # | ||
| 911 | # Non-8250 serial port support | ||
| 912 | # | ||
| 913 | CONFIG_SERIAL_PXA=y | ||
| 914 | CONFIG_SERIAL_PXA_CONSOLE=y | ||
| 915 | CONFIG_SERIAL_CORE=y | ||
| 916 | CONFIG_SERIAL_CORE_CONSOLE=y | ||
| 917 | CONFIG_UNIX98_PTYS=y | ||
| 918 | # CONFIG_LEGACY_PTYS is not set | ||
| 919 | # CONFIG_IPMI_HANDLER is not set | ||
| 920 | CONFIG_HW_RANDOM=m | ||
| 921 | # CONFIG_NVRAM is not set | ||
| 922 | # CONFIG_R3964 is not set | ||
| 923 | |||
| 924 | # | ||
| 925 | # PCMCIA character devices | ||
| 926 | # | ||
| 927 | # CONFIG_SYNCLINK_CS is not set | ||
| 928 | # CONFIG_CARDMAN_4000 is not set | ||
| 929 | # CONFIG_CARDMAN_4040 is not set | ||
| 930 | # CONFIG_RAW_DRIVER is not set | ||
| 931 | # CONFIG_TCG_TPM is not set | ||
| 932 | CONFIG_I2C=y | ||
| 933 | CONFIG_I2C_BOARDINFO=y | ||
| 934 | # CONFIG_I2C_CHARDEV is not set | ||
| 935 | |||
| 936 | # | ||
| 937 | # I2C Algorithms | ||
| 938 | # | ||
| 939 | CONFIG_I2C_ALGOBIT=y | ||
| 940 | # CONFIG_I2C_ALGOPCF is not set | ||
| 941 | # CONFIG_I2C_ALGOPCA is not set | ||
| 942 | |||
| 943 | # | ||
| 944 | # I2C Hardware Bus support | ||
| 945 | # | ||
| 946 | # CONFIG_I2C_GPIO is not set | ||
| 947 | CONFIG_I2C_PXA=y | ||
| 948 | # CONFIG_I2C_PXA_SLAVE is not set | ||
| 949 | # CONFIG_I2C_OCORES is not set | ||
| 950 | # CONFIG_I2C_PARPORT_LIGHT is not set | ||
| 951 | # CONFIG_I2C_SIMTEC is not set | ||
| 952 | # CONFIG_I2C_TAOS_EVM is not set | ||
| 953 | # CONFIG_I2C_STUB is not set | ||
| 954 | # CONFIG_I2C_TINY_USB is not set | ||
| 955 | |||
| 956 | # | ||
| 957 | # Miscellaneous I2C Chip support | ||
| 958 | # | ||
| 959 | # CONFIG_SENSORS_DS1337 is not set | ||
| 960 | # CONFIG_SENSORS_DS1374 is not set | ||
| 961 | # CONFIG_DS1682 is not set | ||
| 962 | # CONFIG_SENSORS_EEPROM is not set | ||
| 963 | # CONFIG_SENSORS_PCF8574 is not set | ||
| 964 | # CONFIG_SENSORS_PCA9539 is not set | ||
| 965 | # CONFIG_SENSORS_PCF8591 is not set | ||
| 966 | # CONFIG_SENSORS_MAX6875 is not set | ||
| 967 | # CONFIG_SENSORS_TSL2550 is not set | ||
| 968 | # CONFIG_I2C_DEBUG_CORE is not set | ||
| 969 | # CONFIG_I2C_DEBUG_ALGO is not set | ||
| 970 | # CONFIG_I2C_DEBUG_BUS is not set | ||
| 971 | # CONFIG_I2C_DEBUG_CHIP is not set | ||
| 972 | |||
| 973 | # | ||
| 974 | # SPI support | ||
| 975 | # | ||
| 976 | # CONFIG_SPI is not set | ||
| 977 | # CONFIG_SPI_MASTER is not set | ||
| 978 | # CONFIG_W1 is not set | ||
| 979 | # CONFIG_POWER_SUPPLY is not set | ||
| 980 | # CONFIG_HWMON is not set | ||
| 981 | # CONFIG_WATCHDOG is not set | ||
| 982 | |||
| 983 | # | ||
| 984 | # Sonics Silicon Backplane | ||
| 985 | # | ||
| 986 | CONFIG_SSB_POSSIBLE=y | ||
| 987 | # CONFIG_SSB is not set | ||
| 988 | |||
| 989 | # | ||
| 990 | # Multifunction device drivers | ||
| 991 | # | ||
| 992 | # CONFIG_MFD_SM501 is not set | ||
| 993 | # CONFIG_HTC_ASIC3 is not set | ||
| 994 | # CONFIG_HTC_ASIC3_DS1WM is not set | ||
| 995 | |||
| 996 | # | ||
| 997 | # Multimedia devices | ||
| 998 | # | ||
| 999 | CONFIG_VIDEO_DEV=m | ||
| 1000 | CONFIG_VIDEO_V4L1=y | ||
| 1001 | CONFIG_VIDEO_V4L1_COMPAT=y | ||
| 1002 | CONFIG_VIDEO_V4L2=y | ||
| 1003 | CONFIG_VIDEO_CAPTURE_DRIVERS=y | ||
| 1004 | # CONFIG_VIDEO_ADV_DEBUG is not set | ||
| 1005 | CONFIG_VIDEO_HELPER_CHIPS_AUTO=y | ||
| 1006 | # CONFIG_VIDEO_VIVI is not set | ||
| 1007 | # CONFIG_VIDEO_CPIA is not set | ||
| 1008 | # CONFIG_VIDEO_CPIA2 is not set | ||
| 1009 | # CONFIG_VIDEO_SAA5246A is not set | ||
| 1010 | # CONFIG_VIDEO_SAA5249 is not set | ||
| 1011 | # CONFIG_TUNER_3036 is not set | ||
| 1012 | CONFIG_V4L_USB_DRIVERS=y | ||
| 1013 | # CONFIG_VIDEO_PVRUSB2 is not set | ||
| 1014 | # CONFIG_VIDEO_EM28XX is not set | ||
| 1015 | # CONFIG_VIDEO_USBVISION is not set | ||
| 1016 | CONFIG_VIDEO_USBVIDEO=m | ||
| 1017 | CONFIG_USB_VICAM=m | ||
| 1018 | CONFIG_USB_IBMCAM=m | ||
| 1019 | CONFIG_USB_KONICAWC=m | ||
| 1020 | # CONFIG_USB_QUICKCAM_MESSENGER is not set | ||
| 1021 | # CONFIG_USB_ET61X251 is not set | ||
| 1022 | # CONFIG_VIDEO_OVCAMCHIP is not set | ||
| 1023 | # CONFIG_USB_W9968CF is not set | ||
| 1024 | CONFIG_USB_OV511=m | ||
| 1025 | CONFIG_USB_SE401=m | ||
| 1026 | CONFIG_USB_SN9C102=m | ||
| 1027 | CONFIG_USB_STV680=m | ||
| 1028 | # CONFIG_USB_ZC0301 is not set | ||
| 1029 | # CONFIG_USB_PWC is not set | ||
| 1030 | # CONFIG_USB_ZR364XX is not set | ||
| 1031 | CONFIG_RADIO_ADAPTERS=y | ||
| 1032 | CONFIG_USB_DSBR=m | ||
| 1033 | # CONFIG_DVB_CORE is not set | ||
| 1034 | CONFIG_DAB=y | ||
| 1035 | CONFIG_USB_DABUSB=m | ||
| 1036 | |||
| 1037 | # | ||
| 1038 | # Graphics support | ||
| 1039 | # | ||
| 1040 | # CONFIG_VGASTATE is not set | ||
| 1041 | CONFIG_VIDEO_OUTPUT_CONTROL=m | ||
| 1042 | CONFIG_FB=y | ||
| 1043 | # CONFIG_FIRMWARE_EDID is not set | ||
| 1044 | # CONFIG_FB_DDC is not set | ||
| 1045 | CONFIG_FB_CFB_FILLRECT=y | ||
| 1046 | CONFIG_FB_CFB_COPYAREA=y | ||
| 1047 | CONFIG_FB_CFB_IMAGEBLIT=y | ||
| 1048 | # CONFIG_FB_CFB_REV_PIXELS_IN_BYTE is not set | ||
| 1049 | # CONFIG_FB_SYS_FILLRECT is not set | ||
| 1050 | # CONFIG_FB_SYS_COPYAREA is not set | ||
| 1051 | # CONFIG_FB_SYS_IMAGEBLIT is not set | ||
| 1052 | # CONFIG_FB_SYS_FOPS is not set | ||
| 1053 | # CONFIG_FB_DEFERRED_IO is not set | ||
| 1054 | # CONFIG_FB_SVGALIB is not set | ||
| 1055 | # CONFIG_FB_MACMODES is not set | ||
| 1056 | # CONFIG_FB_BACKLIGHT is not set | ||
| 1057 | # CONFIG_FB_MODE_HELPERS is not set | ||
| 1058 | # CONFIG_FB_TILEBLITTING is not set | ||
| 1059 | |||
| 1060 | # | ||
| 1061 | # Frame buffer hardware drivers | ||
| 1062 | # | ||
| 1063 | # CONFIG_FB_S1D13XXX is not set | ||
| 1064 | CONFIG_FB_PXA=y | ||
| 1065 | CONFIG_FB_PXA_LCD_QVGA=y | ||
| 1066 | # CONFIG_FB_PXA_LCD_VGA is not set | ||
| 1067 | CONFIG_FB_PXA_OVERLAY=y | ||
| 1068 | # CONFIG_FB_PXA_PARAMETERS is not set | ||
| 1069 | # CONFIG_FB_MBX is not set | ||
| 1070 | # CONFIG_FB_W100 is not set | ||
| 1071 | # CONFIG_FB_VIRTUAL is not set | ||
| 1072 | CONFIG_BACKLIGHT_LCD_SUPPORT=y | ||
| 1073 | # CONFIG_LCD_CLASS_DEVICE is not set | ||
| 1074 | CONFIG_BACKLIGHT_CLASS_DEVICE=y | ||
| 1075 | # CONFIG_BACKLIGHT_CORGI is not set | ||
| 1076 | CONFIG_BACKLIGHT_LOCOMO=y | ||
| 1077 | |||
| 1078 | # | ||
| 1079 | # Display device support | ||
| 1080 | # | ||
| 1081 | # CONFIG_DISPLAY_SUPPORT is not set | ||
| 1082 | |||
| 1083 | # | ||
| 1084 | # Console display driver support | ||
| 1085 | # | ||
| 1086 | # CONFIG_VGA_CONSOLE is not set | ||
| 1087 | CONFIG_DUMMY_CONSOLE=y | ||
| 1088 | CONFIG_FRAMEBUFFER_CONSOLE=y | ||
| 1089 | # CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY is not set | ||
| 1090 | CONFIG_FRAMEBUFFER_CONSOLE_ROTATION=y | ||
| 1091 | CONFIG_FONTS=y | ||
| 1092 | # CONFIG_FONT_8x8 is not set | ||
| 1093 | # CONFIG_FONT_8x16 is not set | ||
| 1094 | # CONFIG_FONT_6x11 is not set | ||
| 1095 | # CONFIG_FONT_7x14 is not set | ||
| 1096 | # CONFIG_FONT_PEARL_8x8 is not set | ||
| 1097 | # CONFIG_FONT_ACORN_8x8 is not set | ||
| 1098 | CONFIG_FONT_MINI_4x6=y | ||
| 1099 | # CONFIG_FONT_SUN8x16 is not set | ||
| 1100 | # CONFIG_FONT_SUN12x22 is not set | ||
| 1101 | # CONFIG_FONT_10x18 is not set | ||
| 1102 | CONFIG_LOGO=y | ||
| 1103 | # CONFIG_LOGO_LINUX_MONO is not set | ||
| 1104 | # CONFIG_LOGO_LINUX_VGA16 is not set | ||
| 1105 | # CONFIG_LOGO_LINUX_CLUT224 is not set | ||
| 1106 | CONFIG_LOGO_OHAND_CLUT224=y | ||
| 1107 | |||
| 1108 | # | ||
| 1109 | # Sound | ||
| 1110 | # | ||
| 1111 | CONFIG_SOUND=m | ||
| 1112 | |||
| 1113 | # | ||
| 1114 | # Advanced Linux Sound Architecture | ||
| 1115 | # | ||
| 1116 | CONFIG_SND=m | ||
| 1117 | CONFIG_SND_TIMER=m | ||
| 1118 | CONFIG_SND_PCM=m | ||
| 1119 | CONFIG_SND_HWDEP=m | ||
| 1120 | CONFIG_SND_RAWMIDI=m | ||
| 1121 | CONFIG_SND_SEQUENCER=m | ||
| 1122 | # CONFIG_SND_SEQ_DUMMY is not set | ||
| 1123 | CONFIG_SND_OSSEMUL=y | ||
| 1124 | CONFIG_SND_MIXER_OSS=m | ||
| 1125 | CONFIG_SND_PCM_OSS=m | ||
| 1126 | CONFIG_SND_PCM_OSS_PLUGINS=y | ||
| 1127 | # CONFIG_SND_SEQUENCER_OSS is not set | ||
| 1128 | # CONFIG_SND_DYNAMIC_MINORS is not set | ||
| 1129 | CONFIG_SND_SUPPORT_OLD_API=y | ||
| 1130 | CONFIG_SND_VERBOSE_PROCFS=y | ||
| 1131 | # CONFIG_SND_VERBOSE_PRINTK is not set | ||
| 1132 | # CONFIG_SND_DEBUG is not set | ||
| 1133 | |||
| 1134 | # | ||
| 1135 | # Generic devices | ||
| 1136 | # | ||
| 1137 | # CONFIG_SND_AC97_CODEC is not set | ||
| 1138 | # CONFIG_SND_DUMMY is not set | ||
| 1139 | # CONFIG_SND_VIRMIDI is not set | ||
| 1140 | # CONFIG_SND_MTPAV is not set | ||
| 1141 | # CONFIG_SND_SERIAL_U16550 is not set | ||
| 1142 | # CONFIG_SND_MPU401 is not set | ||
| 1143 | |||
| 1144 | # | ||
| 1145 | # ALSA ARM devices | ||
| 1146 | # | ||
| 1147 | CONFIG_SND_PXA2XX_PCM=m | ||
| 1148 | CONFIG_SND_PXA2XX_AC97=m | ||
| 1149 | |||
| 1150 | # | ||
| 1151 | # USB devices | ||
| 1152 | # | ||
| 1153 | CONFIG_SND_USB_AUDIO=m | ||
| 1154 | # CONFIG_SND_USB_CAIAQ is not set | ||
| 1155 | |||
| 1156 | # | ||
| 1157 | # PCMCIA devices | ||
| 1158 | # | ||
| 1159 | # CONFIG_SND_VXPOCKET is not set | ||
| 1160 | # CONFIG_SND_PDAUDIOCF is not set | ||
| 1161 | |||
| 1162 | # | ||
| 1163 | # System on Chip audio support | ||
| 1164 | # | ||
| 1165 | CONFIG_SND_SOC=m | ||
| 1166 | CONFIG_SND_PXA2XX_SOC=m | ||
| 1167 | CONFIG_SND_PXA2XX_SOC_I2S=m | ||
| 1168 | CONFIG_SND_PXA2XX_SOC_POODLE=m | ||
| 1169 | |||
| 1170 | # | ||
| 1171 | # SoC Audio support for SuperH | ||
| 1172 | # | ||
| 1173 | CONFIG_SND_SOC_WM8731=m | ||
| 1174 | |||
| 1175 | # | ||
| 1176 | # Open Sound System | ||
| 1177 | # | ||
| 1178 | # CONFIG_SOUND_PRIME is not set | ||
| 1179 | # CONFIG_AC97_BUS is not set | ||
| 1180 | CONFIG_HID_SUPPORT=y | ||
| 1181 | CONFIG_HID=m | ||
| 1182 | # CONFIG_HID_DEBUG is not set | ||
| 1183 | # CONFIG_HIDRAW is not set | ||
| 1184 | |||
| 1185 | # | ||
| 1186 | # USB Input Devices | ||
| 1187 | # | ||
| 1188 | CONFIG_USB_HID=m | ||
| 1189 | # CONFIG_USB_HIDINPUT_POWERBOOK is not set | ||
| 1190 | # CONFIG_HID_FF is not set | ||
| 1191 | # CONFIG_USB_HIDDEV is not set | ||
| 1192 | |||
| 1193 | # | ||
| 1194 | # USB HID Boot Protocol drivers | ||
| 1195 | # | ||
| 1196 | CONFIG_USB_KBD=m | ||
| 1197 | CONFIG_USB_MOUSE=m | ||
| 1198 | CONFIG_USB_SUPPORT=y | ||
| 1199 | CONFIG_USB_ARCH_HAS_HCD=y | ||
| 1200 | # CONFIG_USB_ARCH_HAS_OHCI is not set | ||
| 1201 | # CONFIG_USB_ARCH_HAS_EHCI is not set | ||
| 1202 | CONFIG_USB=m | ||
| 1203 | # CONFIG_USB_DEBUG is not set | ||
| 1204 | |||
| 1205 | # | ||
| 1206 | # Miscellaneous USB options | ||
| 1207 | # | ||
| 1208 | CONFIG_USB_DEVICEFS=y | ||
| 1209 | CONFIG_USB_DEVICE_CLASS=y | ||
| 1210 | # CONFIG_USB_DYNAMIC_MINORS is not set | ||
| 1211 | # CONFIG_USB_SUSPEND is not set | ||
| 1212 | # CONFIG_USB_PERSIST is not set | ||
| 1213 | # CONFIG_USB_OTG is not set | ||
| 1214 | |||
| 1215 | # | ||
| 1216 | # USB Host Controller Drivers | ||
| 1217 | # | ||
| 1218 | # CONFIG_USB_ISP116X_HCD is not set | ||
| 1219 | CONFIG_USB_SL811_HCD=m | ||
| 1220 | CONFIG_USB_SL811_CS=m | ||
| 1221 | # CONFIG_USB_R8A66597_HCD is not set | ||
| 1222 | |||
| 1223 | # | ||
| 1224 | # USB Device Class drivers | ||
| 1225 | # | ||
| 1226 | CONFIG_USB_ACM=m | ||
| 1227 | CONFIG_USB_PRINTER=m | ||
| 1228 | |||
| 1229 | # | ||
| 1230 | # NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' | ||
| 1231 | # | ||
| 1232 | |||
| 1233 | # | ||
| 1234 | # may also be needed; see USB_STORAGE Help for more information | ||
| 1235 | # | ||
| 1236 | CONFIG_USB_STORAGE=m | ||
| 1237 | # CONFIG_USB_STORAGE_DEBUG is not set | ||
| 1238 | # CONFIG_USB_STORAGE_DATAFAB is not set | ||
| 1239 | # CONFIG_USB_STORAGE_FREECOM is not set | ||
| 1240 | # CONFIG_USB_STORAGE_ISD200 is not set | ||
| 1241 | # CONFIG_USB_STORAGE_DPCM is not set | ||
| 1242 | # CONFIG_USB_STORAGE_USBAT is not set | ||
| 1243 | # CONFIG_USB_STORAGE_SDDR09 is not set | ||
| 1244 | # CONFIG_USB_STORAGE_SDDR55 is not set | ||
| 1245 | # CONFIG_USB_STORAGE_JUMPSHOT is not set | ||
| 1246 | # CONFIG_USB_STORAGE_ALAUDA is not set | ||
| 1247 | # CONFIG_USB_STORAGE_KARMA is not set | ||
| 1248 | # CONFIG_USB_LIBUSUAL is not set | ||
| 1249 | |||
| 1250 | # | ||
| 1251 | # USB Imaging devices | ||
| 1252 | # | ||
| 1253 | CONFIG_USB_MDC800=m | ||
| 1254 | CONFIG_USB_MICROTEK=m | ||
| 1255 | CONFIG_USB_MON=y | ||
| 1256 | |||
| 1257 | # | ||
| 1258 | # USB port drivers | ||
| 1259 | # | ||
| 1260 | |||
| 1261 | # | ||
| 1262 | # USB Serial Converter support | ||
| 1263 | # | ||
| 1264 | CONFIG_USB_SERIAL=m | ||
| 1265 | CONFIG_USB_SERIAL_GENERIC=y | ||
| 1266 | # CONFIG_USB_SERIAL_AIRCABLE is not set | ||
| 1267 | # CONFIG_USB_SERIAL_AIRPRIME is not set | ||
| 1268 | # CONFIG_USB_SERIAL_ARK3116 is not set | ||
| 1269 | CONFIG_USB_SERIAL_BELKIN=m | ||
| 1270 | # CONFIG_USB_SERIAL_CH341 is not set | ||
| 1271 | # CONFIG_USB_SERIAL_WHITEHEAT is not set | ||
| 1272 | CONFIG_USB_SERIAL_DIGI_ACCELEPORT=m | ||
| 1273 | # CONFIG_USB_SERIAL_CP2101 is not set | ||
| 1274 | CONFIG_USB_SERIAL_CYPRESS_M8=m | ||
| 1275 | CONFIG_USB_SERIAL_EMPEG=m | ||
| 1276 | CONFIG_USB_SERIAL_FTDI_SIO=m | ||
| 1277 | # CONFIG_USB_SERIAL_FUNSOFT is not set | ||
| 1278 | CONFIG_USB_SERIAL_VISOR=m | ||
| 1279 | CONFIG_USB_SERIAL_IPAQ=m | ||
| 1280 | CONFIG_USB_SERIAL_IR=m | ||
| 1281 | CONFIG_USB_SERIAL_EDGEPORT=m | ||
| 1282 | CONFIG_USB_SERIAL_EDGEPORT_TI=m | ||
| 1283 | CONFIG_USB_SERIAL_GARMIN=m | ||
| 1284 | CONFIG_USB_SERIAL_IPW=m | ||
| 1285 | CONFIG_USB_SERIAL_KEYSPAN_PDA=m | ||
| 1286 | CONFIG_USB_SERIAL_KEYSPAN=m | ||
| 1287 | # CONFIG_USB_SERIAL_KEYSPAN_MPR is not set | ||
| 1288 | # CONFIG_USB_SERIAL_KEYSPAN_USA28 is not set | ||
| 1289 | # CONFIG_USB_SERIAL_KEYSPAN_USA28X is not set | ||
| 1290 | # CONFIG_USB_SERIAL_KEYSPAN_USA28XA is not set | ||
| 1291 | # CONFIG_USB_SERIAL_KEYSPAN_USA28XB is not set | ||
| 1292 | # CONFIG_USB_SERIAL_KEYSPAN_USA19 is not set | ||
| 1293 | # CONFIG_USB_SERIAL_KEYSPAN_USA18X is not set | ||
| 1294 | # CONFIG_USB_SERIAL_KEYSPAN_USA19W is not set | ||
| 1295 | # CONFIG_USB_SERIAL_KEYSPAN_USA19QW is not set | ||
| 1296 | # CONFIG_USB_SERIAL_KEYSPAN_USA19QI is not set | ||
| 1297 | # CONFIG_USB_SERIAL_KEYSPAN_USA49W is not set | ||
| 1298 | # CONFIG_USB_SERIAL_KEYSPAN_USA49WLC is not set | ||
| 1299 | CONFIG_USB_SERIAL_KLSI=m | ||
| 1300 | CONFIG_USB_SERIAL_KOBIL_SCT=m | ||
| 1301 | CONFIG_USB_SERIAL_MCT_U232=m | ||
| 1302 | # CONFIG_USB_SERIAL_MOS7720 is not set | ||
| 1303 | # CONFIG_USB_SERIAL_MOS7840 is not set | ||
| 1304 | # CONFIG_USB_SERIAL_NAVMAN is not set | ||
| 1305 | CONFIG_USB_SERIAL_PL2303=m | ||
| 1306 | # CONFIG_USB_SERIAL_OTI6858 is not set | ||
| 1307 | # CONFIG_USB_SERIAL_HP4X is not set | ||
| 1308 | CONFIG_USB_SERIAL_SAFE=m | ||
| 1309 | # CONFIG_USB_SERIAL_SAFE_PADDED is not set | ||
| 1310 | # CONFIG_USB_SERIAL_SIERRAWIRELESS is not set | ||
| 1311 | CONFIG_USB_SERIAL_TI=m | ||
| 1312 | CONFIG_USB_SERIAL_CYBERJACK=m | ||
| 1313 | CONFIG_USB_SERIAL_XIRCOM=m | ||
| 1314 | # CONFIG_USB_SERIAL_OPTION is not set | ||
| 1315 | CONFIG_USB_SERIAL_OMNINET=m | ||
| 1316 | # CONFIG_USB_SERIAL_DEBUG is not set | ||
| 1317 | CONFIG_USB_EZUSB=y | ||
| 1318 | |||
| 1319 | # | ||
| 1320 | # USB Miscellaneous drivers | ||
| 1321 | # | ||
| 1322 | CONFIG_USB_EMI62=m | ||
| 1323 | CONFIG_USB_EMI26=m | ||
| 1324 | # CONFIG_USB_ADUTUX is not set | ||
| 1325 | CONFIG_USB_AUERSWALD=m | ||
| 1326 | CONFIG_USB_RIO500=m | ||
| 1327 | CONFIG_USB_LEGOTOWER=m | ||
| 1328 | CONFIG_USB_LCD=m | ||
| 1329 | # CONFIG_USB_BERRY_CHARGE is not set | ||
| 1330 | CONFIG_USB_LED=m | ||
| 1331 | # CONFIG_USB_CYPRESS_CY7C63 is not set | ||
| 1332 | CONFIG_USB_CYTHERM=m | ||
| 1333 | # CONFIG_USB_PHIDGET is not set | ||
| 1334 | CONFIG_USB_IDMOUSE=m | ||
| 1335 | # CONFIG_USB_FTDI_ELAN is not set | ||
| 1336 | # CONFIG_USB_APPLEDISPLAY is not set | ||
| 1337 | # CONFIG_USB_LD is not set | ||
| 1338 | # CONFIG_USB_TRANCEVIBRATOR is not set | ||
| 1339 | # CONFIG_USB_IOWARRIOR is not set | ||
| 1340 | # CONFIG_USB_TEST is not set | ||
| 1341 | |||
| 1342 | # | ||
| 1343 | # USB DSL modem support | ||
| 1344 | # | ||
| 1345 | |||
| 1346 | # | ||
| 1347 | # USB Gadget Support | ||
| 1348 | # | ||
| 1349 | CONFIG_USB_GADGET=y | ||
| 1350 | # CONFIG_USB_GADGET_DEBUG is not set | ||
| 1351 | # CONFIG_USB_GADGET_DEBUG_FILES is not set | ||
| 1352 | CONFIG_USB_GADGET_SELECTED=y | ||
| 1353 | # CONFIG_USB_GADGET_AMD5536UDC is not set | ||
| 1354 | # CONFIG_USB_GADGET_ATMEL_USBA is not set | ||
| 1355 | # CONFIG_USB_GADGET_FSL_USB2 is not set | ||
| 1356 | # CONFIG_USB_GADGET_NET2280 is not set | ||
| 1357 | CONFIG_USB_GADGET_PXA2XX=y | ||
| 1358 | CONFIG_USB_PXA2XX=y | ||
| 1359 | # CONFIG_USB_PXA2XX_SMALL is not set | ||
| 1360 | # CONFIG_USB_GADGET_M66592 is not set | ||
| 1361 | # CONFIG_USB_GADGET_PXA27X is not set | ||
| 1362 | # CONFIG_USB_GADGET_GOKU is not set | ||
| 1363 | # CONFIG_USB_GADGET_LH7A40X is not set | ||
| 1364 | # CONFIG_USB_GADGET_OMAP is not set | ||
| 1365 | # CONFIG_USB_GADGET_S3C2410 is not set | ||
| 1366 | # CONFIG_USB_GADGET_AT91 is not set | ||
| 1367 | # CONFIG_USB_GADGET_DUMMY_HCD is not set | ||
| 1368 | # CONFIG_USB_GADGET_DUALSPEED is not set | ||
| 1369 | CONFIG_USB_ZERO=m | ||
| 1370 | CONFIG_USB_ETH=m | ||
| 1371 | CONFIG_USB_ETH_RNDIS=y | ||
| 1372 | CONFIG_USB_GADGETFS=m | ||
| 1373 | CONFIG_USB_FILE_STORAGE=m | ||
| 1374 | # CONFIG_USB_FILE_STORAGE_TEST is not set | ||
| 1375 | CONFIG_USB_G_SERIAL=m | ||
| 1376 | # CONFIG_USB_MIDI_GADGET is not set | ||
| 1377 | CONFIG_MMC=y | ||
| 1378 | # CONFIG_MMC_DEBUG is not set | ||
| 1379 | CONFIG_MMC_UNSAFE_RESUME=y | ||
| 1380 | |||
| 1381 | # | ||
| 1382 | # MMC/SD Card Drivers | ||
| 1383 | # | ||
| 1384 | CONFIG_MMC_BLOCK=y | ||
| 1385 | CONFIG_MMC_BLOCK_BOUNCE=y | ||
| 1386 | # CONFIG_SDIO_UART is not set | ||
| 1387 | |||
| 1388 | # | ||
| 1389 | # MMC/SD Host Controller Drivers | ||
| 1390 | # | ||
| 1391 | CONFIG_MMC_PXA=y | ||
| 1392 | CONFIG_NEW_LEDS=y | ||
| 1393 | CONFIG_LEDS_CLASS=y | ||
| 1394 | |||
| 1395 | # | ||
| 1396 | # LED drivers | ||
| 1397 | # | ||
| 1398 | CONFIG_LEDS_LOCOMO=y | ||
| 1399 | # CONFIG_LEDS_TOSA is not set | ||
| 1400 | # CONFIG_LEDS_GPIO is not set | ||
| 1401 | |||
| 1402 | # | ||
| 1403 | # LED Triggers | ||
| 1404 | # | ||
| 1405 | CONFIG_LEDS_TRIGGERS=y | ||
| 1406 | CONFIG_LEDS_TRIGGER_TIMER=y | ||
| 1407 | CONFIG_LEDS_TRIGGER_IDE_DISK=y | ||
| 1408 | # CONFIG_LEDS_TRIGGER_HEARTBEAT is not set | ||
| 1409 | CONFIG_RTC_LIB=y | ||
| 1410 | CONFIG_RTC_CLASS=y | ||
| 1411 | CONFIG_RTC_HCTOSYS=y | ||
| 1412 | CONFIG_RTC_HCTOSYS_DEVICE="rtc0" | ||
| 1413 | # CONFIG_RTC_DEBUG is not set | ||
| 1414 | |||
| 1415 | # | ||
| 1416 | # RTC interfaces | ||
| 1417 | # | ||
| 1418 | CONFIG_RTC_INTF_SYSFS=y | ||
| 1419 | CONFIG_RTC_INTF_PROC=y | ||
| 1420 | CONFIG_RTC_INTF_DEV=y | ||
| 1421 | # CONFIG_RTC_INTF_DEV_UIE_EMUL is not set | ||
| 1422 | # CONFIG_RTC_DRV_TEST is not set | ||
| 1423 | |||
| 1424 | # | ||
| 1425 | # I2C RTC drivers | ||
| 1426 | # | ||
| 1427 | # CONFIG_RTC_DRV_DS1307 is not set | ||
| 1428 | # CONFIG_RTC_DRV_DS1374 is not set | ||
| 1429 | # CONFIG_RTC_DRV_DS1672 is not set | ||
| 1430 | # CONFIG_RTC_DRV_MAX6900 is not set | ||
| 1431 | # CONFIG_RTC_DRV_RS5C372 is not set | ||
| 1432 | # CONFIG_RTC_DRV_ISL1208 is not set | ||
| 1433 | # CONFIG_RTC_DRV_X1205 is not set | ||
| 1434 | # CONFIG_RTC_DRV_PCF8563 is not set | ||
| 1435 | # CONFIG_RTC_DRV_PCF8583 is not set | ||
| 1436 | # CONFIG_RTC_DRV_M41T80 is not set | ||
| 1437 | |||
| 1438 | # | ||
| 1439 | # SPI RTC drivers | ||
| 1440 | # | ||
| 1441 | |||
| 1442 | # | ||
| 1443 | # Platform RTC drivers | ||
| 1444 | # | ||
| 1445 | # CONFIG_RTC_DRV_CMOS is not set | ||
| 1446 | # CONFIG_RTC_DRV_DS1553 is not set | ||
| 1447 | # CONFIG_RTC_DRV_STK17TA8 is not set | ||
| 1448 | # CONFIG_RTC_DRV_DS1742 is not set | ||
| 1449 | # CONFIG_RTC_DRV_M48T86 is not set | ||
| 1450 | # CONFIG_RTC_DRV_M48T59 is not set | ||
| 1451 | # CONFIG_RTC_DRV_V3020 is not set | ||
| 1452 | |||
| 1453 | # | ||
| 1454 | # on-CPU RTC drivers | ||
| 1455 | # | ||
| 1456 | CONFIG_RTC_DRV_SA1100=y | ||
| 1457 | |||
| 1458 | # | ||
| 1459 | # File systems | ||
| 1460 | # | ||
| 1461 | CONFIG_EXT2_FS=y | ||
| 1462 | # CONFIG_EXT2_FS_XATTR is not set | ||
| 1463 | # CONFIG_EXT2_FS_XIP is not set | ||
| 1464 | CONFIG_EXT3_FS=m | ||
| 1465 | # CONFIG_EXT3_FS_XATTR is not set | ||
| 1466 | # CONFIG_EXT4DEV_FS is not set | ||
| 1467 | CONFIG_JBD=m | ||
| 1468 | # CONFIG_REISERFS_FS is not set | ||
| 1469 | # CONFIG_JFS_FS is not set | ||
| 1470 | CONFIG_FS_POSIX_ACL=y | ||
| 1471 | # CONFIG_XFS_FS is not set | ||
| 1472 | # CONFIG_GFS2_FS is not set | ||
| 1473 | # CONFIG_OCFS2_FS is not set | ||
| 1474 | # CONFIG_MINIX_FS is not set | ||
| 1475 | # CONFIG_ROMFS_FS is not set | ||
| 1476 | CONFIG_INOTIFY=y | ||
| 1477 | CONFIG_INOTIFY_USER=y | ||
| 1478 | # CONFIG_QUOTA is not set | ||
| 1479 | CONFIG_DNOTIFY=y | ||
| 1480 | # CONFIG_AUTOFS_FS is not set | ||
| 1481 | # CONFIG_AUTOFS4_FS is not set | ||
| 1482 | # CONFIG_FUSE_FS is not set | ||
| 1483 | |||
| 1484 | # | ||
| 1485 | # CD-ROM/DVD Filesystems | ||
| 1486 | # | ||
| 1487 | # CONFIG_ISO9660_FS is not set | ||
| 1488 | # CONFIG_UDF_FS is not set | ||
| 1489 | |||
| 1490 | # | ||
| 1491 | # DOS/FAT/NT Filesystems | ||
| 1492 | # | ||
| 1493 | CONFIG_FAT_FS=y | ||
| 1494 | # CONFIG_MSDOS_FS is not set | ||
| 1495 | CONFIG_VFAT_FS=y | ||
| 1496 | CONFIG_FAT_DEFAULT_CODEPAGE=437 | ||
| 1497 | CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" | ||
| 1498 | # CONFIG_NTFS_FS is not set | ||
| 1499 | |||
| 1500 | # | ||
| 1501 | # Pseudo filesystems | ||
| 1502 | # | ||
| 1503 | CONFIG_PROC_FS=y | ||
| 1504 | CONFIG_PROC_SYSCTL=y | ||
| 1505 | CONFIG_SYSFS=y | ||
| 1506 | CONFIG_TMPFS=y | ||
| 1507 | # CONFIG_TMPFS_POSIX_ACL is not set | ||
| 1508 | # CONFIG_HUGETLB_PAGE is not set | ||
| 1509 | # CONFIG_CONFIGFS_FS is not set | ||
| 1510 | |||
| 1511 | # | ||
| 1512 | # Miscellaneous filesystems | ||
| 1513 | # | ||
| 1514 | # CONFIG_ADFS_FS is not set | ||
| 1515 | # CONFIG_AFFS_FS is not set | ||
| 1516 | # CONFIG_HFS_FS is not set | ||
| 1517 | # CONFIG_HFSPLUS_FS is not set | ||
| 1518 | # CONFIG_BEFS_FS is not set | ||
| 1519 | # CONFIG_BFS_FS is not set | ||
| 1520 | # CONFIG_EFS_FS is not set | ||
| 1521 | CONFIG_JFFS2_FS=y | ||
| 1522 | CONFIG_JFFS2_FS_DEBUG=0 | ||
| 1523 | CONFIG_JFFS2_FS_WRITEBUFFER=y | ||
| 1524 | # CONFIG_JFFS2_FS_WBUF_VERIFY is not set | ||
| 1525 | CONFIG_JFFS2_SUMMARY=y | ||
| 1526 | # CONFIG_JFFS2_FS_XATTR is not set | ||
| 1527 | # CONFIG_JFFS2_SYSFS is not set | ||
| 1528 | CONFIG_JFFS2_COMPRESSION_OPTIONS=y | ||
| 1529 | CONFIG_JFFS2_ZLIB=y | ||
| 1530 | CONFIG_JFFS2_LZO=y | ||
| 1531 | CONFIG_JFFS2_RTIME=y | ||
| 1532 | CONFIG_JFFS2_RUBIN=y | ||
| 1533 | # CONFIG_JFFS2_CMODE_NONE is not set | ||
| 1534 | CONFIG_JFFS2_CMODE_PRIORITY=y | ||
| 1535 | # CONFIG_JFFS2_CMODE_SIZE is not set | ||
| 1536 | # CONFIG_JFFS2_CMODE_FAVOURLZO is not set | ||
| 1537 | CONFIG_CRAMFS=m | ||
| 1538 | CONFIG_SQUASHFS=m | ||
| 1539 | # CONFIG_SQUASHFS_EMBEDDED is not set | ||
| 1540 | CONFIG_SQUASHFS_FRAGMENT_CACHE_SIZE=3 | ||
| 1541 | # CONFIG_VXFS_FS is not set | ||
| 1542 | # CONFIG_HPFS_FS is not set | ||
| 1543 | # CONFIG_QNX4FS_FS is not set | ||
| 1544 | # CONFIG_SYSV_FS is not set | ||
| 1545 | # CONFIG_UFS_FS is not set | ||
| 1546 | CONFIG_NETWORK_FILESYSTEMS=y | ||
| 1547 | CONFIG_NFS_FS=m | ||
| 1548 | CONFIG_NFS_V3=y | ||
| 1549 | # CONFIG_NFS_V3_ACL is not set | ||
| 1550 | CONFIG_NFS_V4=y | ||
| 1551 | # CONFIG_NFS_DIRECTIO is not set | ||
| 1552 | CONFIG_NFSD=m | ||
| 1553 | CONFIG_NFSD_V3=y | ||
| 1554 | # CONFIG_NFSD_V3_ACL is not set | ||
| 1555 | CONFIG_NFSD_V4=y | ||
| 1556 | CONFIG_NFSD_TCP=y | ||
| 1557 | CONFIG_LOCKD=m | ||
| 1558 | CONFIG_LOCKD_V4=y | ||
| 1559 | CONFIG_EXPORTFS=m | ||
| 1560 | CONFIG_NFS_COMMON=y | ||
| 1561 | CONFIG_SUNRPC=m | ||
| 1562 | CONFIG_SUNRPC_GSS=m | ||
| 1563 | # CONFIG_SUNRPC_BIND34 is not set | ||
| 1564 | CONFIG_RPCSEC_GSS_KRB5=m | ||
| 1565 | # CONFIG_RPCSEC_GSS_SPKM3 is not set | ||
| 1566 | CONFIG_SMB_FS=m | ||
| 1567 | CONFIG_SMB_NLS_DEFAULT=y | ||
| 1568 | CONFIG_SMB_NLS_REMOTE="cp437" | ||
| 1569 | CONFIG_CIFS=m | ||
| 1570 | # CONFIG_CIFS_STATS is not set | ||
| 1571 | # CONFIG_CIFS_WEAK_PW_HASH is not set | ||
| 1572 | # CONFIG_CIFS_XATTR is not set | ||
| 1573 | # CONFIG_CIFS_DEBUG2 is not set | ||
| 1574 | # CONFIG_CIFS_EXPERIMENTAL is not set | ||
| 1575 | # CONFIG_NCP_FS is not set | ||
| 1576 | # CONFIG_CODA_FS is not set | ||
| 1577 | # CONFIG_AFS_FS is not set | ||
| 1578 | |||
| 1579 | # | ||
| 1580 | # Partition Types | ||
| 1581 | # | ||
| 1582 | CONFIG_PARTITION_ADVANCED=y | ||
| 1583 | # CONFIG_ACORN_PARTITION is not set | ||
| 1584 | # CONFIG_OSF_PARTITION is not set | ||
| 1585 | # CONFIG_AMIGA_PARTITION is not set | ||
| 1586 | # CONFIG_ATARI_PARTITION is not set | ||
| 1587 | # CONFIG_MAC_PARTITION is not set | ||
| 1588 | CONFIG_MSDOS_PARTITION=y | ||
| 1589 | # CONFIG_BSD_DISKLABEL is not set | ||
| 1590 | # CONFIG_MINIX_SUBPARTITION is not set | ||
| 1591 | # CONFIG_SOLARIS_X86_PARTITION is not set | ||
| 1592 | # CONFIG_UNIXWARE_DISKLABEL is not set | ||
| 1593 | # CONFIG_LDM_PARTITION is not set | ||
| 1594 | # CONFIG_SGI_PARTITION is not set | ||
| 1595 | # CONFIG_ULTRIX_PARTITION is not set | ||
| 1596 | # CONFIG_SUN_PARTITION is not set | ||
| 1597 | # CONFIG_KARMA_PARTITION is not set | ||
| 1598 | # CONFIG_EFI_PARTITION is not set | ||
| 1599 | # CONFIG_SYSV68_PARTITION is not set | ||
| 1600 | CONFIG_NLS=y | ||
| 1601 | CONFIG_NLS_DEFAULT="cp437" | ||
| 1602 | CONFIG_NLS_CODEPAGE_437=y | ||
| 1603 | CONFIG_NLS_CODEPAGE_737=m | ||
| 1604 | CONFIG_NLS_CODEPAGE_775=m | ||
| 1605 | CONFIG_NLS_CODEPAGE_850=m | ||
| 1606 | CONFIG_NLS_CODEPAGE_852=m | ||
| 1607 | CONFIG_NLS_CODEPAGE_855=m | ||
| 1608 | CONFIG_NLS_CODEPAGE_857=m | ||
| 1609 | CONFIG_NLS_CODEPAGE_860=m | ||
| 1610 | CONFIG_NLS_CODEPAGE_861=m | ||
| 1611 | CONFIG_NLS_CODEPAGE_862=m | ||
| 1612 | CONFIG_NLS_CODEPAGE_863=m | ||
| 1613 | CONFIG_NLS_CODEPAGE_864=m | ||
| 1614 | CONFIG_NLS_CODEPAGE_865=m | ||
| 1615 | CONFIG_NLS_CODEPAGE_866=m | ||
| 1616 | CONFIG_NLS_CODEPAGE_869=m | ||
| 1617 | CONFIG_NLS_CODEPAGE_936=m | ||
| 1618 | CONFIG_NLS_CODEPAGE_950=m | ||
| 1619 | CONFIG_NLS_CODEPAGE_932=m | ||
| 1620 | CONFIG_NLS_CODEPAGE_949=m | ||
| 1621 | CONFIG_NLS_CODEPAGE_874=m | ||
| 1622 | CONFIG_NLS_ISO8859_8=m | ||
| 1623 | CONFIG_NLS_CODEPAGE_1250=m | ||
| 1624 | CONFIG_NLS_CODEPAGE_1251=m | ||
| 1625 | CONFIG_NLS_ASCII=m | ||
| 1626 | CONFIG_NLS_ISO8859_1=y | ||
| 1627 | CONFIG_NLS_ISO8859_2=m | ||
| 1628 | CONFIG_NLS_ISO8859_3=m | ||
| 1629 | CONFIG_NLS_ISO8859_4=m | ||
| 1630 | CONFIG_NLS_ISO8859_5=m | ||
| 1631 | CONFIG_NLS_ISO8859_6=m | ||
| 1632 | CONFIG_NLS_ISO8859_7=m | ||
| 1633 | CONFIG_NLS_ISO8859_9=m | ||
| 1634 | CONFIG_NLS_ISO8859_13=m | ||
| 1635 | CONFIG_NLS_ISO8859_14=m | ||
| 1636 | CONFIG_NLS_ISO8859_15=m | ||
| 1637 | CONFIG_NLS_KOI8_R=m | ||
| 1638 | CONFIG_NLS_KOI8_U=m | ||
| 1639 | CONFIG_NLS_UTF8=y | ||
| 1640 | # CONFIG_DLM is not set | ||
| 1641 | CONFIG_INSTRUMENTATION=y | ||
| 1642 | CONFIG_PROFILING=y | ||
| 1643 | CONFIG_OPROFILE=m | ||
| 1644 | # CONFIG_MARKERS is not set | ||
| 1645 | |||
| 1646 | # | ||
| 1647 | # Kernel hacking | ||
| 1648 | # | ||
| 1649 | # CONFIG_PRINTK_TIME is not set | ||
| 1650 | CONFIG_ENABLE_WARN_DEPRECATED=y | ||
| 1651 | CONFIG_ENABLE_MUST_CHECK=y | ||
| 1652 | CONFIG_MAGIC_SYSRQ=y | ||
| 1653 | # CONFIG_UNUSED_SYMBOLS is not set | ||
| 1654 | # CONFIG_DEBUG_FS is not set | ||
| 1655 | # CONFIG_HEADERS_CHECK is not set | ||
| 1656 | CONFIG_DEBUG_KERNEL=y | ||
| 1657 | # CONFIG_DEBUG_SHIRQ is not set | ||
| 1658 | # CONFIG_DETECT_SOFTLOCKUP is not set | ||
| 1659 | # CONFIG_SCHED_DEBUG is not set | ||
| 1660 | # CONFIG_SCHEDSTATS is not set | ||
| 1661 | CONFIG_TIMER_STATS=y | ||
| 1662 | # CONFIG_DEBUG_SLAB is not set | ||
| 1663 | # CONFIG_DEBUG_PREEMPT is not set | ||
| 1664 | # CONFIG_DEBUG_RT_MUTEXES is not set | ||
| 1665 | # CONFIG_RT_MUTEX_TESTER is not set | ||
| 1666 | # CONFIG_DEBUG_SPINLOCK is not set | ||
| 1667 | # CONFIG_DEBUG_MUTEXES is not set | ||
| 1668 | # CONFIG_DEBUG_LOCK_ALLOC is not set | ||
| 1669 | # CONFIG_PROVE_LOCKING is not set | ||
| 1670 | # CONFIG_LOCK_STAT is not set | ||
| 1671 | # CONFIG_DEBUG_SPINLOCK_SLEEP is not set | ||
| 1672 | # CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set | ||
| 1673 | # CONFIG_DEBUG_KOBJECT is not set | ||
| 1674 | CONFIG_DEBUG_BUGVERBOSE=y | ||
| 1675 | # CONFIG_DEBUG_INFO is not set | ||
| 1676 | # CONFIG_DEBUG_VM is not set | ||
| 1677 | # CONFIG_DEBUG_LIST is not set | ||
| 1678 | # CONFIG_DEBUG_SG is not set | ||
| 1679 | CONFIG_FRAME_POINTER=y | ||
| 1680 | # CONFIG_FORCED_INLINING is not set | ||
| 1681 | # CONFIG_BOOT_PRINTK_DELAY is not set | ||
| 1682 | # CONFIG_RCU_TORTURE_TEST is not set | ||
| 1683 | # CONFIG_FAULT_INJECTION is not set | ||
| 1684 | # CONFIG_SAMPLES is not set | ||
| 1685 | # CONFIG_DEBUG_USER is not set | ||
| 1686 | CONFIG_DEBUG_ERRORS=y | ||
| 1687 | # CONFIG_DEBUG_LL is not set | ||
| 1688 | |||
| 1689 | # | ||
| 1690 | # Security options | ||
| 1691 | # | ||
| 1692 | # CONFIG_KEYS is not set | ||
| 1693 | # CONFIG_SECURITY is not set | ||
| 1694 | # CONFIG_SECURITY_FILE_CAPABILITIES is not set | ||
| 1695 | CONFIG_CRYPTO=y | ||
| 1696 | CONFIG_CRYPTO_ALGAPI=m | ||
| 1697 | CONFIG_CRYPTO_BLKCIPHER=m | ||
| 1698 | CONFIG_CRYPTO_HASH=m | ||
| 1699 | CONFIG_CRYPTO_MANAGER=m | ||
| 1700 | CONFIG_CRYPTO_HMAC=m | ||
| 1701 | # CONFIG_CRYPTO_XCBC is not set | ||
| 1702 | CONFIG_CRYPTO_NULL=m | ||
| 1703 | CONFIG_CRYPTO_MD4=m | ||
| 1704 | CONFIG_CRYPTO_MD5=m | ||
| 1705 | CONFIG_CRYPTO_SHA1=m | ||
| 1706 | CONFIG_CRYPTO_SHA256=m | ||
| 1707 | CONFIG_CRYPTO_SHA512=m | ||
| 1708 | CONFIG_CRYPTO_WP512=m | ||
| 1709 | # CONFIG_CRYPTO_TGR192 is not set | ||
| 1710 | # CONFIG_CRYPTO_GF128MUL is not set | ||
| 1711 | CONFIG_CRYPTO_ECB=m | ||
| 1712 | CONFIG_CRYPTO_CBC=m | ||
| 1713 | CONFIG_CRYPTO_PCBC=m | ||
| 1714 | # CONFIG_CRYPTO_LRW is not set | ||
| 1715 | # CONFIG_CRYPTO_XTS is not set | ||
| 1716 | # CONFIG_CRYPTO_CRYPTD is not set | ||
| 1717 | CONFIG_CRYPTO_DES=m | ||
| 1718 | # CONFIG_CRYPTO_FCRYPT is not set | ||
| 1719 | CONFIG_CRYPTO_BLOWFISH=m | ||
| 1720 | CONFIG_CRYPTO_TWOFISH=m | ||
| 1721 | CONFIG_CRYPTO_TWOFISH_COMMON=m | ||
| 1722 | CONFIG_CRYPTO_SERPENT=m | ||
| 1723 | CONFIG_CRYPTO_AES=m | ||
| 1724 | CONFIG_CRYPTO_CAST5=m | ||
| 1725 | CONFIG_CRYPTO_CAST6=m | ||
| 1726 | CONFIG_CRYPTO_TEA=m | ||
| 1727 | CONFIG_CRYPTO_ARC4=m | ||
| 1728 | CONFIG_CRYPTO_KHAZAD=m | ||
| 1729 | CONFIG_CRYPTO_ANUBIS=m | ||
| 1730 | # CONFIG_CRYPTO_SEED is not set | ||
| 1731 | CONFIG_CRYPTO_DEFLATE=m | ||
| 1732 | CONFIG_CRYPTO_LZO=m | ||
| 1733 | CONFIG_CRYPTO_MICHAEL_MIC=m | ||
| 1734 | CONFIG_CRYPTO_CRC32C=m | ||
| 1735 | CONFIG_CRYPTO_CAMELLIA=m | ||
| 1736 | CONFIG_CRYPTO_TEST=m | ||
| 1737 | # CONFIG_CRYPTO_AUTHENC is not set | ||
| 1738 | # CONFIG_CRYPTO_HW is not set | ||
| 1739 | |||
| 1740 | # | ||
| 1741 | # Library routines | ||
| 1742 | # | ||
| 1743 | CONFIG_BITREVERSE=y | ||
| 1744 | CONFIG_CRC_CCITT=y | ||
| 1745 | # CONFIG_CRC16 is not set | ||
| 1746 | # CONFIG_CRC_ITU_T is not set | ||
| 1747 | CONFIG_CRC32=y | ||
| 1748 | # CONFIG_CRC7 is not set | ||
| 1749 | CONFIG_LIBCRC32C=m | ||
| 1750 | CONFIG_ZLIB_INFLATE=y | ||
| 1751 | CONFIG_ZLIB_DEFLATE=y | ||
| 1752 | CONFIG_LZO_COMPRESS=y | ||
| 1753 | CONFIG_LZO_DECOMPRESS=y | ||
| 1754 | CONFIG_PLIST=y | ||
| 1755 | CONFIG_HAS_IOMEM=y | ||
| 1756 | CONFIG_HAS_IOPORT=y | ||
| 1757 | CONFIG_HAS_DMA=y | ||
diff --git a/meta/packages/linux/linux-rp-2.6.25+2.6.26-rc4/defconfig-qemuarm b/meta/packages/linux/linux-rp-2.6.25+2.6.26-rc4/defconfig-qemuarm new file mode 100644 index 0000000000..e636b6c671 --- /dev/null +++ b/meta/packages/linux/linux-rp-2.6.25+2.6.26-rc4/defconfig-qemuarm | |||
| @@ -0,0 +1,1582 @@ | |||
| 1 | # | ||
| 2 | # Automatically generated make config: don't edit | ||
| 3 | # Linux kernel version: 2.6.24-rc8 | ||
| 4 | # Sun Jan 20 22:28:17 2008 | ||
| 5 | # | ||
| 6 | CONFIG_ARM=y | ||
| 7 | CONFIG_SYS_SUPPORTS_APM_EMULATION=y | ||
| 8 | # CONFIG_GENERIC_GPIO is not set | ||
| 9 | CONFIG_GENERIC_TIME=y | ||
| 10 | CONFIG_GENERIC_CLOCKEVENTS=y | ||
| 11 | CONFIG_MMU=y | ||
| 12 | # CONFIG_NO_IOPORT is not set | ||
| 13 | CONFIG_GENERIC_HARDIRQS=y | ||
| 14 | CONFIG_STACKTRACE_SUPPORT=y | ||
| 15 | CONFIG_LOCKDEP_SUPPORT=y | ||
| 16 | CONFIG_TRACE_IRQFLAGS_SUPPORT=y | ||
| 17 | CONFIG_HARDIRQS_SW_RESEND=y | ||
| 18 | CONFIG_GENERIC_IRQ_PROBE=y | ||
| 19 | CONFIG_RWSEM_GENERIC_SPINLOCK=y | ||
| 20 | # CONFIG_ARCH_HAS_ILOG2_U32 is not set | ||
| 21 | # CONFIG_ARCH_HAS_ILOG2_U64 is not set | ||
| 22 | CONFIG_GENERIC_HWEIGHT=y | ||
| 23 | CONFIG_GENERIC_CALIBRATE_DELAY=y | ||
| 24 | CONFIG_ZONE_DMA=y | ||
| 25 | CONFIG_VECTORS_BASE=0xffff0000 | ||
| 26 | CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" | ||
| 27 | |||
| 28 | # | ||
| 29 | # General setup | ||
| 30 | # | ||
| 31 | CONFIG_EXPERIMENTAL=y | ||
| 32 | CONFIG_BROKEN_ON_SMP=y | ||
| 33 | CONFIG_LOCK_KERNEL=y | ||
| 34 | CONFIG_INIT_ENV_ARG_LIMIT=32 | ||
| 35 | CONFIG_LOCALVERSION="" | ||
| 36 | # CONFIG_LOCALVERSION_AUTO is not set | ||
| 37 | CONFIG_SWAP=y | ||
| 38 | CONFIG_SYSVIPC=y | ||
| 39 | CONFIG_SYSVIPC_SYSCTL=y | ||
| 40 | # CONFIG_POSIX_MQUEUE is not set | ||
| 41 | CONFIG_BSD_PROCESS_ACCT=y | ||
| 42 | CONFIG_BSD_PROCESS_ACCT_V3=y | ||
| 43 | # CONFIG_TASKSTATS is not set | ||
| 44 | # CONFIG_USER_NS is not set | ||
| 45 | # CONFIG_PID_NS is not set | ||
| 46 | # CONFIG_AUDIT is not set | ||
| 47 | # CONFIG_IKCONFIG is not set | ||
| 48 | CONFIG_LOG_BUF_SHIFT=14 | ||
| 49 | # CONFIG_CGROUPS is not set | ||
| 50 | CONFIG_FAIR_GROUP_SCHED=y | ||
| 51 | CONFIG_FAIR_USER_SCHED=y | ||
| 52 | # CONFIG_FAIR_CGROUP_SCHED is not set | ||
| 53 | CONFIG_SYSFS_DEPRECATED=y | ||
| 54 | # CONFIG_RELAY is not set | ||
| 55 | CONFIG_BLK_DEV_INITRD=y | ||
| 56 | CONFIG_INITRAMFS_SOURCE="" | ||
| 57 | CONFIG_CC_OPTIMIZE_FOR_SIZE=y | ||
| 58 | CONFIG_SYSCTL=y | ||
| 59 | CONFIG_EMBEDDED=y | ||
| 60 | CONFIG_UID16=y | ||
| 61 | CONFIG_SYSCTL_SYSCALL=y | ||
| 62 | CONFIG_KALLSYMS=y | ||
| 63 | # CONFIG_KALLSYMS_ALL is not set | ||
| 64 | # CONFIG_KALLSYMS_EXTRA_PASS is not set | ||
| 65 | CONFIG_HOTPLUG=y | ||
| 66 | CONFIG_PRINTK=y | ||
| 67 | CONFIG_BUG=y | ||
| 68 | CONFIG_ELF_CORE=y | ||
| 69 | CONFIG_BASE_FULL=y | ||
| 70 | CONFIG_FUTEX=y | ||
| 71 | CONFIG_ANON_INODES=y | ||
| 72 | CONFIG_EPOLL=y | ||
| 73 | CONFIG_SIGNALFD=y | ||
| 74 | CONFIG_EVENTFD=y | ||
| 75 | CONFIG_SHMEM=y | ||
| 76 | CONFIG_VM_EVENT_COUNTERS=y | ||
| 77 | CONFIG_SLAB=y | ||
| 78 | # CONFIG_SLUB is not set | ||
| 79 | # CONFIG_SLOB is not set | ||
| 80 | CONFIG_SLABINFO=y | ||
| 81 | CONFIG_RT_MUTEXES=y | ||
| 82 | # CONFIG_TINY_SHMEM is not set | ||
| 83 | CONFIG_BASE_SMALL=0 | ||
| 84 | CONFIG_MODULES=y | ||
| 85 | CONFIG_MODULE_UNLOAD=y | ||
| 86 | CONFIG_MODULE_FORCE_UNLOAD=y | ||
| 87 | # CONFIG_MODVERSIONS is not set | ||
| 88 | # CONFIG_MODULE_SRCVERSION_ALL is not set | ||
| 89 | CONFIG_KMOD=y | ||
| 90 | CONFIG_BLOCK=y | ||
| 91 | # CONFIG_LBD is not set | ||
| 92 | # CONFIG_BLK_DEV_IO_TRACE is not set | ||
| 93 | # CONFIG_LSF is not set | ||
| 94 | # CONFIG_BLK_DEV_BSG is not set | ||
| 95 | |||
| 96 | # | ||
| 97 | # IO Schedulers | ||
| 98 | # | ||
| 99 | CONFIG_IOSCHED_NOOP=y | ||
| 100 | CONFIG_IOSCHED_AS=y | ||
| 101 | CONFIG_IOSCHED_DEADLINE=m | ||
| 102 | CONFIG_IOSCHED_CFQ=m | ||
| 103 | CONFIG_DEFAULT_AS=y | ||
| 104 | # CONFIG_DEFAULT_DEADLINE is not set | ||
| 105 | # CONFIG_DEFAULT_CFQ is not set | ||
| 106 | # CONFIG_DEFAULT_NOOP is not set | ||
| 107 | CONFIG_DEFAULT_IOSCHED="anticipatory" | ||
| 108 | |||
| 109 | # | ||
| 110 | # System Type | ||
| 111 | # | ||
| 112 | # CONFIG_ARCH_AAEC2000 is not set | ||
| 113 | # CONFIG_ARCH_INTEGRATOR is not set | ||
| 114 | # CONFIG_ARCH_REALVIEW is not set | ||
| 115 | CONFIG_ARCH_VERSATILE=y | ||
| 116 | # CONFIG_ARCH_AT91 is not set | ||
| 117 | # CONFIG_ARCH_CLPS7500 is not set | ||
| 118 | # CONFIG_ARCH_CLPS711X is not set | ||
| 119 | # CONFIG_ARCH_CO285 is not set | ||
| 120 | # CONFIG_ARCH_EBSA110 is not set | ||
| 121 | # CONFIG_ARCH_EP93XX is not set | ||
| 122 | # CONFIG_ARCH_FOOTBRIDGE is not set | ||
| 123 | # CONFIG_ARCH_NETX is not set | ||
| 124 | # CONFIG_ARCH_H720X is not set | ||
| 125 | # CONFIG_ARCH_IMX is not set | ||
| 126 | # CONFIG_ARCH_IOP13XX is not set | ||
| 127 | # CONFIG_ARCH_IOP32X is not set | ||
| 128 | # CONFIG_ARCH_IOP33X is not set | ||
| 129 | # CONFIG_ARCH_IXP23XX is not set | ||
| 130 | # CONFIG_ARCH_IXP2000 is not set | ||
| 131 | # CONFIG_ARCH_IXP4XX is not set | ||
| 132 | # CONFIG_ARCH_L7200 is not set | ||
| 133 | # CONFIG_ARCH_KS8695 is not set | ||
| 134 | # CONFIG_ARCH_NS9XXX is not set | ||
| 135 | # CONFIG_ARCH_MXC is not set | ||
| 136 | # CONFIG_ARCH_PNX4008 is not set | ||
| 137 | # CONFIG_ARCH_PXA is not set | ||
| 138 | # CONFIG_ARCH_RPC is not set | ||
| 139 | # CONFIG_ARCH_SA1100 is not set | ||
| 140 | # CONFIG_ARCH_S3C2410 is not set | ||
| 141 | # CONFIG_ARCH_SHARK is not set | ||
| 142 | # CONFIG_ARCH_LH7A40X is not set | ||
| 143 | # CONFIG_ARCH_DAVINCI is not set | ||
| 144 | # CONFIG_ARCH_OMAP is not set | ||
| 145 | |||
| 146 | # | ||
| 147 | # Boot options | ||
| 148 | # | ||
| 149 | |||
| 150 | # | ||
| 151 | # Power management | ||
| 152 | # | ||
| 153 | |||
| 154 | # | ||
| 155 | # Versatile platform type | ||
| 156 | # | ||
| 157 | CONFIG_ARCH_VERSATILE_PB=y | ||
| 158 | # CONFIG_MACH_VERSATILE_AB is not set | ||
| 159 | |||
| 160 | # | ||
| 161 | # Processor Type | ||
| 162 | # | ||
| 163 | CONFIG_CPU_32=y | ||
| 164 | CONFIG_CPU_ARM926T=y | ||
| 165 | # CONFIG_CPU_V6 is not set | ||
| 166 | CONFIG_CPU_32v5=y | ||
| 167 | CONFIG_CPU_ABRT_EV5TJ=y | ||
| 168 | CONFIG_CPU_CACHE_VIVT=y | ||
| 169 | CONFIG_CPU_COPY_V4WB=y | ||
| 170 | CONFIG_CPU_TLB_V4WBI=y | ||
| 171 | CONFIG_CPU_CP15=y | ||
| 172 | CONFIG_CPU_CP15_MMU=y | ||
| 173 | |||
| 174 | # | ||
| 175 | # Processor Features | ||
| 176 | # | ||
| 177 | CONFIG_ARM_THUMB=y | ||
| 178 | # CONFIG_CPU_ICACHE_DISABLE is not set | ||
| 179 | # CONFIG_CPU_DCACHE_DISABLE is not set | ||
| 180 | # CONFIG_CPU_DCACHE_WRITETHROUGH is not set | ||
| 181 | # CONFIG_CPU_CACHE_ROUND_ROBIN is not set | ||
| 182 | # CONFIG_OUTER_CACHE is not set | ||
| 183 | CONFIG_ARM_VIC=y | ||
| 184 | CONFIG_ICST307=y | ||
| 185 | |||
| 186 | # | ||
| 187 | # Bus support | ||
| 188 | # | ||
| 189 | CONFIG_ARM_AMBA=y | ||
| 190 | CONFIG_PCI=y | ||
| 191 | CONFIG_PCI_SYSCALL=y | ||
| 192 | # CONFIG_ARCH_SUPPORTS_MSI is not set | ||
| 193 | CONFIG_PCI_LEGACY=y | ||
| 194 | # CONFIG_PCI_DEBUG is not set | ||
| 195 | # CONFIG_PCCARD is not set | ||
| 196 | |||
| 197 | # | ||
| 198 | # Kernel Features | ||
| 199 | # | ||
| 200 | # CONFIG_TICK_ONESHOT is not set | ||
| 201 | # CONFIG_NO_HZ is not set | ||
| 202 | # CONFIG_HIGH_RES_TIMERS is not set | ||
| 203 | CONFIG_GENERIC_CLOCKEVENTS_BUILD=y | ||
| 204 | CONFIG_PREEMPT=y | ||
| 205 | CONFIG_HZ=100 | ||
| 206 | CONFIG_AEABI=y | ||
| 207 | CONFIG_OABI_COMPAT=y | ||
| 208 | # CONFIG_ARCH_DISCONTIGMEM_ENABLE is not set | ||
| 209 | CONFIG_SELECT_MEMORY_MODEL=y | ||
| 210 | CONFIG_FLATMEM_MANUAL=y | ||
| 211 | # CONFIG_DISCONTIGMEM_MANUAL is not set | ||
| 212 | # CONFIG_SPARSEMEM_MANUAL is not set | ||
| 213 | CONFIG_FLATMEM=y | ||
| 214 | CONFIG_FLAT_NODE_MEM_MAP=y | ||
| 215 | # CONFIG_SPARSEMEM_STATIC is not set | ||
| 216 | # CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set | ||
| 217 | CONFIG_SPLIT_PTLOCK_CPUS=4096 | ||
| 218 | # CONFIG_RESOURCES_64BIT is not set | ||
| 219 | CONFIG_ZONE_DMA_FLAG=1 | ||
| 220 | CONFIG_BOUNCE=y | ||
| 221 | CONFIG_VIRT_TO_BUS=y | ||
| 222 | CONFIG_LEDS=y | ||
| 223 | CONFIG_LEDS_CPU=y | ||
| 224 | CONFIG_ALIGNMENT_TRAP=y | ||
| 225 | |||
| 226 | # | ||
| 227 | # Boot options | ||
| 228 | # | ||
| 229 | CONFIG_ZBOOT_ROM_TEXT=0x0 | ||
| 230 | CONFIG_ZBOOT_ROM_BSS=0x0 | ||
| 231 | CONFIG_CMDLINE="console=ttyAMA0,115200n8 console=tty1 noinitrd root=/dev/mtdblock2 rootfstype=jffs2 dyntick=enable debug" | ||
| 232 | # CONFIG_XIP_KERNEL is not set | ||
| 233 | CONFIG_KEXEC=y | ||
| 234 | CONFIG_ATAGS_PROC=y | ||
| 235 | |||
| 236 | # | ||
| 237 | # Floating point emulation | ||
| 238 | # | ||
| 239 | |||
| 240 | # | ||
| 241 | # At least one emulation must be selected | ||
| 242 | # | ||
| 243 | CONFIG_FPE_NWFPE=y | ||
| 244 | # CONFIG_FPE_NWFPE_XP is not set | ||
| 245 | # CONFIG_FPE_FASTFPE is not set | ||
| 246 | CONFIG_VFP=y | ||
| 247 | |||
| 248 | # | ||
| 249 | # Userspace binary formats | ||
| 250 | # | ||
| 251 | CONFIG_BINFMT_ELF=y | ||
| 252 | # CONFIG_BINFMT_AOUT is not set | ||
| 253 | # CONFIG_BINFMT_MISC is not set | ||
| 254 | |||
| 255 | # | ||
| 256 | # Power management options | ||
| 257 | # | ||
| 258 | CONFIG_PM=y | ||
| 259 | # CONFIG_PM_LEGACY is not set | ||
| 260 | # CONFIG_PM_DEBUG is not set | ||
| 261 | CONFIG_PM_SLEEP=y | ||
| 262 | CONFIG_SUSPEND_UP_POSSIBLE=y | ||
| 263 | CONFIG_SUSPEND=y | ||
| 264 | # CONFIG_APM_EMULATION is not set | ||
| 265 | |||
| 266 | # | ||
| 267 | # Networking | ||
| 268 | # | ||
| 269 | CONFIG_NET=y | ||
| 270 | |||
| 271 | # | ||
| 272 | # Networking options | ||
| 273 | # | ||
| 274 | CONFIG_PACKET=m | ||
| 275 | CONFIG_PACKET_MMAP=y | ||
| 276 | CONFIG_UNIX=y | ||
| 277 | CONFIG_XFRM=y | ||
| 278 | # CONFIG_XFRM_USER is not set | ||
| 279 | # CONFIG_XFRM_SUB_POLICY is not set | ||
| 280 | # CONFIG_XFRM_MIGRATE is not set | ||
| 281 | # CONFIG_NET_KEY is not set | ||
| 282 | CONFIG_INET=y | ||
| 283 | # CONFIG_IP_MULTICAST is not set | ||
| 284 | # CONFIG_IP_ADVANCED_ROUTER is not set | ||
| 285 | CONFIG_IP_FIB_HASH=y | ||
| 286 | CONFIG_IP_PNP=y | ||
| 287 | CONFIG_IP_PNP_DHCP=y | ||
| 288 | CONFIG_IP_PNP_BOOTP=y | ||
| 289 | # CONFIG_IP_PNP_RARP is not set | ||
| 290 | # CONFIG_NET_IPIP is not set | ||
| 291 | # CONFIG_NET_IPGRE is not set | ||
| 292 | # CONFIG_ARPD is not set | ||
| 293 | CONFIG_SYN_COOKIES=y | ||
| 294 | # CONFIG_INET_AH is not set | ||
| 295 | # CONFIG_INET_ESP is not set | ||
| 296 | # CONFIG_INET_IPCOMP is not set | ||
| 297 | # CONFIG_INET_XFRM_TUNNEL is not set | ||
| 298 | CONFIG_INET_TUNNEL=m | ||
| 299 | CONFIG_INET_XFRM_MODE_TRANSPORT=m | ||
| 300 | CONFIG_INET_XFRM_MODE_TUNNEL=m | ||
| 301 | CONFIG_INET_XFRM_MODE_BEET=m | ||
| 302 | # CONFIG_INET_LRO is not set | ||
| 303 | CONFIG_INET_DIAG=m | ||
| 304 | CONFIG_INET_TCP_DIAG=m | ||
| 305 | # CONFIG_TCP_CONG_ADVANCED is not set | ||
| 306 | CONFIG_TCP_CONG_CUBIC=y | ||
| 307 | CONFIG_DEFAULT_TCP_CONG="cubic" | ||
| 308 | # CONFIG_TCP_MD5SIG is not set | ||
| 309 | # CONFIG_IP_VS is not set | ||
| 310 | CONFIG_IPV6=m | ||
| 311 | # CONFIG_IPV6_PRIVACY is not set | ||
| 312 | # CONFIG_IPV6_ROUTER_PREF is not set | ||
| 313 | # CONFIG_IPV6_OPTIMISTIC_DAD is not set | ||
| 314 | CONFIG_INET6_AH=m | ||
| 315 | CONFIG_INET6_ESP=m | ||
| 316 | CONFIG_INET6_IPCOMP=m | ||
| 317 | # CONFIG_IPV6_MIP6 is not set | ||
| 318 | CONFIG_INET6_XFRM_TUNNEL=m | ||
| 319 | CONFIG_INET6_TUNNEL=m | ||
| 320 | CONFIG_INET6_XFRM_MODE_TRANSPORT=m | ||
| 321 | CONFIG_INET6_XFRM_MODE_TUNNEL=m | ||
| 322 | CONFIG_INET6_XFRM_MODE_BEET=m | ||
| 323 | # CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION is not set | ||
| 324 | CONFIG_IPV6_SIT=m | ||
| 325 | CONFIG_IPV6_TUNNEL=m | ||
| 326 | # CONFIG_IPV6_MULTIPLE_TABLES is not set | ||
| 327 | # CONFIG_NETWORK_SECMARK is not set | ||
| 328 | CONFIG_NETFILTER=y | ||
| 329 | # CONFIG_NETFILTER_DEBUG is not set | ||
| 330 | |||
| 331 | # | ||
| 332 | # Core Netfilter Configuration | ||
| 333 | # | ||
| 334 | # CONFIG_NETFILTER_NETLINK is not set | ||
| 335 | # CONFIG_NF_CONNTRACK_ENABLED is not set | ||
| 336 | # CONFIG_NF_CONNTRACK is not set | ||
| 337 | CONFIG_NETFILTER_XTABLES=m | ||
| 338 | # CONFIG_NETFILTER_XT_TARGET_CLASSIFY is not set | ||
| 339 | # CONFIG_NETFILTER_XT_TARGET_DSCP is not set | ||
| 340 | # CONFIG_NETFILTER_XT_TARGET_MARK is not set | ||
| 341 | # CONFIG_NETFILTER_XT_TARGET_NFQUEUE is not set | ||
| 342 | # CONFIG_NETFILTER_XT_TARGET_NFLOG is not set | ||
| 343 | # CONFIG_NETFILTER_XT_TARGET_TRACE is not set | ||
| 344 | # CONFIG_NETFILTER_XT_TARGET_TCPMSS is not set | ||
| 345 | # CONFIG_NETFILTER_XT_MATCH_COMMENT is not set | ||
| 346 | # CONFIG_NETFILTER_XT_MATCH_DCCP is not set | ||
| 347 | # CONFIG_NETFILTER_XT_MATCH_DSCP is not set | ||
| 348 | # CONFIG_NETFILTER_XT_MATCH_ESP is not set | ||
| 349 | # CONFIG_NETFILTER_XT_MATCH_LENGTH is not set | ||
| 350 | # CONFIG_NETFILTER_XT_MATCH_LIMIT is not set | ||
| 351 | # CONFIG_NETFILTER_XT_MATCH_MAC is not set | ||
| 352 | # CONFIG_NETFILTER_XT_MATCH_MARK is not set | ||
| 353 | # CONFIG_NETFILTER_XT_MATCH_POLICY is not set | ||
| 354 | # CONFIG_NETFILTER_XT_MATCH_MULTIPORT is not set | ||
| 355 | # CONFIG_NETFILTER_XT_MATCH_PKTTYPE is not set | ||
| 356 | # CONFIG_NETFILTER_XT_MATCH_QUOTA is not set | ||
| 357 | # CONFIG_NETFILTER_XT_MATCH_REALM is not set | ||
| 358 | # CONFIG_NETFILTER_XT_MATCH_SCTP is not set | ||
| 359 | # CONFIG_NETFILTER_XT_MATCH_STATISTIC is not set | ||
| 360 | # CONFIG_NETFILTER_XT_MATCH_STRING is not set | ||
| 361 | # CONFIG_NETFILTER_XT_MATCH_TCPMSS is not set | ||
| 362 | # CONFIG_NETFILTER_XT_MATCH_TIME is not set | ||
| 363 | # CONFIG_NETFILTER_XT_MATCH_U32 is not set | ||
| 364 | # CONFIG_NETFILTER_XT_MATCH_HASHLIMIT is not set | ||
| 365 | |||
| 366 | # | ||
| 367 | # IP: Netfilter Configuration | ||
| 368 | # | ||
| 369 | CONFIG_IP_NF_QUEUE=m | ||
| 370 | CONFIG_IP_NF_IPTABLES=m | ||
| 371 | CONFIG_IP_NF_MATCH_IPRANGE=m | ||
| 372 | CONFIG_IP_NF_MATCH_TOS=m | ||
| 373 | CONFIG_IP_NF_MATCH_RECENT=m | ||
| 374 | CONFIG_IP_NF_MATCH_ECN=m | ||
| 375 | CONFIG_IP_NF_MATCH_AH=m | ||
| 376 | CONFIG_IP_NF_MATCH_TTL=m | ||
| 377 | CONFIG_IP_NF_MATCH_OWNER=m | ||
| 378 | CONFIG_IP_NF_MATCH_ADDRTYPE=m | ||
| 379 | CONFIG_IP_NF_FILTER=m | ||
| 380 | CONFIG_IP_NF_TARGET_REJECT=m | ||
| 381 | CONFIG_IP_NF_TARGET_LOG=m | ||
| 382 | CONFIG_IP_NF_TARGET_ULOG=m | ||
| 383 | CONFIG_IP_NF_MANGLE=m | ||
| 384 | CONFIG_IP_NF_TARGET_TOS=m | ||
| 385 | CONFIG_IP_NF_TARGET_ECN=m | ||
| 386 | CONFIG_IP_NF_TARGET_TTL=m | ||
| 387 | CONFIG_IP_NF_RAW=m | ||
| 388 | CONFIG_IP_NF_ARPTABLES=m | ||
| 389 | CONFIG_IP_NF_ARPFILTER=m | ||
| 390 | CONFIG_IP_NF_ARP_MANGLE=m | ||
| 391 | |||
| 392 | # | ||
| 393 | # IPv6: Netfilter Configuration (EXPERIMENTAL) | ||
| 394 | # | ||
| 395 | # CONFIG_IP6_NF_QUEUE is not set | ||
| 396 | # CONFIG_IP6_NF_IPTABLES is not set | ||
| 397 | # CONFIG_IP_DCCP is not set | ||
| 398 | # CONFIG_IP_SCTP is not set | ||
| 399 | # CONFIG_TIPC is not set | ||
| 400 | # CONFIG_ATM is not set | ||
| 401 | # CONFIG_BRIDGE is not set | ||
| 402 | # CONFIG_VLAN_8021Q is not set | ||
| 403 | # CONFIG_DECNET is not set | ||
| 404 | # CONFIG_LLC2 is not set | ||
| 405 | # CONFIG_IPX is not set | ||
| 406 | # CONFIG_ATALK is not set | ||
| 407 | # CONFIG_X25 is not set | ||
| 408 | # CONFIG_LAPB is not set | ||
| 409 | # CONFIG_ECONET is not set | ||
| 410 | # CONFIG_WAN_ROUTER is not set | ||
| 411 | # CONFIG_NET_SCHED is not set | ||
| 412 | |||
| 413 | # | ||
| 414 | # Network testing | ||
| 415 | # | ||
| 416 | # CONFIG_NET_PKTGEN is not set | ||
| 417 | # CONFIG_HAMRADIO is not set | ||
| 418 | CONFIG_IRDA=m | ||
| 419 | |||
| 420 | # | ||
| 421 | # IrDA protocols | ||
| 422 | # | ||
| 423 | CONFIG_IRLAN=m | ||
| 424 | CONFIG_IRNET=m | ||
| 425 | CONFIG_IRCOMM=m | ||
| 426 | # CONFIG_IRDA_ULTRA is not set | ||
| 427 | |||
| 428 | # | ||
| 429 | # IrDA options | ||
| 430 | # | ||
| 431 | # CONFIG_IRDA_CACHE_LAST_LSAP is not set | ||
| 432 | # CONFIG_IRDA_FAST_RR is not set | ||
| 433 | # CONFIG_IRDA_DEBUG is not set | ||
| 434 | |||
| 435 | # | ||
| 436 | # Infrared-port device drivers | ||
| 437 | # | ||
| 438 | |||
| 439 | # | ||
| 440 | # SIR device drivers | ||
| 441 | # | ||
| 442 | # CONFIG_IRTTY_SIR is not set | ||
| 443 | |||
| 444 | # | ||
| 445 | # Dongle support | ||
| 446 | # | ||
| 447 | # CONFIG_KINGSUN_DONGLE is not set | ||
| 448 | # CONFIG_KSDAZZLE_DONGLE is not set | ||
| 449 | # CONFIG_KS959_DONGLE is not set | ||
| 450 | |||
| 451 | # | ||
| 452 | # Old SIR device drivers | ||
| 453 | # | ||
| 454 | # CONFIG_IRPORT_SIR is not set | ||
| 455 | |||
| 456 | # | ||
| 457 | # Old Serial dongle support | ||
| 458 | # | ||
| 459 | |||
| 460 | # | ||
| 461 | # FIR device drivers | ||
| 462 | # | ||
| 463 | # CONFIG_USB_IRDA is not set | ||
| 464 | # CONFIG_SIGMATEL_FIR is not set | ||
| 465 | # CONFIG_TOSHIBA_FIR is not set | ||
| 466 | # CONFIG_VLSI_FIR is not set | ||
| 467 | # CONFIG_MCS_FIR is not set | ||
| 468 | CONFIG_BT=m | ||
| 469 | CONFIG_BT_L2CAP=m | ||
| 470 | CONFIG_BT_SCO=m | ||
| 471 | CONFIG_BT_RFCOMM=m | ||
| 472 | CONFIG_BT_RFCOMM_TTY=y | ||
| 473 | CONFIG_BT_BNEP=m | ||
| 474 | CONFIG_BT_BNEP_MC_FILTER=y | ||
| 475 | CONFIG_BT_BNEP_PROTO_FILTER=y | ||
| 476 | CONFIG_BT_HIDP=m | ||
| 477 | |||
| 478 | # | ||
| 479 | # Bluetooth device drivers | ||
| 480 | # | ||
| 481 | CONFIG_BT_HCIUSB=m | ||
| 482 | # CONFIG_BT_HCIUSB_SCO is not set | ||
| 483 | CONFIG_BT_HCIUART=m | ||
| 484 | CONFIG_BT_HCIUART_H4=y | ||
| 485 | CONFIG_BT_HCIUART_BCSP=y | ||
| 486 | # CONFIG_BT_HCIUART_LL is not set | ||
| 487 | CONFIG_BT_HCIBCM203X=m | ||
| 488 | CONFIG_BT_HCIBPA10X=m | ||
| 489 | CONFIG_BT_HCIBFUSB=m | ||
| 490 | CONFIG_BT_HCIVHCI=m | ||
| 491 | # CONFIG_AF_RXRPC is not set | ||
| 492 | |||
| 493 | # | ||
| 494 | # Wireless | ||
| 495 | # | ||
| 496 | # CONFIG_CFG80211 is not set | ||
| 497 | CONFIG_WIRELESS_EXT=y | ||
| 498 | # CONFIG_MAC80211 is not set | ||
| 499 | CONFIG_IEEE80211=m | ||
| 500 | # CONFIG_IEEE80211_DEBUG is not set | ||
| 501 | CONFIG_IEEE80211_CRYPT_WEP=m | ||
| 502 | CONFIG_IEEE80211_CRYPT_CCMP=m | ||
| 503 | CONFIG_IEEE80211_CRYPT_TKIP=m | ||
| 504 | CONFIG_IEEE80211_SOFTMAC=m | ||
| 505 | # CONFIG_IEEE80211_SOFTMAC_DEBUG is not set | ||
| 506 | # CONFIG_RFKILL is not set | ||
| 507 | # CONFIG_NET_9P is not set | ||
| 508 | |||
| 509 | # | ||
| 510 | # Device Drivers | ||
| 511 | # | ||
| 512 | |||
| 513 | # | ||
| 514 | # Generic Driver Options | ||
| 515 | # | ||
| 516 | CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" | ||
| 517 | CONFIG_STANDALONE=y | ||
| 518 | CONFIG_PREVENT_FIRMWARE_BUILD=y | ||
| 519 | CONFIG_FW_LOADER=y | ||
| 520 | # CONFIG_DEBUG_DRIVER is not set | ||
| 521 | # CONFIG_DEBUG_DEVRES is not set | ||
| 522 | # CONFIG_SYS_HYPERVISOR is not set | ||
| 523 | # CONFIG_CONNECTOR is not set | ||
| 524 | CONFIG_MTD=y | ||
| 525 | # CONFIG_MTD_DEBUG is not set | ||
| 526 | # CONFIG_MTD_CONCAT is not set | ||
| 527 | CONFIG_MTD_PARTITIONS=y | ||
| 528 | # CONFIG_MTD_REDBOOT_PARTS is not set | ||
| 529 | CONFIG_MTD_CMDLINE_PARTS=y | ||
| 530 | CONFIG_MTD_AFS_PARTS=y | ||
| 531 | |||
| 532 | # | ||
| 533 | # User Modules And Translation Layers | ||
| 534 | # | ||
| 535 | CONFIG_MTD_CHAR=y | ||
| 536 | CONFIG_MTD_BLKDEVS=y | ||
| 537 | CONFIG_MTD_BLOCK=y | ||
| 538 | # CONFIG_FTL is not set | ||
| 539 | # CONFIG_NFTL is not set | ||
| 540 | # CONFIG_INFTL is not set | ||
| 541 | # CONFIG_RFD_FTL is not set | ||
| 542 | # CONFIG_SSFDC is not set | ||
| 543 | # CONFIG_MTD_OOPS is not set | ||
| 544 | |||
| 545 | # | ||
| 546 | # RAM/ROM/Flash chip drivers | ||
| 547 | # | ||
| 548 | CONFIG_MTD_CFI=y | ||
| 549 | # CONFIG_MTD_JEDECPROBE is not set | ||
| 550 | CONFIG_MTD_GEN_PROBE=y | ||
| 551 | CONFIG_MTD_CFI_ADV_OPTIONS=y | ||
| 552 | CONFIG_MTD_CFI_NOSWAP=y | ||
| 553 | # CONFIG_MTD_CFI_BE_BYTE_SWAP is not set | ||
| 554 | # CONFIG_MTD_CFI_LE_BYTE_SWAP is not set | ||
| 555 | # CONFIG_MTD_CFI_GEOMETRY is not set | ||
| 556 | CONFIG_MTD_MAP_BANK_WIDTH_1=y | ||
| 557 | CONFIG_MTD_MAP_BANK_WIDTH_2=y | ||
| 558 | CONFIG_MTD_MAP_BANK_WIDTH_4=y | ||
| 559 | # CONFIG_MTD_MAP_BANK_WIDTH_8 is not set | ||
| 560 | # CONFIG_MTD_MAP_BANK_WIDTH_16 is not set | ||
| 561 | # CONFIG_MTD_MAP_BANK_WIDTH_32 is not set | ||
| 562 | CONFIG_MTD_CFI_I1=y | ||
| 563 | CONFIG_MTD_CFI_I2=y | ||
| 564 | # CONFIG_MTD_CFI_I4 is not set | ||
| 565 | # CONFIG_MTD_CFI_I8 is not set | ||
| 566 | # CONFIG_MTD_OTP is not set | ||
| 567 | CONFIG_MTD_CFI_INTELEXT=y | ||
| 568 | # CONFIG_MTD_CFI_AMDSTD is not set | ||
| 569 | # CONFIG_MTD_CFI_STAA is not set | ||
| 570 | CONFIG_MTD_CFI_UTIL=y | ||
| 571 | # CONFIG_MTD_RAM is not set | ||
| 572 | # CONFIG_MTD_ROM is not set | ||
| 573 | # CONFIG_MTD_ABSENT is not set | ||
| 574 | |||
| 575 | # | ||
| 576 | # Mapping drivers for chip access | ||
| 577 | # | ||
| 578 | # CONFIG_MTD_COMPLEX_MAPPINGS is not set | ||
| 579 | # CONFIG_MTD_PHYSMAP is not set | ||
| 580 | # CONFIG_MTD_ARM_INTEGRATOR is not set | ||
| 581 | # CONFIG_MTD_INTEL_VR_NOR is not set | ||
| 582 | # CONFIG_MTD_PLATRAM is not set | ||
| 583 | |||
| 584 | # | ||
| 585 | # Self-contained MTD device drivers | ||
| 586 | # | ||
| 587 | # CONFIG_MTD_PMC551 is not set | ||
| 588 | # CONFIG_MTD_SLRAM is not set | ||
| 589 | # CONFIG_MTD_PHRAM is not set | ||
| 590 | # CONFIG_MTD_MTDRAM is not set | ||
| 591 | # CONFIG_MTD_BLOCK2MTD is not set | ||
| 592 | |||
| 593 | # | ||
| 594 | # Disk-On-Chip Device Drivers | ||
| 595 | # | ||
| 596 | # CONFIG_MTD_DOC2000 is not set | ||
| 597 | # CONFIG_MTD_DOC2001 is not set | ||
| 598 | # CONFIG_MTD_DOC2001PLUS is not set | ||
| 599 | CONFIG_MTD_NAND=m | ||
| 600 | CONFIG_MTD_NAND_VERIFY_WRITE=y | ||
| 601 | # CONFIG_MTD_NAND_ECC_SMC is not set | ||
| 602 | # CONFIG_MTD_NAND_MUSEUM_IDS is not set | ||
| 603 | CONFIG_MTD_NAND_IDS=m | ||
| 604 | # CONFIG_MTD_NAND_DISKONCHIP is not set | ||
| 605 | # CONFIG_MTD_NAND_CAFE is not set | ||
| 606 | # CONFIG_MTD_NAND_NANDSIM is not set | ||
| 607 | # CONFIG_MTD_NAND_PLATFORM is not set | ||
| 608 | # CONFIG_MTD_ALAUDA is not set | ||
| 609 | # CONFIG_MTD_ONENAND is not set | ||
| 610 | |||
| 611 | # | ||
| 612 | # UBI - Unsorted block images | ||
| 613 | # | ||
| 614 | # CONFIG_MTD_UBI is not set | ||
| 615 | # CONFIG_PARPORT is not set | ||
| 616 | CONFIG_BLK_DEV=y | ||
| 617 | # CONFIG_BLK_CPQ_DA is not set | ||
| 618 | # CONFIG_BLK_CPQ_CISS_DA is not set | ||
| 619 | # CONFIG_BLK_DEV_DAC960 is not set | ||
| 620 | # CONFIG_BLK_DEV_UMEM is not set | ||
| 621 | # CONFIG_BLK_DEV_COW_COMMON is not set | ||
| 622 | CONFIG_BLK_DEV_LOOP=y | ||
| 623 | # CONFIG_BLK_DEV_CRYPTOLOOP is not set | ||
| 624 | # CONFIG_BLK_DEV_NBD is not set | ||
| 625 | # CONFIG_BLK_DEV_SX8 is not set | ||
| 626 | # CONFIG_BLK_DEV_UB is not set | ||
| 627 | CONFIG_BLK_DEV_RAM=y | ||
| 628 | CONFIG_BLK_DEV_RAM_COUNT=16 | ||
| 629 | CONFIG_BLK_DEV_RAM_SIZE=51200 | ||
| 630 | CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024 | ||
| 631 | # CONFIG_CDROM_PKTCDVD is not set | ||
| 632 | # CONFIG_ATA_OVER_ETH is not set | ||
| 633 | CONFIG_MISC_DEVICES=y | ||
| 634 | # CONFIG_PHANTOM is not set | ||
| 635 | # CONFIG_EEPROM_93CX6 is not set | ||
| 636 | # CONFIG_SGI_IOC4 is not set | ||
| 637 | # CONFIG_TIFM_CORE is not set | ||
| 638 | |||
| 639 | # | ||
| 640 | # SCSI device support | ||
| 641 | # | ||
| 642 | # CONFIG_RAID_ATTRS is not set | ||
| 643 | CONFIG_SCSI=y | ||
| 644 | CONFIG_SCSI_DMA=y | ||
| 645 | # CONFIG_SCSI_TGT is not set | ||
| 646 | # CONFIG_SCSI_NETLINK is not set | ||
| 647 | CONFIG_SCSI_PROC_FS=y | ||
| 648 | |||
| 649 | # | ||
| 650 | # SCSI support type (disk, tape, CD-ROM) | ||
| 651 | # | ||
| 652 | CONFIG_BLK_DEV_SD=y | ||
| 653 | # CONFIG_CHR_DEV_ST is not set | ||
| 654 | # CONFIG_CHR_DEV_OSST is not set | ||
| 655 | # CONFIG_BLK_DEV_SR is not set | ||
| 656 | # CONFIG_CHR_DEV_SG is not set | ||
| 657 | # CONFIG_CHR_DEV_SCH is not set | ||
| 658 | |||
| 659 | # | ||
| 660 | # Some SCSI devices (e.g. CD jukebox) support multiple LUNs | ||
| 661 | # | ||
| 662 | CONFIG_SCSI_MULTI_LUN=y | ||
| 663 | # CONFIG_SCSI_CONSTANTS is not set | ||
| 664 | # CONFIG_SCSI_LOGGING is not set | ||
| 665 | # CONFIG_SCSI_SCAN_ASYNC is not set | ||
| 666 | CONFIG_SCSI_WAIT_SCAN=m | ||
| 667 | |||
| 668 | # | ||
| 669 | # SCSI Transports | ||
| 670 | # | ||
| 671 | CONFIG_SCSI_SPI_ATTRS=y | ||
| 672 | # CONFIG_SCSI_FC_ATTRS is not set | ||
| 673 | # CONFIG_SCSI_ISCSI_ATTRS is not set | ||
| 674 | # CONFIG_SCSI_SAS_LIBSAS is not set | ||
| 675 | # CONFIG_SCSI_SRP_ATTRS is not set | ||
| 676 | CONFIG_SCSI_LOWLEVEL=y | ||
| 677 | # CONFIG_ISCSI_TCP is not set | ||
| 678 | # CONFIG_BLK_DEV_3W_XXXX_RAID is not set | ||
| 679 | # CONFIG_SCSI_3W_9XXX is not set | ||
| 680 | # CONFIG_SCSI_ACARD is not set | ||
| 681 | # CONFIG_SCSI_AACRAID is not set | ||
| 682 | # CONFIG_SCSI_AIC7XXX is not set | ||
| 683 | # CONFIG_SCSI_AIC7XXX_OLD is not set | ||
| 684 | # CONFIG_SCSI_AIC79XX is not set | ||
| 685 | # CONFIG_SCSI_AIC94XX is not set | ||
| 686 | # CONFIG_SCSI_DPT_I2O is not set | ||
| 687 | # CONFIG_SCSI_ADVANSYS is not set | ||
| 688 | # CONFIG_SCSI_ARCMSR is not set | ||
| 689 | # CONFIG_MEGARAID_NEWGEN is not set | ||
| 690 | # CONFIG_MEGARAID_LEGACY is not set | ||
| 691 | # CONFIG_MEGARAID_SAS is not set | ||
| 692 | # CONFIG_SCSI_HPTIOP is not set | ||
| 693 | # CONFIG_SCSI_DMX3191D is not set | ||
| 694 | # CONFIG_SCSI_FUTURE_DOMAIN is not set | ||
| 695 | # CONFIG_SCSI_IPS is not set | ||
| 696 | # CONFIG_SCSI_INITIO is not set | ||
| 697 | # CONFIG_SCSI_INIA100 is not set | ||
| 698 | # CONFIG_SCSI_STEX is not set | ||
| 699 | CONFIG_SCSI_SYM53C8XX_2=y | ||
| 700 | CONFIG_SCSI_SYM53C8XX_DMA_ADDRESSING_MODE=1 | ||
| 701 | CONFIG_SCSI_SYM53C8XX_DEFAULT_TAGS=16 | ||
| 702 | CONFIG_SCSI_SYM53C8XX_MAX_TAGS=64 | ||
| 703 | CONFIG_SCSI_SYM53C8XX_MMIO=y | ||
| 704 | # CONFIG_SCSI_QLOGIC_1280 is not set | ||
| 705 | # CONFIG_SCSI_QLA_FC is not set | ||
| 706 | # CONFIG_SCSI_QLA_ISCSI is not set | ||
| 707 | # CONFIG_SCSI_LPFC is not set | ||
| 708 | # CONFIG_SCSI_DC395x is not set | ||
| 709 | # CONFIG_SCSI_DC390T is not set | ||
| 710 | # CONFIG_SCSI_NSP32 is not set | ||
| 711 | # CONFIG_SCSI_DEBUG is not set | ||
| 712 | # CONFIG_SCSI_SRP is not set | ||
| 713 | # CONFIG_ATA is not set | ||
| 714 | CONFIG_MD=y | ||
| 715 | # CONFIG_BLK_DEV_MD is not set | ||
| 716 | CONFIG_BLK_DEV_DM=m | ||
| 717 | # CONFIG_DM_DEBUG is not set | ||
| 718 | CONFIG_DM_CRYPT=m | ||
| 719 | CONFIG_DM_SNAPSHOT=m | ||
| 720 | CONFIG_DM_MIRROR=m | ||
| 721 | CONFIG_DM_ZERO=m | ||
| 722 | CONFIG_DM_MULTIPATH=m | ||
| 723 | CONFIG_DM_MULTIPATH_EMC=m | ||
| 724 | # CONFIG_DM_MULTIPATH_RDAC is not set | ||
| 725 | # CONFIG_DM_MULTIPATH_HP is not set | ||
| 726 | # CONFIG_DM_DELAY is not set | ||
| 727 | # CONFIG_DM_UEVENT is not set | ||
| 728 | # CONFIG_FUSION is not set | ||
| 729 | |||
| 730 | # | ||
| 731 | # IEEE 1394 (FireWire) support | ||
| 732 | # | ||
| 733 | # CONFIG_FIREWIRE is not set | ||
| 734 | # CONFIG_IEEE1394 is not set | ||
| 735 | # CONFIG_I2O is not set | ||
| 736 | CONFIG_NETDEVICES=y | ||
| 737 | # CONFIG_NETDEVICES_MULTIQUEUE is not set | ||
| 738 | # CONFIG_DUMMY is not set | ||
| 739 | # CONFIG_BONDING is not set | ||
| 740 | # CONFIG_MACVLAN is not set | ||
| 741 | # CONFIG_EQUALIZER is not set | ||
| 742 | CONFIG_TUN=m | ||
| 743 | # CONFIG_VETH is not set | ||
| 744 | # CONFIG_ARCNET is not set | ||
| 745 | # CONFIG_PHYLIB is not set | ||
| 746 | CONFIG_NET_ETHERNET=y | ||
| 747 | CONFIG_MII=y | ||
| 748 | # CONFIG_AX88796 is not set | ||
| 749 | # CONFIG_HAPPYMEAL is not set | ||
| 750 | # CONFIG_SUNGEM is not set | ||
| 751 | # CONFIG_CASSINI is not set | ||
| 752 | # CONFIG_NET_VENDOR_3COM is not set | ||
| 753 | CONFIG_SMC91X=y | ||
| 754 | # CONFIG_DM9000 is not set | ||
| 755 | # CONFIG_NET_TULIP is not set | ||
| 756 | # CONFIG_HP100 is not set | ||
| 757 | # CONFIG_IBM_NEW_EMAC_ZMII is not set | ||
| 758 | # CONFIG_IBM_NEW_EMAC_RGMII is not set | ||
| 759 | # CONFIG_IBM_NEW_EMAC_TAH is not set | ||
| 760 | # CONFIG_IBM_NEW_EMAC_EMAC4 is not set | ||
| 761 | # CONFIG_NET_PCI is not set | ||
| 762 | # CONFIG_B44 is not set | ||
| 763 | # CONFIG_NETDEV_1000 is not set | ||
| 764 | # CONFIG_NETDEV_10000 is not set | ||
| 765 | # CONFIG_TR is not set | ||
| 766 | |||
| 767 | # | ||
| 768 | # Wireless LAN | ||
| 769 | # | ||
| 770 | # CONFIG_WLAN_PRE80211 is not set | ||
| 771 | CONFIG_WLAN_80211=y | ||
| 772 | # CONFIG_IPW2100 is not set | ||
| 773 | # CONFIG_IPW2200 is not set | ||
| 774 | # CONFIG_LIBERTAS is not set | ||
| 775 | CONFIG_HERMES=m | ||
| 776 | # CONFIG_PLX_HERMES is not set | ||
| 777 | # CONFIG_TMD_HERMES is not set | ||
| 778 | # CONFIG_NORTEL_HERMES is not set | ||
| 779 | # CONFIG_PCI_HERMES is not set | ||
| 780 | # CONFIG_ATMEL is not set | ||
| 781 | # CONFIG_PRISM54 is not set | ||
| 782 | # CONFIG_USB_ZD1201 is not set | ||
| 783 | CONFIG_HOSTAP=m | ||
| 784 | CONFIG_HOSTAP_FIRMWARE=y | ||
| 785 | # CONFIG_HOSTAP_FIRMWARE_NVRAM is not set | ||
| 786 | # CONFIG_HOSTAP_PLX is not set | ||
| 787 | # CONFIG_HOSTAP_PCI is not set | ||
| 788 | # CONFIG_BCM43XX is not set | ||
| 789 | # CONFIG_ZD1211RW is not set | ||
| 790 | |||
| 791 | # | ||
| 792 | # USB Network Adapters | ||
| 793 | # | ||
| 794 | # CONFIG_USB_CATC is not set | ||
| 795 | # CONFIG_USB_KAWETH is not set | ||
| 796 | # CONFIG_USB_PEGASUS is not set | ||
| 797 | # CONFIG_USB_RTL8150 is not set | ||
| 798 | # CONFIG_USB_USBNET is not set | ||
| 799 | # CONFIG_WAN is not set | ||
| 800 | # CONFIG_FDDI is not set | ||
| 801 | # CONFIG_HIPPI is not set | ||
| 802 | CONFIG_PPP=m | ||
| 803 | # CONFIG_PPP_MULTILINK is not set | ||
| 804 | # CONFIG_PPP_FILTER is not set | ||
| 805 | CONFIG_PPP_ASYNC=m | ||
| 806 | # CONFIG_PPP_SYNC_TTY is not set | ||
| 807 | CONFIG_PPP_DEFLATE=m | ||
| 808 | CONFIG_PPP_BSDCOMP=m | ||
| 809 | # CONFIG_PPP_MPPE is not set | ||
| 810 | # CONFIG_PPPOE is not set | ||
| 811 | # CONFIG_PPPOL2TP is not set | ||
| 812 | # CONFIG_SLIP is not set | ||
| 813 | CONFIG_SLHC=m | ||
| 814 | # CONFIG_NET_FC is not set | ||
| 815 | # CONFIG_SHAPER is not set | ||
| 816 | # CONFIG_NETCONSOLE is not set | ||
| 817 | # CONFIG_NETPOLL is not set | ||
| 818 | # CONFIG_NET_POLL_CONTROLLER is not set | ||
| 819 | # CONFIG_ISDN is not set | ||
| 820 | |||
| 821 | # | ||
| 822 | # Input device support | ||
| 823 | # | ||
| 824 | CONFIG_INPUT=y | ||
| 825 | # CONFIG_INPUT_FF_MEMLESS is not set | ||
| 826 | # CONFIG_INPUT_POLLDEV is not set | ||
| 827 | |||
| 828 | # | ||
| 829 | # Userland interfaces | ||
| 830 | # | ||
| 831 | CONFIG_INPUT_MOUSEDEV=m | ||
| 832 | # CONFIG_INPUT_MOUSEDEV_PSAUX is not set | ||
| 833 | CONFIG_INPUT_MOUSEDEV_SCREEN_X=640 | ||
| 834 | CONFIG_INPUT_MOUSEDEV_SCREEN_Y=480 | ||
| 835 | # CONFIG_INPUT_JOYDEV is not set | ||
| 836 | CONFIG_INPUT_EVDEV=y | ||
| 837 | # CONFIG_INPUT_EVBUG is not set | ||
| 838 | |||
| 839 | # | ||
| 840 | # Input Device Drivers | ||
| 841 | # | ||
| 842 | CONFIG_INPUT_KEYBOARD=y | ||
| 843 | CONFIG_KEYBOARD_ATKBD=y | ||
| 844 | # CONFIG_KEYBOARD_SUNKBD is not set | ||
| 845 | # CONFIG_KEYBOARD_LKKBD is not set | ||
| 846 | # CONFIG_KEYBOARD_XTKBD is not set | ||
| 847 | # CONFIG_KEYBOARD_NEWTON is not set | ||
| 848 | # CONFIG_KEYBOARD_STOWAWAY is not set | ||
| 849 | # CONFIG_INPUT_MOUSE is not set | ||
| 850 | # CONFIG_INPUT_JOYSTICK is not set | ||
| 851 | CONFIG_INPUT_TABLET=y | ||
| 852 | # CONFIG_TABLET_USB_ACECAD is not set | ||
| 853 | # CONFIG_TABLET_USB_AIPTEK is not set | ||
| 854 | # CONFIG_TABLET_USB_GTCO is not set | ||
| 855 | # CONFIG_TABLET_USB_KBTAB is not set | ||
| 856 | CONFIG_TABLET_USB_WACOM=y | ||
| 857 | # CONFIG_INPUT_TOUCHSCREEN is not set | ||
| 858 | CONFIG_INPUT_MISC=y | ||
| 859 | # CONFIG_INPUT_ATI_REMOTE is not set | ||
| 860 | # CONFIG_INPUT_ATI_REMOTE2 is not set | ||
| 861 | # CONFIG_INPUT_KEYSPAN_REMOTE is not set | ||
| 862 | # CONFIG_INPUT_POWERMATE is not set | ||
| 863 | # CONFIG_INPUT_YEALINK is not set | ||
| 864 | CONFIG_INPUT_UINPUT=m | ||
| 865 | |||
| 866 | # | ||
| 867 | # Hardware I/O ports | ||
| 868 | # | ||
| 869 | CONFIG_SERIO=y | ||
| 870 | # CONFIG_SERIO_SERPORT is not set | ||
| 871 | CONFIG_SERIO_AMBAKMI=y | ||
| 872 | # CONFIG_SERIO_PCIPS2 is not set | ||
| 873 | CONFIG_SERIO_LIBPS2=y | ||
| 874 | # CONFIG_SERIO_RAW is not set | ||
| 875 | # CONFIG_GAMEPORT is not set | ||
| 876 | |||
| 877 | # | ||
| 878 | # Character devices | ||
| 879 | # | ||
| 880 | CONFIG_VT=y | ||
| 881 | CONFIG_VT_CONSOLE=y | ||
| 882 | CONFIG_HW_CONSOLE=y | ||
| 883 | # CONFIG_VT_HW_CONSOLE_BINDING is not set | ||
| 884 | # CONFIG_SERIAL_NONSTANDARD is not set | ||
| 885 | |||
| 886 | # | ||
| 887 | # Serial drivers | ||
| 888 | # | ||
| 889 | # CONFIG_SERIAL_8250 is not set | ||
| 890 | |||
| 891 | # | ||
| 892 | # Non-8250 serial port support | ||
| 893 | # | ||
| 894 | CONFIG_SERIAL_AMBA_PL011=y | ||
| 895 | CONFIG_SERIAL_AMBA_PL011_CONSOLE=y | ||
| 896 | CONFIG_SERIAL_CORE=y | ||
| 897 | CONFIG_SERIAL_CORE_CONSOLE=y | ||
| 898 | # CONFIG_SERIAL_JSM is not set | ||
| 899 | CONFIG_UNIX98_PTYS=y | ||
| 900 | # CONFIG_LEGACY_PTYS is not set | ||
| 901 | # CONFIG_IPMI_HANDLER is not set | ||
| 902 | CONFIG_HW_RANDOM=m | ||
| 903 | # CONFIG_NVRAM is not set | ||
| 904 | # CONFIG_R3964 is not set | ||
| 905 | # CONFIG_APPLICOM is not set | ||
| 906 | # CONFIG_RAW_DRIVER is not set | ||
| 907 | # CONFIG_TCG_TPM is not set | ||
| 908 | CONFIG_DEVPORT=y | ||
| 909 | # CONFIG_I2C is not set | ||
| 910 | |||
| 911 | # | ||
| 912 | # SPI support | ||
| 913 | # | ||
| 914 | # CONFIG_SPI is not set | ||
| 915 | # CONFIG_SPI_MASTER is not set | ||
| 916 | # CONFIG_W1 is not set | ||
| 917 | # CONFIG_POWER_SUPPLY is not set | ||
| 918 | # CONFIG_HWMON is not set | ||
| 919 | # CONFIG_WATCHDOG is not set | ||
| 920 | |||
| 921 | # | ||
| 922 | # Sonics Silicon Backplane | ||
| 923 | # | ||
| 924 | CONFIG_SSB_POSSIBLE=y | ||
| 925 | # CONFIG_SSB is not set | ||
| 926 | |||
| 927 | # | ||
| 928 | # Multifunction device drivers | ||
| 929 | # | ||
| 930 | # CONFIG_MFD_SM501 is not set | ||
| 931 | # CONFIG_HTC_ASIC3 is not set | ||
| 932 | # CONFIG_HTC_ASIC3_DS1WM is not set | ||
| 933 | |||
| 934 | # | ||
| 935 | # Multimedia devices | ||
| 936 | # | ||
| 937 | CONFIG_VIDEO_DEV=m | ||
| 938 | CONFIG_VIDEO_V4L1=y | ||
| 939 | CONFIG_VIDEO_V4L1_COMPAT=y | ||
| 940 | CONFIG_VIDEO_V4L2=y | ||
| 941 | CONFIG_VIDEO_CAPTURE_DRIVERS=y | ||
| 942 | # CONFIG_VIDEO_ADV_DEBUG is not set | ||
| 943 | CONFIG_VIDEO_HELPER_CHIPS_AUTO=y | ||
| 944 | # CONFIG_VIDEO_VIVI is not set | ||
| 945 | # CONFIG_VIDEO_CPIA is not set | ||
| 946 | # CONFIG_VIDEO_CPIA2 is not set | ||
| 947 | # CONFIG_VIDEO_STRADIS is not set | ||
| 948 | CONFIG_V4L_USB_DRIVERS=y | ||
| 949 | # CONFIG_USB_VICAM is not set | ||
| 950 | # CONFIG_USB_IBMCAM is not set | ||
| 951 | # CONFIG_USB_KONICAWC is not set | ||
| 952 | # CONFIG_USB_QUICKCAM_MESSENGER is not set | ||
| 953 | # CONFIG_USB_ET61X251 is not set | ||
| 954 | CONFIG_USB_OV511=m | ||
| 955 | CONFIG_USB_SE401=m | ||
| 956 | CONFIG_USB_SN9C102=m | ||
| 957 | CONFIG_USB_STV680=m | ||
| 958 | # CONFIG_USB_ZC0301 is not set | ||
| 959 | # CONFIG_USB_PWC is not set | ||
| 960 | # CONFIG_USB_ZR364XX is not set | ||
| 961 | CONFIG_RADIO_ADAPTERS=y | ||
| 962 | # CONFIG_RADIO_GEMTEK_PCI is not set | ||
| 963 | # CONFIG_RADIO_MAXIRADIO is not set | ||
| 964 | # CONFIG_RADIO_MAESTRO is not set | ||
| 965 | CONFIG_USB_DSBR=m | ||
| 966 | # CONFIG_DVB_CORE is not set | ||
| 967 | CONFIG_DAB=y | ||
| 968 | CONFIG_USB_DABUSB=m | ||
| 969 | |||
| 970 | # | ||
| 971 | # Graphics support | ||
| 972 | # | ||
| 973 | # CONFIG_DRM is not set | ||
| 974 | # CONFIG_VGASTATE is not set | ||
| 975 | CONFIG_VIDEO_OUTPUT_CONTROL=m | ||
| 976 | CONFIG_FB=y | ||
| 977 | # CONFIG_FIRMWARE_EDID is not set | ||
| 978 | # CONFIG_FB_DDC is not set | ||
| 979 | CONFIG_FB_CFB_FILLRECT=y | ||
| 980 | CONFIG_FB_CFB_COPYAREA=y | ||
| 981 | CONFIG_FB_CFB_IMAGEBLIT=y | ||
| 982 | # CONFIG_FB_CFB_REV_PIXELS_IN_BYTE is not set | ||
| 983 | # CONFIG_FB_SYS_FILLRECT is not set | ||
| 984 | # CONFIG_FB_SYS_COPYAREA is not set | ||
| 985 | # CONFIG_FB_SYS_IMAGEBLIT is not set | ||
| 986 | # CONFIG_FB_SYS_FOPS is not set | ||
| 987 | # CONFIG_FB_DEFERRED_IO is not set | ||
| 988 | # CONFIG_FB_SVGALIB is not set | ||
| 989 | # CONFIG_FB_MACMODES is not set | ||
| 990 | # CONFIG_FB_BACKLIGHT is not set | ||
| 991 | # CONFIG_FB_MODE_HELPERS is not set | ||
| 992 | # CONFIG_FB_TILEBLITTING is not set | ||
| 993 | |||
| 994 | # | ||
| 995 | # Frame buffer hardware drivers | ||
| 996 | # | ||
| 997 | # CONFIG_FB_CIRRUS is not set | ||
| 998 | # CONFIG_FB_PM2 is not set | ||
| 999 | CONFIG_FB_ARMCLCD=y | ||
| 1000 | # CONFIG_FB_CYBER2000 is not set | ||
| 1001 | # CONFIG_FB_ASILIANT is not set | ||
| 1002 | # CONFIG_FB_IMSTT is not set | ||
| 1003 | # CONFIG_FB_S1D13XXX is not set | ||
| 1004 | # CONFIG_FB_NVIDIA is not set | ||
| 1005 | # CONFIG_FB_RIVA is not set | ||
| 1006 | # CONFIG_FB_MATROX is not set | ||
| 1007 | # CONFIG_FB_RADEON is not set | ||
| 1008 | # CONFIG_FB_ATY128 is not set | ||
| 1009 | # CONFIG_FB_ATY is not set | ||
| 1010 | # CONFIG_FB_S3 is not set | ||
| 1011 | # CONFIG_FB_SAVAGE is not set | ||
| 1012 | # CONFIG_FB_SIS is not set | ||
| 1013 | # CONFIG_FB_NEOMAGIC is not set | ||
| 1014 | # CONFIG_FB_KYRO is not set | ||
| 1015 | # CONFIG_FB_3DFX is not set | ||
| 1016 | # CONFIG_FB_VOODOO1 is not set | ||
| 1017 | # CONFIG_FB_VT8623 is not set | ||
| 1018 | # CONFIG_FB_TRIDENT is not set | ||
| 1019 | # CONFIG_FB_ARK is not set | ||
| 1020 | # CONFIG_FB_PM3 is not set | ||
| 1021 | # CONFIG_FB_VIRTUAL is not set | ||
| 1022 | CONFIG_BACKLIGHT_LCD_SUPPORT=y | ||
| 1023 | CONFIG_LCD_CLASS_DEVICE=m | ||
| 1024 | CONFIG_BACKLIGHT_CLASS_DEVICE=m | ||
| 1025 | CONFIG_BACKLIGHT_CORGI=m | ||
| 1026 | |||
| 1027 | # | ||
| 1028 | # Display device support | ||
| 1029 | # | ||
| 1030 | # CONFIG_DISPLAY_SUPPORT is not set | ||
| 1031 | |||
| 1032 | # | ||
| 1033 | # Console display driver support | ||
| 1034 | # | ||
| 1035 | CONFIG_DUMMY_CONSOLE=y | ||
| 1036 | CONFIG_FRAMEBUFFER_CONSOLE=y | ||
| 1037 | # CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY is not set | ||
| 1038 | CONFIG_FRAMEBUFFER_CONSOLE_ROTATION=y | ||
| 1039 | CONFIG_FONTS=y | ||
| 1040 | CONFIG_FONT_8x8=y | ||
| 1041 | CONFIG_FONT_8x16=y | ||
| 1042 | # CONFIG_FONT_6x11 is not set | ||
| 1043 | # CONFIG_FONT_7x14 is not set | ||
| 1044 | # CONFIG_FONT_PEARL_8x8 is not set | ||
| 1045 | # CONFIG_FONT_ACORN_8x8 is not set | ||
| 1046 | # CONFIG_FONT_MINI_4x6 is not set | ||
| 1047 | # CONFIG_FONT_SUN8x16 is not set | ||
| 1048 | # CONFIG_FONT_SUN12x22 is not set | ||
| 1049 | # CONFIG_FONT_10x18 is not set | ||
| 1050 | CONFIG_LOGO=y | ||
| 1051 | CONFIG_LOGO_LINUX_MONO=y | ||
| 1052 | CONFIG_LOGO_LINUX_VGA16=y | ||
| 1053 | # CONFIG_LOGO_LINUX_CLUT224 is not set | ||
| 1054 | CONFIG_LOGO_OHAND_CLUT224=y | ||
| 1055 | |||
| 1056 | # | ||
| 1057 | # Sound | ||
| 1058 | # | ||
| 1059 | # CONFIG_SOUND is not set | ||
| 1060 | CONFIG_HID_SUPPORT=y | ||
| 1061 | CONFIG_HID=m | ||
| 1062 | # CONFIG_HID_DEBUG is not set | ||
| 1063 | # CONFIG_HIDRAW is not set | ||
| 1064 | |||
| 1065 | # | ||
| 1066 | # USB Input Devices | ||
| 1067 | # | ||
| 1068 | CONFIG_USB_HID=m | ||
| 1069 | # CONFIG_USB_HIDINPUT_POWERBOOK is not set | ||
| 1070 | # CONFIG_HID_FF is not set | ||
| 1071 | # CONFIG_USB_HIDDEV is not set | ||
| 1072 | |||
| 1073 | # | ||
| 1074 | # USB HID Boot Protocol drivers | ||
| 1075 | # | ||
| 1076 | CONFIG_USB_KBD=m | ||
| 1077 | CONFIG_USB_MOUSE=m | ||
| 1078 | CONFIG_USB_SUPPORT=y | ||
| 1079 | CONFIG_USB_ARCH_HAS_HCD=y | ||
| 1080 | CONFIG_USB_ARCH_HAS_OHCI=y | ||
| 1081 | CONFIG_USB_ARCH_HAS_EHCI=y | ||
| 1082 | CONFIG_USB=y | ||
| 1083 | # CONFIG_USB_DEBUG is not set | ||
| 1084 | |||
| 1085 | # | ||
| 1086 | # Miscellaneous USB options | ||
| 1087 | # | ||
| 1088 | CONFIG_USB_DEVICEFS=y | ||
| 1089 | CONFIG_USB_DEVICE_CLASS=y | ||
| 1090 | # CONFIG_USB_DYNAMIC_MINORS is not set | ||
| 1091 | # CONFIG_USB_SUSPEND is not set | ||
| 1092 | # CONFIG_USB_PERSIST is not set | ||
| 1093 | # CONFIG_USB_OTG is not set | ||
| 1094 | |||
| 1095 | # | ||
| 1096 | # USB Host Controller Drivers | ||
| 1097 | # | ||
| 1098 | # CONFIG_USB_EHCI_HCD is not set | ||
| 1099 | # CONFIG_USB_ISP116X_HCD is not set | ||
| 1100 | CONFIG_USB_OHCI_HCD=y | ||
| 1101 | # CONFIG_USB_OHCI_BIG_ENDIAN_DESC is not set | ||
| 1102 | # CONFIG_USB_OHCI_BIG_ENDIAN_MMIO is not set | ||
| 1103 | CONFIG_USB_OHCI_LITTLE_ENDIAN=y | ||
| 1104 | # CONFIG_USB_UHCI_HCD is not set | ||
| 1105 | CONFIG_USB_SL811_HCD=m | ||
| 1106 | # CONFIG_USB_R8A66597_HCD is not set | ||
| 1107 | |||
| 1108 | # | ||
| 1109 | # USB Device Class drivers | ||
| 1110 | # | ||
| 1111 | CONFIG_USB_ACM=m | ||
| 1112 | CONFIG_USB_PRINTER=m | ||
| 1113 | |||
| 1114 | # | ||
| 1115 | # NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' | ||
| 1116 | # | ||
| 1117 | |||
| 1118 | # | ||
| 1119 | # may also be needed; see USB_STORAGE Help for more information | ||
| 1120 | # | ||
| 1121 | CONFIG_USB_STORAGE=m | ||
| 1122 | # CONFIG_USB_STORAGE_DEBUG is not set | ||
| 1123 | # CONFIG_USB_STORAGE_DATAFAB is not set | ||
| 1124 | # CONFIG_USB_STORAGE_FREECOM is not set | ||
| 1125 | # CONFIG_USB_STORAGE_ISD200 is not set | ||
| 1126 | # CONFIG_USB_STORAGE_DPCM is not set | ||
| 1127 | # CONFIG_USB_STORAGE_USBAT is not set | ||
| 1128 | # CONFIG_USB_STORAGE_SDDR09 is not set | ||
| 1129 | # CONFIG_USB_STORAGE_SDDR55 is not set | ||
| 1130 | # CONFIG_USB_STORAGE_JUMPSHOT is not set | ||
| 1131 | # CONFIG_USB_STORAGE_ALAUDA is not set | ||
| 1132 | # CONFIG_USB_STORAGE_KARMA is not set | ||
| 1133 | # CONFIG_USB_LIBUSUAL is not set | ||
| 1134 | |||
| 1135 | # | ||
| 1136 | # USB Imaging devices | ||
| 1137 | # | ||
| 1138 | CONFIG_USB_MDC800=m | ||
| 1139 | CONFIG_USB_MICROTEK=m | ||
| 1140 | CONFIG_USB_MON=y | ||
| 1141 | |||
| 1142 | # | ||
| 1143 | # USB port drivers | ||
| 1144 | # | ||
| 1145 | |||
| 1146 | # | ||
| 1147 | # USB Serial Converter support | ||
| 1148 | # | ||
| 1149 | CONFIG_USB_SERIAL=m | ||
| 1150 | CONFIG_USB_SERIAL_GENERIC=y | ||
| 1151 | # CONFIG_USB_SERIAL_AIRCABLE is not set | ||
| 1152 | # CONFIG_USB_SERIAL_AIRPRIME is not set | ||
| 1153 | # CONFIG_USB_SERIAL_ARK3116 is not set | ||
| 1154 | CONFIG_USB_SERIAL_BELKIN=m | ||
| 1155 | # CONFIG_USB_SERIAL_CH341 is not set | ||
| 1156 | # CONFIG_USB_SERIAL_WHITEHEAT is not set | ||
| 1157 | CONFIG_USB_SERIAL_DIGI_ACCELEPORT=m | ||
| 1158 | # CONFIG_USB_SERIAL_CP2101 is not set | ||
| 1159 | CONFIG_USB_SERIAL_CYPRESS_M8=m | ||
| 1160 | CONFIG_USB_SERIAL_EMPEG=m | ||
| 1161 | CONFIG_USB_SERIAL_FTDI_SIO=m | ||
| 1162 | # CONFIG_USB_SERIAL_FUNSOFT is not set | ||
| 1163 | CONFIG_USB_SERIAL_VISOR=m | ||
| 1164 | CONFIG_USB_SERIAL_IPAQ=m | ||
| 1165 | CONFIG_USB_SERIAL_IR=m | ||
| 1166 | CONFIG_USB_SERIAL_EDGEPORT=m | ||
| 1167 | CONFIG_USB_SERIAL_EDGEPORT_TI=m | ||
| 1168 | CONFIG_USB_SERIAL_GARMIN=m | ||
| 1169 | CONFIG_USB_SERIAL_IPW=m | ||
| 1170 | CONFIG_USB_SERIAL_KEYSPAN_PDA=m | ||
| 1171 | CONFIG_USB_SERIAL_KEYSPAN=m | ||
| 1172 | # CONFIG_USB_SERIAL_KEYSPAN_MPR is not set | ||
| 1173 | # CONFIG_USB_SERIAL_KEYSPAN_USA28 is not set | ||
| 1174 | # CONFIG_USB_SERIAL_KEYSPAN_USA28X is not set | ||
| 1175 | # CONFIG_USB_SERIAL_KEYSPAN_USA28XA is not set | ||
| 1176 | # CONFIG_USB_SERIAL_KEYSPAN_USA28XB is not set | ||
| 1177 | # CONFIG_USB_SERIAL_KEYSPAN_USA19 is not set | ||
| 1178 | # CONFIG_USB_SERIAL_KEYSPAN_USA18X is not set | ||
| 1179 | # CONFIG_USB_SERIAL_KEYSPAN_USA19W is not set | ||
| 1180 | # CONFIG_USB_SERIAL_KEYSPAN_USA19QW is not set | ||
| 1181 | # CONFIG_USB_SERIAL_KEYSPAN_USA19QI is not set | ||
| 1182 | # CONFIG_USB_SERIAL_KEYSPAN_USA49W is not set | ||
| 1183 | # CONFIG_USB_SERIAL_KEYSPAN_USA49WLC is not set | ||
| 1184 | CONFIG_USB_SERIAL_KLSI=m | ||
| 1185 | CONFIG_USB_SERIAL_KOBIL_SCT=m | ||
| 1186 | CONFIG_USB_SERIAL_MCT_U232=m | ||
| 1187 | # CONFIG_USB_SERIAL_MOS7720 is not set | ||
| 1188 | # CONFIG_USB_SERIAL_MOS7840 is not set | ||
| 1189 | # CONFIG_USB_SERIAL_NAVMAN is not set | ||
| 1190 | CONFIG_USB_SERIAL_PL2303=m | ||
| 1191 | # CONFIG_USB_SERIAL_OTI6858 is not set | ||
| 1192 | # CONFIG_USB_SERIAL_HP4X is not set | ||
| 1193 | CONFIG_USB_SERIAL_SAFE=m | ||
| 1194 | # CONFIG_USB_SERIAL_SAFE_PADDED is not set | ||
| 1195 | # CONFIG_USB_SERIAL_SIERRAWIRELESS is not set | ||
| 1196 | CONFIG_USB_SERIAL_TI=m | ||
| 1197 | CONFIG_USB_SERIAL_CYBERJACK=m | ||
| 1198 | CONFIG_USB_SERIAL_XIRCOM=m | ||
| 1199 | # CONFIG_USB_SERIAL_OPTION is not set | ||
| 1200 | CONFIG_USB_SERIAL_OMNINET=m | ||
| 1201 | # CONFIG_USB_SERIAL_DEBUG is not set | ||
| 1202 | CONFIG_USB_EZUSB=y | ||
| 1203 | |||
| 1204 | # | ||
| 1205 | # USB Miscellaneous drivers | ||
| 1206 | # | ||
| 1207 | CONFIG_USB_EMI62=m | ||
| 1208 | CONFIG_USB_EMI26=m | ||
| 1209 | # CONFIG_USB_ADUTUX is not set | ||
| 1210 | CONFIG_USB_AUERSWALD=m | ||
| 1211 | CONFIG_USB_RIO500=m | ||
| 1212 | CONFIG_USB_LEGOTOWER=m | ||
| 1213 | CONFIG_USB_LCD=m | ||
| 1214 | # CONFIG_USB_BERRY_CHARGE is not set | ||
| 1215 | CONFIG_USB_LED=m | ||
| 1216 | # CONFIG_USB_CYPRESS_CY7C63 is not set | ||
| 1217 | CONFIG_USB_CYTHERM=m | ||
| 1218 | # CONFIG_USB_PHIDGET is not set | ||
| 1219 | CONFIG_USB_IDMOUSE=m | ||
| 1220 | # CONFIG_USB_FTDI_ELAN is not set | ||
| 1221 | # CONFIG_USB_APPLEDISPLAY is not set | ||
| 1222 | # CONFIG_USB_LD is not set | ||
| 1223 | # CONFIG_USB_TRANCEVIBRATOR is not set | ||
| 1224 | # CONFIG_USB_IOWARRIOR is not set | ||
| 1225 | # CONFIG_USB_TEST is not set | ||
| 1226 | |||
| 1227 | # | ||
| 1228 | # USB DSL modem support | ||
| 1229 | # | ||
| 1230 | |||
| 1231 | # | ||
| 1232 | # USB Gadget Support | ||
| 1233 | # | ||
| 1234 | # CONFIG_USB_GADGET is not set | ||
| 1235 | # CONFIG_MMC is not set | ||
| 1236 | CONFIG_NEW_LEDS=y | ||
| 1237 | CONFIG_LEDS_CLASS=y | ||
| 1238 | |||
| 1239 | # | ||
| 1240 | # LED drivers | ||
| 1241 | # | ||
| 1242 | |||
| 1243 | # | ||
| 1244 | # LED Triggers | ||
| 1245 | # | ||
| 1246 | CONFIG_LEDS_TRIGGERS=y | ||
| 1247 | CONFIG_LEDS_TRIGGER_TIMER=y | ||
| 1248 | # CONFIG_LEDS_TRIGGER_HEARTBEAT is not set | ||
| 1249 | CONFIG_RTC_LIB=y | ||
| 1250 | CONFIG_RTC_CLASS=y | ||
| 1251 | CONFIG_RTC_HCTOSYS=y | ||
| 1252 | CONFIG_RTC_HCTOSYS_DEVICE="rtc0" | ||
| 1253 | # CONFIG_RTC_DEBUG is not set | ||
| 1254 | |||
| 1255 | # | ||
| 1256 | # RTC interfaces | ||
| 1257 | # | ||
| 1258 | CONFIG_RTC_INTF_SYSFS=y | ||
| 1259 | CONFIG_RTC_INTF_PROC=y | ||
| 1260 | CONFIG_RTC_INTF_DEV=y | ||
| 1261 | # CONFIG_RTC_INTF_DEV_UIE_EMUL is not set | ||
| 1262 | # CONFIG_RTC_DRV_TEST is not set | ||
| 1263 | |||
| 1264 | # | ||
| 1265 | # SPI RTC drivers | ||
| 1266 | # | ||
| 1267 | |||
| 1268 | # | ||
| 1269 | # Platform RTC drivers | ||
| 1270 | # | ||
| 1271 | # CONFIG_RTC_DRV_CMOS is not set | ||
| 1272 | # CONFIG_RTC_DRV_DS1553 is not set | ||
| 1273 | # CONFIG_RTC_DRV_STK17TA8 is not set | ||
| 1274 | # CONFIG_RTC_DRV_DS1742 is not set | ||
| 1275 | # CONFIG_RTC_DRV_M48T86 is not set | ||
| 1276 | # CONFIG_RTC_DRV_M48T59 is not set | ||
| 1277 | # CONFIG_RTC_DRV_V3020 is not set | ||
| 1278 | |||
| 1279 | # | ||
| 1280 | # on-CPU RTC drivers | ||
| 1281 | # | ||
| 1282 | # CONFIG_RTC_DRV_PL031 is not set | ||
| 1283 | |||
| 1284 | # | ||
| 1285 | # File systems | ||
| 1286 | # | ||
| 1287 | CONFIG_EXT2_FS=y | ||
| 1288 | # CONFIG_EXT2_FS_XATTR is not set | ||
| 1289 | # CONFIG_EXT2_FS_XIP is not set | ||
| 1290 | CONFIG_EXT3_FS=y | ||
| 1291 | # CONFIG_EXT3_FS_XATTR is not set | ||
| 1292 | # CONFIG_EXT4DEV_FS is not set | ||
| 1293 | CONFIG_JBD=y | ||
| 1294 | # CONFIG_REISERFS_FS is not set | ||
| 1295 | # CONFIG_JFS_FS is not set | ||
| 1296 | # CONFIG_FS_POSIX_ACL is not set | ||
| 1297 | # CONFIG_XFS_FS is not set | ||
| 1298 | # CONFIG_GFS2_FS is not set | ||
| 1299 | # CONFIG_OCFS2_FS is not set | ||
| 1300 | # CONFIG_MINIX_FS is not set | ||
| 1301 | # CONFIG_ROMFS_FS is not set | ||
| 1302 | CONFIG_INOTIFY=y | ||
| 1303 | CONFIG_INOTIFY_USER=y | ||
| 1304 | # CONFIG_QUOTA is not set | ||
| 1305 | CONFIG_DNOTIFY=y | ||
| 1306 | # CONFIG_AUTOFS_FS is not set | ||
| 1307 | # CONFIG_AUTOFS4_FS is not set | ||
| 1308 | # CONFIG_FUSE_FS is not set | ||
| 1309 | |||
| 1310 | # | ||
| 1311 | # CD-ROM/DVD Filesystems | ||
| 1312 | # | ||
| 1313 | # CONFIG_ISO9660_FS is not set | ||
| 1314 | # CONFIG_UDF_FS is not set | ||
| 1315 | |||
| 1316 | # | ||
| 1317 | # DOS/FAT/NT Filesystems | ||
| 1318 | # | ||
| 1319 | CONFIG_FAT_FS=y | ||
| 1320 | # CONFIG_MSDOS_FS is not set | ||
| 1321 | CONFIG_VFAT_FS=y | ||
| 1322 | CONFIG_FAT_DEFAULT_CODEPAGE=437 | ||
| 1323 | CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" | ||
| 1324 | # CONFIG_NTFS_FS is not set | ||
| 1325 | |||
| 1326 | # | ||
| 1327 | # Pseudo filesystems | ||
| 1328 | # | ||
| 1329 | CONFIG_PROC_FS=y | ||
| 1330 | CONFIG_PROC_SYSCTL=y | ||
| 1331 | CONFIG_SYSFS=y | ||
| 1332 | CONFIG_TMPFS=y | ||
| 1333 | # CONFIG_TMPFS_POSIX_ACL is not set | ||
| 1334 | # CONFIG_HUGETLB_PAGE is not set | ||
| 1335 | # CONFIG_CONFIGFS_FS is not set | ||
| 1336 | |||
| 1337 | # | ||
| 1338 | # Miscellaneous filesystems | ||
| 1339 | # | ||
| 1340 | # CONFIG_ADFS_FS is not set | ||
| 1341 | # CONFIG_AFFS_FS is not set | ||
| 1342 | # CONFIG_HFS_FS is not set | ||
| 1343 | # CONFIG_HFSPLUS_FS is not set | ||
| 1344 | # CONFIG_BEFS_FS is not set | ||
| 1345 | # CONFIG_BFS_FS is not set | ||
| 1346 | # CONFIG_EFS_FS is not set | ||
| 1347 | CONFIG_JFFS2_FS=y | ||
| 1348 | CONFIG_JFFS2_FS_DEBUG=0 | ||
| 1349 | CONFIG_JFFS2_FS_WRITEBUFFER=y | ||
| 1350 | # CONFIG_JFFS2_FS_WBUF_VERIFY is not set | ||
| 1351 | CONFIG_JFFS2_SUMMARY=y | ||
| 1352 | # CONFIG_JFFS2_FS_XATTR is not set | ||
| 1353 | # CONFIG_JFFS2_SYSFS is not set | ||
| 1354 | CONFIG_JFFS2_COMPRESSION_OPTIONS=y | ||
| 1355 | CONFIG_JFFS2_ZLIB=y | ||
| 1356 | CONFIG_JFFS2_LZO=y | ||
| 1357 | CONFIG_JFFS2_RTIME=y | ||
| 1358 | CONFIG_JFFS2_RUBIN=y | ||
| 1359 | # CONFIG_JFFS2_CMODE_NONE is not set | ||
| 1360 | CONFIG_JFFS2_CMODE_PRIORITY=y | ||
| 1361 | # CONFIG_JFFS2_CMODE_SIZE is not set | ||
| 1362 | # CONFIG_JFFS2_CMODE_FAVOURLZO is not set | ||
| 1363 | CONFIG_CRAMFS=m | ||
| 1364 | CONFIG_SQUASHFS=m | ||
| 1365 | # CONFIG_SQUASHFS_EMBEDDED is not set | ||
| 1366 | CONFIG_SQUASHFS_FRAGMENT_CACHE_SIZE=3 | ||
| 1367 | # CONFIG_VXFS_FS is not set | ||
| 1368 | # CONFIG_HPFS_FS is not set | ||
| 1369 | # CONFIG_QNX4FS_FS is not set | ||
| 1370 | # CONFIG_SYSV_FS is not set | ||
| 1371 | # CONFIG_UFS_FS is not set | ||
| 1372 | CONFIG_NETWORK_FILESYSTEMS=y | ||
| 1373 | CONFIG_NFS_FS=y | ||
| 1374 | CONFIG_NFS_V3=y | ||
| 1375 | # CONFIG_NFS_V3_ACL is not set | ||
| 1376 | # CONFIG_NFS_V4 is not set | ||
| 1377 | # CONFIG_NFS_DIRECTIO is not set | ||
| 1378 | CONFIG_NFSD=y | ||
| 1379 | CONFIG_NFSD_V3=y | ||
| 1380 | # CONFIG_NFSD_V3_ACL is not set | ||
| 1381 | # CONFIG_NFSD_V4 is not set | ||
| 1382 | # CONFIG_NFSD_TCP is not set | ||
| 1383 | CONFIG_ROOT_NFS=y | ||
| 1384 | CONFIG_LOCKD=y | ||
| 1385 | CONFIG_LOCKD_V4=y | ||
| 1386 | CONFIG_EXPORTFS=y | ||
| 1387 | CONFIG_NFS_COMMON=y | ||
| 1388 | CONFIG_SUNRPC=y | ||
| 1389 | # CONFIG_SUNRPC_BIND34 is not set | ||
| 1390 | # CONFIG_RPCSEC_GSS_KRB5 is not set | ||
| 1391 | # CONFIG_RPCSEC_GSS_SPKM3 is not set | ||
| 1392 | CONFIG_SMB_FS=y | ||
| 1393 | # CONFIG_SMB_NLS_DEFAULT is not set | ||
| 1394 | CONFIG_CIFS=m | ||
| 1395 | # CONFIG_CIFS_STATS is not set | ||
| 1396 | # CONFIG_CIFS_WEAK_PW_HASH is not set | ||
| 1397 | # CONFIG_CIFS_XATTR is not set | ||
| 1398 | # CONFIG_CIFS_DEBUG2 is not set | ||
| 1399 | # CONFIG_CIFS_EXPERIMENTAL is not set | ||
| 1400 | # CONFIG_NCP_FS is not set | ||
| 1401 | # CONFIG_CODA_FS is not set | ||
| 1402 | # CONFIG_AFS_FS is not set | ||
| 1403 | |||
| 1404 | # | ||
| 1405 | # Partition Types | ||
| 1406 | # | ||
| 1407 | CONFIG_PARTITION_ADVANCED=y | ||
| 1408 | # CONFIG_ACORN_PARTITION is not set | ||
| 1409 | # CONFIG_OSF_PARTITION is not set | ||
| 1410 | # CONFIG_AMIGA_PARTITION is not set | ||
| 1411 | # CONFIG_ATARI_PARTITION is not set | ||
| 1412 | # CONFIG_MAC_PARTITION is not set | ||
| 1413 | CONFIG_MSDOS_PARTITION=y | ||
| 1414 | # CONFIG_BSD_DISKLABEL is not set | ||
| 1415 | # CONFIG_MINIX_SUBPARTITION is not set | ||
| 1416 | # CONFIG_SOLARIS_X86_PARTITION is not set | ||
| 1417 | # CONFIG_UNIXWARE_DISKLABEL is not set | ||
| 1418 | # CONFIG_LDM_PARTITION is not set | ||
| 1419 | # CONFIG_SGI_PARTITION is not set | ||
| 1420 | # CONFIG_ULTRIX_PARTITION is not set | ||
| 1421 | # CONFIG_SUN_PARTITION is not set | ||
| 1422 | # CONFIG_KARMA_PARTITION is not set | ||
| 1423 | # CONFIG_EFI_PARTITION is not set | ||
| 1424 | # CONFIG_SYSV68_PARTITION is not set | ||
| 1425 | CONFIG_NLS=y | ||
| 1426 | CONFIG_NLS_DEFAULT="cp437" | ||
| 1427 | CONFIG_NLS_CODEPAGE_437=y | ||
| 1428 | CONFIG_NLS_CODEPAGE_737=m | ||
| 1429 | CONFIG_NLS_CODEPAGE_775=m | ||
| 1430 | CONFIG_NLS_CODEPAGE_850=m | ||
| 1431 | CONFIG_NLS_CODEPAGE_852=m | ||
| 1432 | CONFIG_NLS_CODEPAGE_855=m | ||
| 1433 | CONFIG_NLS_CODEPAGE_857=m | ||
| 1434 | CONFIG_NLS_CODEPAGE_860=m | ||
| 1435 | CONFIG_NLS_CODEPAGE_861=m | ||
| 1436 | CONFIG_NLS_CODEPAGE_862=m | ||
| 1437 | CONFIG_NLS_CODEPAGE_863=m | ||
| 1438 | CONFIG_NLS_CODEPAGE_864=m | ||
| 1439 | CONFIG_NLS_CODEPAGE_865=m | ||
| 1440 | CONFIG_NLS_CODEPAGE_866=m | ||
| 1441 | CONFIG_NLS_CODEPAGE_869=m | ||
| 1442 | CONFIG_NLS_CODEPAGE_936=m | ||
| 1443 | CONFIG_NLS_CODEPAGE_950=m | ||
| 1444 | CONFIG_NLS_CODEPAGE_932=m | ||
| 1445 | CONFIG_NLS_CODEPAGE_949=m | ||
| 1446 | CONFIG_NLS_CODEPAGE_874=m | ||
| 1447 | CONFIG_NLS_ISO8859_8=m | ||
| 1448 | CONFIG_NLS_CODEPAGE_1250=m | ||
| 1449 | CONFIG_NLS_CODEPAGE_1251=m | ||
| 1450 | CONFIG_NLS_ASCII=m | ||
| 1451 | CONFIG_NLS_ISO8859_1=y | ||
| 1452 | CONFIG_NLS_ISO8859_2=m | ||
| 1453 | CONFIG_NLS_ISO8859_3=m | ||
| 1454 | CONFIG_NLS_ISO8859_4=m | ||
| 1455 | CONFIG_NLS_ISO8859_5=m | ||
| 1456 | CONFIG_NLS_ISO8859_6=m | ||
| 1457 | CONFIG_NLS_ISO8859_7=m | ||
| 1458 | CONFIG_NLS_ISO8859_9=m | ||
| 1459 | CONFIG_NLS_ISO8859_13=m | ||
| 1460 | CONFIG_NLS_ISO8859_14=m | ||
| 1461 | CONFIG_NLS_ISO8859_15=m | ||
| 1462 | CONFIG_NLS_KOI8_R=m | ||
| 1463 | CONFIG_NLS_KOI8_U=m | ||
| 1464 | CONFIG_NLS_UTF8=y | ||
| 1465 | # CONFIG_DLM is not set | ||
| 1466 | CONFIG_INSTRUMENTATION=y | ||
| 1467 | CONFIG_PROFILING=y | ||
| 1468 | CONFIG_OPROFILE=m | ||
| 1469 | # CONFIG_MARKERS is not set | ||
| 1470 | |||
| 1471 | # | ||
| 1472 | # Kernel hacking | ||
| 1473 | # | ||
| 1474 | # CONFIG_PRINTK_TIME is not set | ||
| 1475 | CONFIG_ENABLE_WARN_DEPRECATED=y | ||
| 1476 | CONFIG_ENABLE_MUST_CHECK=y | ||
| 1477 | CONFIG_MAGIC_SYSRQ=y | ||
| 1478 | # CONFIG_UNUSED_SYMBOLS is not set | ||
| 1479 | # CONFIG_DEBUG_FS is not set | ||
| 1480 | # CONFIG_HEADERS_CHECK is not set | ||
| 1481 | CONFIG_DEBUG_KERNEL=y | ||
| 1482 | # CONFIG_DEBUG_SHIRQ is not set | ||
| 1483 | # CONFIG_DETECT_SOFTLOCKUP is not set | ||
| 1484 | # CONFIG_SCHED_DEBUG is not set | ||
| 1485 | # CONFIG_SCHEDSTATS is not set | ||
| 1486 | CONFIG_TIMER_STATS=y | ||
| 1487 | # CONFIG_DEBUG_SLAB is not set | ||
| 1488 | # CONFIG_DEBUG_PREEMPT is not set | ||
| 1489 | # CONFIG_DEBUG_RT_MUTEXES is not set | ||
| 1490 | # CONFIG_RT_MUTEX_TESTER is not set | ||
| 1491 | # CONFIG_DEBUG_SPINLOCK is not set | ||
| 1492 | # CONFIG_DEBUG_MUTEXES is not set | ||
| 1493 | # CONFIG_DEBUG_LOCK_ALLOC is not set | ||
| 1494 | # CONFIG_PROVE_LOCKING is not set | ||
| 1495 | # CONFIG_LOCK_STAT is not set | ||
| 1496 | # CONFIG_DEBUG_SPINLOCK_SLEEP is not set | ||
| 1497 | # CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set | ||
| 1498 | # CONFIG_DEBUG_KOBJECT is not set | ||
| 1499 | CONFIG_DEBUG_BUGVERBOSE=y | ||
| 1500 | # CONFIG_DEBUG_INFO is not set | ||
| 1501 | # CONFIG_DEBUG_VM is not set | ||
| 1502 | # CONFIG_DEBUG_LIST is not set | ||
| 1503 | # CONFIG_DEBUG_SG is not set | ||
| 1504 | CONFIG_FRAME_POINTER=y | ||
| 1505 | # CONFIG_FORCED_INLINING is not set | ||
| 1506 | # CONFIG_BOOT_PRINTK_DELAY is not set | ||
| 1507 | # CONFIG_RCU_TORTURE_TEST is not set | ||
| 1508 | # CONFIG_FAULT_INJECTION is not set | ||
| 1509 | # CONFIG_SAMPLES is not set | ||
| 1510 | # CONFIG_DEBUG_USER is not set | ||
| 1511 | CONFIG_DEBUG_ERRORS=y | ||
| 1512 | # CONFIG_DEBUG_LL is not set | ||
| 1513 | |||
| 1514 | # | ||
| 1515 | # Security options | ||
| 1516 | # | ||
| 1517 | # CONFIG_KEYS is not set | ||
| 1518 | # CONFIG_SECURITY is not set | ||
| 1519 | # CONFIG_SECURITY_FILE_CAPABILITIES is not set | ||
| 1520 | CONFIG_CRYPTO=y | ||
| 1521 | CONFIG_CRYPTO_ALGAPI=m | ||
| 1522 | CONFIG_CRYPTO_BLKCIPHER=m | ||
| 1523 | CONFIG_CRYPTO_HASH=m | ||
| 1524 | CONFIG_CRYPTO_MANAGER=m | ||
| 1525 | CONFIG_CRYPTO_HMAC=m | ||
| 1526 | # CONFIG_CRYPTO_XCBC is not set | ||
| 1527 | CONFIG_CRYPTO_NULL=m | ||
| 1528 | CONFIG_CRYPTO_MD4=m | ||
| 1529 | CONFIG_CRYPTO_MD5=m | ||
| 1530 | CONFIG_CRYPTO_SHA1=m | ||
| 1531 | CONFIG_CRYPTO_SHA256=m | ||
| 1532 | CONFIG_CRYPTO_SHA512=m | ||
| 1533 | CONFIG_CRYPTO_WP512=m | ||
| 1534 | # CONFIG_CRYPTO_TGR192 is not set | ||
| 1535 | # CONFIG_CRYPTO_GF128MUL is not set | ||
| 1536 | CONFIG_CRYPTO_ECB=m | ||
| 1537 | CONFIG_CRYPTO_CBC=m | ||
| 1538 | CONFIG_CRYPTO_PCBC=m | ||
| 1539 | # CONFIG_CRYPTO_LRW is not set | ||
| 1540 | # CONFIG_CRYPTO_XTS is not set | ||
| 1541 | # CONFIG_CRYPTO_CRYPTD is not set | ||
| 1542 | CONFIG_CRYPTO_DES=m | ||
| 1543 | # CONFIG_CRYPTO_FCRYPT is not set | ||
| 1544 | CONFIG_CRYPTO_BLOWFISH=m | ||
| 1545 | CONFIG_CRYPTO_TWOFISH=m | ||
| 1546 | CONFIG_CRYPTO_TWOFISH_COMMON=m | ||
| 1547 | CONFIG_CRYPTO_SERPENT=m | ||
| 1548 | CONFIG_CRYPTO_AES=m | ||
| 1549 | CONFIG_CRYPTO_CAST5=m | ||
| 1550 | CONFIG_CRYPTO_CAST6=m | ||
| 1551 | CONFIG_CRYPTO_TEA=m | ||
| 1552 | CONFIG_CRYPTO_ARC4=m | ||
| 1553 | CONFIG_CRYPTO_KHAZAD=m | ||
| 1554 | CONFIG_CRYPTO_ANUBIS=m | ||
| 1555 | # CONFIG_CRYPTO_SEED is not set | ||
| 1556 | CONFIG_CRYPTO_DEFLATE=m | ||
| 1557 | CONFIG_CRYPTO_LZO=m | ||
| 1558 | CONFIG_CRYPTO_MICHAEL_MIC=m | ||
| 1559 | CONFIG_CRYPTO_CRC32C=m | ||
| 1560 | CONFIG_CRYPTO_CAMELLIA=m | ||
| 1561 | CONFIG_CRYPTO_TEST=m | ||
| 1562 | # CONFIG_CRYPTO_AUTHENC is not set | ||
| 1563 | # CONFIG_CRYPTO_HW is not set | ||
| 1564 | |||
| 1565 | # | ||
| 1566 | # Library routines | ||
| 1567 | # | ||
| 1568 | CONFIG_BITREVERSE=y | ||
| 1569 | CONFIG_CRC_CCITT=y | ||
| 1570 | # CONFIG_CRC16 is not set | ||
| 1571 | # CONFIG_CRC_ITU_T is not set | ||
| 1572 | CONFIG_CRC32=y | ||
| 1573 | # CONFIG_CRC7 is not set | ||
| 1574 | CONFIG_LIBCRC32C=m | ||
| 1575 | CONFIG_ZLIB_INFLATE=y | ||
| 1576 | CONFIG_ZLIB_DEFLATE=y | ||
| 1577 | CONFIG_LZO_COMPRESS=y | ||
| 1578 | CONFIG_LZO_DECOMPRESS=y | ||
| 1579 | CONFIG_PLIST=y | ||
| 1580 | CONFIG_HAS_IOMEM=y | ||
| 1581 | CONFIG_HAS_IOPORT=y | ||
| 1582 | CONFIG_HAS_DMA=y | ||
diff --git a/meta/packages/linux/linux-rp-2.6.25+2.6.26-rc4/defconfig-qemux86 b/meta/packages/linux/linux-rp-2.6.25+2.6.26-rc4/defconfig-qemux86 new file mode 100644 index 0000000000..42f6740201 --- /dev/null +++ b/meta/packages/linux/linux-rp-2.6.25+2.6.26-rc4/defconfig-qemux86 | |||
| @@ -0,0 +1,1993 @@ | |||
| 1 | # | ||
| 2 | # Automatically generated make config: don't edit | ||
| 3 | # Linux kernel version: 2.6.24-rc8 | ||
| 4 | # Sun Jan 20 18:20:37 2008 | ||
| 5 | # | ||
| 6 | # CONFIG_64BIT is not set | ||
| 7 | CONFIG_X86_32=y | ||
| 8 | # CONFIG_X86_64 is not set | ||
| 9 | CONFIG_X86=y | ||
| 10 | CONFIG_GENERIC_TIME=y | ||
| 11 | CONFIG_GENERIC_CMOS_UPDATE=y | ||
| 12 | CONFIG_CLOCKSOURCE_WATCHDOG=y | ||
| 13 | CONFIG_GENERIC_CLOCKEVENTS=y | ||
| 14 | CONFIG_GENERIC_CLOCKEVENTS_BROADCAST=y | ||
| 15 | CONFIG_LOCKDEP_SUPPORT=y | ||
| 16 | CONFIG_STACKTRACE_SUPPORT=y | ||
| 17 | CONFIG_SEMAPHORE_SLEEPERS=y | ||
| 18 | CONFIG_MMU=y | ||
| 19 | CONFIG_ZONE_DMA=y | ||
| 20 | CONFIG_QUICKLIST=y | ||
| 21 | CONFIG_GENERIC_ISA_DMA=y | ||
| 22 | CONFIG_GENERIC_IOMAP=y | ||
| 23 | CONFIG_GENERIC_BUG=y | ||
| 24 | CONFIG_GENERIC_HWEIGHT=y | ||
| 25 | CONFIG_ARCH_MAY_HAVE_PC_FDC=y | ||
| 26 | CONFIG_DMI=y | ||
| 27 | # CONFIG_RWSEM_GENERIC_SPINLOCK is not set | ||
| 28 | CONFIG_RWSEM_XCHGADD_ALGORITHM=y | ||
| 29 | # CONFIG_ARCH_HAS_ILOG2_U32 is not set | ||
| 30 | # CONFIG_ARCH_HAS_ILOG2_U64 is not set | ||
| 31 | CONFIG_GENERIC_CALIBRATE_DELAY=y | ||
| 32 | # CONFIG_GENERIC_TIME_VSYSCALL is not set | ||
| 33 | CONFIG_ARCH_SUPPORTS_OPROFILE=y | ||
| 34 | # CONFIG_ZONE_DMA32 is not set | ||
| 35 | CONFIG_ARCH_POPULATES_NODE_MAP=y | ||
| 36 | # CONFIG_AUDIT_ARCH is not set | ||
| 37 | CONFIG_GENERIC_HARDIRQS=y | ||
| 38 | CONFIG_GENERIC_IRQ_PROBE=y | ||
| 39 | CONFIG_GENERIC_PENDING_IRQ=y | ||
| 40 | CONFIG_X86_SMP=y | ||
| 41 | CONFIG_X86_HT=y | ||
| 42 | CONFIG_X86_BIOS_REBOOT=y | ||
| 43 | CONFIG_X86_TRAMPOLINE=y | ||
| 44 | CONFIG_KTIME_SCALAR=y | ||
| 45 | CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" | ||
| 46 | |||
| 47 | # | ||
| 48 | # General setup | ||
| 49 | # | ||
| 50 | CONFIG_EXPERIMENTAL=y | ||
| 51 | CONFIG_LOCK_KERNEL=y | ||
| 52 | CONFIG_INIT_ENV_ARG_LIMIT=32 | ||
| 53 | CONFIG_LOCALVERSION="" | ||
| 54 | # CONFIG_LOCALVERSION_AUTO is not set | ||
| 55 | CONFIG_SWAP=y | ||
| 56 | CONFIG_SYSVIPC=y | ||
| 57 | CONFIG_SYSVIPC_SYSCTL=y | ||
| 58 | CONFIG_POSIX_MQUEUE=y | ||
| 59 | # CONFIG_BSD_PROCESS_ACCT is not set | ||
| 60 | # CONFIG_TASKSTATS is not set | ||
| 61 | # CONFIG_USER_NS is not set | ||
| 62 | # CONFIG_PID_NS is not set | ||
| 63 | CONFIG_AUDIT=y | ||
| 64 | CONFIG_AUDITSYSCALL=y | ||
| 65 | CONFIG_AUDIT_TREE=y | ||
| 66 | # CONFIG_IKCONFIG is not set | ||
| 67 | CONFIG_LOG_BUF_SHIFT=15 | ||
| 68 | # CONFIG_CGROUPS is not set | ||
| 69 | CONFIG_FAIR_GROUP_SCHED=y | ||
| 70 | CONFIG_FAIR_USER_SCHED=y | ||
| 71 | # CONFIG_FAIR_CGROUP_SCHED is not set | ||
| 72 | CONFIG_SYSFS_DEPRECATED=y | ||
| 73 | # CONFIG_RELAY is not set | ||
| 74 | CONFIG_BLK_DEV_INITRD=y | ||
| 75 | CONFIG_INITRAMFS_SOURCE="" | ||
| 76 | # CONFIG_CC_OPTIMIZE_FOR_SIZE is not set | ||
| 77 | CONFIG_SYSCTL=y | ||
| 78 | CONFIG_EMBEDDED=y | ||
| 79 | CONFIG_UID16=y | ||
| 80 | CONFIG_SYSCTL_SYSCALL=y | ||
| 81 | CONFIG_KALLSYMS=y | ||
| 82 | # CONFIG_KALLSYMS_EXTRA_PASS is not set | ||
| 83 | CONFIG_HOTPLUG=y | ||
| 84 | CONFIG_PRINTK=y | ||
| 85 | CONFIG_BUG=y | ||
| 86 | CONFIG_ELF_CORE=y | ||
| 87 | CONFIG_BASE_FULL=y | ||
| 88 | CONFIG_FUTEX=y | ||
| 89 | CONFIG_ANON_INODES=y | ||
| 90 | CONFIG_EPOLL=y | ||
| 91 | CONFIG_SIGNALFD=y | ||
| 92 | CONFIG_EVENTFD=y | ||
| 93 | CONFIG_SHMEM=y | ||
| 94 | CONFIG_VM_EVENT_COUNTERS=y | ||
| 95 | CONFIG_SLAB=y | ||
| 96 | # CONFIG_SLUB is not set | ||
| 97 | # CONFIG_SLOB is not set | ||
| 98 | CONFIG_SLABINFO=y | ||
| 99 | CONFIG_RT_MUTEXES=y | ||
| 100 | # CONFIG_TINY_SHMEM is not set | ||
| 101 | CONFIG_BASE_SMALL=0 | ||
| 102 | CONFIG_MODULES=y | ||
| 103 | CONFIG_MODULE_UNLOAD=y | ||
| 104 | CONFIG_MODULE_FORCE_UNLOAD=y | ||
| 105 | # CONFIG_MODVERSIONS is not set | ||
| 106 | # CONFIG_MODULE_SRCVERSION_ALL is not set | ||
| 107 | CONFIG_KMOD=y | ||
| 108 | CONFIG_STOP_MACHINE=y | ||
| 109 | CONFIG_BLOCK=y | ||
| 110 | CONFIG_LBD=y | ||
| 111 | # CONFIG_BLK_DEV_IO_TRACE is not set | ||
| 112 | # CONFIG_LSF is not set | ||
| 113 | # CONFIG_BLK_DEV_BSG is not set | ||
| 114 | |||
| 115 | # | ||
| 116 | # IO Schedulers | ||
| 117 | # | ||
| 118 | CONFIG_IOSCHED_NOOP=y | ||
| 119 | CONFIG_IOSCHED_AS=y | ||
| 120 | CONFIG_IOSCHED_DEADLINE=m | ||
| 121 | CONFIG_IOSCHED_CFQ=m | ||
| 122 | CONFIG_DEFAULT_AS=y | ||
| 123 | # CONFIG_DEFAULT_DEADLINE is not set | ||
| 124 | # CONFIG_DEFAULT_CFQ is not set | ||
| 125 | # CONFIG_DEFAULT_NOOP is not set | ||
| 126 | CONFIG_DEFAULT_IOSCHED="anticipatory" | ||
| 127 | |||
| 128 | # | ||
| 129 | # Processor type and features | ||
| 130 | # | ||
| 131 | CONFIG_TICK_ONESHOT=y | ||
| 132 | CONFIG_NO_HZ=y | ||
| 133 | CONFIG_HIGH_RES_TIMERS=y | ||
| 134 | CONFIG_GENERIC_CLOCKEVENTS_BUILD=y | ||
| 135 | CONFIG_SMP=y | ||
| 136 | CONFIG_X86_PC=y | ||
| 137 | # CONFIG_X86_ELAN is not set | ||
| 138 | # CONFIG_X86_VOYAGER is not set | ||
| 139 | # CONFIG_X86_NUMAQ is not set | ||
| 140 | # CONFIG_X86_SUMMIT is not set | ||
| 141 | # CONFIG_X86_BIGSMP is not set | ||
| 142 | # CONFIG_X86_VISWS is not set | ||
| 143 | # CONFIG_X86_GENERICARCH is not set | ||
| 144 | # CONFIG_X86_ES7000 is not set | ||
| 145 | # CONFIG_X86_VSMP is not set | ||
| 146 | CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y | ||
| 147 | # CONFIG_PARAVIRT_GUEST is not set | ||
| 148 | # CONFIG_M386 is not set | ||
| 149 | # CONFIG_M486 is not set | ||
| 150 | # CONFIG_M586 is not set | ||
| 151 | # CONFIG_M586TSC is not set | ||
| 152 | # CONFIG_M586MMX is not set | ||
| 153 | CONFIG_M686=y | ||
| 154 | # CONFIG_MPENTIUMII is not set | ||
| 155 | # CONFIG_MPENTIUMIII is not set | ||
| 156 | # CONFIG_MPENTIUMM is not set | ||
| 157 | # CONFIG_MPENTIUM4 is not set | ||
| 158 | # CONFIG_MK6 is not set | ||
| 159 | # CONFIG_MK7 is not set | ||
| 160 | # CONFIG_MK8 is not set | ||
| 161 | # CONFIG_MCRUSOE is not set | ||
| 162 | # CONFIG_MEFFICEON is not set | ||
| 163 | # CONFIG_MWINCHIPC6 is not set | ||
| 164 | # CONFIG_MWINCHIP2 is not set | ||
| 165 | # CONFIG_MWINCHIP3D is not set | ||
| 166 | # CONFIG_MGEODEGX1 is not set | ||
| 167 | # CONFIG_MGEODE_LX is not set | ||
| 168 | # CONFIG_MCYRIXIII is not set | ||
| 169 | # CONFIG_MVIAC3_2 is not set | ||
| 170 | # CONFIG_MVIAC7 is not set | ||
| 171 | # CONFIG_MPSC is not set | ||
| 172 | # CONFIG_MCORE2 is not set | ||
| 173 | # CONFIG_GENERIC_CPU is not set | ||
| 174 | CONFIG_X86_GENERIC=y | ||
| 175 | CONFIG_X86_CMPXCHG=y | ||
| 176 | CONFIG_X86_L1_CACHE_SHIFT=7 | ||
| 177 | CONFIG_X86_XADD=y | ||
| 178 | CONFIG_X86_PPRO_FENCE=y | ||
| 179 | CONFIG_X86_WP_WORKS_OK=y | ||
| 180 | CONFIG_X86_INVLPG=y | ||
| 181 | CONFIG_X86_BSWAP=y | ||
| 182 | CONFIG_X86_POPAD_OK=y | ||
| 183 | CONFIG_X86_GOOD_APIC=y | ||
| 184 | CONFIG_X86_INTEL_USERCOPY=y | ||
| 185 | CONFIG_X86_USE_PPRO_CHECKSUM=y | ||
| 186 | CONFIG_X86_TSC=y | ||
| 187 | CONFIG_X86_CMOV=y | ||
| 188 | CONFIG_X86_MINIMUM_CPU_FAMILY=4 | ||
| 189 | # CONFIG_HPET_TIMER is not set | ||
| 190 | CONFIG_NR_CPUS=8 | ||
| 191 | CONFIG_SCHED_SMT=y | ||
| 192 | CONFIG_SCHED_MC=y | ||
| 193 | CONFIG_PREEMPT_NONE=y | ||
| 194 | # CONFIG_PREEMPT_VOLUNTARY is not set | ||
| 195 | # CONFIG_PREEMPT is not set | ||
| 196 | CONFIG_PREEMPT_BKL=y | ||
| 197 | CONFIG_X86_LOCAL_APIC=y | ||
| 198 | CONFIG_X86_IO_APIC=y | ||
| 199 | CONFIG_X86_MCE=y | ||
| 200 | CONFIG_X86_MCE_NONFATAL=y | ||
| 201 | CONFIG_X86_MCE_P4THERMAL=y | ||
| 202 | CONFIG_VM86=y | ||
| 203 | # CONFIG_TOSHIBA is not set | ||
| 204 | # CONFIG_I8K is not set | ||
| 205 | # CONFIG_X86_REBOOTFIXUPS is not set | ||
| 206 | # CONFIG_MICROCODE is not set | ||
| 207 | # CONFIG_X86_MSR is not set | ||
| 208 | # CONFIG_X86_CPUID is not set | ||
| 209 | CONFIG_NOHIGHMEM=y | ||
| 210 | # CONFIG_HIGHMEM4G is not set | ||
| 211 | # CONFIG_HIGHMEM64G is not set | ||
| 212 | CONFIG_VMSPLIT_3G=y | ||
| 213 | # CONFIG_VMSPLIT_3G_OPT is not set | ||
| 214 | # CONFIG_VMSPLIT_2G is not set | ||
| 215 | # CONFIG_VMSPLIT_2G_OPT is not set | ||
| 216 | # CONFIG_VMSPLIT_1G is not set | ||
| 217 | CONFIG_PAGE_OFFSET=0xC0000000 | ||
| 218 | # CONFIG_X86_PAE is not set | ||
| 219 | CONFIG_ARCH_FLATMEM_ENABLE=y | ||
| 220 | CONFIG_ARCH_SPARSEMEM_ENABLE=y | ||
| 221 | CONFIG_ARCH_SELECT_MEMORY_MODEL=y | ||
| 222 | CONFIG_SELECT_MEMORY_MODEL=y | ||
| 223 | CONFIG_FLATMEM_MANUAL=y | ||
| 224 | # CONFIG_DISCONTIGMEM_MANUAL is not set | ||
| 225 | # CONFIG_SPARSEMEM_MANUAL is not set | ||
| 226 | CONFIG_FLATMEM=y | ||
| 227 | CONFIG_FLAT_NODE_MEM_MAP=y | ||
| 228 | CONFIG_SPARSEMEM_STATIC=y | ||
| 229 | # CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set | ||
| 230 | CONFIG_SPLIT_PTLOCK_CPUS=4 | ||
| 231 | # CONFIG_RESOURCES_64BIT is not set | ||
| 232 | CONFIG_ZONE_DMA_FLAG=1 | ||
| 233 | CONFIG_BOUNCE=y | ||
| 234 | CONFIG_NR_QUICK=1 | ||
| 235 | CONFIG_VIRT_TO_BUS=y | ||
| 236 | # CONFIG_MATH_EMULATION is not set | ||
| 237 | CONFIG_MTRR=y | ||
| 238 | # CONFIG_EFI is not set | ||
| 239 | CONFIG_IRQBALANCE=y | ||
| 240 | CONFIG_SECCOMP=y | ||
| 241 | # CONFIG_HZ_100 is not set | ||
| 242 | CONFIG_HZ_250=y | ||
| 243 | # CONFIG_HZ_300 is not set | ||
| 244 | # CONFIG_HZ_1000 is not set | ||
| 245 | CONFIG_HZ=250 | ||
| 246 | CONFIG_KEXEC=y | ||
| 247 | CONFIG_PHYSICAL_START=0x100000 | ||
| 248 | # CONFIG_RELOCATABLE is not set | ||
| 249 | CONFIG_PHYSICAL_ALIGN=0x100000 | ||
| 250 | CONFIG_HOTPLUG_CPU=y | ||
| 251 | CONFIG_COMPAT_VDSO=y | ||
| 252 | |||
| 253 | # | ||
| 254 | # Power management options | ||
| 255 | # | ||
| 256 | CONFIG_PM=y | ||
| 257 | CONFIG_PM_LEGACY=y | ||
| 258 | # CONFIG_PM_DEBUG is not set | ||
| 259 | CONFIG_PM_SLEEP_SMP=y | ||
| 260 | CONFIG_PM_SLEEP=y | ||
| 261 | CONFIG_SUSPEND_SMP_POSSIBLE=y | ||
| 262 | CONFIG_SUSPEND=y | ||
| 263 | CONFIG_HIBERNATION_SMP_POSSIBLE=y | ||
| 264 | # CONFIG_HIBERNATION is not set | ||
| 265 | CONFIG_ACPI=y | ||
| 266 | CONFIG_ACPI_SLEEP=y | ||
| 267 | # CONFIG_ACPI_PROCFS is not set | ||
| 268 | CONFIG_ACPI_PROCFS_POWER=y | ||
| 269 | CONFIG_ACPI_SYSFS_POWER=y | ||
| 270 | CONFIG_ACPI_PROC_EVENT=y | ||
| 271 | CONFIG_ACPI_AC=y | ||
| 272 | CONFIG_ACPI_BATTERY=y | ||
| 273 | CONFIG_ACPI_BUTTON=y | ||
| 274 | # CONFIG_ACPI_VIDEO is not set | ||
| 275 | CONFIG_ACPI_FAN=y | ||
| 276 | # CONFIG_ACPI_DOCK is not set | ||
| 277 | CONFIG_ACPI_PROCESSOR=y | ||
| 278 | CONFIG_ACPI_HOTPLUG_CPU=y | ||
| 279 | CONFIG_ACPI_THERMAL=y | ||
| 280 | # CONFIG_ACPI_ASUS is not set | ||
| 281 | # CONFIG_ACPI_TOSHIBA is not set | ||
| 282 | CONFIG_ACPI_BLACKLIST_YEAR=0 | ||
| 283 | # CONFIG_ACPI_DEBUG is not set | ||
| 284 | CONFIG_ACPI_EC=y | ||
| 285 | CONFIG_ACPI_POWER=y | ||
| 286 | CONFIG_ACPI_SYSTEM=y | ||
| 287 | CONFIG_X86_PM_TIMER=y | ||
| 288 | CONFIG_ACPI_CONTAINER=y | ||
| 289 | # CONFIG_ACPI_SBS is not set | ||
| 290 | # CONFIG_APM is not set | ||
| 291 | |||
| 292 | # | ||
| 293 | # CPU Frequency scaling | ||
| 294 | # | ||
| 295 | # CONFIG_CPU_FREQ is not set | ||
| 296 | # CONFIG_CPU_IDLE is not set | ||
| 297 | |||
| 298 | # | ||
| 299 | # Bus options (PCI etc.) | ||
| 300 | # | ||
| 301 | CONFIG_PCI=y | ||
| 302 | # CONFIG_PCI_GOBIOS is not set | ||
| 303 | # CONFIG_PCI_GOMMCONFIG is not set | ||
| 304 | # CONFIG_PCI_GODIRECT is not set | ||
| 305 | CONFIG_PCI_GOANY=y | ||
| 306 | CONFIG_PCI_BIOS=y | ||
| 307 | CONFIG_PCI_DIRECT=y | ||
| 308 | CONFIG_PCI_MMCONFIG=y | ||
| 309 | CONFIG_PCI_DOMAINS=y | ||
| 310 | # CONFIG_PCIEPORTBUS is not set | ||
| 311 | CONFIG_ARCH_SUPPORTS_MSI=y | ||
| 312 | # CONFIG_PCI_MSI is not set | ||
| 313 | CONFIG_PCI_LEGACY=y | ||
| 314 | CONFIG_HT_IRQ=y | ||
| 315 | CONFIG_ISA_DMA_API=y | ||
| 316 | CONFIG_ISA=y | ||
| 317 | # CONFIG_EISA is not set | ||
| 318 | # CONFIG_MCA is not set | ||
| 319 | # CONFIG_SCx200 is not set | ||
| 320 | CONFIG_K8_NB=y | ||
| 321 | # CONFIG_PCCARD is not set | ||
| 322 | # CONFIG_HOTPLUG_PCI is not set | ||
| 323 | |||
| 324 | # | ||
| 325 | # Executable file formats / Emulations | ||
| 326 | # | ||
| 327 | CONFIG_BINFMT_ELF=y | ||
| 328 | CONFIG_BINFMT_AOUT=m | ||
| 329 | CONFIG_BINFMT_MISC=m | ||
| 330 | |||
| 331 | # | ||
| 332 | # Networking | ||
| 333 | # | ||
| 334 | CONFIG_NET=y | ||
| 335 | |||
| 336 | # | ||
| 337 | # Networking options | ||
| 338 | # | ||
| 339 | CONFIG_PACKET=m | ||
| 340 | CONFIG_PACKET_MMAP=y | ||
| 341 | CONFIG_UNIX=y | ||
| 342 | CONFIG_XFRM=y | ||
| 343 | # CONFIG_XFRM_USER is not set | ||
| 344 | # CONFIG_XFRM_SUB_POLICY is not set | ||
| 345 | # CONFIG_XFRM_MIGRATE is not set | ||
| 346 | # CONFIG_NET_KEY is not set | ||
| 347 | CONFIG_INET=y | ||
| 348 | # CONFIG_IP_MULTICAST is not set | ||
| 349 | # CONFIG_IP_ADVANCED_ROUTER is not set | ||
| 350 | CONFIG_IP_FIB_HASH=y | ||
| 351 | CONFIG_IP_PNP=y | ||
| 352 | CONFIG_IP_PNP_DHCP=y | ||
| 353 | CONFIG_IP_PNP_BOOTP=y | ||
| 354 | # CONFIG_IP_PNP_RARP is not set | ||
| 355 | # CONFIG_NET_IPIP is not set | ||
| 356 | # CONFIG_NET_IPGRE is not set | ||
| 357 | # CONFIG_ARPD is not set | ||
| 358 | CONFIG_SYN_COOKIES=y | ||
| 359 | # CONFIG_INET_AH is not set | ||
| 360 | # CONFIG_INET_ESP is not set | ||
| 361 | # CONFIG_INET_IPCOMP is not set | ||
| 362 | # CONFIG_INET_XFRM_TUNNEL is not set | ||
| 363 | CONFIG_INET_TUNNEL=m | ||
| 364 | CONFIG_INET_XFRM_MODE_TRANSPORT=m | ||
| 365 | CONFIG_INET_XFRM_MODE_TUNNEL=m | ||
| 366 | CONFIG_INET_XFRM_MODE_BEET=m | ||
| 367 | # CONFIG_INET_LRO is not set | ||
| 368 | CONFIG_INET_DIAG=m | ||
| 369 | CONFIG_INET_TCP_DIAG=m | ||
| 370 | # CONFIG_TCP_CONG_ADVANCED is not set | ||
| 371 | CONFIG_TCP_CONG_CUBIC=y | ||
| 372 | CONFIG_DEFAULT_TCP_CONG="cubic" | ||
| 373 | # CONFIG_TCP_MD5SIG is not set | ||
| 374 | # CONFIG_IP_VS is not set | ||
| 375 | CONFIG_IPV6=m | ||
| 376 | # CONFIG_IPV6_PRIVACY is not set | ||
| 377 | # CONFIG_IPV6_ROUTER_PREF is not set | ||
| 378 | # CONFIG_IPV6_OPTIMISTIC_DAD is not set | ||
| 379 | CONFIG_INET6_AH=m | ||
| 380 | CONFIG_INET6_ESP=m | ||
| 381 | CONFIG_INET6_IPCOMP=m | ||
| 382 | # CONFIG_IPV6_MIP6 is not set | ||
| 383 | CONFIG_INET6_XFRM_TUNNEL=m | ||
| 384 | CONFIG_INET6_TUNNEL=m | ||
| 385 | CONFIG_INET6_XFRM_MODE_TRANSPORT=m | ||
| 386 | CONFIG_INET6_XFRM_MODE_TUNNEL=m | ||
| 387 | CONFIG_INET6_XFRM_MODE_BEET=m | ||
| 388 | # CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION is not set | ||
| 389 | CONFIG_IPV6_SIT=m | ||
| 390 | CONFIG_IPV6_TUNNEL=m | ||
| 391 | # CONFIG_IPV6_MULTIPLE_TABLES is not set | ||
| 392 | # CONFIG_NETWORK_SECMARK is not set | ||
| 393 | CONFIG_NETFILTER=y | ||
| 394 | # CONFIG_NETFILTER_DEBUG is not set | ||
| 395 | |||
| 396 | # | ||
| 397 | # Core Netfilter Configuration | ||
| 398 | # | ||
| 399 | # CONFIG_NETFILTER_NETLINK is not set | ||
| 400 | # CONFIG_NF_CONNTRACK_ENABLED is not set | ||
| 401 | # CONFIG_NF_CONNTRACK is not set | ||
| 402 | CONFIG_NETFILTER_XTABLES=m | ||
| 403 | # CONFIG_NETFILTER_XT_TARGET_CLASSIFY is not set | ||
| 404 | # CONFIG_NETFILTER_XT_TARGET_DSCP is not set | ||
| 405 | # CONFIG_NETFILTER_XT_TARGET_MARK is not set | ||
| 406 | # CONFIG_NETFILTER_XT_TARGET_NFQUEUE is not set | ||
| 407 | # CONFIG_NETFILTER_XT_TARGET_NFLOG is not set | ||
| 408 | # CONFIG_NETFILTER_XT_TARGET_TRACE is not set | ||
| 409 | # CONFIG_NETFILTER_XT_TARGET_TCPMSS is not set | ||
| 410 | # CONFIG_NETFILTER_XT_MATCH_COMMENT is not set | ||
| 411 | # CONFIG_NETFILTER_XT_MATCH_DCCP is not set | ||
| 412 | # CONFIG_NETFILTER_XT_MATCH_DSCP is not set | ||
| 413 | # CONFIG_NETFILTER_XT_MATCH_ESP is not set | ||
| 414 | # CONFIG_NETFILTER_XT_MATCH_LENGTH is not set | ||
| 415 | # CONFIG_NETFILTER_XT_MATCH_LIMIT is not set | ||
| 416 | # CONFIG_NETFILTER_XT_MATCH_MAC is not set | ||
| 417 | # CONFIG_NETFILTER_XT_MATCH_MARK is not set | ||
| 418 | # CONFIG_NETFILTER_XT_MATCH_POLICY is not set | ||
| 419 | # CONFIG_NETFILTER_XT_MATCH_MULTIPORT is not set | ||
| 420 | # CONFIG_NETFILTER_XT_MATCH_PKTTYPE is not set | ||
| 421 | # CONFIG_NETFILTER_XT_MATCH_QUOTA is not set | ||
| 422 | # CONFIG_NETFILTER_XT_MATCH_REALM is not set | ||
| 423 | # CONFIG_NETFILTER_XT_MATCH_SCTP is not set | ||
| 424 | # CONFIG_NETFILTER_XT_MATCH_STATISTIC is not set | ||
| 425 | # CONFIG_NETFILTER_XT_MATCH_STRING is not set | ||
| 426 | # CONFIG_NETFILTER_XT_MATCH_TCPMSS is not set | ||
| 427 | # CONFIG_NETFILTER_XT_MATCH_TIME is not set | ||
| 428 | # CONFIG_NETFILTER_XT_MATCH_U32 is not set | ||
| 429 | # CONFIG_NETFILTER_XT_MATCH_HASHLIMIT is not set | ||
| 430 | |||
| 431 | # | ||
| 432 | # IP: Netfilter Configuration | ||
| 433 | # | ||
| 434 | CONFIG_IP_NF_QUEUE=m | ||
| 435 | CONFIG_IP_NF_IPTABLES=m | ||
| 436 | CONFIG_IP_NF_MATCH_IPRANGE=m | ||
| 437 | CONFIG_IP_NF_MATCH_TOS=m | ||
| 438 | CONFIG_IP_NF_MATCH_RECENT=m | ||
| 439 | CONFIG_IP_NF_MATCH_ECN=m | ||
| 440 | CONFIG_IP_NF_MATCH_AH=m | ||
| 441 | CONFIG_IP_NF_MATCH_TTL=m | ||
| 442 | CONFIG_IP_NF_MATCH_OWNER=m | ||
| 443 | CONFIG_IP_NF_MATCH_ADDRTYPE=m | ||
| 444 | CONFIG_IP_NF_FILTER=m | ||
| 445 | CONFIG_IP_NF_TARGET_REJECT=m | ||
| 446 | CONFIG_IP_NF_TARGET_LOG=m | ||
| 447 | CONFIG_IP_NF_TARGET_ULOG=m | ||
| 448 | CONFIG_IP_NF_MANGLE=m | ||
| 449 | CONFIG_IP_NF_TARGET_TOS=m | ||
| 450 | CONFIG_IP_NF_TARGET_ECN=m | ||
| 451 | CONFIG_IP_NF_TARGET_TTL=m | ||
| 452 | CONFIG_IP_NF_RAW=m | ||
| 453 | CONFIG_IP_NF_ARPTABLES=m | ||
| 454 | CONFIG_IP_NF_ARPFILTER=m | ||
| 455 | CONFIG_IP_NF_ARP_MANGLE=m | ||
| 456 | |||
| 457 | # | ||
| 458 | # IPv6: Netfilter Configuration (EXPERIMENTAL) | ||
| 459 | # | ||
| 460 | # CONFIG_IP6_NF_QUEUE is not set | ||
| 461 | # CONFIG_IP6_NF_IPTABLES is not set | ||
| 462 | # CONFIG_IP_DCCP is not set | ||
| 463 | # CONFIG_IP_SCTP is not set | ||
| 464 | # CONFIG_TIPC is not set | ||
| 465 | # CONFIG_ATM is not set | ||
| 466 | # CONFIG_BRIDGE is not set | ||
| 467 | # CONFIG_VLAN_8021Q is not set | ||
| 468 | # CONFIG_DECNET is not set | ||
| 469 | # CONFIG_LLC2 is not set | ||
| 470 | # CONFIG_IPX is not set | ||
| 471 | # CONFIG_ATALK is not set | ||
| 472 | # CONFIG_X25 is not set | ||
| 473 | # CONFIG_LAPB is not set | ||
| 474 | # CONFIG_ECONET is not set | ||
| 475 | # CONFIG_WAN_ROUTER is not set | ||
| 476 | # CONFIG_NET_SCHED is not set | ||
| 477 | |||
| 478 | # | ||
| 479 | # Network testing | ||
| 480 | # | ||
| 481 | # CONFIG_NET_PKTGEN is not set | ||
| 482 | # CONFIG_HAMRADIO is not set | ||
| 483 | CONFIG_IRDA=m | ||
| 484 | |||
| 485 | # | ||
| 486 | # IrDA protocols | ||
| 487 | # | ||
| 488 | CONFIG_IRLAN=m | ||
| 489 | CONFIG_IRNET=m | ||
| 490 | CONFIG_IRCOMM=m | ||
| 491 | # CONFIG_IRDA_ULTRA is not set | ||
| 492 | |||
| 493 | # | ||
| 494 | # IrDA options | ||
| 495 | # | ||
| 496 | # CONFIG_IRDA_CACHE_LAST_LSAP is not set | ||
| 497 | # CONFIG_IRDA_FAST_RR is not set | ||
| 498 | # CONFIG_IRDA_DEBUG is not set | ||
| 499 | |||
| 500 | # | ||
| 501 | # Infrared-port device drivers | ||
| 502 | # | ||
| 503 | |||
| 504 | # | ||
| 505 | # SIR device drivers | ||
| 506 | # | ||
| 507 | # CONFIG_IRTTY_SIR is not set | ||
| 508 | |||
| 509 | # | ||
| 510 | # Dongle support | ||
| 511 | # | ||
| 512 | # CONFIG_KINGSUN_DONGLE is not set | ||
| 513 | # CONFIG_KSDAZZLE_DONGLE is not set | ||
| 514 | # CONFIG_KS959_DONGLE is not set | ||
| 515 | |||
| 516 | # | ||
| 517 | # Old SIR device drivers | ||
| 518 | # | ||
| 519 | |||
| 520 | # | ||
| 521 | # Old Serial dongle support | ||
| 522 | # | ||
| 523 | |||
| 524 | # | ||
| 525 | # FIR device drivers | ||
| 526 | # | ||
| 527 | # CONFIG_USB_IRDA is not set | ||
| 528 | # CONFIG_SIGMATEL_FIR is not set | ||
| 529 | # CONFIG_NSC_FIR is not set | ||
| 530 | # CONFIG_WINBOND_FIR is not set | ||
| 531 | # CONFIG_TOSHIBA_FIR is not set | ||
| 532 | # CONFIG_SMC_IRCC_FIR is not set | ||
| 533 | # CONFIG_ALI_FIR is not set | ||
| 534 | # CONFIG_VLSI_FIR is not set | ||
| 535 | # CONFIG_VIA_FIR is not set | ||
| 536 | # CONFIG_MCS_FIR is not set | ||
| 537 | CONFIG_BT=m | ||
| 538 | CONFIG_BT_L2CAP=m | ||
| 539 | CONFIG_BT_SCO=m | ||
| 540 | CONFIG_BT_RFCOMM=m | ||
| 541 | CONFIG_BT_RFCOMM_TTY=y | ||
| 542 | CONFIG_BT_BNEP=m | ||
| 543 | CONFIG_BT_BNEP_MC_FILTER=y | ||
| 544 | CONFIG_BT_BNEP_PROTO_FILTER=y | ||
| 545 | CONFIG_BT_HIDP=m | ||
| 546 | |||
| 547 | # | ||
| 548 | # Bluetooth device drivers | ||
| 549 | # | ||
| 550 | CONFIG_BT_HCIUSB=m | ||
| 551 | # CONFIG_BT_HCIUSB_SCO is not set | ||
| 552 | CONFIG_BT_HCIUART=m | ||
| 553 | CONFIG_BT_HCIUART_H4=y | ||
| 554 | CONFIG_BT_HCIUART_BCSP=y | ||
| 555 | # CONFIG_BT_HCIUART_LL is not set | ||
| 556 | CONFIG_BT_HCIBCM203X=m | ||
| 557 | CONFIG_BT_HCIBPA10X=m | ||
| 558 | CONFIG_BT_HCIBFUSB=m | ||
| 559 | CONFIG_BT_HCIVHCI=m | ||
| 560 | # CONFIG_AF_RXRPC is not set | ||
| 561 | |||
| 562 | # | ||
| 563 | # Wireless | ||
| 564 | # | ||
| 565 | # CONFIG_CFG80211 is not set | ||
| 566 | CONFIG_WIRELESS_EXT=y | ||
| 567 | # CONFIG_MAC80211 is not set | ||
| 568 | CONFIG_IEEE80211=m | ||
| 569 | # CONFIG_IEEE80211_DEBUG is not set | ||
| 570 | CONFIG_IEEE80211_CRYPT_WEP=m | ||
| 571 | CONFIG_IEEE80211_CRYPT_CCMP=m | ||
| 572 | CONFIG_IEEE80211_CRYPT_TKIP=m | ||
| 573 | CONFIG_IEEE80211_SOFTMAC=m | ||
| 574 | # CONFIG_IEEE80211_SOFTMAC_DEBUG is not set | ||
| 575 | # CONFIG_RFKILL is not set | ||
| 576 | # CONFIG_NET_9P is not set | ||
| 577 | |||
| 578 | # | ||
| 579 | # Device Drivers | ||
| 580 | # | ||
| 581 | |||
| 582 | # | ||
| 583 | # Generic Driver Options | ||
| 584 | # | ||
| 585 | CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" | ||
| 586 | CONFIG_STANDALONE=y | ||
| 587 | CONFIG_PREVENT_FIRMWARE_BUILD=y | ||
| 588 | CONFIG_FW_LOADER=y | ||
| 589 | # CONFIG_SYS_HYPERVISOR is not set | ||
| 590 | CONFIG_CONNECTOR=y | ||
| 591 | CONFIG_PROC_EVENTS=y | ||
| 592 | # CONFIG_MTD is not set | ||
| 593 | CONFIG_PARPORT=y | ||
| 594 | CONFIG_PARPORT_PC=y | ||
| 595 | # CONFIG_PARPORT_SERIAL is not set | ||
| 596 | # CONFIG_PARPORT_PC_FIFO is not set | ||
| 597 | # CONFIG_PARPORT_PC_SUPERIO is not set | ||
| 598 | # CONFIG_PARPORT_GSC is not set | ||
| 599 | # CONFIG_PARPORT_AX88796 is not set | ||
| 600 | # CONFIG_PARPORT_1284 is not set | ||
| 601 | CONFIG_PNP=y | ||
| 602 | # CONFIG_PNP_DEBUG is not set | ||
| 603 | |||
| 604 | # | ||
| 605 | # Protocols | ||
| 606 | # | ||
| 607 | # CONFIG_ISAPNP is not set | ||
| 608 | # CONFIG_PNPBIOS is not set | ||
| 609 | CONFIG_PNPACPI=y | ||
| 610 | CONFIG_BLK_DEV=y | ||
| 611 | CONFIG_BLK_DEV_FD=y | ||
| 612 | # CONFIG_BLK_DEV_XD is not set | ||
| 613 | # CONFIG_PARIDE is not set | ||
| 614 | # CONFIG_BLK_CPQ_DA is not set | ||
| 615 | # CONFIG_BLK_CPQ_CISS_DA is not set | ||
| 616 | # CONFIG_BLK_DEV_DAC960 is not set | ||
| 617 | # CONFIG_BLK_DEV_UMEM is not set | ||
| 618 | # CONFIG_BLK_DEV_COW_COMMON is not set | ||
| 619 | CONFIG_BLK_DEV_LOOP=y | ||
| 620 | # CONFIG_BLK_DEV_CRYPTOLOOP is not set | ||
| 621 | # CONFIG_BLK_DEV_NBD is not set | ||
| 622 | # CONFIG_BLK_DEV_SX8 is not set | ||
| 623 | # CONFIG_BLK_DEV_UB is not set | ||
| 624 | CONFIG_BLK_DEV_RAM=y | ||
| 625 | CONFIG_BLK_DEV_RAM_COUNT=16 | ||
| 626 | CONFIG_BLK_DEV_RAM_SIZE=65536 | ||
| 627 | CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024 | ||
| 628 | # CONFIG_CDROM_PKTCDVD is not set | ||
| 629 | # CONFIG_ATA_OVER_ETH is not set | ||
| 630 | CONFIG_MISC_DEVICES=y | ||
| 631 | # CONFIG_IBM_ASM is not set | ||
| 632 | # CONFIG_PHANTOM is not set | ||
| 633 | # CONFIG_EEPROM_93CX6 is not set | ||
| 634 | # CONFIG_SGI_IOC4 is not set | ||
| 635 | # CONFIG_TIFM_CORE is not set | ||
| 636 | # CONFIG_ASUS_LAPTOP is not set | ||
| 637 | # CONFIG_FUJITSU_LAPTOP is not set | ||
| 638 | # CONFIG_MSI_LAPTOP is not set | ||
| 639 | # CONFIG_SONY_LAPTOP is not set | ||
| 640 | # CONFIG_THINKPAD_ACPI is not set | ||
| 641 | CONFIG_IDE=y | ||
| 642 | CONFIG_IDE_MAX_HWIFS=4 | ||
| 643 | CONFIG_BLK_DEV_IDE=y | ||
| 644 | |||
| 645 | # | ||
| 646 | # Please see Documentation/ide.txt for help/info on IDE drives | ||
| 647 | # | ||
| 648 | # CONFIG_BLK_DEV_IDE_SATA is not set | ||
| 649 | # CONFIG_BLK_DEV_HD_IDE is not set | ||
| 650 | CONFIG_BLK_DEV_IDEDISK=y | ||
| 651 | CONFIG_IDEDISK_MULTI_MODE=y | ||
| 652 | CONFIG_BLK_DEV_IDECD=y | ||
| 653 | # CONFIG_BLK_DEV_IDETAPE is not set | ||
| 654 | # CONFIG_BLK_DEV_IDEFLOPPY is not set | ||
| 655 | # CONFIG_BLK_DEV_IDESCSI is not set | ||
| 656 | # CONFIG_BLK_DEV_IDEACPI is not set | ||
| 657 | # CONFIG_IDE_TASK_IOCTL is not set | ||
| 658 | CONFIG_IDE_PROC_FS=y | ||
| 659 | |||
| 660 | # | ||
| 661 | # IDE chipset support/bugfixes | ||
| 662 | # | ||
| 663 | CONFIG_IDE_GENERIC=y | ||
| 664 | # CONFIG_BLK_DEV_PLATFORM is not set | ||
| 665 | CONFIG_BLK_DEV_CMD640=y | ||
| 666 | # CONFIG_BLK_DEV_CMD640_ENHANCED is not set | ||
| 667 | # CONFIG_BLK_DEV_IDEPNP is not set | ||
| 668 | |||
| 669 | # | ||
| 670 | # PCI IDE chipsets support | ||
| 671 | # | ||
| 672 | CONFIG_BLK_DEV_IDEPCI=y | ||
| 673 | CONFIG_IDEPCI_SHARE_IRQ=y | ||
| 674 | CONFIG_IDEPCI_PCIBUS_ORDER=y | ||
| 675 | # CONFIG_BLK_DEV_OFFBOARD is not set | ||
| 676 | CONFIG_BLK_DEV_GENERIC=y | ||
| 677 | # CONFIG_BLK_DEV_OPTI621 is not set | ||
| 678 | CONFIG_BLK_DEV_RZ1000=y | ||
| 679 | CONFIG_BLK_DEV_IDEDMA_PCI=y | ||
| 680 | # CONFIG_BLK_DEV_AEC62XX is not set | ||
| 681 | # CONFIG_BLK_DEV_ALI15X3 is not set | ||
| 682 | # CONFIG_BLK_DEV_AMD74XX is not set | ||
| 683 | # CONFIG_BLK_DEV_ATIIXP is not set | ||
| 684 | # CONFIG_BLK_DEV_CMD64X is not set | ||
| 685 | # CONFIG_BLK_DEV_TRIFLEX is not set | ||
| 686 | # CONFIG_BLK_DEV_CY82C693 is not set | ||
| 687 | # CONFIG_BLK_DEV_CS5520 is not set | ||
| 688 | # CONFIG_BLK_DEV_CS5530 is not set | ||
| 689 | # CONFIG_BLK_DEV_CS5535 is not set | ||
| 690 | # CONFIG_BLK_DEV_HPT34X is not set | ||
| 691 | # CONFIG_BLK_DEV_HPT366 is not set | ||
| 692 | # CONFIG_BLK_DEV_JMICRON is not set | ||
| 693 | # CONFIG_BLK_DEV_SC1200 is not set | ||
| 694 | CONFIG_BLK_DEV_PIIX=y | ||
| 695 | # CONFIG_BLK_DEV_IT8213 is not set | ||
| 696 | # CONFIG_BLK_DEV_IT821X is not set | ||
| 697 | # CONFIG_BLK_DEV_NS87415 is not set | ||
| 698 | # CONFIG_BLK_DEV_PDC202XX_OLD is not set | ||
| 699 | # CONFIG_BLK_DEV_PDC202XX_NEW is not set | ||
| 700 | # CONFIG_BLK_DEV_SVWKS is not set | ||
| 701 | # CONFIG_BLK_DEV_SIIMAGE is not set | ||
| 702 | # CONFIG_BLK_DEV_SIS5513 is not set | ||
| 703 | # CONFIG_BLK_DEV_SLC90E66 is not set | ||
| 704 | # CONFIG_BLK_DEV_TRM290 is not set | ||
| 705 | # CONFIG_BLK_DEV_VIA82CXXX is not set | ||
| 706 | # CONFIG_BLK_DEV_TC86C001 is not set | ||
| 707 | # CONFIG_IDE_ARM is not set | ||
| 708 | |||
| 709 | # | ||
| 710 | # Other IDE chipsets support | ||
| 711 | # | ||
| 712 | |||
| 713 | # | ||
| 714 | # Note: most of these also require special kernel boot parameters | ||
| 715 | # | ||
| 716 | # CONFIG_BLK_DEV_4DRIVES is not set | ||
| 717 | # CONFIG_BLK_DEV_ALI14XX is not set | ||
| 718 | # CONFIG_BLK_DEV_DTC2278 is not set | ||
| 719 | # CONFIG_BLK_DEV_HT6560B is not set | ||
| 720 | # CONFIG_BLK_DEV_QD65XX is not set | ||
| 721 | # CONFIG_BLK_DEV_UMC8672 is not set | ||
| 722 | CONFIG_BLK_DEV_IDEDMA=y | ||
| 723 | CONFIG_IDE_ARCH_OBSOLETE_INIT=y | ||
| 724 | # CONFIG_BLK_DEV_HD is not set | ||
| 725 | |||
| 726 | # | ||
| 727 | # SCSI device support | ||
| 728 | # | ||
| 729 | # CONFIG_RAID_ATTRS is not set | ||
| 730 | CONFIG_SCSI=y | ||
| 731 | CONFIG_SCSI_DMA=y | ||
| 732 | # CONFIG_SCSI_TGT is not set | ||
| 733 | # CONFIG_SCSI_NETLINK is not set | ||
| 734 | CONFIG_SCSI_PROC_FS=y | ||
| 735 | |||
| 736 | # | ||
| 737 | # SCSI support type (disk, tape, CD-ROM) | ||
| 738 | # | ||
| 739 | CONFIG_BLK_DEV_SD=y | ||
| 740 | # CONFIG_CHR_DEV_ST is not set | ||
| 741 | # CONFIG_CHR_DEV_OSST is not set | ||
| 742 | # CONFIG_BLK_DEV_SR is not set | ||
| 743 | CONFIG_CHR_DEV_SG=y | ||
| 744 | # CONFIG_CHR_DEV_SCH is not set | ||
| 745 | |||
| 746 | # | ||
| 747 | # Some SCSI devices (e.g. CD jukebox) support multiple LUNs | ||
| 748 | # | ||
| 749 | CONFIG_SCSI_MULTI_LUN=y | ||
| 750 | # CONFIG_SCSI_CONSTANTS is not set | ||
| 751 | # CONFIG_SCSI_LOGGING is not set | ||
| 752 | # CONFIG_SCSI_SCAN_ASYNC is not set | ||
| 753 | CONFIG_SCSI_WAIT_SCAN=m | ||
| 754 | |||
| 755 | # | ||
| 756 | # SCSI Transports | ||
| 757 | # | ||
| 758 | CONFIG_SCSI_SPI_ATTRS=y | ||
| 759 | # CONFIG_SCSI_FC_ATTRS is not set | ||
| 760 | # CONFIG_SCSI_ISCSI_ATTRS is not set | ||
| 761 | # CONFIG_SCSI_SAS_LIBSAS is not set | ||
| 762 | # CONFIG_SCSI_SRP_ATTRS is not set | ||
| 763 | CONFIG_SCSI_LOWLEVEL=y | ||
| 764 | # CONFIG_ISCSI_TCP is not set | ||
| 765 | # CONFIG_BLK_DEV_3W_XXXX_RAID is not set | ||
| 766 | # CONFIG_SCSI_3W_9XXX is not set | ||
| 767 | # CONFIG_SCSI_7000FASST is not set | ||
| 768 | # CONFIG_SCSI_ACARD is not set | ||
| 769 | # CONFIG_SCSI_AHA152X is not set | ||
| 770 | # CONFIG_SCSI_AHA1542 is not set | ||
| 771 | # CONFIG_SCSI_AACRAID is not set | ||
| 772 | # CONFIG_SCSI_AIC7XXX is not set | ||
| 773 | # CONFIG_SCSI_AIC7XXX_OLD is not set | ||
| 774 | # CONFIG_SCSI_AIC79XX is not set | ||
| 775 | # CONFIG_SCSI_AIC94XX is not set | ||
| 776 | CONFIG_SCSI_DPT_I2O=m | ||
| 777 | # CONFIG_SCSI_ADVANSYS is not set | ||
| 778 | # CONFIG_SCSI_IN2000 is not set | ||
| 779 | # CONFIG_SCSI_ARCMSR is not set | ||
| 780 | # CONFIG_MEGARAID_NEWGEN is not set | ||
| 781 | # CONFIG_MEGARAID_LEGACY is not set | ||
| 782 | # CONFIG_MEGARAID_SAS is not set | ||
| 783 | # CONFIG_SCSI_HPTIOP is not set | ||
| 784 | # CONFIG_SCSI_BUSLOGIC is not set | ||
| 785 | # CONFIG_SCSI_DMX3191D is not set | ||
| 786 | # CONFIG_SCSI_DTC3280 is not set | ||
| 787 | # CONFIG_SCSI_EATA is not set | ||
| 788 | # CONFIG_SCSI_FUTURE_DOMAIN is not set | ||
| 789 | # CONFIG_SCSI_GDTH is not set | ||
| 790 | # CONFIG_SCSI_GENERIC_NCR5380 is not set | ||
| 791 | # CONFIG_SCSI_GENERIC_NCR5380_MMIO is not set | ||
| 792 | # CONFIG_SCSI_IPS is not set | ||
| 793 | # CONFIG_SCSI_INITIO is not set | ||
| 794 | # CONFIG_SCSI_INIA100 is not set | ||
| 795 | # CONFIG_SCSI_PPA is not set | ||
| 796 | # CONFIG_SCSI_IMM is not set | ||
| 797 | # CONFIG_SCSI_NCR53C406A is not set | ||
| 798 | # CONFIG_SCSI_STEX is not set | ||
| 799 | # CONFIG_SCSI_SYM53C8XX_2 is not set | ||
| 800 | # CONFIG_SCSI_PAS16 is not set | ||
| 801 | # CONFIG_SCSI_PSI240I is not set | ||
| 802 | # CONFIG_SCSI_QLOGIC_FAS is not set | ||
| 803 | # CONFIG_SCSI_QLOGIC_1280 is not set | ||
| 804 | # CONFIG_SCSI_QLA_FC is not set | ||
| 805 | # CONFIG_SCSI_QLA_ISCSI is not set | ||
| 806 | # CONFIG_SCSI_LPFC is not set | ||
| 807 | # CONFIG_SCSI_SEAGATE is not set | ||
| 808 | # CONFIG_SCSI_SYM53C416 is not set | ||
| 809 | # CONFIG_SCSI_DC395x is not set | ||
| 810 | # CONFIG_SCSI_DC390T is not set | ||
| 811 | # CONFIG_SCSI_T128 is not set | ||
| 812 | # CONFIG_SCSI_U14_34F is not set | ||
| 813 | # CONFIG_SCSI_ULTRASTOR is not set | ||
| 814 | # CONFIG_SCSI_NSP32 is not set | ||
| 815 | # CONFIG_SCSI_DEBUG is not set | ||
| 816 | # CONFIG_SCSI_SRP is not set | ||
| 817 | # CONFIG_ATA is not set | ||
| 818 | CONFIG_MD=y | ||
| 819 | # CONFIG_BLK_DEV_MD is not set | ||
| 820 | CONFIG_BLK_DEV_DM=m | ||
| 821 | # CONFIG_DM_DEBUG is not set | ||
| 822 | CONFIG_DM_CRYPT=m | ||
| 823 | CONFIG_DM_SNAPSHOT=m | ||
| 824 | CONFIG_DM_MIRROR=m | ||
| 825 | CONFIG_DM_ZERO=m | ||
| 826 | CONFIG_DM_MULTIPATH=m | ||
| 827 | CONFIG_DM_MULTIPATH_EMC=m | ||
| 828 | # CONFIG_DM_MULTIPATH_RDAC is not set | ||
| 829 | # CONFIG_DM_MULTIPATH_HP is not set | ||
| 830 | # CONFIG_DM_DELAY is not set | ||
| 831 | # CONFIG_DM_UEVENT is not set | ||
| 832 | # CONFIG_FUSION is not set | ||
| 833 | |||
| 834 | # | ||
| 835 | # IEEE 1394 (FireWire) support | ||
| 836 | # | ||
| 837 | # CONFIG_FIREWIRE is not set | ||
| 838 | # CONFIG_IEEE1394 is not set | ||
| 839 | # CONFIG_I2O is not set | ||
| 840 | # CONFIG_MACINTOSH_DRIVERS is not set | ||
| 841 | CONFIG_NETDEVICES=y | ||
| 842 | # CONFIG_NETDEVICES_MULTIQUEUE is not set | ||
| 843 | # CONFIG_DUMMY is not set | ||
| 844 | # CONFIG_BONDING is not set | ||
| 845 | # CONFIG_MACVLAN is not set | ||
| 846 | # CONFIG_EQUALIZER is not set | ||
| 847 | CONFIG_TUN=m | ||
| 848 | # CONFIG_VETH is not set | ||
| 849 | # CONFIG_NET_SB1000 is not set | ||
| 850 | # CONFIG_ARCNET is not set | ||
| 851 | # CONFIG_PHYLIB is not set | ||
| 852 | CONFIG_NET_ETHERNET=y | ||
| 853 | CONFIG_MII=y | ||
| 854 | # CONFIG_HAPPYMEAL is not set | ||
| 855 | # CONFIG_SUNGEM is not set | ||
| 856 | # CONFIG_CASSINI is not set | ||
| 857 | CONFIG_NET_VENDOR_3COM=y | ||
| 858 | # CONFIG_EL1 is not set | ||
| 859 | # CONFIG_EL2 is not set | ||
| 860 | # CONFIG_ELPLUS is not set | ||
| 861 | # CONFIG_EL16 is not set | ||
| 862 | # CONFIG_EL3 is not set | ||
| 863 | # CONFIG_3C515 is not set | ||
| 864 | CONFIG_VORTEX=m | ||
| 865 | CONFIG_TYPHOON=m | ||
| 866 | CONFIG_LANCE=m | ||
| 867 | CONFIG_NET_VENDOR_SMC=y | ||
| 868 | CONFIG_WD80x3=m | ||
| 869 | CONFIG_ULTRA=m | ||
| 870 | CONFIG_SMC9194=m | ||
| 871 | # CONFIG_NET_VENDOR_RACAL is not set | ||
| 872 | CONFIG_NET_TULIP=y | ||
| 873 | # CONFIG_DE2104X is not set | ||
| 874 | CONFIG_TULIP=m | ||
| 875 | CONFIG_TULIP_MWI=y | ||
| 876 | CONFIG_TULIP_MMIO=y | ||
| 877 | CONFIG_TULIP_NAPI=y | ||
| 878 | CONFIG_TULIP_NAPI_HW_MITIGATION=y | ||
| 879 | CONFIG_DE4X5=m | ||
| 880 | CONFIG_WINBOND_840=m | ||
| 881 | CONFIG_DM9102=m | ||
| 882 | CONFIG_ULI526X=m | ||
| 883 | CONFIG_AT1700=m | ||
| 884 | CONFIG_DEPCA=m | ||
| 885 | CONFIG_HP100=m | ||
| 886 | CONFIG_NET_ISA=y | ||
| 887 | # CONFIG_E2100 is not set | ||
| 888 | # CONFIG_EWRK3 is not set | ||
| 889 | # CONFIG_EEXPRESS is not set | ||
| 890 | # CONFIG_EEXPRESS_PRO is not set | ||
| 891 | # CONFIG_HPLAN_PLUS is not set | ||
| 892 | # CONFIG_HPLAN is not set | ||
| 893 | # CONFIG_LP486E is not set | ||
| 894 | # CONFIG_ETH16I is not set | ||
| 895 | CONFIG_NE2000=y | ||
| 896 | # CONFIG_ZNET is not set | ||
| 897 | # CONFIG_SEEQ8005 is not set | ||
| 898 | # CONFIG_IBM_NEW_EMAC_ZMII is not set | ||
| 899 | # CONFIG_IBM_NEW_EMAC_RGMII is not set | ||
| 900 | # CONFIG_IBM_NEW_EMAC_TAH is not set | ||
| 901 | # CONFIG_IBM_NEW_EMAC_EMAC4 is not set | ||
| 902 | CONFIG_NET_PCI=y | ||
| 903 | CONFIG_PCNET32=m | ||
| 904 | CONFIG_PCNET32_NAPI=y | ||
| 905 | CONFIG_AMD8111_ETH=m | ||
| 906 | CONFIG_AMD8111E_NAPI=y | ||
| 907 | CONFIG_ADAPTEC_STARFIRE=m | ||
| 908 | CONFIG_ADAPTEC_STARFIRE_NAPI=y | ||
| 909 | CONFIG_AC3200=m | ||
| 910 | CONFIG_APRICOT=m | ||
| 911 | CONFIG_B44=m | ||
| 912 | CONFIG_B44_PCI_AUTOSELECT=y | ||
| 913 | CONFIG_B44_PCICORE_AUTOSELECT=y | ||
| 914 | CONFIG_B44_PCI=y | ||
| 915 | CONFIG_FORCEDETH=m | ||
| 916 | CONFIG_FORCEDETH_NAPI=y | ||
| 917 | CONFIG_CS89x0=m | ||
| 918 | CONFIG_EEPRO100=m | ||
| 919 | CONFIG_E100=m | ||
| 920 | CONFIG_FEALNX=m | ||
| 921 | CONFIG_NATSEMI=m | ||
| 922 | CONFIG_NE2K_PCI=y | ||
| 923 | # CONFIG_8139CP is not set | ||
| 924 | CONFIG_8139TOO=y | ||
| 925 | CONFIG_8139TOO_PIO=y | ||
| 926 | # CONFIG_8139TOO_TUNE_TWISTER is not set | ||
| 927 | # CONFIG_8139TOO_8129 is not set | ||
| 928 | # CONFIG_8139_OLD_RX_RESET is not set | ||
| 929 | CONFIG_SIS900=m | ||
| 930 | CONFIG_EPIC100=m | ||
| 931 | CONFIG_SUNDANCE=m | ||
| 932 | CONFIG_SUNDANCE_MMIO=y | ||
| 933 | CONFIG_TLAN=m | ||
| 934 | CONFIG_VIA_RHINE=m | ||
| 935 | CONFIG_VIA_RHINE_MMIO=y | ||
| 936 | CONFIG_VIA_RHINE_NAPI=y | ||
| 937 | CONFIG_SC92031=m | ||
| 938 | # CONFIG_NET_POCKET is not set | ||
| 939 | CONFIG_NETDEV_1000=y | ||
| 940 | CONFIG_ACENIC=m | ||
| 941 | CONFIG_ACENIC_OMIT_TIGON_I=y | ||
| 942 | CONFIG_DL2K=m | ||
| 943 | CONFIG_E1000=m | ||
| 944 | CONFIG_E1000_NAPI=y | ||
| 945 | # CONFIG_E1000_DISABLE_PACKET_SPLIT is not set | ||
| 946 | # CONFIG_E1000E is not set | ||
| 947 | # CONFIG_IP1000 is not set | ||
| 948 | CONFIG_NS83820=m | ||
| 949 | CONFIG_HAMACHI=m | ||
| 950 | CONFIG_YELLOWFIN=m | ||
| 951 | CONFIG_R8169=m | ||
| 952 | CONFIG_R8169_NAPI=y | ||
| 953 | CONFIG_SIS190=m | ||
| 954 | CONFIG_SKGE=m | ||
| 955 | CONFIG_SKY2=m | ||
| 956 | CONFIG_SK98LIN=m | ||
| 957 | CONFIG_VIA_VELOCITY=m | ||
| 958 | CONFIG_TIGON3=m | ||
| 959 | CONFIG_BNX2=m | ||
| 960 | CONFIG_QLA3XXX=m | ||
| 961 | CONFIG_ATL1=m | ||
| 962 | CONFIG_NETDEV_10000=y | ||
| 963 | # CONFIG_CHELSIO_T1 is not set | ||
| 964 | # CONFIG_CHELSIO_T3 is not set | ||
| 965 | # CONFIG_IXGBE is not set | ||
| 966 | # CONFIG_IXGB is not set | ||
| 967 | CONFIG_S2IO=m | ||
| 968 | # CONFIG_S2IO_NAPI is not set | ||
| 969 | # CONFIG_MYRI10GE is not set | ||
| 970 | # CONFIG_NETXEN_NIC is not set | ||
| 971 | # CONFIG_NIU is not set | ||
| 972 | # CONFIG_MLX4_CORE is not set | ||
| 973 | # CONFIG_TEHUTI is not set | ||
| 974 | # CONFIG_TR is not set | ||
| 975 | |||
| 976 | # | ||
| 977 | # Wireless LAN | ||
| 978 | # | ||
| 979 | # CONFIG_WLAN_PRE80211 is not set | ||
| 980 | CONFIG_WLAN_80211=y | ||
| 981 | # CONFIG_IPW2100 is not set | ||
| 982 | # CONFIG_IPW2200 is not set | ||
| 983 | # CONFIG_LIBERTAS is not set | ||
| 984 | # CONFIG_AIRO is not set | ||
| 985 | CONFIG_HERMES=m | ||
| 986 | # CONFIG_PLX_HERMES is not set | ||
| 987 | # CONFIG_TMD_HERMES is not set | ||
| 988 | # CONFIG_NORTEL_HERMES is not set | ||
| 989 | # CONFIG_PCI_HERMES is not set | ||
| 990 | # CONFIG_ATMEL is not set | ||
| 991 | # CONFIG_PRISM54 is not set | ||
| 992 | # CONFIG_USB_ZD1201 is not set | ||
| 993 | CONFIG_HOSTAP=m | ||
| 994 | CONFIG_HOSTAP_FIRMWARE=y | ||
| 995 | # CONFIG_HOSTAP_FIRMWARE_NVRAM is not set | ||
| 996 | # CONFIG_HOSTAP_PLX is not set | ||
| 997 | # CONFIG_HOSTAP_PCI is not set | ||
| 998 | # CONFIG_BCM43XX is not set | ||
| 999 | # CONFIG_ZD1211RW is not set | ||
| 1000 | |||
| 1001 | # | ||
| 1002 | # USB Network Adapters | ||
| 1003 | # | ||
| 1004 | # CONFIG_USB_CATC is not set | ||
| 1005 | # CONFIG_USB_KAWETH is not set | ||
| 1006 | # CONFIG_USB_PEGASUS is not set | ||
| 1007 | # CONFIG_USB_RTL8150 is not set | ||
| 1008 | # CONFIG_USB_USBNET is not set | ||
| 1009 | # CONFIG_WAN is not set | ||
| 1010 | # CONFIG_FDDI is not set | ||
| 1011 | # CONFIG_HIPPI is not set | ||
| 1012 | # CONFIG_PLIP is not set | ||
| 1013 | CONFIG_PPP=m | ||
| 1014 | # CONFIG_PPP_MULTILINK is not set | ||
| 1015 | # CONFIG_PPP_FILTER is not set | ||
| 1016 | CONFIG_PPP_ASYNC=m | ||
| 1017 | # CONFIG_PPP_SYNC_TTY is not set | ||
| 1018 | CONFIG_PPP_DEFLATE=m | ||
| 1019 | CONFIG_PPP_BSDCOMP=m | ||
| 1020 | # CONFIG_PPP_MPPE is not set | ||
| 1021 | # CONFIG_PPPOE is not set | ||
| 1022 | # CONFIG_PPPOL2TP is not set | ||
| 1023 | # CONFIG_SLIP is not set | ||
| 1024 | CONFIG_SLHC=m | ||
| 1025 | # CONFIG_NET_FC is not set | ||
| 1026 | # CONFIG_SHAPER is not set | ||
| 1027 | # CONFIG_NETCONSOLE is not set | ||
| 1028 | # CONFIG_NETPOLL is not set | ||
| 1029 | # CONFIG_NET_POLL_CONTROLLER is not set | ||
| 1030 | # CONFIG_ISDN is not set | ||
| 1031 | # CONFIG_PHONE is not set | ||
| 1032 | |||
| 1033 | # | ||
| 1034 | # Input device support | ||
| 1035 | # | ||
| 1036 | CONFIG_INPUT=y | ||
| 1037 | # CONFIG_INPUT_FF_MEMLESS is not set | ||
| 1038 | # CONFIG_INPUT_POLLDEV is not set | ||
| 1039 | |||
| 1040 | # | ||
| 1041 | # Userland interfaces | ||
| 1042 | # | ||
| 1043 | CONFIG_INPUT_MOUSEDEV=m | ||
| 1044 | # CONFIG_INPUT_MOUSEDEV_PSAUX is not set | ||
| 1045 | CONFIG_INPUT_MOUSEDEV_SCREEN_X=640 | ||
| 1046 | CONFIG_INPUT_MOUSEDEV_SCREEN_Y=480 | ||
| 1047 | # CONFIG_INPUT_JOYDEV is not set | ||
| 1048 | CONFIG_INPUT_EVDEV=y | ||
| 1049 | # CONFIG_INPUT_EVBUG is not set | ||
| 1050 | |||
| 1051 | # | ||
| 1052 | # Input Device Drivers | ||
| 1053 | # | ||
| 1054 | CONFIG_INPUT_KEYBOARD=y | ||
| 1055 | CONFIG_KEYBOARD_ATKBD=y | ||
| 1056 | # CONFIG_KEYBOARD_SUNKBD is not set | ||
| 1057 | # CONFIG_KEYBOARD_LKKBD is not set | ||
| 1058 | # CONFIG_KEYBOARD_XTKBD is not set | ||
| 1059 | # CONFIG_KEYBOARD_NEWTON is not set | ||
| 1060 | # CONFIG_KEYBOARD_STOWAWAY is not set | ||
| 1061 | CONFIG_INPUT_MOUSE=y | ||
| 1062 | CONFIG_MOUSE_PS2=m | ||
| 1063 | CONFIG_MOUSE_PS2_ALPS=y | ||
| 1064 | CONFIG_MOUSE_PS2_LOGIPS2PP=y | ||
| 1065 | CONFIG_MOUSE_PS2_SYNAPTICS=y | ||
| 1066 | CONFIG_MOUSE_PS2_LIFEBOOK=y | ||
| 1067 | CONFIG_MOUSE_PS2_TRACKPOINT=y | ||
| 1068 | # CONFIG_MOUSE_PS2_TOUCHKIT is not set | ||
| 1069 | # CONFIG_MOUSE_SERIAL is not set | ||
| 1070 | # CONFIG_MOUSE_APPLETOUCH is not set | ||
| 1071 | # CONFIG_MOUSE_INPORT is not set | ||
| 1072 | # CONFIG_MOUSE_LOGIBM is not set | ||
| 1073 | # CONFIG_MOUSE_PC110PAD is not set | ||
| 1074 | # CONFIG_MOUSE_VSXXXAA is not set | ||
| 1075 | # CONFIG_INPUT_JOYSTICK is not set | ||
| 1076 | CONFIG_INPUT_TABLET=y | ||
| 1077 | # CONFIG_TABLET_USB_ACECAD is not set | ||
| 1078 | # CONFIG_TABLET_USB_AIPTEK is not set | ||
| 1079 | # CONFIG_TABLET_USB_GTCO is not set | ||
| 1080 | # CONFIG_TABLET_USB_KBTAB is not set | ||
| 1081 | CONFIG_TABLET_USB_WACOM=y | ||
| 1082 | # CONFIG_INPUT_TOUCHSCREEN is not set | ||
| 1083 | CONFIG_INPUT_MISC=y | ||
| 1084 | # CONFIG_INPUT_PCSPKR is not set | ||
| 1085 | # CONFIG_INPUT_WISTRON_BTNS is not set | ||
| 1086 | # CONFIG_INPUT_ATLAS_BTNS is not set | ||
| 1087 | # CONFIG_INPUT_ATI_REMOTE is not set | ||
| 1088 | # CONFIG_INPUT_ATI_REMOTE2 is not set | ||
| 1089 | # CONFIG_INPUT_KEYSPAN_REMOTE is not set | ||
| 1090 | # CONFIG_INPUT_POWERMATE is not set | ||
| 1091 | # CONFIG_INPUT_YEALINK is not set | ||
| 1092 | CONFIG_INPUT_UINPUT=m | ||
| 1093 | |||
| 1094 | # | ||
| 1095 | # Hardware I/O ports | ||
| 1096 | # | ||
| 1097 | CONFIG_SERIO=y | ||
| 1098 | CONFIG_SERIO_I8042=y | ||
| 1099 | # CONFIG_SERIO_SERPORT is not set | ||
| 1100 | # CONFIG_SERIO_CT82C710 is not set | ||
| 1101 | # CONFIG_SERIO_PARKBD is not set | ||
| 1102 | # CONFIG_SERIO_PCIPS2 is not set | ||
| 1103 | CONFIG_SERIO_LIBPS2=y | ||
| 1104 | # CONFIG_SERIO_RAW is not set | ||
| 1105 | # CONFIG_GAMEPORT is not set | ||
| 1106 | |||
| 1107 | # | ||
| 1108 | # Character devices | ||
| 1109 | # | ||
| 1110 | CONFIG_VT=y | ||
| 1111 | CONFIG_VT_CONSOLE=y | ||
| 1112 | CONFIG_HW_CONSOLE=y | ||
| 1113 | # CONFIG_VT_HW_CONSOLE_BINDING is not set | ||
| 1114 | # CONFIG_SERIAL_NONSTANDARD is not set | ||
| 1115 | |||
| 1116 | # | ||
| 1117 | # Serial drivers | ||
| 1118 | # | ||
| 1119 | CONFIG_SERIAL_8250=y | ||
| 1120 | # CONFIG_SERIAL_8250_CONSOLE is not set | ||
| 1121 | CONFIG_FIX_EARLYCON_MEM=y | ||
| 1122 | CONFIG_SERIAL_8250_PCI=y | ||
| 1123 | CONFIG_SERIAL_8250_PNP=y | ||
| 1124 | CONFIG_SERIAL_8250_NR_UARTS=4 | ||
| 1125 | CONFIG_SERIAL_8250_RUNTIME_UARTS=4 | ||
| 1126 | # CONFIG_SERIAL_8250_EXTENDED is not set | ||
| 1127 | |||
| 1128 | # | ||
| 1129 | # Non-8250 serial port support | ||
| 1130 | # | ||
| 1131 | CONFIG_SERIAL_CORE=y | ||
| 1132 | # CONFIG_SERIAL_JSM is not set | ||
| 1133 | CONFIG_UNIX98_PTYS=y | ||
| 1134 | # CONFIG_LEGACY_PTYS is not set | ||
| 1135 | CONFIG_PRINTER=y | ||
| 1136 | # CONFIG_LP_CONSOLE is not set | ||
| 1137 | # CONFIG_PPDEV is not set | ||
| 1138 | # CONFIG_IPMI_HANDLER is not set | ||
| 1139 | # CONFIG_HW_RANDOM is not set | ||
| 1140 | # CONFIG_NVRAM is not set | ||
| 1141 | # CONFIG_RTC is not set | ||
| 1142 | # CONFIG_GEN_RTC is not set | ||
| 1143 | # CONFIG_DTLK is not set | ||
| 1144 | # CONFIG_R3964 is not set | ||
| 1145 | # CONFIG_APPLICOM is not set | ||
| 1146 | # CONFIG_SONYPI is not set | ||
| 1147 | # CONFIG_MWAVE is not set | ||
| 1148 | # CONFIG_PC8736x_GPIO is not set | ||
| 1149 | # CONFIG_NSC_GPIO is not set | ||
| 1150 | # CONFIG_CS5535_GPIO is not set | ||
| 1151 | # CONFIG_RAW_DRIVER is not set | ||
| 1152 | # CONFIG_HPET is not set | ||
| 1153 | # CONFIG_HANGCHECK_TIMER is not set | ||
| 1154 | # CONFIG_TCG_TPM is not set | ||
| 1155 | # CONFIG_TELCLOCK is not set | ||
| 1156 | CONFIG_DEVPORT=y | ||
| 1157 | # CONFIG_I2C is not set | ||
| 1158 | |||
| 1159 | # | ||
| 1160 | # SPI support | ||
| 1161 | # | ||
| 1162 | # CONFIG_SPI is not set | ||
| 1163 | # CONFIG_SPI_MASTER is not set | ||
| 1164 | # CONFIG_W1 is not set | ||
| 1165 | CONFIG_POWER_SUPPLY=y | ||
| 1166 | # CONFIG_POWER_SUPPLY_DEBUG is not set | ||
| 1167 | # CONFIG_PDA_POWER is not set | ||
| 1168 | # CONFIG_BATTERY_DS2760 is not set | ||
| 1169 | # CONFIG_HWMON is not set | ||
| 1170 | # CONFIG_WATCHDOG is not set | ||
| 1171 | |||
| 1172 | # | ||
| 1173 | # Sonics Silicon Backplane | ||
| 1174 | # | ||
| 1175 | CONFIG_SSB_POSSIBLE=y | ||
| 1176 | CONFIG_SSB=m | ||
| 1177 | CONFIG_SSB_PCIHOST_POSSIBLE=y | ||
| 1178 | CONFIG_SSB_PCIHOST=y | ||
| 1179 | # CONFIG_SSB_SILENT is not set | ||
| 1180 | # CONFIG_SSB_DEBUG is not set | ||
| 1181 | CONFIG_SSB_DRIVER_PCICORE_POSSIBLE=y | ||
| 1182 | CONFIG_SSB_DRIVER_PCICORE=y | ||
| 1183 | |||
| 1184 | # | ||
| 1185 | # Multifunction device drivers | ||
| 1186 | # | ||
| 1187 | # CONFIG_MFD_SM501 is not set | ||
| 1188 | # CONFIG_HTC_ASIC3 is not set | ||
| 1189 | # CONFIG_HTC_ASIC3_DS1WM is not set | ||
| 1190 | |||
| 1191 | # | ||
| 1192 | # Multimedia devices | ||
| 1193 | # | ||
| 1194 | CONFIG_VIDEO_DEV=m | ||
| 1195 | CONFIG_VIDEO_V4L1=y | ||
| 1196 | CONFIG_VIDEO_V4L1_COMPAT=y | ||
| 1197 | CONFIG_VIDEO_V4L2=y | ||
| 1198 | CONFIG_VIDEO_CAPTURE_DRIVERS=y | ||
| 1199 | # CONFIG_VIDEO_ADV_DEBUG is not set | ||
| 1200 | CONFIG_VIDEO_HELPER_CHIPS_AUTO=y | ||
| 1201 | # CONFIG_VIDEO_VIVI is not set | ||
| 1202 | # CONFIG_VIDEO_PMS is not set | ||
| 1203 | # CONFIG_VIDEO_BWQCAM is not set | ||
| 1204 | # CONFIG_VIDEO_CQCAM is not set | ||
| 1205 | # CONFIG_VIDEO_CPIA is not set | ||
| 1206 | # CONFIG_VIDEO_CPIA2 is not set | ||
| 1207 | # CONFIG_VIDEO_STRADIS is not set | ||
| 1208 | CONFIG_V4L_USB_DRIVERS=y | ||
| 1209 | # CONFIG_USB_VICAM is not set | ||
| 1210 | # CONFIG_USB_IBMCAM is not set | ||
| 1211 | # CONFIG_USB_KONICAWC is not set | ||
| 1212 | # CONFIG_USB_QUICKCAM_MESSENGER is not set | ||
| 1213 | # CONFIG_USB_ET61X251 is not set | ||
| 1214 | CONFIG_USB_OV511=m | ||
| 1215 | CONFIG_USB_SE401=m | ||
| 1216 | CONFIG_USB_SN9C102=m | ||
| 1217 | CONFIG_USB_STV680=m | ||
| 1218 | # CONFIG_USB_ZC0301 is not set | ||
| 1219 | # CONFIG_USB_PWC is not set | ||
| 1220 | # CONFIG_USB_ZR364XX is not set | ||
| 1221 | CONFIG_RADIO_ADAPTERS=y | ||
| 1222 | # CONFIG_RADIO_CADET is not set | ||
| 1223 | # CONFIG_RADIO_RTRACK is not set | ||
| 1224 | # CONFIG_RADIO_RTRACK2 is not set | ||
| 1225 | # CONFIG_RADIO_AZTECH is not set | ||
| 1226 | # CONFIG_RADIO_GEMTEK is not set | ||
| 1227 | # CONFIG_RADIO_GEMTEK_PCI is not set | ||
| 1228 | # CONFIG_RADIO_MAXIRADIO is not set | ||
| 1229 | # CONFIG_RADIO_MAESTRO is not set | ||
| 1230 | # CONFIG_RADIO_SF16FMI is not set | ||
| 1231 | # CONFIG_RADIO_SF16FMR2 is not set | ||
| 1232 | # CONFIG_RADIO_TERRATEC is not set | ||
| 1233 | # CONFIG_RADIO_TRUST is not set | ||
| 1234 | # CONFIG_RADIO_TYPHOON is not set | ||
| 1235 | # CONFIG_RADIO_ZOLTRIX is not set | ||
| 1236 | CONFIG_USB_DSBR=m | ||
| 1237 | # CONFIG_DVB_CORE is not set | ||
| 1238 | CONFIG_DAB=y | ||
| 1239 | # CONFIG_USB_DABUSB is not set | ||
| 1240 | |||
| 1241 | # | ||
| 1242 | # Graphics support | ||
| 1243 | # | ||
| 1244 | CONFIG_AGP=m | ||
| 1245 | CONFIG_AGP_ALI=m | ||
| 1246 | CONFIG_AGP_ATI=m | ||
| 1247 | CONFIG_AGP_AMD=m | ||
| 1248 | CONFIG_AGP_AMD64=m | ||
| 1249 | CONFIG_AGP_INTEL=m | ||
| 1250 | CONFIG_AGP_NVIDIA=m | ||
| 1251 | CONFIG_AGP_SIS=m | ||
| 1252 | CONFIG_AGP_SWORKS=m | ||
| 1253 | CONFIG_AGP_VIA=m | ||
| 1254 | CONFIG_AGP_EFFICEON=m | ||
| 1255 | CONFIG_DRM=m | ||
| 1256 | # CONFIG_DRM_TDFX is not set | ||
| 1257 | # CONFIG_DRM_R128 is not set | ||
| 1258 | # CONFIG_DRM_RADEON is not set | ||
| 1259 | # CONFIG_DRM_I810 is not set | ||
| 1260 | # CONFIG_DRM_I830 is not set | ||
| 1261 | # CONFIG_DRM_I915 is not set | ||
| 1262 | # CONFIG_DRM_MGA is not set | ||
| 1263 | # CONFIG_DRM_SIS is not set | ||
| 1264 | # CONFIG_DRM_VIA is not set | ||
| 1265 | # CONFIG_DRM_SAVAGE is not set | ||
| 1266 | # CONFIG_VGASTATE is not set | ||
| 1267 | CONFIG_VIDEO_OUTPUT_CONTROL=m | ||
| 1268 | CONFIG_FB=y | ||
| 1269 | # CONFIG_FIRMWARE_EDID is not set | ||
| 1270 | # CONFIG_FB_DDC is not set | ||
| 1271 | CONFIG_FB_CFB_FILLRECT=m | ||
| 1272 | CONFIG_FB_CFB_COPYAREA=m | ||
| 1273 | CONFIG_FB_CFB_IMAGEBLIT=m | ||
| 1274 | # CONFIG_FB_CFB_REV_PIXELS_IN_BYTE is not set | ||
| 1275 | # CONFIG_FB_SYS_FILLRECT is not set | ||
| 1276 | # CONFIG_FB_SYS_COPYAREA is not set | ||
| 1277 | # CONFIG_FB_SYS_IMAGEBLIT is not set | ||
| 1278 | # CONFIG_FB_SYS_FOPS is not set | ||
| 1279 | # CONFIG_FB_DEFERRED_IO is not set | ||
| 1280 | # CONFIG_FB_SVGALIB is not set | ||
| 1281 | # CONFIG_FB_MACMODES is not set | ||
| 1282 | # CONFIG_FB_BACKLIGHT is not set | ||
| 1283 | CONFIG_FB_MODE_HELPERS=y | ||
| 1284 | # CONFIG_FB_TILEBLITTING is not set | ||
| 1285 | |||
| 1286 | # | ||
| 1287 | # Frame buffer hardware drivers | ||
| 1288 | # | ||
| 1289 | # CONFIG_FB_CIRRUS is not set | ||
| 1290 | # CONFIG_FB_PM2 is not set | ||
| 1291 | # CONFIG_FB_CYBER2000 is not set | ||
| 1292 | # CONFIG_FB_ARC is not set | ||
| 1293 | # CONFIG_FB_ASILIANT is not set | ||
| 1294 | # CONFIG_FB_IMSTT is not set | ||
| 1295 | # CONFIG_FB_VGA16 is not set | ||
| 1296 | CONFIG_FB_UVESA=m | ||
| 1297 | # CONFIG_FB_VESA is not set | ||
| 1298 | # CONFIG_FB_EFI is not set | ||
| 1299 | # CONFIG_FB_HECUBA is not set | ||
| 1300 | # CONFIG_FB_HGA is not set | ||
| 1301 | # CONFIG_FB_S1D13XXX is not set | ||
| 1302 | # CONFIG_FB_NVIDIA is not set | ||
| 1303 | # CONFIG_FB_RIVA is not set | ||
| 1304 | # CONFIG_FB_I810 is not set | ||
| 1305 | # CONFIG_FB_LE80578 is not set | ||
| 1306 | # CONFIG_FB_INTEL is not set | ||
| 1307 | # CONFIG_FB_MATROX is not set | ||
| 1308 | # CONFIG_FB_RADEON is not set | ||
| 1309 | # CONFIG_FB_ATY128 is not set | ||
| 1310 | # CONFIG_FB_ATY is not set | ||
| 1311 | # CONFIG_FB_S3 is not set | ||
| 1312 | # CONFIG_FB_SAVAGE is not set | ||
| 1313 | # CONFIG_FB_SIS is not set | ||
| 1314 | # CONFIG_FB_NEOMAGIC is not set | ||
| 1315 | # CONFIG_FB_KYRO is not set | ||
| 1316 | # CONFIG_FB_3DFX is not set | ||
| 1317 | # CONFIG_FB_VOODOO1 is not set | ||
| 1318 | # CONFIG_FB_VT8623 is not set | ||
| 1319 | # CONFIG_FB_CYBLA is not set | ||
| 1320 | # CONFIG_FB_TRIDENT is not set | ||
| 1321 | # CONFIG_FB_ARK is not set | ||
| 1322 | # CONFIG_FB_PM3 is not set | ||
| 1323 | # CONFIG_FB_GEODE is not set | ||
| 1324 | # CONFIG_FB_VIRTUAL is not set | ||
| 1325 | CONFIG_BACKLIGHT_LCD_SUPPORT=y | ||
| 1326 | CONFIG_LCD_CLASS_DEVICE=m | ||
| 1327 | CONFIG_BACKLIGHT_CLASS_DEVICE=m | ||
| 1328 | CONFIG_BACKLIGHT_CORGI=m | ||
| 1329 | # CONFIG_BACKLIGHT_PROGEAR is not set | ||
| 1330 | |||
| 1331 | # | ||
| 1332 | # Display device support | ||
| 1333 | # | ||
| 1334 | # CONFIG_DISPLAY_SUPPORT is not set | ||
| 1335 | |||
| 1336 | # | ||
| 1337 | # Console display driver support | ||
| 1338 | # | ||
| 1339 | CONFIG_VGA_CONSOLE=y | ||
| 1340 | # CONFIG_VGACON_SOFT_SCROLLBACK is not set | ||
| 1341 | CONFIG_VIDEO_SELECT=y | ||
| 1342 | # CONFIG_MDA_CONSOLE is not set | ||
| 1343 | CONFIG_DUMMY_CONSOLE=y | ||
| 1344 | CONFIG_FRAMEBUFFER_CONSOLE=y | ||
| 1345 | # CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY is not set | ||
| 1346 | CONFIG_FRAMEBUFFER_CONSOLE_ROTATION=y | ||
| 1347 | CONFIG_FONTS=y | ||
| 1348 | CONFIG_FONT_8x8=y | ||
| 1349 | CONFIG_FONT_8x16=y | ||
| 1350 | # CONFIG_FONT_6x11 is not set | ||
| 1351 | # CONFIG_FONT_7x14 is not set | ||
| 1352 | # CONFIG_FONT_PEARL_8x8 is not set | ||
| 1353 | # CONFIG_FONT_ACORN_8x8 is not set | ||
| 1354 | # CONFIG_FONT_MINI_4x6 is not set | ||
| 1355 | # CONFIG_FONT_SUN8x16 is not set | ||
| 1356 | # CONFIG_FONT_SUN12x22 is not set | ||
| 1357 | # CONFIG_FONT_10x18 is not set | ||
| 1358 | CONFIG_LOGO=y | ||
| 1359 | CONFIG_LOGO_LINUX_MONO=y | ||
| 1360 | CONFIG_LOGO_LINUX_VGA16=y | ||
| 1361 | # CONFIG_LOGO_LINUX_CLUT224 is not set | ||
| 1362 | CONFIG_LOGO_OHAND_CLUT224=y | ||
| 1363 | |||
| 1364 | # | ||
| 1365 | # Sound | ||
| 1366 | # | ||
| 1367 | CONFIG_SOUND=y | ||
| 1368 | |||
| 1369 | # | ||
| 1370 | # Advanced Linux Sound Architecture | ||
| 1371 | # | ||
| 1372 | CONFIG_SND=y | ||
| 1373 | CONFIG_SND_TIMER=y | ||
| 1374 | CONFIG_SND_PCM=y | ||
| 1375 | CONFIG_SND_SEQUENCER=y | ||
| 1376 | # CONFIG_SND_SEQ_DUMMY is not set | ||
| 1377 | CONFIG_SND_OSSEMUL=y | ||
| 1378 | CONFIG_SND_MIXER_OSS=y | ||
| 1379 | CONFIG_SND_PCM_OSS=y | ||
| 1380 | CONFIG_SND_PCM_OSS_PLUGINS=y | ||
| 1381 | CONFIG_SND_SEQUENCER_OSS=y | ||
| 1382 | # CONFIG_SND_DYNAMIC_MINORS is not set | ||
| 1383 | CONFIG_SND_SUPPORT_OLD_API=y | ||
| 1384 | CONFIG_SND_VERBOSE_PROCFS=y | ||
| 1385 | # CONFIG_SND_VERBOSE_PRINTK is not set | ||
| 1386 | # CONFIG_SND_DEBUG is not set | ||
| 1387 | |||
| 1388 | # | ||
| 1389 | # Generic devices | ||
| 1390 | # | ||
| 1391 | CONFIG_SND_AC97_CODEC=y | ||
| 1392 | # CONFIG_SND_DUMMY is not set | ||
| 1393 | # CONFIG_SND_VIRMIDI is not set | ||
| 1394 | # CONFIG_SND_MTPAV is not set | ||
| 1395 | # CONFIG_SND_MTS64 is not set | ||
| 1396 | # CONFIG_SND_SERIAL_U16550 is not set | ||
| 1397 | # CONFIG_SND_MPU401 is not set | ||
| 1398 | # CONFIG_SND_PORTMAN2X4 is not set | ||
| 1399 | |||
| 1400 | # | ||
| 1401 | # ISA devices | ||
| 1402 | # | ||
| 1403 | # CONFIG_SND_ADLIB is not set | ||
| 1404 | # CONFIG_SND_AD1816A is not set | ||
| 1405 | # CONFIG_SND_AD1848 is not set | ||
| 1406 | # CONFIG_SND_ALS100 is not set | ||
| 1407 | # CONFIG_SND_AZT2320 is not set | ||
| 1408 | # CONFIG_SND_CMI8330 is not set | ||
| 1409 | # CONFIG_SND_CS4231 is not set | ||
| 1410 | # CONFIG_SND_CS4232 is not set | ||
| 1411 | # CONFIG_SND_CS4236 is not set | ||
| 1412 | # CONFIG_SND_DT019X is not set | ||
| 1413 | # CONFIG_SND_ES968 is not set | ||
| 1414 | # CONFIG_SND_ES1688 is not set | ||
| 1415 | # CONFIG_SND_ES18XX is not set | ||
| 1416 | # CONFIG_SND_SC6000 is not set | ||
| 1417 | # CONFIG_SND_GUSCLASSIC is not set | ||
| 1418 | # CONFIG_SND_GUSEXTREME is not set | ||
| 1419 | # CONFIG_SND_GUSMAX is not set | ||
| 1420 | # CONFIG_SND_INTERWAVE is not set | ||
| 1421 | # CONFIG_SND_INTERWAVE_STB is not set | ||
| 1422 | # CONFIG_SND_OPL3SA2 is not set | ||
| 1423 | # CONFIG_SND_OPTI92X_AD1848 is not set | ||
| 1424 | # CONFIG_SND_OPTI92X_CS4231 is not set | ||
| 1425 | # CONFIG_SND_OPTI93X is not set | ||
| 1426 | # CONFIG_SND_MIRO is not set | ||
| 1427 | # CONFIG_SND_SB8 is not set | ||
| 1428 | # CONFIG_SND_SB16 is not set | ||
| 1429 | # CONFIG_SND_SBAWE is not set | ||
| 1430 | # CONFIG_SND_SGALAXY is not set | ||
| 1431 | # CONFIG_SND_SSCAPE is not set | ||
| 1432 | # CONFIG_SND_WAVEFRONT is not set | ||
| 1433 | |||
| 1434 | # | ||
| 1435 | # PCI devices | ||
| 1436 | # | ||
| 1437 | # CONFIG_SND_AD1889 is not set | ||
| 1438 | # CONFIG_SND_ALS300 is not set | ||
| 1439 | # CONFIG_SND_ALS4000 is not set | ||
| 1440 | # CONFIG_SND_ALI5451 is not set | ||
| 1441 | # CONFIG_SND_ATIIXP is not set | ||
| 1442 | # CONFIG_SND_ATIIXP_MODEM is not set | ||
| 1443 | # CONFIG_SND_AU8810 is not set | ||
| 1444 | # CONFIG_SND_AU8820 is not set | ||
| 1445 | # CONFIG_SND_AU8830 is not set | ||
| 1446 | # CONFIG_SND_AZT3328 is not set | ||
| 1447 | # CONFIG_SND_BT87X is not set | ||
| 1448 | # CONFIG_SND_CA0106 is not set | ||
| 1449 | # CONFIG_SND_CMIPCI is not set | ||
| 1450 | # CONFIG_SND_CS4281 is not set | ||
| 1451 | # CONFIG_SND_CS46XX is not set | ||
| 1452 | # CONFIG_SND_CS5530 is not set | ||
| 1453 | # CONFIG_SND_CS5535AUDIO is not set | ||
| 1454 | # CONFIG_SND_DARLA20 is not set | ||
| 1455 | # CONFIG_SND_GINA20 is not set | ||
| 1456 | # CONFIG_SND_LAYLA20 is not set | ||
| 1457 | # CONFIG_SND_DARLA24 is not set | ||
| 1458 | # CONFIG_SND_GINA24 is not set | ||
| 1459 | # CONFIG_SND_LAYLA24 is not set | ||
| 1460 | # CONFIG_SND_MONA is not set | ||
| 1461 | # CONFIG_SND_MIA is not set | ||
| 1462 | # CONFIG_SND_ECHO3G is not set | ||
| 1463 | # CONFIG_SND_INDIGO is not set | ||
| 1464 | # CONFIG_SND_INDIGOIO is not set | ||
| 1465 | # CONFIG_SND_INDIGODJ is not set | ||
| 1466 | # CONFIG_SND_EMU10K1 is not set | ||
| 1467 | # CONFIG_SND_EMU10K1X is not set | ||
| 1468 | # CONFIG_SND_ENS1370 is not set | ||
| 1469 | # CONFIG_SND_ENS1371 is not set | ||
| 1470 | # CONFIG_SND_ES1938 is not set | ||
| 1471 | # CONFIG_SND_ES1968 is not set | ||
| 1472 | # CONFIG_SND_FM801 is not set | ||
| 1473 | # CONFIG_SND_HDA_INTEL is not set | ||
| 1474 | # CONFIG_SND_HDSP is not set | ||
| 1475 | # CONFIG_SND_HDSPM is not set | ||
| 1476 | # CONFIG_SND_ICE1712 is not set | ||
| 1477 | # CONFIG_SND_ICE1724 is not set | ||
| 1478 | CONFIG_SND_INTEL8X0=y | ||
| 1479 | # CONFIG_SND_INTEL8X0M is not set | ||
| 1480 | # CONFIG_SND_KORG1212 is not set | ||
| 1481 | # CONFIG_SND_MAESTRO3 is not set | ||
| 1482 | # CONFIG_SND_MIXART is not set | ||
| 1483 | # CONFIG_SND_NM256 is not set | ||
| 1484 | # CONFIG_SND_PCXHR is not set | ||
| 1485 | # CONFIG_SND_RIPTIDE is not set | ||
| 1486 | # CONFIG_SND_RME32 is not set | ||
| 1487 | # CONFIG_SND_RME96 is not set | ||
| 1488 | # CONFIG_SND_RME9652 is not set | ||
| 1489 | # CONFIG_SND_SONICVIBES is not set | ||
| 1490 | # CONFIG_SND_TRIDENT is not set | ||
| 1491 | # CONFIG_SND_VIA82XX is not set | ||
| 1492 | # CONFIG_SND_VIA82XX_MODEM is not set | ||
| 1493 | # CONFIG_SND_VX222 is not set | ||
| 1494 | # CONFIG_SND_YMFPCI is not set | ||
| 1495 | # CONFIG_SND_AC97_POWER_SAVE is not set | ||
| 1496 | |||
| 1497 | # | ||
| 1498 | # USB devices | ||
| 1499 | # | ||
| 1500 | # CONFIG_SND_USB_AUDIO is not set | ||
| 1501 | # CONFIG_SND_USB_USX2Y is not set | ||
| 1502 | # CONFIG_SND_USB_CAIAQ is not set | ||
| 1503 | |||
| 1504 | # | ||
| 1505 | # System on Chip audio support | ||
| 1506 | # | ||
| 1507 | # CONFIG_SND_SOC is not set | ||
| 1508 | |||
| 1509 | # | ||
| 1510 | # SoC Audio support for SuperH | ||
| 1511 | # | ||
| 1512 | |||
| 1513 | # | ||
| 1514 | # Open Sound System | ||
| 1515 | # | ||
| 1516 | # CONFIG_SOUND_PRIME is not set | ||
| 1517 | CONFIG_AC97_BUS=y | ||
| 1518 | CONFIG_HID_SUPPORT=y | ||
| 1519 | CONFIG_HID=y | ||
| 1520 | # CONFIG_HID_DEBUG is not set | ||
| 1521 | # CONFIG_HIDRAW is not set | ||
| 1522 | |||
| 1523 | # | ||
| 1524 | # USB Input Devices | ||
| 1525 | # | ||
| 1526 | CONFIG_USB_HID=y | ||
| 1527 | # CONFIG_USB_HIDINPUT_POWERBOOK is not set | ||
| 1528 | # CONFIG_HID_FF is not set | ||
| 1529 | # CONFIG_USB_HIDDEV is not set | ||
| 1530 | CONFIG_USB_SUPPORT=y | ||
| 1531 | CONFIG_USB_ARCH_HAS_HCD=y | ||
| 1532 | CONFIG_USB_ARCH_HAS_OHCI=y | ||
| 1533 | CONFIG_USB_ARCH_HAS_EHCI=y | ||
| 1534 | CONFIG_USB=y | ||
| 1535 | # CONFIG_USB_DEBUG is not set | ||
| 1536 | |||
| 1537 | # | ||
| 1538 | # Miscellaneous USB options | ||
| 1539 | # | ||
| 1540 | CONFIG_USB_DEVICEFS=y | ||
| 1541 | CONFIG_USB_DEVICE_CLASS=y | ||
| 1542 | # CONFIG_USB_DYNAMIC_MINORS is not set | ||
| 1543 | CONFIG_USB_SUSPEND=y | ||
| 1544 | # CONFIG_USB_PERSIST is not set | ||
| 1545 | # CONFIG_USB_OTG is not set | ||
| 1546 | |||
| 1547 | # | ||
| 1548 | # USB Host Controller Drivers | ||
| 1549 | # | ||
| 1550 | CONFIG_USB_EHCI_HCD=y | ||
| 1551 | CONFIG_USB_EHCI_SPLIT_ISO=y | ||
| 1552 | # CONFIG_USB_EHCI_ROOT_HUB_TT is not set | ||
| 1553 | # CONFIG_USB_EHCI_TT_NEWSCHED is not set | ||
| 1554 | # CONFIG_USB_ISP116X_HCD is not set | ||
| 1555 | CONFIG_USB_OHCI_HCD=y | ||
| 1556 | # CONFIG_USB_OHCI_BIG_ENDIAN_DESC is not set | ||
| 1557 | # CONFIG_USB_OHCI_BIG_ENDIAN_MMIO is not set | ||
| 1558 | CONFIG_USB_OHCI_LITTLE_ENDIAN=y | ||
| 1559 | CONFIG_USB_UHCI_HCD=y | ||
| 1560 | CONFIG_USB_SL811_HCD=m | ||
| 1561 | # CONFIG_USB_R8A66597_HCD is not set | ||
| 1562 | |||
| 1563 | # | ||
| 1564 | # USB Device Class drivers | ||
| 1565 | # | ||
| 1566 | CONFIG_USB_ACM=m | ||
| 1567 | CONFIG_USB_PRINTER=m | ||
| 1568 | |||
| 1569 | # | ||
| 1570 | # NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' | ||
| 1571 | # | ||
| 1572 | |||
| 1573 | # | ||
| 1574 | # may also be needed; see USB_STORAGE Help for more information | ||
| 1575 | # | ||
| 1576 | CONFIG_USB_STORAGE=m | ||
| 1577 | # CONFIG_USB_STORAGE_DEBUG is not set | ||
| 1578 | # CONFIG_USB_STORAGE_DATAFAB is not set | ||
| 1579 | # CONFIG_USB_STORAGE_FREECOM is not set | ||
| 1580 | # CONFIG_USB_STORAGE_ISD200 is not set | ||
| 1581 | # CONFIG_USB_STORAGE_DPCM is not set | ||
| 1582 | # CONFIG_USB_STORAGE_USBAT is not set | ||
| 1583 | # CONFIG_USB_STORAGE_SDDR09 is not set | ||
| 1584 | # CONFIG_USB_STORAGE_SDDR55 is not set | ||
| 1585 | # CONFIG_USB_STORAGE_JUMPSHOT is not set | ||
| 1586 | # CONFIG_USB_STORAGE_ALAUDA is not set | ||
| 1587 | # CONFIG_USB_STORAGE_KARMA is not set | ||
| 1588 | # CONFIG_USB_LIBUSUAL is not set | ||
| 1589 | |||
| 1590 | # | ||
| 1591 | # USB Imaging devices | ||
| 1592 | # | ||
| 1593 | CONFIG_USB_MDC800=m | ||
| 1594 | CONFIG_USB_MICROTEK=m | ||
| 1595 | CONFIG_USB_MON=y | ||
| 1596 | |||
| 1597 | # | ||
| 1598 | # USB port drivers | ||
| 1599 | # | ||
| 1600 | # CONFIG_USB_USS720 is not set | ||
| 1601 | |||
| 1602 | # | ||
| 1603 | # USB Serial Converter support | ||
| 1604 | # | ||
| 1605 | CONFIG_USB_SERIAL=m | ||
| 1606 | CONFIG_USB_SERIAL_GENERIC=y | ||
| 1607 | # CONFIG_USB_SERIAL_AIRCABLE is not set | ||
| 1608 | # CONFIG_USB_SERIAL_AIRPRIME is not set | ||
| 1609 | # CONFIG_USB_SERIAL_ARK3116 is not set | ||
| 1610 | CONFIG_USB_SERIAL_BELKIN=m | ||
| 1611 | # CONFIG_USB_SERIAL_CH341 is not set | ||
| 1612 | # CONFIG_USB_SERIAL_WHITEHEAT is not set | ||
| 1613 | CONFIG_USB_SERIAL_DIGI_ACCELEPORT=m | ||
| 1614 | # CONFIG_USB_SERIAL_CP2101 is not set | ||
| 1615 | CONFIG_USB_SERIAL_CYPRESS_M8=m | ||
| 1616 | CONFIG_USB_SERIAL_EMPEG=m | ||
| 1617 | CONFIG_USB_SERIAL_FTDI_SIO=m | ||
| 1618 | # CONFIG_USB_SERIAL_FUNSOFT is not set | ||
| 1619 | CONFIG_USB_SERIAL_VISOR=m | ||
| 1620 | CONFIG_USB_SERIAL_IPAQ=m | ||
| 1621 | CONFIG_USB_SERIAL_IR=m | ||
| 1622 | CONFIG_USB_SERIAL_EDGEPORT=m | ||
| 1623 | CONFIG_USB_SERIAL_EDGEPORT_TI=m | ||
| 1624 | CONFIG_USB_SERIAL_GARMIN=m | ||
| 1625 | CONFIG_USB_SERIAL_IPW=m | ||
| 1626 | CONFIG_USB_SERIAL_KEYSPAN_PDA=m | ||
| 1627 | CONFIG_USB_SERIAL_KEYSPAN=m | ||
| 1628 | # CONFIG_USB_SERIAL_KEYSPAN_MPR is not set | ||
| 1629 | # CONFIG_USB_SERIAL_KEYSPAN_USA28 is not set | ||
| 1630 | # CONFIG_USB_SERIAL_KEYSPAN_USA28X is not set | ||
| 1631 | # CONFIG_USB_SERIAL_KEYSPAN_USA28XA is not set | ||
| 1632 | # CONFIG_USB_SERIAL_KEYSPAN_USA28XB is not set | ||
| 1633 | # CONFIG_USB_SERIAL_KEYSPAN_USA19 is not set | ||
| 1634 | # CONFIG_USB_SERIAL_KEYSPAN_USA18X is not set | ||
| 1635 | # CONFIG_USB_SERIAL_KEYSPAN_USA19W is not set | ||
| 1636 | # CONFIG_USB_SERIAL_KEYSPAN_USA19QW is not set | ||
| 1637 | # CONFIG_USB_SERIAL_KEYSPAN_USA19QI is not set | ||
| 1638 | # CONFIG_USB_SERIAL_KEYSPAN_USA49W is not set | ||
| 1639 | # CONFIG_USB_SERIAL_KEYSPAN_USA49WLC is not set | ||
| 1640 | CONFIG_USB_SERIAL_KLSI=m | ||
| 1641 | CONFIG_USB_SERIAL_KOBIL_SCT=m | ||
| 1642 | CONFIG_USB_SERIAL_MCT_U232=m | ||
| 1643 | # CONFIG_USB_SERIAL_MOS7720 is not set | ||
| 1644 | # CONFIG_USB_SERIAL_MOS7840 is not set | ||
| 1645 | # CONFIG_USB_SERIAL_NAVMAN is not set | ||
| 1646 | CONFIG_USB_SERIAL_PL2303=m | ||
| 1647 | # CONFIG_USB_SERIAL_OTI6858 is not set | ||
| 1648 | # CONFIG_USB_SERIAL_HP4X is not set | ||
| 1649 | CONFIG_USB_SERIAL_SAFE=m | ||
| 1650 | # CONFIG_USB_SERIAL_SAFE_PADDED is not set | ||
| 1651 | # CONFIG_USB_SERIAL_SIERRAWIRELESS is not set | ||
| 1652 | CONFIG_USB_SERIAL_TI=m | ||
| 1653 | CONFIG_USB_SERIAL_CYBERJACK=m | ||
| 1654 | CONFIG_USB_SERIAL_XIRCOM=m | ||
| 1655 | # CONFIG_USB_SERIAL_OPTION is not set | ||
| 1656 | CONFIG_USB_SERIAL_OMNINET=m | ||
| 1657 | # CONFIG_USB_SERIAL_DEBUG is not set | ||
| 1658 | CONFIG_USB_EZUSB=y | ||
| 1659 | |||
| 1660 | # | ||
| 1661 | # USB Miscellaneous drivers | ||
| 1662 | # | ||
| 1663 | CONFIG_USB_EMI62=m | ||
| 1664 | CONFIG_USB_EMI26=m | ||
| 1665 | # CONFIG_USB_ADUTUX is not set | ||
| 1666 | CONFIG_USB_AUERSWALD=m | ||
| 1667 | CONFIG_USB_RIO500=m | ||
| 1668 | CONFIG_USB_LEGOTOWER=m | ||
| 1669 | CONFIG_USB_LCD=m | ||
| 1670 | # CONFIG_USB_BERRY_CHARGE is not set | ||
| 1671 | CONFIG_USB_LED=m | ||
| 1672 | # CONFIG_USB_CYPRESS_CY7C63 is not set | ||
| 1673 | CONFIG_USB_CYTHERM=m | ||
| 1674 | # CONFIG_USB_PHIDGET is not set | ||
| 1675 | CONFIG_USB_IDMOUSE=m | ||
| 1676 | # CONFIG_USB_FTDI_ELAN is not set | ||
| 1677 | # CONFIG_USB_APPLEDISPLAY is not set | ||
| 1678 | # CONFIG_USB_SISUSBVGA is not set | ||
| 1679 | # CONFIG_USB_LD is not set | ||
| 1680 | # CONFIG_USB_TRANCEVIBRATOR is not set | ||
| 1681 | # CONFIG_USB_IOWARRIOR is not set | ||
| 1682 | # CONFIG_USB_TEST is not set | ||
| 1683 | |||
| 1684 | # | ||
| 1685 | # USB DSL modem support | ||
| 1686 | # | ||
| 1687 | |||
| 1688 | # | ||
| 1689 | # USB Gadget Support | ||
| 1690 | # | ||
| 1691 | # CONFIG_USB_GADGET is not set | ||
| 1692 | # CONFIG_MMC is not set | ||
| 1693 | CONFIG_NEW_LEDS=y | ||
| 1694 | CONFIG_LEDS_CLASS=y | ||
| 1695 | |||
| 1696 | # | ||
| 1697 | # LED drivers | ||
| 1698 | # | ||
| 1699 | |||
| 1700 | # | ||
| 1701 | # LED Triggers | ||
| 1702 | # | ||
| 1703 | # CONFIG_LEDS_TRIGGERS is not set | ||
| 1704 | # CONFIG_INFINIBAND is not set | ||
| 1705 | # CONFIG_EDAC is not set | ||
| 1706 | # CONFIG_RTC_CLASS is not set | ||
| 1707 | # CONFIG_DMADEVICES is not set | ||
| 1708 | # CONFIG_AUXDISPLAY is not set | ||
| 1709 | CONFIG_VIRTUALIZATION=y | ||
| 1710 | # CONFIG_KVM is not set | ||
| 1711 | # CONFIG_LGUEST is not set | ||
| 1712 | |||
| 1713 | # | ||
| 1714 | # Userspace I/O | ||
| 1715 | # | ||
| 1716 | # CONFIG_UIO is not set | ||
| 1717 | |||
| 1718 | # | ||
| 1719 | # Firmware Drivers | ||
| 1720 | # | ||
| 1721 | # CONFIG_EDD is not set | ||
| 1722 | # CONFIG_DELL_RBU is not set | ||
| 1723 | # CONFIG_DCDBAS is not set | ||
| 1724 | CONFIG_DMIID=y | ||
| 1725 | |||
| 1726 | # | ||
| 1727 | # File systems | ||
| 1728 | # | ||
| 1729 | CONFIG_EXT2_FS=y | ||
| 1730 | # CONFIG_EXT2_FS_XATTR is not set | ||
| 1731 | # CONFIG_EXT2_FS_XIP is not set | ||
| 1732 | CONFIG_EXT3_FS=y | ||
| 1733 | # CONFIG_EXT3_FS_XATTR is not set | ||
| 1734 | # CONFIG_EXT4DEV_FS is not set | ||
| 1735 | CONFIG_JBD=y | ||
| 1736 | # CONFIG_REISERFS_FS is not set | ||
| 1737 | # CONFIG_JFS_FS is not set | ||
| 1738 | # CONFIG_FS_POSIX_ACL is not set | ||
| 1739 | # CONFIG_XFS_FS is not set | ||
| 1740 | # CONFIG_GFS2_FS is not set | ||
| 1741 | # CONFIG_OCFS2_FS is not set | ||
| 1742 | # CONFIG_MINIX_FS is not set | ||
| 1743 | # CONFIG_ROMFS_FS is not set | ||
| 1744 | CONFIG_INOTIFY=y | ||
| 1745 | CONFIG_INOTIFY_USER=y | ||
| 1746 | # CONFIG_QUOTA is not set | ||
| 1747 | CONFIG_DNOTIFY=y | ||
| 1748 | # CONFIG_AUTOFS_FS is not set | ||
| 1749 | # CONFIG_AUTOFS4_FS is not set | ||
| 1750 | # CONFIG_FUSE_FS is not set | ||
| 1751 | |||
| 1752 | # | ||
| 1753 | # CD-ROM/DVD Filesystems | ||
| 1754 | # | ||
| 1755 | CONFIG_ISO9660_FS=y | ||
| 1756 | CONFIG_JOLIET=y | ||
| 1757 | # CONFIG_ZISOFS is not set | ||
| 1758 | CONFIG_UDF_FS=y | ||
| 1759 | CONFIG_UDF_NLS=y | ||
| 1760 | |||
| 1761 | # | ||
| 1762 | # DOS/FAT/NT Filesystems | ||
| 1763 | # | ||
| 1764 | CONFIG_FAT_FS=y | ||
| 1765 | # CONFIG_MSDOS_FS is not set | ||
| 1766 | CONFIG_VFAT_FS=y | ||
| 1767 | CONFIG_FAT_DEFAULT_CODEPAGE=437 | ||
| 1768 | CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" | ||
| 1769 | # CONFIG_NTFS_FS is not set | ||
| 1770 | |||
| 1771 | # | ||
| 1772 | # Pseudo filesystems | ||
| 1773 | # | ||
| 1774 | CONFIG_PROC_FS=y | ||
| 1775 | CONFIG_PROC_KCORE=y | ||
| 1776 | CONFIG_PROC_SYSCTL=y | ||
| 1777 | CONFIG_SYSFS=y | ||
| 1778 | CONFIG_TMPFS=y | ||
| 1779 | # CONFIG_TMPFS_POSIX_ACL is not set | ||
| 1780 | # CONFIG_HUGETLBFS is not set | ||
| 1781 | # CONFIG_HUGETLB_PAGE is not set | ||
| 1782 | # CONFIG_CONFIGFS_FS is not set | ||
| 1783 | |||
| 1784 | # | ||
| 1785 | # Miscellaneous filesystems | ||
| 1786 | # | ||
| 1787 | # CONFIG_ADFS_FS is not set | ||
| 1788 | # CONFIG_AFFS_FS is not set | ||
| 1789 | # CONFIG_HFS_FS is not set | ||
| 1790 | # CONFIG_HFSPLUS_FS is not set | ||
| 1791 | # CONFIG_BEFS_FS is not set | ||
| 1792 | # CONFIG_BFS_FS is not set | ||
| 1793 | # CONFIG_EFS_FS is not set | ||
| 1794 | CONFIG_CRAMFS=m | ||
| 1795 | CONFIG_SQUASHFS=m | ||
| 1796 | # CONFIG_SQUASHFS_EMBEDDED is not set | ||
| 1797 | CONFIG_SQUASHFS_FRAGMENT_CACHE_SIZE=3 | ||
| 1798 | # CONFIG_VXFS_FS is not set | ||
| 1799 | # CONFIG_HPFS_FS is not set | ||
| 1800 | # CONFIG_QNX4FS_FS is not set | ||
| 1801 | # CONFIG_SYSV_FS is not set | ||
| 1802 | # CONFIG_UFS_FS is not set | ||
| 1803 | CONFIG_NETWORK_FILESYSTEMS=y | ||
| 1804 | CONFIG_NFS_FS=y | ||
| 1805 | CONFIG_NFS_V3=y | ||
| 1806 | # CONFIG_NFS_V3_ACL is not set | ||
| 1807 | # CONFIG_NFS_V4 is not set | ||
| 1808 | # CONFIG_NFS_DIRECTIO is not set | ||
| 1809 | CONFIG_NFSD=y | ||
| 1810 | CONFIG_NFSD_V3=y | ||
| 1811 | # CONFIG_NFSD_V3_ACL is not set | ||
| 1812 | # CONFIG_NFSD_V4 is not set | ||
| 1813 | # CONFIG_NFSD_TCP is not set | ||
| 1814 | CONFIG_ROOT_NFS=y | ||
| 1815 | CONFIG_LOCKD=y | ||
| 1816 | CONFIG_LOCKD_V4=y | ||
| 1817 | CONFIG_EXPORTFS=y | ||
| 1818 | CONFIG_NFS_COMMON=y | ||
| 1819 | CONFIG_SUNRPC=y | ||
| 1820 | # CONFIG_SUNRPC_BIND34 is not set | ||
| 1821 | # CONFIG_RPCSEC_GSS_KRB5 is not set | ||
| 1822 | # CONFIG_RPCSEC_GSS_SPKM3 is not set | ||
| 1823 | CONFIG_SMB_FS=y | ||
| 1824 | # CONFIG_SMB_NLS_DEFAULT is not set | ||
| 1825 | CONFIG_CIFS=m | ||
| 1826 | # CONFIG_CIFS_STATS is not set | ||
| 1827 | # CONFIG_CIFS_WEAK_PW_HASH is not set | ||
| 1828 | # CONFIG_CIFS_XATTR is not set | ||
| 1829 | # CONFIG_CIFS_DEBUG2 is not set | ||
| 1830 | # CONFIG_CIFS_EXPERIMENTAL is not set | ||
| 1831 | # CONFIG_NCP_FS is not set | ||
| 1832 | # CONFIG_CODA_FS is not set | ||
| 1833 | # CONFIG_AFS_FS is not set | ||
| 1834 | |||
| 1835 | # | ||
| 1836 | # Partition Types | ||
| 1837 | # | ||
| 1838 | CONFIG_PARTITION_ADVANCED=y | ||
| 1839 | # CONFIG_ACORN_PARTITION is not set | ||
| 1840 | # CONFIG_OSF_PARTITION is not set | ||
| 1841 | # CONFIG_AMIGA_PARTITION is not set | ||
| 1842 | # CONFIG_ATARI_PARTITION is not set | ||
| 1843 | # CONFIG_MAC_PARTITION is not set | ||
| 1844 | CONFIG_MSDOS_PARTITION=y | ||
| 1845 | # CONFIG_BSD_DISKLABEL is not set | ||
| 1846 | # CONFIG_MINIX_SUBPARTITION is not set | ||
| 1847 | # CONFIG_SOLARIS_X86_PARTITION is not set | ||
| 1848 | # CONFIG_UNIXWARE_DISKLABEL is not set | ||
| 1849 | # CONFIG_LDM_PARTITION is not set | ||
| 1850 | # CONFIG_SGI_PARTITION is not set | ||
| 1851 | # CONFIG_ULTRIX_PARTITION is not set | ||
| 1852 | # CONFIG_SUN_PARTITION is not set | ||
| 1853 | # CONFIG_KARMA_PARTITION is not set | ||
| 1854 | # CONFIG_EFI_PARTITION is not set | ||
| 1855 | # CONFIG_SYSV68_PARTITION is not set | ||
| 1856 | CONFIG_NLS=y | ||
| 1857 | CONFIG_NLS_DEFAULT="cp437" | ||
| 1858 | CONFIG_NLS_CODEPAGE_437=y | ||
| 1859 | CONFIG_NLS_CODEPAGE_737=m | ||
| 1860 | CONFIG_NLS_CODEPAGE_775=m | ||
| 1861 | CONFIG_NLS_CODEPAGE_850=m | ||
| 1862 | CONFIG_NLS_CODEPAGE_852=m | ||
| 1863 | CONFIG_NLS_CODEPAGE_855=m | ||
| 1864 | CONFIG_NLS_CODEPAGE_857=m | ||
| 1865 | CONFIG_NLS_CODEPAGE_860=m | ||
| 1866 | CONFIG_NLS_CODEPAGE_861=m | ||
| 1867 | CONFIG_NLS_CODEPAGE_862=m | ||
| 1868 | CONFIG_NLS_CODEPAGE_863=m | ||
| 1869 | CONFIG_NLS_CODEPAGE_864=m | ||
| 1870 | CONFIG_NLS_CODEPAGE_865=m | ||
| 1871 | CONFIG_NLS_CODEPAGE_866=m | ||
| 1872 | CONFIG_NLS_CODEPAGE_869=m | ||
| 1873 | CONFIG_NLS_CODEPAGE_936=m | ||
| 1874 | CONFIG_NLS_CODEPAGE_950=m | ||
| 1875 | CONFIG_NLS_CODEPAGE_932=m | ||
| 1876 | CONFIG_NLS_CODEPAGE_949=m | ||
| 1877 | CONFIG_NLS_CODEPAGE_874=m | ||
| 1878 | CONFIG_NLS_ISO8859_8=m | ||
| 1879 | CONFIG_NLS_CODEPAGE_1250=m | ||
| 1880 | CONFIG_NLS_CODEPAGE_1251=m | ||
| 1881 | CONFIG_NLS_ASCII=m | ||
| 1882 | CONFIG_NLS_ISO8859_1=y | ||
| 1883 | CONFIG_NLS_ISO8859_2=m | ||
| 1884 | CONFIG_NLS_ISO8859_3=m | ||
| 1885 | CONFIG_NLS_ISO8859_4=m | ||
| 1886 | CONFIG_NLS_ISO8859_5=m | ||
| 1887 | CONFIG_NLS_ISO8859_6=m | ||
| 1888 | CONFIG_NLS_ISO8859_7=m | ||
| 1889 | CONFIG_NLS_ISO8859_9=m | ||
| 1890 | CONFIG_NLS_ISO8859_13=m | ||
| 1891 | CONFIG_NLS_ISO8859_14=m | ||
| 1892 | CONFIG_NLS_ISO8859_15=m | ||
| 1893 | CONFIG_NLS_KOI8_R=m | ||
| 1894 | CONFIG_NLS_KOI8_U=m | ||
| 1895 | CONFIG_NLS_UTF8=y | ||
| 1896 | # CONFIG_DLM is not set | ||
| 1897 | CONFIG_INSTRUMENTATION=y | ||
| 1898 | CONFIG_PROFILING=y | ||
| 1899 | CONFIG_OPROFILE=m | ||
| 1900 | # CONFIG_KPROBES is not set | ||
| 1901 | # CONFIG_MARKERS is not set | ||
| 1902 | |||
| 1903 | # | ||
| 1904 | # Kernel hacking | ||
| 1905 | # | ||
| 1906 | CONFIG_TRACE_IRQFLAGS_SUPPORT=y | ||
| 1907 | # CONFIG_PRINTK_TIME is not set | ||
| 1908 | CONFIG_ENABLE_WARN_DEPRECATED=y | ||
| 1909 | CONFIG_ENABLE_MUST_CHECK=y | ||
| 1910 | CONFIG_MAGIC_SYSRQ=y | ||
| 1911 | # CONFIG_UNUSED_SYMBOLS is not set | ||
| 1912 | # CONFIG_DEBUG_FS is not set | ||
| 1913 | # CONFIG_HEADERS_CHECK is not set | ||
| 1914 | # CONFIG_DEBUG_KERNEL is not set | ||
| 1915 | # CONFIG_DEBUG_BUGVERBOSE is not set | ||
| 1916 | # CONFIG_SAMPLES is not set | ||
| 1917 | CONFIG_EARLY_PRINTK=y | ||
| 1918 | CONFIG_X86_FIND_SMP_CONFIG=y | ||
| 1919 | CONFIG_X86_MPPARSE=y | ||
| 1920 | CONFIG_DOUBLEFAULT=y | ||
| 1921 | |||
| 1922 | # | ||
| 1923 | # Security options | ||
| 1924 | # | ||
| 1925 | # CONFIG_KEYS is not set | ||
| 1926 | # CONFIG_SECURITY is not set | ||
| 1927 | # CONFIG_SECURITY_FILE_CAPABILITIES is not set | ||
| 1928 | CONFIG_CRYPTO=y | ||
| 1929 | CONFIG_CRYPTO_ALGAPI=m | ||
| 1930 | CONFIG_CRYPTO_BLKCIPHER=m | ||
| 1931 | CONFIG_CRYPTO_HASH=m | ||
| 1932 | CONFIG_CRYPTO_MANAGER=m | ||
| 1933 | CONFIG_CRYPTO_HMAC=m | ||
| 1934 | # CONFIG_CRYPTO_XCBC is not set | ||
| 1935 | CONFIG_CRYPTO_NULL=m | ||
| 1936 | CONFIG_CRYPTO_MD4=m | ||
| 1937 | CONFIG_CRYPTO_MD5=m | ||
| 1938 | CONFIG_CRYPTO_SHA1=m | ||
| 1939 | CONFIG_CRYPTO_SHA256=m | ||
| 1940 | CONFIG_CRYPTO_SHA512=m | ||
| 1941 | CONFIG_CRYPTO_WP512=m | ||
| 1942 | # CONFIG_CRYPTO_TGR192 is not set | ||
| 1943 | # CONFIG_CRYPTO_GF128MUL is not set | ||
| 1944 | CONFIG_CRYPTO_ECB=m | ||
| 1945 | CONFIG_CRYPTO_CBC=m | ||
| 1946 | CONFIG_CRYPTO_PCBC=m | ||
| 1947 | # CONFIG_CRYPTO_LRW is not set | ||
| 1948 | # CONFIG_CRYPTO_XTS is not set | ||
| 1949 | # CONFIG_CRYPTO_CRYPTD is not set | ||
| 1950 | CONFIG_CRYPTO_DES=m | ||
| 1951 | # CONFIG_CRYPTO_FCRYPT is not set | ||
| 1952 | CONFIG_CRYPTO_BLOWFISH=m | ||
| 1953 | CONFIG_CRYPTO_TWOFISH=m | ||
| 1954 | CONFIG_CRYPTO_TWOFISH_COMMON=m | ||
| 1955 | # CONFIG_CRYPTO_TWOFISH_586 is not set | ||
| 1956 | CONFIG_CRYPTO_SERPENT=m | ||
| 1957 | CONFIG_CRYPTO_AES=m | ||
| 1958 | # CONFIG_CRYPTO_AES_586 is not set | ||
| 1959 | CONFIG_CRYPTO_CAST5=m | ||
| 1960 | CONFIG_CRYPTO_CAST6=m | ||
| 1961 | CONFIG_CRYPTO_TEA=m | ||
| 1962 | CONFIG_CRYPTO_ARC4=m | ||
| 1963 | CONFIG_CRYPTO_KHAZAD=m | ||
| 1964 | CONFIG_CRYPTO_ANUBIS=m | ||
| 1965 | # CONFIG_CRYPTO_SEED is not set | ||
| 1966 | CONFIG_CRYPTO_DEFLATE=m | ||
| 1967 | CONFIG_CRYPTO_LZO=m | ||
| 1968 | CONFIG_CRYPTO_MICHAEL_MIC=m | ||
| 1969 | CONFIG_CRYPTO_CRC32C=m | ||
| 1970 | CONFIG_CRYPTO_CAMELLIA=m | ||
| 1971 | CONFIG_CRYPTO_TEST=m | ||
| 1972 | # CONFIG_CRYPTO_AUTHENC is not set | ||
| 1973 | # CONFIG_CRYPTO_HW is not set | ||
| 1974 | |||
| 1975 | # | ||
| 1976 | # Library routines | ||
| 1977 | # | ||
| 1978 | CONFIG_BITREVERSE=y | ||
| 1979 | CONFIG_CRC_CCITT=y | ||
| 1980 | # CONFIG_CRC16 is not set | ||
| 1981 | # CONFIG_CRC_ITU_T is not set | ||
| 1982 | CONFIG_CRC32=y | ||
| 1983 | # CONFIG_CRC7 is not set | ||
| 1984 | CONFIG_LIBCRC32C=m | ||
| 1985 | CONFIG_AUDIT_GENERIC=y | ||
| 1986 | CONFIG_ZLIB_INFLATE=m | ||
| 1987 | CONFIG_ZLIB_DEFLATE=m | ||
| 1988 | CONFIG_LZO_COMPRESS=m | ||
| 1989 | CONFIG_LZO_DECOMPRESS=m | ||
| 1990 | CONFIG_PLIST=y | ||
| 1991 | CONFIG_HAS_IOMEM=y | ||
| 1992 | CONFIG_HAS_IOPORT=y | ||
| 1993 | CONFIG_HAS_DMA=y | ||
diff --git a/meta/packages/linux/linux-rp-2.6.25+2.6.26-rc4/defconfig-spitz b/meta/packages/linux/linux-rp-2.6.25+2.6.26-rc4/defconfig-spitz new file mode 100644 index 0000000000..9c8f0ae8a1 --- /dev/null +++ b/meta/packages/linux/linux-rp-2.6.25+2.6.26-rc4/defconfig-spitz | |||
| @@ -0,0 +1,1834 @@ | |||
| 1 | # | ||
| 2 | # Automatically generated make config: don't edit | ||
| 3 | # Linux kernel version: 2.6.26-rc4 | ||
| 4 | # Sun Jun 1 18:56:45 2008 | ||
| 5 | # | ||
| 6 | CONFIG_ARM=y | ||
| 7 | CONFIG_SYS_SUPPORTS_APM_EMULATION=y | ||
| 8 | CONFIG_GENERIC_GPIO=y | ||
| 9 | CONFIG_GENERIC_TIME=y | ||
| 10 | CONFIG_GENERIC_CLOCKEVENTS=y | ||
| 11 | CONFIG_MMU=y | ||
| 12 | # CONFIG_NO_IOPORT is not set | ||
| 13 | CONFIG_GENERIC_HARDIRQS=y | ||
| 14 | CONFIG_STACKTRACE_SUPPORT=y | ||
| 15 | CONFIG_LOCKDEP_SUPPORT=y | ||
| 16 | CONFIG_TRACE_IRQFLAGS_SUPPORT=y | ||
| 17 | CONFIG_HARDIRQS_SW_RESEND=y | ||
| 18 | CONFIG_GENERIC_IRQ_PROBE=y | ||
| 19 | CONFIG_RWSEM_GENERIC_SPINLOCK=y | ||
| 20 | # CONFIG_ARCH_HAS_ILOG2_U32 is not set | ||
| 21 | # CONFIG_ARCH_HAS_ILOG2_U64 is not set | ||
| 22 | CONFIG_GENERIC_HWEIGHT=y | ||
| 23 | CONFIG_GENERIC_CALIBRATE_DELAY=y | ||
| 24 | CONFIG_ARCH_SUPPORTS_AOUT=y | ||
| 25 | CONFIG_ZONE_DMA=y | ||
| 26 | CONFIG_ARCH_MTD_XIP=y | ||
| 27 | CONFIG_VECTORS_BASE=0xffff0000 | ||
| 28 | CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" | ||
| 29 | |||
| 30 | # | ||
| 31 | # General setup | ||
| 32 | # | ||
| 33 | CONFIG_EXPERIMENTAL=y | ||
| 34 | CONFIG_BROKEN_ON_SMP=y | ||
| 35 | CONFIG_LOCK_KERNEL=y | ||
| 36 | CONFIG_INIT_ENV_ARG_LIMIT=32 | ||
| 37 | CONFIG_LOCALVERSION="" | ||
| 38 | # CONFIG_LOCALVERSION_AUTO is not set | ||
| 39 | CONFIG_SWAP=y | ||
| 40 | CONFIG_SYSVIPC=y | ||
| 41 | CONFIG_SYSVIPC_SYSCTL=y | ||
| 42 | # CONFIG_POSIX_MQUEUE is not set | ||
| 43 | CONFIG_BSD_PROCESS_ACCT=y | ||
| 44 | CONFIG_BSD_PROCESS_ACCT_V3=y | ||
| 45 | # CONFIG_TASKSTATS is not set | ||
| 46 | # CONFIG_AUDIT is not set | ||
| 47 | # CONFIG_IKCONFIG is not set | ||
| 48 | CONFIG_LOG_BUF_SHIFT=14 | ||
| 49 | # CONFIG_CGROUPS is not set | ||
| 50 | # CONFIG_GROUP_SCHED is not set | ||
| 51 | CONFIG_SYSFS_DEPRECATED=y | ||
| 52 | CONFIG_SYSFS_DEPRECATED_V2=y | ||
| 53 | # CONFIG_RELAY is not set | ||
| 54 | # CONFIG_NAMESPACES is not set | ||
| 55 | # CONFIG_BLK_DEV_INITRD is not set | ||
| 56 | CONFIG_CC_OPTIMIZE_FOR_SIZE=y | ||
| 57 | CONFIG_SYSCTL=y | ||
| 58 | CONFIG_EMBEDDED=y | ||
| 59 | CONFIG_UID16=y | ||
| 60 | CONFIG_SYSCTL_SYSCALL=y | ||
| 61 | CONFIG_SYSCTL_SYSCALL_CHECK=y | ||
| 62 | CONFIG_KALLSYMS=y | ||
| 63 | # CONFIG_KALLSYMS_ALL is not set | ||
| 64 | # CONFIG_KALLSYMS_EXTRA_PASS is not set | ||
| 65 | CONFIG_HOTPLUG=y | ||
| 66 | CONFIG_PRINTK=y | ||
| 67 | CONFIG_BUG=y | ||
| 68 | CONFIG_ELF_CORE=y | ||
| 69 | CONFIG_COMPAT_BRK=y | ||
| 70 | CONFIG_BASE_FULL=y | ||
| 71 | CONFIG_FUTEX=y | ||
| 72 | CONFIG_ANON_INODES=y | ||
| 73 | CONFIG_EPOLL=y | ||
| 74 | CONFIG_SIGNALFD=y | ||
| 75 | CONFIG_TIMERFD=y | ||
| 76 | CONFIG_EVENTFD=y | ||
| 77 | CONFIG_SHMEM=y | ||
| 78 | CONFIG_VM_EVENT_COUNTERS=y | ||
| 79 | CONFIG_SLAB=y | ||
| 80 | # CONFIG_SLUB is not set | ||
| 81 | # CONFIG_SLOB is not set | ||
| 82 | CONFIG_PROFILING=y | ||
| 83 | # CONFIG_MARKERS is not set | ||
| 84 | CONFIG_OPROFILE=m | ||
| 85 | CONFIG_HAVE_OPROFILE=y | ||
| 86 | # CONFIG_KPROBES is not set | ||
| 87 | CONFIG_HAVE_KPROBES=y | ||
| 88 | CONFIG_HAVE_KRETPROBES=y | ||
| 89 | # CONFIG_HAVE_DMA_ATTRS is not set | ||
| 90 | CONFIG_PROC_PAGE_MONITOR=y | ||
| 91 | CONFIG_SLABINFO=y | ||
| 92 | CONFIG_RT_MUTEXES=y | ||
| 93 | # CONFIG_TINY_SHMEM is not set | ||
| 94 | CONFIG_BASE_SMALL=0 | ||
| 95 | CONFIG_MODULES=y | ||
| 96 | # CONFIG_MODULE_FORCE_LOAD is not set | ||
| 97 | CONFIG_MODULE_UNLOAD=y | ||
| 98 | CONFIG_MODULE_FORCE_UNLOAD=y | ||
| 99 | # CONFIG_MODVERSIONS is not set | ||
| 100 | # CONFIG_MODULE_SRCVERSION_ALL is not set | ||
| 101 | CONFIG_KMOD=y | ||
| 102 | CONFIG_BLOCK=y | ||
| 103 | # CONFIG_LBD is not set | ||
| 104 | # CONFIG_BLK_DEV_IO_TRACE is not set | ||
| 105 | # CONFIG_LSF is not set | ||
| 106 | # CONFIG_BLK_DEV_BSG is not set | ||
| 107 | |||
| 108 | # | ||
| 109 | # IO Schedulers | ||
| 110 | # | ||
| 111 | CONFIG_IOSCHED_NOOP=y | ||
| 112 | CONFIG_IOSCHED_AS=y | ||
| 113 | CONFIG_IOSCHED_DEADLINE=m | ||
| 114 | CONFIG_IOSCHED_CFQ=m | ||
| 115 | CONFIG_DEFAULT_AS=y | ||
| 116 | # CONFIG_DEFAULT_DEADLINE is not set | ||
| 117 | # CONFIG_DEFAULT_CFQ is not set | ||
| 118 | # CONFIG_DEFAULT_NOOP is not set | ||
| 119 | CONFIG_DEFAULT_IOSCHED="anticipatory" | ||
| 120 | CONFIG_CLASSIC_RCU=y | ||
| 121 | |||
| 122 | # | ||
| 123 | # System Type | ||
| 124 | # | ||
| 125 | # CONFIG_ARCH_AAEC2000 is not set | ||
| 126 | # CONFIG_ARCH_INTEGRATOR is not set | ||
| 127 | # CONFIG_ARCH_REALVIEW is not set | ||
| 128 | # CONFIG_ARCH_VERSATILE is not set | ||
| 129 | # CONFIG_ARCH_AT91 is not set | ||
| 130 | # CONFIG_ARCH_CLPS7500 is not set | ||
| 131 | # CONFIG_ARCH_CLPS711X is not set | ||
| 132 | # CONFIG_ARCH_CO285 is not set | ||
| 133 | # CONFIG_ARCH_EBSA110 is not set | ||
| 134 | # CONFIG_ARCH_EP93XX is not set | ||
| 135 | # CONFIG_ARCH_FOOTBRIDGE is not set | ||
| 136 | # CONFIG_ARCH_NETX is not set | ||
| 137 | # CONFIG_ARCH_H720X is not set | ||
| 138 | # CONFIG_ARCH_IMX is not set | ||
| 139 | # CONFIG_ARCH_IOP13XX is not set | ||
| 140 | # CONFIG_ARCH_IOP32X is not set | ||
| 141 | # CONFIG_ARCH_IOP33X is not set | ||
| 142 | # CONFIG_ARCH_IXP23XX is not set | ||
| 143 | # CONFIG_ARCH_IXP2000 is not set | ||
| 144 | # CONFIG_ARCH_IXP4XX is not set | ||
| 145 | # CONFIG_ARCH_L7200 is not set | ||
| 146 | # CONFIG_ARCH_KS8695 is not set | ||
| 147 | # CONFIG_ARCH_NS9XXX is not set | ||
| 148 | # CONFIG_ARCH_MXC is not set | ||
| 149 | # CONFIG_ARCH_ORION5X is not set | ||
| 150 | # CONFIG_ARCH_PNX4008 is not set | ||
| 151 | CONFIG_ARCH_PXA=y | ||
| 152 | # CONFIG_ARCH_RPC is not set | ||
| 153 | # CONFIG_ARCH_SA1100 is not set | ||
| 154 | # CONFIG_ARCH_S3C2410 is not set | ||
| 155 | # CONFIG_ARCH_SHARK is not set | ||
| 156 | # CONFIG_ARCH_LH7A40X is not set | ||
| 157 | # CONFIG_ARCH_DAVINCI is not set | ||
| 158 | # CONFIG_ARCH_OMAP is not set | ||
| 159 | # CONFIG_ARCH_MSM7X00A is not set | ||
| 160 | |||
| 161 | # | ||
| 162 | # Intel PXA2xx/PXA3xx Implementations | ||
| 163 | # | ||
| 164 | # CONFIG_ARCH_GUMSTIX is not set | ||
| 165 | # CONFIG_ARCH_LUBBOCK is not set | ||
| 166 | # CONFIG_MACH_LOGICPD_PXA270 is not set | ||
| 167 | # CONFIG_MACH_MAINSTONE is not set | ||
| 168 | # CONFIG_ARCH_PXA_IDP is not set | ||
| 169 | CONFIG_PXA_SHARPSL=y | ||
| 170 | # CONFIG_ARCH_PXA_ESERIES is not set | ||
| 171 | # CONFIG_MACH_TRIZEPS4 is not set | ||
| 172 | # CONFIG_MACH_HX2750 is not set | ||
| 173 | # CONFIG_MACH_EM_X270 is not set | ||
| 174 | # CONFIG_MACH_COLIBRI is not set | ||
| 175 | # CONFIG_MACH_ZYLONITE is not set | ||
| 176 | # CONFIG_MACH_LITTLETON is not set | ||
| 177 | # CONFIG_MACH_ARMCORE is not set | ||
| 178 | # CONFIG_MACH_MAGICIAN is not set | ||
| 179 | # CONFIG_MACH_PCM027 is not set | ||
| 180 | # CONFIG_MACH_HTCUNIVERSAL is not set | ||
| 181 | # CONFIG_PXA_SHARPSL_25x is not set | ||
| 182 | CONFIG_PXA_SHARPSL_27x=y | ||
| 183 | CONFIG_MACH_AKITA=y | ||
| 184 | CONFIG_MACH_SPITZ=y | ||
| 185 | CONFIG_MACH_BORZOI=y | ||
| 186 | CONFIG_PXA27x=y | ||
| 187 | CONFIG_PXA_SHARP_Cxx00=y | ||
| 188 | CONFIG_PXA_SSP=y | ||
| 189 | # CONFIG_PXA_KEYS is not set | ||
| 190 | |||
| 191 | # | ||
| 192 | # Boot options | ||
| 193 | # | ||
| 194 | |||
| 195 | # | ||
| 196 | # Power management | ||
| 197 | # | ||
| 198 | |||
| 199 | # | ||
| 200 | # Processor Type | ||
| 201 | # | ||
| 202 | CONFIG_CPU_32=y | ||
| 203 | CONFIG_CPU_XSCALE=y | ||
| 204 | CONFIG_CPU_32v5=y | ||
| 205 | CONFIG_CPU_ABRT_EV5T=y | ||
| 206 | CONFIG_CPU_PABRT_NOIFAR=y | ||
| 207 | CONFIG_CPU_CACHE_VIVT=y | ||
| 208 | CONFIG_CPU_TLB_V4WBI=y | ||
| 209 | CONFIG_CPU_CP15=y | ||
| 210 | CONFIG_CPU_CP15_MMU=y | ||
| 211 | |||
| 212 | # | ||
| 213 | # Processor Features | ||
| 214 | # | ||
| 215 | CONFIG_ARM_THUMB=y | ||
| 216 | # CONFIG_CPU_DCACHE_DISABLE is not set | ||
| 217 | # CONFIG_OUTER_CACHE is not set | ||
| 218 | CONFIG_IWMMXT=y | ||
| 219 | CONFIG_XSCALE_PMU=y | ||
| 220 | CONFIG_SHARP_PARAM=y | ||
| 221 | CONFIG_SHARPSL_PM=y | ||
| 222 | CONFIG_SHARP_SCOOP=y | ||
| 223 | |||
| 224 | # | ||
| 225 | # Bus support | ||
| 226 | # | ||
| 227 | # CONFIG_PCI_SYSCALL is not set | ||
| 228 | # CONFIG_ARCH_SUPPORTS_MSI is not set | ||
| 229 | CONFIG_PCCARD=y | ||
| 230 | # CONFIG_PCMCIA_DEBUG is not set | ||
| 231 | CONFIG_PCMCIA=y | ||
| 232 | CONFIG_PCMCIA_LOAD_CIS=y | ||
| 233 | CONFIG_PCMCIA_IOCTL=y | ||
| 234 | |||
| 235 | # | ||
| 236 | # PC-card bridges | ||
| 237 | # | ||
| 238 | CONFIG_PCMCIA_PXA2XX=y | ||
| 239 | |||
| 240 | # | ||
| 241 | # Kernel Features | ||
| 242 | # | ||
| 243 | CONFIG_TICK_ONESHOT=y | ||
| 244 | CONFIG_NO_HZ=y | ||
| 245 | CONFIG_HIGH_RES_TIMERS=y | ||
| 246 | CONFIG_GENERIC_CLOCKEVENTS_BUILD=y | ||
| 247 | CONFIG_PREEMPT=y | ||
| 248 | CONFIG_HZ=100 | ||
| 249 | CONFIG_AEABI=y | ||
| 250 | CONFIG_OABI_COMPAT=y | ||
| 251 | # CONFIG_ARCH_DISCONTIGMEM_ENABLE is not set | ||
| 252 | CONFIG_SELECT_MEMORY_MODEL=y | ||
| 253 | CONFIG_FLATMEM_MANUAL=y | ||
| 254 | # CONFIG_DISCONTIGMEM_MANUAL is not set | ||
| 255 | # CONFIG_SPARSEMEM_MANUAL is not set | ||
| 256 | CONFIG_FLATMEM=y | ||
| 257 | CONFIG_FLAT_NODE_MEM_MAP=y | ||
| 258 | # CONFIG_SPARSEMEM_STATIC is not set | ||
| 259 | # CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set | ||
| 260 | CONFIG_PAGEFLAGS_EXTENDED=y | ||
| 261 | CONFIG_SPLIT_PTLOCK_CPUS=4096 | ||
| 262 | # CONFIG_RESOURCES_64BIT is not set | ||
| 263 | CONFIG_ZONE_DMA_FLAG=1 | ||
| 264 | CONFIG_BOUNCE=y | ||
| 265 | CONFIG_VIRT_TO_BUS=y | ||
| 266 | CONFIG_ALIGNMENT_TRAP=y | ||
| 267 | |||
| 268 | # | ||
| 269 | # Boot options | ||
| 270 | # | ||
| 271 | CONFIG_ZBOOT_ROM_TEXT=0x0 | ||
| 272 | CONFIG_ZBOOT_ROM_BSS=0x0 | ||
| 273 | CONFIG_CMDLINE="console=ttyS0,115200n8 console=tty1 noinitrd root=/dev/hda1 rootfstype=ext3 rootdelay=1 rw fbcon=rotate:1 dyntick=enable debug" | ||
| 274 | # CONFIG_XIP_KERNEL is not set | ||
| 275 | CONFIG_KEXEC=y | ||
| 276 | CONFIG_ATAGS_PROC=y | ||
| 277 | |||
| 278 | # | ||
| 279 | # CPU Frequency scaling | ||
| 280 | # | ||
| 281 | # CONFIG_CPU_FREQ is not set | ||
| 282 | |||
| 283 | # | ||
| 284 | # Floating point emulation | ||
| 285 | # | ||
| 286 | |||
| 287 | # | ||
| 288 | # At least one emulation must be selected | ||
| 289 | # | ||
| 290 | CONFIG_FPE_NWFPE=y | ||
| 291 | # CONFIG_FPE_NWFPE_XP is not set | ||
| 292 | # CONFIG_FPE_FASTFPE is not set | ||
| 293 | |||
| 294 | # | ||
| 295 | # Userspace binary formats | ||
| 296 | # | ||
| 297 | CONFIG_BINFMT_ELF=y | ||
| 298 | CONFIG_BINFMT_AOUT=m | ||
| 299 | CONFIG_BINFMT_MISC=m | ||
| 300 | |||
| 301 | # | ||
| 302 | # Power management options | ||
| 303 | # | ||
| 304 | CONFIG_PM=y | ||
| 305 | # CONFIG_PM_DEBUG is not set | ||
| 306 | CONFIG_PM_SLEEP=y | ||
| 307 | CONFIG_SUSPEND=y | ||
| 308 | CONFIG_SUSPEND_FREEZER=y | ||
| 309 | CONFIG_APM_EMULATION=y | ||
| 310 | CONFIG_ARCH_SUSPEND_POSSIBLE=y | ||
| 311 | |||
| 312 | # | ||
| 313 | # Networking | ||
| 314 | # | ||
| 315 | CONFIG_NET=y | ||
| 316 | |||
| 317 | # | ||
| 318 | # Networking options | ||
| 319 | # | ||
| 320 | CONFIG_PACKET=m | ||
| 321 | CONFIG_PACKET_MMAP=y | ||
| 322 | CONFIG_UNIX=y | ||
| 323 | CONFIG_XFRM=y | ||
| 324 | CONFIG_XFRM_USER=m | ||
| 325 | # CONFIG_XFRM_SUB_POLICY is not set | ||
| 326 | # CONFIG_XFRM_MIGRATE is not set | ||
| 327 | # CONFIG_XFRM_STATISTICS is not set | ||
| 328 | # CONFIG_NET_KEY is not set | ||
| 329 | CONFIG_INET=y | ||
| 330 | # CONFIG_IP_MULTICAST is not set | ||
| 331 | # CONFIG_IP_ADVANCED_ROUTER is not set | ||
| 332 | CONFIG_IP_FIB_HASH=y | ||
| 333 | # CONFIG_IP_PNP is not set | ||
| 334 | # CONFIG_NET_IPIP is not set | ||
| 335 | # CONFIG_NET_IPGRE is not set | ||
| 336 | # CONFIG_ARPD is not set | ||
| 337 | CONFIG_SYN_COOKIES=y | ||
| 338 | # CONFIG_INET_AH is not set | ||
| 339 | # CONFIG_INET_ESP is not set | ||
| 340 | # CONFIG_INET_IPCOMP is not set | ||
| 341 | # CONFIG_INET_XFRM_TUNNEL is not set | ||
| 342 | CONFIG_INET_TUNNEL=m | ||
| 343 | CONFIG_INET_XFRM_MODE_TRANSPORT=m | ||
| 344 | CONFIG_INET_XFRM_MODE_TUNNEL=m | ||
| 345 | CONFIG_INET_XFRM_MODE_BEET=m | ||
| 346 | # CONFIG_INET_LRO is not set | ||
| 347 | CONFIG_INET_DIAG=m | ||
| 348 | CONFIG_INET_TCP_DIAG=m | ||
| 349 | # CONFIG_TCP_CONG_ADVANCED is not set | ||
| 350 | CONFIG_TCP_CONG_CUBIC=y | ||
| 351 | CONFIG_DEFAULT_TCP_CONG="cubic" | ||
| 352 | # CONFIG_TCP_MD5SIG is not set | ||
| 353 | # CONFIG_IP_VS is not set | ||
| 354 | CONFIG_IPV6=m | ||
| 355 | # CONFIG_IPV6_PRIVACY is not set | ||
| 356 | # CONFIG_IPV6_ROUTER_PREF is not set | ||
| 357 | # CONFIG_IPV6_OPTIMISTIC_DAD is not set | ||
| 358 | CONFIG_INET6_AH=m | ||
| 359 | CONFIG_INET6_ESP=m | ||
| 360 | CONFIG_INET6_IPCOMP=m | ||
| 361 | # CONFIG_IPV6_MIP6 is not set | ||
| 362 | CONFIG_INET6_XFRM_TUNNEL=m | ||
| 363 | CONFIG_INET6_TUNNEL=m | ||
| 364 | CONFIG_INET6_XFRM_MODE_TRANSPORT=m | ||
| 365 | CONFIG_INET6_XFRM_MODE_TUNNEL=m | ||
| 366 | CONFIG_INET6_XFRM_MODE_BEET=m | ||
| 367 | # CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION is not set | ||
| 368 | CONFIG_IPV6_SIT=m | ||
| 369 | CONFIG_IPV6_NDISC_NODETYPE=y | ||
| 370 | CONFIG_IPV6_TUNNEL=m | ||
| 371 | # CONFIG_IPV6_MULTIPLE_TABLES is not set | ||
| 372 | # CONFIG_IPV6_MROUTE is not set | ||
| 373 | # CONFIG_NETWORK_SECMARK is not set | ||
| 374 | CONFIG_NETFILTER=y | ||
| 375 | # CONFIG_NETFILTER_DEBUG is not set | ||
| 376 | CONFIG_NETFILTER_ADVANCED=y | ||
| 377 | |||
| 378 | # | ||
| 379 | # Core Netfilter Configuration | ||
| 380 | # | ||
| 381 | # CONFIG_NETFILTER_NETLINK_QUEUE is not set | ||
| 382 | # CONFIG_NETFILTER_NETLINK_LOG is not set | ||
| 383 | # CONFIG_NF_CONNTRACK is not set | ||
| 384 | CONFIG_NETFILTER_XTABLES=m | ||
| 385 | # CONFIG_NETFILTER_XT_TARGET_CLASSIFY is not set | ||
| 386 | # CONFIG_NETFILTER_XT_TARGET_DSCP is not set | ||
| 387 | # CONFIG_NETFILTER_XT_TARGET_MARK is not set | ||
| 388 | # CONFIG_NETFILTER_XT_TARGET_NFQUEUE is not set | ||
| 389 | # CONFIG_NETFILTER_XT_TARGET_NFLOG is not set | ||
| 390 | # CONFIG_NETFILTER_XT_TARGET_RATEEST is not set | ||
| 391 | # CONFIG_NETFILTER_XT_TARGET_TRACE is not set | ||
| 392 | # CONFIG_NETFILTER_XT_TARGET_TCPMSS is not set | ||
| 393 | # CONFIG_NETFILTER_XT_TARGET_TCPOPTSTRIP is not set | ||
| 394 | # CONFIG_NETFILTER_XT_MATCH_COMMENT is not set | ||
| 395 | # CONFIG_NETFILTER_XT_MATCH_DCCP is not set | ||
| 396 | # CONFIG_NETFILTER_XT_MATCH_DSCP is not set | ||
| 397 | # CONFIG_NETFILTER_XT_MATCH_ESP is not set | ||
| 398 | # CONFIG_NETFILTER_XT_MATCH_IPRANGE is not set | ||
| 399 | # CONFIG_NETFILTER_XT_MATCH_LENGTH is not set | ||
| 400 | # CONFIG_NETFILTER_XT_MATCH_LIMIT is not set | ||
| 401 | # CONFIG_NETFILTER_XT_MATCH_MAC is not set | ||
| 402 | # CONFIG_NETFILTER_XT_MATCH_MARK is not set | ||
| 403 | # CONFIG_NETFILTER_XT_MATCH_OWNER is not set | ||
| 404 | # CONFIG_NETFILTER_XT_MATCH_POLICY is not set | ||
| 405 | # CONFIG_NETFILTER_XT_MATCH_MULTIPORT is not set | ||
| 406 | # CONFIG_NETFILTER_XT_MATCH_PKTTYPE is not set | ||
| 407 | # CONFIG_NETFILTER_XT_MATCH_QUOTA is not set | ||
| 408 | # CONFIG_NETFILTER_XT_MATCH_RATEEST is not set | ||
| 409 | # CONFIG_NETFILTER_XT_MATCH_REALM is not set | ||
| 410 | # CONFIG_NETFILTER_XT_MATCH_SCTP is not set | ||
| 411 | # CONFIG_NETFILTER_XT_MATCH_STATISTIC is not set | ||
| 412 | # CONFIG_NETFILTER_XT_MATCH_STRING is not set | ||
| 413 | # CONFIG_NETFILTER_XT_MATCH_TCPMSS is not set | ||
| 414 | # CONFIG_NETFILTER_XT_MATCH_TIME is not set | ||
| 415 | # CONFIG_NETFILTER_XT_MATCH_U32 is not set | ||
| 416 | # CONFIG_NETFILTER_XT_MATCH_HASHLIMIT is not set | ||
| 417 | |||
| 418 | # | ||
| 419 | # IP: Netfilter Configuration | ||
| 420 | # | ||
| 421 | CONFIG_IP_NF_QUEUE=m | ||
| 422 | CONFIG_IP_NF_IPTABLES=m | ||
| 423 | CONFIG_IP_NF_MATCH_RECENT=m | ||
| 424 | CONFIG_IP_NF_MATCH_ECN=m | ||
| 425 | CONFIG_IP_NF_MATCH_AH=m | ||
| 426 | CONFIG_IP_NF_MATCH_TTL=m | ||
| 427 | CONFIG_IP_NF_MATCH_ADDRTYPE=m | ||
| 428 | CONFIG_IP_NF_FILTER=m | ||
| 429 | CONFIG_IP_NF_TARGET_REJECT=m | ||
| 430 | CONFIG_IP_NF_TARGET_LOG=m | ||
| 431 | CONFIG_IP_NF_TARGET_ULOG=m | ||
| 432 | CONFIG_IP_NF_MANGLE=m | ||
| 433 | CONFIG_IP_NF_TARGET_ECN=m | ||
| 434 | CONFIG_IP_NF_TARGET_TTL=m | ||
| 435 | CONFIG_IP_NF_RAW=m | ||
| 436 | CONFIG_IP_NF_ARPTABLES=m | ||
| 437 | CONFIG_IP_NF_ARPFILTER=m | ||
| 438 | CONFIG_IP_NF_ARP_MANGLE=m | ||
| 439 | |||
| 440 | # | ||
| 441 | # IPv6: Netfilter Configuration | ||
| 442 | # | ||
| 443 | # CONFIG_IP6_NF_QUEUE is not set | ||
| 444 | # CONFIG_IP6_NF_IPTABLES is not set | ||
| 445 | # CONFIG_IP_DCCP is not set | ||
| 446 | # CONFIG_IP_SCTP is not set | ||
| 447 | # CONFIG_TIPC is not set | ||
| 448 | # CONFIG_ATM is not set | ||
| 449 | # CONFIG_BRIDGE is not set | ||
| 450 | # CONFIG_VLAN_8021Q is not set | ||
| 451 | # CONFIG_DECNET is not set | ||
| 452 | # CONFIG_LLC2 is not set | ||
| 453 | # CONFIG_IPX is not set | ||
| 454 | # CONFIG_ATALK is not set | ||
| 455 | # CONFIG_X25 is not set | ||
| 456 | # CONFIG_LAPB is not set | ||
| 457 | # CONFIG_ECONET is not set | ||
| 458 | # CONFIG_WAN_ROUTER is not set | ||
| 459 | # CONFIG_NET_SCHED is not set | ||
| 460 | |||
| 461 | # | ||
| 462 | # Network testing | ||
| 463 | # | ||
| 464 | # CONFIG_NET_PKTGEN is not set | ||
| 465 | # CONFIG_HAMRADIO is not set | ||
| 466 | # CONFIG_CAN is not set | ||
| 467 | CONFIG_IRDA=m | ||
| 468 | |||
| 469 | # | ||
| 470 | # IrDA protocols | ||
| 471 | # | ||
| 472 | CONFIG_IRLAN=m | ||
| 473 | CONFIG_IRNET=m | ||
| 474 | CONFIG_IRCOMM=m | ||
| 475 | # CONFIG_IRDA_ULTRA is not set | ||
| 476 | |||
| 477 | # | ||
| 478 | # IrDA options | ||
| 479 | # | ||
| 480 | # CONFIG_IRDA_CACHE_LAST_LSAP is not set | ||
| 481 | # CONFIG_IRDA_FAST_RR is not set | ||
| 482 | # CONFIG_IRDA_DEBUG is not set | ||
| 483 | |||
| 484 | # | ||
| 485 | # Infrared-port device drivers | ||
| 486 | # | ||
| 487 | |||
| 488 | # | ||
| 489 | # SIR device drivers | ||
| 490 | # | ||
| 491 | # CONFIG_IRTTY_SIR is not set | ||
| 492 | |||
| 493 | # | ||
| 494 | # Dongle support | ||
| 495 | # | ||
| 496 | # CONFIG_KINGSUN_DONGLE is not set | ||
| 497 | # CONFIG_KSDAZZLE_DONGLE is not set | ||
| 498 | # CONFIG_KS959_DONGLE is not set | ||
| 499 | |||
| 500 | # | ||
| 501 | # FIR device drivers | ||
| 502 | # | ||
| 503 | # CONFIG_USB_IRDA is not set | ||
| 504 | # CONFIG_SIGMATEL_FIR is not set | ||
| 505 | CONFIG_PXA_FICP=m | ||
| 506 | # CONFIG_MCS_FIR is not set | ||
| 507 | CONFIG_BT=m | ||
| 508 | CONFIG_BT_L2CAP=m | ||
| 509 | CONFIG_BT_SCO=m | ||
| 510 | CONFIG_BT_RFCOMM=m | ||
| 511 | CONFIG_BT_RFCOMM_TTY=y | ||
| 512 | CONFIG_BT_BNEP=m | ||
| 513 | CONFIG_BT_BNEP_MC_FILTER=y | ||
| 514 | CONFIG_BT_BNEP_PROTO_FILTER=y | ||
| 515 | CONFIG_BT_HIDP=m | ||
| 516 | |||
| 517 | # | ||
| 518 | # Bluetooth device drivers | ||
| 519 | # | ||
| 520 | CONFIG_BT_HCIUSB=m | ||
| 521 | # CONFIG_BT_HCIUSB_SCO is not set | ||
| 522 | # CONFIG_BT_HCIBTSDIO is not set | ||
| 523 | CONFIG_BT_HCIUART=m | ||
| 524 | CONFIG_BT_HCIUART_H4=y | ||
| 525 | CONFIG_BT_HCIUART_BCSP=y | ||
| 526 | # CONFIG_BT_HCIUART_LL is not set | ||
| 527 | CONFIG_BT_HCIBCM203X=m | ||
| 528 | CONFIG_BT_HCIBPA10X=m | ||
| 529 | CONFIG_BT_HCIBFUSB=m | ||
| 530 | CONFIG_BT_HCIDTL1=m | ||
| 531 | CONFIG_BT_HCIBT3C=m | ||
| 532 | CONFIG_BT_HCIBLUECARD=m | ||
| 533 | CONFIG_BT_HCIBTUART=m | ||
| 534 | CONFIG_BT_HCIVHCI=m | ||
| 535 | # CONFIG_AF_RXRPC is not set | ||
| 536 | |||
| 537 | # | ||
| 538 | # Wireless | ||
| 539 | # | ||
| 540 | # CONFIG_CFG80211 is not set | ||
| 541 | CONFIG_WIRELESS_EXT=y | ||
| 542 | # CONFIG_MAC80211 is not set | ||
| 543 | CONFIG_IEEE80211=m | ||
| 544 | # CONFIG_IEEE80211_DEBUG is not set | ||
| 545 | CONFIG_IEEE80211_CRYPT_WEP=m | ||
| 546 | CONFIG_IEEE80211_CRYPT_CCMP=m | ||
| 547 | CONFIG_IEEE80211_CRYPT_TKIP=m | ||
| 548 | # CONFIG_RFKILL is not set | ||
| 549 | # CONFIG_NET_9P is not set | ||
| 550 | |||
| 551 | # | ||
| 552 | # Device Drivers | ||
| 553 | # | ||
| 554 | |||
| 555 | # | ||
| 556 | # Generic Driver Options | ||
| 557 | # | ||
| 558 | CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" | ||
| 559 | CONFIG_STANDALONE=y | ||
| 560 | CONFIG_PREVENT_FIRMWARE_BUILD=y | ||
| 561 | CONFIG_FW_LOADER=y | ||
| 562 | # CONFIG_DEBUG_DRIVER is not set | ||
| 563 | # CONFIG_DEBUG_DEVRES is not set | ||
| 564 | # CONFIG_SYS_HYPERVISOR is not set | ||
| 565 | # CONFIG_CONNECTOR is not set | ||
| 566 | CONFIG_MTD=m | ||
| 567 | # CONFIG_MTD_DEBUG is not set | ||
| 568 | # CONFIG_MTD_CONCAT is not set | ||
| 569 | CONFIG_MTD_PARTITIONS=y | ||
| 570 | # CONFIG_MTD_REDBOOT_PARTS is not set | ||
| 571 | # CONFIG_MTD_AFS_PARTS is not set | ||
| 572 | # CONFIG_MTD_AR7_PARTS is not set | ||
| 573 | |||
| 574 | # | ||
| 575 | # User Modules And Translation Layers | ||
| 576 | # | ||
| 577 | CONFIG_MTD_CHAR=m | ||
| 578 | CONFIG_MTD_BLKDEVS=m | ||
| 579 | CONFIG_MTD_BLOCK=m | ||
| 580 | # CONFIG_MTD_BLOCK_RO is not set | ||
| 581 | # CONFIG_FTL is not set | ||
| 582 | # CONFIG_NFTL is not set | ||
| 583 | # CONFIG_INFTL is not set | ||
| 584 | # CONFIG_RFD_FTL is not set | ||
| 585 | # CONFIG_SSFDC is not set | ||
| 586 | # CONFIG_MTD_OOPS is not set | ||
| 587 | |||
| 588 | # | ||
| 589 | # RAM/ROM/Flash chip drivers | ||
| 590 | # | ||
| 591 | # CONFIG_MTD_CFI is not set | ||
| 592 | # CONFIG_MTD_JEDECPROBE is not set | ||
| 593 | CONFIG_MTD_MAP_BANK_WIDTH_1=y | ||
| 594 | CONFIG_MTD_MAP_BANK_WIDTH_2=y | ||
| 595 | CONFIG_MTD_MAP_BANK_WIDTH_4=y | ||
| 596 | # CONFIG_MTD_MAP_BANK_WIDTH_8 is not set | ||
| 597 | # CONFIG_MTD_MAP_BANK_WIDTH_16 is not set | ||
| 598 | # CONFIG_MTD_MAP_BANK_WIDTH_32 is not set | ||
| 599 | CONFIG_MTD_CFI_I1=y | ||
| 600 | CONFIG_MTD_CFI_I2=y | ||
| 601 | # CONFIG_MTD_CFI_I4 is not set | ||
| 602 | # CONFIG_MTD_CFI_I8 is not set | ||
| 603 | # CONFIG_MTD_RAM is not set | ||
| 604 | CONFIG_MTD_ROM=m | ||
| 605 | # CONFIG_MTD_ABSENT is not set | ||
| 606 | |||
| 607 | # | ||
| 608 | # Mapping drivers for chip access | ||
| 609 | # | ||
| 610 | CONFIG_MTD_COMPLEX_MAPPINGS=y | ||
| 611 | # CONFIG_MTD_PHYSMAP is not set | ||
| 612 | CONFIG_MTD_SHARP_SL=m | ||
| 613 | # CONFIG_MTD_PLATRAM is not set | ||
| 614 | |||
| 615 | # | ||
| 616 | # Self-contained MTD device drivers | ||
| 617 | # | ||
| 618 | # CONFIG_MTD_SLRAM is not set | ||
| 619 | # CONFIG_MTD_PHRAM is not set | ||
| 620 | # CONFIG_MTD_MTDRAM is not set | ||
| 621 | # CONFIG_MTD_BLOCK2MTD is not set | ||
| 622 | |||
| 623 | # | ||
| 624 | # Disk-On-Chip Device Drivers | ||
| 625 | # | ||
| 626 | # CONFIG_MTD_DOC2000 is not set | ||
| 627 | # CONFIG_MTD_DOC2001 is not set | ||
| 628 | # CONFIG_MTD_DOC2001PLUS is not set | ||
| 629 | CONFIG_MTD_NAND=m | ||
| 630 | CONFIG_MTD_NAND_VERIFY_WRITE=y | ||
| 631 | # CONFIG_MTD_NAND_ECC_SMC is not set | ||
| 632 | # CONFIG_MTD_NAND_MUSEUM_IDS is not set | ||
| 633 | # CONFIG_MTD_NAND_H1900 is not set | ||
| 634 | CONFIG_MTD_NAND_IDS=m | ||
| 635 | # CONFIG_MTD_NAND_DISKONCHIP is not set | ||
| 636 | CONFIG_MTD_NAND_SHARPSL=m | ||
| 637 | # CONFIG_MTD_NAND_NANDSIM is not set | ||
| 638 | # CONFIG_MTD_NAND_PLATFORM is not set | ||
| 639 | # CONFIG_MTD_ALAUDA is not set | ||
| 640 | # CONFIG_MTD_ONENAND is not set | ||
| 641 | |||
| 642 | # | ||
| 643 | # UBI - Unsorted block images | ||
| 644 | # | ||
| 645 | # CONFIG_MTD_UBI is not set | ||
| 646 | # CONFIG_PARPORT is not set | ||
| 647 | CONFIG_BLK_DEV=y | ||
| 648 | # CONFIG_BLK_DEV_COW_COMMON is not set | ||
| 649 | CONFIG_BLK_DEV_LOOP=y | ||
| 650 | # CONFIG_BLK_DEV_CRYPTOLOOP is not set | ||
| 651 | # CONFIG_BLK_DEV_NBD is not set | ||
| 652 | # CONFIG_BLK_DEV_UB is not set | ||
| 653 | # CONFIG_BLK_DEV_RAM is not set | ||
| 654 | # CONFIG_CDROM_PKTCDVD is not set | ||
| 655 | # CONFIG_ATA_OVER_ETH is not set | ||
| 656 | CONFIG_MISC_DEVICES=y | ||
| 657 | # CONFIG_EEPROM_93CX6 is not set | ||
| 658 | # CONFIG_ENCLOSURE_SERVICES is not set | ||
| 659 | CONFIG_HAVE_IDE=y | ||
| 660 | CONFIG_IDE=y | ||
| 661 | CONFIG_IDE_MAX_HWIFS=4 | ||
| 662 | CONFIG_BLK_DEV_IDE=y | ||
| 663 | |||
| 664 | # | ||
| 665 | # Please see Documentation/ide/ide.txt for help/info on IDE drives | ||
| 666 | # | ||
| 667 | # CONFIG_BLK_DEV_IDE_SATA is not set | ||
| 668 | CONFIG_BLK_DEV_IDEDISK=y | ||
| 669 | # CONFIG_IDEDISK_MULTI_MODE is not set | ||
| 670 | CONFIG_BLK_DEV_IDECS=y | ||
| 671 | # CONFIG_BLK_DEV_IDECD is not set | ||
| 672 | # CONFIG_BLK_DEV_IDETAPE is not set | ||
| 673 | # CONFIG_BLK_DEV_IDEFLOPPY is not set | ||
| 674 | # CONFIG_BLK_DEV_IDESCSI is not set | ||
| 675 | # CONFIG_IDE_TASK_IOCTL is not set | ||
| 676 | CONFIG_IDE_PROC_FS=y | ||
| 677 | |||
| 678 | # | ||
| 679 | # IDE chipset support/bugfixes | ||
| 680 | # | ||
| 681 | # CONFIG_BLK_DEV_PLATFORM is not set | ||
| 682 | # CONFIG_BLK_DEV_IDEDMA is not set | ||
| 683 | # CONFIG_BLK_DEV_HD_ONLY is not set | ||
| 684 | # CONFIG_BLK_DEV_HD is not set | ||
| 685 | |||
| 686 | # | ||
| 687 | # SCSI device support | ||
| 688 | # | ||
| 689 | # CONFIG_RAID_ATTRS is not set | ||
| 690 | CONFIG_SCSI=m | ||
| 691 | CONFIG_SCSI_DMA=y | ||
| 692 | # CONFIG_SCSI_TGT is not set | ||
| 693 | # CONFIG_SCSI_NETLINK is not set | ||
| 694 | CONFIG_SCSI_PROC_FS=y | ||
| 695 | |||
| 696 | # | ||
| 697 | # SCSI support type (disk, tape, CD-ROM) | ||
| 698 | # | ||
| 699 | CONFIG_BLK_DEV_SD=m | ||
| 700 | CONFIG_CHR_DEV_ST=m | ||
| 701 | CONFIG_CHR_DEV_OSST=m | ||
| 702 | CONFIG_BLK_DEV_SR=m | ||
| 703 | # CONFIG_BLK_DEV_SR_VENDOR is not set | ||
| 704 | CONFIG_CHR_DEV_SG=m | ||
| 705 | # CONFIG_CHR_DEV_SCH is not set | ||
| 706 | |||
| 707 | # | ||
| 708 | # Some SCSI devices (e.g. CD jukebox) support multiple LUNs | ||
| 709 | # | ||
| 710 | CONFIG_SCSI_MULTI_LUN=y | ||
| 711 | # CONFIG_SCSI_CONSTANTS is not set | ||
| 712 | # CONFIG_SCSI_LOGGING is not set | ||
| 713 | # CONFIG_SCSI_SCAN_ASYNC is not set | ||
| 714 | CONFIG_SCSI_WAIT_SCAN=m | ||
| 715 | |||
| 716 | # | ||
| 717 | # SCSI Transports | ||
| 718 | # | ||
| 719 | # CONFIG_SCSI_SPI_ATTRS is not set | ||
| 720 | # CONFIG_SCSI_FC_ATTRS is not set | ||
| 721 | # CONFIG_SCSI_ISCSI_ATTRS is not set | ||
| 722 | # CONFIG_SCSI_SAS_LIBSAS is not set | ||
| 723 | # CONFIG_SCSI_SRP_ATTRS is not set | ||
| 724 | CONFIG_SCSI_LOWLEVEL=y | ||
| 725 | # CONFIG_ISCSI_TCP is not set | ||
| 726 | # CONFIG_SCSI_DEBUG is not set | ||
| 727 | # CONFIG_SCSI_LOWLEVEL_PCMCIA is not set | ||
| 728 | # CONFIG_ATA is not set | ||
| 729 | CONFIG_MD=y | ||
| 730 | # CONFIG_BLK_DEV_MD is not set | ||
| 731 | CONFIG_BLK_DEV_DM=m | ||
| 732 | # CONFIG_DM_DEBUG is not set | ||
| 733 | CONFIG_DM_CRYPT=m | ||
| 734 | CONFIG_DM_SNAPSHOT=m | ||
| 735 | CONFIG_DM_MIRROR=m | ||
| 736 | CONFIG_DM_ZERO=m | ||
| 737 | CONFIG_DM_MULTIPATH=m | ||
| 738 | CONFIG_DM_MULTIPATH_EMC=m | ||
| 739 | # CONFIG_DM_MULTIPATH_RDAC is not set | ||
| 740 | # CONFIG_DM_MULTIPATH_HP is not set | ||
| 741 | # CONFIG_DM_DELAY is not set | ||
| 742 | # CONFIG_DM_UEVENT is not set | ||
| 743 | CONFIG_NETDEVICES=y | ||
| 744 | # CONFIG_NETDEVICES_MULTIQUEUE is not set | ||
| 745 | # CONFIG_DUMMY is not set | ||
| 746 | # CONFIG_BONDING is not set | ||
| 747 | # CONFIG_MACVLAN is not set | ||
| 748 | # CONFIG_EQUALIZER is not set | ||
| 749 | CONFIG_TUN=m | ||
| 750 | # CONFIG_VETH is not set | ||
| 751 | # CONFIG_PHYLIB is not set | ||
| 752 | CONFIG_NET_ETHERNET=y | ||
| 753 | CONFIG_MII=m | ||
| 754 | # CONFIG_AX88796 is not set | ||
| 755 | # CONFIG_SMC91X is not set | ||
| 756 | # CONFIG_DM9000 is not set | ||
| 757 | # CONFIG_SMC911X is not set | ||
| 758 | # CONFIG_IBM_NEW_EMAC_ZMII is not set | ||
| 759 | # CONFIG_IBM_NEW_EMAC_RGMII is not set | ||
| 760 | # CONFIG_IBM_NEW_EMAC_TAH is not set | ||
| 761 | # CONFIG_IBM_NEW_EMAC_EMAC4 is not set | ||
| 762 | # CONFIG_B44 is not set | ||
| 763 | # CONFIG_NETDEV_1000 is not set | ||
| 764 | # CONFIG_NETDEV_10000 is not set | ||
| 765 | |||
| 766 | # | ||
| 767 | # Wireless LAN | ||
| 768 | # | ||
| 769 | # CONFIG_WLAN_PRE80211 is not set | ||
| 770 | CONFIG_WLAN_80211=y | ||
| 771 | # CONFIG_PCMCIA_RAYCS is not set | ||
| 772 | # CONFIG_LIBERTAS is not set | ||
| 773 | CONFIG_HERMES=m | ||
| 774 | CONFIG_PCMCIA_HERMES=m | ||
| 775 | CONFIG_PCMCIA_SPECTRUM=m | ||
| 776 | # CONFIG_ATMEL is not set | ||
| 777 | CONFIG_AIRO_CS=m | ||
| 778 | # CONFIG_PCMCIA_WL3501 is not set | ||
| 779 | # CONFIG_USB_ZD1201 is not set | ||
| 780 | # CONFIG_USB_NET_RNDIS_WLAN is not set | ||
| 781 | # CONFIG_IWLWIFI_LEDS is not set | ||
| 782 | CONFIG_HOSTAP=m | ||
| 783 | CONFIG_HOSTAP_FIRMWARE=y | ||
| 784 | # CONFIG_HOSTAP_FIRMWARE_NVRAM is not set | ||
| 785 | CONFIG_HOSTAP_CS=m | ||
| 786 | |||
| 787 | # | ||
| 788 | # USB Network Adapters | ||
| 789 | # | ||
| 790 | CONFIG_USB_CATC=m | ||
| 791 | CONFIG_USB_KAWETH=m | ||
| 792 | CONFIG_USB_PEGASUS=m | ||
| 793 | CONFIG_USB_RTL8150=m | ||
| 794 | CONFIG_USB_USBNET=m | ||
| 795 | CONFIG_USB_NET_AX8817X=m | ||
| 796 | CONFIG_USB_NET_CDCETHER=m | ||
| 797 | # CONFIG_USB_NET_DM9601 is not set | ||
| 798 | # CONFIG_USB_NET_GL620A is not set | ||
| 799 | CONFIG_USB_NET_NET1080=m | ||
| 800 | # CONFIG_USB_NET_PLUSB is not set | ||
| 801 | # CONFIG_USB_NET_MCS7830 is not set | ||
| 802 | # CONFIG_USB_NET_RNDIS_HOST is not set | ||
| 803 | # CONFIG_USB_NET_CDC_SUBSET is not set | ||
| 804 | CONFIG_USB_NET_ZAURUS=m | ||
| 805 | CONFIG_NET_PCMCIA=y | ||
| 806 | # CONFIG_PCMCIA_3C589 is not set | ||
| 807 | # CONFIG_PCMCIA_3C574 is not set | ||
| 808 | # CONFIG_PCMCIA_FMVJ18X is not set | ||
| 809 | CONFIG_PCMCIA_PCNET=m | ||
| 810 | # CONFIG_PCMCIA_NMCLAN is not set | ||
| 811 | # CONFIG_PCMCIA_SMC91C92 is not set | ||
| 812 | # CONFIG_PCMCIA_XIRC2PS is not set | ||
| 813 | # CONFIG_PCMCIA_AXNET is not set | ||
| 814 | # CONFIG_WAN is not set | ||
| 815 | CONFIG_PPP=m | ||
| 816 | # CONFIG_PPP_MULTILINK is not set | ||
| 817 | # CONFIG_PPP_FILTER is not set | ||
| 818 | CONFIG_PPP_ASYNC=m | ||
| 819 | # CONFIG_PPP_SYNC_TTY is not set | ||
| 820 | CONFIG_PPP_DEFLATE=m | ||
| 821 | CONFIG_PPP_BSDCOMP=m | ||
| 822 | # CONFIG_PPP_MPPE is not set | ||
| 823 | # CONFIG_PPPOE is not set | ||
| 824 | # CONFIG_PPPOL2TP is not set | ||
| 825 | # CONFIG_SLIP is not set | ||
| 826 | CONFIG_SLHC=m | ||
| 827 | # CONFIG_NETCONSOLE is not set | ||
| 828 | # CONFIG_NETPOLL is not set | ||
| 829 | # CONFIG_NET_POLL_CONTROLLER is not set | ||
| 830 | # CONFIG_ISDN is not set | ||
| 831 | |||
| 832 | # | ||
| 833 | # Input device support | ||
| 834 | # | ||
| 835 | CONFIG_INPUT=y | ||
| 836 | # CONFIG_INPUT_FF_MEMLESS is not set | ||
| 837 | # CONFIG_INPUT_POLLDEV is not set | ||
| 838 | |||
| 839 | # | ||
| 840 | # Userland interfaces | ||
| 841 | # | ||
| 842 | CONFIG_INPUT_MOUSEDEV=m | ||
| 843 | # CONFIG_INPUT_MOUSEDEV_PSAUX is not set | ||
| 844 | CONFIG_INPUT_MOUSEDEV_SCREEN_X=640 | ||
| 845 | CONFIG_INPUT_MOUSEDEV_SCREEN_Y=480 | ||
| 846 | # CONFIG_INPUT_JOYDEV is not set | ||
| 847 | CONFIG_INPUT_EVDEV=y | ||
| 848 | # CONFIG_INPUT_EVBUG is not set | ||
| 849 | CONFIG_INPUT_APMPOWER=y | ||
| 850 | |||
| 851 | # | ||
| 852 | # Input Device Drivers | ||
| 853 | # | ||
| 854 | CONFIG_INPUT_KEYBOARD=y | ||
| 855 | # CONFIG_KEYBOARD_ATKBD is not set | ||
| 856 | # CONFIG_KEYBOARD_SUNKBD is not set | ||
| 857 | # CONFIG_KEYBOARD_LKKBD is not set | ||
| 858 | # CONFIG_KEYBOARD_XTKBD is not set | ||
| 859 | # CONFIG_KEYBOARD_NEWTON is not set | ||
| 860 | # CONFIG_KEYBOARD_STOWAWAY is not set | ||
| 861 | # CONFIG_KEYBOARD_CORGI is not set | ||
| 862 | CONFIG_KEYBOARD_SPITZ=y | ||
| 863 | # CONFIG_KEYBOARD_PXA27x is not set | ||
| 864 | # CONFIG_KEYBOARD_GPIO is not set | ||
| 865 | # CONFIG_INPUT_MOUSE is not set | ||
| 866 | # CONFIG_INPUT_JOYSTICK is not set | ||
| 867 | # CONFIG_INPUT_TABLET is not set | ||
| 868 | CONFIG_INPUT_TOUCHSCREEN=y | ||
| 869 | CONFIG_TOUCHSCREEN_CORGI=y | ||
| 870 | # CONFIG_TOUCHSCREEN_FUJITSU is not set | ||
| 871 | # CONFIG_TOUCHSCREEN_GUNZE is not set | ||
| 872 | # CONFIG_TOUCHSCREEN_ELO is not set | ||
| 873 | # CONFIG_TOUCHSCREEN_MTOUCH is not set | ||
| 874 | # CONFIG_TOUCHSCREEN_MK712 is not set | ||
| 875 | # CONFIG_TOUCHSCREEN_PENMOUNT is not set | ||
| 876 | # CONFIG_TOUCHSCREEN_TOUCHRIGHT is not set | ||
| 877 | # CONFIG_TOUCHSCREEN_TOUCHWIN is not set | ||
| 878 | # CONFIG_TOUCHSCREEN_UCB1400 is not set | ||
| 879 | # CONFIG_TOUCHSCREEN_WM97XX is not set | ||
| 880 | # CONFIG_TOUCHSCREEN_USB_COMPOSITE is not set | ||
| 881 | CONFIG_INPUT_MISC=y | ||
| 882 | # CONFIG_INPUT_ATI_REMOTE is not set | ||
| 883 | # CONFIG_INPUT_ATI_REMOTE2 is not set | ||
| 884 | # CONFIG_INPUT_KEYSPAN_REMOTE is not set | ||
| 885 | # CONFIG_INPUT_POWERMATE is not set | ||
| 886 | # CONFIG_INPUT_YEALINK is not set | ||
| 887 | CONFIG_INPUT_UINPUT=m | ||
| 888 | |||
| 889 | # | ||
| 890 | # Hardware I/O ports | ||
| 891 | # | ||
| 892 | # CONFIG_SERIO is not set | ||
| 893 | # CONFIG_GAMEPORT is not set | ||
| 894 | |||
| 895 | # | ||
| 896 | # Character devices | ||
| 897 | # | ||
| 898 | CONFIG_VT=y | ||
| 899 | CONFIG_VT_CONSOLE=y | ||
| 900 | CONFIG_HW_CONSOLE=y | ||
| 901 | # CONFIG_VT_HW_CONSOLE_BINDING is not set | ||
| 902 | CONFIG_DEVKMEM=y | ||
| 903 | # CONFIG_SERIAL_NONSTANDARD is not set | ||
| 904 | |||
| 905 | # | ||
| 906 | # Serial drivers | ||
| 907 | # | ||
| 908 | CONFIG_SERIAL_8250=m | ||
| 909 | CONFIG_SERIAL_8250_CS=m | ||
| 910 | CONFIG_SERIAL_8250_NR_UARTS=4 | ||
| 911 | CONFIG_SERIAL_8250_RUNTIME_UARTS=4 | ||
| 912 | # CONFIG_SERIAL_8250_EXTENDED is not set | ||
| 913 | |||
| 914 | # | ||
| 915 | # Non-8250 serial port support | ||
| 916 | # | ||
| 917 | CONFIG_SERIAL_PXA=y | ||
| 918 | CONFIG_SERIAL_PXA_CONSOLE=y | ||
| 919 | CONFIG_SERIAL_CORE=y | ||
| 920 | CONFIG_SERIAL_CORE_CONSOLE=y | ||
| 921 | CONFIG_UNIX98_PTYS=y | ||
| 922 | # CONFIG_LEGACY_PTYS is not set | ||
| 923 | # CONFIG_IPMI_HANDLER is not set | ||
| 924 | CONFIG_HW_RANDOM=m | ||
| 925 | # CONFIG_NVRAM is not set | ||
| 926 | # CONFIG_R3964 is not set | ||
| 927 | |||
| 928 | # | ||
| 929 | # PCMCIA character devices | ||
| 930 | # | ||
| 931 | # CONFIG_SYNCLINK_CS is not set | ||
| 932 | # CONFIG_CARDMAN_4000 is not set | ||
| 933 | # CONFIG_CARDMAN_4040 is not set | ||
| 934 | # CONFIG_IPWIRELESS is not set | ||
| 935 | # CONFIG_RAW_DRIVER is not set | ||
| 936 | # CONFIG_TCG_TPM is not set | ||
| 937 | CONFIG_I2C=y | ||
| 938 | CONFIG_I2C_BOARDINFO=y | ||
| 939 | # CONFIG_I2C_CHARDEV is not set | ||
| 940 | |||
| 941 | # | ||
| 942 | # I2C Hardware Bus support | ||
| 943 | # | ||
| 944 | # CONFIG_I2C_GPIO is not set | ||
| 945 | CONFIG_I2C_PXA=y | ||
| 946 | # CONFIG_I2C_PXA_SLAVE is not set | ||
| 947 | # CONFIG_I2C_OCORES is not set | ||
| 948 | # CONFIG_I2C_PARPORT_LIGHT is not set | ||
| 949 | # CONFIG_I2C_SIMTEC is not set | ||
| 950 | # CONFIG_I2C_TAOS_EVM is not set | ||
| 951 | # CONFIG_I2C_STUB is not set | ||
| 952 | # CONFIG_I2C_TINY_USB is not set | ||
| 953 | # CONFIG_I2C_PCA_PLATFORM is not set | ||
| 954 | |||
| 955 | # | ||
| 956 | # Miscellaneous I2C Chip support | ||
| 957 | # | ||
| 958 | # CONFIG_DS1682 is not set | ||
| 959 | # CONFIG_SENSORS_EEPROM is not set | ||
| 960 | # CONFIG_SENSORS_PCF8574 is not set | ||
| 961 | # CONFIG_PCF8575 is not set | ||
| 962 | # CONFIG_SENSORS_PCF8591 is not set | ||
| 963 | # CONFIG_TPS65010 is not set | ||
| 964 | # CONFIG_SENSORS_MAX6875 is not set | ||
| 965 | # CONFIG_SENSORS_TSL2550 is not set | ||
| 966 | # CONFIG_I2C_DEBUG_CORE is not set | ||
| 967 | # CONFIG_I2C_DEBUG_ALGO is not set | ||
| 968 | # CONFIG_I2C_DEBUG_BUS is not set | ||
| 969 | # CONFIG_I2C_DEBUG_CHIP is not set | ||
| 970 | # CONFIG_SPI is not set | ||
| 971 | CONFIG_HAVE_GPIO_LIB=y | ||
| 972 | |||
| 973 | # | ||
| 974 | # GPIO Support | ||
| 975 | # | ||
| 976 | # CONFIG_DEBUG_GPIO is not set | ||
| 977 | |||
| 978 | # | ||
| 979 | # I2C GPIO expanders: | ||
| 980 | # | ||
| 981 | # CONFIG_GPIO_PCA953X is not set | ||
| 982 | # CONFIG_GPIO_PCF857X is not set | ||
| 983 | |||
| 984 | # | ||
| 985 | # SPI GPIO expanders: | ||
| 986 | # | ||
| 987 | # CONFIG_W1 is not set | ||
| 988 | # CONFIG_POWER_SUPPLY is not set | ||
| 989 | # CONFIG_HWMON is not set | ||
| 990 | # CONFIG_WATCHDOG is not set | ||
| 991 | |||
| 992 | # | ||
| 993 | # Sonics Silicon Backplane | ||
| 994 | # | ||
| 995 | CONFIG_SSB_POSSIBLE=y | ||
| 996 | # CONFIG_SSB is not set | ||
| 997 | |||
| 998 | # | ||
| 999 | # Multifunction device drivers | ||
| 1000 | # | ||
| 1001 | # CONFIG_MFD_SM501 is not set | ||
| 1002 | # CONFIG_MFD_ASIC3 is not set | ||
| 1003 | # CONFIG_HTC_EGPIO is not set | ||
| 1004 | # CONFIG_HTC_PASIC3 is not set | ||
| 1005 | # CONFIG_HTC_ASIC3 is not set | ||
| 1006 | # CONFIG_HTC_ASIC3_DS1WM is not set | ||
| 1007 | |||
| 1008 | # | ||
| 1009 | # Multimedia devices | ||
| 1010 | # | ||
| 1011 | |||
| 1012 | # | ||
| 1013 | # Multimedia core support | ||
| 1014 | # | ||
| 1015 | CONFIG_VIDEO_DEV=m | ||
| 1016 | CONFIG_VIDEO_V4L2_COMMON=m | ||
| 1017 | CONFIG_VIDEO_ALLOW_V4L1=y | ||
| 1018 | CONFIG_VIDEO_V4L1_COMPAT=y | ||
| 1019 | # CONFIG_DVB_CORE is not set | ||
| 1020 | CONFIG_VIDEO_MEDIA=m | ||
| 1021 | |||
| 1022 | # | ||
| 1023 | # Multimedia drivers | ||
| 1024 | # | ||
| 1025 | # CONFIG_MEDIA_ATTACH is not set | ||
| 1026 | CONFIG_MEDIA_TUNER=m | ||
| 1027 | # CONFIG_MEDIA_TUNER_CUSTOMIZE is not set | ||
| 1028 | CONFIG_MEDIA_TUNER_SIMPLE=m | ||
| 1029 | CONFIG_MEDIA_TUNER_TDA8290=m | ||
| 1030 | CONFIG_MEDIA_TUNER_TDA9887=m | ||
| 1031 | CONFIG_MEDIA_TUNER_TEA5761=m | ||
| 1032 | CONFIG_MEDIA_TUNER_TEA5767=m | ||
| 1033 | CONFIG_MEDIA_TUNER_MT20XX=m | ||
| 1034 | CONFIG_MEDIA_TUNER_XC2028=m | ||
| 1035 | CONFIG_MEDIA_TUNER_XC5000=m | ||
| 1036 | CONFIG_VIDEO_V4L2=m | ||
| 1037 | CONFIG_VIDEO_V4L1=m | ||
| 1038 | CONFIG_VIDEO_CAPTURE_DRIVERS=y | ||
| 1039 | # CONFIG_VIDEO_ADV_DEBUG is not set | ||
| 1040 | CONFIG_VIDEO_HELPER_CHIPS_AUTO=y | ||
| 1041 | # CONFIG_VIDEO_VIVI is not set | ||
| 1042 | # CONFIG_VIDEO_CPIA is not set | ||
| 1043 | # CONFIG_VIDEO_CPIA2 is not set | ||
| 1044 | # CONFIG_VIDEO_SAA5246A is not set | ||
| 1045 | # CONFIG_VIDEO_SAA5249 is not set | ||
| 1046 | # CONFIG_TUNER_3036 is not set | ||
| 1047 | CONFIG_V4L_USB_DRIVERS=y | ||
| 1048 | # CONFIG_VIDEO_PVRUSB2 is not set | ||
| 1049 | # CONFIG_VIDEO_EM28XX is not set | ||
| 1050 | # CONFIG_VIDEO_USBVISION is not set | ||
| 1051 | CONFIG_VIDEO_USBVIDEO=m | ||
| 1052 | CONFIG_USB_VICAM=m | ||
| 1053 | CONFIG_USB_IBMCAM=m | ||
| 1054 | CONFIG_USB_KONICAWC=m | ||
| 1055 | # CONFIG_USB_QUICKCAM_MESSENGER is not set | ||
| 1056 | # CONFIG_USB_ET61X251 is not set | ||
| 1057 | # CONFIG_VIDEO_OVCAMCHIP is not set | ||
| 1058 | # CONFIG_USB_W9968CF is not set | ||
| 1059 | CONFIG_USB_OV511=m | ||
| 1060 | CONFIG_USB_SE401=m | ||
| 1061 | CONFIG_USB_SN9C102=m | ||
| 1062 | CONFIG_USB_STV680=m | ||
| 1063 | # CONFIG_USB_ZC0301 is not set | ||
| 1064 | # CONFIG_USB_PWC is not set | ||
| 1065 | # CONFIG_USB_ZR364XX is not set | ||
| 1066 | # CONFIG_USB_STKWEBCAM is not set | ||
| 1067 | # CONFIG_SOC_CAMERA is not set | ||
| 1068 | # CONFIG_VIDEO_PXA27x is not set | ||
| 1069 | CONFIG_RADIO_ADAPTERS=y | ||
| 1070 | CONFIG_USB_DSBR=m | ||
| 1071 | # CONFIG_USB_SI470X is not set | ||
| 1072 | CONFIG_DAB=y | ||
| 1073 | CONFIG_USB_DABUSB=m | ||
| 1074 | |||
| 1075 | # | ||
| 1076 | # Graphics support | ||
| 1077 | # | ||
| 1078 | # CONFIG_VGASTATE is not set | ||
| 1079 | CONFIG_VIDEO_OUTPUT_CONTROL=m | ||
| 1080 | CONFIG_FB=y | ||
| 1081 | # CONFIG_FIRMWARE_EDID is not set | ||
| 1082 | # CONFIG_FB_DDC is not set | ||
| 1083 | CONFIG_FB_CFB_FILLRECT=y | ||
| 1084 | CONFIG_FB_CFB_COPYAREA=y | ||
| 1085 | CONFIG_FB_CFB_IMAGEBLIT=y | ||
| 1086 | # CONFIG_FB_CFB_REV_PIXELS_IN_BYTE is not set | ||
| 1087 | # CONFIG_FB_SYS_FILLRECT is not set | ||
| 1088 | # CONFIG_FB_SYS_COPYAREA is not set | ||
| 1089 | # CONFIG_FB_SYS_IMAGEBLIT is not set | ||
| 1090 | # CONFIG_FB_FOREIGN_ENDIAN is not set | ||
| 1091 | # CONFIG_FB_SYS_FOPS is not set | ||
| 1092 | # CONFIG_FB_SVGALIB is not set | ||
| 1093 | # CONFIG_FB_MACMODES is not set | ||
| 1094 | # CONFIG_FB_BACKLIGHT is not set | ||
| 1095 | # CONFIG_FB_MODE_HELPERS is not set | ||
| 1096 | # CONFIG_FB_TILEBLITTING is not set | ||
| 1097 | |||
| 1098 | # | ||
| 1099 | # Frame buffer hardware drivers | ||
| 1100 | # | ||
| 1101 | # CONFIG_FB_S1D13XXX is not set | ||
| 1102 | CONFIG_FB_PXA=y | ||
| 1103 | # CONFIG_FB_PXA_SMARTPANEL is not set | ||
| 1104 | # CONFIG_FB_PXA_PARAMETERS is not set | ||
| 1105 | # CONFIG_FB_MBX is not set | ||
| 1106 | # CONFIG_FB_W100 is not set | ||
| 1107 | # CONFIG_FB_AM200EPD is not set | ||
| 1108 | # CONFIG_FB_VIRTUAL is not set | ||
| 1109 | CONFIG_BACKLIGHT_LCD_SUPPORT=y | ||
| 1110 | # CONFIG_LCD_CLASS_DEVICE is not set | ||
| 1111 | CONFIG_BACKLIGHT_CLASS_DEVICE=y | ||
| 1112 | CONFIG_BACKLIGHT_CORGI=y | ||
| 1113 | |||
| 1114 | # | ||
| 1115 | # Display device support | ||
| 1116 | # | ||
| 1117 | # CONFIG_DISPLAY_SUPPORT is not set | ||
| 1118 | |||
| 1119 | # | ||
| 1120 | # Console display driver support | ||
| 1121 | # | ||
| 1122 | # CONFIG_VGA_CONSOLE is not set | ||
| 1123 | CONFIG_DUMMY_CONSOLE=y | ||
| 1124 | CONFIG_FRAMEBUFFER_CONSOLE=y | ||
| 1125 | # CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY is not set | ||
| 1126 | CONFIG_FRAMEBUFFER_CONSOLE_ROTATION=y | ||
| 1127 | CONFIG_FONTS=y | ||
| 1128 | # CONFIG_FONT_8x8 is not set | ||
| 1129 | CONFIG_FONT_8x16=y | ||
| 1130 | # CONFIG_FONT_6x11 is not set | ||
| 1131 | # CONFIG_FONT_7x14 is not set | ||
| 1132 | # CONFIG_FONT_PEARL_8x8 is not set | ||
| 1133 | # CONFIG_FONT_ACORN_8x8 is not set | ||
| 1134 | # CONFIG_FONT_MINI_4x6 is not set | ||
| 1135 | # CONFIG_FONT_SUN8x16 is not set | ||
| 1136 | # CONFIG_FONT_SUN12x22 is not set | ||
| 1137 | # CONFIG_FONT_10x18 is not set | ||
| 1138 | CONFIG_LOGO=y | ||
| 1139 | # CONFIG_LOGO_LINUX_MONO is not set | ||
| 1140 | # CONFIG_LOGO_LINUX_VGA16 is not set | ||
| 1141 | # CONFIG_LOGO_LINUX_CLUT224 is not set | ||
| 1142 | CONFIG_LOGO_OHAND_CLUT224=y | ||
| 1143 | |||
| 1144 | # | ||
| 1145 | # Sound | ||
| 1146 | # | ||
| 1147 | CONFIG_SOUND=m | ||
| 1148 | |||
| 1149 | # | ||
| 1150 | # Advanced Linux Sound Architecture | ||
| 1151 | # | ||
| 1152 | CONFIG_SND=m | ||
| 1153 | CONFIG_SND_TIMER=m | ||
| 1154 | CONFIG_SND_PCM=m | ||
| 1155 | CONFIG_SND_HWDEP=m | ||
| 1156 | CONFIG_SND_RAWMIDI=m | ||
| 1157 | CONFIG_SND_SEQUENCER=m | ||
| 1158 | # CONFIG_SND_SEQ_DUMMY is not set | ||
| 1159 | CONFIG_SND_OSSEMUL=y | ||
| 1160 | CONFIG_SND_MIXER_OSS=m | ||
| 1161 | CONFIG_SND_PCM_OSS=m | ||
| 1162 | CONFIG_SND_PCM_OSS_PLUGINS=y | ||
| 1163 | # CONFIG_SND_SEQUENCER_OSS is not set | ||
| 1164 | # CONFIG_SND_DYNAMIC_MINORS is not set | ||
| 1165 | CONFIG_SND_SUPPORT_OLD_API=y | ||
| 1166 | CONFIG_SND_VERBOSE_PROCFS=y | ||
| 1167 | # CONFIG_SND_VERBOSE_PRINTK is not set | ||
| 1168 | # CONFIG_SND_DEBUG is not set | ||
| 1169 | |||
| 1170 | # | ||
| 1171 | # Generic devices | ||
| 1172 | # | ||
| 1173 | CONFIG_SND_AC97_CODEC=m | ||
| 1174 | # CONFIG_SND_DUMMY is not set | ||
| 1175 | # CONFIG_SND_VIRMIDI is not set | ||
| 1176 | # CONFIG_SND_MTPAV is not set | ||
| 1177 | # CONFIG_SND_SERIAL_U16550 is not set | ||
| 1178 | # CONFIG_SND_MPU401 is not set | ||
| 1179 | |||
| 1180 | # | ||
| 1181 | # ALSA ARM devices | ||
| 1182 | # | ||
| 1183 | CONFIG_SND_PXA2XX_PCM=m | ||
| 1184 | CONFIG_SND_PXA2XX_AC97=m | ||
| 1185 | |||
| 1186 | # | ||
| 1187 | # USB devices | ||
| 1188 | # | ||
| 1189 | CONFIG_SND_USB_AUDIO=m | ||
| 1190 | # CONFIG_SND_USB_CAIAQ is not set | ||
| 1191 | |||
| 1192 | # | ||
| 1193 | # PCMCIA devices | ||
| 1194 | # | ||
| 1195 | # CONFIG_SND_VXPOCKET is not set | ||
| 1196 | # CONFIG_SND_PDAUDIOCF is not set | ||
| 1197 | |||
| 1198 | # | ||
| 1199 | # System on Chip audio support | ||
| 1200 | # | ||
| 1201 | CONFIG_SND_SOC=m | ||
| 1202 | CONFIG_SND_PXA2XX_SOC=m | ||
| 1203 | CONFIG_SND_PXA2XX_SOC_I2S=m | ||
| 1204 | CONFIG_SND_PXA2XX_SOC_SPITZ=m | ||
| 1205 | |||
| 1206 | # | ||
| 1207 | # ALSA SoC audio for Freescale SOCs | ||
| 1208 | # | ||
| 1209 | |||
| 1210 | # | ||
| 1211 | # SoC Audio for the Texas Instruments OMAP | ||
| 1212 | # | ||
| 1213 | CONFIG_SND_SOC_WM8750=m | ||
| 1214 | |||
| 1215 | # | ||
| 1216 | # Open Sound System | ||
| 1217 | # | ||
| 1218 | # CONFIG_SOUND_PRIME is not set | ||
| 1219 | CONFIG_AC97_BUS=m | ||
| 1220 | CONFIG_HID_SUPPORT=y | ||
| 1221 | CONFIG_HID=m | ||
| 1222 | # CONFIG_HID_DEBUG is not set | ||
| 1223 | # CONFIG_HIDRAW is not set | ||
| 1224 | |||
| 1225 | # | ||
| 1226 | # USB Input Devices | ||
| 1227 | # | ||
| 1228 | CONFIG_USB_HID=m | ||
| 1229 | # CONFIG_USB_HIDINPUT_POWERBOOK is not set | ||
| 1230 | # CONFIG_HID_FF is not set | ||
| 1231 | # CONFIG_USB_HIDDEV is not set | ||
| 1232 | |||
| 1233 | # | ||
| 1234 | # USB HID Boot Protocol drivers | ||
| 1235 | # | ||
| 1236 | CONFIG_USB_KBD=m | ||
| 1237 | CONFIG_USB_MOUSE=m | ||
| 1238 | CONFIG_USB_SUPPORT=y | ||
| 1239 | CONFIG_USB_ARCH_HAS_HCD=y | ||
| 1240 | CONFIG_USB_ARCH_HAS_OHCI=y | ||
| 1241 | # CONFIG_USB_ARCH_HAS_EHCI is not set | ||
| 1242 | CONFIG_USB=m | ||
| 1243 | # CONFIG_USB_DEBUG is not set | ||
| 1244 | # CONFIG_USB_ANNOUNCE_NEW_DEVICES is not set | ||
| 1245 | |||
| 1246 | # | ||
| 1247 | # Miscellaneous USB options | ||
| 1248 | # | ||
| 1249 | CONFIG_USB_DEVICEFS=y | ||
| 1250 | CONFIG_USB_DEVICE_CLASS=y | ||
| 1251 | # CONFIG_USB_DYNAMIC_MINORS is not set | ||
| 1252 | # CONFIG_USB_SUSPEND is not set | ||
| 1253 | # CONFIG_USB_OTG is not set | ||
| 1254 | # CONFIG_USB_OTG_WHITELIST is not set | ||
| 1255 | # CONFIG_USB_OTG_BLACKLIST_HUB is not set | ||
| 1256 | |||
| 1257 | # | ||
| 1258 | # USB Host Controller Drivers | ||
| 1259 | # | ||
| 1260 | # CONFIG_USB_C67X00_HCD is not set | ||
| 1261 | # CONFIG_USB_ISP116X_HCD is not set | ||
| 1262 | # CONFIG_USB_ISP1760_HCD is not set | ||
| 1263 | CONFIG_USB_OHCI_HCD=m | ||
| 1264 | # CONFIG_USB_OHCI_BIG_ENDIAN_DESC is not set | ||
| 1265 | # CONFIG_USB_OHCI_BIG_ENDIAN_MMIO is not set | ||
| 1266 | CONFIG_USB_OHCI_LITTLE_ENDIAN=y | ||
| 1267 | CONFIG_USB_SL811_HCD=m | ||
| 1268 | CONFIG_USB_SL811_CS=m | ||
| 1269 | # CONFIG_USB_R8A66597_HCD is not set | ||
| 1270 | |||
| 1271 | # | ||
| 1272 | # USB Device Class drivers | ||
| 1273 | # | ||
| 1274 | CONFIG_USB_ACM=m | ||
| 1275 | CONFIG_USB_PRINTER=m | ||
| 1276 | # CONFIG_USB_WDM is not set | ||
| 1277 | |||
| 1278 | # | ||
| 1279 | # NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' | ||
| 1280 | # | ||
| 1281 | |||
| 1282 | # | ||
| 1283 | # may also be needed; see USB_STORAGE Help for more information | ||
| 1284 | # | ||
| 1285 | CONFIG_USB_STORAGE=m | ||
| 1286 | # CONFIG_USB_STORAGE_DEBUG is not set | ||
| 1287 | # CONFIG_USB_STORAGE_DATAFAB is not set | ||
| 1288 | # CONFIG_USB_STORAGE_FREECOM is not set | ||
| 1289 | # CONFIG_USB_STORAGE_ISD200 is not set | ||
| 1290 | # CONFIG_USB_STORAGE_DPCM is not set | ||
| 1291 | # CONFIG_USB_STORAGE_USBAT is not set | ||
| 1292 | # CONFIG_USB_STORAGE_SDDR09 is not set | ||
| 1293 | # CONFIG_USB_STORAGE_SDDR55 is not set | ||
| 1294 | # CONFIG_USB_STORAGE_JUMPSHOT is not set | ||
| 1295 | # CONFIG_USB_STORAGE_ALAUDA is not set | ||
| 1296 | # CONFIG_USB_STORAGE_ONETOUCH is not set | ||
| 1297 | # CONFIG_USB_STORAGE_KARMA is not set | ||
| 1298 | # CONFIG_USB_STORAGE_CYPRESS_ATACB is not set | ||
| 1299 | # CONFIG_USB_LIBUSUAL is not set | ||
| 1300 | |||
| 1301 | # | ||
| 1302 | # USB Imaging devices | ||
| 1303 | # | ||
| 1304 | CONFIG_USB_MDC800=m | ||
| 1305 | CONFIG_USB_MICROTEK=m | ||
| 1306 | CONFIG_USB_MON=y | ||
| 1307 | |||
| 1308 | # | ||
| 1309 | # USB port drivers | ||
| 1310 | # | ||
| 1311 | CONFIG_USB_SERIAL=m | ||
| 1312 | CONFIG_USB_EZUSB=y | ||
| 1313 | CONFIG_USB_SERIAL_GENERIC=y | ||
| 1314 | # CONFIG_USB_SERIAL_AIRCABLE is not set | ||
| 1315 | # CONFIG_USB_SERIAL_AIRPRIME is not set | ||
| 1316 | # CONFIG_USB_SERIAL_ARK3116 is not set | ||
| 1317 | CONFIG_USB_SERIAL_BELKIN=m | ||
| 1318 | # CONFIG_USB_SERIAL_CH341 is not set | ||
| 1319 | # CONFIG_USB_SERIAL_WHITEHEAT is not set | ||
| 1320 | CONFIG_USB_SERIAL_DIGI_ACCELEPORT=m | ||
| 1321 | # CONFIG_USB_SERIAL_CP2101 is not set | ||
| 1322 | CONFIG_USB_SERIAL_CYPRESS_M8=m | ||
| 1323 | CONFIG_USB_SERIAL_EMPEG=m | ||
| 1324 | CONFIG_USB_SERIAL_FTDI_SIO=m | ||
| 1325 | # CONFIG_USB_SERIAL_FUNSOFT is not set | ||
| 1326 | CONFIG_USB_SERIAL_VISOR=m | ||
| 1327 | CONFIG_USB_SERIAL_IPAQ=m | ||
| 1328 | CONFIG_USB_SERIAL_IR=m | ||
| 1329 | CONFIG_USB_SERIAL_EDGEPORT=m | ||
| 1330 | CONFIG_USB_SERIAL_EDGEPORT_TI=m | ||
| 1331 | CONFIG_USB_SERIAL_GARMIN=m | ||
| 1332 | CONFIG_USB_SERIAL_IPW=m | ||
| 1333 | # CONFIG_USB_SERIAL_IUU is not set | ||
| 1334 | CONFIG_USB_SERIAL_KEYSPAN_PDA=m | ||
| 1335 | CONFIG_USB_SERIAL_KEYSPAN=m | ||
| 1336 | # CONFIG_USB_SERIAL_KEYSPAN_MPR is not set | ||
| 1337 | # CONFIG_USB_SERIAL_KEYSPAN_USA28 is not set | ||
| 1338 | # CONFIG_USB_SERIAL_KEYSPAN_USA28X is not set | ||
| 1339 | # CONFIG_USB_SERIAL_KEYSPAN_USA28XA is not set | ||
| 1340 | # CONFIG_USB_SERIAL_KEYSPAN_USA28XB is not set | ||
| 1341 | # CONFIG_USB_SERIAL_KEYSPAN_USA19 is not set | ||
| 1342 | # CONFIG_USB_SERIAL_KEYSPAN_USA18X is not set | ||
| 1343 | # CONFIG_USB_SERIAL_KEYSPAN_USA19W is not set | ||
| 1344 | # CONFIG_USB_SERIAL_KEYSPAN_USA19QW is not set | ||
| 1345 | # CONFIG_USB_SERIAL_KEYSPAN_USA19QI is not set | ||
| 1346 | # CONFIG_USB_SERIAL_KEYSPAN_USA49W is not set | ||
| 1347 | # CONFIG_USB_SERIAL_KEYSPAN_USA49WLC is not set | ||
| 1348 | CONFIG_USB_SERIAL_KLSI=m | ||
| 1349 | CONFIG_USB_SERIAL_KOBIL_SCT=m | ||
| 1350 | CONFIG_USB_SERIAL_MCT_U232=m | ||
| 1351 | # CONFIG_USB_SERIAL_MOS7720 is not set | ||
| 1352 | # CONFIG_USB_SERIAL_MOS7840 is not set | ||
| 1353 | # CONFIG_USB_SERIAL_MOTOROLA is not set | ||
| 1354 | # CONFIG_USB_SERIAL_NAVMAN is not set | ||
| 1355 | CONFIG_USB_SERIAL_PL2303=m | ||
| 1356 | # CONFIG_USB_SERIAL_OTI6858 is not set | ||
| 1357 | # CONFIG_USB_SERIAL_SPCP8X5 is not set | ||
| 1358 | # CONFIG_USB_SERIAL_HP4X is not set | ||
| 1359 | CONFIG_USB_SERIAL_SAFE=m | ||
| 1360 | # CONFIG_USB_SERIAL_SAFE_PADDED is not set | ||
| 1361 | # CONFIG_USB_SERIAL_SIERRAWIRELESS is not set | ||
| 1362 | CONFIG_USB_SERIAL_TI=m | ||
| 1363 | CONFIG_USB_SERIAL_CYBERJACK=m | ||
| 1364 | CONFIG_USB_SERIAL_XIRCOM=m | ||
| 1365 | # CONFIG_USB_SERIAL_OPTION is not set | ||
| 1366 | CONFIG_USB_SERIAL_OMNINET=m | ||
| 1367 | # CONFIG_USB_SERIAL_DEBUG is not set | ||
| 1368 | |||
| 1369 | # | ||
| 1370 | # USB Miscellaneous drivers | ||
| 1371 | # | ||
| 1372 | CONFIG_USB_EMI62=m | ||
| 1373 | CONFIG_USB_EMI26=m | ||
| 1374 | # CONFIG_USB_ADUTUX is not set | ||
| 1375 | CONFIG_USB_AUERSWALD=m | ||
| 1376 | CONFIG_USB_RIO500=m | ||
| 1377 | CONFIG_USB_LEGOTOWER=m | ||
| 1378 | CONFIG_USB_LCD=m | ||
| 1379 | # CONFIG_USB_BERRY_CHARGE is not set | ||
| 1380 | CONFIG_USB_LED=m | ||
| 1381 | # CONFIG_USB_CYPRESS_CY7C63 is not set | ||
| 1382 | CONFIG_USB_CYTHERM=m | ||
| 1383 | # CONFIG_USB_PHIDGET is not set | ||
| 1384 | CONFIG_USB_IDMOUSE=m | ||
| 1385 | # CONFIG_USB_FTDI_ELAN is not set | ||
| 1386 | # CONFIG_USB_APPLEDISPLAY is not set | ||
| 1387 | # CONFIG_USB_LD is not set | ||
| 1388 | # CONFIG_USB_TRANCEVIBRATOR is not set | ||
| 1389 | # CONFIG_USB_IOWARRIOR is not set | ||
| 1390 | # CONFIG_USB_TEST is not set | ||
| 1391 | CONFIG_USB_GADGET=m | ||
| 1392 | # CONFIG_USB_GADGET_DEBUG is not set | ||
| 1393 | # CONFIG_USB_GADGET_DEBUG_FILES is not set | ||
| 1394 | CONFIG_USB_GADGET_SELECTED=y | ||
| 1395 | # CONFIG_USB_GADGET_AMD5536UDC is not set | ||
| 1396 | # CONFIG_USB_GADGET_ATMEL_USBA is not set | ||
| 1397 | # CONFIG_USB_GADGET_FSL_USB2 is not set | ||
| 1398 | # CONFIG_USB_GADGET_NET2280 is not set | ||
| 1399 | # CONFIG_USB_GADGET_PXA2XX is not set | ||
| 1400 | # CONFIG_USB_GADGET_M66592 is not set | ||
| 1401 | CONFIG_USB_GADGET_PXA27X=y | ||
| 1402 | CONFIG_USB_PXA27X=m | ||
| 1403 | # CONFIG_USB_GADGET_GOKU is not set | ||
| 1404 | # CONFIG_USB_GADGET_LH7A40X is not set | ||
| 1405 | # CONFIG_USB_GADGET_OMAP is not set | ||
| 1406 | # CONFIG_USB_GADGET_S3C2410 is not set | ||
| 1407 | # CONFIG_USB_GADGET_AT91 is not set | ||
| 1408 | # CONFIG_USB_GADGET_DUMMY_HCD is not set | ||
| 1409 | # CONFIG_USB_GADGET_DUALSPEED is not set | ||
| 1410 | CONFIG_USB_ZERO=m | ||
| 1411 | CONFIG_USB_ETH=m | ||
| 1412 | CONFIG_USB_ETH_RNDIS=y | ||
| 1413 | CONFIG_USB_GADGETFS=m | ||
| 1414 | CONFIG_USB_FILE_STORAGE=m | ||
| 1415 | # CONFIG_USB_FILE_STORAGE_TEST is not set | ||
| 1416 | CONFIG_USB_G_SERIAL=m | ||
| 1417 | # CONFIG_USB_MIDI_GADGET is not set | ||
| 1418 | # CONFIG_USB_G_PRINTER is not set | ||
| 1419 | CONFIG_MMC=y | ||
| 1420 | # CONFIG_MMC_DEBUG is not set | ||
| 1421 | CONFIG_MMC_UNSAFE_RESUME=y | ||
| 1422 | |||
| 1423 | # | ||
| 1424 | # MMC/SD Card Drivers | ||
| 1425 | # | ||
| 1426 | CONFIG_MMC_BLOCK=y | ||
| 1427 | CONFIG_MMC_BLOCK_BOUNCE=y | ||
| 1428 | # CONFIG_SDIO_UART is not set | ||
| 1429 | # CONFIG_MMC_TEST is not set | ||
| 1430 | |||
| 1431 | # | ||
| 1432 | # MMC/SD Host Controller Drivers | ||
| 1433 | # | ||
| 1434 | CONFIG_MMC_PXA=y | ||
| 1435 | CONFIG_NEW_LEDS=y | ||
| 1436 | CONFIG_LEDS_CLASS=y | ||
| 1437 | |||
| 1438 | # | ||
| 1439 | # LED drivers | ||
| 1440 | # | ||
| 1441 | CONFIG_LEDS_SPITZ=y | ||
| 1442 | # CONFIG_LEDS_GPIO is not set | ||
| 1443 | |||
| 1444 | # | ||
| 1445 | # LED Triggers | ||
| 1446 | # | ||
| 1447 | CONFIG_LEDS_TRIGGERS=y | ||
| 1448 | CONFIG_LEDS_TRIGGER_TIMER=y | ||
| 1449 | CONFIG_LEDS_TRIGGER_IDE_DISK=y | ||
| 1450 | # CONFIG_LEDS_TRIGGER_HEARTBEAT is not set | ||
| 1451 | # CONFIG_LEDS_TRIGGER_DEFAULT_ON is not set | ||
| 1452 | CONFIG_RTC_LIB=y | ||
| 1453 | CONFIG_RTC_CLASS=y | ||
| 1454 | CONFIG_RTC_HCTOSYS=y | ||
| 1455 | CONFIG_RTC_HCTOSYS_DEVICE="rtc0" | ||
| 1456 | # CONFIG_RTC_DEBUG is not set | ||
| 1457 | |||
| 1458 | # | ||
| 1459 | # RTC interfaces | ||
| 1460 | # | ||
| 1461 | CONFIG_RTC_INTF_SYSFS=y | ||
| 1462 | CONFIG_RTC_INTF_PROC=y | ||
| 1463 | CONFIG_RTC_INTF_DEV=y | ||
| 1464 | # CONFIG_RTC_INTF_DEV_UIE_EMUL is not set | ||
| 1465 | # CONFIG_RTC_DRV_TEST is not set | ||
| 1466 | |||
| 1467 | # | ||
| 1468 | # I2C RTC drivers | ||
| 1469 | # | ||
| 1470 | # CONFIG_RTC_DRV_DS1307 is not set | ||
| 1471 | # CONFIG_RTC_DRV_DS1374 is not set | ||
| 1472 | # CONFIG_RTC_DRV_DS1672 is not set | ||
| 1473 | # CONFIG_RTC_DRV_MAX6900 is not set | ||
| 1474 | # CONFIG_RTC_DRV_RS5C372 is not set | ||
| 1475 | # CONFIG_RTC_DRV_ISL1208 is not set | ||
| 1476 | # CONFIG_RTC_DRV_X1205 is not set | ||
| 1477 | # CONFIG_RTC_DRV_PCF8563 is not set | ||
| 1478 | # CONFIG_RTC_DRV_PCF8583 is not set | ||
| 1479 | # CONFIG_RTC_DRV_M41T80 is not set | ||
| 1480 | # CONFIG_RTC_DRV_S35390A is not set | ||
| 1481 | |||
| 1482 | # | ||
| 1483 | # SPI RTC drivers | ||
| 1484 | # | ||
| 1485 | |||
| 1486 | # | ||
| 1487 | # Platform RTC drivers | ||
| 1488 | # | ||
| 1489 | # CONFIG_RTC_DRV_CMOS is not set | ||
| 1490 | # CONFIG_RTC_DRV_DS1511 is not set | ||
| 1491 | # CONFIG_RTC_DRV_DS1553 is not set | ||
| 1492 | # CONFIG_RTC_DRV_DS1742 is not set | ||
| 1493 | # CONFIG_RTC_DRV_STK17TA8 is not set | ||
| 1494 | # CONFIG_RTC_DRV_M48T86 is not set | ||
| 1495 | # CONFIG_RTC_DRV_M48T59 is not set | ||
| 1496 | # CONFIG_RTC_DRV_V3020 is not set | ||
| 1497 | |||
| 1498 | # | ||
| 1499 | # on-CPU RTC drivers | ||
| 1500 | # | ||
| 1501 | CONFIG_RTC_DRV_SA1100=y | ||
| 1502 | # CONFIG_UIO is not set | ||
| 1503 | |||
| 1504 | # | ||
| 1505 | # File systems | ||
| 1506 | # | ||
| 1507 | CONFIG_EXT2_FS=y | ||
| 1508 | # CONFIG_EXT2_FS_XATTR is not set | ||
| 1509 | # CONFIG_EXT2_FS_XIP is not set | ||
| 1510 | CONFIG_EXT3_FS=y | ||
| 1511 | # CONFIG_EXT3_FS_XATTR is not set | ||
| 1512 | # CONFIG_EXT4DEV_FS is not set | ||
| 1513 | CONFIG_JBD=y | ||
| 1514 | # CONFIG_REISERFS_FS is not set | ||
| 1515 | # CONFIG_JFS_FS is not set | ||
| 1516 | CONFIG_FS_POSIX_ACL=y | ||
| 1517 | # CONFIG_XFS_FS is not set | ||
| 1518 | # CONFIG_OCFS2_FS is not set | ||
| 1519 | CONFIG_DNOTIFY=y | ||
| 1520 | CONFIG_INOTIFY=y | ||
| 1521 | CONFIG_INOTIFY_USER=y | ||
| 1522 | # CONFIG_QUOTA is not set | ||
| 1523 | # CONFIG_AUTOFS_FS is not set | ||
| 1524 | # CONFIG_AUTOFS4_FS is not set | ||
| 1525 | # CONFIG_FUSE_FS is not set | ||
| 1526 | |||
| 1527 | # | ||
| 1528 | # CD-ROM/DVD Filesystems | ||
| 1529 | # | ||
| 1530 | # CONFIG_ISO9660_FS is not set | ||
| 1531 | # CONFIG_UDF_FS is not set | ||
| 1532 | |||
| 1533 | # | ||
| 1534 | # DOS/FAT/NT Filesystems | ||
| 1535 | # | ||
| 1536 | CONFIG_FAT_FS=y | ||
| 1537 | # CONFIG_MSDOS_FS is not set | ||
| 1538 | CONFIG_VFAT_FS=y | ||
| 1539 | CONFIG_FAT_DEFAULT_CODEPAGE=437 | ||
| 1540 | CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" | ||
| 1541 | # CONFIG_NTFS_FS is not set | ||
| 1542 | |||
| 1543 | # | ||
| 1544 | # Pseudo filesystems | ||
| 1545 | # | ||
| 1546 | CONFIG_PROC_FS=y | ||
| 1547 | CONFIG_PROC_SYSCTL=y | ||
| 1548 | CONFIG_SYSFS=y | ||
| 1549 | CONFIG_TMPFS=y | ||
| 1550 | # CONFIG_TMPFS_POSIX_ACL is not set | ||
| 1551 | # CONFIG_HUGETLB_PAGE is not set | ||
| 1552 | # CONFIG_CONFIGFS_FS is not set | ||
| 1553 | |||
| 1554 | # | ||
| 1555 | # Miscellaneous filesystems | ||
| 1556 | # | ||
| 1557 | # CONFIG_ADFS_FS is not set | ||
| 1558 | # CONFIG_AFFS_FS is not set | ||
| 1559 | # CONFIG_HFS_FS is not set | ||
| 1560 | # CONFIG_HFSPLUS_FS is not set | ||
| 1561 | # CONFIG_BEFS_FS is not set | ||
| 1562 | # CONFIG_BFS_FS is not set | ||
| 1563 | # CONFIG_EFS_FS is not set | ||
| 1564 | CONFIG_JFFS2_FS=m | ||
| 1565 | CONFIG_JFFS2_FS_DEBUG=0 | ||
| 1566 | CONFIG_JFFS2_FS_WRITEBUFFER=y | ||
| 1567 | # CONFIG_JFFS2_FS_WBUF_VERIFY is not set | ||
| 1568 | CONFIG_JFFS2_SUMMARY=y | ||
| 1569 | # CONFIG_JFFS2_FS_XATTR is not set | ||
| 1570 | # CONFIG_JFFS2_SYSFS is not set | ||
| 1571 | CONFIG_JFFS2_COMPRESSION_OPTIONS=y | ||
| 1572 | CONFIG_JFFS2_ZLIB=y | ||
| 1573 | CONFIG_JFFS2_LZO=y | ||
| 1574 | CONFIG_JFFS2_RTIME=y | ||
| 1575 | CONFIG_JFFS2_RUBIN=y | ||
| 1576 | # CONFIG_JFFS2_CMODE_NONE is not set | ||
| 1577 | CONFIG_JFFS2_CMODE_PRIORITY=y | ||
| 1578 | # CONFIG_JFFS2_CMODE_SIZE is not set | ||
| 1579 | # CONFIG_JFFS2_CMODE_FAVOURLZO is not set | ||
| 1580 | CONFIG_CRAMFS=m | ||
| 1581 | # CONFIG_VXFS_FS is not set | ||
| 1582 | # CONFIG_MINIX_FS is not set | ||
| 1583 | # CONFIG_HPFS_FS is not set | ||
| 1584 | # CONFIG_QNX4FS_FS is not set | ||
| 1585 | # CONFIG_ROMFS_FS is not set | ||
| 1586 | # CONFIG_SYSV_FS is not set | ||
| 1587 | # CONFIG_UFS_FS is not set | ||
| 1588 | CONFIG_NETWORK_FILESYSTEMS=y | ||
| 1589 | CONFIG_NFS_FS=m | ||
| 1590 | CONFIG_NFS_V3=y | ||
| 1591 | # CONFIG_NFS_V3_ACL is not set | ||
| 1592 | CONFIG_NFS_V4=y | ||
| 1593 | CONFIG_NFSD=m | ||
| 1594 | CONFIG_NFSD_V3=y | ||
| 1595 | # CONFIG_NFSD_V3_ACL is not set | ||
| 1596 | CONFIG_NFSD_V4=y | ||
| 1597 | CONFIG_LOCKD=m | ||
| 1598 | CONFIG_LOCKD_V4=y | ||
| 1599 | CONFIG_EXPORTFS=m | ||
| 1600 | CONFIG_NFS_COMMON=y | ||
| 1601 | CONFIG_SUNRPC=m | ||
| 1602 | CONFIG_SUNRPC_GSS=m | ||
| 1603 | # CONFIG_SUNRPC_BIND34 is not set | ||
| 1604 | CONFIG_RPCSEC_GSS_KRB5=m | ||
| 1605 | # CONFIG_RPCSEC_GSS_SPKM3 is not set | ||
| 1606 | CONFIG_SMB_FS=m | ||
| 1607 | CONFIG_SMB_NLS_DEFAULT=y | ||
| 1608 | CONFIG_SMB_NLS_REMOTE="cp437" | ||
| 1609 | CONFIG_CIFS=m | ||
| 1610 | # CONFIG_CIFS_STATS is not set | ||
| 1611 | # CONFIG_CIFS_WEAK_PW_HASH is not set | ||
| 1612 | # CONFIG_CIFS_XATTR is not set | ||
| 1613 | # CONFIG_CIFS_DEBUG2 is not set | ||
| 1614 | # CONFIG_CIFS_EXPERIMENTAL is not set | ||
| 1615 | # CONFIG_NCP_FS is not set | ||
| 1616 | # CONFIG_CODA_FS is not set | ||
| 1617 | # CONFIG_AFS_FS is not set | ||
| 1618 | |||
| 1619 | # | ||
| 1620 | # Partition Types | ||
| 1621 | # | ||
| 1622 | CONFIG_PARTITION_ADVANCED=y | ||
| 1623 | # CONFIG_ACORN_PARTITION is not set | ||
| 1624 | # CONFIG_OSF_PARTITION is not set | ||
| 1625 | # CONFIG_AMIGA_PARTITION is not set | ||
| 1626 | # CONFIG_ATARI_PARTITION is not set | ||
| 1627 | # CONFIG_MAC_PARTITION is not set | ||
| 1628 | CONFIG_MSDOS_PARTITION=y | ||
| 1629 | # CONFIG_BSD_DISKLABEL is not set | ||
| 1630 | # CONFIG_MINIX_SUBPARTITION is not set | ||
| 1631 | # CONFIG_SOLARIS_X86_PARTITION is not set | ||
| 1632 | # CONFIG_UNIXWARE_DISKLABEL is not set | ||
| 1633 | # CONFIG_LDM_PARTITION is not set | ||
| 1634 | # CONFIG_SGI_PARTITION is not set | ||
| 1635 | # CONFIG_ULTRIX_PARTITION is not set | ||
| 1636 | # CONFIG_SUN_PARTITION is not set | ||
| 1637 | # CONFIG_KARMA_PARTITION is not set | ||
| 1638 | # CONFIG_EFI_PARTITION is not set | ||
| 1639 | # CONFIG_SYSV68_PARTITION is not set | ||
| 1640 | CONFIG_NLS=y | ||
| 1641 | CONFIG_NLS_DEFAULT="cp437" | ||
| 1642 | CONFIG_NLS_CODEPAGE_437=y | ||
| 1643 | CONFIG_NLS_CODEPAGE_737=m | ||
| 1644 | CONFIG_NLS_CODEPAGE_775=m | ||
| 1645 | CONFIG_NLS_CODEPAGE_850=m | ||
| 1646 | CONFIG_NLS_CODEPAGE_852=m | ||
| 1647 | CONFIG_NLS_CODEPAGE_855=m | ||
| 1648 | CONFIG_NLS_CODEPAGE_857=m | ||
| 1649 | CONFIG_NLS_CODEPAGE_860=m | ||
| 1650 | CONFIG_NLS_CODEPAGE_861=m | ||
| 1651 | CONFIG_NLS_CODEPAGE_862=m | ||
| 1652 | CONFIG_NLS_CODEPAGE_863=m | ||
| 1653 | CONFIG_NLS_CODEPAGE_864=m | ||
| 1654 | CONFIG_NLS_CODEPAGE_865=m | ||
| 1655 | CONFIG_NLS_CODEPAGE_866=m | ||
| 1656 | CONFIG_NLS_CODEPAGE_869=m | ||
| 1657 | CONFIG_NLS_CODEPAGE_936=m | ||
| 1658 | CONFIG_NLS_CODEPAGE_950=m | ||
| 1659 | CONFIG_NLS_CODEPAGE_932=m | ||
| 1660 | CONFIG_NLS_CODEPAGE_949=m | ||
| 1661 | CONFIG_NLS_CODEPAGE_874=m | ||
| 1662 | CONFIG_NLS_ISO8859_8=m | ||
| 1663 | CONFIG_NLS_CODEPAGE_1250=m | ||
| 1664 | CONFIG_NLS_CODEPAGE_1251=m | ||
| 1665 | CONFIG_NLS_ASCII=m | ||
| 1666 | CONFIG_NLS_ISO8859_1=y | ||
| 1667 | CONFIG_NLS_ISO8859_2=m | ||
| 1668 | CONFIG_NLS_ISO8859_3=m | ||
| 1669 | CONFIG_NLS_ISO8859_4=m | ||
| 1670 | CONFIG_NLS_ISO8859_5=m | ||
| 1671 | CONFIG_NLS_ISO8859_6=m | ||
| 1672 | CONFIG_NLS_ISO8859_7=m | ||
| 1673 | CONFIG_NLS_ISO8859_9=m | ||
| 1674 | CONFIG_NLS_ISO8859_13=m | ||
| 1675 | CONFIG_NLS_ISO8859_14=m | ||
| 1676 | CONFIG_NLS_ISO8859_15=m | ||
| 1677 | CONFIG_NLS_KOI8_R=m | ||
| 1678 | CONFIG_NLS_KOI8_U=m | ||
| 1679 | CONFIG_NLS_UTF8=y | ||
| 1680 | # CONFIG_DLM is not set | ||
| 1681 | |||
| 1682 | # | ||
| 1683 | # Kernel hacking | ||
| 1684 | # | ||
| 1685 | # CONFIG_PRINTK_TIME is not set | ||
| 1686 | CONFIG_ENABLE_WARN_DEPRECATED=y | ||
| 1687 | CONFIG_ENABLE_MUST_CHECK=y | ||
| 1688 | CONFIG_FRAME_WARN=1024 | ||
| 1689 | CONFIG_MAGIC_SYSRQ=y | ||
| 1690 | # CONFIG_UNUSED_SYMBOLS is not set | ||
| 1691 | # CONFIG_DEBUG_FS is not set | ||
| 1692 | # CONFIG_HEADERS_CHECK is not set | ||
| 1693 | CONFIG_DEBUG_KERNEL=y | ||
| 1694 | # CONFIG_DEBUG_SHIRQ is not set | ||
| 1695 | # CONFIG_DETECT_SOFTLOCKUP is not set | ||
| 1696 | # CONFIG_SCHED_DEBUG is not set | ||
| 1697 | # CONFIG_SCHEDSTATS is not set | ||
| 1698 | CONFIG_TIMER_STATS=y | ||
| 1699 | # CONFIG_DEBUG_OBJECTS is not set | ||
| 1700 | # CONFIG_DEBUG_SLAB is not set | ||
| 1701 | # CONFIG_DEBUG_PREEMPT is not set | ||
| 1702 | # CONFIG_DEBUG_RT_MUTEXES is not set | ||
| 1703 | # CONFIG_RT_MUTEX_TESTER is not set | ||
| 1704 | # CONFIG_DEBUG_SPINLOCK is not set | ||
| 1705 | # CONFIG_DEBUG_MUTEXES is not set | ||
| 1706 | # CONFIG_DEBUG_LOCK_ALLOC is not set | ||
| 1707 | # CONFIG_PROVE_LOCKING is not set | ||
| 1708 | # CONFIG_LOCK_STAT is not set | ||
| 1709 | # CONFIG_DEBUG_SPINLOCK_SLEEP is not set | ||
| 1710 | # CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set | ||
| 1711 | # CONFIG_DEBUG_KOBJECT is not set | ||
| 1712 | CONFIG_DEBUG_BUGVERBOSE=y | ||
| 1713 | # CONFIG_DEBUG_INFO is not set | ||
| 1714 | # CONFIG_DEBUG_VM is not set | ||
| 1715 | # CONFIG_DEBUG_WRITECOUNT is not set | ||
| 1716 | # CONFIG_DEBUG_LIST is not set | ||
| 1717 | # CONFIG_DEBUG_SG is not set | ||
| 1718 | CONFIG_FRAME_POINTER=y | ||
| 1719 | # CONFIG_BOOT_PRINTK_DELAY is not set | ||
| 1720 | # CONFIG_RCU_TORTURE_TEST is not set | ||
| 1721 | # CONFIG_BACKTRACE_SELF_TEST is not set | ||
| 1722 | # CONFIG_FAULT_INJECTION is not set | ||
| 1723 | # CONFIG_SAMPLES is not set | ||
| 1724 | # CONFIG_DEBUG_USER is not set | ||
| 1725 | CONFIG_DEBUG_ERRORS=y | ||
| 1726 | # CONFIG_DEBUG_STACK_USAGE is not set | ||
| 1727 | # CONFIG_DEBUG_LL is not set | ||
| 1728 | |||
| 1729 | # | ||
| 1730 | # Security options | ||
| 1731 | # | ||
| 1732 | # CONFIG_KEYS is not set | ||
| 1733 | # CONFIG_SECURITY is not set | ||
| 1734 | # CONFIG_SECURITY_FILE_CAPABILITIES is not set | ||
| 1735 | CONFIG_CRYPTO=y | ||
| 1736 | |||
| 1737 | # | ||
| 1738 | # Crypto core or helper | ||
| 1739 | # | ||
| 1740 | CONFIG_CRYPTO_ALGAPI=m | ||
| 1741 | CONFIG_CRYPTO_AEAD=m | ||
| 1742 | CONFIG_CRYPTO_BLKCIPHER=m | ||
| 1743 | CONFIG_CRYPTO_HASH=m | ||
| 1744 | CONFIG_CRYPTO_MANAGER=m | ||
| 1745 | # CONFIG_CRYPTO_GF128MUL is not set | ||
| 1746 | CONFIG_CRYPTO_NULL=m | ||
| 1747 | # CONFIG_CRYPTO_CRYPTD is not set | ||
| 1748 | CONFIG_CRYPTO_AUTHENC=m | ||
| 1749 | CONFIG_CRYPTO_TEST=m | ||
| 1750 | |||
| 1751 | # | ||
| 1752 | # Authenticated Encryption with Associated Data | ||
| 1753 | # | ||
| 1754 | # CONFIG_CRYPTO_CCM is not set | ||
| 1755 | # CONFIG_CRYPTO_GCM is not set | ||
| 1756 | # CONFIG_CRYPTO_SEQIV is not set | ||
| 1757 | |||
| 1758 | # | ||
| 1759 | # Block modes | ||
| 1760 | # | ||
| 1761 | CONFIG_CRYPTO_CBC=m | ||
| 1762 | # CONFIG_CRYPTO_CTR is not set | ||
| 1763 | # CONFIG_CRYPTO_CTS is not set | ||
| 1764 | CONFIG_CRYPTO_ECB=m | ||
| 1765 | # CONFIG_CRYPTO_LRW is not set | ||
| 1766 | CONFIG_CRYPTO_PCBC=m | ||
| 1767 | # CONFIG_CRYPTO_XTS is not set | ||
| 1768 | |||
| 1769 | # | ||
| 1770 | # Hash modes | ||
| 1771 | # | ||
| 1772 | CONFIG_CRYPTO_HMAC=m | ||
| 1773 | # CONFIG_CRYPTO_XCBC is not set | ||
| 1774 | |||
| 1775 | # | ||
| 1776 | # Digest | ||
| 1777 | # | ||
| 1778 | CONFIG_CRYPTO_CRC32C=m | ||
| 1779 | CONFIG_CRYPTO_MD4=m | ||
| 1780 | CONFIG_CRYPTO_MD5=m | ||
| 1781 | CONFIG_CRYPTO_MICHAEL_MIC=m | ||
| 1782 | CONFIG_CRYPTO_SHA1=m | ||
| 1783 | CONFIG_CRYPTO_SHA256=m | ||
| 1784 | CONFIG_CRYPTO_SHA512=m | ||
| 1785 | # CONFIG_CRYPTO_TGR192 is not set | ||
| 1786 | CONFIG_CRYPTO_WP512=m | ||
| 1787 | |||
| 1788 | # | ||
| 1789 | # Ciphers | ||
| 1790 | # | ||
| 1791 | CONFIG_CRYPTO_AES=m | ||
| 1792 | CONFIG_CRYPTO_ANUBIS=m | ||
| 1793 | CONFIG_CRYPTO_ARC4=m | ||
| 1794 | CONFIG_CRYPTO_BLOWFISH=m | ||
| 1795 | CONFIG_CRYPTO_CAMELLIA=m | ||
| 1796 | CONFIG_CRYPTO_CAST5=m | ||
| 1797 | CONFIG_CRYPTO_CAST6=m | ||
| 1798 | CONFIG_CRYPTO_DES=m | ||
| 1799 | # CONFIG_CRYPTO_FCRYPT is not set | ||
| 1800 | CONFIG_CRYPTO_KHAZAD=m | ||
| 1801 | # CONFIG_CRYPTO_SALSA20 is not set | ||
| 1802 | # CONFIG_CRYPTO_SEED is not set | ||
| 1803 | CONFIG_CRYPTO_SERPENT=m | ||
| 1804 | CONFIG_CRYPTO_TEA=m | ||
| 1805 | CONFIG_CRYPTO_TWOFISH=m | ||
| 1806 | CONFIG_CRYPTO_TWOFISH_COMMON=m | ||
| 1807 | |||
| 1808 | # | ||
| 1809 | # Compression | ||
| 1810 | # | ||
| 1811 | CONFIG_CRYPTO_DEFLATE=m | ||
| 1812 | CONFIG_CRYPTO_LZO=m | ||
| 1813 | # CONFIG_CRYPTO_HW is not set | ||
| 1814 | |||
| 1815 | # | ||
| 1816 | # Library routines | ||
| 1817 | # | ||
| 1818 | CONFIG_BITREVERSE=y | ||
| 1819 | # CONFIG_GENERIC_FIND_FIRST_BIT is not set | ||
| 1820 | # CONFIG_GENERIC_FIND_NEXT_BIT is not set | ||
| 1821 | CONFIG_CRC_CCITT=y | ||
| 1822 | # CONFIG_CRC16 is not set | ||
| 1823 | # CONFIG_CRC_ITU_T is not set | ||
| 1824 | CONFIG_CRC32=y | ||
| 1825 | # CONFIG_CRC7 is not set | ||
| 1826 | CONFIG_LIBCRC32C=m | ||
| 1827 | CONFIG_ZLIB_INFLATE=m | ||
| 1828 | CONFIG_ZLIB_DEFLATE=m | ||
| 1829 | CONFIG_LZO_COMPRESS=m | ||
| 1830 | CONFIG_LZO_DECOMPRESS=m | ||
| 1831 | CONFIG_PLIST=y | ||
| 1832 | CONFIG_HAS_IOMEM=y | ||
| 1833 | CONFIG_HAS_IOPORT=y | ||
| 1834 | CONFIG_HAS_DMA=y | ||
diff --git a/meta/packages/linux/linux-rp-2.6.25+2.6.26-rc4/defconfig-zylonite b/meta/packages/linux/linux-rp-2.6.25+2.6.26-rc4/defconfig-zylonite new file mode 100644 index 0000000000..cc2fc482ae --- /dev/null +++ b/meta/packages/linux/linux-rp-2.6.25+2.6.26-rc4/defconfig-zylonite | |||
| @@ -0,0 +1,1740 @@ | |||
| 1 | # | ||
| 2 | # Automatically generated make config: don't edit | ||
| 3 | # Linux kernel version: 2.6.24-rc8 | ||
| 4 | # Sun Jan 20 18:42:35 2008 | ||
| 5 | # | ||
| 6 | CONFIG_ARM=y | ||
| 7 | CONFIG_SYS_SUPPORTS_APM_EMULATION=y | ||
| 8 | CONFIG_GENERIC_GPIO=y | ||
| 9 | CONFIG_GENERIC_TIME=y | ||
| 10 | CONFIG_GENERIC_CLOCKEVENTS=y | ||
| 11 | CONFIG_MMU=y | ||
| 12 | # CONFIG_NO_IOPORT is not set | ||
| 13 | CONFIG_GENERIC_HARDIRQS=y | ||
| 14 | CONFIG_STACKTRACE_SUPPORT=y | ||
| 15 | CONFIG_LOCKDEP_SUPPORT=y | ||
| 16 | CONFIG_TRACE_IRQFLAGS_SUPPORT=y | ||
| 17 | CONFIG_HARDIRQS_SW_RESEND=y | ||
| 18 | CONFIG_GENERIC_IRQ_PROBE=y | ||
| 19 | CONFIG_RWSEM_GENERIC_SPINLOCK=y | ||
| 20 | # CONFIG_ARCH_HAS_ILOG2_U32 is not set | ||
| 21 | # CONFIG_ARCH_HAS_ILOG2_U64 is not set | ||
| 22 | CONFIG_GENERIC_HWEIGHT=y | ||
| 23 | CONFIG_GENERIC_CALIBRATE_DELAY=y | ||
| 24 | CONFIG_ZONE_DMA=y | ||
| 25 | CONFIG_ARCH_MTD_XIP=y | ||
| 26 | CONFIG_VECTORS_BASE=0xffff0000 | ||
| 27 | CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" | ||
| 28 | |||
| 29 | # | ||
| 30 | # General setup | ||
| 31 | # | ||
| 32 | CONFIG_EXPERIMENTAL=y | ||
| 33 | CONFIG_BROKEN_ON_SMP=y | ||
| 34 | CONFIG_LOCK_KERNEL=y | ||
| 35 | CONFIG_INIT_ENV_ARG_LIMIT=32 | ||
| 36 | CONFIG_LOCALVERSION="" | ||
| 37 | # CONFIG_LOCALVERSION_AUTO is not set | ||
| 38 | CONFIG_SWAP=y | ||
| 39 | CONFIG_SYSVIPC=y | ||
| 40 | CONFIG_SYSVIPC_SYSCTL=y | ||
| 41 | # CONFIG_POSIX_MQUEUE is not set | ||
| 42 | CONFIG_BSD_PROCESS_ACCT=y | ||
| 43 | CONFIG_BSD_PROCESS_ACCT_V3=y | ||
| 44 | # CONFIG_TASKSTATS is not set | ||
| 45 | # CONFIG_USER_NS is not set | ||
| 46 | # CONFIG_PID_NS is not set | ||
| 47 | # CONFIG_AUDIT is not set | ||
| 48 | # CONFIG_IKCONFIG is not set | ||
| 49 | CONFIG_LOG_BUF_SHIFT=14 | ||
| 50 | # CONFIG_CGROUPS is not set | ||
| 51 | CONFIG_FAIR_GROUP_SCHED=y | ||
| 52 | CONFIG_FAIR_USER_SCHED=y | ||
| 53 | # CONFIG_FAIR_CGROUP_SCHED is not set | ||
| 54 | CONFIG_SYSFS_DEPRECATED=y | ||
| 55 | # CONFIG_RELAY is not set | ||
| 56 | # CONFIG_BLK_DEV_INITRD is not set | ||
| 57 | CONFIG_CC_OPTIMIZE_FOR_SIZE=y | ||
| 58 | CONFIG_SYSCTL=y | ||
| 59 | CONFIG_EMBEDDED=y | ||
| 60 | CONFIG_UID16=y | ||
| 61 | CONFIG_SYSCTL_SYSCALL=y | ||
| 62 | CONFIG_KALLSYMS=y | ||
| 63 | # CONFIG_KALLSYMS_ALL is not set | ||
| 64 | # CONFIG_KALLSYMS_EXTRA_PASS is not set | ||
| 65 | CONFIG_HOTPLUG=y | ||
| 66 | CONFIG_PRINTK=y | ||
| 67 | CONFIG_BUG=y | ||
| 68 | CONFIG_ELF_CORE=y | ||
| 69 | CONFIG_BASE_FULL=y | ||
| 70 | CONFIG_FUTEX=y | ||
| 71 | CONFIG_ANON_INODES=y | ||
| 72 | CONFIG_EPOLL=y | ||
| 73 | CONFIG_SIGNALFD=y | ||
| 74 | CONFIG_EVENTFD=y | ||
| 75 | CONFIG_SHMEM=y | ||
| 76 | CONFIG_VM_EVENT_COUNTERS=y | ||
| 77 | CONFIG_SLAB=y | ||
| 78 | # CONFIG_SLUB is not set | ||
| 79 | # CONFIG_SLOB is not set | ||
| 80 | CONFIG_SLABINFO=y | ||
| 81 | CONFIG_RT_MUTEXES=y | ||
| 82 | # CONFIG_TINY_SHMEM is not set | ||
| 83 | CONFIG_BASE_SMALL=0 | ||
| 84 | CONFIG_MODULES=y | ||
| 85 | CONFIG_MODULE_UNLOAD=y | ||
| 86 | CONFIG_MODULE_FORCE_UNLOAD=y | ||
| 87 | # CONFIG_MODVERSIONS is not set | ||
| 88 | # CONFIG_MODULE_SRCVERSION_ALL is not set | ||
| 89 | CONFIG_KMOD=y | ||
| 90 | CONFIG_BLOCK=y | ||
| 91 | # CONFIG_LBD is not set | ||
| 92 | # CONFIG_BLK_DEV_IO_TRACE is not set | ||
| 93 | # CONFIG_LSF is not set | ||
| 94 | # CONFIG_BLK_DEV_BSG is not set | ||
| 95 | |||
| 96 | # | ||
| 97 | # IO Schedulers | ||
| 98 | # | ||
| 99 | CONFIG_IOSCHED_NOOP=y | ||
| 100 | CONFIG_IOSCHED_AS=y | ||
| 101 | CONFIG_IOSCHED_DEADLINE=m | ||
| 102 | CONFIG_IOSCHED_CFQ=m | ||
| 103 | CONFIG_DEFAULT_AS=y | ||
| 104 | # CONFIG_DEFAULT_DEADLINE is not set | ||
| 105 | # CONFIG_DEFAULT_CFQ is not set | ||
| 106 | # CONFIG_DEFAULT_NOOP is not set | ||
| 107 | CONFIG_DEFAULT_IOSCHED="anticipatory" | ||
| 108 | |||
| 109 | # | ||
| 110 | # System Type | ||
| 111 | # | ||
| 112 | # CONFIG_ARCH_AAEC2000 is not set | ||
| 113 | # CONFIG_ARCH_INTEGRATOR is not set | ||
| 114 | # CONFIG_ARCH_REALVIEW is not set | ||
| 115 | # CONFIG_ARCH_VERSATILE is not set | ||
| 116 | # CONFIG_ARCH_AT91 is not set | ||
| 117 | # CONFIG_ARCH_CLPS7500 is not set | ||
| 118 | # CONFIG_ARCH_CLPS711X is not set | ||
| 119 | # CONFIG_ARCH_CO285 is not set | ||
| 120 | # CONFIG_ARCH_EBSA110 is not set | ||
| 121 | # CONFIG_ARCH_EP93XX is not set | ||
| 122 | # CONFIG_ARCH_FOOTBRIDGE is not set | ||
| 123 | # CONFIG_ARCH_NETX is not set | ||
| 124 | # CONFIG_ARCH_H720X is not set | ||
| 125 | # CONFIG_ARCH_IMX is not set | ||
| 126 | # CONFIG_ARCH_IOP13XX is not set | ||
| 127 | # CONFIG_ARCH_IOP32X is not set | ||
| 128 | # CONFIG_ARCH_IOP33X is not set | ||
| 129 | # CONFIG_ARCH_IXP23XX is not set | ||
| 130 | # CONFIG_ARCH_IXP2000 is not set | ||
| 131 | # CONFIG_ARCH_IXP4XX is not set | ||
| 132 | # CONFIG_ARCH_L7200 is not set | ||
| 133 | # CONFIG_ARCH_KS8695 is not set | ||
| 134 | # CONFIG_ARCH_NS9XXX is not set | ||
| 135 | # CONFIG_ARCH_MXC is not set | ||
| 136 | # CONFIG_ARCH_PNX4008 is not set | ||
| 137 | CONFIG_ARCH_PXA=y | ||
| 138 | # CONFIG_ARCH_RPC is not set | ||
| 139 | # CONFIG_ARCH_SA1100 is not set | ||
| 140 | # CONFIG_ARCH_S3C2410 is not set | ||
| 141 | # CONFIG_ARCH_SHARK is not set | ||
| 142 | # CONFIG_ARCH_LH7A40X is not set | ||
| 143 | # CONFIG_ARCH_DAVINCI is not set | ||
| 144 | # CONFIG_ARCH_OMAP is not set | ||
| 145 | |||
| 146 | # | ||
| 147 | # Intel PXA2xx/PXA3xx Implementations | ||
| 148 | # | ||
| 149 | |||
| 150 | # | ||
| 151 | # Supported PXA3xx Processor Variants | ||
| 152 | # | ||
| 153 | CONFIG_CPU_PXA300=y | ||
| 154 | CONFIG_CPU_PXA310=y | ||
| 155 | CONFIG_CPU_PXA320=y | ||
| 156 | # CONFIG_ARCH_LUBBOCK is not set | ||
| 157 | # CONFIG_MACH_LOGICPD_PXA270 is not set | ||
| 158 | # CONFIG_MACH_MAINSTONE is not set | ||
| 159 | # CONFIG_ARCH_PXA_IDP is not set | ||
| 160 | # CONFIG_PXA_SHARPSL is not set | ||
| 161 | # CONFIG_MACH_TRIZEPS4 is not set | ||
| 162 | # CONFIG_MACH_HX2750 is not set | ||
| 163 | # CONFIG_MACH_EM_X270 is not set | ||
| 164 | CONFIG_MACH_ZYLONITE=y | ||
| 165 | # CONFIG_MACH_ARMCORE is not set | ||
| 166 | CONFIG_PXA3xx=y | ||
| 167 | |||
| 168 | # | ||
| 169 | # Boot options | ||
| 170 | # | ||
| 171 | |||
| 172 | # | ||
| 173 | # Power management | ||
| 174 | # | ||
| 175 | |||
| 176 | # | ||
| 177 | # Processor Type | ||
| 178 | # | ||
| 179 | CONFIG_CPU_32=y | ||
| 180 | CONFIG_CPU_XSC3=y | ||
| 181 | CONFIG_CPU_32v5=y | ||
| 182 | CONFIG_CPU_ABRT_EV5T=y | ||
| 183 | CONFIG_CPU_CACHE_VIVT=y | ||
| 184 | CONFIG_CPU_TLB_V4WBI=y | ||
| 185 | CONFIG_CPU_CP15=y | ||
| 186 | CONFIG_CPU_CP15_MMU=y | ||
| 187 | CONFIG_IO_36=y | ||
| 188 | |||
| 189 | # | ||
| 190 | # Processor Features | ||
| 191 | # | ||
| 192 | CONFIG_ARM_THUMB=y | ||
| 193 | # CONFIG_CPU_DCACHE_DISABLE is not set | ||
| 194 | # CONFIG_CPU_BPREDICT_DISABLE is not set | ||
| 195 | # CONFIG_OUTER_CACHE is not set | ||
| 196 | CONFIG_IWMMXT=y | ||
| 197 | |||
| 198 | # | ||
| 199 | # Bus support | ||
| 200 | # | ||
| 201 | # CONFIG_PCI_SYSCALL is not set | ||
| 202 | # CONFIG_ARCH_SUPPORTS_MSI is not set | ||
| 203 | CONFIG_PCCARD=m | ||
| 204 | # CONFIG_PCMCIA_DEBUG is not set | ||
| 205 | CONFIG_PCMCIA=m | ||
| 206 | CONFIG_PCMCIA_LOAD_CIS=y | ||
| 207 | CONFIG_PCMCIA_IOCTL=y | ||
| 208 | |||
| 209 | # | ||
| 210 | # PC-card bridges | ||
| 211 | # | ||
| 212 | CONFIG_PCMCIA_PXA2XX=m | ||
| 213 | |||
| 214 | # | ||
| 215 | # Kernel Features | ||
| 216 | # | ||
| 217 | # CONFIG_TICK_ONESHOT is not set | ||
| 218 | # CONFIG_NO_HZ is not set | ||
| 219 | # CONFIG_HIGH_RES_TIMERS is not set | ||
| 220 | CONFIG_GENERIC_CLOCKEVENTS_BUILD=y | ||
| 221 | CONFIG_PREEMPT=y | ||
| 222 | CONFIG_HZ=100 | ||
| 223 | CONFIG_AEABI=y | ||
| 224 | CONFIG_OABI_COMPAT=y | ||
| 225 | # CONFIG_ARCH_DISCONTIGMEM_ENABLE is not set | ||
| 226 | CONFIG_SELECT_MEMORY_MODEL=y | ||
| 227 | CONFIG_FLATMEM_MANUAL=y | ||
| 228 | # CONFIG_DISCONTIGMEM_MANUAL is not set | ||
| 229 | # CONFIG_SPARSEMEM_MANUAL is not set | ||
| 230 | CONFIG_FLATMEM=y | ||
| 231 | CONFIG_FLAT_NODE_MEM_MAP=y | ||
| 232 | # CONFIG_SPARSEMEM_STATIC is not set | ||
| 233 | # CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set | ||
| 234 | CONFIG_SPLIT_PTLOCK_CPUS=4096 | ||
| 235 | # CONFIG_RESOURCES_64BIT is not set | ||
| 236 | CONFIG_ZONE_DMA_FLAG=1 | ||
| 237 | CONFIG_BOUNCE=y | ||
| 238 | CONFIG_VIRT_TO_BUS=y | ||
| 239 | CONFIG_ALIGNMENT_TRAP=y | ||
| 240 | |||
| 241 | # | ||
| 242 | # Boot options | ||
| 243 | # | ||
| 244 | CONFIG_ZBOOT_ROM_TEXT=0x0 | ||
| 245 | CONFIG_ZBOOT_ROM_BSS=0x0 | ||
| 246 | CONFIG_CMDLINE="console=ttyS0,38400 root=/dev/mtdblock2 rootfstype=jffs2 mem=64M dyntick=enable debug" | ||
| 247 | # CONFIG_XIP_KERNEL is not set | ||
| 248 | CONFIG_KEXEC=y | ||
| 249 | CONFIG_ATAGS_PROC=y | ||
| 250 | |||
| 251 | # | ||
| 252 | # CPU Frequency scaling | ||
| 253 | # | ||
| 254 | # CONFIG_CPU_FREQ is not set | ||
| 255 | |||
| 256 | # | ||
| 257 | # Floating point emulation | ||
| 258 | # | ||
| 259 | |||
| 260 | # | ||
| 261 | # At least one emulation must be selected | ||
| 262 | # | ||
| 263 | CONFIG_FPE_NWFPE=y | ||
| 264 | # CONFIG_FPE_NWFPE_XP is not set | ||
| 265 | # CONFIG_FPE_FASTFPE is not set | ||
| 266 | |||
| 267 | # | ||
| 268 | # Userspace binary formats | ||
| 269 | # | ||
| 270 | CONFIG_BINFMT_ELF=y | ||
| 271 | CONFIG_BINFMT_AOUT=m | ||
| 272 | CONFIG_BINFMT_MISC=m | ||
| 273 | |||
| 274 | # | ||
| 275 | # Power management options | ||
| 276 | # | ||
| 277 | CONFIG_PM=y | ||
| 278 | # CONFIG_PM_LEGACY is not set | ||
| 279 | # CONFIG_PM_DEBUG is not set | ||
| 280 | CONFIG_PM_SLEEP=y | ||
| 281 | CONFIG_SUSPEND_UP_POSSIBLE=y | ||
| 282 | CONFIG_SUSPEND=y | ||
| 283 | CONFIG_APM_EMULATION=y | ||
| 284 | |||
| 285 | # | ||
| 286 | # Networking | ||
| 287 | # | ||
| 288 | CONFIG_NET=y | ||
| 289 | |||
| 290 | # | ||
| 291 | # Networking options | ||
| 292 | # | ||
| 293 | CONFIG_PACKET=m | ||
| 294 | CONFIG_PACKET_MMAP=y | ||
| 295 | CONFIG_UNIX=y | ||
| 296 | CONFIG_XFRM=y | ||
| 297 | CONFIG_XFRM_USER=m | ||
| 298 | # CONFIG_XFRM_SUB_POLICY is not set | ||
| 299 | # CONFIG_XFRM_MIGRATE is not set | ||
| 300 | # CONFIG_NET_KEY is not set | ||
| 301 | CONFIG_INET=y | ||
| 302 | # CONFIG_IP_MULTICAST is not set | ||
| 303 | # CONFIG_IP_ADVANCED_ROUTER is not set | ||
| 304 | CONFIG_IP_FIB_HASH=y | ||
| 305 | CONFIG_IP_PNP=y | ||
| 306 | # CONFIG_IP_PNP_DHCP is not set | ||
| 307 | # CONFIG_IP_PNP_BOOTP is not set | ||
| 308 | # CONFIG_IP_PNP_RARP is not set | ||
| 309 | # CONFIG_NET_IPIP is not set | ||
| 310 | # CONFIG_NET_IPGRE is not set | ||
| 311 | # CONFIG_ARPD is not set | ||
| 312 | CONFIG_SYN_COOKIES=y | ||
| 313 | # CONFIG_INET_AH is not set | ||
| 314 | # CONFIG_INET_ESP is not set | ||
| 315 | # CONFIG_INET_IPCOMP is not set | ||
| 316 | # CONFIG_INET_XFRM_TUNNEL is not set | ||
| 317 | CONFIG_INET_TUNNEL=m | ||
| 318 | CONFIG_INET_XFRM_MODE_TRANSPORT=m | ||
| 319 | CONFIG_INET_XFRM_MODE_TUNNEL=m | ||
| 320 | CONFIG_INET_XFRM_MODE_BEET=m | ||
| 321 | # CONFIG_INET_LRO is not set | ||
| 322 | CONFIG_INET_DIAG=m | ||
| 323 | CONFIG_INET_TCP_DIAG=m | ||
| 324 | # CONFIG_TCP_CONG_ADVANCED is not set | ||
| 325 | CONFIG_TCP_CONG_CUBIC=y | ||
| 326 | CONFIG_DEFAULT_TCP_CONG="cubic" | ||
| 327 | # CONFIG_TCP_MD5SIG is not set | ||
| 328 | # CONFIG_IP_VS is not set | ||
| 329 | CONFIG_IPV6=m | ||
| 330 | # CONFIG_IPV6_PRIVACY is not set | ||
| 331 | # CONFIG_IPV6_ROUTER_PREF is not set | ||
| 332 | # CONFIG_IPV6_OPTIMISTIC_DAD is not set | ||
| 333 | CONFIG_INET6_AH=m | ||
| 334 | CONFIG_INET6_ESP=m | ||
| 335 | CONFIG_INET6_IPCOMP=m | ||
| 336 | # CONFIG_IPV6_MIP6 is not set | ||
| 337 | CONFIG_INET6_XFRM_TUNNEL=m | ||
| 338 | CONFIG_INET6_TUNNEL=m | ||
| 339 | CONFIG_INET6_XFRM_MODE_TRANSPORT=m | ||
| 340 | CONFIG_INET6_XFRM_MODE_TUNNEL=m | ||
| 341 | CONFIG_INET6_XFRM_MODE_BEET=m | ||
| 342 | # CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION is not set | ||
| 343 | CONFIG_IPV6_SIT=m | ||
| 344 | CONFIG_IPV6_TUNNEL=m | ||
| 345 | # CONFIG_IPV6_MULTIPLE_TABLES is not set | ||
| 346 | # CONFIG_NETWORK_SECMARK is not set | ||
| 347 | CONFIG_NETFILTER=y | ||
| 348 | # CONFIG_NETFILTER_DEBUG is not set | ||
| 349 | |||
| 350 | # | ||
| 351 | # Core Netfilter Configuration | ||
| 352 | # | ||
| 353 | # CONFIG_NETFILTER_NETLINK is not set | ||
| 354 | # CONFIG_NF_CONNTRACK_ENABLED is not set | ||
| 355 | # CONFIG_NF_CONNTRACK is not set | ||
| 356 | CONFIG_NETFILTER_XTABLES=m | ||
| 357 | # CONFIG_NETFILTER_XT_TARGET_CLASSIFY is not set | ||
| 358 | # CONFIG_NETFILTER_XT_TARGET_DSCP is not set | ||
| 359 | # CONFIG_NETFILTER_XT_TARGET_MARK is not set | ||
| 360 | # CONFIG_NETFILTER_XT_TARGET_NFQUEUE is not set | ||
| 361 | # CONFIG_NETFILTER_XT_TARGET_NFLOG is not set | ||
| 362 | # CONFIG_NETFILTER_XT_TARGET_TRACE is not set | ||
| 363 | # CONFIG_NETFILTER_XT_TARGET_TCPMSS is not set | ||
| 364 | # CONFIG_NETFILTER_XT_MATCH_COMMENT is not set | ||
| 365 | # CONFIG_NETFILTER_XT_MATCH_DCCP is not set | ||
| 366 | # CONFIG_NETFILTER_XT_MATCH_DSCP is not set | ||
| 367 | # CONFIG_NETFILTER_XT_MATCH_ESP is not set | ||
| 368 | # CONFIG_NETFILTER_XT_MATCH_LENGTH is not set | ||
| 369 | # CONFIG_NETFILTER_XT_MATCH_LIMIT is not set | ||
| 370 | # CONFIG_NETFILTER_XT_MATCH_MAC is not set | ||
| 371 | # CONFIG_NETFILTER_XT_MATCH_MARK is not set | ||
| 372 | # CONFIG_NETFILTER_XT_MATCH_POLICY is not set | ||
| 373 | # CONFIG_NETFILTER_XT_MATCH_MULTIPORT is not set | ||
| 374 | # CONFIG_NETFILTER_XT_MATCH_PKTTYPE is not set | ||
| 375 | # CONFIG_NETFILTER_XT_MATCH_QUOTA is not set | ||
| 376 | # CONFIG_NETFILTER_XT_MATCH_REALM is not set | ||
| 377 | # CONFIG_NETFILTER_XT_MATCH_SCTP is not set | ||
| 378 | # CONFIG_NETFILTER_XT_MATCH_STATISTIC is not set | ||
| 379 | # CONFIG_NETFILTER_XT_MATCH_STRING is not set | ||
| 380 | # CONFIG_NETFILTER_XT_MATCH_TCPMSS is not set | ||
| 381 | # CONFIG_NETFILTER_XT_MATCH_TIME is not set | ||
| 382 | # CONFIG_NETFILTER_XT_MATCH_U32 is not set | ||
| 383 | # CONFIG_NETFILTER_XT_MATCH_HASHLIMIT is not set | ||
| 384 | |||
| 385 | # | ||
| 386 | # IP: Netfilter Configuration | ||
| 387 | # | ||
| 388 | CONFIG_IP_NF_QUEUE=m | ||
| 389 | CONFIG_IP_NF_IPTABLES=m | ||
| 390 | CONFIG_IP_NF_MATCH_IPRANGE=m | ||
| 391 | CONFIG_IP_NF_MATCH_TOS=m | ||
| 392 | CONFIG_IP_NF_MATCH_RECENT=m | ||
| 393 | CONFIG_IP_NF_MATCH_ECN=m | ||
| 394 | CONFIG_IP_NF_MATCH_AH=m | ||
| 395 | CONFIG_IP_NF_MATCH_TTL=m | ||
| 396 | CONFIG_IP_NF_MATCH_OWNER=m | ||
| 397 | CONFIG_IP_NF_MATCH_ADDRTYPE=m | ||
| 398 | CONFIG_IP_NF_FILTER=m | ||
| 399 | CONFIG_IP_NF_TARGET_REJECT=m | ||
| 400 | CONFIG_IP_NF_TARGET_LOG=m | ||
| 401 | CONFIG_IP_NF_TARGET_ULOG=m | ||
| 402 | CONFIG_IP_NF_MANGLE=m | ||
| 403 | CONFIG_IP_NF_TARGET_TOS=m | ||
| 404 | CONFIG_IP_NF_TARGET_ECN=m | ||
| 405 | CONFIG_IP_NF_TARGET_TTL=m | ||
| 406 | CONFIG_IP_NF_RAW=m | ||
| 407 | CONFIG_IP_NF_ARPTABLES=m | ||
| 408 | CONFIG_IP_NF_ARPFILTER=m | ||
| 409 | CONFIG_IP_NF_ARP_MANGLE=m | ||
| 410 | |||
| 411 | # | ||
| 412 | # IPv6: Netfilter Configuration (EXPERIMENTAL) | ||
| 413 | # | ||
| 414 | # CONFIG_IP6_NF_QUEUE is not set | ||
| 415 | # CONFIG_IP6_NF_IPTABLES is not set | ||
| 416 | # CONFIG_IP_DCCP is not set | ||
| 417 | # CONFIG_IP_SCTP is not set | ||
| 418 | # CONFIG_TIPC is not set | ||
| 419 | # CONFIG_ATM is not set | ||
| 420 | # CONFIG_BRIDGE is not set | ||
| 421 | # CONFIG_VLAN_8021Q is not set | ||
| 422 | # CONFIG_DECNET is not set | ||
| 423 | # CONFIG_LLC2 is not set | ||
| 424 | # CONFIG_IPX is not set | ||
| 425 | # CONFIG_ATALK is not set | ||
| 426 | # CONFIG_X25 is not set | ||
| 427 | # CONFIG_LAPB is not set | ||
| 428 | # CONFIG_ECONET is not set | ||
| 429 | # CONFIG_WAN_ROUTER is not set | ||
| 430 | # CONFIG_NET_SCHED is not set | ||
| 431 | |||
| 432 | # | ||
| 433 | # Network testing | ||
| 434 | # | ||
| 435 | # CONFIG_NET_PKTGEN is not set | ||
| 436 | # CONFIG_HAMRADIO is not set | ||
| 437 | CONFIG_IRDA=m | ||
| 438 | |||
| 439 | # | ||
| 440 | # IrDA protocols | ||
| 441 | # | ||
| 442 | CONFIG_IRLAN=m | ||
| 443 | CONFIG_IRNET=m | ||
| 444 | CONFIG_IRCOMM=m | ||
| 445 | # CONFIG_IRDA_ULTRA is not set | ||
| 446 | |||
| 447 | # | ||
| 448 | # IrDA options | ||
| 449 | # | ||
| 450 | # CONFIG_IRDA_CACHE_LAST_LSAP is not set | ||
| 451 | # CONFIG_IRDA_FAST_RR is not set | ||
| 452 | # CONFIG_IRDA_DEBUG is not set | ||
| 453 | |||
| 454 | # | ||
| 455 | # Infrared-port device drivers | ||
| 456 | # | ||
| 457 | |||
| 458 | # | ||
| 459 | # SIR device drivers | ||
| 460 | # | ||
| 461 | # CONFIG_IRTTY_SIR is not set | ||
| 462 | |||
| 463 | # | ||
| 464 | # Dongle support | ||
| 465 | # | ||
| 466 | # CONFIG_KINGSUN_DONGLE is not set | ||
| 467 | # CONFIG_KSDAZZLE_DONGLE is not set | ||
| 468 | # CONFIG_KS959_DONGLE is not set | ||
| 469 | |||
| 470 | # | ||
| 471 | # Old SIR device drivers | ||
| 472 | # | ||
| 473 | # CONFIG_IRPORT_SIR is not set | ||
| 474 | |||
| 475 | # | ||
| 476 | # Old Serial dongle support | ||
| 477 | # | ||
| 478 | |||
| 479 | # | ||
| 480 | # FIR device drivers | ||
| 481 | # | ||
| 482 | # CONFIG_USB_IRDA is not set | ||
| 483 | # CONFIG_SIGMATEL_FIR is not set | ||
| 484 | CONFIG_PXA_FICP=m | ||
| 485 | # CONFIG_MCS_FIR is not set | ||
| 486 | CONFIG_BT=m | ||
| 487 | CONFIG_BT_L2CAP=m | ||
| 488 | CONFIG_BT_SCO=m | ||
| 489 | CONFIG_BT_RFCOMM=m | ||
| 490 | CONFIG_BT_RFCOMM_TTY=y | ||
| 491 | CONFIG_BT_BNEP=m | ||
| 492 | CONFIG_BT_BNEP_MC_FILTER=y | ||
| 493 | CONFIG_BT_BNEP_PROTO_FILTER=y | ||
| 494 | CONFIG_BT_HIDP=m | ||
| 495 | |||
| 496 | # | ||
| 497 | # Bluetooth device drivers | ||
| 498 | # | ||
| 499 | CONFIG_BT_HCIUSB=m | ||
| 500 | # CONFIG_BT_HCIUSB_SCO is not set | ||
| 501 | # CONFIG_BT_HCIBTSDIO is not set | ||
| 502 | CONFIG_BT_HCIUART=m | ||
| 503 | CONFIG_BT_HCIUART_H4=y | ||
| 504 | CONFIG_BT_HCIUART_BCSP=y | ||
| 505 | # CONFIG_BT_HCIUART_LL is not set | ||
| 506 | CONFIG_BT_HCIBCM203X=m | ||
| 507 | CONFIG_BT_HCIBPA10X=m | ||
| 508 | CONFIG_BT_HCIBFUSB=m | ||
| 509 | CONFIG_BT_HCIDTL1=m | ||
| 510 | CONFIG_BT_HCIBT3C=m | ||
| 511 | CONFIG_BT_HCIBLUECARD=m | ||
| 512 | CONFIG_BT_HCIBTUART=m | ||
| 513 | CONFIG_BT_HCIVHCI=m | ||
| 514 | # CONFIG_AF_RXRPC is not set | ||
| 515 | |||
| 516 | # | ||
| 517 | # Wireless | ||
| 518 | # | ||
| 519 | # CONFIG_CFG80211 is not set | ||
| 520 | CONFIG_WIRELESS_EXT=y | ||
| 521 | # CONFIG_MAC80211 is not set | ||
| 522 | CONFIG_IEEE80211=m | ||
| 523 | # CONFIG_IEEE80211_DEBUG is not set | ||
| 524 | CONFIG_IEEE80211_CRYPT_WEP=m | ||
| 525 | CONFIG_IEEE80211_CRYPT_CCMP=m | ||
| 526 | CONFIG_IEEE80211_CRYPT_TKIP=m | ||
| 527 | CONFIG_IEEE80211_SOFTMAC=m | ||
| 528 | # CONFIG_IEEE80211_SOFTMAC_DEBUG is not set | ||
| 529 | # CONFIG_RFKILL is not set | ||
| 530 | # CONFIG_NET_9P is not set | ||
| 531 | |||
| 532 | # | ||
| 533 | # Device Drivers | ||
| 534 | # | ||
| 535 | |||
| 536 | # | ||
| 537 | # Generic Driver Options | ||
| 538 | # | ||
| 539 | CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" | ||
| 540 | CONFIG_STANDALONE=y | ||
| 541 | CONFIG_PREVENT_FIRMWARE_BUILD=y | ||
| 542 | CONFIG_FW_LOADER=y | ||
| 543 | # CONFIG_DEBUG_DRIVER is not set | ||
| 544 | # CONFIG_DEBUG_DEVRES is not set | ||
| 545 | # CONFIG_SYS_HYPERVISOR is not set | ||
| 546 | # CONFIG_CONNECTOR is not set | ||
| 547 | CONFIG_MTD=y | ||
| 548 | # CONFIG_MTD_DEBUG is not set | ||
| 549 | # CONFIG_MTD_CONCAT is not set | ||
| 550 | CONFIG_MTD_PARTITIONS=y | ||
| 551 | # CONFIG_MTD_REDBOOT_PARTS is not set | ||
| 552 | CONFIG_MTD_CMDLINE_PARTS=y | ||
| 553 | # CONFIG_MTD_AFS_PARTS is not set | ||
| 554 | |||
| 555 | # | ||
| 556 | # User Modules And Translation Layers | ||
| 557 | # | ||
| 558 | CONFIG_MTD_CHAR=y | ||
| 559 | CONFIG_MTD_BLKDEVS=y | ||
| 560 | CONFIG_MTD_BLOCK=y | ||
| 561 | # CONFIG_FTL is not set | ||
| 562 | # CONFIG_NFTL is not set | ||
| 563 | # CONFIG_INFTL is not set | ||
| 564 | # CONFIG_RFD_FTL is not set | ||
| 565 | # CONFIG_SSFDC is not set | ||
| 566 | # CONFIG_MTD_OOPS is not set | ||
| 567 | |||
| 568 | # | ||
| 569 | # RAM/ROM/Flash chip drivers | ||
| 570 | # | ||
| 571 | CONFIG_MTD_CFI=y | ||
| 572 | # CONFIG_MTD_JEDECPROBE is not set | ||
| 573 | CONFIG_MTD_GEN_PROBE=y | ||
| 574 | CONFIG_MTD_CFI_ADV_OPTIONS=y | ||
| 575 | CONFIG_MTD_CFI_NOSWAP=y | ||
| 576 | # CONFIG_MTD_CFI_BE_BYTE_SWAP is not set | ||
| 577 | # CONFIG_MTD_CFI_LE_BYTE_SWAP is not set | ||
| 578 | CONFIG_MTD_CFI_GEOMETRY=y | ||
| 579 | CONFIG_MTD_MAP_BANK_WIDTH_1=y | ||
| 580 | CONFIG_MTD_MAP_BANK_WIDTH_2=y | ||
| 581 | CONFIG_MTD_MAP_BANK_WIDTH_4=y | ||
| 582 | # CONFIG_MTD_MAP_BANK_WIDTH_8 is not set | ||
| 583 | # CONFIG_MTD_MAP_BANK_WIDTH_16 is not set | ||
| 584 | # CONFIG_MTD_MAP_BANK_WIDTH_32 is not set | ||
| 585 | CONFIG_MTD_CFI_I1=y | ||
| 586 | CONFIG_MTD_CFI_I2=y | ||
| 587 | # CONFIG_MTD_CFI_I4 is not set | ||
| 588 | # CONFIG_MTD_CFI_I8 is not set | ||
| 589 | # CONFIG_MTD_OTP is not set | ||
| 590 | CONFIG_MTD_CFI_INTELEXT=y | ||
| 591 | # CONFIG_MTD_CFI_AMDSTD is not set | ||
| 592 | # CONFIG_MTD_CFI_STAA is not set | ||
| 593 | CONFIG_MTD_CFI_UTIL=y | ||
| 594 | # CONFIG_MTD_RAM is not set | ||
| 595 | CONFIG_MTD_ROM=y | ||
| 596 | # CONFIG_MTD_ABSENT is not set | ||
| 597 | # CONFIG_MTD_XIP is not set | ||
| 598 | |||
| 599 | # | ||
| 600 | # Mapping drivers for chip access | ||
| 601 | # | ||
| 602 | # CONFIG_MTD_COMPLEX_MAPPINGS is not set | ||
| 603 | # CONFIG_MTD_PHYSMAP is not set | ||
| 604 | # CONFIG_MTD_ARM_INTEGRATOR is not set | ||
| 605 | # CONFIG_MTD_SHARP_SL is not set | ||
| 606 | # CONFIG_MTD_PLATRAM is not set | ||
| 607 | |||
| 608 | # | ||
| 609 | # Self-contained MTD device drivers | ||
| 610 | # | ||
| 611 | # CONFIG_MTD_SLRAM is not set | ||
| 612 | # CONFIG_MTD_PHRAM is not set | ||
| 613 | # CONFIG_MTD_MTDRAM is not set | ||
| 614 | # CONFIG_MTD_BLOCK2MTD is not set | ||
| 615 | |||
| 616 | # | ||
| 617 | # Disk-On-Chip Device Drivers | ||
| 618 | # | ||
| 619 | # CONFIG_MTD_DOC2000 is not set | ||
| 620 | # CONFIG_MTD_DOC2001 is not set | ||
| 621 | # CONFIG_MTD_DOC2001PLUS is not set | ||
| 622 | CONFIG_MTD_NAND=y | ||
| 623 | # CONFIG_MTD_NAND_VERIFY_WRITE is not set | ||
| 624 | # CONFIG_MTD_NAND_ECC_SMC is not set | ||
| 625 | # CONFIG_MTD_NAND_MUSEUM_IDS is not set | ||
| 626 | # CONFIG_MTD_NAND_H1900 is not set | ||
| 627 | CONFIG_MTD_NAND_IDS=y | ||
| 628 | # CONFIG_MTD_NAND_DISKONCHIP is not set | ||
| 629 | # CONFIG_MTD_NAND_SHARPSL is not set | ||
| 630 | # CONFIG_MTD_NAND_NANDSIM is not set | ||
| 631 | # CONFIG_MTD_NAND_PLATFORM is not set | ||
| 632 | # CONFIG_MTD_ALAUDA is not set | ||
| 633 | # CONFIG_MTD_ONENAND is not set | ||
| 634 | |||
| 635 | # | ||
| 636 | # UBI - Unsorted block images | ||
| 637 | # | ||
| 638 | # CONFIG_MTD_UBI is not set | ||
| 639 | # CONFIG_PARPORT is not set | ||
| 640 | CONFIG_BLK_DEV=y | ||
| 641 | # CONFIG_BLK_DEV_COW_COMMON is not set | ||
| 642 | CONFIG_BLK_DEV_LOOP=y | ||
| 643 | # CONFIG_BLK_DEV_CRYPTOLOOP is not set | ||
| 644 | # CONFIG_BLK_DEV_NBD is not set | ||
| 645 | # CONFIG_BLK_DEV_UB is not set | ||
| 646 | CONFIG_BLK_DEV_RAM=y | ||
| 647 | CONFIG_BLK_DEV_RAM_COUNT=16 | ||
| 648 | CONFIG_BLK_DEV_RAM_SIZE=4096 | ||
| 649 | CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024 | ||
| 650 | # CONFIG_CDROM_PKTCDVD is not set | ||
| 651 | # CONFIG_ATA_OVER_ETH is not set | ||
| 652 | CONFIG_MISC_DEVICES=y | ||
| 653 | # CONFIG_EEPROM_93CX6 is not set | ||
| 654 | CONFIG_IDE=y | ||
| 655 | CONFIG_IDE_MAX_HWIFS=4 | ||
| 656 | CONFIG_BLK_DEV_IDE=y | ||
| 657 | |||
| 658 | # | ||
| 659 | # Please see Documentation/ide.txt for help/info on IDE drives | ||
| 660 | # | ||
| 661 | # CONFIG_BLK_DEV_IDE_SATA is not set | ||
| 662 | CONFIG_BLK_DEV_IDEDISK=y | ||
| 663 | # CONFIG_IDEDISK_MULTI_MODE is not set | ||
| 664 | CONFIG_BLK_DEV_IDECS=m | ||
| 665 | # CONFIG_BLK_DEV_IDECD is not set | ||
| 666 | # CONFIG_BLK_DEV_IDETAPE is not set | ||
| 667 | # CONFIG_BLK_DEV_IDEFLOPPY is not set | ||
| 668 | # CONFIG_BLK_DEV_IDESCSI is not set | ||
| 669 | # CONFIG_IDE_TASK_IOCTL is not set | ||
| 670 | CONFIG_IDE_PROC_FS=y | ||
| 671 | |||
| 672 | # | ||
| 673 | # IDE chipset support/bugfixes | ||
| 674 | # | ||
| 675 | CONFIG_IDE_GENERIC=y | ||
| 676 | # CONFIG_BLK_DEV_PLATFORM is not set | ||
| 677 | # CONFIG_IDE_ARM is not set | ||
| 678 | # CONFIG_BLK_DEV_IDEDMA is not set | ||
| 679 | CONFIG_IDE_ARCH_OBSOLETE_INIT=y | ||
| 680 | # CONFIG_BLK_DEV_HD is not set | ||
| 681 | |||
| 682 | # | ||
| 683 | # SCSI device support | ||
| 684 | # | ||
| 685 | # CONFIG_RAID_ATTRS is not set | ||
| 686 | CONFIG_SCSI=m | ||
| 687 | CONFIG_SCSI_DMA=y | ||
| 688 | # CONFIG_SCSI_TGT is not set | ||
| 689 | # CONFIG_SCSI_NETLINK is not set | ||
| 690 | CONFIG_SCSI_PROC_FS=y | ||
| 691 | |||
| 692 | # | ||
| 693 | # SCSI support type (disk, tape, CD-ROM) | ||
| 694 | # | ||
| 695 | CONFIG_BLK_DEV_SD=m | ||
| 696 | CONFIG_CHR_DEV_ST=m | ||
| 697 | CONFIG_CHR_DEV_OSST=m | ||
| 698 | CONFIG_BLK_DEV_SR=m | ||
| 699 | # CONFIG_BLK_DEV_SR_VENDOR is not set | ||
| 700 | CONFIG_CHR_DEV_SG=m | ||
| 701 | # CONFIG_CHR_DEV_SCH is not set | ||
| 702 | |||
| 703 | # | ||
| 704 | # Some SCSI devices (e.g. CD jukebox) support multiple LUNs | ||
| 705 | # | ||
| 706 | CONFIG_SCSI_MULTI_LUN=y | ||
| 707 | # CONFIG_SCSI_CONSTANTS is not set | ||
| 708 | # CONFIG_SCSI_LOGGING is not set | ||
| 709 | # CONFIG_SCSI_SCAN_ASYNC is not set | ||
| 710 | CONFIG_SCSI_WAIT_SCAN=m | ||
| 711 | |||
| 712 | # | ||
| 713 | # SCSI Transports | ||
| 714 | # | ||
| 715 | # CONFIG_SCSI_SPI_ATTRS is not set | ||
| 716 | # CONFIG_SCSI_FC_ATTRS is not set | ||
| 717 | # CONFIG_SCSI_ISCSI_ATTRS is not set | ||
| 718 | # CONFIG_SCSI_SAS_LIBSAS is not set | ||
| 719 | # CONFIG_SCSI_SRP_ATTRS is not set | ||
| 720 | CONFIG_SCSI_LOWLEVEL=y | ||
| 721 | # CONFIG_ISCSI_TCP is not set | ||
| 722 | # CONFIG_SCSI_DEBUG is not set | ||
| 723 | # CONFIG_SCSI_LOWLEVEL_PCMCIA is not set | ||
| 724 | # CONFIG_ATA is not set | ||
| 725 | CONFIG_MD=y | ||
| 726 | # CONFIG_BLK_DEV_MD is not set | ||
| 727 | CONFIG_BLK_DEV_DM=m | ||
| 728 | # CONFIG_DM_DEBUG is not set | ||
| 729 | CONFIG_DM_CRYPT=m | ||
| 730 | CONFIG_DM_SNAPSHOT=m | ||
| 731 | CONFIG_DM_MIRROR=m | ||
| 732 | CONFIG_DM_ZERO=m | ||
| 733 | CONFIG_DM_MULTIPATH=m | ||
| 734 | CONFIG_DM_MULTIPATH_EMC=m | ||
| 735 | # CONFIG_DM_MULTIPATH_RDAC is not set | ||
| 736 | # CONFIG_DM_MULTIPATH_HP is not set | ||
| 737 | # CONFIG_DM_DELAY is not set | ||
| 738 | # CONFIG_DM_UEVENT is not set | ||
| 739 | CONFIG_NETDEVICES=y | ||
| 740 | # CONFIG_NETDEVICES_MULTIQUEUE is not set | ||
| 741 | # CONFIG_DUMMY is not set | ||
| 742 | # CONFIG_BONDING is not set | ||
| 743 | # CONFIG_MACVLAN is not set | ||
| 744 | # CONFIG_EQUALIZER is not set | ||
| 745 | CONFIG_TUN=m | ||
| 746 | # CONFIG_VETH is not set | ||
| 747 | # CONFIG_PHYLIB is not set | ||
| 748 | CONFIG_NET_ETHERNET=y | ||
| 749 | CONFIG_MII=y | ||
| 750 | # CONFIG_AX88796 is not set | ||
| 751 | CONFIG_SMC91X=y | ||
| 752 | # CONFIG_DM9000 is not set | ||
| 753 | # CONFIG_SMC911X is not set | ||
| 754 | # CONFIG_IBM_NEW_EMAC_ZMII is not set | ||
| 755 | # CONFIG_IBM_NEW_EMAC_RGMII is not set | ||
| 756 | # CONFIG_IBM_NEW_EMAC_TAH is not set | ||
| 757 | # CONFIG_IBM_NEW_EMAC_EMAC4 is not set | ||
| 758 | # CONFIG_B44 is not set | ||
| 759 | # CONFIG_NETDEV_1000 is not set | ||
| 760 | # CONFIG_NETDEV_10000 is not set | ||
| 761 | |||
| 762 | # | ||
| 763 | # Wireless LAN | ||
| 764 | # | ||
| 765 | # CONFIG_WLAN_PRE80211 is not set | ||
| 766 | CONFIG_WLAN_80211=y | ||
| 767 | # CONFIG_PCMCIA_RAYCS is not set | ||
| 768 | # CONFIG_LIBERTAS is not set | ||
| 769 | CONFIG_HERMES=m | ||
| 770 | CONFIG_PCMCIA_HERMES=m | ||
| 771 | CONFIG_PCMCIA_SPECTRUM=m | ||
| 772 | # CONFIG_ATMEL is not set | ||
| 773 | CONFIG_AIRO_CS=m | ||
| 774 | # CONFIG_PCMCIA_WL3501 is not set | ||
| 775 | # CONFIG_USB_ZD1201 is not set | ||
| 776 | CONFIG_HOSTAP=m | ||
| 777 | CONFIG_HOSTAP_FIRMWARE=y | ||
| 778 | # CONFIG_HOSTAP_FIRMWARE_NVRAM is not set | ||
| 779 | CONFIG_HOSTAP_CS=m | ||
| 780 | # CONFIG_ZD1211RW is not set | ||
| 781 | |||
| 782 | # | ||
| 783 | # USB Network Adapters | ||
| 784 | # | ||
| 785 | CONFIG_USB_CATC=m | ||
| 786 | CONFIG_USB_KAWETH=m | ||
| 787 | CONFIG_USB_PEGASUS=m | ||
| 788 | CONFIG_USB_RTL8150=m | ||
| 789 | CONFIG_USB_USBNET=m | ||
| 790 | CONFIG_USB_NET_AX8817X=m | ||
| 791 | CONFIG_USB_NET_CDCETHER=m | ||
| 792 | # CONFIG_USB_NET_DM9601 is not set | ||
| 793 | # CONFIG_USB_NET_GL620A is not set | ||
| 794 | CONFIG_USB_NET_NET1080=m | ||
| 795 | # CONFIG_USB_NET_PLUSB is not set | ||
| 796 | # CONFIG_USB_NET_MCS7830 is not set | ||
| 797 | # CONFIG_USB_NET_RNDIS_HOST is not set | ||
| 798 | CONFIG_USB_NET_CDC_SUBSET=m | ||
| 799 | # CONFIG_USB_ALI_M5632 is not set | ||
| 800 | # CONFIG_USB_AN2720 is not set | ||
| 801 | # CONFIG_USB_BELKIN is not set | ||
| 802 | CONFIG_USB_ARMLINUX=y | ||
| 803 | # CONFIG_USB_EPSON2888 is not set | ||
| 804 | # CONFIG_USB_KC2190 is not set | ||
| 805 | # CONFIG_USB_NET_ZAURUS is not set | ||
| 806 | # CONFIG_NET_PCMCIA is not set | ||
| 807 | # CONFIG_WAN is not set | ||
| 808 | CONFIG_PPP=m | ||
| 809 | # CONFIG_PPP_MULTILINK is not set | ||
| 810 | # CONFIG_PPP_FILTER is not set | ||
| 811 | CONFIG_PPP_ASYNC=m | ||
| 812 | # CONFIG_PPP_SYNC_TTY is not set | ||
| 813 | CONFIG_PPP_DEFLATE=m | ||
| 814 | CONFIG_PPP_BSDCOMP=m | ||
| 815 | # CONFIG_PPP_MPPE is not set | ||
| 816 | # CONFIG_PPPOE is not set | ||
| 817 | # CONFIG_PPPOL2TP is not set | ||
| 818 | # CONFIG_SLIP is not set | ||
| 819 | CONFIG_SLHC=m | ||
| 820 | # CONFIG_SHAPER is not set | ||
| 821 | # CONFIG_NETCONSOLE is not set | ||
| 822 | # CONFIG_NETPOLL is not set | ||
| 823 | # CONFIG_NET_POLL_CONTROLLER is not set | ||
| 824 | # CONFIG_ISDN is not set | ||
| 825 | |||
| 826 | # | ||
| 827 | # Input device support | ||
| 828 | # | ||
| 829 | CONFIG_INPUT=y | ||
| 830 | # CONFIG_INPUT_FF_MEMLESS is not set | ||
| 831 | # CONFIG_INPUT_POLLDEV is not set | ||
| 832 | |||
| 833 | # | ||
| 834 | # Userland interfaces | ||
| 835 | # | ||
| 836 | CONFIG_INPUT_MOUSEDEV=y | ||
| 837 | # CONFIG_INPUT_MOUSEDEV_PSAUX is not set | ||
| 838 | CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024 | ||
| 839 | CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 | ||
| 840 | # CONFIG_INPUT_JOYDEV is not set | ||
| 841 | CONFIG_INPUT_EVDEV=y | ||
| 842 | # CONFIG_INPUT_EVBUG is not set | ||
| 843 | CONFIG_INPUT_POWER=y | ||
| 844 | |||
| 845 | # | ||
| 846 | # Input Device Drivers | ||
| 847 | # | ||
| 848 | CONFIG_INPUT_KEYBOARD=y | ||
| 849 | CONFIG_KEYBOARD_ATKBD=y | ||
| 850 | # CONFIG_KEYBOARD_SUNKBD is not set | ||
| 851 | # CONFIG_KEYBOARD_LKKBD is not set | ||
| 852 | # CONFIG_KEYBOARD_XTKBD is not set | ||
| 853 | # CONFIG_KEYBOARD_NEWTON is not set | ||
| 854 | # CONFIG_KEYBOARD_STOWAWAY is not set | ||
| 855 | # CONFIG_KEYBOARD_GPIO is not set | ||
| 856 | # CONFIG_INPUT_MOUSE is not set | ||
| 857 | # CONFIG_INPUT_JOYSTICK is not set | ||
| 858 | # CONFIG_INPUT_TABLET is not set | ||
| 859 | CONFIG_INPUT_TOUCHSCREEN=y | ||
| 860 | # CONFIG_TOUCHSCREEN_FUJITSU is not set | ||
| 861 | # CONFIG_TOUCHSCREEN_GUNZE is not set | ||
| 862 | # CONFIG_TOUCHSCREEN_ELO is not set | ||
| 863 | # CONFIG_TOUCHSCREEN_MTOUCH is not set | ||
| 864 | # CONFIG_TOUCHSCREEN_MK712 is not set | ||
| 865 | # CONFIG_TOUCHSCREEN_PENMOUNT is not set | ||
| 866 | # CONFIG_TOUCHSCREEN_TOUCHRIGHT is not set | ||
| 867 | # CONFIG_TOUCHSCREEN_TOUCHWIN is not set | ||
| 868 | # CONFIG_TOUCHSCREEN_UCB1400 is not set | ||
| 869 | # CONFIG_TOUCHSCREEN_USB_COMPOSITE is not set | ||
| 870 | CONFIG_INPUT_MISC=y | ||
| 871 | # CONFIG_INPUT_ATI_REMOTE is not set | ||
| 872 | # CONFIG_INPUT_ATI_REMOTE2 is not set | ||
| 873 | # CONFIG_INPUT_KEYSPAN_REMOTE is not set | ||
| 874 | # CONFIG_INPUT_POWERMATE is not set | ||
| 875 | # CONFIG_INPUT_YEALINK is not set | ||
| 876 | CONFIG_INPUT_UINPUT=m | ||
| 877 | |||
| 878 | # | ||
| 879 | # Hardware I/O ports | ||
| 880 | # | ||
| 881 | CONFIG_SERIO=y | ||
| 882 | # CONFIG_SERIO_SERPORT is not set | ||
| 883 | CONFIG_SERIO_LIBPS2=y | ||
| 884 | # CONFIG_SERIO_RAW is not set | ||
| 885 | # CONFIG_GAMEPORT is not set | ||
| 886 | |||
| 887 | # | ||
| 888 | # Character devices | ||
| 889 | # | ||
| 890 | CONFIG_VT=y | ||
| 891 | CONFIG_VT_CONSOLE=y | ||
| 892 | CONFIG_HW_CONSOLE=y | ||
| 893 | # CONFIG_VT_HW_CONSOLE_BINDING is not set | ||
| 894 | # CONFIG_SERIAL_NONSTANDARD is not set | ||
| 895 | |||
| 896 | # | ||
| 897 | # Serial drivers | ||
| 898 | # | ||
| 899 | CONFIG_SERIAL_8250=m | ||
| 900 | CONFIG_SERIAL_8250_CS=m | ||
| 901 | CONFIG_SERIAL_8250_NR_UARTS=4 | ||
| 902 | CONFIG_SERIAL_8250_RUNTIME_UARTS=4 | ||
| 903 | # CONFIG_SERIAL_8250_EXTENDED is not set | ||
| 904 | |||
| 905 | # | ||
| 906 | # Non-8250 serial port support | ||
| 907 | # | ||
| 908 | CONFIG_SERIAL_PXA=y | ||
| 909 | CONFIG_SERIAL_PXA_CONSOLE=y | ||
| 910 | CONFIG_SERIAL_CORE=y | ||
| 911 | CONFIG_SERIAL_CORE_CONSOLE=y | ||
| 912 | CONFIG_UNIX98_PTYS=y | ||
| 913 | # CONFIG_LEGACY_PTYS is not set | ||
| 914 | # CONFIG_IPMI_HANDLER is not set | ||
| 915 | CONFIG_HW_RANDOM=m | ||
| 916 | # CONFIG_NVRAM is not set | ||
| 917 | # CONFIG_R3964 is not set | ||
| 918 | |||
| 919 | # | ||
| 920 | # PCMCIA character devices | ||
| 921 | # | ||
| 922 | # CONFIG_SYNCLINK_CS is not set | ||
| 923 | # CONFIG_CARDMAN_4000 is not set | ||
| 924 | # CONFIG_CARDMAN_4040 is not set | ||
| 925 | # CONFIG_RAW_DRIVER is not set | ||
| 926 | # CONFIG_TCG_TPM is not set | ||
| 927 | CONFIG_I2C=y | ||
| 928 | CONFIG_I2C_BOARDINFO=y | ||
| 929 | # CONFIG_I2C_CHARDEV is not set | ||
| 930 | |||
| 931 | # | ||
| 932 | # I2C Algorithms | ||
| 933 | # | ||
| 934 | CONFIG_I2C_ALGOBIT=y | ||
| 935 | # CONFIG_I2C_ALGOPCF is not set | ||
| 936 | # CONFIG_I2C_ALGOPCA is not set | ||
| 937 | |||
| 938 | # | ||
| 939 | # I2C Hardware Bus support | ||
| 940 | # | ||
| 941 | # CONFIG_I2C_GPIO is not set | ||
| 942 | CONFIG_I2C_PXA=y | ||
| 943 | # CONFIG_I2C_PXA_SLAVE is not set | ||
| 944 | # CONFIG_I2C_OCORES is not set | ||
| 945 | # CONFIG_I2C_PARPORT_LIGHT is not set | ||
| 946 | # CONFIG_I2C_SIMTEC is not set | ||
| 947 | # CONFIG_I2C_TAOS_EVM is not set | ||
| 948 | # CONFIG_I2C_STUB is not set | ||
| 949 | # CONFIG_I2C_TINY_USB is not set | ||
| 950 | |||
| 951 | # | ||
| 952 | # Miscellaneous I2C Chip support | ||
| 953 | # | ||
| 954 | # CONFIG_SENSORS_DS1337 is not set | ||
| 955 | # CONFIG_SENSORS_DS1374 is not set | ||
| 956 | # CONFIG_DS1682 is not set | ||
| 957 | # CONFIG_SENSORS_EEPROM is not set | ||
| 958 | # CONFIG_SENSORS_PCF8574 is not set | ||
| 959 | # CONFIG_SENSORS_PCA9539 is not set | ||
| 960 | # CONFIG_SENSORS_PCF8591 is not set | ||
| 961 | # CONFIG_SENSORS_MAX6875 is not set | ||
| 962 | # CONFIG_SENSORS_TSL2550 is not set | ||
| 963 | # CONFIG_I2C_DEBUG_CORE is not set | ||
| 964 | # CONFIG_I2C_DEBUG_ALGO is not set | ||
| 965 | # CONFIG_I2C_DEBUG_BUS is not set | ||
| 966 | # CONFIG_I2C_DEBUG_CHIP is not set | ||
| 967 | |||
| 968 | # | ||
| 969 | # SPI support | ||
| 970 | # | ||
| 971 | # CONFIG_SPI is not set | ||
| 972 | # CONFIG_SPI_MASTER is not set | ||
| 973 | # CONFIG_W1 is not set | ||
| 974 | # CONFIG_POWER_SUPPLY is not set | ||
| 975 | # CONFIG_HWMON is not set | ||
| 976 | # CONFIG_WATCHDOG is not set | ||
| 977 | |||
| 978 | # | ||
| 979 | # Sonics Silicon Backplane | ||
| 980 | # | ||
| 981 | CONFIG_SSB_POSSIBLE=y | ||
| 982 | # CONFIG_SSB is not set | ||
| 983 | |||
| 984 | # | ||
| 985 | # Multifunction device drivers | ||
| 986 | # | ||
| 987 | # CONFIG_MFD_SM501 is not set | ||
| 988 | # CONFIG_HTC_ASIC3 is not set | ||
| 989 | # CONFIG_HTC_ASIC3_DS1WM is not set | ||
| 990 | |||
| 991 | # | ||
| 992 | # Multimedia devices | ||
| 993 | # | ||
| 994 | CONFIG_VIDEO_DEV=m | ||
| 995 | CONFIG_VIDEO_V4L1=y | ||
| 996 | CONFIG_VIDEO_V4L1_COMPAT=y | ||
| 997 | CONFIG_VIDEO_V4L2=y | ||
| 998 | CONFIG_VIDEO_CAPTURE_DRIVERS=y | ||
| 999 | # CONFIG_VIDEO_ADV_DEBUG is not set | ||
| 1000 | CONFIG_VIDEO_HELPER_CHIPS_AUTO=y | ||
| 1001 | # CONFIG_VIDEO_VIVI is not set | ||
| 1002 | # CONFIG_VIDEO_CPIA is not set | ||
| 1003 | # CONFIG_VIDEO_CPIA2 is not set | ||
| 1004 | # CONFIG_VIDEO_SAA5246A is not set | ||
| 1005 | # CONFIG_VIDEO_SAA5249 is not set | ||
| 1006 | # CONFIG_TUNER_3036 is not set | ||
| 1007 | CONFIG_V4L_USB_DRIVERS=y | ||
| 1008 | # CONFIG_VIDEO_PVRUSB2 is not set | ||
| 1009 | # CONFIG_VIDEO_EM28XX is not set | ||
| 1010 | # CONFIG_VIDEO_USBVISION is not set | ||
| 1011 | CONFIG_VIDEO_USBVIDEO=m | ||
| 1012 | CONFIG_USB_VICAM=m | ||
| 1013 | CONFIG_USB_IBMCAM=m | ||
| 1014 | CONFIG_USB_KONICAWC=m | ||
| 1015 | # CONFIG_USB_QUICKCAM_MESSENGER is not set | ||
| 1016 | # CONFIG_USB_ET61X251 is not set | ||
| 1017 | # CONFIG_VIDEO_OVCAMCHIP is not set | ||
| 1018 | # CONFIG_USB_W9968CF is not set | ||
| 1019 | CONFIG_USB_OV511=m | ||
| 1020 | CONFIG_USB_SE401=m | ||
| 1021 | CONFIG_USB_SN9C102=m | ||
| 1022 | CONFIG_USB_STV680=m | ||
| 1023 | # CONFIG_USB_ZC0301 is not set | ||
| 1024 | # CONFIG_USB_PWC is not set | ||
| 1025 | # CONFIG_USB_ZR364XX is not set | ||
| 1026 | CONFIG_RADIO_ADAPTERS=y | ||
| 1027 | CONFIG_USB_DSBR=m | ||
| 1028 | # CONFIG_DVB_CORE is not set | ||
| 1029 | CONFIG_DAB=y | ||
| 1030 | CONFIG_USB_DABUSB=m | ||
| 1031 | |||
| 1032 | # | ||
| 1033 | # Graphics support | ||
| 1034 | # | ||
| 1035 | # CONFIG_VGASTATE is not set | ||
| 1036 | CONFIG_VIDEO_OUTPUT_CONTROL=m | ||
| 1037 | CONFIG_FB=y | ||
| 1038 | # CONFIG_FIRMWARE_EDID is not set | ||
| 1039 | # CONFIG_FB_DDC is not set | ||
| 1040 | CONFIG_FB_CFB_FILLRECT=y | ||
| 1041 | CONFIG_FB_CFB_COPYAREA=y | ||
| 1042 | CONFIG_FB_CFB_IMAGEBLIT=y | ||
| 1043 | # CONFIG_FB_CFB_REV_PIXELS_IN_BYTE is not set | ||
| 1044 | # CONFIG_FB_SYS_FILLRECT is not set | ||
| 1045 | # CONFIG_FB_SYS_COPYAREA is not set | ||
| 1046 | # CONFIG_FB_SYS_IMAGEBLIT is not set | ||
| 1047 | # CONFIG_FB_SYS_FOPS is not set | ||
| 1048 | # CONFIG_FB_DEFERRED_IO is not set | ||
| 1049 | # CONFIG_FB_SVGALIB is not set | ||
| 1050 | # CONFIG_FB_MACMODES is not set | ||
| 1051 | # CONFIG_FB_BACKLIGHT is not set | ||
| 1052 | # CONFIG_FB_MODE_HELPERS is not set | ||
| 1053 | # CONFIG_FB_TILEBLITTING is not set | ||
| 1054 | |||
| 1055 | # | ||
| 1056 | # Frame buffer hardware drivers | ||
| 1057 | # | ||
| 1058 | # CONFIG_FB_S1D13XXX is not set | ||
| 1059 | CONFIG_FB_PXA=y | ||
| 1060 | # CONFIG_FB_PXA_LCD_QVGA is not set | ||
| 1061 | CONFIG_FB_PXA_LCD_VGA=y | ||
| 1062 | CONFIG_FB_PXA_OVERLAY=y | ||
| 1063 | # CONFIG_FB_PXA_PARAMETERS is not set | ||
| 1064 | # CONFIG_FB_MBX is not set | ||
| 1065 | # CONFIG_FB_VIRTUAL is not set | ||
| 1066 | CONFIG_BACKLIGHT_LCD_SUPPORT=y | ||
| 1067 | CONFIG_LCD_CLASS_DEVICE=m | ||
| 1068 | CONFIG_BACKLIGHT_CLASS_DEVICE=m | ||
| 1069 | CONFIG_BACKLIGHT_CORGI=m | ||
| 1070 | |||
| 1071 | # | ||
| 1072 | # Display device support | ||
| 1073 | # | ||
| 1074 | # CONFIG_DISPLAY_SUPPORT is not set | ||
| 1075 | |||
| 1076 | # | ||
| 1077 | # Console display driver support | ||
| 1078 | # | ||
| 1079 | # CONFIG_VGA_CONSOLE is not set | ||
| 1080 | CONFIG_DUMMY_CONSOLE=y | ||
| 1081 | CONFIG_FRAMEBUFFER_CONSOLE=y | ||
| 1082 | # CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY is not set | ||
| 1083 | # CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set | ||
| 1084 | CONFIG_FONTS=y | ||
| 1085 | # CONFIG_FONT_8x8 is not set | ||
| 1086 | CONFIG_FONT_8x16=y | ||
| 1087 | # CONFIG_FONT_6x11 is not set | ||
| 1088 | # CONFIG_FONT_7x14 is not set | ||
| 1089 | # CONFIG_FONT_PEARL_8x8 is not set | ||
| 1090 | # CONFIG_FONT_ACORN_8x8 is not set | ||
| 1091 | # CONFIG_FONT_MINI_4x6 is not set | ||
| 1092 | # CONFIG_FONT_SUN8x16 is not set | ||
| 1093 | # CONFIG_FONT_SUN12x22 is not set | ||
| 1094 | # CONFIG_FONT_10x18 is not set | ||
| 1095 | CONFIG_LOGO=y | ||
| 1096 | # CONFIG_LOGO_LINUX_MONO is not set | ||
| 1097 | # CONFIG_LOGO_LINUX_VGA16 is not set | ||
| 1098 | # CONFIG_LOGO_LINUX_CLUT224 is not set | ||
| 1099 | CONFIG_LOGO_OHAND_CLUT224=y | ||
| 1100 | |||
| 1101 | # | ||
| 1102 | # Sound | ||
| 1103 | # | ||
| 1104 | CONFIG_SOUND=m | ||
| 1105 | |||
| 1106 | # | ||
| 1107 | # Advanced Linux Sound Architecture | ||
| 1108 | # | ||
| 1109 | CONFIG_SND=m | ||
| 1110 | CONFIG_SND_TIMER=m | ||
| 1111 | CONFIG_SND_PCM=m | ||
| 1112 | CONFIG_SND_SEQUENCER=m | ||
| 1113 | # CONFIG_SND_SEQ_DUMMY is not set | ||
| 1114 | CONFIG_SND_OSSEMUL=y | ||
| 1115 | CONFIG_SND_MIXER_OSS=m | ||
| 1116 | CONFIG_SND_PCM_OSS=m | ||
| 1117 | CONFIG_SND_PCM_OSS_PLUGINS=y | ||
| 1118 | # CONFIG_SND_SEQUENCER_OSS is not set | ||
| 1119 | # CONFIG_SND_DYNAMIC_MINORS is not set | ||
| 1120 | CONFIG_SND_SUPPORT_OLD_API=y | ||
| 1121 | CONFIG_SND_VERBOSE_PROCFS=y | ||
| 1122 | # CONFIG_SND_VERBOSE_PRINTK is not set | ||
| 1123 | # CONFIG_SND_DEBUG is not set | ||
| 1124 | |||
| 1125 | # | ||
| 1126 | # Generic devices | ||
| 1127 | # | ||
| 1128 | CONFIG_SND_AC97_CODEC=m | ||
| 1129 | # CONFIG_SND_DUMMY is not set | ||
| 1130 | # CONFIG_SND_VIRMIDI is not set | ||
| 1131 | # CONFIG_SND_MTPAV is not set | ||
| 1132 | # CONFIG_SND_SERIAL_U16550 is not set | ||
| 1133 | # CONFIG_SND_MPU401 is not set | ||
| 1134 | |||
| 1135 | # | ||
| 1136 | # ALSA ARM devices | ||
| 1137 | # | ||
| 1138 | CONFIG_SND_PXA2XX_PCM=m | ||
| 1139 | CONFIG_SND_PXA2XX_AC97=m | ||
| 1140 | |||
| 1141 | # | ||
| 1142 | # USB devices | ||
| 1143 | # | ||
| 1144 | # CONFIG_SND_USB_AUDIO is not set | ||
| 1145 | # CONFIG_SND_USB_CAIAQ is not set | ||
| 1146 | |||
| 1147 | # | ||
| 1148 | # PCMCIA devices | ||
| 1149 | # | ||
| 1150 | # CONFIG_SND_VXPOCKET is not set | ||
| 1151 | # CONFIG_SND_PDAUDIOCF is not set | ||
| 1152 | |||
| 1153 | # | ||
| 1154 | # System on Chip audio support | ||
| 1155 | # | ||
| 1156 | CONFIG_SND_SOC=m | ||
| 1157 | CONFIG_SND_PXA2XX_SOC=m | ||
| 1158 | |||
| 1159 | # | ||
| 1160 | # SoC Audio support for SuperH | ||
| 1161 | # | ||
| 1162 | |||
| 1163 | # | ||
| 1164 | # Open Sound System | ||
| 1165 | # | ||
| 1166 | # CONFIG_SOUND_PRIME is not set | ||
| 1167 | CONFIG_AC97_BUS=m | ||
| 1168 | CONFIG_HID_SUPPORT=y | ||
| 1169 | CONFIG_HID=m | ||
| 1170 | # CONFIG_HID_DEBUG is not set | ||
| 1171 | # CONFIG_HIDRAW is not set | ||
| 1172 | |||
| 1173 | # | ||
| 1174 | # USB Input Devices | ||
| 1175 | # | ||
| 1176 | CONFIG_USB_HID=m | ||
| 1177 | # CONFIG_USB_HIDINPUT_POWERBOOK is not set | ||
| 1178 | # CONFIG_HID_FF is not set | ||
| 1179 | # CONFIG_USB_HIDDEV is not set | ||
| 1180 | |||
| 1181 | # | ||
| 1182 | # USB HID Boot Protocol drivers | ||
| 1183 | # | ||
| 1184 | CONFIG_USB_KBD=m | ||
| 1185 | CONFIG_USB_MOUSE=m | ||
| 1186 | CONFIG_USB_SUPPORT=y | ||
| 1187 | CONFIG_USB_ARCH_HAS_HCD=y | ||
| 1188 | # CONFIG_USB_ARCH_HAS_OHCI is not set | ||
| 1189 | # CONFIG_USB_ARCH_HAS_EHCI is not set | ||
| 1190 | CONFIG_USB=m | ||
| 1191 | # CONFIG_USB_DEBUG is not set | ||
| 1192 | |||
| 1193 | # | ||
| 1194 | # Miscellaneous USB options | ||
| 1195 | # | ||
| 1196 | CONFIG_USB_DEVICEFS=y | ||
| 1197 | CONFIG_USB_DEVICE_CLASS=y | ||
| 1198 | # CONFIG_USB_DYNAMIC_MINORS is not set | ||
| 1199 | # CONFIG_USB_SUSPEND is not set | ||
| 1200 | # CONFIG_USB_PERSIST is not set | ||
| 1201 | # CONFIG_USB_OTG is not set | ||
| 1202 | |||
| 1203 | # | ||
| 1204 | # USB Host Controller Drivers | ||
| 1205 | # | ||
| 1206 | # CONFIG_USB_ISP116X_HCD is not set | ||
| 1207 | # CONFIG_USB_SL811_HCD is not set | ||
| 1208 | # CONFIG_USB_R8A66597_HCD is not set | ||
| 1209 | |||
| 1210 | # | ||
| 1211 | # USB Device Class drivers | ||
| 1212 | # | ||
| 1213 | CONFIG_USB_ACM=m | ||
| 1214 | CONFIG_USB_PRINTER=m | ||
| 1215 | |||
| 1216 | # | ||
| 1217 | # NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' | ||
| 1218 | # | ||
| 1219 | |||
| 1220 | # | ||
| 1221 | # may also be needed; see USB_STORAGE Help for more information | ||
| 1222 | # | ||
| 1223 | CONFIG_USB_STORAGE=m | ||
| 1224 | # CONFIG_USB_STORAGE_DEBUG is not set | ||
| 1225 | # CONFIG_USB_STORAGE_DATAFAB is not set | ||
| 1226 | # CONFIG_USB_STORAGE_FREECOM is not set | ||
| 1227 | # CONFIG_USB_STORAGE_ISD200 is not set | ||
| 1228 | # CONFIG_USB_STORAGE_DPCM is not set | ||
| 1229 | # CONFIG_USB_STORAGE_USBAT is not set | ||
| 1230 | # CONFIG_USB_STORAGE_SDDR09 is not set | ||
| 1231 | # CONFIG_USB_STORAGE_SDDR55 is not set | ||
| 1232 | # CONFIG_USB_STORAGE_JUMPSHOT is not set | ||
| 1233 | # CONFIG_USB_STORAGE_ALAUDA is not set | ||
| 1234 | # CONFIG_USB_STORAGE_KARMA is not set | ||
| 1235 | # CONFIG_USB_LIBUSUAL is not set | ||
| 1236 | |||
| 1237 | # | ||
| 1238 | # USB Imaging devices | ||
| 1239 | # | ||
| 1240 | CONFIG_USB_MDC800=m | ||
| 1241 | CONFIG_USB_MICROTEK=m | ||
| 1242 | CONFIG_USB_MON=y | ||
| 1243 | |||
| 1244 | # | ||
| 1245 | # USB port drivers | ||
| 1246 | # | ||
| 1247 | |||
| 1248 | # | ||
| 1249 | # USB Serial Converter support | ||
| 1250 | # | ||
| 1251 | CONFIG_USB_SERIAL=m | ||
| 1252 | CONFIG_USB_SERIAL_GENERIC=y | ||
| 1253 | # CONFIG_USB_SERIAL_AIRCABLE is not set | ||
| 1254 | # CONFIG_USB_SERIAL_AIRPRIME is not set | ||
| 1255 | # CONFIG_USB_SERIAL_ARK3116 is not set | ||
| 1256 | CONFIG_USB_SERIAL_BELKIN=m | ||
| 1257 | # CONFIG_USB_SERIAL_CH341 is not set | ||
| 1258 | # CONFIG_USB_SERIAL_WHITEHEAT is not set | ||
| 1259 | CONFIG_USB_SERIAL_DIGI_ACCELEPORT=m | ||
| 1260 | # CONFIG_USB_SERIAL_CP2101 is not set | ||
| 1261 | CONFIG_USB_SERIAL_CYPRESS_M8=m | ||
| 1262 | CONFIG_USB_SERIAL_EMPEG=m | ||
| 1263 | CONFIG_USB_SERIAL_FTDI_SIO=m | ||
| 1264 | # CONFIG_USB_SERIAL_FUNSOFT is not set | ||
| 1265 | CONFIG_USB_SERIAL_VISOR=m | ||
| 1266 | CONFIG_USB_SERIAL_IPAQ=m | ||
| 1267 | CONFIG_USB_SERIAL_IR=m | ||
| 1268 | CONFIG_USB_SERIAL_EDGEPORT=m | ||
| 1269 | CONFIG_USB_SERIAL_EDGEPORT_TI=m | ||
| 1270 | CONFIG_USB_SERIAL_GARMIN=m | ||
| 1271 | CONFIG_USB_SERIAL_IPW=m | ||
| 1272 | CONFIG_USB_SERIAL_KEYSPAN_PDA=m | ||
| 1273 | CONFIG_USB_SERIAL_KEYSPAN=m | ||
| 1274 | # CONFIG_USB_SERIAL_KEYSPAN_MPR is not set | ||
| 1275 | # CONFIG_USB_SERIAL_KEYSPAN_USA28 is not set | ||
| 1276 | # CONFIG_USB_SERIAL_KEYSPAN_USA28X is not set | ||
| 1277 | # CONFIG_USB_SERIAL_KEYSPAN_USA28XA is not set | ||
| 1278 | # CONFIG_USB_SERIAL_KEYSPAN_USA28XB is not set | ||
| 1279 | # CONFIG_USB_SERIAL_KEYSPAN_USA19 is not set | ||
| 1280 | # CONFIG_USB_SERIAL_KEYSPAN_USA18X is not set | ||
| 1281 | # CONFIG_USB_SERIAL_KEYSPAN_USA19W is not set | ||
| 1282 | # CONFIG_USB_SERIAL_KEYSPAN_USA19QW is not set | ||
| 1283 | # CONFIG_USB_SERIAL_KEYSPAN_USA19QI is not set | ||
| 1284 | # CONFIG_USB_SERIAL_KEYSPAN_USA49W is not set | ||
| 1285 | # CONFIG_USB_SERIAL_KEYSPAN_USA49WLC is not set | ||
| 1286 | CONFIG_USB_SERIAL_KLSI=m | ||
| 1287 | CONFIG_USB_SERIAL_KOBIL_SCT=m | ||
| 1288 | CONFIG_USB_SERIAL_MCT_U232=m | ||
| 1289 | # CONFIG_USB_SERIAL_MOS7720 is not set | ||
| 1290 | # CONFIG_USB_SERIAL_MOS7840 is not set | ||
| 1291 | # CONFIG_USB_SERIAL_NAVMAN is not set | ||
| 1292 | CONFIG_USB_SERIAL_PL2303=m | ||
| 1293 | # CONFIG_USB_SERIAL_OTI6858 is not set | ||
| 1294 | # CONFIG_USB_SERIAL_HP4X is not set | ||
| 1295 | CONFIG_USB_SERIAL_SAFE=m | ||
| 1296 | # CONFIG_USB_SERIAL_SAFE_PADDED is not set | ||
| 1297 | # CONFIG_USB_SERIAL_SIERRAWIRELESS is not set | ||
| 1298 | CONFIG_USB_SERIAL_TI=m | ||
| 1299 | CONFIG_USB_SERIAL_CYBERJACK=m | ||
| 1300 | CONFIG_USB_SERIAL_XIRCOM=m | ||
| 1301 | # CONFIG_USB_SERIAL_OPTION is not set | ||
| 1302 | CONFIG_USB_SERIAL_OMNINET=m | ||
| 1303 | # CONFIG_USB_SERIAL_DEBUG is not set | ||
| 1304 | CONFIG_USB_EZUSB=y | ||
| 1305 | |||
| 1306 | # | ||
| 1307 | # USB Miscellaneous drivers | ||
| 1308 | # | ||
| 1309 | CONFIG_USB_EMI62=m | ||
| 1310 | CONFIG_USB_EMI26=m | ||
| 1311 | # CONFIG_USB_ADUTUX is not set | ||
| 1312 | CONFIG_USB_AUERSWALD=m | ||
| 1313 | CONFIG_USB_RIO500=m | ||
| 1314 | CONFIG_USB_LEGOTOWER=m | ||
| 1315 | CONFIG_USB_LCD=m | ||
| 1316 | # CONFIG_USB_BERRY_CHARGE is not set | ||
| 1317 | CONFIG_USB_LED=m | ||
| 1318 | # CONFIG_USB_CYPRESS_CY7C63 is not set | ||
| 1319 | CONFIG_USB_CYTHERM=m | ||
| 1320 | # CONFIG_USB_PHIDGET is not set | ||
| 1321 | CONFIG_USB_IDMOUSE=m | ||
| 1322 | # CONFIG_USB_FTDI_ELAN is not set | ||
| 1323 | # CONFIG_USB_APPLEDISPLAY is not set | ||
| 1324 | # CONFIG_USB_LD is not set | ||
| 1325 | # CONFIG_USB_TRANCEVIBRATOR is not set | ||
| 1326 | # CONFIG_USB_IOWARRIOR is not set | ||
| 1327 | # CONFIG_USB_TEST is not set | ||
| 1328 | |||
| 1329 | # | ||
| 1330 | # USB DSL modem support | ||
| 1331 | # | ||
| 1332 | |||
| 1333 | # | ||
| 1334 | # USB Gadget Support | ||
| 1335 | # | ||
| 1336 | CONFIG_USB_GADGET=y | ||
| 1337 | # CONFIG_USB_GADGET_DEBUG is not set | ||
| 1338 | # CONFIG_USB_GADGET_DEBUG_FILES is not set | ||
| 1339 | CONFIG_USB_GADGET_SELECTED=y | ||
| 1340 | # CONFIG_USB_GADGET_AMD5536UDC is not set | ||
| 1341 | # CONFIG_USB_GADGET_ATMEL_USBA is not set | ||
| 1342 | # CONFIG_USB_GADGET_FSL_USB2 is not set | ||
| 1343 | # CONFIG_USB_GADGET_NET2280 is not set | ||
| 1344 | # CONFIG_USB_GADGET_PXA2XX is not set | ||
| 1345 | CONFIG_USB_GADGET_M66592=y | ||
| 1346 | CONFIG_USB_M66592=y | ||
| 1347 | # CONFIG_USB_GADGET_PXA27X is not set | ||
| 1348 | # CONFIG_USB_GADGET_GOKU is not set | ||
| 1349 | # CONFIG_USB_GADGET_LH7A40X is not set | ||
| 1350 | # CONFIG_USB_GADGET_OMAP is not set | ||
| 1351 | # CONFIG_USB_GADGET_S3C2410 is not set | ||
| 1352 | # CONFIG_USB_GADGET_AT91 is not set | ||
| 1353 | # CONFIG_USB_GADGET_DUMMY_HCD is not set | ||
| 1354 | CONFIG_USB_GADGET_DUALSPEED=y | ||
| 1355 | # CONFIG_USB_ZERO is not set | ||
| 1356 | # CONFIG_USB_ETH is not set | ||
| 1357 | # CONFIG_USB_GADGETFS is not set | ||
| 1358 | CONFIG_USB_FILE_STORAGE=m | ||
| 1359 | # CONFIG_USB_FILE_STORAGE_TEST is not set | ||
| 1360 | CONFIG_USB_G_SERIAL=m | ||
| 1361 | # CONFIG_USB_MIDI_GADGET is not set | ||
| 1362 | CONFIG_MMC=y | ||
| 1363 | # CONFIG_MMC_DEBUG is not set | ||
| 1364 | CONFIG_MMC_UNSAFE_RESUME=y | ||
| 1365 | |||
| 1366 | # | ||
| 1367 | # MMC/SD Card Drivers | ||
| 1368 | # | ||
| 1369 | CONFIG_MMC_BLOCK=y | ||
| 1370 | CONFIG_MMC_BLOCK_BOUNCE=y | ||
| 1371 | # CONFIG_SDIO_UART is not set | ||
| 1372 | |||
| 1373 | # | ||
| 1374 | # MMC/SD Host Controller Drivers | ||
| 1375 | # | ||
| 1376 | CONFIG_MMC_PXA=y | ||
| 1377 | CONFIG_NEW_LEDS=y | ||
| 1378 | CONFIG_LEDS_CLASS=y | ||
| 1379 | |||
| 1380 | # | ||
| 1381 | # LED drivers | ||
| 1382 | # | ||
| 1383 | # CONFIG_LEDS_GPIO is not set | ||
| 1384 | |||
| 1385 | # | ||
| 1386 | # LED Triggers | ||
| 1387 | # | ||
| 1388 | CONFIG_LEDS_TRIGGERS=y | ||
| 1389 | CONFIG_LEDS_TRIGGER_TIMER=y | ||
| 1390 | CONFIG_LEDS_TRIGGER_IDE_DISK=y | ||
| 1391 | # CONFIG_LEDS_TRIGGER_HEARTBEAT is not set | ||
| 1392 | CONFIG_RTC_LIB=y | ||
| 1393 | CONFIG_RTC_CLASS=y | ||
| 1394 | CONFIG_RTC_HCTOSYS=y | ||
| 1395 | CONFIG_RTC_HCTOSYS_DEVICE="rtc0" | ||
| 1396 | # CONFIG_RTC_DEBUG is not set | ||
| 1397 | |||
| 1398 | # | ||
| 1399 | # RTC interfaces | ||
| 1400 | # | ||
| 1401 | CONFIG_RTC_INTF_SYSFS=y | ||
| 1402 | CONFIG_RTC_INTF_PROC=y | ||
| 1403 | CONFIG_RTC_INTF_DEV=y | ||
| 1404 | # CONFIG_RTC_INTF_DEV_UIE_EMUL is not set | ||
| 1405 | # CONFIG_RTC_DRV_TEST is not set | ||
| 1406 | |||
| 1407 | # | ||
| 1408 | # I2C RTC drivers | ||
| 1409 | # | ||
| 1410 | # CONFIG_RTC_DRV_DS1307 is not set | ||
| 1411 | # CONFIG_RTC_DRV_DS1374 is not set | ||
| 1412 | # CONFIG_RTC_DRV_DS1672 is not set | ||
| 1413 | # CONFIG_RTC_DRV_MAX6900 is not set | ||
| 1414 | # CONFIG_RTC_DRV_RS5C372 is not set | ||
| 1415 | # CONFIG_RTC_DRV_ISL1208 is not set | ||
| 1416 | # CONFIG_RTC_DRV_X1205 is not set | ||
| 1417 | # CONFIG_RTC_DRV_PCF8563 is not set | ||
| 1418 | # CONFIG_RTC_DRV_PCF8583 is not set | ||
| 1419 | # CONFIG_RTC_DRV_M41T80 is not set | ||
| 1420 | |||
| 1421 | # | ||
| 1422 | # SPI RTC drivers | ||
| 1423 | # | ||
| 1424 | |||
| 1425 | # | ||
| 1426 | # Platform RTC drivers | ||
| 1427 | # | ||
| 1428 | # CONFIG_RTC_DRV_CMOS is not set | ||
| 1429 | # CONFIG_RTC_DRV_DS1553 is not set | ||
| 1430 | # CONFIG_RTC_DRV_STK17TA8 is not set | ||
| 1431 | # CONFIG_RTC_DRV_DS1742 is not set | ||
| 1432 | # CONFIG_RTC_DRV_M48T86 is not set | ||
| 1433 | # CONFIG_RTC_DRV_M48T59 is not set | ||
| 1434 | # CONFIG_RTC_DRV_V3020 is not set | ||
| 1435 | |||
| 1436 | # | ||
| 1437 | # on-CPU RTC drivers | ||
| 1438 | # | ||
| 1439 | CONFIG_RTC_DRV_SA1100=y | ||
| 1440 | |||
| 1441 | # | ||
| 1442 | # File systems | ||
| 1443 | # | ||
| 1444 | CONFIG_EXT2_FS=y | ||
| 1445 | # CONFIG_EXT2_FS_XATTR is not set | ||
| 1446 | # CONFIG_EXT2_FS_XIP is not set | ||
| 1447 | CONFIG_EXT3_FS=m | ||
| 1448 | # CONFIG_EXT3_FS_XATTR is not set | ||
| 1449 | # CONFIG_EXT4DEV_FS is not set | ||
| 1450 | CONFIG_JBD=m | ||
| 1451 | # CONFIG_REISERFS_FS is not set | ||
| 1452 | # CONFIG_JFS_FS is not set | ||
| 1453 | CONFIG_FS_POSIX_ACL=y | ||
| 1454 | # CONFIG_XFS_FS is not set | ||
| 1455 | # CONFIG_GFS2_FS is not set | ||
| 1456 | # CONFIG_OCFS2_FS is not set | ||
| 1457 | # CONFIG_MINIX_FS is not set | ||
| 1458 | # CONFIG_ROMFS_FS is not set | ||
| 1459 | CONFIG_INOTIFY=y | ||
| 1460 | CONFIG_INOTIFY_USER=y | ||
| 1461 | # CONFIG_QUOTA is not set | ||
| 1462 | CONFIG_DNOTIFY=y | ||
| 1463 | # CONFIG_AUTOFS_FS is not set | ||
| 1464 | # CONFIG_AUTOFS4_FS is not set | ||
| 1465 | # CONFIG_FUSE_FS is not set | ||
| 1466 | |||
| 1467 | # | ||
| 1468 | # CD-ROM/DVD Filesystems | ||
| 1469 | # | ||
| 1470 | # CONFIG_ISO9660_FS is not set | ||
| 1471 | # CONFIG_UDF_FS is not set | ||
| 1472 | |||
| 1473 | # | ||
| 1474 | # DOS/FAT/NT Filesystems | ||
| 1475 | # | ||
| 1476 | CONFIG_FAT_FS=y | ||
| 1477 | # CONFIG_MSDOS_FS is not set | ||
| 1478 | CONFIG_VFAT_FS=y | ||
| 1479 | CONFIG_FAT_DEFAULT_CODEPAGE=437 | ||
| 1480 | CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" | ||
| 1481 | # CONFIG_NTFS_FS is not set | ||
| 1482 | |||
| 1483 | # | ||
| 1484 | # Pseudo filesystems | ||
| 1485 | # | ||
| 1486 | CONFIG_PROC_FS=y | ||
| 1487 | CONFIG_PROC_SYSCTL=y | ||
| 1488 | CONFIG_SYSFS=y | ||
| 1489 | CONFIG_TMPFS=y | ||
| 1490 | # CONFIG_TMPFS_POSIX_ACL is not set | ||
| 1491 | # CONFIG_HUGETLB_PAGE is not set | ||
| 1492 | # CONFIG_CONFIGFS_FS is not set | ||
| 1493 | |||
| 1494 | # | ||
| 1495 | # Miscellaneous filesystems | ||
| 1496 | # | ||
| 1497 | # CONFIG_ADFS_FS is not set | ||
| 1498 | # CONFIG_AFFS_FS is not set | ||
| 1499 | # CONFIG_HFS_FS is not set | ||
| 1500 | # CONFIG_HFSPLUS_FS is not set | ||
| 1501 | # CONFIG_BEFS_FS is not set | ||
| 1502 | # CONFIG_BFS_FS is not set | ||
| 1503 | # CONFIG_EFS_FS is not set | ||
| 1504 | CONFIG_JFFS2_FS=y | ||
| 1505 | CONFIG_JFFS2_FS_DEBUG=0 | ||
| 1506 | CONFIG_JFFS2_FS_WRITEBUFFER=y | ||
| 1507 | # CONFIG_JFFS2_FS_WBUF_VERIFY is not set | ||
| 1508 | CONFIG_JFFS2_SUMMARY=y | ||
| 1509 | # CONFIG_JFFS2_FS_XATTR is not set | ||
| 1510 | # CONFIG_JFFS2_SYSFS is not set | ||
| 1511 | CONFIG_JFFS2_COMPRESSION_OPTIONS=y | ||
| 1512 | CONFIG_JFFS2_ZLIB=y | ||
| 1513 | CONFIG_JFFS2_LZO=y | ||
| 1514 | CONFIG_JFFS2_RTIME=y | ||
| 1515 | CONFIG_JFFS2_RUBIN=y | ||
| 1516 | # CONFIG_JFFS2_CMODE_NONE is not set | ||
| 1517 | CONFIG_JFFS2_CMODE_PRIORITY=y | ||
| 1518 | # CONFIG_JFFS2_CMODE_SIZE is not set | ||
| 1519 | # CONFIG_JFFS2_CMODE_FAVOURLZO is not set | ||
| 1520 | CONFIG_CRAMFS=m | ||
| 1521 | CONFIG_SQUASHFS=m | ||
| 1522 | # CONFIG_SQUASHFS_EMBEDDED is not set | ||
| 1523 | CONFIG_SQUASHFS_FRAGMENT_CACHE_SIZE=3 | ||
| 1524 | # CONFIG_VXFS_FS is not set | ||
| 1525 | # CONFIG_HPFS_FS is not set | ||
| 1526 | # CONFIG_QNX4FS_FS is not set | ||
| 1527 | # CONFIG_SYSV_FS is not set | ||
| 1528 | # CONFIG_UFS_FS is not set | ||
| 1529 | CONFIG_NETWORK_FILESYSTEMS=y | ||
| 1530 | CONFIG_NFS_FS=m | ||
| 1531 | CONFIG_NFS_V3=y | ||
| 1532 | # CONFIG_NFS_V3_ACL is not set | ||
| 1533 | CONFIG_NFS_V4=y | ||
| 1534 | # CONFIG_NFS_DIRECTIO is not set | ||
| 1535 | CONFIG_NFSD=m | ||
| 1536 | CONFIG_NFSD_V3=y | ||
| 1537 | # CONFIG_NFSD_V3_ACL is not set | ||
| 1538 | CONFIG_NFSD_V4=y | ||
| 1539 | CONFIG_NFSD_TCP=y | ||
| 1540 | CONFIG_LOCKD=m | ||
| 1541 | CONFIG_LOCKD_V4=y | ||
| 1542 | CONFIG_EXPORTFS=m | ||
| 1543 | CONFIG_NFS_COMMON=y | ||
| 1544 | CONFIG_SUNRPC=m | ||
| 1545 | CONFIG_SUNRPC_GSS=m | ||
| 1546 | # CONFIG_SUNRPC_BIND34 is not set | ||
| 1547 | CONFIG_RPCSEC_GSS_KRB5=m | ||
| 1548 | # CONFIG_RPCSEC_GSS_SPKM3 is not set | ||
| 1549 | CONFIG_SMB_FS=m | ||
| 1550 | CONFIG_SMB_NLS_DEFAULT=y | ||
| 1551 | CONFIG_SMB_NLS_REMOTE="cp437" | ||
| 1552 | CONFIG_CIFS=m | ||
| 1553 | # CONFIG_CIFS_STATS is not set | ||
| 1554 | # CONFIG_CIFS_WEAK_PW_HASH is not set | ||
| 1555 | # CONFIG_CIFS_XATTR is not set | ||
| 1556 | # CONFIG_CIFS_DEBUG2 is not set | ||
| 1557 | # CONFIG_CIFS_EXPERIMENTAL is not set | ||
| 1558 | # CONFIG_NCP_FS is not set | ||
| 1559 | # CONFIG_CODA_FS is not set | ||
| 1560 | # CONFIG_AFS_FS is not set | ||
| 1561 | |||
| 1562 | # | ||
| 1563 | # Partition Types | ||
| 1564 | # | ||
| 1565 | CONFIG_PARTITION_ADVANCED=y | ||
| 1566 | # CONFIG_ACORN_PARTITION is not set | ||
| 1567 | # CONFIG_OSF_PARTITION is not set | ||
| 1568 | # CONFIG_AMIGA_PARTITION is not set | ||
| 1569 | # CONFIG_ATARI_PARTITION is not set | ||
| 1570 | # CONFIG_MAC_PARTITION is not set | ||
| 1571 | CONFIG_MSDOS_PARTITION=y | ||
| 1572 | # CONFIG_BSD_DISKLABEL is not set | ||
| 1573 | # CONFIG_MINIX_SUBPARTITION is not set | ||
| 1574 | # CONFIG_SOLARIS_X86_PARTITION is not set | ||
| 1575 | # CONFIG_UNIXWARE_DISKLABEL is not set | ||
| 1576 | # CONFIG_LDM_PARTITION is not set | ||
| 1577 | # CONFIG_SGI_PARTITION is not set | ||
| 1578 | # CONFIG_ULTRIX_PARTITION is not set | ||
| 1579 | # CONFIG_SUN_PARTITION is not set | ||
| 1580 | # CONFIG_KARMA_PARTITION is not set | ||
| 1581 | # CONFIG_EFI_PARTITION is not set | ||
| 1582 | # CONFIG_SYSV68_PARTITION is not set | ||
| 1583 | CONFIG_NLS=y | ||
| 1584 | CONFIG_NLS_DEFAULT="cp437" | ||
| 1585 | CONFIG_NLS_CODEPAGE_437=y | ||
| 1586 | CONFIG_NLS_CODEPAGE_737=m | ||
| 1587 | CONFIG_NLS_CODEPAGE_775=m | ||
| 1588 | CONFIG_NLS_CODEPAGE_850=m | ||
| 1589 | CONFIG_NLS_CODEPAGE_852=m | ||
| 1590 | CONFIG_NLS_CODEPAGE_855=m | ||
| 1591 | CONFIG_NLS_CODEPAGE_857=m | ||
| 1592 | CONFIG_NLS_CODEPAGE_860=m | ||
| 1593 | CONFIG_NLS_CODEPAGE_861=m | ||
| 1594 | CONFIG_NLS_CODEPAGE_862=m | ||
| 1595 | CONFIG_NLS_CODEPAGE_863=m | ||
| 1596 | CONFIG_NLS_CODEPAGE_864=m | ||
| 1597 | CONFIG_NLS_CODEPAGE_865=m | ||
| 1598 | CONFIG_NLS_CODEPAGE_866=m | ||
| 1599 | CONFIG_NLS_CODEPAGE_869=m | ||
| 1600 | CONFIG_NLS_CODEPAGE_936=m | ||
| 1601 | CONFIG_NLS_CODEPAGE_950=m | ||
| 1602 | CONFIG_NLS_CODEPAGE_932=m | ||
| 1603 | CONFIG_NLS_CODEPAGE_949=m | ||
| 1604 | CONFIG_NLS_CODEPAGE_874=m | ||
| 1605 | CONFIG_NLS_ISO8859_8=m | ||
| 1606 | CONFIG_NLS_CODEPAGE_1250=m | ||
| 1607 | CONFIG_NLS_CODEPAGE_1251=m | ||
| 1608 | CONFIG_NLS_ASCII=m | ||
| 1609 | CONFIG_NLS_ISO8859_1=y | ||
| 1610 | CONFIG_NLS_ISO8859_2=m | ||
| 1611 | CONFIG_NLS_ISO8859_3=m | ||
| 1612 | CONFIG_NLS_ISO8859_4=m | ||
| 1613 | CONFIG_NLS_ISO8859_5=m | ||
| 1614 | CONFIG_NLS_ISO8859_6=m | ||
| 1615 | CONFIG_NLS_ISO8859_7=m | ||
| 1616 | CONFIG_NLS_ISO8859_9=m | ||
| 1617 | CONFIG_NLS_ISO8859_13=m | ||
| 1618 | CONFIG_NLS_ISO8859_14=m | ||
| 1619 | CONFIG_NLS_ISO8859_15=m | ||
| 1620 | CONFIG_NLS_KOI8_R=m | ||
| 1621 | CONFIG_NLS_KOI8_U=m | ||
| 1622 | CONFIG_NLS_UTF8=y | ||
| 1623 | # CONFIG_DLM is not set | ||
| 1624 | CONFIG_INSTRUMENTATION=y | ||
| 1625 | CONFIG_PROFILING=y | ||
| 1626 | CONFIG_OPROFILE=m | ||
| 1627 | # CONFIG_MARKERS is not set | ||
| 1628 | |||
| 1629 | # | ||
| 1630 | # Kernel hacking | ||
| 1631 | # | ||
| 1632 | # CONFIG_PRINTK_TIME is not set | ||
| 1633 | CONFIG_ENABLE_WARN_DEPRECATED=y | ||
| 1634 | CONFIG_ENABLE_MUST_CHECK=y | ||
| 1635 | CONFIG_MAGIC_SYSRQ=y | ||
| 1636 | # CONFIG_UNUSED_SYMBOLS is not set | ||
| 1637 | # CONFIG_DEBUG_FS is not set | ||
| 1638 | # CONFIG_HEADERS_CHECK is not set | ||
| 1639 | CONFIG_DEBUG_KERNEL=y | ||
| 1640 | # CONFIG_DEBUG_SHIRQ is not set | ||
| 1641 | # CONFIG_DETECT_SOFTLOCKUP is not set | ||
| 1642 | # CONFIG_SCHED_DEBUG is not set | ||
| 1643 | # CONFIG_SCHEDSTATS is not set | ||
| 1644 | CONFIG_TIMER_STATS=y | ||
| 1645 | # CONFIG_DEBUG_SLAB is not set | ||
| 1646 | # CONFIG_DEBUG_PREEMPT is not set | ||
| 1647 | # CONFIG_DEBUG_RT_MUTEXES is not set | ||
| 1648 | # CONFIG_RT_MUTEX_TESTER is not set | ||
| 1649 | # CONFIG_DEBUG_SPINLOCK is not set | ||
| 1650 | # CONFIG_DEBUG_MUTEXES is not set | ||
| 1651 | # CONFIG_DEBUG_LOCK_ALLOC is not set | ||
| 1652 | # CONFIG_PROVE_LOCKING is not set | ||
| 1653 | # CONFIG_LOCK_STAT is not set | ||
| 1654 | # CONFIG_DEBUG_SPINLOCK_SLEEP is not set | ||
| 1655 | # CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set | ||
| 1656 | # CONFIG_DEBUG_KOBJECT is not set | ||
| 1657 | CONFIG_DEBUG_BUGVERBOSE=y | ||
| 1658 | # CONFIG_DEBUG_INFO is not set | ||
| 1659 | # CONFIG_DEBUG_VM is not set | ||
| 1660 | # CONFIG_DEBUG_LIST is not set | ||
| 1661 | # CONFIG_DEBUG_SG is not set | ||
| 1662 | CONFIG_FRAME_POINTER=y | ||
| 1663 | # CONFIG_FORCED_INLINING is not set | ||
| 1664 | # CONFIG_BOOT_PRINTK_DELAY is not set | ||
| 1665 | # CONFIG_RCU_TORTURE_TEST is not set | ||
| 1666 | # CONFIG_FAULT_INJECTION is not set | ||
| 1667 | # CONFIG_SAMPLES is not set | ||
| 1668 | # CONFIG_DEBUG_USER is not set | ||
| 1669 | CONFIG_DEBUG_ERRORS=y | ||
| 1670 | # CONFIG_DEBUG_LL is not set | ||
| 1671 | |||
| 1672 | # | ||
| 1673 | # Security options | ||
| 1674 | # | ||
| 1675 | # CONFIG_KEYS is not set | ||
| 1676 | # CONFIG_SECURITY is not set | ||
| 1677 | # CONFIG_SECURITY_FILE_CAPABILITIES is not set | ||
| 1678 | CONFIG_CRYPTO=y | ||
| 1679 | CONFIG_CRYPTO_ALGAPI=m | ||
| 1680 | CONFIG_CRYPTO_BLKCIPHER=m | ||
| 1681 | CONFIG_CRYPTO_HASH=m | ||
| 1682 | CONFIG_CRYPTO_MANAGER=m | ||
| 1683 | CONFIG_CRYPTO_HMAC=m | ||
| 1684 | # CONFIG_CRYPTO_XCBC is not set | ||
| 1685 | CONFIG_CRYPTO_NULL=m | ||
| 1686 | CONFIG_CRYPTO_MD4=m | ||
| 1687 | CONFIG_CRYPTO_MD5=m | ||
| 1688 | CONFIG_CRYPTO_SHA1=m | ||
| 1689 | CONFIG_CRYPTO_SHA256=m | ||
| 1690 | CONFIG_CRYPTO_SHA512=m | ||
| 1691 | CONFIG_CRYPTO_WP512=m | ||
| 1692 | # CONFIG_CRYPTO_TGR192 is not set | ||
| 1693 | # CONFIG_CRYPTO_GF128MUL is not set | ||
| 1694 | CONFIG_CRYPTO_ECB=m | ||
| 1695 | CONFIG_CRYPTO_CBC=m | ||
| 1696 | CONFIG_CRYPTO_PCBC=m | ||
| 1697 | # CONFIG_CRYPTO_LRW is not set | ||
| 1698 | # CONFIG_CRYPTO_XTS is not set | ||
| 1699 | # CONFIG_CRYPTO_CRYPTD is not set | ||
| 1700 | CONFIG_CRYPTO_DES=m | ||
| 1701 | # CONFIG_CRYPTO_FCRYPT is not set | ||
| 1702 | CONFIG_CRYPTO_BLOWFISH=m | ||
| 1703 | CONFIG_CRYPTO_TWOFISH=m | ||
| 1704 | CONFIG_CRYPTO_TWOFISH_COMMON=m | ||
| 1705 | CONFIG_CRYPTO_SERPENT=m | ||
| 1706 | CONFIG_CRYPTO_AES=m | ||
| 1707 | CONFIG_CRYPTO_CAST5=m | ||
| 1708 | CONFIG_CRYPTO_CAST6=m | ||
| 1709 | CONFIG_CRYPTO_TEA=m | ||
| 1710 | CONFIG_CRYPTO_ARC4=m | ||
| 1711 | CONFIG_CRYPTO_KHAZAD=m | ||
| 1712 | CONFIG_CRYPTO_ANUBIS=m | ||
| 1713 | # CONFIG_CRYPTO_SEED is not set | ||
| 1714 | CONFIG_CRYPTO_DEFLATE=m | ||
| 1715 | CONFIG_CRYPTO_LZO=m | ||
| 1716 | CONFIG_CRYPTO_MICHAEL_MIC=m | ||
| 1717 | CONFIG_CRYPTO_CRC32C=m | ||
| 1718 | CONFIG_CRYPTO_CAMELLIA=m | ||
| 1719 | CONFIG_CRYPTO_TEST=m | ||
| 1720 | # CONFIG_CRYPTO_AUTHENC is not set | ||
| 1721 | # CONFIG_CRYPTO_HW is not set | ||
| 1722 | |||
| 1723 | # | ||
| 1724 | # Library routines | ||
| 1725 | # | ||
| 1726 | CONFIG_BITREVERSE=y | ||
| 1727 | CONFIG_CRC_CCITT=y | ||
| 1728 | # CONFIG_CRC16 is not set | ||
| 1729 | # CONFIG_CRC_ITU_T is not set | ||
| 1730 | CONFIG_CRC32=y | ||
| 1731 | # CONFIG_CRC7 is not set | ||
| 1732 | CONFIG_LIBCRC32C=m | ||
| 1733 | CONFIG_ZLIB_INFLATE=y | ||
| 1734 | CONFIG_ZLIB_DEFLATE=y | ||
| 1735 | CONFIG_LZO_COMPRESS=y | ||
| 1736 | CONFIG_LZO_DECOMPRESS=y | ||
| 1737 | CONFIG_PLIST=y | ||
| 1738 | CONFIG_HAS_IOMEM=y | ||
| 1739 | CONFIG_HAS_IOPORT=y | ||
| 1740 | CONFIG_HAS_DMA=y | ||
diff --git a/meta/packages/linux/linux-rp-2.6.25+2.6.26-rc4/hostap-monitor-mode.patch b/meta/packages/linux/linux-rp-2.6.25+2.6.26-rc4/hostap-monitor-mode.patch new file mode 100644 index 0000000000..641fd19e50 --- /dev/null +++ b/meta/packages/linux/linux-rp-2.6.25+2.6.26-rc4/hostap-monitor-mode.patch | |||
| @@ -0,0 +1,209 @@ | |||
| 1 | This is a patch that I've been maintaining for a few years, and I'd | ||
| 2 | really like to see it added to the mainstream zaurus kernel so I can | ||
| 3 | finally stop distributing my own. | ||
| 4 | |||
| 5 | This patch only effects the card while in monitor mode, and does not | ||
| 6 | cause any known stability issues. | ||
| 7 | |||
| 8 | http://patches.aircrack-ng.org/hostap-kernel-2.6.18.patch | ||
| 9 | |||
| 10 | Rick Farina (Zero_Chaos) | ||
| 11 | |||
| 12 | diff -ur linux-2.6.18-gentoo/drivers/net/wireless/hostap/hostap_80211_tx.c linux-2.6.18-gentoo-rawtx/drivers/net/wireless/hostap/hostap_80211_tx.c | ||
| 13 | --- linux-2.6.18-gentoo/drivers/net/wireless/hostap/hostap_80211_tx.c 2006-09-21 01:26:27.000000000 -0400 | ||
| 14 | +++ linux-2.6.18-gentoo-rawtx/drivers/net/wireless/hostap/hostap_80211_tx.c 2006-09-21 01:30:18.000000000 -0400 | ||
| 15 | @@ -69,6 +69,9 @@ | ||
| 16 | iface = netdev_priv(dev); | ||
| 17 | local = iface->local; | ||
| 18 | |||
| 19 | + if (local->iw_mode == IW_MODE_MONITOR) | ||
| 20 | + goto xmit; | ||
| 21 | + | ||
| 22 | if (skb->len < ETH_HLEN) { | ||
| 23 | printk(KERN_DEBUG "%s: hostap_data_start_xmit: short skb " | ||
| 24 | "(len=%d)\n", dev->name, skb->len); | ||
| 25 | @@ -234,6 +237,7 @@ | ||
| 26 | memcpy(skb_put(skb, ETH_ALEN), &hdr.addr4, ETH_ALEN); | ||
| 27 | } | ||
| 28 | |||
| 29 | +xmit: | ||
| 30 | iface->stats.tx_packets++; | ||
| 31 | iface->stats.tx_bytes += skb->len; | ||
| 32 | |||
| 33 | @@ -404,8 +408,6 @@ | ||
| 34 | } | ||
| 35 | |||
| 36 | if (skb->len < 24) { | ||
| 37 | - printk(KERN_DEBUG "%s: hostap_master_start_xmit: short skb " | ||
| 38 | - "(len=%d)\n", dev->name, skb->len); | ||
| 39 | ret = 0; | ||
| 40 | iface->stats.tx_dropped++; | ||
| 41 | goto fail; | ||
| 42 | Only in linux-2.6.18-gentoo-rawtx/drivers/net/wireless/hostap: hostap_cs.c.orig | ||
| 43 | Only in linux-2.6.18-gentoo-rawtx/drivers/net/wireless/hostap: hostap_cs.c.rej | ||
| 44 | diff -ur linux-2.6.18-gentoo/drivers/net/wireless/hostap/hostap_hw.c linux-2.6.18-gentoo-rawtx/drivers/net/wireless/hostap/hostap_hw.c | ||
| 45 | --- linux-2.6.18-gentoo/drivers/net/wireless/hostap/hostap_hw.c 2006-09-21 01:26:27.000000000 -0400 | ||
| 46 | +++ linux-2.6.18-gentoo-rawtx/drivers/net/wireless/hostap/hostap_hw.c 2006-09-21 01:30:18.000000000 -0400 | ||
| 47 | @@ -1005,6 +1005,35 @@ | ||
| 48 | return fid; | ||
| 49 | } | ||
| 50 | |||
| 51 | +static int prism2_monitor_enable(struct net_device *dev) | ||
| 52 | +{ | ||
| 53 | + if (hostap_set_word(dev, HFA384X_RID_CNFPORTTYPE, 5)) { | ||
| 54 | + printk(KERN_DEBUG "Port type setting for monitor mode " | ||
| 55 | + "failed\n"); | ||
| 56 | + return -EOPNOTSUPP; | ||
| 57 | + } | ||
| 58 | + | ||
| 59 | + if (hfa384x_cmd(dev, HFA384X_CMDCODE_TEST | (0x0a << 8), | ||
| 60 | + 0, NULL, NULL)) { | ||
| 61 | + printk(KERN_DEBUG "Could not enter testmode 0x0a\n"); | ||
| 62 | + return -EOPNOTSUPP; | ||
| 63 | + } | ||
| 64 | + | ||
| 65 | + if (hostap_set_word(dev, HFA384X_RID_CNFWEPFLAGS, | ||
| 66 | + HFA384X_WEPFLAGS_PRIVACYINVOKED | | ||
| 67 | + HFA384X_WEPFLAGS_HOSTENCRYPT | | ||
| 68 | + HFA384X_WEPFLAGS_HOSTDECRYPT)) { | ||
| 69 | + printk(KERN_DEBUG "WEP flags setting failed\n"); | ||
| 70 | + return -EOPNOTSUPP; | ||
| 71 | + } | ||
| 72 | + | ||
| 73 | + if (hostap_set_word(dev, HFA384X_RID_PROMISCUOUSMODE, 1)) { | ||
| 74 | + printk(KERN_DEBUG "Could not set promiscuous mode\n"); | ||
| 75 | + return -EOPNOTSUPP; | ||
| 76 | + } | ||
| 77 | + | ||
| 78 | + return 0; | ||
| 79 | +} | ||
| 80 | |||
| 81 | static int prism2_reset_port(struct net_device *dev) | ||
| 82 | { | ||
| 83 | @@ -1031,6 +1060,10 @@ | ||
| 84 | "port\n", dev->name); | ||
| 85 | } | ||
| 86 | |||
| 87 | + if (local->iw_mode == IW_MODE_MONITOR) | ||
| 88 | + /* force mode 0x0a after port 0 reset */ | ||
| 89 | + return prism2_monitor_enable(dev); | ||
| 90 | + | ||
| 91 | /* It looks like at least some STA firmware versions reset | ||
| 92 | * fragmentation threshold back to 2346 after enable command. Restore | ||
| 93 | * the configured value, if it differs from this default. */ | ||
| 94 | @@ -1466,6 +1499,10 @@ | ||
| 95 | return 1; | ||
| 96 | } | ||
| 97 | |||
| 98 | + if (local->iw_mode == IW_MODE_MONITOR) | ||
| 99 | + /* force mode 0x0a after port 0 reset */ | ||
| 100 | + prism2_monitor_enable(dev); | ||
| 101 | + | ||
| 102 | local->hw_ready = 1; | ||
| 103 | local->hw_reset_tries = 0; | ||
| 104 | local->hw_resetting = 0; | ||
| 105 | @@ -3156,6 +3193,7 @@ | ||
| 106 | local->func->hw_config = prism2_hw_config; | ||
| 107 | local->func->hw_reset = prism2_hw_reset; | ||
| 108 | local->func->hw_shutdown = prism2_hw_shutdown; | ||
| 109 | + local->func->monitor_enable = prism2_monitor_enable; | ||
| 110 | local->func->reset_port = prism2_reset_port; | ||
| 111 | local->func->schedule_reset = prism2_schedule_reset; | ||
| 112 | #ifdef PRISM2_DOWNLOAD_SUPPORT | ||
| 113 | Only in linux-2.6.18-gentoo-rawtx/drivers/net/wireless/hostap: hostap_hw.c.orig | ||
| 114 | diff -ur linux-2.6.18-gentoo/drivers/net/wireless/hostap/hostap_ioctl.c linux-2.6.18-gentoo-rawtx/drivers/net/wireless/hostap/hostap_ioctl.c | ||
| 115 | --- linux-2.6.18-gentoo/drivers/net/wireless/hostap/hostap_ioctl.c 2006-09-21 01:26:27.000000000 -0400 | ||
| 116 | +++ linux-2.6.18-gentoo-rawtx/drivers/net/wireless/hostap/hostap_ioctl.c 2006-09-21 01:30:18.000000000 -0400 | ||
| 117 | @@ -1104,33 +1104,7 @@ | ||
| 118 | |||
| 119 | printk(KERN_DEBUG "Enabling monitor mode\n"); | ||
| 120 | hostap_monitor_set_type(local); | ||
| 121 | - | ||
| 122 | - if (hostap_set_word(dev, HFA384X_RID_CNFPORTTYPE, | ||
| 123 | - HFA384X_PORTTYPE_PSEUDO_IBSS)) { | ||
| 124 | - printk(KERN_DEBUG "Port type setting for monitor mode " | ||
| 125 | - "failed\n"); | ||
| 126 | - return -EOPNOTSUPP; | ||
| 127 | - } | ||
| 128 | - | ||
| 129 | - /* Host decrypt is needed to get the IV and ICV fields; | ||
| 130 | - * however, monitor mode seems to remove WEP flag from frame | ||
| 131 | - * control field */ | ||
| 132 | - if (hostap_set_word(dev, HFA384X_RID_CNFWEPFLAGS, | ||
| 133 | - HFA384X_WEPFLAGS_HOSTENCRYPT | | ||
| 134 | - HFA384X_WEPFLAGS_HOSTDECRYPT)) { | ||
| 135 | - printk(KERN_DEBUG "WEP flags setting failed\n"); | ||
| 136 | - return -EOPNOTSUPP; | ||
| 137 | - } | ||
| 138 | - | ||
| 139 | - if (local->func->reset_port(dev) || | ||
| 140 | - local->func->cmd(dev, HFA384X_CMDCODE_TEST | | ||
| 141 | - (HFA384X_TEST_MONITOR << 8), | ||
| 142 | - 0, NULL, NULL)) { | ||
| 143 | - printk(KERN_DEBUG "Setting monitor mode failed\n"); | ||
| 144 | - return -EOPNOTSUPP; | ||
| 145 | - } | ||
| 146 | - | ||
| 147 | - return 0; | ||
| 148 | + return local->func->reset_port(dev); | ||
| 149 | } | ||
| 150 | |||
| 151 | |||
| 152 | @@ -1199,7 +1173,7 @@ | ||
| 153 | local->iw_mode = *mode; | ||
| 154 | |||
| 155 | if (local->iw_mode == IW_MODE_MONITOR) | ||
| 156 | - hostap_monitor_mode_enable(local); | ||
| 157 | + return hostap_monitor_mode_enable(local); | ||
| 158 | else if (local->iw_mode == IW_MODE_MASTER && !local->host_encrypt && | ||
| 159 | !local->fw_encrypt_ok) { | ||
| 160 | printk(KERN_DEBUG "%s: defaulting to host-based encryption as " | ||
| 161 | diff -ur linux-2.6.18-gentoo/drivers/net/wireless/hostap/hostap_main.c linux-2.6.18-gentoo-rawtx/drivers/net/wireless/hostap/hostap_main.c | ||
| 162 | --- linux-2.6.18-gentoo/drivers/net/wireless/hostap/hostap_main.c 2006-09-21 01:26:27.000000000 -0400 | ||
| 163 | +++ linux-2.6.18-gentoo-rawtx/drivers/net/wireless/hostap/hostap_main.c 2006-09-21 01:30:18.000000000 -0400 | ||
| 164 | @@ -331,7 +331,7 @@ | ||
| 165 | if (local->iw_mode == IW_MODE_REPEAT) | ||
| 166 | return HFA384X_PORTTYPE_WDS; | ||
| 167 | if (local->iw_mode == IW_MODE_MONITOR) | ||
| 168 | - return HFA384X_PORTTYPE_PSEUDO_IBSS; | ||
| 169 | + return 5; /*HFA384X_PORTTYPE_PSEUDO_IBSS;*/ | ||
| 170 | return HFA384X_PORTTYPE_HOSTAP; | ||
| 171 | } | ||
| 172 | |||
| 173 | Only in linux-2.6.18-gentoo-rawtx/drivers/net/wireless/hostap: hostap_main.c.orig | ||
| 174 | diff -ur linux-2.6.18-gentoo/drivers/net/wireless/hostap/hostap_pci.c linux-2.6.18-gentoo-rawtx/drivers/net/wireless/hostap/hostap_pci.c | ||
| 175 | --- linux-2.6.18-gentoo/drivers/net/wireless/hostap/hostap_pci.c 2006-09-21 01:26:27.000000000 -0400 | ||
| 176 | +++ linux-2.6.18-gentoo-rawtx/drivers/net/wireless/hostap/hostap_pci.c 2006-09-21 01:30:18.000000000 -0400 | ||
| 177 | @@ -48,6 +48,8 @@ | ||
| 178 | { 0x1260, 0x3873, PCI_ANY_ID, PCI_ANY_ID }, | ||
| 179 | /* Samsung MagicLAN SWL-2210P */ | ||
| 180 | { 0x167d, 0xa000, PCI_ANY_ID, PCI_ANY_ID }, | ||
| 181 | + /* NETGEAR MA311 */ | ||
| 182 | + { 0x1385, 0x3872, PCI_ANY_ID, PCI_ANY_ID }, | ||
| 183 | { 0 } | ||
| 184 | }; | ||
| 185 | |||
| 186 | Only in linux-2.6.18-gentoo-rawtx/drivers/net/wireless/hostap: hostap_pci.c.orig | ||
| 187 | diff -ur linux-2.6.18-gentoo/drivers/net/wireless/hostap/hostap_plx.c linux-2.6.18-gentoo-rawtx/drivers/net/wireless/hostap/hostap_plx.c | ||
| 188 | --- linux-2.6.18-gentoo/drivers/net/wireless/hostap/hostap_plx.c 2006-09-21 01:26:27.000000000 -0400 | ||
| 189 | +++ linux-2.6.18-gentoo-rawtx/drivers/net/wireless/hostap/hostap_plx.c 2006-09-21 01:30:18.000000000 -0400 | ||
| 190 | @@ -101,6 +101,7 @@ | ||
| 191 | { 0xc250, 0x0002 } /* EMTAC A2424i */, | ||
| 192 | { 0xd601, 0x0002 } /* Z-Com XI300 */, | ||
| 193 | { 0xd601, 0x0005 } /* Zcomax XI-325H 200mW */, | ||
| 194 | + { 0xd601, 0x0010 } /* Zcomax XI-325H 100mW */, | ||
| 195 | { 0, 0} | ||
| 196 | }; | ||
| 197 | |||
| 198 | Only in linux-2.6.18-gentoo-rawtx/drivers/net/wireless/hostap: hostap_plx.c.orig | ||
| 199 | diff -ur linux-2.6.18-gentoo/drivers/net/wireless/hostap/hostap_wlan.h linux-2.6.18-gentoo-rawtx/drivers/net/wireless/hostap/hostap_wlan.h | ||
| 200 | --- linux-2.6.18-gentoo/drivers/net/wireless/hostap/hostap_wlan.h 2006-09-21 01:26:27.000000000 -0400 | ||
| 201 | +++ linux-2.6.18-gentoo-rawtx/drivers/net/wireless/hostap/hostap_wlan.h 2006-09-21 01:30:18.000000000 -0400 | ||
| 202 | @@ -575,6 +575,7 @@ | ||
| 203 | int (*hw_config)(struct net_device *dev, int initial); | ||
| 204 | void (*hw_reset)(struct net_device *dev); | ||
| 205 | void (*hw_shutdown)(struct net_device *dev, int no_disable); | ||
| 206 | + int (*monitor_enable)(struct net_device *dev); | ||
| 207 | int (*reset_port)(struct net_device *dev); | ||
| 208 | void (*schedule_reset)(local_info_t *local); | ||
| 209 | int (*download)(local_info_t *local, | ||
diff --git a/meta/packages/linux/linux-rp-2.6.25+2.6.26-rc4/hrw-hostapcard.patch b/meta/packages/linux/linux-rp-2.6.25+2.6.26-rc4/hrw-hostapcard.patch new file mode 100644 index 0000000000..67fc5b7c70 --- /dev/null +++ b/meta/packages/linux/linux-rp-2.6.25+2.6.26-rc4/hrw-hostapcard.patch | |||
| @@ -0,0 +1,34 @@ | |||
| 1 | |||
| 2 | From: Marcin Juszkiewicz <openembedded@haerwu.biz> | ||
| 3 | |||
| 4 | Card reported by Ångström user: | ||
| 5 | http://bugs.openembedded.net/show_bug.cgi?id=3236 | ||
| 6 | |||
| 7 | Socket 1: | ||
| 8 | product info: "Wireless LAN", "11Mbps PC Card", "Version 01.02", "" | ||
| 9 | manfid: 0x0156, 0x0002 | ||
| 10 | function: 6 (network) | ||
| 11 | |||
| 12 | Signed-off-by: Marcin Juszkiewicz <openembedded@haerwu.biz> | ||
| 13 | Acked-by: Pavel Roskin <proski@gnu.org> | ||
| 14 | |||
| 15 | --- | ||
| 16 | drivers/net/wireless/hostap/hostap_cs.c | 3 +++ | ||
| 17 | 1 file changed, 3 insertions(+) | ||
| 18 | |||
| 19 | --- linux-2.6.24.orig/drivers/net/wireless/hostap/hostap_cs.c | ||
| 20 | +++ linux-2.6.24/drivers/net/wireless/hostap/hostap_cs.c | ||
| 21 | @@ -892,10 +892,13 @@ static struct pcmcia_device_id hostap_cs | ||
| 22 | 0xa21501a, 0x59868926, 0xc9049a39), | ||
| 23 | PCMCIA_DEVICE_PROD_ID1234( | ||
| 24 | "The Linksys Group, Inc.", "Wireless Network CF Card", "ISL37300P", | ||
| 25 | "RevA", | ||
| 26 | 0xa5f472c2, 0x9c05598d, 0xc9049a39, 0x57a66194), | ||
| 27 | + PCMCIA_DEVICE_PROD_ID123( | ||
| 28 | + "Wireless LAN" , "11Mbps PC Card", "Version 01.02", | ||
| 29 | + 0x4b8870ff, 0x70e946d1, 0x4b74baa0), | ||
| 30 | PCMCIA_DEVICE_NULL | ||
| 31 | }; | ||
| 32 | MODULE_DEVICE_TABLE(pcmcia, hostap_cs_ids); | ||
| 33 | |||
| 34 | |||
diff --git a/meta/packages/linux/linux-rp-2.6.25+2.6.26-rc4/htcuni-acx.patch b/meta/packages/linux/linux-rp-2.6.25+2.6.26-rc4/htcuni-acx.patch new file mode 100644 index 0000000000..1ccebddc8d --- /dev/null +++ b/meta/packages/linux/linux-rp-2.6.25+2.6.26-rc4/htcuni-acx.patch | |||
| @@ -0,0 +1,33527 @@ | |||
| 1 | --- | ||
| 2 | drivers/net/wireless/Kconfig | 31 | ||
| 3 | drivers/net/wireless/Makefile | 2 | ||
| 4 | drivers/net/wireless/acx/Kconfig | 113 | ||
| 5 | drivers/net/wireless/acx/Makefile | 21 | ||
| 6 | drivers/net/wireless/acx/acx.h | 14 | ||
| 7 | drivers/net/wireless/acx/acx_config.h | 50 | ||
| 8 | drivers/net/wireless/acx/acx_func.h | 710 ++ | ||
| 9 | drivers/net/wireless/acx/acx_hw.h | 18 | ||
| 10 | drivers/net/wireless/acx/acx_struct.h | 2114 ++++++++ | ||
| 11 | drivers/net/wireless/acx/common.c | 7388 ++++++++++++++++++++++++++++ | ||
| 12 | drivers/net/wireless/acx/conv.c | 504 + | ||
| 13 | drivers/net/wireless/acx/cs.c | 5703 +++++++++++++++++++++ | ||
| 14 | drivers/net/wireless/acx/htcsable_acx.c | 118 | ||
| 15 | drivers/net/wireless/acx/htcuniversal_acx.c | 108 | ||
| 16 | drivers/net/wireless/acx/hx4700_acx.c | 108 | ||
| 17 | drivers/net/wireless/acx/ioctl.c | 2748 ++++++++++ | ||
| 18 | drivers/net/wireless/acx/mem.c | 5363 ++++++++++++++++++++ | ||
| 19 | drivers/net/wireless/acx/pci.c | 4234 ++++++++++++++++ | ||
| 20 | drivers/net/wireless/acx/rx3000_acx.c | 110 | ||
| 21 | drivers/net/wireless/acx/setrate.c | 213 | ||
| 22 | drivers/net/wireless/acx/usb.c | 1922 +++++++ | ||
| 23 | drivers/net/wireless/acx/wlan.c | 424 + | ||
| 24 | drivers/net/wireless/acx/wlan_compat.h | 260 | ||
| 25 | drivers/net/wireless/acx/wlan_hdr.h | 497 + | ||
| 26 | drivers/net/wireless/acx/wlan_mgmt.h | 582 ++ | ||
| 27 | 25 files changed, 33355 insertions(+) | ||
| 28 | |||
| 29 | Index: linux-2.6.23/drivers/net/wireless/acx/acx_config.h | ||
| 30 | =================================================================== | ||
| 31 | --- /dev/null 1970-01-01 00:00:00.000000000 +0000 | ||
| 32 | +++ linux-2.6.23/drivers/net/wireless/acx/acx_config.h 2008-01-20 21:13:40.000000000 +0000 | ||
| 33 | @@ -0,0 +1,50 @@ | ||
| 34 | +#define ACX_RELEASE "v0.3.36" | ||
| 35 | + | ||
| 36 | +/* | ||
| 37 | + * Test out all the channels in reg domain 0x10 | ||
| 38 | + */ | ||
| 39 | +#define ACX_ALLOW_ALLCHANNELS | ||
| 40 | + | ||
| 41 | +/* set to 0 if you don't want any debugging code to be compiled in */ | ||
| 42 | +/* set to 1 if you want some debugging */ | ||
| 43 | +/* set to 2 if you want extensive debug log */ | ||
| 44 | +#define ACX_DEBUG 0 | ||
| 45 | + | ||
| 46 | +/* | ||
| 47 | + * Since we'll be changing channels a lot | ||
| 48 | +#define ACX_DEFAULT_MSG (L_ASSOC|L_INIT) | ||
| 49 | +*/ | ||
| 50 | +#define ACX_DEFAULT_MSG (L_ASSOC|L_INIT) | ||
| 51 | + | ||
| 52 | +/* assume 32bit I/O width | ||
| 53 | + * (16bit is also compatible with Compact Flash) */ | ||
| 54 | +#define ACX_IO_WIDTH 32 | ||
| 55 | + | ||
| 56 | +/* Set this to 1 if you want monitor mode to use | ||
| 57 | + * phy header. Currently it is not useful anyway since we | ||
| 58 | + * don't know what useful info (if any) is in phy header. | ||
| 59 | + * If you want faster/smaller code, say 0 here */ | ||
| 60 | +#define WANT_PHY_HDR 0 | ||
| 61 | + | ||
| 62 | +/* whether to do Tx descriptor cleanup in softirq (i.e. not in IRQ | ||
| 63 | + * handler) or not. Note that doing it later does slightly increase | ||
| 64 | + * system load, so still do that stuff in the IRQ handler for now, | ||
| 65 | + * even if that probably means worse latency */ | ||
| 66 | +#define TX_CLEANUP_IN_SOFTIRQ 0 | ||
| 67 | + | ||
| 68 | +/* if you want very experimental 802.11 power save mode features */ | ||
| 69 | +#define POWER_SAVE_80211 0 | ||
| 70 | + | ||
| 71 | +/* if you want very early packet fragmentation bits and pieces */ | ||
| 72 | +#define ACX_FRAGMENTATION 0 | ||
| 73 | + | ||
| 74 | +/* Locking: */ | ||
| 75 | +/* very talkative */ | ||
| 76 | +/* #define PARANOID_LOCKING 1 */ | ||
| 77 | +/* normal (use when bug-free) */ | ||
| 78 | +#define DO_LOCKING 1 | ||
| 79 | +/* else locking is disabled! */ | ||
| 80 | + | ||
| 81 | +/* 0 - normal mode */ | ||
| 82 | +/* 1 - development/debug: probe for IEs on modprobe */ | ||
| 83 | +#define CMD_DISCOVERY 0 | ||
| 84 | Index: linux-2.6.23/drivers/net/wireless/acx/acx_func.h | ||
| 85 | =================================================================== | ||
| 86 | --- /dev/null 1970-01-01 00:00:00.000000000 +0000 | ||
| 87 | +++ linux-2.6.23/drivers/net/wireless/acx/acx_func.h 2008-01-20 21:13:40.000000000 +0000 | ||
| 88 | @@ -0,0 +1,710 @@ | ||
| 89 | +/*********************************************************************** | ||
| 90 | +** Copyright (C) 2003 ACX100 Open Source Project | ||
| 91 | +** | ||
| 92 | +** The contents of this file are subject to the Mozilla Public | ||
| 93 | +** License Version 1.1 (the "License"); you may not use this file | ||
| 94 | +** except in compliance with the License. You may obtain a copy of | ||
| 95 | +** the License at http://www.mozilla.org/MPL/ | ||
| 96 | +** | ||
| 97 | +** Software distributed under the License is distributed on an "AS | ||
| 98 | +** IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or | ||
| 99 | +** implied. See the License for the specific language governing | ||
| 100 | +** rights and limitations under the License. | ||
| 101 | +** | ||
| 102 | +** Alternatively, the contents of this file may be used under the | ||
| 103 | +** terms of the GNU Public License version 2 (the "GPL"), in which | ||
| 104 | +** case the provisions of the GPL are applicable instead of the | ||
| 105 | +** above. If you wish to allow the use of your version of this file | ||
| 106 | +** only under the terms of the GPL and not to allow others to use | ||
| 107 | +** your version of this file under the MPL, indicate your decision | ||
| 108 | +** by deleting the provisions above and replace them with the notice | ||
| 109 | +** and other provisions required by the GPL. If you do not delete | ||
| 110 | +** the provisions above, a recipient may use your version of this | ||
| 111 | +** file under either the MPL or the GPL. | ||
| 112 | +** --------------------------------------------------------------------- | ||
| 113 | +** Inquiries regarding the ACX100 Open Source Project can be | ||
| 114 | +** made directly to: | ||
| 115 | +** | ||
| 116 | +** acx100-users@lists.sf.net | ||
| 117 | +** http://acx100.sf.net | ||
| 118 | +** --------------------------------------------------------------------- | ||
| 119 | +*/ | ||
| 120 | + | ||
| 121 | + | ||
| 122 | +/*********************************************************************** | ||
| 123 | +** LOGGING | ||
| 124 | +** | ||
| 125 | +** - Avoid SHOUTING needlessly. Avoid excessive verbosity. | ||
| 126 | +** Gradually remove messages which are old debugging aids. | ||
| 127 | +** | ||
| 128 | +** - Use printk() for messages which are to be always logged. | ||
| 129 | +** Supply either 'acx:' or '<devname>:' prefix so that user | ||
| 130 | +** can figure out who's speaking among other kernel chatter. | ||
| 131 | +** acx: is for general issues (e.g. "acx: no firmware image!") | ||
| 132 | +** while <devname>: is related to a particular device | ||
| 133 | +** (think about multi-card setup). Double check that message | ||
| 134 | +** is not confusing to the average user. | ||
| 135 | +** | ||
| 136 | +** - use printk KERN_xxx level only if message is not a WARNING | ||
| 137 | +** but is INFO, ERR etc. | ||
| 138 | +** | ||
| 139 | +** - Use printk_ratelimited() for messages which may flood | ||
| 140 | +** (e.g. "rx DUP pkt!"). | ||
| 141 | +** | ||
| 142 | +** - Use log() for messages which may be omitted (and they | ||
| 143 | +** _will_ be omitted in non-debug builds). Note that | ||
| 144 | +** message levels may be disabled at compile-time selectively, | ||
| 145 | +** thus select them wisely. Example: L_DEBUG is the lowest | ||
| 146 | +** (most likely to be compiled out) -> use for less important stuff. | ||
| 147 | +** | ||
| 148 | +** - Do not print important stuff with log(), or else people | ||
| 149 | +** will never build non-debug driver. | ||
| 150 | +** | ||
| 151 | +** Style: | ||
| 152 | +** hex: capital letters, zero filled (e.g. 0x02AC) | ||
| 153 | +** str: dont start from capitals, no trailing periods ("tx: queue is stopped") | ||
| 154 | +*/ | ||
| 155 | +#if ACX_DEBUG > 1 | ||
| 156 | + | ||
| 157 | +void log_fn_enter(const char *funcname); | ||
| 158 | +void log_fn_exit(const char *funcname); | ||
| 159 | +void log_fn_exit_v(const char *funcname, int v); | ||
| 160 | + | ||
| 161 | +#define FN_ENTER \ | ||
| 162 | + do { \ | ||
| 163 | + if (unlikely(acx_debug & L_FUNC)) { \ | ||
| 164 | + log_fn_enter(__func__); \ | ||
| 165 | + } \ | ||
| 166 | + } while (0) | ||
| 167 | + | ||
| 168 | +#define FN_EXIT1(v) \ | ||
| 169 | + do { \ | ||
| 170 | + if (unlikely(acx_debug & L_FUNC)) { \ | ||
| 171 | + log_fn_exit_v(__func__, v); \ | ||
| 172 | + } \ | ||
| 173 | + } while (0) | ||
| 174 | +#define FN_EXIT0 \ | ||
| 175 | + do { \ | ||
| 176 | + if (unlikely(acx_debug & L_FUNC)) { \ | ||
| 177 | + log_fn_exit(__func__); \ | ||
| 178 | + } \ | ||
| 179 | + } while (0) | ||
| 180 | + | ||
| 181 | +#else | ||
| 182 | + | ||
| 183 | +#define FN_ENTER | ||
| 184 | +#define FN_EXIT1(v) | ||
| 185 | +#define FN_EXIT0 | ||
| 186 | + | ||
| 187 | +#endif /* ACX_DEBUG > 1 */ | ||
| 188 | + | ||
| 189 | + | ||
| 190 | +#if ACX_DEBUG | ||
| 191 | + | ||
| 192 | +#define log(chan, args...) \ | ||
| 193 | + do { \ | ||
| 194 | + if (acx_debug & (chan)) \ | ||
| 195 | + printk(KERN_DEBUG args); \ | ||
| 196 | + } while (0) | ||
| 197 | +#define printk_ratelimited(args...) printk(args) | ||
| 198 | + | ||
| 199 | +#else /* Non-debug build: */ | ||
| 200 | + | ||
| 201 | +#define log(chan, args...) | ||
| 202 | +/* Standard way of log flood prevention */ | ||
| 203 | +#define printk_ratelimited(args...) \ | ||
| 204 | +do { \ | ||
| 205 | + if (printk_ratelimit()) \ | ||
| 206 | + printk(args); \ | ||
| 207 | +} while (0) | ||
| 208 | + | ||
| 209 | +#endif /* ACX_DEBUG */ | ||
| 210 | + | ||
| 211 | +void acx_print_mac(const char *head, const u8 *mac, const char *tail); | ||
| 212 | + | ||
| 213 | +/* Optimized out to nothing in non-debug build */ | ||
| 214 | +static inline void | ||
| 215 | +acxlog_mac(int level, const char *head, const u8 *mac, const char *tail) | ||
| 216 | +{ | ||
| 217 | + if (acx_debug & level) { | ||
| 218 | + acx_print_mac(head, mac, tail); | ||
| 219 | + } | ||
| 220 | +} | ||
| 221 | + | ||
| 222 | + | ||
| 223 | +/*********************************************************************** | ||
| 224 | +** MAC address helpers | ||
| 225 | +*/ | ||
| 226 | +static inline void | ||
| 227 | +MAC_COPY(u8 *mac, const u8 *src) | ||
| 228 | +{ | ||
| 229 | + *(u32*)mac = *(u32*)src; | ||
| 230 | + ((u16*)mac)[2] = ((u16*)src)[2]; | ||
| 231 | + /* kernel's memcpy will do the same: memcpy(dst, src, ETH_ALEN); */ | ||
| 232 | +} | ||
| 233 | + | ||
| 234 | +static inline void | ||
| 235 | +MAC_FILL(u8 *mac, u8 val) | ||
| 236 | +{ | ||
| 237 | + memset(mac, val, ETH_ALEN); | ||
| 238 | +} | ||
| 239 | + | ||
| 240 | +static inline void | ||
| 241 | +MAC_BCAST(u8 *mac) | ||
| 242 | +{ | ||
| 243 | + ((u16*)mac)[2] = *(u32*)mac = -1; | ||
| 244 | +} | ||
| 245 | + | ||
| 246 | +static inline void | ||
| 247 | +MAC_ZERO(u8 *mac) | ||
| 248 | +{ | ||
| 249 | + ((u16*)mac)[2] = *(u32*)mac = 0; | ||
| 250 | +} | ||
| 251 | + | ||
| 252 | +static inline int | ||
| 253 | +mac_is_equal(const u8 *a, const u8 *b) | ||
| 254 | +{ | ||
| 255 | + /* can't beat this */ | ||
| 256 | + return memcmp(a, b, ETH_ALEN) == 0; | ||
| 257 | +} | ||
| 258 | + | ||
| 259 | +static inline int | ||
| 260 | +mac_is_bcast(const u8 *mac) | ||
| 261 | +{ | ||
| 262 | + /* AND together 4 first bytes with sign-extended 2 last bytes | ||
| 263 | + ** Only bcast address gives 0xffffffff. +1 gives 0 */ | ||
| 264 | + return ( *(s32*)mac & ((s16*)mac)[2] ) + 1 == 0; | ||
| 265 | +} | ||
| 266 | + | ||
| 267 | +static inline int | ||
| 268 | +mac_is_zero(const u8 *mac) | ||
| 269 | +{ | ||
| 270 | + return ( *(u32*)mac | ((u16*)mac)[2] ) == 0; | ||
| 271 | +} | ||
| 272 | + | ||
| 273 | +static inline int | ||
| 274 | +mac_is_directed(const u8 *mac) | ||
| 275 | +{ | ||
| 276 | + return (mac[0] & 1)==0; | ||
| 277 | +} | ||
| 278 | + | ||
| 279 | +static inline int | ||
| 280 | +mac_is_mcast(const u8 *mac) | ||
| 281 | +{ | ||
| 282 | + return (mac[0] & 1) && !mac_is_bcast(mac); | ||
| 283 | +} | ||
| 284 | + | ||
| 285 | +#define MACSTR "%02X:%02X:%02X:%02X:%02X:%02X" | ||
| 286 | +#define MAC(bytevector) \ | ||
| 287 | + ((unsigned char *)bytevector)[0], \ | ||
| 288 | + ((unsigned char *)bytevector)[1], \ | ||
| 289 | + ((unsigned char *)bytevector)[2], \ | ||
| 290 | + ((unsigned char *)bytevector)[3], \ | ||
| 291 | + ((unsigned char *)bytevector)[4], \ | ||
| 292 | + ((unsigned char *)bytevector)[5] | ||
| 293 | + | ||
| 294 | + | ||
| 295 | +/*********************************************************************** | ||
| 296 | +** Random helpers | ||
| 297 | +*/ | ||
| 298 | +#define TO_STRING(x) #x | ||
| 299 | +#define STRING(x) TO_STRING(x) | ||
| 300 | + | ||
| 301 | +#define CLEAR_BIT(val, mask) ((val) &= ~(mask)) | ||
| 302 | +#define SET_BIT(val, mask) ((val) |= (mask)) | ||
| 303 | + | ||
| 304 | +/* undefined if v==0 */ | ||
| 305 | +static inline unsigned int | ||
| 306 | +lowest_bit(u16 v) | ||
| 307 | +{ | ||
| 308 | + unsigned int n = 0; | ||
| 309 | + while (!(v & 0xf)) { v>>=4; n+=4; } | ||
| 310 | + while (!(v & 1)) { v>>=1; n++; } | ||
| 311 | + return n; | ||
| 312 | +} | ||
| 313 | + | ||
| 314 | +/* undefined if v==0 */ | ||
| 315 | +static inline unsigned int | ||
| 316 | +highest_bit(u16 v) | ||
| 317 | +{ | ||
| 318 | + unsigned int n = 0; | ||
| 319 | + while (v>0xf) { v>>=4; n+=4; } | ||
| 320 | + while (v>1) { v>>=1; n++; } | ||
| 321 | + return n; | ||
| 322 | +} | ||
| 323 | + | ||
| 324 | +/* undefined if v==0 */ | ||
| 325 | +static inline int | ||
| 326 | +has_only_one_bit(u16 v) | ||
| 327 | +{ | ||
| 328 | + return ((v-1) ^ v) >= v; | ||
| 329 | +} | ||
| 330 | + | ||
| 331 | + | ||
| 332 | +static inline int | ||
| 333 | +is_hidden_essid(char *essid) | ||
| 334 | +{ | ||
| 335 | + return (('\0' == essid[0]) || | ||
| 336 | + ((' ' == essid[0]) && ('\0' == essid[1]))); | ||
| 337 | +} | ||
| 338 | + | ||
| 339 | +/*********************************************************************** | ||
| 340 | +** LOCKING | ||
| 341 | +** We have adev->sem and adev->lock. | ||
| 342 | +** | ||
| 343 | +** We employ following naming convention in order to get locking right: | ||
| 344 | +** | ||
| 345 | +** acx_e_xxxx - external entry points called from process context. | ||
| 346 | +** It is okay to sleep. adev->sem is to be taken on entry. | ||
| 347 | +** acx_i_xxxx - external entry points possibly called from atomic context. | ||
| 348 | +** Sleeping is not allowed (and thus down(sem) is not legal!) | ||
| 349 | +** acx_s_xxxx - potentially sleeping functions. Do not ever call under lock! | ||
| 350 | +** acx_l_xxxx - functions which expect lock to be already taken. | ||
| 351 | +** rest - non-sleeping functions which do not require locking | ||
| 352 | +** but may be run under lock | ||
| 353 | +** | ||
| 354 | +** A small number of local helpers do not have acx_[eisl]_ prefix. | ||
| 355 | +** They are always close to caller and are to be reviewed locally. | ||
| 356 | +** | ||
| 357 | +** Theory of operation: | ||
| 358 | +** | ||
| 359 | +** All process-context entry points (_e_ functions) take sem | ||
| 360 | +** immediately. IRQ handler and other 'atomic-context' entry points | ||
| 361 | +** (_i_ functions) take lock immediately on entry, but dont take sem | ||
| 362 | +** because that might sleep. | ||
| 363 | +** | ||
| 364 | +** Thus *all* code is either protected by sem or lock, or both. | ||
| 365 | +** | ||
| 366 | +** Code which must not run concurrently with IRQ takes lock. | ||
| 367 | +** Such code is marked with _l_. | ||
| 368 | +** | ||
| 369 | +** This results in the following rules of thumb useful in code review: | ||
| 370 | +** | ||
| 371 | +** + If a function calls _s_ fn, it must be an _s_ itself. | ||
| 372 | +** + You can call _l_ fn only (a) from another _l_ fn | ||
| 373 | +** or (b) from _s_, _e_ or _i_ fn by taking lock, calling _l_, | ||
| 374 | +** and dropping lock. | ||
| 375 | +** + All IRQ code runs under lock. | ||
| 376 | +** + Any _s_ fn is running under sem. | ||
| 377 | +** + Code under sem can race only with IRQ code. | ||
| 378 | +** + Code under sem+lock cannot race with anything. | ||
| 379 | +*/ | ||
| 380 | + | ||
| 381 | +/* These functions *must* be inline or they will break horribly on SPARC, due | ||
| 382 | + * to its weird semantics for save/restore flags */ | ||
| 383 | + | ||
| 384 | +#if defined(PARANOID_LOCKING) /* Lock debugging */ | ||
| 385 | + | ||
| 386 | +void acx_lock_debug(acx_device_t *adev, const char* where); | ||
| 387 | +void acx_unlock_debug(acx_device_t *adev, const char* where); | ||
| 388 | +void acx_down_debug(acx_device_t *adev, const char* where); | ||
| 389 | +void acx_up_debug(acx_device_t *adev, const char* where); | ||
| 390 | +void acx_lock_unhold(void); | ||
| 391 | +void acx_sem_unhold(void); | ||
| 392 | + | ||
| 393 | +static inline void | ||
| 394 | +acx_lock_helper(acx_device_t *adev, unsigned long *fp, const char* where) | ||
| 395 | +{ | ||
| 396 | + acx_lock_debug(adev, where); | ||
| 397 | + spin_lock_irqsave(&adev->lock, *fp); | ||
| 398 | +} | ||
| 399 | +static inline void | ||
| 400 | +acx_unlock_helper(acx_device_t *adev, unsigned long *fp, const char* where) | ||
| 401 | +{ | ||
| 402 | + acx_unlock_debug(adev, where); | ||
| 403 | + spin_unlock_irqrestore(&adev->lock, *fp); | ||
| 404 | +} | ||
| 405 | +static inline void | ||
| 406 | +acx_down_helper(acx_device_t *adev, const char* where) | ||
| 407 | +{ | ||
| 408 | + acx_down_debug(adev, where); | ||
| 409 | +} | ||
| 410 | +static inline void | ||
| 411 | +acx_up_helper(acx_device_t *adev, const char* where) | ||
| 412 | +{ | ||
| 413 | + acx_up_debug(adev, where); | ||
| 414 | +} | ||
| 415 | +#define acx_lock(adev, flags) acx_lock_helper(adev, &(flags), __FILE__ ":" STRING(__LINE__)) | ||
| 416 | +#define acx_unlock(adev, flags) acx_unlock_helper(adev, &(flags), __FILE__ ":" STRING(__LINE__)) | ||
| 417 | +#define acx_sem_lock(adev) acx_down_helper(adev, __FILE__ ":" STRING(__LINE__)) | ||
| 418 | +#define acx_sem_unlock(adev) acx_up_helper(adev, __FILE__ ":" STRING(__LINE__)) | ||
| 419 | + | ||
| 420 | +#elif defined(DO_LOCKING) | ||
| 421 | + | ||
| 422 | +#define acx_lock(adev, flags) spin_lock_irqsave(&adev->lock, flags) | ||
| 423 | +#define acx_unlock(adev, flags) spin_unlock_irqrestore(&adev->lock, flags) | ||
| 424 | +#define acx_sem_lock(adev) down(&adev->sem) | ||
| 425 | +#define acx_sem_unlock(adev) up(&adev->sem) | ||
| 426 | +#define acx_lock_unhold() ((void)0) | ||
| 427 | +#define acx_sem_unhold() ((void)0) | ||
| 428 | + | ||
| 429 | +#else /* no locking! :( */ | ||
| 430 | + | ||
| 431 | +#define acx_lock(adev, flags) ((void)0) | ||
| 432 | +#define acx_unlock(adev, flags) ((void)0) | ||
| 433 | +#define acx_sem_lock(adev) ((void)0) | ||
| 434 | +#define acx_sem_unlock(adev) ((void)0) | ||
| 435 | +#define acx_lock_unhold() ((void)0) | ||
| 436 | +#define acx_sem_unhold() ((void)0) | ||
| 437 | + | ||
| 438 | +#endif | ||
| 439 | + | ||
| 440 | + | ||
| 441 | +/*********************************************************************** | ||
| 442 | +*/ | ||
| 443 | + | ||
| 444 | +/* Can race with rx path (which is not protected by sem): | ||
| 445 | +** rx -> process_[re]assocresp() -> set_status(ASSOCIATED) -> wake_queue() | ||
| 446 | +** Can race with tx_complete IRQ: | ||
| 447 | +** IRQ -> acxpci_l_clean_txdesc -> acx_wake_queue | ||
| 448 | +** Review carefully all callsites */ | ||
| 449 | +static inline void | ||
| 450 | +acx_stop_queue(struct net_device *ndev, const char *msg) | ||
| 451 | +{ | ||
| 452 | + if (netif_queue_stopped(ndev)) | ||
| 453 | + return; | ||
| 454 | + | ||
| 455 | + netif_stop_queue(ndev); | ||
| 456 | + if (msg) | ||
| 457 | + log(L_BUFT, "tx: stop queue %s\n", msg); | ||
| 458 | +} | ||
| 459 | + | ||
| 460 | +static inline int | ||
| 461 | +acx_queue_stopped(struct net_device *ndev) | ||
| 462 | +{ | ||
| 463 | + return netif_queue_stopped(ndev); | ||
| 464 | +} | ||
| 465 | + | ||
| 466 | +/* | ||
| 467 | +static inline void | ||
| 468 | +acx_start_queue(struct net_device *ndev, const char *msg) | ||
| 469 | +{ | ||
| 470 | + netif_start_queue(ndev); | ||
| 471 | + if (msg) | ||
| 472 | + log(L_BUFT, "tx: start queue %s\n", msg); | ||
| 473 | +} | ||
| 474 | +*/ | ||
| 475 | + | ||
| 476 | +static inline void | ||
| 477 | +acx_wake_queue(struct net_device *ndev, const char *msg) | ||
| 478 | +{ | ||
| 479 | + netif_wake_queue(ndev); | ||
| 480 | + if (msg) | ||
| 481 | + log(L_BUFT, "tx: wake queue %s\n", msg); | ||
| 482 | +} | ||
| 483 | + | ||
| 484 | +static inline void | ||
| 485 | +acx_carrier_off(struct net_device *ndev, const char *msg) | ||
| 486 | +{ | ||
| 487 | + netif_carrier_off(ndev); | ||
| 488 | + if (msg) | ||
| 489 | + log(L_BUFT, "tx: carrier off %s\n", msg); | ||
| 490 | +} | ||
| 491 | + | ||
| 492 | +static inline void | ||
| 493 | +acx_carrier_on(struct net_device *ndev, const char *msg) | ||
| 494 | +{ | ||
| 495 | + netif_carrier_on(ndev); | ||
| 496 | + if (msg) | ||
| 497 | + log(L_BUFT, "tx: carrier on %s\n", msg); | ||
| 498 | +} | ||
| 499 | + | ||
| 500 | +/* This function does not need locking UNLESS you call it | ||
| 501 | +** as acx_set_status(ACX_STATUS_4_ASSOCIATED), bacause this can | ||
| 502 | +** wake queue. This can race with stop_queue elsewhere. */ | ||
| 503 | +void acx_set_status(acx_device_t *adev, u16 status); | ||
| 504 | + | ||
| 505 | + | ||
| 506 | +/*********************************************************************** | ||
| 507 | +** Communication with firmware | ||
| 508 | +*/ | ||
| 509 | +#define CMD_TIMEOUT_MS(n) (n) | ||
| 510 | +#define ACX_CMD_TIMEOUT_DEFAULT CMD_TIMEOUT_MS(50) | ||
| 511 | + | ||
| 512 | +#if ACX_DEBUG | ||
| 513 | + | ||
| 514 | +/* We want to log cmd names */ | ||
| 515 | +int acxpci_s_issue_cmd_timeo_debug(acx_device_t *adev, unsigned cmd, void *param, unsigned len, unsigned timeout, const char* cmdstr); | ||
| 516 | +int acxmem_s_issue_cmd_timeo_debug(acx_device_t *adev, unsigned cmd, void *param, unsigned len, unsigned timeout, const char* cmdstr); | ||
| 517 | +int acxusb_s_issue_cmd_timeo_debug(acx_device_t *adev, unsigned cmd, void *param, unsigned len, unsigned timeout, const char* cmdstr); | ||
| 518 | +static inline int | ||
| 519 | +acx_s_issue_cmd_timeo_debug(acx_device_t *adev, unsigned cmd, void *param, unsigned len, unsigned timeout, const char* cmdstr) | ||
| 520 | +{ | ||
| 521 | + if (IS_MEM(adev)) | ||
| 522 | + return acxmem_s_issue_cmd_timeo_debug(adev, cmd, param, len, timeout, cmdstr); | ||
| 523 | + if (IS_PCI(adev)) | ||
| 524 | + return acxpci_s_issue_cmd_timeo_debug(adev, cmd, param, len, timeout, cmdstr); | ||
| 525 | + return acxusb_s_issue_cmd_timeo_debug(adev, cmd, param, len, timeout, cmdstr); | ||
| 526 | +} | ||
| 527 | +#define acx_s_issue_cmd(adev,cmd,param,len) \ | ||
| 528 | + acx_s_issue_cmd_timeo_debug(adev,cmd,param,len,ACX_CMD_TIMEOUT_DEFAULT,#cmd) | ||
| 529 | +#define acx_s_issue_cmd_timeo(adev,cmd,param,len,timeo) \ | ||
| 530 | + acx_s_issue_cmd_timeo_debug(adev,cmd,param,len,timeo,#cmd) | ||
| 531 | +int acx_s_configure_debug(acx_device_t *adev, void *pdr, int type, const char* str); | ||
| 532 | +#define acx_s_configure(adev,pdr,type) \ | ||
| 533 | + acx_s_configure_debug(adev,pdr,type,#type) | ||
| 534 | +int acx_s_interrogate_debug(acx_device_t *adev, void *pdr, int type, const char* str); | ||
| 535 | +#define acx_s_interrogate(adev,pdr,type) \ | ||
| 536 | + acx_s_interrogate_debug(adev,pdr,type,#type) | ||
| 537 | + | ||
| 538 | +#else | ||
| 539 | + | ||
| 540 | +int acxpci_s_issue_cmd_timeo(acx_device_t *adev, unsigned cmd, void *param, unsigned len, unsigned timeout); | ||
| 541 | +int acxmem_s_issue_cmd_timeo(acx_device_t *adev, unsigned cmd, void *param, unsigned len, unsigned timeout); | ||
| 542 | +int acxusb_s_issue_cmd_timeo(acx_device_t *adev, unsigned cmd, void *param, unsigned len, unsigned timeout); | ||
| 543 | +static inline int | ||
| 544 | +acx_s_issue_cmd_timeo(acx_device_t *adev, unsigned cmd, void *param, unsigned len, unsigned timeout) | ||
| 545 | +{ | ||
| 546 | + if (IS_MEM(adev)) | ||
| 547 | + return acxmem_s_issue_cmd_timeo(adev, cmd, param, len, timeout); | ||
| 548 | + if (IS_PCI(adev)) | ||
| 549 | + return acxpci_s_issue_cmd_timeo(adev, cmd, param, len, timeout); | ||
| 550 | + return acxusb_s_issue_cmd_timeo(adev, cmd, param, len, timeout); | ||
| 551 | +} | ||
| 552 | +static inline int | ||
| 553 | +acx_s_issue_cmd(acx_device_t *adev, unsigned cmd, void *param, unsigned len) | ||
| 554 | +{ | ||
| 555 | + if (IS_MEM(adev)) | ||
| 556 | + return acxmem_s_issue_cmd_timeo(adev, cmd, param, len, ACX_CMD_TIMEOUT_DEFAULT); | ||
| 557 | + if (IS_PCI(adev)) | ||
| 558 | + return acxpci_s_issue_cmd_timeo(adev, cmd, param, len, ACX_CMD_TIMEOUT_DEFAULT); | ||
| 559 | + return acxusb_s_issue_cmd_timeo(adev, cmd, param, len, ACX_CMD_TIMEOUT_DEFAULT); | ||
| 560 | +} | ||
| 561 | +int acx_s_configure(acx_device_t *adev, void *pdr, int type); | ||
| 562 | +int acx_s_interrogate(acx_device_t *adev, void *pdr, int type); | ||
| 563 | + | ||
| 564 | +#endif | ||
| 565 | + | ||
| 566 | +void acx_s_cmd_start_scan(acx_device_t *adev); | ||
| 567 | + | ||
| 568 | + | ||
| 569 | +/*********************************************************************** | ||
| 570 | +** Ioctls | ||
| 571 | +*/ | ||
| 572 | +int | ||
| 573 | +acx111pci_ioctl_info( | ||
| 574 | + struct net_device *ndev, | ||
| 575 | + struct iw_request_info *info, | ||
| 576 | + struct iw_param *vwrq, | ||
| 577 | + char *extra); | ||
| 578 | +int | ||
| 579 | +acx100pci_ioctl_set_phy_amp_bias( | ||
| 580 | + struct net_device *ndev, | ||
| 581 | + struct iw_request_info *info, | ||
| 582 | + struct iw_param *vwrq, | ||
| 583 | + char *extra); | ||
| 584 | +int | ||
| 585 | +acx100mem_ioctl_set_phy_amp_bias( | ||
| 586 | + struct net_device *ndev, | ||
| 587 | + struct iw_request_info *info, | ||
| 588 | + struct iw_param *vwrq, | ||
| 589 | + char *extra); | ||
| 590 | + | ||
| 591 | + | ||
| 592 | +/*********************************************************************** | ||
| 593 | +** /proc | ||
| 594 | +*/ | ||
| 595 | +#ifdef CONFIG_PROC_FS | ||
| 596 | +int acx_proc_register_entries(const struct net_device *ndev); | ||
| 597 | +int acx_proc_unregister_entries(const struct net_device *ndev); | ||
| 598 | +#else | ||
| 599 | +static inline int | ||
| 600 | +acx_proc_register_entries(const struct net_device *ndev) { return OK; } | ||
| 601 | +static inline int | ||
| 602 | +acx_proc_unregister_entries(const struct net_device *ndev) { return OK; } | ||
| 603 | +#endif | ||
| 604 | + | ||
| 605 | + | ||
| 606 | +/*********************************************************************** | ||
| 607 | +*/ | ||
| 608 | +firmware_image_t *acx_s_read_fw(struct device *dev, const char *file, u32 *size); | ||
| 609 | +int acxpci_s_upload_radio(acx_device_t *adev); | ||
| 610 | +int acxmem_s_upload_radio(acx_device_t *adev); | ||
| 611 | + | ||
| 612 | + | ||
| 613 | +/*********************************************************************** | ||
| 614 | +** Unsorted yet :) | ||
| 615 | +*/ | ||
| 616 | +int acxpci_s_read_phy_reg(acx_device_t *adev, u32 reg, u8 *charbuf); | ||
| 617 | +int acxmem_s_read_phy_reg(acx_device_t *adev, u32 reg, u8 *charbuf); | ||
| 618 | +int acxusb_s_read_phy_reg(acx_device_t *adev, u32 reg, u8 *charbuf); | ||
| 619 | +static inline int | ||
| 620 | +acx_s_read_phy_reg(acx_device_t *adev, u32 reg, u8 *charbuf) | ||
| 621 | +{ | ||
| 622 | + if (IS_MEM(adev)) | ||
| 623 | + return acxmem_s_read_phy_reg(adev, reg, charbuf); | ||
| 624 | + if (IS_PCI(adev)) | ||
| 625 | + return acxpci_s_read_phy_reg(adev, reg, charbuf); | ||
| 626 | + return acxusb_s_read_phy_reg(adev, reg, charbuf); | ||
| 627 | +} | ||
| 628 | + | ||
| 629 | +int acxpci_s_write_phy_reg(acx_device_t *adev, u32 reg, u8 value); | ||
| 630 | +int acxmem_s_write_phy_reg(acx_device_t *adev, u32 reg, u8 value); | ||
| 631 | +int acxusb_s_write_phy_reg(acx_device_t *adev, u32 reg, u8 value); | ||
| 632 | +static inline int | ||
| 633 | +acx_s_write_phy_reg(acx_device_t *adev, u32 reg, u8 value) | ||
| 634 | +{ | ||
| 635 | + if (IS_MEM(adev)) | ||
| 636 | + return acxmem_s_write_phy_reg(adev, reg, value); | ||
| 637 | + if (IS_PCI(adev)) | ||
| 638 | + return acxpci_s_write_phy_reg(adev, reg, value); | ||
| 639 | + return acxusb_s_write_phy_reg(adev, reg, value); | ||
| 640 | +} | ||
| 641 | + | ||
| 642 | +tx_t* acxpci_l_alloc_tx(acx_device_t *adev); | ||
| 643 | +tx_t* acxmem_l_alloc_tx(acx_device_t *adev); | ||
| 644 | +tx_t* acxusb_l_alloc_tx(acx_device_t *adev); | ||
| 645 | +static inline tx_t* | ||
| 646 | +acx_l_alloc_tx(acx_device_t *adev) | ||
| 647 | +{ | ||
| 648 | + if (IS_MEM(adev)) | ||
| 649 | + return acxmem_l_alloc_tx(adev); | ||
| 650 | + if (IS_PCI(adev)) | ||
| 651 | + return acxpci_l_alloc_tx(adev); | ||
| 652 | + return acxusb_l_alloc_tx(adev); | ||
| 653 | +} | ||
| 654 | + | ||
| 655 | +void acxusb_l_dealloc_tx(tx_t *tx_opaque); | ||
| 656 | +void acxmem_l_dealloc_tx(acx_device_t *adev, tx_t *tx_opaque); | ||
| 657 | +static inline void | ||
| 658 | +acx_l_dealloc_tx(acx_device_t *adev, tx_t *tx_opaque) | ||
| 659 | +{ | ||
| 660 | +#ifdef ACX_MEM | ||
| 661 | + acxmem_l_dealloc_tx (adev, tx_opaque); | ||
| 662 | +#else | ||
| 663 | + if (IS_USB(adev)) | ||
| 664 | + acxusb_l_dealloc_tx(tx_opaque); | ||
| 665 | +#endif | ||
| 666 | +} | ||
| 667 | + | ||
| 668 | +void* acxpci_l_get_txbuf(acx_device_t *adev, tx_t *tx_opaque); | ||
| 669 | +void* acxmem_l_get_txbuf(acx_device_t *adev, tx_t *tx_opaque); | ||
| 670 | +void* acxusb_l_get_txbuf(acx_device_t *adev, tx_t *tx_opaque); | ||
| 671 | +static inline void* | ||
| 672 | +acx_l_get_txbuf(acx_device_t *adev, tx_t *tx_opaque) | ||
| 673 | +{ | ||
| 674 | +#if defined (ACX_MEM) | ||
| 675 | + return acxmem_l_get_txbuf(adev, tx_opaque); | ||
| 676 | +#else | ||
| 677 | + if (IS_PCI(adev)) | ||
| 678 | + return acxpci_l_get_txbuf(adev, tx_opaque); | ||
| 679 | + return acxusb_l_get_txbuf(adev, tx_opaque); | ||
| 680 | +#endif | ||
| 681 | +} | ||
| 682 | + | ||
| 683 | +void acxpci_l_tx_data(acx_device_t *adev, tx_t *tx_opaque, int len); | ||
| 684 | +void acxmem_l_tx_data(acx_device_t *adev, tx_t *tx_opaque, int len); | ||
| 685 | +void acxusb_l_tx_data(acx_device_t *adev, tx_t *tx_opaque, int len); | ||
| 686 | +static inline void | ||
| 687 | +acx_l_tx_data(acx_device_t *adev, tx_t *tx_opaque, int len) | ||
| 688 | +{ | ||
| 689 | +#if defined (ACX_MEM) | ||
| 690 | + acxmem_l_tx_data(adev, tx_opaque, len); | ||
| 691 | +#else | ||
| 692 | + if (IS_PCI(adev)) | ||
| 693 | + acxpci_l_tx_data(adev, tx_opaque, len); | ||
| 694 | + else | ||
| 695 | + acxusb_l_tx_data(adev, tx_opaque, len); | ||
| 696 | +#endif | ||
| 697 | +} | ||
| 698 | + | ||
| 699 | +static inline wlan_hdr_t* | ||
| 700 | +acx_get_wlan_hdr(acx_device_t *adev, const rxbuffer_t *rxbuf) | ||
| 701 | +{ | ||
| 702 | + return (wlan_hdr_t*)((u8*)&rxbuf->hdr_a3 + adev->phy_header_len); | ||
| 703 | +} | ||
| 704 | + | ||
| 705 | +void acxpci_l_power_led(acx_device_t *adev, int enable); | ||
| 706 | +int acxpci_read_eeprom_byte(acx_device_t *adev, u32 addr, u8 *charbuf); | ||
| 707 | +unsigned int acxpci_l_clean_txdesc(acx_device_t *adev); | ||
| 708 | +void acxpci_l_clean_txdesc_emergency(acx_device_t *adev); | ||
| 709 | +int acxpci_s_create_hostdesc_queues(acx_device_t *adev); | ||
| 710 | +void acxpci_create_desc_queues(acx_device_t *adev, u32 tx_queue_start, u32 rx_queue_start); | ||
| 711 | +void acxpci_free_desc_queues(acx_device_t *adev); | ||
| 712 | +char* acxpci_s_proc_diag_output(char *p, acx_device_t *adev); | ||
| 713 | +int acxpci_proc_eeprom_output(char *p, acx_device_t *adev); | ||
| 714 | +void acxpci_set_interrupt_mask(acx_device_t *adev); | ||
| 715 | +int acx100pci_s_set_tx_level(acx_device_t *adev, u8 level_dbm); | ||
| 716 | + | ||
| 717 | +void acxmem_l_power_led(acx_device_t *adev, int enable); | ||
| 718 | +int acxmem_read_eeprom_byte(acx_device_t *adev, u32 addr, u8 *charbuf); | ||
| 719 | +unsigned int acxmem_l_clean_txdesc(acx_device_t *adev); | ||
| 720 | +void acxmem_l_clean_txdesc_emergency(acx_device_t *adev); | ||
| 721 | +int acxmem_s_create_hostdesc_queues(acx_device_t *adev); | ||
| 722 | +void acxmem_create_desc_queues(acx_device_t *adev, u32 tx_queue_start, u32 rx_queue_start); | ||
| 723 | +void acxmem_free_desc_queues(acx_device_t *adev); | ||
| 724 | +char* acxmem_s_proc_diag_output(char *p, acx_device_t *adev); | ||
| 725 | +int acxmem_proc_eeprom_output(char *p, acx_device_t *adev); | ||
| 726 | +void acxmem_set_interrupt_mask(acx_device_t *adev); | ||
| 727 | +int acx100mem_s_set_tx_level(acx_device_t *adev, u8 level_dbm); | ||
| 728 | + | ||
| 729 | +void acx_s_msleep(int ms); | ||
| 730 | +int acx_s_init_mac(acx_device_t *adev); | ||
| 731 | +void acx_set_reg_domain(acx_device_t *adev, unsigned char reg_dom_id); | ||
| 732 | +void acx_set_timer(acx_device_t *adev, int timeout_us); | ||
| 733 | +void acx_update_capabilities(acx_device_t *adev); | ||
| 734 | +void acx_s_start(acx_device_t *adev); | ||
| 735 | + | ||
| 736 | +void acx_s_update_card_settings(acx_device_t *adev); | ||
| 737 | +void acx_s_parse_configoption(acx_device_t *adev, const acx111_ie_configoption_t *pcfg); | ||
| 738 | +void acx_l_update_ratevector(acx_device_t *adev); | ||
| 739 | + | ||
| 740 | +void acx_init_task_scheduler(acx_device_t *adev); | ||
| 741 | +void acx_schedule_task(acx_device_t *adev, unsigned int set_flag); | ||
| 742 | + | ||
| 743 | +int acx_e_ioctl_old(struct net_device *ndev, struct ifreq *ifr, int cmd); | ||
| 744 | + | ||
| 745 | +client_t *acx_l_sta_list_get(acx_device_t *adev, const u8 *address); | ||
| 746 | +void acx_l_sta_list_del(acx_device_t *adev, client_t *clt); | ||
| 747 | + | ||
| 748 | +int acx_l_transmit_disassoc(acx_device_t *adev, client_t *clt); | ||
| 749 | +void acx_i_timer(unsigned long a); | ||
| 750 | +int acx_s_complete_scan(acx_device_t *adev); | ||
| 751 | + | ||
| 752 | +struct sk_buff *acx_rxbuf_to_ether(acx_device_t *adev, rxbuffer_t *rxbuf); | ||
| 753 | +int acx_ether_to_txbuf(acx_device_t *adev, void *txbuf, const struct sk_buff *skb); | ||
| 754 | + | ||
| 755 | +u8 acx_signal_determine_quality(u8 signal, u8 noise); | ||
| 756 | + | ||
| 757 | +void acx_l_process_rxbuf(acx_device_t *adev, rxbuffer_t *rxbuf); | ||
| 758 | +void acx_l_handle_txrate_auto(acx_device_t *adev, struct client *txc, | ||
| 759 | + u16 intended_rate, u8 rate100, u16 rate111, u8 error, | ||
| 760 | + int pkts_to_ignore); | ||
| 761 | + | ||
| 762 | +void acx_dump_bytes(const void *, int); | ||
| 763 | +void acx_log_bad_eid(wlan_hdr_t* hdr, int len, wlan_ie_t* ie_ptr); | ||
| 764 | + | ||
| 765 | +u8 acx_rate111to100(u16); | ||
| 766 | + | ||
| 767 | +void acx_s_set_defaults(acx_device_t *adev); | ||
| 768 | + | ||
| 769 | +#if !ACX_DEBUG | ||
| 770 | +static inline const char* acx_get_packet_type_string(u16 fc) { return ""; } | ||
| 771 | +#else | ||
| 772 | +const char* acx_get_packet_type_string(u16 fc); | ||
| 773 | +#endif | ||
| 774 | +const char* acx_cmd_status_str(unsigned int state); | ||
| 775 | + | ||
| 776 | +int acx_i_start_xmit(struct sk_buff *skb, struct net_device *ndev); | ||
| 777 | + | ||
| 778 | +void great_inquisitor(acx_device_t *adev); | ||
| 779 | + | ||
| 780 | +void acx_s_get_firmware_version(acx_device_t *adev); | ||
| 781 | +void acx_display_hardware_details(acx_device_t *adev); | ||
| 782 | + | ||
| 783 | +int acx_e_change_mtu(struct net_device *ndev, int mtu); | ||
| 784 | +struct net_device_stats* acx_e_get_stats(struct net_device *ndev); | ||
| 785 | +struct iw_statistics* acx_e_get_wireless_stats(struct net_device *ndev); | ||
| 786 | + | ||
| 787 | +#ifdef ACX_MEM | ||
| 788 | +int __init acxmem_e_init_module(void); | ||
| 789 | +void __exit acxmem_e_cleanup_module(void); | ||
| 790 | +void acxmem_e_release(struct device *dev); | ||
| 791 | +#else | ||
| 792 | +int __init acxpci_e_init_module(void); | ||
| 793 | +int __init acxusb_e_init_module(void); | ||
| 794 | +void __exit acxpci_e_cleanup_module(void); | ||
| 795 | +void __exit acxusb_e_cleanup_module(void); | ||
| 796 | +#endif | ||
| 797 | +int __init acx_cs_init(void); | ||
| 798 | +void __exit acx_cs_cleanup(void); | ||
| 799 | Index: linux-2.6.23/drivers/net/wireless/acx/acx.h | ||
| 800 | =================================================================== | ||
| 801 | --- /dev/null 1970-01-01 00:00:00.000000000 +0000 | ||
| 802 | +++ linux-2.6.23/drivers/net/wireless/acx/acx.h 2008-01-20 21:13:40.000000000 +0000 | ||
| 803 | @@ -0,0 +1,14 @@ | ||
| 804 | +#if defined(CONFIG_ACX_MEM) && !defined(ACX_MEM) | ||
| 805 | +#define ACX_MEM | ||
| 806 | +#endif | ||
| 807 | + | ||
| 808 | +#if defined(CONFIG_ACX_CS) && !defined(ACX_MEM) | ||
| 809 | +#define ACX_MEM | ||
| 810 | +#endif | ||
| 811 | + | ||
| 812 | +#include "acx_config.h" | ||
| 813 | +#include "wlan_compat.h" | ||
| 814 | +#include "wlan_hdr.h" | ||
| 815 | +#include "wlan_mgmt.h" | ||
| 816 | +#include "acx_struct.h" | ||
| 817 | +#include "acx_func.h" | ||
| 818 | Index: linux-2.6.23/drivers/net/wireless/acx/acx_hw.h | ||
| 819 | =================================================================== | ||
| 820 | --- /dev/null 1970-01-01 00:00:00.000000000 +0000 | ||
| 821 | +++ linux-2.6.23/drivers/net/wireless/acx/acx_hw.h 2008-01-20 21:13:40.000000000 +0000 | ||
| 822 | @@ -0,0 +1,18 @@ | ||
| 823 | +/* | ||
| 824 | + * Interface for ACX slave memory driver | ||
| 825 | + * | ||
| 826 | + * Copyright (c) 2006 SDG Systems, LLC | ||
| 827 | + * | ||
| 828 | + * GPL | ||
| 829 | + * | ||
| 830 | + */ | ||
| 831 | + | ||
| 832 | +#ifndef _ACX_HW_H | ||
| 833 | +#define _ACX_HW_H | ||
| 834 | + | ||
| 835 | +struct acx_hardware_data { | ||
| 836 | + int (*start_hw)( void ); | ||
| 837 | + int (*stop_hw)( void ); | ||
| 838 | +}; | ||
| 839 | + | ||
| 840 | +#endif /* _ACX_HW_H */ | ||
| 841 | Index: linux-2.6.23/drivers/net/wireless/acx/acx_struct.h | ||
| 842 | =================================================================== | ||
| 843 | --- /dev/null 1970-01-01 00:00:00.000000000 +0000 | ||
| 844 | +++ linux-2.6.23/drivers/net/wireless/acx/acx_struct.h 2008-01-20 21:13:40.000000000 +0000 | ||
| 845 | @@ -0,0 +1,2114 @@ | ||
| 846 | +/*********************************************************************** | ||
| 847 | +** Copyright (C) 2003 ACX100 Open Source Project | ||
| 848 | +** | ||
| 849 | +** The contents of this file are subject to the Mozilla Public | ||
| 850 | +** License Version 1.1 (the "License"); you may not use this file | ||
| 851 | +** except in compliance with the License. You may obtain a copy of | ||
| 852 | +** the License at http://www.mozilla.org/MPL/ | ||
| 853 | +** | ||
| 854 | +** Software distributed under the License is distributed on an "AS | ||
| 855 | +** IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or | ||
| 856 | +** implied. See the License for the specific language governing | ||
| 857 | +** rights and limitations under the License. | ||
| 858 | +** | ||
| 859 | +** Alternatively, the contents of this file may be used under the | ||
| 860 | +** terms of the GNU Public License version 2 (the "GPL"), in which | ||
| 861 | +** case the provisions of the GPL are applicable instead of the | ||
| 862 | +** above. If you wish to allow the use of your version of this file | ||
| 863 | +** only under the terms of the GPL and not to allow others to use | ||
| 864 | +** your version of this file under the MPL, indicate your decision | ||
| 865 | +** by deleting the provisions above and replace them with the notice | ||
| 866 | +** and other provisions required by the GPL. If you do not delete | ||
| 867 | +** the provisions above, a recipient may use your version of this | ||
| 868 | +** file under either the MPL or the GPL. | ||
| 869 | +** --------------------------------------------------------------------- | ||
| 870 | +** Inquiries regarding the ACX100 Open Source Project can be | ||
| 871 | +** made directly to: | ||
| 872 | +** | ||
| 873 | +** acx100-users@lists.sf.net | ||
| 874 | +** http://acx100.sf.net | ||
| 875 | +** --------------------------------------------------------------------- | ||
| 876 | +*/ | ||
| 877 | + | ||
| 878 | +/*********************************************************************** | ||
| 879 | +** Forward declarations of types | ||
| 880 | +*/ | ||
| 881 | +typedef struct tx tx_t; | ||
| 882 | +typedef struct acx_device acx_device_t; | ||
| 883 | +typedef struct client client_t; | ||
| 884 | +typedef struct rxdesc rxdesc_t; | ||
| 885 | +typedef struct txdesc txdesc_t; | ||
| 886 | +typedef struct rxhostdesc rxhostdesc_t; | ||
| 887 | +typedef struct txhostdesc txhostdesc_t; | ||
| 888 | + | ||
| 889 | + | ||
| 890 | +/*********************************************************************** | ||
| 891 | +** Debug / log functionality | ||
| 892 | +*/ | ||
| 893 | +enum { | ||
| 894 | + L_LOCK = (ACX_DEBUG>1)*0x0001, /* locking debug log */ | ||
| 895 | + L_INIT = (ACX_DEBUG>0)*0x0002, /* special card initialization logging */ | ||
| 896 | + L_IRQ = (ACX_DEBUG>0)*0x0004, /* interrupt stuff */ | ||
| 897 | + L_ASSOC = (ACX_DEBUG>0)*0x0008, /* assocation (network join) and station log */ | ||
| 898 | + L_FUNC = (ACX_DEBUG>1)*0x0020, /* logging of function enter / leave */ | ||
| 899 | + L_XFER = (ACX_DEBUG>1)*0x0080, /* logging of transfers and mgmt */ | ||
| 900 | + L_DATA = (ACX_DEBUG>1)*0x0100, /* logging of transfer data */ | ||
| 901 | + L_DEBUG = (ACX_DEBUG>1)*0x0200, /* log of debug info */ | ||
| 902 | + L_IOCTL = (ACX_DEBUG>0)*0x0400, /* log ioctl calls */ | ||
| 903 | + L_CTL = (ACX_DEBUG>1)*0x0800, /* log of low-level ctl commands */ | ||
| 904 | + L_BUFR = (ACX_DEBUG>1)*0x1000, /* debug rx buffer mgmt (ring buffer etc.) */ | ||
| 905 | + L_XFER_BEACON = (ACX_DEBUG>1)*0x2000, /* also log beacon packets */ | ||
| 906 | + L_BUFT = (ACX_DEBUG>1)*0x4000, /* debug tx buffer mgmt (ring buffer etc.) */ | ||
| 907 | + L_USBRXTX = (ACX_DEBUG>0)*0x8000, /* debug USB rx/tx operations */ | ||
| 908 | + L_BUF = L_BUFR + L_BUFT, | ||
| 909 | + L_ANY = 0xffff | ||
| 910 | +}; | ||
| 911 | + | ||
| 912 | +#if ACX_DEBUG | ||
| 913 | +extern unsigned int acx_debug; | ||
| 914 | +#else | ||
| 915 | +enum { acx_debug = 0 }; | ||
| 916 | +#endif | ||
| 917 | + | ||
| 918 | + | ||
| 919 | +/*********************************************************************** | ||
| 920 | +** Random helpers | ||
| 921 | +*/ | ||
| 922 | +#define ACX_PACKED __attribute__ ((packed)) | ||
| 923 | + | ||
| 924 | +#define VEC_SIZE(a) (sizeof(a)/sizeof(a[0])) | ||
| 925 | + | ||
| 926 | +/* Use worker_queues for 2.5/2.6 kernels and queue tasks for 2.4 kernels | ||
| 927 | + (used for the 'bottom half' of the interrupt routine) */ | ||
| 928 | + | ||
| 929 | +#include <linux/workqueue.h> | ||
| 930 | +#define USE_WORKER_TASKS | ||
| 931 | +#define WORK_STRUCT struct work_struct | ||
| 932 | +#define SCHEDULE_WORK schedule_work | ||
| 933 | +#define FLUSH_SCHEDULED_WORK flush_scheduled_work | ||
| 934 | + | ||
| 935 | + | ||
| 936 | +/*********************************************************************** | ||
| 937 | +** Constants | ||
| 938 | +*/ | ||
| 939 | +#define OK 0 | ||
| 940 | +#define NOT_OK 1 | ||
| 941 | + | ||
| 942 | +/* The supported chip models */ | ||
| 943 | +#define CHIPTYPE_ACX100 1 | ||
| 944 | +#define CHIPTYPE_ACX111 2 | ||
| 945 | + | ||
| 946 | +#define IS_ACX100(adev) ((adev)->chip_type == CHIPTYPE_ACX100) | ||
| 947 | +#define IS_ACX111(adev) ((adev)->chip_type == CHIPTYPE_ACX111) | ||
| 948 | + | ||
| 949 | +/* Supported interfaces */ | ||
| 950 | +#define DEVTYPE_PCI 0 | ||
| 951 | +#define DEVTYPE_USB 1 | ||
| 952 | +#define DEVTYPE_MEM 2 | ||
| 953 | + | ||
| 954 | +#if !defined(CONFIG_ACX_PCI) && !defined(CONFIG_ACX_USB) && !defined(CONFIG_ACX_MEM) && !defined(CONFIG_ACX_CS) | ||
| 955 | +#error Driver must include PCI, USB, PCMCIA or memory mapped interface support. You selected none of them. | ||
| 956 | +#endif | ||
| 957 | + | ||
| 958 | +#if defined(CONFIG_ACX_PCI) | ||
| 959 | + #if !defined(CONFIG_ACX_USB) | ||
| 960 | + #define IS_PCI(adev) 1 | ||
| 961 | + #else | ||
| 962 | + #define IS_PCI(adev) ((adev)->dev_type == DEVTYPE_PCI) | ||
| 963 | + #endif | ||
| 964 | +#else | ||
| 965 | + #define IS_PCI(adev) 0 | ||
| 966 | +#endif | ||
| 967 | + | ||
| 968 | +#if defined(CONFIG_ACX_USB) | ||
| 969 | + #if !defined(CONFIG_ACX_PCI) | ||
| 970 | + #define IS_USB(adev) 1 | ||
| 971 | + #else | ||
| 972 | + #define IS_USB(adev) ((adev)->dev_type == DEVTYPE_USB) | ||
| 973 | + #endif | ||
| 974 | +#else | ||
| 975 | + #define IS_USB(adev) 0 | ||
| 976 | +#endif | ||
| 977 | + | ||
| 978 | +#if defined(CONFIG_ACX_MEM) || defined(CONFIG_ACX_CS) | ||
| 979 | + #define IS_MEM(adev) 1 | ||
| 980 | +#else | ||
| 981 | + #define IS_MEM(adev) 0 | ||
| 982 | +#endif | ||
| 983 | + | ||
| 984 | +/* Driver defaults */ | ||
| 985 | +#define DEFAULT_DTIM_INTERVAL 10 | ||
| 986 | +/* used to be 2048, but FreeBSD driver changed it to 4096 to work properly | ||
| 987 | +** in noisy wlans */ | ||
| 988 | +#define DEFAULT_MSDU_LIFETIME 4096 | ||
| 989 | +#define DEFAULT_RTS_THRESHOLD 2312 /* max. size: disable RTS mechanism */ | ||
| 990 | +#define DEFAULT_BEACON_INTERVAL 100 | ||
| 991 | + | ||
| 992 | +#define ACX100_BAP_DATALEN_MAX 4096 | ||
| 993 | +#define ACX100_RID_GUESSING_MAXLEN 2048 /* I'm not really sure */ | ||
| 994 | +#define ACX100_RIDDATA_MAXLEN ACX100_RID_GUESSING_MAXLEN | ||
| 995 | + | ||
| 996 | +/* Support Constants */ | ||
| 997 | +/* Radio type names, found in Win98 driver's TIACXLN.INF */ | ||
| 998 | +#define RADIO_MAXIM_0D 0x0d | ||
| 999 | +#define RADIO_RFMD_11 0x11 | ||
| 1000 | +#define RADIO_RALINK_15 0x15 | ||
| 1001 | +/* used in ACX111 cards (WG311v2, WL-121, ...): */ | ||
| 1002 | +#define RADIO_RADIA_16 0x16 | ||
| 1003 | +/* most likely *sometimes* used in ACX111 cards: */ | ||
| 1004 | +#define RADIO_UNKNOWN_17 0x17 | ||
| 1005 | +/* FwRad19.bin was found in a Safecom driver; must be an ACX111 radio: */ | ||
| 1006 | +#define RADIO_UNKNOWN_19 0x19 | ||
| 1007 | +#define RADIO_UNKNOWN_1B 0x1b /* radio in SafeCom SWLUT-54125 USB adapter; entirely unknown!! */ | ||
| 1008 | + | ||
| 1009 | +/* Controller Commands */ | ||
| 1010 | +/* can be found in table cmdTable in firmware "Rev. 1.5.0" (FW150) */ | ||
| 1011 | +#define ACX1xx_CMD_RESET 0x00 | ||
| 1012 | +#define ACX1xx_CMD_INTERROGATE 0x01 | ||
| 1013 | +#define ACX1xx_CMD_CONFIGURE 0x02 | ||
| 1014 | +#define ACX1xx_CMD_ENABLE_RX 0x03 | ||
| 1015 | +#define ACX1xx_CMD_ENABLE_TX 0x04 | ||
| 1016 | +#define ACX1xx_CMD_DISABLE_RX 0x05 | ||
| 1017 | +#define ACX1xx_CMD_DISABLE_TX 0x06 | ||
| 1018 | +#define ACX1xx_CMD_FLUSH_QUEUE 0x07 | ||
| 1019 | +#define ACX1xx_CMD_SCAN 0x08 | ||
| 1020 | +#define ACX1xx_CMD_STOP_SCAN 0x09 | ||
| 1021 | +#define ACX1xx_CMD_CONFIG_TIM 0x0a | ||
| 1022 | +#define ACX1xx_CMD_JOIN 0x0b | ||
| 1023 | +#define ACX1xx_CMD_WEP_MGMT 0x0c | ||
| 1024 | +#ifdef OLD_FIRMWARE_VERSIONS | ||
| 1025 | +#define ACX100_CMD_HALT 0x0e /* mapped to unknownCMD in FW150 */ | ||
| 1026 | +#else | ||
| 1027 | +#define ACX1xx_CMD_MEM_READ 0x0d | ||
| 1028 | +#define ACX1xx_CMD_MEM_WRITE 0x0e | ||
| 1029 | +#endif | ||
| 1030 | +#define ACX1xx_CMD_SLEEP 0x0f | ||
| 1031 | +#define ACX1xx_CMD_WAKE 0x10 | ||
| 1032 | +#define ACX1xx_CMD_UNKNOWN_11 0x11 /* mapped to unknownCMD in FW150 */ | ||
| 1033 | +#define ACX100_CMD_INIT_MEMORY 0x12 | ||
| 1034 | +#define ACX1FF_CMD_DISABLE_RADIO 0x12 /* new firmware? TNETW1450? */ | ||
| 1035 | +#define ACX1xx_CMD_CONFIG_BEACON 0x13 | ||
| 1036 | +#define ACX1xx_CMD_CONFIG_PROBE_RESPONSE 0x14 | ||
| 1037 | +#define ACX1xx_CMD_CONFIG_NULL_DATA 0x15 | ||
| 1038 | +#define ACX1xx_CMD_CONFIG_PROBE_REQUEST 0x16 | ||
| 1039 | +#define ACX1xx_CMD_FCC_TEST 0x17 | ||
| 1040 | +#define ACX1xx_CMD_RADIOINIT 0x18 | ||
| 1041 | +#define ACX111_CMD_RADIOCALIB 0x19 | ||
| 1042 | +#define ACX1FF_CMD_NOISE_HISTOGRAM 0x1c /* new firmware? TNETW1450? */ | ||
| 1043 | +#define ACX1FF_CMD_RX_RESET 0x1d /* new firmware? TNETW1450? */ | ||
| 1044 | +#define ACX1FF_CMD_LNA_CONTROL 0x20 /* new firmware? TNETW1450? */ | ||
| 1045 | +#define ACX1FF_CMD_CONTROL_DBG_TRACE 0x21 /* new firmware? TNETW1450? */ | ||
| 1046 | + | ||
| 1047 | +/* 'After Interrupt' Commands */ | ||
| 1048 | +#define ACX_AFTER_IRQ_CMD_STOP_SCAN 0x01 | ||
| 1049 | +#define ACX_AFTER_IRQ_CMD_ASSOCIATE 0x02 | ||
| 1050 | +#define ACX_AFTER_IRQ_CMD_RADIO_RECALIB 0x04 | ||
| 1051 | +#define ACX_AFTER_IRQ_UPDATE_CARD_CFG 0x08 | ||
| 1052 | +#define ACX_AFTER_IRQ_TX_CLEANUP 0x10 | ||
| 1053 | +#define ACX_AFTER_IRQ_COMPLETE_SCAN 0x20 | ||
| 1054 | +#define ACX_AFTER_IRQ_RESTART_SCAN 0x40 | ||
| 1055 | + | ||
| 1056 | +/*********************************************************************** | ||
| 1057 | +** Tx/Rx buffer sizes and watermarks | ||
| 1058 | +** | ||
| 1059 | +** This will alloc and use DMAable buffers of | ||
| 1060 | +** WLAN_A4FR_MAXLEN_WEP_FCS * (RX_CNT + TX_CNT) bytes | ||
| 1061 | +** RX/TX_CNT=32 -> ~150k DMA buffers | ||
| 1062 | +** RX/TX_CNT=16 -> ~75k DMA buffers | ||
| 1063 | +** | ||
| 1064 | +** 2005-10-10: reduced memory usage by lowering both to 16 | ||
| 1065 | +*/ | ||
| 1066 | +#define RX_CNT 16 | ||
| 1067 | +#define TX_CNT 16 | ||
| 1068 | + | ||
| 1069 | +/* we clean up txdescs when we have N free txdesc: */ | ||
| 1070 | +#define TX_CLEAN_BACKLOG (TX_CNT/4) | ||
| 1071 | +#define TX_START_CLEAN (TX_CNT - TX_CLEAN_BACKLOG) | ||
| 1072 | +#define TX_EMERG_CLEAN 2 | ||
| 1073 | +/* we stop queue if we have < N free txbufs: */ | ||
| 1074 | +#define TX_STOP_QUEUE 3 | ||
| 1075 | +/* we start queue if we have >= N free txbufs: */ | ||
| 1076 | +#define TX_START_QUEUE 5 | ||
| 1077 | + | ||
| 1078 | +/*********************************************************************** | ||
| 1079 | +** Interrogate/Configure cmd constants | ||
| 1080 | +** | ||
| 1081 | +** NB: length includes JUST the data part of the IE | ||
| 1082 | +** (does not include size of the (type,len) pair) | ||
| 1083 | +** | ||
| 1084 | +** TODO: seems that acx100, acx100usb, acx111 have some differences, | ||
| 1085 | +** fix code with regard to this! | ||
| 1086 | +*/ | ||
| 1087 | + | ||
| 1088 | +#define DEF_IE(name, val, len) enum { ACX##name=val, ACX##name##_LEN=len } | ||
| 1089 | + | ||
| 1090 | +/* Information Elements: Network Parameters, Static Configuration Entities */ | ||
| 1091 | +/* these are handled by real_cfgtable in firmware "Rev 1.5.0" (FW150) */ | ||
| 1092 | +DEF_IE(1xx_IE_UNKNOWN_00 ,0x0000, -1); /* mapped to cfgInvalid in FW150 */ | ||
| 1093 | +DEF_IE(100_IE_ACX_TIMER ,0x0001, 0x10); | ||
| 1094 | +DEF_IE(1xx_IE_POWER_MGMT ,0x0002, 0x06); /* TNETW1450: length 0x18!! */ | ||
| 1095 | +DEF_IE(1xx_IE_QUEUE_CONFIG ,0x0003, 0x1c); | ||
| 1096 | +DEF_IE(100_IE_BLOCK_SIZE ,0x0004, 0x02); | ||
| 1097 | +DEF_IE(1FF_IE_SLOT_TIME ,0x0004, 0x08); /* later firmware versions only? */ | ||
| 1098 | +DEF_IE(1xx_IE_MEMORY_CONFIG_OPTIONS ,0x0005, 0x14); | ||
| 1099 | +DEF_IE(1FF_IE_QUEUE_HEAD ,0x0005, 0x14 /* FIXME: length? */); | ||
| 1100 | +DEF_IE(1xx_IE_RATE_FALLBACK ,0x0006, 0x01); /* TNETW1450: length 2 */ | ||
| 1101 | +DEF_IE(100_IE_WEP_OPTIONS ,0x0007, 0x03); | ||
| 1102 | +DEF_IE(111_IE_RADIO_BAND ,0x0007, -1); | ||
| 1103 | +DEF_IE(1FF_IE_TIMING_CFG ,0x0007, -1); /* later firmware versions; TNETW1450 only? */ | ||
| 1104 | +DEF_IE(100_IE_SSID ,0x0008, 0x20); /* huh? */ | ||
| 1105 | +DEF_IE(1xx_IE_MEMORY_MAP ,0x0008, 0x28); /* huh? TNETW1450 has length 0x40!! */ | ||
| 1106 | +DEF_IE(1xx_IE_SCAN_STATUS ,0x0009, 0x04); /* mapped to cfgInvalid in FW150 */ | ||
| 1107 | +DEF_IE(1xx_IE_ASSOC_ID ,0x000a, 0x02); | ||
| 1108 | +DEF_IE(1xx_IE_UNKNOWN_0B ,0x000b, -1); /* mapped to cfgInvalid in FW150 */ | ||
| 1109 | +DEF_IE(1FF_IE_TX_POWER_LEVEL_TABLE ,0x000b, 0x18); /* later firmware versions; TNETW1450 only? */ | ||
| 1110 | +DEF_IE(100_IE_UNKNOWN_0C ,0x000c, -1); /* very small implementation in FW150! */ | ||
| 1111 | +/* ACX100 has an equivalent struct in the cmd mailbox directly after reset. | ||
| 1112 | + * 0x14c seems extremely large, will trash stack on failure (memset!) | ||
| 1113 | + * in case of small input struct --> OOPS! */ | ||
| 1114 | +DEF_IE(111_IE_CONFIG_OPTIONS ,0x000c, 0x14c); | ||
| 1115 | +DEF_IE(1xx_IE_FWREV ,0x000d, 0x18); | ||
| 1116 | +DEF_IE(1xx_IE_FCS_ERROR_COUNT ,0x000e, 0x04); | ||
| 1117 | +DEF_IE(1xx_IE_MEDIUM_USAGE ,0x000f, 0x08); | ||
| 1118 | +DEF_IE(1xx_IE_RXCONFIG ,0x0010, 0x04); | ||
| 1119 | +DEF_IE(100_IE_UNKNOWN_11 ,0x0011, -1); /* NONBINARY: large implementation in FW150! link quality readings or so? */ | ||
| 1120 | +DEF_IE(111_IE_QUEUE_THRESH ,0x0011, -1); | ||
| 1121 | +DEF_IE(100_IE_UNKNOWN_12 ,0x0012, -1); /* NONBINARY: VERY large implementation in FW150!! */ | ||
| 1122 | +DEF_IE(111_IE_BSS_POWER_SAVE ,0x0012, /* -1 */ 2); | ||
| 1123 | +DEF_IE(1xx_IE_FIRMWARE_STATISTICS ,0x0013, 0x9c); /* TNETW1450: length 0x134!! */ | ||
| 1124 | +DEF_IE(1FF_IE_RX_INTR_CONFIG ,0x0014, 0x14); /* later firmware versions, TNETW1450 only? */ | ||
| 1125 | +DEF_IE(1xx_IE_FEATURE_CONFIG ,0x0015, 0x08); | ||
| 1126 | +DEF_IE(111_IE_KEY_CHOOSE ,0x0016, 0x04); /* for rekeying. really len=4?? */ | ||
| 1127 | +DEF_IE(1FF_IE_MISC_CONFIG_TABLE ,0x0017, 0x04); /* later firmware versions, TNETW1450 only? */ | ||
| 1128 | +DEF_IE(1FF_IE_WONE_CONFIG ,0x0018, -1); /* later firmware versions, TNETW1450 only? */ | ||
| 1129 | +DEF_IE(1FF_IE_TID_CONFIG ,0x001a, 0x2c); /* later firmware versions, TNETW1450 only? */ | ||
| 1130 | +DEF_IE(1FF_IE_CALIB_ASSESSMENT ,0x001e, 0x04); /* later firmware versions, TNETW1450 only? */ | ||
| 1131 | +DEF_IE(1FF_IE_BEACON_FILTER_OPTIONS ,0x001f, 0x02); /* later firmware versions, TNETW1450 only? */ | ||
| 1132 | +DEF_IE(1FF_IE_LOW_RSSI_THRESH_OPT ,0x0020, 0x04); /* later firmware versions, TNETW1450 only? */ | ||
| 1133 | +DEF_IE(1FF_IE_NOISE_HISTOGRAM_RESULTS ,0x0021, 0x30); /* later firmware versions, TNETW1450 only? */ | ||
| 1134 | +DEF_IE(1FF_IE_PACKET_DETECT_THRESH ,0x0023, 0x04); /* later firmware versions, TNETW1450 only? */ | ||
| 1135 | +DEF_IE(1FF_IE_TX_CONFIG_OPTIONS ,0x0024, 0x04); /* later firmware versions, TNETW1450 only? */ | ||
| 1136 | +DEF_IE(1FF_IE_CCA_THRESHOLD ,0x0025, 0x02); /* later firmware versions, TNETW1450 only? */ | ||
| 1137 | +DEF_IE(1FF_IE_EVENT_MASK ,0x0026, 0x08); /* later firmware versions, TNETW1450 only? */ | ||
| 1138 | +DEF_IE(1FF_IE_DTIM_PERIOD ,0x0027, 0x02); /* later firmware versions, TNETW1450 only? */ | ||
| 1139 | +DEF_IE(1FF_IE_ACI_CONFIG_SET ,0x0029, 0x06); /* later firmware versions; maybe TNETW1450 only? */ | ||
| 1140 | +DEF_IE(1FF_IE_EEPROM_VER ,0x0030, 0x04); /* later firmware versions; maybe TNETW1450 only? */ | ||
| 1141 | +DEF_IE(1xx_IE_DOT11_STATION_ID ,0x1001, 0x06); | ||
| 1142 | +DEF_IE(100_IE_DOT11_UNKNOWN_1002 ,0x1002, -1); /* mapped to cfgInvalid in FW150 */ | ||
| 1143 | +DEF_IE(111_IE_DOT11_FRAG_THRESH ,0x1002, -1); /* mapped to cfgInvalid in FW150; TNETW1450 has length 2!! */ | ||
| 1144 | +DEF_IE(100_IE_DOT11_BEACON_PERIOD ,0x1003, 0x02); /* mapped to cfgInvalid in FW150 */ | ||
| 1145 | +DEF_IE(1xx_IE_DOT11_DTIM_PERIOD ,0x1004, -1); /* mapped to cfgInvalid in FW150 */ | ||
| 1146 | +DEF_IE(1FF_IE_DOT11_MAX_RX_LIFETIME ,0x1004, -1); /* later firmware versions; maybe TNETW1450 only? */ | ||
| 1147 | +DEF_IE(1xx_IE_DOT11_SHORT_RETRY_LIMIT ,0x1005, 0x01); /* TNETW1450: length 2 */ | ||
| 1148 | +DEF_IE(1xx_IE_DOT11_LONG_RETRY_LIMIT ,0x1006, 0x01); /* TNETW1450: length 2 */ | ||
| 1149 | +DEF_IE(100_IE_DOT11_WEP_DEFAULT_KEY_WRITE ,0x1007, 0x20); /* configure default keys; TNETW1450 has length 0x24!! */ | ||
| 1150 | +DEF_IE(1xx_IE_DOT11_MAX_XMIT_MSDU_LIFETIME ,0x1008, 0x04); | ||
| 1151 | +DEF_IE(1xx_IE_DOT11_GROUP_ADDR ,0x1009, -1); | ||
| 1152 | +DEF_IE(1xx_IE_DOT11_CURRENT_REG_DOMAIN ,0x100a, 0x02); | ||
| 1153 | +/* It's harmless to have larger struct. Use USB case always. */ | ||
| 1154 | +DEF_IE(1xx_IE_DOT11_CURRENT_ANTENNA ,0x100b, 0x02); /* in fact len=1 for PCI */ | ||
| 1155 | +DEF_IE(1xx_IE_DOT11_UNKNOWN_100C ,0x100c, -1); /* mapped to cfgInvalid in FW150 */ | ||
| 1156 | +DEF_IE(1xx_IE_DOT11_TX_POWER_LEVEL ,0x100d, 0x01); /* TNETW1450 has length 2!! */ | ||
| 1157 | +DEF_IE(1xx_IE_DOT11_CURRENT_CCA_MODE ,0x100e, 0x02); /* in fact len=1 for PCI */ | ||
| 1158 | +/* USB doesn't return anything - len==0?! */ | ||
| 1159 | +DEF_IE(100_IE_DOT11_ED_THRESHOLD ,0x100f, 0x04); | ||
| 1160 | +DEF_IE(1xx_IE_DOT11_WEP_DEFAULT_KEY_SET ,0x1010, 0x01); /* set default key ID; TNETW1450: length 2 */ | ||
| 1161 | +DEF_IE(100_IE_DOT11_UNKNOWN_1011 ,0x1011, -1); /* mapped to cfgInvalid in FW150 */ | ||
| 1162 | +DEF_IE(1FF_IE_DOT11_CURR_5GHZ_REGDOM ,0x1011, -1); /* later firmware versions; maybe TNETW1450 only? */ | ||
| 1163 | +DEF_IE(100_IE_DOT11_UNKNOWN_1012 ,0x1012, -1); /* mapped to cfgInvalid in FW150 */ | ||
| 1164 | +DEF_IE(100_IE_DOT11_UNKNOWN_1013 ,0x1013, -1); /* mapped to cfgInvalid in FW150 */ | ||
| 1165 | + | ||
| 1166 | +#if 0 | ||
| 1167 | +/* Experimentally obtained on acx100, fw 1.9.8.b | ||
| 1168 | +** -1 means that fw returned 'invalid IE' | ||
| 1169 | +** 0200 FC00 nnnn... are test read contents: u16 type, u16 len, data | ||
| 1170 | +** (AA are poison bytes marking bytes not written by fw) | ||
| 1171 | +** | ||
| 1172 | +** Looks like acx100 fw does not update len field (thus len=256-4=FC here) | ||
| 1173 | +** A number of IEs seem to trash type,len fields | ||
| 1174 | +** IEs marked 'huge' return gobs of data (no poison bytes remain) | ||
| 1175 | +*/ | ||
| 1176 | +DEF_IE(100_IE_INVAL_00, 0x0000, -1); | ||
| 1177 | +DEF_IE(100_IE_INVAL_01, 0x0001, -1); /* IE_ACX_TIMER, len=16 on older fw */ | ||
| 1178 | +DEF_IE(100_IE_POWER_MGMT, 0x0002, 4); /* 0200FC00 00040000 AAAAAAAA */ | ||
| 1179 | +DEF_IE(100_IE_QUEUE_CONFIG, 0x0003, 28); /* 0300FC00 48060000 9CAD0000 0101AAAA DCB00000 E4B00000 9CAA0000 00AAAAAA */ | ||
| 1180 | +DEF_IE(100_IE_BLOCK_SIZE, 0x0004, 2); /* 0400FC00 0001AAAA AAAAAAAA AAAAAAAA */ | ||
| 1181 | +/* write only: */ | ||
| 1182 | +DEF_IE(100_IE_MEMORY_CONFIG_OPTIONS, 0x0005, 20); | ||
| 1183 | +DEF_IE(100_IE_RATE_FALLBACK, 0x0006, 1); /* 0600FC00 00AAAAAA AAAAAAAA AAAAAAAA */ | ||
| 1184 | +/* write only: */ | ||
| 1185 | +DEF_IE(100_IE_WEP_OPTIONS, 0x0007, 3); | ||
| 1186 | +DEF_IE(100_IE_MEMORY_MAP, 0x0008, 40); /* huge: 0800FC00 30000000 6CA20000 70A20000... */ | ||
| 1187 | +/* gives INVAL on read: */ | ||
| 1188 | +DEF_IE(100_IE_SCAN_STATUS, 0x0009, -1); | ||
| 1189 | +DEF_IE(100_IE_ASSOC_ID, 0x000a, 2); /* huge: 0A00FC00 00000000 01040800 00000000... */ | ||
| 1190 | +DEF_IE(100_IE_INVAL_0B, 0x000b, -1); | ||
| 1191 | +/* 'command rejected': */ | ||
| 1192 | +DEF_IE(100_IE_CONFIG_OPTIONS, 0x000c, -3); | ||
| 1193 | +DEF_IE(100_IE_FWREV, 0x000d, 24); /* 0D00FC00 52657620 312E392E 382E6200 AAAAAAAA AAAAAAAA 05050201 AAAAAAAA */ | ||
| 1194 | +DEF_IE(100_IE_FCS_ERROR_COUNT, 0x000e, 4); | ||
| 1195 | +DEF_IE(100_IE_MEDIUM_USAGE, 0x000f, 8); /* E41F0000 2D780300 FCC91300 AAAAAAAA */ | ||
| 1196 | +DEF_IE(100_IE_RXCONFIG, 0x0010, 4); /* 1000FC00 00280000 AAAAAAAA AAAAAAAA */ | ||
| 1197 | +DEF_IE(100_IE_QUEUE_THRESH, 0x0011, 12); /* 1100FC00 AAAAAAAA 00000000 00000000 */ | ||
| 1198 | +DEF_IE(100_IE_BSS_POWER_SAVE, 0x0012, 1); /* 1200FC00 00AAAAAA AAAAAAAA AAAAAAAA */ | ||
| 1199 | +/* read only, variable len */ | ||
| 1200 | +DEF_IE(100_IE_FIRMWARE_STATISTICS, 0x0013, 256); /* 0000AC00 00000000 ... */ | ||
| 1201 | +DEF_IE(100_IE_INT_CONFIG, 0x0014, 20); /* 00000000 00000000 00000000 00000000 5D74D105 00000000 AAAAAAAA AAAAAAAA */ | ||
| 1202 | +DEF_IE(100_IE_FEATURE_CONFIG, 0x0015, 8); /* 1500FC00 16000000 AAAAAAAA AAAAAAAA */ | ||
| 1203 | +/* returns 'invalid MAC': */ | ||
| 1204 | +DEF_IE(100_IE_KEY_CHOOSE, 0x0016, -4); | ||
| 1205 | +DEF_IE(100_IE_INVAL_17, 0x0017, -1); | ||
| 1206 | +DEF_IE(100_IE_UNKNOWN_18, 0x0018, 0); /* null len?! 1800FC00 AAAAAAAA AAAAAAAA AAAAAAAA */ | ||
| 1207 | +DEF_IE(100_IE_UNKNOWN_19, 0x0019, 256); /* huge: 1900FC00 9C1F00EA FEFFFFEA FEFFFFEA... */ | ||
| 1208 | +DEF_IE(100_IE_INVAL_1A, 0x001A, -1); | ||
| 1209 | + | ||
| 1210 | +DEF_IE(100_IE_DOT11_INVAL_1000, 0x1000, -1); | ||
| 1211 | +DEF_IE(100_IE_DOT11_STATION_ID, 0x1001, 6); /* huge: 0110FC00 58B10E2F 03000000 00000000... */ | ||
| 1212 | +DEF_IE(100_IE_DOT11_INVAL_1002, 0x1002, -1); | ||
| 1213 | +DEF_IE(100_IE_DOT11_INVAL_1003, 0x1003, -1); | ||
| 1214 | +DEF_IE(100_IE_DOT11_INVAL_1004, 0x1004, -1); | ||
| 1215 | +DEF_IE(100_IE_DOT11_SHORT_RETRY_LIMIT, 0x1005, 1); | ||
| 1216 | +DEF_IE(100_IE_DOT11_LONG_RETRY_LIMIT, 0x1006, 1); | ||
| 1217 | +/* write only: */ | ||
| 1218 | +DEF_IE(100_IE_DOT11_WEP_DEFAULT_KEY_WRITE, 0x1007, 32); | ||
| 1219 | +DEF_IE(100_IE_DOT11_MAX_XMIT_MSDU_LIFETIME, 0x1008, 4); /* huge: 0810FC00 00020000 F4010000 00000000... */ | ||
| 1220 | +/* undoc but returns something */ | ||
| 1221 | +DEF_IE(100_IE_DOT11_GROUP_ADDR, 0x1009, 12); /* huge: 0910FC00 00000000 00000000 00000000... */ | ||
| 1222 | +DEF_IE(100_IE_DOT11_CURRENT_REG_DOMAIN, 0x100a, 1); /* 0A10FC00 30AAAAAA AAAAAAAA AAAAAAAA */ | ||
| 1223 | +DEF_IE(100_IE_DOT11_CURRENT_ANTENNA, 0x100b, 1); /* 0B10FC00 8FAAAAAA AAAAAAAA AAAAAAAA */ | ||
| 1224 | +DEF_IE(100_IE_DOT11_INVAL_100C, 0x100c, -1); | ||
| 1225 | +DEF_IE(100_IE_DOT11_TX_POWER_LEVEL, 0x100d, 2); /* 00000000 0100AAAA AAAAAAAA AAAAAAAA */ | ||
| 1226 | +DEF_IE(100_IE_DOT11_CURRENT_CCA_MODE, 0x100e, 1); /* 0E10FC00 0DAAAAAA AAAAAAAA AAAAAAAA */ | ||
| 1227 | +DEF_IE(100_IE_DOT11_ED_THRESHOLD, 0x100f, 4); /* 0F10FC00 70000000 AAAAAAAA AAAAAAAA */ | ||
| 1228 | +/* set default key ID */ | ||
| 1229 | +DEF_IE(100_IE_DOT11_WEP_DEFAULT_KEY_SET, 0x1010, 1); /* 1010FC00 00AAAAAA AAAAAAAA AAAAAAAA */ | ||
| 1230 | +DEF_IE(100_IE_DOT11_INVAL_1011, 0x1011, -1); | ||
| 1231 | +DEF_IE(100_IE_DOT11_INVAL_1012, 0x1012, -1); | ||
| 1232 | +DEF_IE(100_IE_DOT11_INVAL_1013, 0x1013, -1); | ||
| 1233 | +DEF_IE(100_IE_DOT11_UNKNOWN_1014, 0x1014, 256); /* huge */ | ||
| 1234 | +DEF_IE(100_IE_DOT11_UNKNOWN_1015, 0x1015, 256); /* huge */ | ||
| 1235 | +DEF_IE(100_IE_DOT11_UNKNOWN_1016, 0x1016, 256); /* huge */ | ||
| 1236 | +DEF_IE(100_IE_DOT11_UNKNOWN_1017, 0x1017, 256); /* huge */ | ||
| 1237 | +DEF_IE(100_IE_DOT11_UNKNOWN_1018, 0x1018, 256); /* huge */ | ||
| 1238 | +DEF_IE(100_IE_DOT11_UNKNOWN_1019, 0x1019, 256); /* huge */ | ||
| 1239 | +#endif | ||
| 1240 | + | ||
| 1241 | +#if 0 | ||
| 1242 | +/* Experimentally obtained on PCI acx111 Xterasys XN-2522g, fw 1.2.1.34 | ||
| 1243 | +** -1 means that fw returned 'invalid IE' | ||
| 1244 | +** 0400 0800 nnnn... are test read contents: u16 type, u16 len, data | ||
| 1245 | +** (AA are poison bytes marking bytes not written by fw) | ||
| 1246 | +** | ||
| 1247 | +** Looks like acx111 fw reports real len! | ||
| 1248 | +*/ | ||
| 1249 | +DEF_IE(111_IE_INVAL_00, 0x0000, -1); | ||
| 1250 | +DEF_IE(111_IE_INVAL_01, 0x0001, -1); | ||
| 1251 | +DEF_IE(111_IE_POWER_MGMT, 0x0002, 12); | ||
| 1252 | +/* write only, variable len: 12 + rxqueue_cnt*8 + txqueue_cnt*4: */ | ||
| 1253 | +DEF_IE(111_IE_MEMORY_CONFIG, 0x0003, 24); | ||
| 1254 | +DEF_IE(111_IE_BLOCK_SIZE, 0x0004, 8); /* 04000800 AA00AAAA AAAAAAAA */ | ||
| 1255 | +/* variable len: 8 + rxqueue_cnt*8 + txqueue_cnt*8: */ | ||
| 1256 | +DEF_IE(111_IE_QUEUE_HEAD, 0x0005, 24); | ||
| 1257 | +DEF_IE(111_IE_RATE_FALLBACK, 0x0006, 1); | ||
| 1258 | +/* acx100 name:WEP_OPTIONS */ | ||
| 1259 | +/* said to have len:1 (not true, actually returns 12 bytes): */ | ||
| 1260 | +DEF_IE(111_IE_RADIO_BAND, 0x0007, 12); /* 07000C00 AAAA1F00 FF03AAAA AAAAAAAA */ | ||
| 1261 | +DEF_IE(111_IE_MEMORY_MAP, 0x0008, 48); | ||
| 1262 | +/* said to have len:4, but gives INVAL on read: */ | ||
| 1263 | +DEF_IE(111_IE_SCAN_STATUS, 0x0009, -1); | ||
| 1264 | +DEF_IE(111_IE_ASSOC_ID, 0x000a, 2); | ||
| 1265 | +/* write only, len is not known: */ | ||
| 1266 | +DEF_IE(111_IE_UNKNOWN_0B, 0x000b, 0); | ||
| 1267 | +/* read only, variable len. I see 67 byte reads: */ | ||
| 1268 | +DEF_IE(111_IE_CONFIG_OPTIONS, 0x000c, 67); /* 0C004300 01160500 ... */ | ||
| 1269 | +DEF_IE(111_IE_FWREV, 0x000d, 24); | ||
| 1270 | +DEF_IE(111_IE_FCS_ERROR_COUNT, 0x000e, 4); | ||
| 1271 | +DEF_IE(111_IE_MEDIUM_USAGE, 0x000f, 8); | ||
| 1272 | +DEF_IE(111_IE_RXCONFIG, 0x0010, 4); | ||
| 1273 | +DEF_IE(111_IE_QUEUE_THRESH, 0x0011, 12); | ||
| 1274 | +DEF_IE(111_IE_BSS_POWER_SAVE, 0x0012, 1); | ||
| 1275 | +/* read only, variable len. I see 240 byte reads: */ | ||
| 1276 | +DEF_IE(111_IE_FIRMWARE_STATISTICS, 0x0013, 240); /* 1300F000 00000000 ... */ | ||
| 1277 | +/* said to have len=17. looks like fw pads it to 20: */ | ||
| 1278 | +DEF_IE(111_IE_INT_CONFIG, 0x0014, 20); /* 14001400 00000000 00000000 00000000 00000000 00000000 */ | ||
| 1279 | +DEF_IE(111_IE_FEATURE_CONFIG, 0x0015, 8); | ||
| 1280 | +/* said to be name:KEY_INDICATOR, len:4, but gives INVAL on read: */ | ||
| 1281 | +DEF_IE(111_IE_KEY_CHOOSE, 0x0016, -1); | ||
| 1282 | +/* said to have len:4, but in fact returns 8: */ | ||
| 1283 | +DEF_IE(111_IE_MAX_USB_XFR, 0x0017, 8); /* 17000800 00014000 00000000 */ | ||
| 1284 | +DEF_IE(111_IE_INVAL_18, 0x0018, -1); | ||
| 1285 | +DEF_IE(111_IE_INVAL_19, 0x0019, -1); | ||
| 1286 | +/* undoc but returns something: */ | ||
| 1287 | +/* huh, fw indicates len=20 but uses 4 more bytes in buffer??? */ | ||
| 1288 | +DEF_IE(111_IE_UNKNOWN_1A, 0x001A, 20); /* 1A001400 AA00AAAA 0000020F FF030000 00020000 00000007 04000000 */ | ||
| 1289 | + | ||
| 1290 | +DEF_IE(111_IE_DOT11_INVAL_1000, 0x1000, -1); | ||
| 1291 | +DEF_IE(111_IE_DOT11_STATION_ID, 0x1001, 6); | ||
| 1292 | +DEF_IE(111_IE_DOT11_FRAG_THRESH, 0x1002, 2); | ||
| 1293 | +/* acx100 only? gives INVAL on read: */ | ||
| 1294 | +DEF_IE(111_IE_DOT11_BEACON_PERIOD, 0x1003, -1); | ||
| 1295 | +/* said to be MAX_RECV_MSDU_LIFETIME: */ | ||
| 1296 | +DEF_IE(111_IE_DOT11_DTIM_PERIOD, 0x1004, 4); | ||
| 1297 | +DEF_IE(111_IE_DOT11_SHORT_RETRY_LIMIT, 0x1005, 1); | ||
| 1298 | +DEF_IE(111_IE_DOT11_LONG_RETRY_LIMIT, 0x1006, 1); | ||
| 1299 | +/* acx100 only? gives INVAL on read: */ | ||
| 1300 | +DEF_IE(111_IE_DOT11_WEP_DEFAULT_KEY_WRITE, 0x1007, -1); | ||
| 1301 | +DEF_IE(111_IE_DOT11_MAX_XMIT_MSDU_LIFETIME, 0x1008, 4); | ||
| 1302 | +/* undoc but returns something. maybe it's 2 multicast MACs to listen to? */ | ||
| 1303 | +DEF_IE(111_IE_DOT11_GROUP_ADDR, 0x1009, 12); /* 09100C00 00000000 00000000 00000000 */ | ||
| 1304 | +DEF_IE(111_IE_DOT11_CURRENT_REG_DOMAIN, 0x100a, 1); | ||
| 1305 | +DEF_IE(111_IE_DOT11_CURRENT_ANTENNA, 0x100b, 2); | ||
| 1306 | +DEF_IE(111_IE_DOT11_INVAL_100C, 0x100c, -1); | ||
| 1307 | +DEF_IE(111_IE_DOT11_TX_POWER_LEVEL, 0x100d, 1); | ||
| 1308 | +/* said to have len=1 but gives INVAL on read: */ | ||
| 1309 | +DEF_IE(111_IE_DOT11_CURRENT_CCA_MODE, 0x100e, -1); | ||
| 1310 | +/* said to have len=4 but gives INVAL on read: */ | ||
| 1311 | +DEF_IE(111_IE_DOT11_ED_THRESHOLD, 0x100f, -1); | ||
| 1312 | +/* set default key ID. write only: */ | ||
| 1313 | +DEF_IE(111_IE_DOT11_WEP_DEFAULT_KEY_SET, 0x1010, 1); | ||
| 1314 | +/* undoc but returns something: */ | ||
| 1315 | +DEF_IE(111_IE_DOT11_UNKNOWN_1011, 0x1011, 1); /* 11100100 20 */ | ||
| 1316 | +DEF_IE(111_IE_DOT11_INVAL_1012, 0x1012, -1); | ||
| 1317 | +DEF_IE(111_IE_DOT11_INVAL_1013, 0x1013, -1); | ||
| 1318 | +#endif | ||
| 1319 | + | ||
| 1320 | + | ||
| 1321 | +/*********************************************************************** | ||
| 1322 | +**Information Frames Structures | ||
| 1323 | +*/ | ||
| 1324 | + | ||
| 1325 | +/* Used in beacon frames and the like */ | ||
| 1326 | +#define DOT11RATEBYTE_1 (1*2) | ||
| 1327 | +#define DOT11RATEBYTE_2 (2*2) | ||
| 1328 | +#define DOT11RATEBYTE_5_5 (5*2+1) | ||
| 1329 | +#define DOT11RATEBYTE_11 (11*2) | ||
| 1330 | +#define DOT11RATEBYTE_22 (22*2) | ||
| 1331 | +#define DOT11RATEBYTE_6_G (6*2) | ||
| 1332 | +#define DOT11RATEBYTE_9_G (9*2) | ||
| 1333 | +#define DOT11RATEBYTE_12_G (12*2) | ||
| 1334 | +#define DOT11RATEBYTE_18_G (18*2) | ||
| 1335 | +#define DOT11RATEBYTE_24_G (24*2) | ||
| 1336 | +#define DOT11RATEBYTE_36_G (36*2) | ||
| 1337 | +#define DOT11RATEBYTE_48_G (48*2) | ||
| 1338 | +#define DOT11RATEBYTE_54_G (54*2) | ||
| 1339 | +#define DOT11RATEBYTE_BASIC 0x80 /* flags rates included in basic rate set */ | ||
| 1340 | + | ||
| 1341 | + | ||
| 1342 | +/*********************************************************************** | ||
| 1343 | +** rxbuffer_t | ||
| 1344 | +** | ||
| 1345 | +** This is the format of rx data returned by acx | ||
| 1346 | +*/ | ||
| 1347 | + | ||
| 1348 | +/* I've hoped it's a 802.11 PHY header, but no... | ||
| 1349 | + * so far, I've seen on acx111: | ||
| 1350 | + * 0000 3a00 0000 0000 IBSS Beacons | ||
| 1351 | + * 0000 3c00 0000 0000 ESS Beacons | ||
| 1352 | + * 0000 2700 0000 0000 Probe requests | ||
| 1353 | + * --vda | ||
| 1354 | + */ | ||
| 1355 | +typedef struct phy_hdr { | ||
| 1356 | + u8 unknown[4]; | ||
| 1357 | + u8 acx111_unknown[4]; | ||
| 1358 | +} ACX_PACKED phy_hdr_t; | ||
| 1359 | + | ||
| 1360 | +/* seems to be a bit similar to hfa384x_rx_frame. | ||
| 1361 | + * These fields are still not quite obvious, though. | ||
| 1362 | + * Some seem to have different meanings... */ | ||
| 1363 | + | ||
| 1364 | +#define RXBUF_HDRSIZE 12 | ||
| 1365 | +#define RXBUF_BYTES_RCVD(adev, rxbuf) \ | ||
| 1366 | + ((le16_to_cpu((rxbuf)->mac_cnt_rcvd) & 0xfff) - (adev)->phy_header_len) | ||
| 1367 | +#define RXBUF_BYTES_USED(rxbuf) \ | ||
| 1368 | + ((le16_to_cpu((rxbuf)->mac_cnt_rcvd) & 0xfff) + RXBUF_HDRSIZE) | ||
| 1369 | +/* USBism */ | ||
| 1370 | +#define RXBUF_IS_TXSTAT(rxbuf) (le16_to_cpu((rxbuf)->mac_cnt_rcvd) & 0x8000) | ||
| 1371 | +/* | ||
| 1372 | +mac_cnt_rcvd: | ||
| 1373 | + 12 bits: length of frame from control field to first byte of FCS | ||
| 1374 | + 3 bits: reserved | ||
| 1375 | + 1 bit: 1 = it's a tx status info, not a rx packet (USB only) | ||
| 1376 | + | ||
| 1377 | +mac_cnt_mblks: | ||
| 1378 | + 6 bits: number of memory block used to store frame in adapter memory | ||
| 1379 | + 1 bit: Traffic Indicator bit in TIM of received Beacon was set | ||
| 1380 | + | ||
| 1381 | +mac_status: 1 byte (bitmap): | ||
| 1382 | + 7 Matching BSSID | ||
| 1383 | + 6 Matching SSID | ||
| 1384 | + 5 BDCST Address 1 field is a broadcast | ||
| 1385 | + 4 VBM received beacon frame has more than one set bit (?!) | ||
| 1386 | + 3 TIM Set bit representing this station is set in TIM of received beacon | ||
| 1387 | + 2 GROUP Address 1 is a multicast | ||
| 1388 | + 1 ADDR1 Address 1 matches our MAC | ||
| 1389 | + 0 FCSGD FSC is good | ||
| 1390 | + | ||
| 1391 | +phy_stat_baseband: 1 byte (bitmap): | ||
| 1392 | + 7 Preamble frame had a long preamble | ||
| 1393 | + 6 PLCP Error CRC16 error in PLCP header | ||
| 1394 | + 5 Unsup_Mod unsupported modulation | ||
| 1395 | + 4 Selected Antenna antenna 1 was used to receive this frame | ||
| 1396 | + 3 PBCC/CCK frame used: 1=PBCC, 0=CCK modulation | ||
| 1397 | + 2 OFDM frame used OFDM modulation | ||
| 1398 | + 1 TI Protection protection frame was detected | ||
| 1399 | + 0 Reserved | ||
| 1400 | + | ||
| 1401 | +phy_plcp_signal: 1 byte: | ||
| 1402 | + Receive PLCP Signal field from the Baseband Processor | ||
| 1403 | + | ||
| 1404 | +phy_level: 1 byte: | ||
| 1405 | + receive AGC gain level (can be used to measure receive signal strength) | ||
| 1406 | + | ||
| 1407 | +phy_snr: 1 byte: | ||
| 1408 | + estimated noise power of equalized receive signal | ||
| 1409 | + at input of FEC decoder (can be used to measure receive signal quality) | ||
| 1410 | + | ||
| 1411 | +time: 4 bytes: | ||
| 1412 | + timestamp sampled from either the Access Manager TSF counter | ||
| 1413 | + or free-running microsecond counter when the MAC receives | ||
| 1414 | + first byte of PLCP header. | ||
| 1415 | +*/ | ||
| 1416 | + | ||
| 1417 | +typedef struct rxbuffer { | ||
| 1418 | + u16 mac_cnt_rcvd; /* only 12 bits are len! (0xfff) */ | ||
| 1419 | + u8 mac_cnt_mblks; | ||
| 1420 | + u8 mac_status; | ||
| 1421 | + u8 phy_stat_baseband; /* bit 0x80: used LNA (Low-Noise Amplifier) */ | ||
| 1422 | + u8 phy_plcp_signal; | ||
| 1423 | + u8 phy_level; /* PHY stat */ | ||
| 1424 | + u8 phy_snr; /* PHY stat */ | ||
| 1425 | + u32 time; /* timestamp upon MAC rcv first byte */ | ||
| 1426 | +/* 4-byte (acx100) or 8-byte (acx111) phy header will be here | ||
| 1427 | +** if RX_CFG1_INCLUDE_PHY_HDR is in effect: | ||
| 1428 | +** phy_hdr_t phy */ | ||
| 1429 | + wlan_hdr_a3_t hdr_a3; | ||
| 1430 | + /* maximally sized data part of wlan packet */ | ||
| 1431 | + u8 data_a3[WLAN_A4FR_MAXLEN_WEP_FCS - WLAN_HDR_A3_LEN]; | ||
| 1432 | + /* can add hdr/data_a4 if needed */ | ||
| 1433 | +} ACX_PACKED rxbuffer_t; | ||
| 1434 | + | ||
| 1435 | + | ||
| 1436 | +/*--- Firmware statistics ----------------------------------------------------*/ | ||
| 1437 | + | ||
| 1438 | +/* define a random 100 bytes more to catch firmware versions which | ||
| 1439 | + * provide a bigger struct */ | ||
| 1440 | +#define FW_STATS_FUTURE_EXTENSION 100 | ||
| 1441 | + | ||
| 1442 | +typedef struct fw_stats_tx { | ||
| 1443 | + u32 tx_desc_of; | ||
| 1444 | +} ACX_PACKED fw_stats_tx_t; | ||
| 1445 | + | ||
| 1446 | +typedef struct fw_stats_rx { | ||
| 1447 | + u32 rx_oom; | ||
| 1448 | + u32 rx_hdr_of; | ||
| 1449 | + u32 rx_hw_stuck; /* old: u32 rx_hdr_use_next */ | ||
| 1450 | + u32 rx_dropped_frame; | ||
| 1451 | + u32 rx_frame_ptr_err; | ||
| 1452 | + u32 rx_xfr_hint_trig; | ||
| 1453 | + u32 rx_aci_events; /* later versions only */ | ||
| 1454 | + u32 rx_aci_resets; /* later versions only */ | ||
| 1455 | +} ACX_PACKED fw_stats_rx_t; | ||
| 1456 | + | ||
| 1457 | +typedef struct fw_stats_dma { | ||
| 1458 | + u32 rx_dma_req; | ||
| 1459 | + u32 rx_dma_err; | ||
| 1460 | + u32 tx_dma_req; | ||
| 1461 | + u32 tx_dma_err; | ||
| 1462 | +} ACX_PACKED fw_stats_dma_t; | ||
| 1463 | + | ||
| 1464 | +typedef struct fw_stats_irq { | ||
| 1465 | + u32 cmd_cplt; | ||
| 1466 | + u32 fiq; | ||
| 1467 | + u32 rx_hdrs; | ||
| 1468 | + u32 rx_cmplt; | ||
| 1469 | + u32 rx_mem_of; | ||
| 1470 | + u32 rx_rdys; | ||
| 1471 | + u32 irqs; | ||
| 1472 | + u32 tx_procs; | ||
| 1473 | + u32 decrypt_done; | ||
| 1474 | + u32 dma_0_done; | ||
| 1475 | + u32 dma_1_done; | ||
| 1476 | + u32 tx_exch_complet; | ||
| 1477 | + u32 commands; | ||
| 1478 | + u32 rx_procs; | ||
| 1479 | + u32 hw_pm_mode_changes; | ||
| 1480 | + u32 host_acks; | ||
| 1481 | + u32 pci_pm; | ||
| 1482 | + u32 acm_wakeups; | ||
| 1483 | +} ACX_PACKED fw_stats_irq_t; | ||
| 1484 | + | ||
| 1485 | +typedef struct fw_stats_wep { | ||
| 1486 | + u32 wep_key_count; | ||
| 1487 | + u32 wep_default_key_count; | ||
| 1488 | + u32 dot11_def_key_mib; | ||
| 1489 | + u32 wep_key_not_found; | ||
| 1490 | + u32 wep_decrypt_fail; | ||
| 1491 | + u32 wep_pkt_decrypt; | ||
| 1492 | + u32 wep_decrypt_irqs; | ||
| 1493 | +} ACX_PACKED fw_stats_wep_t; | ||
| 1494 | + | ||
| 1495 | +typedef struct fw_stats_pwr { | ||
| 1496 | + u32 tx_start_ctr; | ||
| 1497 | + u32 no_ps_tx_too_short; | ||
| 1498 | + u32 rx_start_ctr; | ||
| 1499 | + u32 no_ps_rx_too_short; | ||
| 1500 | + u32 lppd_started; | ||
| 1501 | + u32 no_lppd_too_noisy; | ||
| 1502 | + u32 no_lppd_too_short; | ||
| 1503 | + u32 no_lppd_matching_frame; | ||
| 1504 | +} ACX_PACKED fw_stats_pwr_t; | ||
| 1505 | + | ||
| 1506 | +typedef struct fw_stats_mic { | ||
| 1507 | + u32 mic_rx_pkts; | ||
| 1508 | + u32 mic_calc_fail; | ||
| 1509 | +} ACX_PACKED fw_stats_mic_t; | ||
| 1510 | + | ||
| 1511 | +typedef struct fw_stats_aes { | ||
| 1512 | + u32 aes_enc_fail; | ||
| 1513 | + u32 aes_dec_fail; | ||
| 1514 | + u32 aes_enc_pkts; | ||
| 1515 | + u32 aes_dec_pkts; | ||
| 1516 | + u32 aes_enc_irq; | ||
| 1517 | + u32 aes_dec_irq; | ||
| 1518 | +} ACX_PACKED fw_stats_aes_t; | ||
| 1519 | + | ||
| 1520 | +typedef struct fw_stats_event { | ||
| 1521 | + u32 heartbeat; | ||
| 1522 | + u32 calibration; | ||
| 1523 | + u32 rx_mismatch; | ||
| 1524 | + u32 rx_mem_empty; | ||
| 1525 | + u32 rx_pool; | ||
| 1526 | + u32 oom_late; | ||
| 1527 | + u32 phy_tx_err; | ||
| 1528 | + u32 tx_stuck; | ||
| 1529 | +} ACX_PACKED fw_stats_event_t; | ||
| 1530 | + | ||
| 1531 | +/* mainly for size calculation only */ | ||
| 1532 | +typedef struct fw_stats { | ||
| 1533 | + u16 type; | ||
| 1534 | + u16 len; | ||
| 1535 | + fw_stats_tx_t tx; | ||
| 1536 | + fw_stats_rx_t rx; | ||
| 1537 | + fw_stats_dma_t dma; | ||
| 1538 | + fw_stats_irq_t irq; | ||
| 1539 | + fw_stats_wep_t wep; | ||
| 1540 | + fw_stats_pwr_t pwr; | ||
| 1541 | + fw_stats_mic_t mic; | ||
| 1542 | + fw_stats_aes_t aes; | ||
| 1543 | + fw_stats_event_t evt; | ||
| 1544 | + u8 _padding[FW_STATS_FUTURE_EXTENSION]; | ||
| 1545 | +} fw_stats_t; | ||
| 1546 | + | ||
| 1547 | +/* Firmware version struct */ | ||
| 1548 | + | ||
| 1549 | +typedef struct fw_ver { | ||
| 1550 | + u16 cmd; | ||
| 1551 | + u16 size; | ||
| 1552 | + char fw_id[20]; | ||
| 1553 | + u32 hw_id; | ||
| 1554 | +} ACX_PACKED fw_ver_t; | ||
| 1555 | + | ||
| 1556 | +#define FW_ID_SIZE 20 | ||
| 1557 | + | ||
| 1558 | +typedef struct shared_queueindicator { | ||
| 1559 | + u32 indicator; | ||
| 1560 | + u16 host_lock; | ||
| 1561 | + u16 fw_lock; | ||
| 1562 | +} ACX_PACKED queueindicator_t; | ||
| 1563 | + | ||
| 1564 | +/*--- WEP stuff --------------------------------------------------------------*/ | ||
| 1565 | +#define DOT11_MAX_DEFAULT_WEP_KEYS 4 | ||
| 1566 | + | ||
| 1567 | +/* non-firmware struct, no packing necessary */ | ||
| 1568 | +typedef struct wep_key { | ||
| 1569 | + size_t size; /* most often used member first */ | ||
| 1570 | + u8 index; | ||
| 1571 | + u8 key[29]; | ||
| 1572 | + u16 strange_filler; | ||
| 1573 | +} wep_key_t; /* size = 264 bytes (33*8) */ | ||
| 1574 | +/* FIXME: We don't have size 264! Or is there 2 bytes beyond the key | ||
| 1575 | + * (strange_filler)? */ | ||
| 1576 | + | ||
| 1577 | +/* non-firmware struct, no packing necessary */ | ||
| 1578 | +typedef struct key_struct { | ||
| 1579 | + u8 addr[ETH_ALEN]; /* 0x00 */ | ||
| 1580 | + u16 filler1; /* 0x06 */ | ||
| 1581 | + u32 filler2; /* 0x08 */ | ||
| 1582 | + u32 index; /* 0x0c */ | ||
| 1583 | + u16 len; /* 0x10 */ | ||
| 1584 | + u8 key[29]; /* 0x12; is this long enough??? */ | ||
| 1585 | +} key_struct_t; /* size = 276. FIXME: where is the remaining space?? */ | ||
| 1586 | + | ||
| 1587 | + | ||
| 1588 | +/*--- Client (peer) info -----------------------------------------------------*/ | ||
| 1589 | +/* adev->sta_list[] is used for: | ||
| 1590 | +** accumulating and processing of scan results | ||
| 1591 | +** keeping client info in AP mode | ||
| 1592 | +** keeping AP info in STA mode (AP is the only one 'client') | ||
| 1593 | +** keeping peer info in ad-hoc mode | ||
| 1594 | +** non-firmware struct --> no packing necessary */ | ||
| 1595 | +enum { | ||
| 1596 | + CLIENT_EMPTY_SLOT_0 = 0, | ||
| 1597 | + CLIENT_EXIST_1 = 1, | ||
| 1598 | + CLIENT_AUTHENTICATED_2 = 2, | ||
| 1599 | + CLIENT_ASSOCIATED_3 = 3, | ||
| 1600 | + CLIENT_JOIN_CANDIDATE = 4 | ||
| 1601 | +}; | ||
| 1602 | +struct client { | ||
| 1603 | + /* most frequent access first */ | ||
| 1604 | + u8 used; /* misnamed, more like 'status' */ | ||
| 1605 | + struct client* next; | ||
| 1606 | + unsigned long mtime; /* last time we heard it, in jiffies */ | ||
| 1607 | + size_t essid_len; /* length of ESSID (without '\0') */ | ||
| 1608 | + u32 sir; /* Standard IR */ | ||
| 1609 | + u32 snr; /* Signal to Noise Ratio */ | ||
| 1610 | + u16 aid; /* association ID */ | ||
| 1611 | + u16 seq; /* from client's auth req */ | ||
| 1612 | + u16 auth_alg; /* from client's auth req */ | ||
| 1613 | + u16 cap_info; /* from client's assoc req */ | ||
| 1614 | + u16 rate_cap; /* what client supports (all rates) */ | ||
| 1615 | + u16 rate_bas; /* what client supports (basic rates) */ | ||
| 1616 | + u16 rate_cfg; /* what is allowed (by iwconfig etc) */ | ||
| 1617 | + u16 rate_cur; /* currently used rate mask */ | ||
| 1618 | + u8 rate_100; /* currently used rate byte (acx100 only) */ | ||
| 1619 | + u8 address[ETH_ALEN]; | ||
| 1620 | + u8 bssid[ETH_ALEN]; /* ad-hoc hosts can have bssid != mac */ | ||
| 1621 | + u8 channel; | ||
| 1622 | + u8 auth_step; | ||
| 1623 | + u8 ignore_count; | ||
| 1624 | + u8 fallback_count; | ||
| 1625 | + u8 stepup_count; | ||
| 1626 | + char essid[IW_ESSID_MAX_SIZE + 1]; /* ESSID and trailing '\0' */ | ||
| 1627 | +/* FIXME: this one is too damn big */ | ||
| 1628 | + char challenge_text[WLAN_CHALLENGE_LEN]; | ||
| 1629 | +}; | ||
| 1630 | + | ||
| 1631 | + | ||
| 1632 | +/*********************************************************************** | ||
| 1633 | +** Hardware structures | ||
| 1634 | +*/ | ||
| 1635 | + | ||
| 1636 | +/* An opaque typesafe helper type | ||
| 1637 | + * | ||
| 1638 | + * Some hardware fields are actually pointers, | ||
| 1639 | + * but they have to remain u32, since using ptr instead | ||
| 1640 | + * (8 bytes on 64bit systems!) would disrupt the fixed descriptor | ||
| 1641 | + * format the acx firmware expects in the non-user area. | ||
| 1642 | + * Since we cannot cram an 8 byte ptr into 4 bytes, we need to | ||
| 1643 | + * enforce that pointed to data remains in low memory | ||
| 1644 | + * (address value needs to fit in 4 bytes) on 64bit systems. | ||
| 1645 | + * | ||
| 1646 | + * This is easy to get wrong, thus we are using a small struct | ||
| 1647 | + * and special macros to access it. Macros will check for | ||
| 1648 | + * attempts to overflow an acx_ptr with value > 0xffffffff. | ||
| 1649 | + * | ||
| 1650 | + * Attempts to use acx_ptr without macros result in compile-time errors */ | ||
| 1651 | + | ||
| 1652 | +typedef struct { | ||
| 1653 | + u32 v; | ||
| 1654 | +} ACX_PACKED acx_ptr; | ||
| 1655 | + | ||
| 1656 | +#if ACX_DEBUG | ||
| 1657 | +#define CHECK32(n) BUG_ON(sizeof(n)>4 && (long)(n)>0xffffff00) | ||
| 1658 | +#else | ||
| 1659 | +#define CHECK32(n) ((void)0) | ||
| 1660 | +#endif | ||
| 1661 | + | ||
| 1662 | +/* acx_ptr <-> integer conversion */ | ||
| 1663 | +#define cpu2acx(n) ({ CHECK32(n); ((acx_ptr){ .v = cpu_to_le32(n) }); }) | ||
| 1664 | +#define acx2cpu(a) (le32_to_cpu(a.v)) | ||
| 1665 | + | ||
| 1666 | +/* acx_ptr <-> pointer conversion */ | ||
| 1667 | +#define ptr2acx(p) ({ CHECK32(p); ((acx_ptr){ .v = cpu_to_le32((u32)(long)(p)) }); }) | ||
| 1668 | +#define acx2ptr(a) ((void*)le32_to_cpu(a.v)) | ||
| 1669 | + | ||
| 1670 | +/* Values for rate field (acx100 only) */ | ||
| 1671 | +#define RATE100_1 10 | ||
| 1672 | +#define RATE100_2 20 | ||
| 1673 | +#define RATE100_5 55 | ||
| 1674 | +#define RATE100_11 110 | ||
| 1675 | +#define RATE100_22 220 | ||
| 1676 | +/* This bit denotes use of PBCC: | ||
| 1677 | +** (PBCC encoding is usable with 11 and 22 Mbps speeds only) */ | ||
| 1678 | +#define RATE100_PBCC511 0x80 | ||
| 1679 | + | ||
| 1680 | +/* Bit values for rate111 field */ | ||
| 1681 | +#define RATE111_1 0x0001 /* DBPSK */ | ||
| 1682 | +#define RATE111_2 0x0002 /* DQPSK */ | ||
| 1683 | +#define RATE111_5 0x0004 /* CCK or PBCC */ | ||
| 1684 | +#define RATE111_6 0x0008 /* CCK-OFDM or OFDM */ | ||
| 1685 | +#define RATE111_9 0x0010 /* CCK-OFDM or OFDM */ | ||
| 1686 | +#define RATE111_11 0x0020 /* CCK or PBCC */ | ||
| 1687 | +#define RATE111_12 0x0040 /* CCK-OFDM or OFDM */ | ||
| 1688 | +#define RATE111_18 0x0080 /* CCK-OFDM or OFDM */ | ||
| 1689 | +#define RATE111_22 0x0100 /* PBCC */ | ||
| 1690 | +#define RATE111_24 0x0200 /* CCK-OFDM or OFDM */ | ||
| 1691 | +#define RATE111_36 0x0400 /* CCK-OFDM or OFDM */ | ||
| 1692 | +#define RATE111_48 0x0800 /* CCK-OFDM or OFDM */ | ||
| 1693 | +#define RATE111_54 0x1000 /* CCK-OFDM or OFDM */ | ||
| 1694 | +#define RATE111_RESERVED 0x2000 | ||
| 1695 | +#define RATE111_PBCC511 0x4000 /* PBCC mod at 5.5 or 11Mbit (else CCK) */ | ||
| 1696 | +#define RATE111_SHORTPRE 0x8000 /* short preamble */ | ||
| 1697 | +/* Special 'try everything' value */ | ||
| 1698 | +#define RATE111_ALL 0x1fff | ||
| 1699 | +/* These bits denote acx100 compatible settings */ | ||
| 1700 | +#define RATE111_ACX100_COMPAT 0x0127 | ||
| 1701 | +/* These bits denote 802.11b compatible settings */ | ||
| 1702 | +#define RATE111_80211B_COMPAT 0x0027 | ||
| 1703 | + | ||
| 1704 | +/* Descriptor Ctl field bits | ||
| 1705 | + * init value is 0x8e, "idle" value is 0x82 (in idle tx descs) | ||
| 1706 | + */ | ||
| 1707 | +#define DESC_CTL_SHORT_PREAMBLE 0x01 /* preamble type: 0 = long; 1 = short */ | ||
| 1708 | +#define DESC_CTL_FIRSTFRAG 0x02 /* this is the 1st frag of the frame */ | ||
| 1709 | +#define DESC_CTL_AUTODMA 0x04 | ||
| 1710 | +#define DESC_CTL_RECLAIM 0x08 /* ready to reuse */ | ||
| 1711 | +#define DESC_CTL_HOSTDONE 0x20 /* host has finished processing */ | ||
| 1712 | +#define DESC_CTL_ACXDONE 0x40 /* acx has finished processing */ | ||
| 1713 | +/* host owns the desc [has to be released last, AFTER modifying all other desc fields!] */ | ||
| 1714 | +#define DESC_CTL_HOSTOWN 0x80 | ||
| 1715 | +#define DESC_CTL_ACXDONE_HOSTOWN (DESC_CTL_ACXDONE | DESC_CTL_HOSTOWN) | ||
| 1716 | + | ||
| 1717 | +/* Descriptor Status field | ||
| 1718 | + */ | ||
| 1719 | +#define DESC_STATUS_FULL (1 << 31) | ||
| 1720 | + | ||
| 1721 | +/* NB: some bits may be interesting for Monitor mode tx (aka Raw tx): */ | ||
| 1722 | +#define DESC_CTL2_SEQ 0x01 /* don't increase sequence field */ | ||
| 1723 | +#define DESC_CTL2_FCS 0x02 /* don't add the FCS */ | ||
| 1724 | +#define DESC_CTL2_MORE_FRAG 0x04 | ||
| 1725 | +#define DESC_CTL2_RETRY 0x08 /* don't increase retry field */ | ||
| 1726 | +#define DESC_CTL2_POWER 0x10 /* don't increase power mgmt. field */ | ||
| 1727 | +#define DESC_CTL2_RTS 0x20 /* do RTS/CTS magic before sending */ | ||
| 1728 | +#define DESC_CTL2_WEP 0x40 /* encrypt this frame */ | ||
| 1729 | +#define DESC_CTL2_DUR 0x80 /* don't increase duration field */ | ||
| 1730 | + | ||
| 1731 | +/*********************************************************************** | ||
| 1732 | +** PCI structures | ||
| 1733 | +*/ | ||
| 1734 | +/* IRQ Constants | ||
| 1735 | +** (outside of "#ifdef PCI" because USB (mis)uses HOST_INT_SCAN_COMPLETE) */ | ||
| 1736 | +#define HOST_INT_RX_DATA 0x0001 | ||
| 1737 | +#define HOST_INT_TX_COMPLETE 0x0002 | ||
| 1738 | +#define HOST_INT_TX_XFER 0x0004 | ||
| 1739 | +#define HOST_INT_RX_COMPLETE 0x0008 | ||
| 1740 | +#define HOST_INT_DTIM 0x0010 | ||
| 1741 | +#define HOST_INT_BEACON 0x0020 | ||
| 1742 | +#define HOST_INT_TIMER 0x0040 | ||
| 1743 | +#define HOST_INT_KEY_NOT_FOUND 0x0080 | ||
| 1744 | +#define HOST_INT_IV_ICV_FAILURE 0x0100 | ||
| 1745 | +#define HOST_INT_CMD_COMPLETE 0x0200 | ||
| 1746 | +#define HOST_INT_INFO 0x0400 | ||
| 1747 | +#define HOST_INT_OVERFLOW 0x0800 | ||
| 1748 | +#define HOST_INT_PROCESS_ERROR 0x1000 | ||
| 1749 | +#define HOST_INT_SCAN_COMPLETE 0x2000 | ||
| 1750 | +#define HOST_INT_FCS_THRESHOLD 0x4000 | ||
| 1751 | +#define HOST_INT_UNKNOWN 0x8000 | ||
| 1752 | + | ||
| 1753 | +/* Outside of "#ifdef PCI" because USB needs to know sizeof() | ||
| 1754 | +** of txdesc and rxdesc: */ | ||
| 1755 | +struct txdesc { | ||
| 1756 | + acx_ptr pNextDesc; /* pointer to next txdesc */ | ||
| 1757 | + acx_ptr HostMemPtr; /* 0x04 */ | ||
| 1758 | + acx_ptr AcxMemPtr; /* 0x08 */ | ||
| 1759 | + u32 tx_time; /* 0x0c */ | ||
| 1760 | + u16 total_length; /* 0x10 */ | ||
| 1761 | + u16 Reserved; /* 0x12 */ | ||
| 1762 | + | ||
| 1763 | +/* The following 16 bytes do not change when acx100 owns the descriptor */ | ||
| 1764 | +/* BUG: fw clears last byte of this area which is supposedly reserved | ||
| 1765 | +** for driver use. amd64 blew up. We dare not use it now */ | ||
| 1766 | + u32 dummy[4]; | ||
| 1767 | + | ||
| 1768 | + u8 Ctl_8; /* 0x24, 8bit value */ | ||
| 1769 | + u8 Ctl2_8; /* 0x25, 8bit value */ | ||
| 1770 | + u8 error; /* 0x26 */ | ||
| 1771 | + u8 ack_failures; /* 0x27 */ | ||
| 1772 | + | ||
| 1773 | + union { | ||
| 1774 | + /* | ||
| 1775 | + * Packing doesn't work correctly on ARM unless unions are on | ||
| 1776 | + * 4 byte boundaries. | ||
| 1777 | + */ | ||
| 1778 | + struct { | ||
| 1779 | + u8 rts_failures; /* 0x28 */ | ||
| 1780 | + u8 rts_ok; /* 0x29 */ | ||
| 1781 | + u16 d1; | ||
| 1782 | + } ACX_PACKED rts; | ||
| 1783 | + struct { | ||
| 1784 | + u16 d1; | ||
| 1785 | + u8 rate; /* 0x2a */ | ||
| 1786 | + u8 queue_ctrl; /* 0x2b */ | ||
| 1787 | + } ACX_PACKED r1; | ||
| 1788 | + struct { | ||
| 1789 | + u16 d1; | ||
| 1790 | + u16 rate111; /* 0x2a */ | ||
| 1791 | + } ACX_PACKED r2; | ||
| 1792 | + } ACX_PACKED u; | ||
| 1793 | + u32 queue_info; /* 0x2c (acx100, reserved on acx111) */ | ||
| 1794 | +} ACX_PACKED; /* size : 48 = 0x30 */ | ||
| 1795 | +/* NB: acx111 txdesc structure is 4 byte larger */ | ||
| 1796 | +/* All these 4 extra bytes are reserved. tx alloc code takes them into account */ | ||
| 1797 | + | ||
| 1798 | +struct rxdesc { | ||
| 1799 | + acx_ptr pNextDesc; /* 0x00 */ | ||
| 1800 | + acx_ptr HostMemPtr; /* 0x04 */ | ||
| 1801 | + acx_ptr ACXMemPtr; /* 0x08 */ | ||
| 1802 | + u32 rx_time; /* 0x0c */ | ||
| 1803 | + u16 total_length; /* 0x10 */ | ||
| 1804 | + u16 WEP_length; /* 0x12 */ | ||
| 1805 | + u32 WEP_ofs; /* 0x14 */ | ||
| 1806 | + | ||
| 1807 | +/* the following 16 bytes do not change when acx100 owns the descriptor */ | ||
| 1808 | + u8 driverWorkspace[16]; /* 0x18 */ | ||
| 1809 | + | ||
| 1810 | + u8 Ctl_8; | ||
| 1811 | + u8 rate; | ||
| 1812 | + u8 error; | ||
| 1813 | + u8 SNR; /* Signal-to-Noise Ratio */ | ||
| 1814 | + u8 RxLevel; | ||
| 1815 | + u8 queue_ctrl; | ||
| 1816 | + u16 unknown; | ||
| 1817 | + u32 unknown2; | ||
| 1818 | +} ACX_PACKED; /* size 52 = 0x34 */ | ||
| 1819 | + | ||
| 1820 | +#if defined(ACX_PCI) || defined(ACX_MEM) | ||
| 1821 | + | ||
| 1822 | +/* Register I/O offsets */ | ||
| 1823 | +#define ACX100_EEPROM_ID_OFFSET 0x380 | ||
| 1824 | + | ||
| 1825 | +/* please add further ACX hardware register definitions only when | ||
| 1826 | + it turns out you need them in the driver, and please try to use | ||
| 1827 | + firmware functionality instead, since using direct I/O access instead | ||
| 1828 | + of letting the firmware do it might confuse the firmware's state | ||
| 1829 | + machine */ | ||
| 1830 | + | ||
| 1831 | +/* ***** ABSOLUTELY ALWAYS KEEP OFFSETS IN SYNC WITH THE INITIALIZATION | ||
| 1832 | +** OF THE I/O ARRAYS!!!! (grep for '^IO_ACX') ***** */ | ||
| 1833 | +enum { | ||
| 1834 | + IO_ACX_SOFT_RESET = 0, | ||
| 1835 | + | ||
| 1836 | + IO_ACX_SLV_MEM_ADDR, | ||
| 1837 | + IO_ACX_SLV_MEM_DATA, | ||
| 1838 | + IO_ACX_SLV_MEM_CTL, | ||
| 1839 | + IO_ACX_SLV_END_CTL, | ||
| 1840 | + | ||
| 1841 | + IO_ACX_FEMR, /* Function Event Mask */ | ||
| 1842 | + | ||
| 1843 | + IO_ACX_INT_TRIG, | ||
| 1844 | + IO_ACX_IRQ_MASK, | ||
| 1845 | + IO_ACX_IRQ_STATUS_NON_DES, | ||
| 1846 | + IO_ACX_IRQ_STATUS_CLEAR, /* CLEAR = clear on read */ | ||
| 1847 | + IO_ACX_IRQ_ACK, | ||
| 1848 | + IO_ACX_HINT_TRIG, | ||
| 1849 | + | ||
| 1850 | + IO_ACX_ENABLE, | ||
| 1851 | + | ||
| 1852 | + IO_ACX_EEPROM_CTL, | ||
| 1853 | + IO_ACX_EEPROM_ADDR, | ||
| 1854 | + IO_ACX_EEPROM_DATA, | ||
| 1855 | + IO_ACX_EEPROM_CFG, | ||
| 1856 | + | ||
| 1857 | + IO_ACX_PHY_ADDR, | ||
| 1858 | + IO_ACX_PHY_DATA, | ||
| 1859 | + IO_ACX_PHY_CTL, | ||
| 1860 | + | ||
| 1861 | + IO_ACX_GPIO_OE, | ||
| 1862 | + | ||
| 1863 | + IO_ACX_GPIO_OUT, | ||
| 1864 | + | ||
| 1865 | + IO_ACX_CMD_MAILBOX_OFFS, | ||
| 1866 | + IO_ACX_INFO_MAILBOX_OFFS, | ||
| 1867 | + IO_ACX_EEPROM_INFORMATION, | ||
| 1868 | + | ||
| 1869 | + IO_ACX_EE_START, | ||
| 1870 | + IO_ACX_SOR_CFG, | ||
| 1871 | + IO_ACX_ECPU_CTRL | ||
| 1872 | +}; | ||
| 1873 | +/* ***** ABSOLUTELY ALWAYS KEEP OFFSETS IN SYNC WITH THE INITIALIZATION | ||
| 1874 | +** OF THE I/O ARRAYS!!!! (grep for '^IO_ACX') ***** */ | ||
| 1875 | + | ||
| 1876 | +/* Values for IO_ACX_INT_TRIG register: */ | ||
| 1877 | +/* inform hw that rxdesc in queue needs processing */ | ||
| 1878 | +#define INT_TRIG_RXPRC 0x08 | ||
| 1879 | +/* inform hw that txdesc in queue needs processing */ | ||
| 1880 | +#define INT_TRIG_TXPRC 0x04 | ||
| 1881 | +/* ack that we received info from info mailbox */ | ||
| 1882 | +#define INT_TRIG_INFOACK 0x02 | ||
| 1883 | +/* inform hw that we have filled command mailbox */ | ||
| 1884 | +#define INT_TRIG_CMD 0x01 | ||
| 1885 | + | ||
| 1886 | +struct txhostdesc { | ||
| 1887 | + acx_ptr data_phy; /* 0x00 [u8 *] */ | ||
| 1888 | + u16 data_offset; /* 0x04 */ | ||
| 1889 | + u16 reserved; /* 0x06 */ | ||
| 1890 | + u16 Ctl_16; /* 16bit value, endianness!! */ | ||
| 1891 | + u16 length; /* 0x0a */ | ||
| 1892 | + acx_ptr desc_phy_next; /* 0x0c [txhostdesc *] */ | ||
| 1893 | + acx_ptr pNext; /* 0x10 [txhostdesc *] */ | ||
| 1894 | + u32 Status; /* 0x14, unused on Tx */ | ||
| 1895 | +/* From here on you can use this area as you want (variable length, too!) */ | ||
| 1896 | + u8 *data; | ||
| 1897 | +} ACX_PACKED; | ||
| 1898 | + | ||
| 1899 | +struct rxhostdesc { | ||
| 1900 | + acx_ptr data_phy; /* 0x00 [rxbuffer_t *] */ | ||
| 1901 | + u16 data_offset; /* 0x04 */ | ||
| 1902 | + u16 reserved; /* 0x06 */ | ||
| 1903 | + u16 Ctl_16; /* 0x08; 16bit value, endianness!! */ | ||
| 1904 | + u16 length; /* 0x0a */ | ||
| 1905 | + acx_ptr desc_phy_next; /* 0x0c [rxhostdesc_t *] */ | ||
| 1906 | + acx_ptr pNext; /* 0x10 [rxhostdesc_t *] */ | ||
| 1907 | + u32 Status; /* 0x14 */ | ||
| 1908 | +/* From here on you can use this area as you want (variable length, too!) */ | ||
| 1909 | + rxbuffer_t *data; | ||
| 1910 | +} ACX_PACKED; | ||
| 1911 | + | ||
| 1912 | +#endif /* ACX_PCI */ | ||
| 1913 | + | ||
| 1914 | +/*********************************************************************** | ||
| 1915 | +** USB structures and constants | ||
| 1916 | +*/ | ||
| 1917 | +#ifdef ACX_USB | ||
| 1918 | + | ||
| 1919 | +/* Used for usb_txbuffer.desc field */ | ||
| 1920 | +#define USB_TXBUF_TXDESC 0xA | ||
| 1921 | +/* Size of header (everything up to data[]) */ | ||
| 1922 | +#define USB_TXBUF_HDRSIZE 14 | ||
| 1923 | +typedef struct usb_txbuffer { | ||
| 1924 | + u16 desc; | ||
| 1925 | + u16 mpdu_len; | ||
| 1926 | + u8 queue_index; | ||
| 1927 | + u8 rate; | ||
| 1928 | + u32 hostdata; | ||
| 1929 | + u8 ctrl1; | ||
| 1930 | + u8 ctrl2; | ||
| 1931 | + u16 data_len; | ||
| 1932 | + /* wlan packet content is placed here: */ | ||
| 1933 | + u8 data[WLAN_A4FR_MAXLEN_WEP_FCS]; | ||
| 1934 | +} ACX_PACKED usb_txbuffer_t; | ||
| 1935 | + | ||
| 1936 | +/* USB returns either rx packets (see rxbuffer) or | ||
| 1937 | +** these "tx status" structs: */ | ||
| 1938 | +typedef struct usb_txstatus { | ||
| 1939 | + u16 mac_cnt_rcvd; /* only 12 bits are len! (0xfff) */ | ||
| 1940 | + u8 queue_index; | ||
| 1941 | + u8 mac_status; /* seen 0x20 on tx failure */ | ||
| 1942 | + u32 hostdata; | ||
| 1943 | + u8 rate; | ||
| 1944 | + u8 ack_failures; | ||
| 1945 | + u8 rts_failures; | ||
| 1946 | + u8 rts_ok; | ||
| 1947 | +} ACX_PACKED usb_txstatus_t; | ||
| 1948 | + | ||
| 1949 | +typedef struct usb_tx { | ||
| 1950 | + unsigned busy:1; | ||
| 1951 | + struct urb *urb; | ||
| 1952 | + acx_device_t *adev; | ||
| 1953 | + /* actual USB bulk output data block is here: */ | ||
| 1954 | + usb_txbuffer_t bulkout; | ||
| 1955 | +} usb_tx_t; | ||
| 1956 | + | ||
| 1957 | +struct usb_rx_plain { | ||
| 1958 | + unsigned busy:1; | ||
| 1959 | + struct urb *urb; | ||
| 1960 | + acx_device_t *adev; | ||
| 1961 | + rxbuffer_t bulkin; | ||
| 1962 | +}; | ||
| 1963 | + | ||
| 1964 | +typedef struct usb_rx { | ||
| 1965 | + unsigned busy:1; | ||
| 1966 | + struct urb *urb; | ||
| 1967 | + acx_device_t *adev; | ||
| 1968 | + rxbuffer_t bulkin; | ||
| 1969 | + /* Make entire structure 4k. Report if it breaks something. */ | ||
| 1970 | + u8 padding[4*1024 - sizeof(struct usb_rx_plain)]; | ||
| 1971 | +} usb_rx_t; | ||
| 1972 | +#endif /* ACX_USB */ | ||
| 1973 | + | ||
| 1974 | + | ||
| 1975 | +/* Config Option structs */ | ||
| 1976 | + | ||
| 1977 | +typedef struct co_antennas { | ||
| 1978 | + u8 type; | ||
| 1979 | + u8 len; | ||
| 1980 | + u8 list[2]; | ||
| 1981 | +} ACX_PACKED co_antennas_t; | ||
| 1982 | + | ||
| 1983 | +typedef struct co_powerlevels { | ||
| 1984 | + u8 type; | ||
| 1985 | + u8 len; | ||
| 1986 | + u16 list[8]; | ||
| 1987 | +} ACX_PACKED co_powerlevels_t; | ||
| 1988 | + | ||
| 1989 | +typedef struct co_datarates { | ||
| 1990 | + u8 type; | ||
| 1991 | + u8 len; | ||
| 1992 | + u8 list[8]; | ||
| 1993 | +} ACX_PACKED co_datarates_t; | ||
| 1994 | + | ||
| 1995 | +typedef struct co_domains { | ||
| 1996 | + u8 type; | ||
| 1997 | + u8 len; | ||
| 1998 | + u8 list[6]; | ||
| 1999 | +} ACX_PACKED co_domains_t; | ||
| 2000 | + | ||
| 2001 | +typedef struct co_product_id { | ||
| 2002 | + u8 type; | ||
| 2003 | + u8 len; | ||
| 2004 | + u8 list[128]; | ||
| 2005 | +} ACX_PACKED co_product_id_t; | ||
| 2006 | + | ||
| 2007 | +typedef struct co_manuf_id { | ||
| 2008 | + u8 type; | ||
| 2009 | + u8 len; | ||
| 2010 | + u8 list[128]; | ||
| 2011 | +} ACX_PACKED co_manuf_t; | ||
| 2012 | + | ||
| 2013 | +typedef struct co_fixed { | ||
| 2014 | + char NVSv[8]; | ||
| 2015 | +/* u16 NVS_vendor_offs; ACX111-only */ | ||
| 2016 | +/* u16 unknown; ACX111-only */ | ||
| 2017 | + u8 MAC[6]; /* ACX100-only */ | ||
| 2018 | + u16 probe_delay; /* ACX100-only */ | ||
| 2019 | + u32 eof_memory; | ||
| 2020 | + u8 dot11CCAModes; | ||
| 2021 | + u8 dot11Diversity; | ||
| 2022 | + u8 dot11ShortPreambleOption; | ||
| 2023 | + u8 dot11PBCCOption; | ||
| 2024 | + u8 dot11ChannelAgility; | ||
| 2025 | + u8 dot11PhyType; /* FIXME: does 802.11 call it "dot11PHYType"? */ | ||
| 2026 | + u8 dot11TempType; | ||
| 2027 | + u8 table_count; | ||
| 2028 | +} ACX_PACKED co_fixed_t; | ||
| 2029 | + | ||
| 2030 | +typedef struct acx111_ie_configoption { | ||
| 2031 | + u16 type; | ||
| 2032 | + u16 len; | ||
| 2033 | +/* Do not access below members directly, they are in fact variable length */ | ||
| 2034 | + co_fixed_t fixed; | ||
| 2035 | + co_antennas_t antennas; | ||
| 2036 | + co_powerlevels_t power_levels; | ||
| 2037 | + co_datarates_t data_rates; | ||
| 2038 | + co_domains_t domains; | ||
| 2039 | + co_product_id_t product_id; | ||
| 2040 | + co_manuf_t manufacturer; | ||
| 2041 | + u8 _padding[4]; | ||
| 2042 | +} ACX_PACKED acx111_ie_configoption_t; | ||
| 2043 | + | ||
| 2044 | + | ||
| 2045 | +/*********************************************************************** | ||
| 2046 | +** Main acx per-device data structure | ||
| 2047 | +*/ | ||
| 2048 | +#define ACX_STATE_FW_LOADED 0x01 | ||
| 2049 | +#define ACX_STATE_IFACE_UP 0x02 | ||
| 2050 | + | ||
| 2051 | +/* MAC mode (BSS type) defines | ||
| 2052 | + * Note that they shouldn't be redefined, since they are also used | ||
| 2053 | + * during communication with firmware */ | ||
| 2054 | +#define ACX_MODE_0_ADHOC 0 | ||
| 2055 | +#define ACX_MODE_1_UNUSED 1 | ||
| 2056 | +#define ACX_MODE_2_STA 2 | ||
| 2057 | +#define ACX_MODE_3_AP 3 | ||
| 2058 | +/* These are our own inventions. Sending these to firmware | ||
| 2059 | +** makes it stop emitting beacons, which is exactly what we want | ||
| 2060 | +** for these modes */ | ||
| 2061 | +#define ACX_MODE_MONITOR 0xfe | ||
| 2062 | +#define ACX_MODE_OFF 0xff | ||
| 2063 | +/* 'Submode': identifies exact status of ADHOC/STA host */ | ||
| 2064 | +#define ACX_STATUS_0_STOPPED 0 | ||
| 2065 | +#define ACX_STATUS_1_SCANNING 1 | ||
| 2066 | +#define ACX_STATUS_2_WAIT_AUTH 2 | ||
| 2067 | +#define ACX_STATUS_3_AUTHENTICATED 3 | ||
| 2068 | +#define ACX_STATUS_4_ASSOCIATED 4 | ||
| 2069 | + | ||
| 2070 | +/* FIXME: this should be named something like struct acx_priv (typedef'd to | ||
| 2071 | + * acx_priv_t) */ | ||
| 2072 | + | ||
| 2073 | +/* non-firmware struct, no packing necessary */ | ||
| 2074 | +struct acx_device { | ||
| 2075 | + /* most frequent accesses first (dereferencing and cache line!) */ | ||
| 2076 | + | ||
| 2077 | + /*** Locking ***/ | ||
| 2078 | + /* FIXME: try to convert semaphore to more efficient mutex according | ||
| 2079 | + to Ingo Molnar's docs (but not before driver is in mainline or | ||
| 2080 | + pre-mutex Linux 2.6.10 is very outdated). */ | ||
| 2081 | + struct semaphore sem; | ||
| 2082 | + spinlock_t lock; | ||
| 2083 | +#if defined(PARANOID_LOCKING) /* Lock debugging */ | ||
| 2084 | + const char *last_sem; | ||
| 2085 | + const char *last_lock; | ||
| 2086 | + unsigned long sem_time; | ||
| 2087 | + unsigned long lock_time; | ||
| 2088 | +#endif | ||
| 2089 | +#ifdef ACX_MEM | ||
| 2090 | + spinlock_t txbuf_lock; | ||
| 2091 | +#endif | ||
| 2092 | + | ||
| 2093 | + /*** Linux network device ***/ | ||
| 2094 | + struct net_device *ndev; /* pointer to linux netdevice */ | ||
| 2095 | + | ||
| 2096 | + /*** Device statistics ***/ | ||
| 2097 | + struct net_device_stats stats; /* net device statistics */ | ||
| 2098 | +#ifdef WIRELESS_EXT | ||
| 2099 | + struct iw_statistics wstats; /* wireless statistics */ | ||
| 2100 | +#endif | ||
| 2101 | + /*** Power managment ***/ | ||
| 2102 | + struct pm_dev *pm; /* PM crap */ | ||
| 2103 | + | ||
| 2104 | + /*** Management timer ***/ | ||
| 2105 | + struct timer_list mgmt_timer; | ||
| 2106 | + | ||
| 2107 | + /*** Hardware identification ***/ | ||
| 2108 | + const char *chip_name; | ||
| 2109 | + u8 dev_type; | ||
| 2110 | + u8 chip_type; | ||
| 2111 | + u8 form_factor; | ||
| 2112 | + u8 radio_type; | ||
| 2113 | + u8 eeprom_version; | ||
| 2114 | + | ||
| 2115 | + /*** Config retrieved from EEPROM ***/ | ||
| 2116 | + char cfgopt_NVSv[8]; | ||
| 2117 | + u16 cfgopt_NVS_vendor_offs; | ||
| 2118 | + u8 cfgopt_MAC[6]; | ||
| 2119 | + u16 cfgopt_probe_delay; | ||
| 2120 | + u32 cfgopt_eof_memory; | ||
| 2121 | + u8 cfgopt_dot11CCAModes; | ||
| 2122 | + u8 cfgopt_dot11Diversity; | ||
| 2123 | + u8 cfgopt_dot11ShortPreambleOption; | ||
| 2124 | + u8 cfgopt_dot11PBCCOption; | ||
| 2125 | + u8 cfgopt_dot11ChannelAgility; | ||
| 2126 | + u8 cfgopt_dot11PhyType; | ||
| 2127 | + u8 cfgopt_dot11TempType; | ||
| 2128 | + co_antennas_t cfgopt_antennas; | ||
| 2129 | + co_powerlevels_t cfgopt_power_levels; | ||
| 2130 | + co_datarates_t cfgopt_data_rates; | ||
| 2131 | + co_domains_t cfgopt_domains; | ||
| 2132 | + co_product_id_t cfgopt_product_id; | ||
| 2133 | + co_manuf_t cfgopt_manufacturer; | ||
| 2134 | + | ||
| 2135 | + /*** Firmware identification ***/ | ||
| 2136 | + char firmware_version[FW_ID_SIZE+1]; | ||
| 2137 | + u32 firmware_numver; | ||
| 2138 | + u32 firmware_id; | ||
| 2139 | + const u16 *ie_len; | ||
| 2140 | + const u16 *ie_len_dot11; | ||
| 2141 | + | ||
| 2142 | + /*** Device state ***/ | ||
| 2143 | + u16 dev_state_mask; | ||
| 2144 | + u8 led_power; /* power LED status */ | ||
| 2145 | + u32 get_mask; /* mask of settings to fetch from the card */ | ||
| 2146 | + u32 set_mask; /* mask of settings to write to the card */ | ||
| 2147 | + | ||
| 2148 | + /* Barely used in USB case */ | ||
| 2149 | + u16 irq_status; | ||
| 2150 | + | ||
| 2151 | + u8 after_interrupt_jobs; /* mini job list for doing actions after an interrupt occurred */ | ||
| 2152 | + WORK_STRUCT after_interrupt_task; /* our task for after interrupt actions */ | ||
| 2153 | + | ||
| 2154 | + /*** scanning ***/ | ||
| 2155 | + u16 scan_count; /* number of times to do channel scan */ | ||
| 2156 | + u8 scan_mode; /* 0 == active, 1 == passive, 2 == background */ | ||
| 2157 | + u8 scan_rate; | ||
| 2158 | + u16 scan_duration; | ||
| 2159 | + u16 scan_probe_delay; | ||
| 2160 | +#if WIRELESS_EXT > 15 | ||
| 2161 | + struct iw_spy_data spy_data; /* FIXME: needs to be implemented! */ | ||
| 2162 | +#endif | ||
| 2163 | + | ||
| 2164 | + /*** Wireless network settings ***/ | ||
| 2165 | + /* copy of the device address (ifconfig hw ether) that we actually use | ||
| 2166 | + ** for 802.11; copied over from the network device's MAC address | ||
| 2167 | + ** (ifconfig) when it makes sense only */ | ||
| 2168 | + u8 dev_addr[MAX_ADDR_LEN]; | ||
| 2169 | + u8 bssid[ETH_ALEN]; /* the BSSID after having joined */ | ||
| 2170 | + u8 ap[ETH_ALEN]; /* The AP we want, FF:FF:FF:FF:FF:FF is any */ | ||
| 2171 | + u16 aid; /* The Association ID sent from the AP / last used AID if we're an AP */ | ||
| 2172 | + u16 mode; /* mode from iwconfig */ | ||
| 2173 | + int monitor_type; /* ARPHRD_IEEE80211 or ARPHRD_IEEE80211_PRISM */ | ||
| 2174 | + u16 status; /* 802.11 association status */ | ||
| 2175 | + u8 essid_active; /* specific ESSID active, or select any? */ | ||
| 2176 | + u8 essid_len; /* to avoid dozens of strlen() */ | ||
| 2177 | + /* INCLUDES \0 termination for easy printf - but many places | ||
| 2178 | + ** simply want the string data memcpy'd plus a length indicator! | ||
| 2179 | + ** Keep that in mind... */ | ||
| 2180 | + char essid[IW_ESSID_MAX_SIZE+1]; | ||
| 2181 | + /* essid we are going to use for association, in case of "essid 'any'" | ||
| 2182 | + ** and in case of hidden ESSID (use configured ESSID then) */ | ||
| 2183 | + char essid_for_assoc[IW_ESSID_MAX_SIZE+1]; | ||
| 2184 | + char nick[IW_ESSID_MAX_SIZE+1]; /* see essid! */ | ||
| 2185 | + u8 channel; | ||
| 2186 | + u8 reg_dom_id; /* reg domain setting */ | ||
| 2187 | + u16 reg_dom_chanmask; | ||
| 2188 | + u16 auth_or_assoc_retries; | ||
| 2189 | + u16 scan_retries; | ||
| 2190 | + unsigned long scan_start; /* YES, jiffies is defined as "unsigned long" */ | ||
| 2191 | + | ||
| 2192 | + /* stations known to us (if we're an ap) */ | ||
| 2193 | + client_t sta_list[32]; /* tab is larger than list, so that */ | ||
| 2194 | + client_t *sta_hash_tab[64]; /* hash collisions are not likely */ | ||
| 2195 | + client_t *ap_client; /* this one is our AP (STA mode only) */ | ||
| 2196 | + | ||
| 2197 | + int dup_count; | ||
| 2198 | + int nondup_count; | ||
| 2199 | + unsigned long dup_msg_expiry; | ||
| 2200 | + u16 last_seq_ctrl; /* duplicate packet detection */ | ||
| 2201 | + | ||
| 2202 | + /* 802.11 power save mode */ | ||
| 2203 | + u8 ps_wakeup_cfg; | ||
| 2204 | + u8 ps_listen_interval; | ||
| 2205 | + u8 ps_options; | ||
| 2206 | + u8 ps_hangover_period; | ||
| 2207 | + u32 ps_enhanced_transition_time; | ||
| 2208 | + u32 ps_beacon_rx_time; | ||
| 2209 | + | ||
| 2210 | + /*** PHY settings ***/ | ||
| 2211 | + u8 fallback_threshold; | ||
| 2212 | + u8 stepup_threshold; | ||
| 2213 | + u16 rate_basic; | ||
| 2214 | + u16 rate_oper; | ||
| 2215 | + u16 rate_bcast; | ||
| 2216 | + u16 rate_bcast100; | ||
| 2217 | + u8 rate_auto; /* false if "iwconfig rate N" (WITHOUT 'auto'!) */ | ||
| 2218 | + u8 preamble_mode; /* 0 == Long Preamble, 1 == Short, 2 == Auto */ | ||
| 2219 | + u8 preamble_cur; | ||
| 2220 | + | ||
| 2221 | + u8 tx_disabled; | ||
| 2222 | + u8 tx_level_dbm; | ||
| 2223 | + /* u8 tx_level_val; */ | ||
| 2224 | + /* u8 tx_level_auto; whether to do automatic power adjustment */ | ||
| 2225 | + | ||
| 2226 | + unsigned long recalib_time_last_success; | ||
| 2227 | + unsigned long recalib_time_last_attempt; | ||
| 2228 | + int recalib_failure_count; | ||
| 2229 | + int recalib_msg_ratelimit; | ||
| 2230 | + int retry_errors_msg_ratelimit; | ||
| 2231 | + | ||
| 2232 | + unsigned long brange_time_last_state_change; /* time the power LED was last changed */ | ||
| 2233 | + u8 brange_last_state; /* last state of the LED */ | ||
| 2234 | + u8 brange_max_quality; /* maximum quality that equates to full speed */ | ||
| 2235 | + | ||
| 2236 | + u8 sensitivity; | ||
| 2237 | + u8 antenna; /* antenna settings */ | ||
| 2238 | + u8 ed_threshold; /* energy detect threshold */ | ||
| 2239 | + u8 cca; /* clear channel assessment */ | ||
| 2240 | + | ||
| 2241 | + u16 rts_threshold; | ||
| 2242 | + u16 frag_threshold; | ||
| 2243 | + u32 short_retry; | ||
| 2244 | + u32 long_retry; | ||
| 2245 | + u16 msdu_lifetime; | ||
| 2246 | + u16 listen_interval; /* given in units of beacon interval */ | ||
| 2247 | + u32 beacon_interval; | ||
| 2248 | + | ||
| 2249 | + u16 capabilities; | ||
| 2250 | + u8 rate_supported_len; | ||
| 2251 | + u8 rate_supported[13]; | ||
| 2252 | + | ||
| 2253 | + /*** Encryption settings (WEP) ***/ | ||
| 2254 | + u32 auth_alg; /* used in transmit_authen1 */ | ||
| 2255 | + u8 wep_enabled; | ||
| 2256 | + u8 wep_restricted; | ||
| 2257 | + u8 wep_current_index; | ||
| 2258 | + wep_key_t wep_keys[DOT11_MAX_DEFAULT_WEP_KEYS]; /* the default WEP keys */ | ||
| 2259 | + key_struct_t wep_key_struct[10]; | ||
| 2260 | + | ||
| 2261 | + /*** Unknown ***/ | ||
| 2262 | + u8 dtim_interval; | ||
| 2263 | + | ||
| 2264 | +#ifdef ACX_MEM | ||
| 2265 | + u32 acx_txbuf_start; | ||
| 2266 | + int acx_txbuf_numblocks; | ||
| 2267 | + u32 acx_txbuf_free; /* addr of head of free list */ | ||
| 2268 | + int acx_txbuf_blocks_free; /* how many are still open */ | ||
| 2269 | + queueindicator_t *acx_queue_indicator; | ||
| 2270 | +#endif | ||
| 2271 | + | ||
| 2272 | + /*** Card Rx/Tx management ***/ | ||
| 2273 | + u16 rx_config_1; | ||
| 2274 | + u16 rx_config_2; | ||
| 2275 | + u16 memblocksize; | ||
| 2276 | + unsigned int tx_free; | ||
| 2277 | + unsigned int tx_head; /* keep as close as possible to Tx stuff below (cache line) */ | ||
| 2278 | + u16 phy_header_len; | ||
| 2279 | + | ||
| 2280 | +/************************************************************************* | ||
| 2281 | + *** PCI/USB/... must be last or else hw agnostic code breaks horribly *** | ||
| 2282 | + *************************************************************************/ | ||
| 2283 | + | ||
| 2284 | + /* hack to let common code compile. FIXME */ | ||
| 2285 | + dma_addr_t rxhostdesc_startphy; | ||
| 2286 | + | ||
| 2287 | + /*** PCI stuff ***/ | ||
| 2288 | +#if defined(ACX_PCI) || defined(ACX_MEM) | ||
| 2289 | + /* pointers to tx buffers, tx host descriptors (in host memory) | ||
| 2290 | + ** and tx descs in device memory */ | ||
| 2291 | + unsigned int tx_tail; | ||
| 2292 | + u8 *txbuf_start; | ||
| 2293 | + txhostdesc_t *txhostdesc_start; | ||
| 2294 | + txdesc_t *txdesc_start; /* points to PCI-mapped memory */ | ||
| 2295 | + dma_addr_t txbuf_startphy; | ||
| 2296 | + dma_addr_t txhostdesc_startphy; | ||
| 2297 | + /* sizes of above host memory areas */ | ||
| 2298 | + unsigned int txbuf_area_size; | ||
| 2299 | + unsigned int txhostdesc_area_size; | ||
| 2300 | + | ||
| 2301 | + unsigned int txdesc_size; /* size of txdesc; ACX111 = ACX100 + 4 */ | ||
| 2302 | + client_t *txc[TX_CNT]; | ||
| 2303 | + u16 txr[TX_CNT]; | ||
| 2304 | + | ||
| 2305 | + /* same for rx */ | ||
| 2306 | + unsigned int rx_tail; | ||
| 2307 | + rxbuffer_t *rxbuf_start; | ||
| 2308 | + rxhostdesc_t *rxhostdesc_start; | ||
| 2309 | + rxdesc_t *rxdesc_start; | ||
| 2310 | + /* physical addresses of above host memory areas */ | ||
| 2311 | + dma_addr_t rxbuf_startphy; | ||
| 2312 | + /* dma_addr_t rxhostdesc_startphy; */ | ||
| 2313 | + unsigned int rxbuf_area_size; | ||
| 2314 | + unsigned int rxhostdesc_area_size; | ||
| 2315 | + | ||
| 2316 | + u8 need_radio_fw; | ||
| 2317 | + u8 irqs_active; /* whether irq sending is activated */ | ||
| 2318 | + | ||
| 2319 | + const u16 *io; /* points to ACX100 or ACX111 PCI I/O register address set */ | ||
| 2320 | + | ||
| 2321 | +#ifdef ACX_PCI | ||
| 2322 | + struct pci_dev *pdev; | ||
| 2323 | +#endif | ||
| 2324 | +#ifdef ACX_MEM | ||
| 2325 | + struct device *dev; | ||
| 2326 | +#endif | ||
| 2327 | + | ||
| 2328 | +#ifdef ACX_PCI | ||
| 2329 | + unsigned long membase; | ||
| 2330 | +#endif | ||
| 2331 | +#ifdef ACX_MEM | ||
| 2332 | + volatile u32 *membase; | ||
| 2333 | +#endif | ||
| 2334 | + unsigned long membase2; | ||
| 2335 | +#ifdef ACX_PCI | ||
| 2336 | + void __iomem *iobase; | ||
| 2337 | +#endif | ||
| 2338 | +#ifdef ACX_MEM | ||
| 2339 | + volatile u32 *iobase; | ||
| 2340 | +#endif | ||
| 2341 | + void __iomem *iobase2; | ||
| 2342 | + /* command interface */ | ||
| 2343 | + u8 __iomem *cmd_area; | ||
| 2344 | + u8 __iomem *info_area; | ||
| 2345 | + | ||
| 2346 | + u16 irq_mask; /* interrupt types to mask out (not wanted) with many IRQs activated */ | ||
| 2347 | + u16 irq_mask_off; /* interrupt types to mask out (not wanted) with IRQs off */ | ||
| 2348 | + unsigned int irq_loops_this_jiffy; | ||
| 2349 | + unsigned long irq_last_jiffies; | ||
| 2350 | +#endif | ||
| 2351 | + | ||
| 2352 | + /*** USB stuff ***/ | ||
| 2353 | +#ifdef ACX_USB | ||
| 2354 | + struct usb_device *usbdev; | ||
| 2355 | + | ||
| 2356 | + rxbuffer_t rxtruncbuf; | ||
| 2357 | + | ||
| 2358 | + usb_tx_t *usb_tx; | ||
| 2359 | + usb_rx_t *usb_rx; | ||
| 2360 | + | ||
| 2361 | + int bulkinep; /* bulk-in endpoint */ | ||
| 2362 | + int bulkoutep; /* bulk-out endpoint */ | ||
| 2363 | + int rxtruncsize; | ||
| 2364 | +#endif | ||
| 2365 | + | ||
| 2366 | +}; | ||
| 2367 | + | ||
| 2368 | +static inline acx_device_t* | ||
| 2369 | +ndev2adev(struct net_device *ndev) | ||
| 2370 | +{ | ||
| 2371 | + return netdev_priv(ndev); | ||
| 2372 | +} | ||
| 2373 | + | ||
| 2374 | + | ||
| 2375 | +/* For use with ACX1xx_IE_RXCONFIG */ | ||
| 2376 | +/* bit description | ||
| 2377 | + * 13 include additional header (length etc.) *required* | ||
| 2378 | + * struct is defined in 'struct rxbuffer' | ||
| 2379 | + * is this bit acx100 only? does acx111 always put the header, | ||
| 2380 | + * and bit setting is irrelevant? --vda | ||
| 2381 | + * 10 receive frames only with SSID used in last join cmd | ||
| 2382 | + * 9 discard broadcast | ||
| 2383 | + * 8 receive packets for multicast address 1 | ||
| 2384 | + * 7 receive packets for multicast address 0 | ||
| 2385 | + * 6 discard all multicast packets | ||
| 2386 | + * 5 discard frames from foreign BSSID | ||
| 2387 | + * 4 discard frames with foreign destination MAC address | ||
| 2388 | + * 3 promiscuous mode (receive ALL frames, disable filter) | ||
| 2389 | + * 2 include FCS | ||
| 2390 | + * 1 include phy header | ||
| 2391 | + * 0 ??? | ||
| 2392 | + */ | ||
| 2393 | +#define RX_CFG1_INCLUDE_RXBUF_HDR 0x2000 /* ACX100 only */ | ||
| 2394 | +#define RX_CFG1_FILTER_SSID 0x0400 | ||
| 2395 | +#define RX_CFG1_FILTER_BCAST 0x0200 | ||
| 2396 | +#define RX_CFG1_RCV_MC_ADDR1 0x0100 | ||
| 2397 | +#define RX_CFG1_RCV_MC_ADDR0 0x0080 | ||
| 2398 | +#define RX_CFG1_FILTER_ALL_MULTI 0x0040 | ||
| 2399 | +#define RX_CFG1_FILTER_BSSID 0x0020 | ||
| 2400 | +#define RX_CFG1_FILTER_MAC 0x0010 | ||
| 2401 | +#define RX_CFG1_RCV_PROMISCUOUS 0x0008 | ||
| 2402 | +#define RX_CFG1_INCLUDE_FCS 0x0004 | ||
| 2403 | +#define RX_CFG1_INCLUDE_PHY_HDR (WANT_PHY_HDR ? 0x0002 : 0) | ||
| 2404 | +/* bit description | ||
| 2405 | + * 11 receive association requests etc. | ||
| 2406 | + * 10 receive authentication frames | ||
| 2407 | + * 9 receive beacon frames | ||
| 2408 | + * 8 receive contention free packets | ||
| 2409 | + * 7 receive control frames | ||
| 2410 | + * 6 receive data frames | ||
| 2411 | + * 5 receive broken frames | ||
| 2412 | + * 4 receive management frames | ||
| 2413 | + * 3 receive probe requests | ||
| 2414 | + * 2 receive probe responses | ||
| 2415 | + * 1 receive RTS/CTS/ACK frames | ||
| 2416 | + * 0 receive other | ||
| 2417 | + */ | ||
| 2418 | +#define RX_CFG2_RCV_ASSOC_REQ 0x0800 | ||
| 2419 | +#define RX_CFG2_RCV_AUTH_FRAMES 0x0400 | ||
| 2420 | +#define RX_CFG2_RCV_BEACON_FRAMES 0x0200 | ||
| 2421 | +#define RX_CFG2_RCV_CONTENTION_FREE 0x0100 | ||
| 2422 | +#define RX_CFG2_RCV_CTRL_FRAMES 0x0080 | ||
| 2423 | +#define RX_CFG2_RCV_DATA_FRAMES 0x0040 | ||
| 2424 | +#define RX_CFG2_RCV_BROKEN_FRAMES 0x0020 | ||
| 2425 | +#define RX_CFG2_RCV_MGMT_FRAMES 0x0010 | ||
| 2426 | +#define RX_CFG2_RCV_PROBE_REQ 0x0008 | ||
| 2427 | +#define RX_CFG2_RCV_PROBE_RESP 0x0004 | ||
| 2428 | +#define RX_CFG2_RCV_ACK_FRAMES 0x0002 | ||
| 2429 | +#define RX_CFG2_RCV_OTHER 0x0001 | ||
| 2430 | + | ||
| 2431 | +/* For use with ACX1xx_IE_FEATURE_CONFIG */ | ||
| 2432 | +#define FEATURE1_80MHZ_CLOCK 0x00000040L | ||
| 2433 | +#define FEATURE1_4X 0x00000020L | ||
| 2434 | +#define FEATURE1_LOW_RX 0x00000008L | ||
| 2435 | +#define FEATURE1_EXTRA_LOW_RX 0x00000001L | ||
| 2436 | + | ||
| 2437 | +#define FEATURE2_SNIFFER 0x00000080L | ||
| 2438 | +#define FEATURE2_NO_TXCRYPT 0x00000001L | ||
| 2439 | + | ||
| 2440 | +/*-- get and set mask values --*/ | ||
| 2441 | +#define GETSET_LED_POWER 0x00000001L | ||
| 2442 | +#define GETSET_STATION_ID 0x00000002L | ||
| 2443 | +#define SET_TEMPLATES 0x00000004L | ||
| 2444 | +#define SET_STA_LIST 0x00000008L | ||
| 2445 | +#define GETSET_TX 0x00000010L | ||
| 2446 | +#define GETSET_RX 0x00000020L | ||
| 2447 | +#define SET_RXCONFIG 0x00000040L | ||
| 2448 | +#define GETSET_ANTENNA 0x00000080L | ||
| 2449 | +#define GETSET_SENSITIVITY 0x00000100L | ||
| 2450 | +#define GETSET_TXPOWER 0x00000200L | ||
| 2451 | +#define GETSET_ED_THRESH 0x00000400L | ||
| 2452 | +#define GETSET_CCA 0x00000800L | ||
| 2453 | +#define GETSET_POWER_80211 0x00001000L | ||
| 2454 | +#define GETSET_RETRY 0x00002000L | ||
| 2455 | +#define GETSET_REG_DOMAIN 0x00004000L | ||
| 2456 | +#define GETSET_CHANNEL 0x00008000L | ||
| 2457 | +/* Used when ESSID changes etc and we need to scan for AP anew */ | ||
| 2458 | +#define GETSET_RESCAN 0x00010000L | ||
| 2459 | +#define GETSET_MODE 0x00020000L | ||
| 2460 | +#define GETSET_WEP 0x00040000L | ||
| 2461 | +#define SET_WEP_OPTIONS 0x00080000L | ||
| 2462 | +#define SET_MSDU_LIFETIME 0x00100000L | ||
| 2463 | +#define SET_RATE_FALLBACK 0x00200000L | ||
| 2464 | + | ||
| 2465 | +/* keep in sync with the above */ | ||
| 2466 | +#define GETSET_ALL (0 \ | ||
| 2467 | +/* GETSET_LED_POWER */ | 0x00000001L \ | ||
| 2468 | +/* GETSET_STATION_ID */ | 0x00000002L \ | ||
| 2469 | +/* SET_TEMPLATES */ | 0x00000004L \ | ||
| 2470 | +/* SET_STA_LIST */ | 0x00000008L \ | ||
| 2471 | +/* GETSET_TX */ | 0x00000010L \ | ||
| 2472 | +/* GETSET_RX */ | 0x00000020L \ | ||
| 2473 | +/* SET_RXCONFIG */ | 0x00000040L \ | ||
| 2474 | +/* GETSET_ANTENNA */ | 0x00000080L \ | ||
| 2475 | +/* GETSET_SENSITIVITY */| 0x00000100L \ | ||
| 2476 | +/* GETSET_TXPOWER */ | 0x00000200L \ | ||
| 2477 | +/* GETSET_ED_THRESH */ | 0x00000400L \ | ||
| 2478 | +/* GETSET_CCA */ | 0x00000800L \ | ||
| 2479 | +/* GETSET_POWER_80211 */| 0x00001000L \ | ||
| 2480 | +/* GETSET_RETRY */ | 0x00002000L \ | ||
| 2481 | +/* GETSET_REG_DOMAIN */ | 0x00004000L \ | ||
| 2482 | +/* GETSET_CHANNEL */ | 0x00008000L \ | ||
| 2483 | +/* GETSET_RESCAN */ | 0x00010000L \ | ||
| 2484 | +/* GETSET_MODE */ | 0x00020000L \ | ||
| 2485 | +/* GETSET_WEP */ | 0x00040000L \ | ||
| 2486 | +/* SET_WEP_OPTIONS */ | 0x00080000L \ | ||
| 2487 | +/* SET_MSDU_LIFETIME */ | 0x00100000L \ | ||
| 2488 | +/* SET_RATE_FALLBACK */ | 0x00200000L \ | ||
| 2489 | + ) | ||
| 2490 | + | ||
| 2491 | + | ||
| 2492 | +/*********************************************************************** | ||
| 2493 | +** Firmware loading | ||
| 2494 | +*/ | ||
| 2495 | +#include <linux/firmware.h> /* request_firmware() */ | ||
| 2496 | +#include <linux/pci.h> /* struct pci_device */ | ||
| 2497 | + | ||
| 2498 | + | ||
| 2499 | +/*********************************************************************** | ||
| 2500 | +*/ | ||
| 2501 | +typedef struct acx100_ie_memblocksize { | ||
| 2502 | + u16 type; | ||
| 2503 | + u16 len; | ||
| 2504 | + u16 size; | ||
| 2505 | +} ACX_PACKED acx100_ie_memblocksize_t; | ||
| 2506 | + | ||
| 2507 | +typedef struct acx100_ie_queueconfig { | ||
| 2508 | + u16 type; | ||
| 2509 | + u16 len; | ||
| 2510 | + u32 AreaSize; | ||
| 2511 | + u32 RxQueueStart; | ||
| 2512 | + u8 QueueOptions; | ||
| 2513 | + u8 NumTxQueues; | ||
| 2514 | + u8 NumRxDesc; /* for USB only */ | ||
| 2515 | + u8 pad1; | ||
| 2516 | + u32 QueueEnd; | ||
| 2517 | + u32 HostQueueEnd; /* QueueEnd2 */ | ||
| 2518 | + u32 TxQueueStart; | ||
| 2519 | + u8 TxQueuePri; | ||
| 2520 | + u8 NumTxDesc; | ||
| 2521 | + u16 pad2; | ||
| 2522 | +} ACX_PACKED acx100_ie_queueconfig_t; | ||
| 2523 | + | ||
| 2524 | +typedef struct acx111_ie_queueconfig { | ||
| 2525 | + u16 type; | ||
| 2526 | + u16 len; | ||
| 2527 | + u32 tx_memory_block_address; | ||
| 2528 | + u32 rx_memory_block_address; | ||
| 2529 | + u32 rx1_queue_address; | ||
| 2530 | + u32 reserved1; | ||
| 2531 | + u32 tx1_queue_address; | ||
| 2532 | + u8 tx1_attributes; | ||
| 2533 | + u16 reserved2; | ||
| 2534 | + u8 reserved3; | ||
| 2535 | +} ACX_PACKED acx111_ie_queueconfig_t; | ||
| 2536 | + | ||
| 2537 | +typedef struct acx100_ie_memconfigoption { | ||
| 2538 | + u16 type; | ||
| 2539 | + u16 len; | ||
| 2540 | + u32 DMA_config; | ||
| 2541 | + acx_ptr pRxHostDesc; | ||
| 2542 | + u32 rx_mem; | ||
| 2543 | + u32 tx_mem; | ||
| 2544 | + u16 RxBlockNum; | ||
| 2545 | + u16 TxBlockNum; | ||
| 2546 | +} ACX_PACKED acx100_ie_memconfigoption_t; | ||
| 2547 | + | ||
| 2548 | +typedef struct acx111_ie_memoryconfig { | ||
| 2549 | + u16 type; | ||
| 2550 | + u16 len; | ||
| 2551 | + u16 no_of_stations; | ||
| 2552 | + u16 memory_block_size; | ||
| 2553 | + u8 tx_rx_memory_block_allocation; | ||
| 2554 | + u8 count_rx_queues; | ||
| 2555 | + u8 count_tx_queues; | ||
| 2556 | + u8 options; | ||
| 2557 | + u8 fragmentation; | ||
| 2558 | + u16 reserved1; | ||
| 2559 | + u8 reserved2; | ||
| 2560 | + | ||
| 2561 | + /* start of rx1 block */ | ||
| 2562 | + u8 rx_queue1_count_descs; | ||
| 2563 | + u8 rx_queue1_reserved1; | ||
| 2564 | + u8 rx_queue1_type; /* must be set to 7 */ | ||
| 2565 | + u8 rx_queue1_prio; /* must be set to 0 */ | ||
| 2566 | + acx_ptr rx_queue1_host_rx_start; | ||
| 2567 | + /* end of rx1 block */ | ||
| 2568 | + | ||
| 2569 | + /* start of tx1 block */ | ||
| 2570 | + u8 tx_queue1_count_descs; | ||
| 2571 | + u8 tx_queue1_reserved1; | ||
| 2572 | + u8 tx_queue1_reserved2; | ||
| 2573 | + u8 tx_queue1_attributes; | ||
| 2574 | + /* end of tx1 block */ | ||
| 2575 | +} ACX_PACKED acx111_ie_memoryconfig_t; | ||
| 2576 | + | ||
| 2577 | +typedef struct acx_ie_memmap { | ||
| 2578 | + u16 type; | ||
| 2579 | + u16 len; | ||
| 2580 | + u32 CodeStart; | ||
| 2581 | + u32 CodeEnd; | ||
| 2582 | + u32 WEPCacheStart; | ||
| 2583 | + u32 WEPCacheEnd; | ||
| 2584 | + u32 PacketTemplateStart; | ||
| 2585 | + u32 PacketTemplateEnd; | ||
| 2586 | + u32 QueueStart; | ||
| 2587 | + u32 QueueEnd; | ||
| 2588 | + u32 PoolStart; | ||
| 2589 | + u32 PoolEnd; | ||
| 2590 | +} ACX_PACKED acx_ie_memmap_t; | ||
| 2591 | + | ||
| 2592 | +typedef struct acx111_ie_feature_config { | ||
| 2593 | + u16 type; | ||
| 2594 | + u16 len; | ||
| 2595 | + u32 feature_options; | ||
| 2596 | + u32 data_flow_options; | ||
| 2597 | +} ACX_PACKED acx111_ie_feature_config_t; | ||
| 2598 | + | ||
| 2599 | +typedef struct acx111_ie_tx_level { | ||
| 2600 | + u16 type; | ||
| 2601 | + u16 len; | ||
| 2602 | + u8 level; | ||
| 2603 | +} ACX_PACKED acx111_ie_tx_level_t; | ||
| 2604 | + | ||
| 2605 | +#define PS_CFG_ENABLE 0x80 | ||
| 2606 | +#define PS_CFG_PENDING 0x40 /* status flag when entering PS */ | ||
| 2607 | +#define PS_CFG_WAKEUP_MODE_MASK 0x07 | ||
| 2608 | +#define PS_CFG_WAKEUP_BY_HOST 0x03 | ||
| 2609 | +#define PS_CFG_WAKEUP_EACH_ITVL 0x02 | ||
| 2610 | +#define PS_CFG_WAKEUP_ON_DTIM 0x01 | ||
| 2611 | +#define PS_CFG_WAKEUP_ALL_BEAC 0x00 | ||
| 2612 | + | ||
| 2613 | +/* Enhanced PS mode: sleep until Rx Beacon w/ the STA's AID bit set | ||
| 2614 | +** in the TIM; newer firmwares only(?) */ | ||
| 2615 | +#define PS_OPT_ENA_ENHANCED_PS 0x04 | ||
| 2616 | +#define PS_OPT_TX_PSPOLL 0x02 /* send PSPoll frame to fetch waiting frames from AP (on frame with matching AID) */ | ||
| 2617 | +#define PS_OPT_STILL_RCV_BCASTS 0x01 | ||
| 2618 | + | ||
| 2619 | +typedef struct acx100_ie_powersave { | ||
| 2620 | + u16 type; | ||
| 2621 | + u16 len; | ||
| 2622 | + u8 wakeup_cfg; | ||
| 2623 | + u8 listen_interval; /* for EACH_ITVL: wake up every "beacon units" interval */ | ||
| 2624 | + u8 options; | ||
| 2625 | + u8 hangover_period; /* remaining wake time after Tx MPDU w/ PS bit, in values of 1/1024 seconds */ | ||
| 2626 | + u16 enhanced_ps_transition_time; /* rem. wake time for Enh. PS */ | ||
| 2627 | +} ACX_PACKED acx100_ie_powersave_t; | ||
| 2628 | + | ||
| 2629 | +typedef struct acx111_ie_powersave { | ||
| 2630 | + u16 type; | ||
| 2631 | + u16 len; | ||
| 2632 | + u8 wakeup_cfg; | ||
| 2633 | + u8 listen_interval; /* for EACH_ITVL: wake up every "beacon units" interval */ | ||
| 2634 | + u8 options; | ||
| 2635 | + u8 hangover_period; /* remaining wake time after Tx MPDU w/ PS bit, in values of 1/1024 seconds */ | ||
| 2636 | + u32 beacon_rx_time; | ||
| 2637 | + u32 enhanced_ps_transition_time; /* rem. wake time for Enh. PS */ | ||
| 2638 | +} ACX_PACKED acx111_ie_powersave_t; | ||
| 2639 | + | ||
| 2640 | + | ||
| 2641 | +/*********************************************************************** | ||
| 2642 | +** Commands and template structures | ||
| 2643 | +*/ | ||
| 2644 | + | ||
| 2645 | +/* | ||
| 2646 | +** SCAN command structure | ||
| 2647 | +** | ||
| 2648 | +** even though acx100 scan rates match RATE100 constants, | ||
| 2649 | +** acx111 ones do not match! Therefore we do not use RATE100 #defines */ | ||
| 2650 | +#define ACX_SCAN_RATE_1 10 | ||
| 2651 | +#define ACX_SCAN_RATE_2 20 | ||
| 2652 | +#define ACX_SCAN_RATE_5 55 | ||
| 2653 | +#define ACX_SCAN_RATE_11 110 | ||
| 2654 | +#define ACX_SCAN_RATE_22 220 | ||
| 2655 | +#define ACX_SCAN_RATE_PBCC 0x80 /* OR with this if needed */ | ||
| 2656 | +#define ACX_SCAN_OPT_ACTIVE 0x00 /* a bit mask */ | ||
| 2657 | +#define ACX_SCAN_OPT_PASSIVE 0x01 | ||
| 2658 | +/* Background scan: we go into Power Save mode (by transmitting | ||
| 2659 | +** NULL data frame to AP with the power mgmt bit set), do the scan, | ||
| 2660 | +** and then exit Power Save mode. A plus is that AP buffers frames | ||
| 2661 | +** for us while we do background scan. Thus we avoid frame losses. | ||
| 2662 | +** Background scan can be active or passive, just like normal one */ | ||
| 2663 | +#define ACX_SCAN_OPT_BACKGROUND 0x02 | ||
| 2664 | +typedef struct acx100_scan { | ||
| 2665 | + u16 count; /* number of scans to do, 0xffff == continuous */ | ||
| 2666 | + u16 start_chan; | ||
| 2667 | + u16 flags; /* channel list mask; 0x8000 == all channels? */ | ||
| 2668 | + u8 max_rate; /* max. probe rate */ | ||
| 2669 | + u8 options; /* bit mask, see defines above */ | ||
| 2670 | + u16 chan_duration; | ||
| 2671 | + u16 max_probe_delay; | ||
| 2672 | +} ACX_PACKED acx100_scan_t; /* length 0xc */ | ||
| 2673 | + | ||
| 2674 | +#define ACX111_SCAN_RATE_6 0x0B | ||
| 2675 | +#define ACX111_SCAN_RATE_9 0x0F | ||
| 2676 | +#define ACX111_SCAN_RATE_12 0x0A | ||
| 2677 | +#define ACX111_SCAN_RATE_18 0x0E | ||
| 2678 | +#define ACX111_SCAN_RATE_24 0x09 | ||
| 2679 | +#define ACX111_SCAN_RATE_36 0x0D | ||
| 2680 | +#define ACX111_SCAN_RATE_48 0x08 | ||
| 2681 | +#define ACX111_SCAN_RATE_54 0x0C | ||
| 2682 | +#define ACX111_SCAN_OPT_5GHZ 0x04 /* else 2.4GHZ */ | ||
| 2683 | +#define ACX111_SCAN_MOD_SHORTPRE 0x01 /* you can combine SHORTPRE and PBCC */ | ||
| 2684 | +#define ACX111_SCAN_MOD_PBCC 0x80 | ||
| 2685 | +#define ACX111_SCAN_MOD_OFDM 0x40 | ||
| 2686 | +typedef struct acx111_scan { | ||
| 2687 | + u16 count; /* number of scans to do */ | ||
| 2688 | + u8 channel_list_select; /* 0: scan all channels, 1: from chan_list only */ | ||
| 2689 | + u16 reserved1; | ||
| 2690 | + u8 reserved2; | ||
| 2691 | + u8 rate; /* rate for probe requests (if active scan) */ | ||
| 2692 | + u8 options; /* bit mask, see defines above */ | ||
| 2693 | + u16 chan_duration; /* min time to wait for reply on one channel (in TU) */ | ||
| 2694 | + /* (active scan only) (802.11 section 11.1.3.2.2) */ | ||
| 2695 | + u16 max_probe_delay; /* max time to wait for reply on one channel (active scan) */ | ||
| 2696 | + /* time to listen on a channel (passive scan) */ | ||
| 2697 | + u8 modulation; | ||
| 2698 | + u8 channel_list[26]; /* bits 7:0 first byte: channels 8:1 */ | ||
| 2699 | + /* bits 7:0 second byte: channels 16:9 */ | ||
| 2700 | + /* 26 bytes is enough to cover 802.11a */ | ||
| 2701 | +} ACX_PACKED acx111_scan_t; | ||
| 2702 | + | ||
| 2703 | + | ||
| 2704 | +/* | ||
| 2705 | +** Radio calibration command structure | ||
| 2706 | +*/ | ||
| 2707 | +typedef struct acx111_cmd_radiocalib { | ||
| 2708 | +/* 0x80000000 == automatic calibration by firmware, according to interval; | ||
| 2709 | + * bits 0..3: select calibration methods to go through: | ||
| 2710 | + * calib based on DC, AfeDC, Tx mismatch, Tx equilization */ | ||
| 2711 | + u32 methods; | ||
| 2712 | + u32 interval; | ||
| 2713 | +} ACX_PACKED acx111_cmd_radiocalib_t; | ||
| 2714 | + | ||
| 2715 | + | ||
| 2716 | +/* | ||
| 2717 | +** Packet template structures | ||
| 2718 | +** | ||
| 2719 | +** Packet templates store contents of Beacon, Probe response, Probe request, | ||
| 2720 | +** Null data frame, and TIM data frame. Firmware automatically transmits | ||
| 2721 | +** contents of template at appropriate time: | ||
| 2722 | +** - Beacon: when configured as AP or Ad-hoc | ||
| 2723 | +** - Probe response: when configured as AP or Ad-hoc, whenever | ||
| 2724 | +** a Probe request frame is received | ||
| 2725 | +** - Probe request: when host issues SCAN command (active) | ||
| 2726 | +** - Null data frame: when entering 802.11 power save mode | ||
| 2727 | +** - TIM data: at the end of Beacon frames (if no TIM template | ||
| 2728 | +** is configured, then transmits default TIM) | ||
| 2729 | +** NB: | ||
| 2730 | +** - size field must be set to size of actual template | ||
| 2731 | +** (NOT sizeof(struct) - templates are variable in length), | ||
| 2732 | +** size field is not itself counted. | ||
| 2733 | +** - members flagged with an asterisk must be initialized with host, | ||
| 2734 | +** rest must be zero filled. | ||
| 2735 | +** - variable length fields shown only in comments */ | ||
| 2736 | +typedef struct acx_template_tim { | ||
| 2737 | + u16 size; | ||
| 2738 | + u8 tim_eid; /* 00 1 TIM IE ID * */ | ||
| 2739 | + u8 len; /* 01 1 Length * */ | ||
| 2740 | + u8 dtim_cnt; /* 02 1 DTIM Count */ | ||
| 2741 | + u8 dtim_period; /* 03 1 DTIM Period */ | ||
| 2742 | + u8 bitmap_ctrl; /* 04 1 Bitmap Control * (except bit0) */ | ||
| 2743 | + /* 05 n Partial Virtual Bitmap * */ | ||
| 2744 | + u8 variable[0x100 - 1-1-1-1-1]; | ||
| 2745 | +} ACX_PACKED acx_template_tim_t; | ||
| 2746 | + | ||
| 2747 | +typedef struct acx_template_probereq { | ||
| 2748 | + u16 size; | ||
| 2749 | + u16 fc; /* 00 2 fc * */ | ||
| 2750 | + u16 dur; /* 02 2 Duration */ | ||
| 2751 | + u8 da[6]; /* 04 6 Destination Address * */ | ||
| 2752 | + u8 sa[6]; /* 0A 6 Source Address * */ | ||
| 2753 | + u8 bssid[6]; /* 10 6 BSSID * */ | ||
| 2754 | + u16 seq; /* 16 2 Sequence Control */ | ||
| 2755 | + /* 18 n SSID * */ | ||
| 2756 | + /* nn n Supported Rates * */ | ||
| 2757 | + u8 variable[0x44 - 2-2-6-6-6-2]; | ||
| 2758 | +} ACX_PACKED acx_template_probereq_t; | ||
| 2759 | + | ||
| 2760 | +typedef struct acx_template_proberesp { | ||
| 2761 | + u16 size; | ||
| 2762 | + u16 fc; /* 00 2 fc * (bits [15:12] and [10:8] per 802.11 section 7.1.3.1) */ | ||
| 2763 | + u16 dur; /* 02 2 Duration */ | ||
| 2764 | + u8 da[6]; /* 04 6 Destination Address */ | ||
| 2765 | + u8 sa[6]; /* 0A 6 Source Address */ | ||
| 2766 | + u8 bssid[6]; /* 10 6 BSSID */ | ||
| 2767 | + u16 seq; /* 16 2 Sequence Control */ | ||
| 2768 | + u8 timestamp[8];/* 18 8 Timestamp */ | ||
| 2769 | + u16 beacon_interval; /* 20 2 Beacon Interval * */ | ||
| 2770 | + u16 cap; /* 22 2 Capability Information * */ | ||
| 2771 | + /* 24 n SSID * */ | ||
| 2772 | + /* nn n Supported Rates * */ | ||
| 2773 | + /* nn 1 DS Parameter Set * */ | ||
| 2774 | + u8 variable[0x54 - 2-2-6-6-6-2-8-2-2]; | ||
| 2775 | +} ACX_PACKED acx_template_proberesp_t; | ||
| 2776 | +#define acx_template_beacon_t acx_template_proberesp_t | ||
| 2777 | +#define acx_template_beacon acx_template_proberesp | ||
| 2778 | + | ||
| 2779 | +typedef struct acx_template_nullframe { | ||
| 2780 | + u16 size; | ||
| 2781 | + struct wlan_hdr_a3 hdr; | ||
| 2782 | +} ACX_PACKED acx_template_nullframe_t; | ||
| 2783 | + | ||
| 2784 | + | ||
| 2785 | +/* | ||
| 2786 | +** JOIN command structure | ||
| 2787 | +** | ||
| 2788 | +** as opposed to acx100, acx111 dtim interval is AFTER rates_basic111. | ||
| 2789 | +** NOTE: took me about an hour to get !@#$%^& packing right --> struct packing is eeeeevil... */ | ||
| 2790 | +typedef struct acx_joinbss { | ||
| 2791 | + u8 bssid[ETH_ALEN]; | ||
| 2792 | + u16 beacon_interval; | ||
| 2793 | + union { | ||
| 2794 | + struct { | ||
| 2795 | + u8 dtim_interval; | ||
| 2796 | + u8 rates_basic; | ||
| 2797 | + u8 rates_supported; | ||
| 2798 | + /* | ||
| 2799 | + * ARM compiler doesn't pack correctly unless unions | ||
| 2800 | + * inside structures are multiples of 4 bytes. Ugh. | ||
| 2801 | + */ | ||
| 2802 | + u8 genfrm_txrate; /* generated frame (bcn, proberesp, RTS, PSpoll) tx rate */ | ||
| 2803 | + } ACX_PACKED acx100; | ||
| 2804 | + struct { | ||
| 2805 | + u16 rates_basic; | ||
| 2806 | + u8 dtim_interval; | ||
| 2807 | + u8 genfrm_txrate; /* generated frame (bcn, proberesp, RTS, PSpoll) tx rate */ | ||
| 2808 | + } ACX_PACKED acx111; | ||
| 2809 | + /* | ||
| 2810 | + * ARM compiler doesn't pack correctly unles unions are aligned on | ||
| 2811 | + * 4 byte boundaries and are multiples of 4 bytes. | ||
| 2812 | + */ | ||
| 2813 | + struct { | ||
| 2814 | + u8 d1; | ||
| 2815 | + u8 d2; | ||
| 2816 | + u8 d3; | ||
| 2817 | + u8 genfrm_txrate; | ||
| 2818 | + } ACX_PACKED txrate; | ||
| 2819 | + } ACX_PACKED u; | ||
| 2820 | + u8 genfrm_mod_pre; /* generated frame modulation/preamble: | ||
| 2821 | + ** bit7: PBCC, bit6: OFDM (else CCK/DQPSK/DBPSK) | ||
| 2822 | + ** bit5: short pre */ | ||
| 2823 | + u8 macmode; /* BSS Type, must be one of ACX_MODE_xxx */ | ||
| 2824 | + u8 channel; | ||
| 2825 | + u8 essid_len; | ||
| 2826 | + char essid[IW_ESSID_MAX_SIZE]; | ||
| 2827 | +} ACX_PACKED acx_joinbss_t; | ||
| 2828 | + | ||
| 2829 | +#define JOINBSS_RATES_1 0x01 | ||
| 2830 | +#define JOINBSS_RATES_2 0x02 | ||
| 2831 | +#define JOINBSS_RATES_5 0x04 | ||
| 2832 | +#define JOINBSS_RATES_11 0x08 | ||
| 2833 | +#define JOINBSS_RATES_22 0x10 | ||
| 2834 | + | ||
| 2835 | +/* Looks like missing bits are used to indicate 11g rates! | ||
| 2836 | +** (it follows from the fact that constants below match 1:1 to RATE111_nn) | ||
| 2837 | +** This was actually seen! Look at that Assoc Request sent by acx111, | ||
| 2838 | +** it _does_ contain 11g rates in basic set: | ||
| 2839 | +01:30:20.070772 Beacon (xxx) [1.0* 2.0* 5.5* 11.0* 6.0* 9.0* 12.0* 18.0* 24.0* 36.0* 48.0* 54.0* Mbit] ESS CH: 1 | ||
| 2840 | +01:30:20.074425 Authentication (Open System)-1: Succesful | ||
| 2841 | +01:30:20.076539 Authentication (Open System)-2: | ||
| 2842 | +01:30:20.076620 Acknowledgment | ||
| 2843 | +01:30:20.088546 Assoc Request (xxx) [1.0* 2.0* 5.5* 6.0* 9.0* 11.0* 12.0* 18.0* 24.0* 36.0* 48.0* 54.0* Mbit] | ||
| 2844 | +01:30:20.122413 Assoc Response AID(1) :: Succesful | ||
| 2845 | +01:30:20.122679 Acknowledgment | ||
| 2846 | +01:30:20.173204 Beacon (xxx) [1.0* 2.0* 5.5* 11.0* 6.0* 9.0* 12.0* 18.0* 24.0* 36.0* 48.0* 54.0* Mbit] ESS CH: 1 | ||
| 2847 | +*/ | ||
| 2848 | +#define JOINBSS_RATES_BASIC111_1 0x0001 | ||
| 2849 | +#define JOINBSS_RATES_BASIC111_2 0x0002 | ||
| 2850 | +#define JOINBSS_RATES_BASIC111_5 0x0004 | ||
| 2851 | +#define JOINBSS_RATES_BASIC111_11 0x0020 | ||
| 2852 | +#define JOINBSS_RATES_BASIC111_22 0x0100 | ||
| 2853 | + | ||
| 2854 | + | ||
| 2855 | +/*********************************************************************** | ||
| 2856 | +*/ | ||
| 2857 | +typedef struct mem_read_write { | ||
| 2858 | + u16 addr; | ||
| 2859 | + u16 type; /* 0x0 int. RAM / 0xffff MAC reg. / 0x81 PHY RAM / 0x82 PHY reg.; or maybe it's actually 0x30 for MAC? Better verify it by writing and reading back and checking whether the value holds! */ | ||
| 2860 | + u32 len; | ||
| 2861 | + u32 data; | ||
| 2862 | +} ACX_PACKED mem_read_write_t; | ||
| 2863 | + | ||
| 2864 | +typedef struct firmware_image { | ||
| 2865 | + u32 chksum; | ||
| 2866 | + u32 size; | ||
| 2867 | + u8 data[1]; /* the byte array of the actual firmware... */ | ||
| 2868 | +} ACX_PACKED firmware_image_t; | ||
| 2869 | + | ||
| 2870 | +typedef struct acx_cmd_radioinit { | ||
| 2871 | + u32 offset; | ||
| 2872 | + u32 len; | ||
| 2873 | +} ACX_PACKED acx_cmd_radioinit_t; | ||
| 2874 | + | ||
| 2875 | +typedef struct acx100_ie_wep_options { | ||
| 2876 | + u16 type; | ||
| 2877 | + u16 len; | ||
| 2878 | + u16 NumKeys; /* max # of keys */ | ||
| 2879 | + u8 WEPOption; /* 0 == decrypt default key only, 1 == override decrypt */ | ||
| 2880 | + u8 Pad; /* used only for acx111 */ | ||
| 2881 | +} ACX_PACKED acx100_ie_wep_options_t; | ||
| 2882 | + | ||
| 2883 | +typedef struct ie_dot11WEPDefaultKey { | ||
| 2884 | + u16 type; | ||
| 2885 | + u16 len; | ||
| 2886 | + u8 action; | ||
| 2887 | + u8 keySize; | ||
| 2888 | + u8 defaultKeyNum; | ||
| 2889 | + u8 key[29]; /* check this! was Key[19] */ | ||
| 2890 | +} ACX_PACKED ie_dot11WEPDefaultKey_t; | ||
| 2891 | + | ||
| 2892 | +typedef struct acx111WEPDefaultKey { | ||
| 2893 | + u8 MacAddr[ETH_ALEN]; | ||
| 2894 | + u16 action; /* NOTE: this is a u16, NOT a u8!! */ | ||
| 2895 | + u16 reserved; | ||
| 2896 | + u8 keySize; | ||
| 2897 | + u8 type; | ||
| 2898 | + u8 index; | ||
| 2899 | + u8 defaultKeyNum; | ||
| 2900 | + u8 counter[6]; | ||
| 2901 | + u8 key[32]; /* up to 32 bytes (for TKIP!) */ | ||
| 2902 | +} ACX_PACKED acx111WEPDefaultKey_t; | ||
| 2903 | + | ||
| 2904 | +typedef struct ie_dot11WEPDefaultKeyID { | ||
| 2905 | + u16 type; | ||
| 2906 | + u16 len; | ||
| 2907 | + u8 KeyID; | ||
| 2908 | +} ACX_PACKED ie_dot11WEPDefaultKeyID_t; | ||
| 2909 | + | ||
| 2910 | +typedef struct acx100_cmd_wep_mgmt { | ||
| 2911 | + u8 MacAddr[ETH_ALEN]; | ||
| 2912 | + u16 Action; | ||
| 2913 | + u16 KeySize; | ||
| 2914 | + u8 Key[29]; /* 29*8 == 232bits == WEP256 */ | ||
| 2915 | +} ACX_PACKED acx100_cmd_wep_mgmt_t; | ||
| 2916 | + | ||
| 2917 | +typedef struct acx_ie_generic { | ||
| 2918 | + u16 type; | ||
| 2919 | + u16 len; | ||
| 2920 | + union { | ||
| 2921 | + /* Association ID IE: just a 16bit value: */ | ||
| 2922 | + u16 aid; | ||
| 2923 | + /* generic member for quick implementation of commands */ | ||
| 2924 | + u8 bytes[32]; | ||
| 2925 | + } ACX_PACKED m; | ||
| 2926 | +} ACX_PACKED acx_ie_generic_t; | ||
| 2927 | + | ||
| 2928 | +/*********************************************************************** | ||
| 2929 | +*/ | ||
| 2930 | +#define CHECK_SIZEOF(type,size) { \ | ||
| 2931 | + extern void BUG_bad_size_for_##type(void); \ | ||
| 2932 | + if (sizeof(type)!=(size)) BUG_bad_size_for_##type(); \ | ||
| 2933 | +} | ||
| 2934 | + | ||
| 2935 | +static inline void | ||
| 2936 | +acx_struct_size_check(void) | ||
| 2937 | +{ | ||
| 2938 | + CHECK_SIZEOF(txdesc_t, 0x30); | ||
| 2939 | + CHECK_SIZEOF(acx100_ie_memconfigoption_t, 24); | ||
| 2940 | + CHECK_SIZEOF(acx100_ie_queueconfig_t, 0x20); | ||
| 2941 | + CHECK_SIZEOF(acx_joinbss_t, 0x30); | ||
| 2942 | + /* IEs need 4 bytes for (type,len) tuple */ | ||
| 2943 | + CHECK_SIZEOF(acx111_ie_configoption_t, ACX111_IE_CONFIG_OPTIONS_LEN + 4); | ||
| 2944 | +} | ||
| 2945 | + | ||
| 2946 | + | ||
| 2947 | +/*********************************************************************** | ||
| 2948 | +** Global data | ||
| 2949 | +*/ | ||
| 2950 | +extern const u8 acx_bitpos2ratebyte[]; | ||
| 2951 | +extern const u8 acx_bitpos2rate100[]; | ||
| 2952 | + | ||
| 2953 | +extern const u8 acx_reg_domain_ids[]; | ||
| 2954 | +extern const char * const acx_reg_domain_strings[]; | ||
| 2955 | +enum { | ||
| 2956 | + acx_reg_domain_ids_len = 8 | ||
| 2957 | +}; | ||
| 2958 | + | ||
| 2959 | +extern const struct iw_handler_def acx_ioctl_handler_def; | ||
| 2960 | Index: linux-2.6.23/drivers/net/wireless/acx/common.c | ||
| 2961 | =================================================================== | ||
| 2962 | --- /dev/null 1970-01-01 00:00:00.000000000 +0000 | ||
| 2963 | +++ linux-2.6.23/drivers/net/wireless/acx/common.c 2008-01-20 21:13:40.000000000 +0000 | ||
| 2964 | @@ -0,0 +1,7388 @@ | ||
| 2965 | +/*********************************************************************** | ||
| 2966 | +** Copyright (C) 2003 ACX100 Open Source Project | ||
| 2967 | +** | ||
| 2968 | +** The contents of this file are subject to the Mozilla Public | ||
| 2969 | +** License Version 1.1 (the "License"); you may not use this file | ||
| 2970 | +** except in compliance with the License. You may obtain a copy of | ||
| 2971 | +** the License at http://www.mozilla.org/MPL/ | ||
| 2972 | +** | ||
| 2973 | +** Software distributed under the License is distributed on an "AS | ||
| 2974 | +** IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or | ||
| 2975 | +** implied. See the License for the specific language governing | ||
| 2976 | +** rights and limitations under the License. | ||
| 2977 | +** | ||
| 2978 | +** Alternatively, the contents of this file may be used under the | ||
| 2979 | +** terms of the GNU Public License version 2 (the "GPL"), in which | ||
| 2980 | +** case the provisions of the GPL are applicable instead of the | ||
| 2981 | +** above. If you wish to allow the use of your version of this file | ||
| 2982 | +** only under the terms of the GPL and not to allow others to use | ||
| 2983 | +** your version of this file under the MPL, indicate your decision | ||
| 2984 | +** by deleting the provisions above and replace them with the notice | ||
| 2985 | +** and other provisions required by the GPL. If you do not delete | ||
| 2986 | +** the provisions above, a recipient may use your version of this | ||
| 2987 | +** file under either the MPL or the GPL. | ||
| 2988 | +** --------------------------------------------------------------------- | ||
| 2989 | +** Inquiries regarding the ACX100 Open Source Project can be | ||
| 2990 | +** made directly to: | ||
| 2991 | +** | ||
| 2992 | +** acx100-users@lists.sf.net | ||
| 2993 | +** http://acx100.sf.net | ||
| 2994 | +** --------------------------------------------------------------------- | ||
| 2995 | +*/ | ||
| 2996 | + | ||
| 2997 | +#include <linux/version.h> | ||
| 2998 | +#if LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 18) | ||
| 2999 | +#include <linux/config.h> | ||
| 3000 | +#endif | ||
| 3001 | +#include <linux/module.h> | ||
| 3002 | +#include <linux/kernel.h> | ||
| 3003 | +#include <linux/sched.h> | ||
| 3004 | +#include <linux/types.h> | ||
| 3005 | +#include <linux/slab.h> | ||
| 3006 | +#include <linux/delay.h> | ||
| 3007 | +#include <linux/proc_fs.h> | ||
| 3008 | +#include <linux/if_arp.h> | ||
| 3009 | +#include <linux/rtnetlink.h> | ||
| 3010 | +#include <linux/netdevice.h> | ||
| 3011 | +#include <linux/etherdevice.h> | ||
| 3012 | +#include <linux/wireless.h> | ||
| 3013 | +#include <linux/pm.h> | ||
| 3014 | +#include <linux/vmalloc.h> | ||
| 3015 | +#include <net/iw_handler.h> | ||
| 3016 | + | ||
| 3017 | +#include "acx_hw.h" | ||
| 3018 | +#include "acx.h" | ||
| 3019 | + | ||
| 3020 | + | ||
| 3021 | +/*********************************************************************** | ||
| 3022 | +*/ | ||
| 3023 | +static client_t *acx_l_sta_list_alloc(acx_device_t *adev); | ||
| 3024 | +static client_t *acx_l_sta_list_get_from_hash(acx_device_t *adev, const u8 *address); | ||
| 3025 | + | ||
| 3026 | +static int acx_l_process_data_frame_master(acx_device_t *adev, rxbuffer_t *rxbuf); | ||
| 3027 | +static int acx_l_process_data_frame_client(acx_device_t *adev, rxbuffer_t *rxbuf); | ||
| 3028 | +/* static int acx_l_process_NULL_frame(acx_device_t *adev, rxbuffer_t *rxbuf, int vala); */ | ||
| 3029 | +static int acx_l_process_mgmt_frame(acx_device_t *adev, rxbuffer_t *rxbuf); | ||
| 3030 | +static void acx_l_process_disassoc_from_sta(acx_device_t *adev, const wlan_fr_disassoc_t *req); | ||
| 3031 | +static void acx_l_process_disassoc_from_ap(acx_device_t *adev, const wlan_fr_disassoc_t *req); | ||
| 3032 | +static void acx_l_process_deauth_from_sta(acx_device_t *adev, const wlan_fr_deauthen_t *req); | ||
| 3033 | +static void acx_l_process_deauth_from_ap(acx_device_t *adev, const wlan_fr_deauthen_t *req); | ||
| 3034 | +static int acx_l_process_probe_response(acx_device_t *adev, wlan_fr_proberesp_t *req, const rxbuffer_t *rxbuf); | ||
| 3035 | +static int acx_l_process_assocresp(acx_device_t *adev, const wlan_fr_assocresp_t *req); | ||
| 3036 | +static int acx_l_process_reassocresp(acx_device_t *adev, const wlan_fr_reassocresp_t *req); | ||
| 3037 | +static int acx_l_process_authen(acx_device_t *adev, const wlan_fr_authen_t *req); | ||
| 3038 | +static int acx_l_transmit_assocresp(acx_device_t *adev, const wlan_fr_assocreq_t *req); | ||
| 3039 | +static int acx_l_transmit_reassocresp(acx_device_t *adev, const wlan_fr_reassocreq_t *req); | ||
| 3040 | +static int acx_l_transmit_deauthen(acx_device_t *adev, const u8 *addr, u16 reason); | ||
| 3041 | +static int acx_l_transmit_authen1(acx_device_t *adev); | ||
| 3042 | +static int acx_l_transmit_authen2(acx_device_t *adev, const wlan_fr_authen_t *req, client_t *clt); | ||
| 3043 | +static int acx_l_transmit_authen3(acx_device_t *adev, const wlan_fr_authen_t *req); | ||
| 3044 | +static int acx_l_transmit_authen4(acx_device_t *adev, const wlan_fr_authen_t *req); | ||
| 3045 | +static int acx_l_transmit_assoc_req(acx_device_t *adev); | ||
| 3046 | + | ||
| 3047 | + | ||
| 3048 | +/*********************************************************************** | ||
| 3049 | +*/ | ||
| 3050 | +#if ACX_DEBUG | ||
| 3051 | +unsigned int acx_debug /* will add __read_mostly later */ = ACX_DEFAULT_MSG; | ||
| 3052 | +/* parameter is 'debug', corresponding var is acx_debug */ | ||
| 3053 | +module_param_named(debug, acx_debug, uint, 0); | ||
| 3054 | +MODULE_PARM_DESC(debug, "Debug level mask (see L_xxx constants)"); | ||
| 3055 | +#endif | ||
| 3056 | + | ||
| 3057 | +#ifdef MODULE_LICENSE | ||
| 3058 | +MODULE_LICENSE("Dual MPL/GPL"); | ||
| 3059 | +#endif | ||
| 3060 | +/* USB had this: MODULE_AUTHOR("Martin Wawro <martin.wawro AT uni-dortmund.de>"); */ | ||
| 3061 | +MODULE_AUTHOR("ACX100 Open Source Driver development team"); | ||
| 3062 | +MODULE_DESCRIPTION("Driver for TI ACX1xx based wireless cards (CardBus/PCI/USB)"); | ||
| 3063 | + | ||
| 3064 | + | ||
| 3065 | +/*********************************************************************** | ||
| 3066 | +*/ | ||
| 3067 | +/* Probably a number of acx's intermediate buffers for USB transfers, | ||
| 3068 | +** not to be confused with number of descriptors in tx/rx rings | ||
| 3069 | +** (which are not directly accessible to host in USB devices) */ | ||
| 3070 | +#define USB_RX_CNT 10 | ||
| 3071 | +#define USB_TX_CNT 10 | ||
| 3072 | + | ||
| 3073 | + | ||
| 3074 | +/*********************************************************************** | ||
| 3075 | +*/ | ||
| 3076 | + | ||
| 3077 | +/* minutes to wait until next radio recalibration: */ | ||
| 3078 | +#define RECALIB_PAUSE 5 | ||
| 3079 | + | ||
| 3080 | +/* Please keep acx_reg_domain_ids_len in sync... */ | ||
| 3081 | +const u8 acx_reg_domain_ids[acx_reg_domain_ids_len] = | ||
| 3082 | + { 0x10, 0x20, 0x30, 0x31, 0x32, 0x40, 0x41, 0x51 }; | ||
| 3083 | +static const u16 reg_domain_channel_masks[acx_reg_domain_ids_len] = | ||
| 3084 | +#ifdef ACX_ALLOW_ALLCHANNELS | ||
| 3085 | + { 0x3fff, 0x07ff, 0x1fff, 0x0600, 0x1e00, 0x2000, 0x3fff, 0x01fc }; | ||
| 3086 | +#else | ||
| 3087 | + { 0x07ff, 0x07ff, 0x1fff, 0x0600, 0x1e00, 0x2000, 0x3fff, 0x01fc }; | ||
| 3088 | +#endif | ||
| 3089 | +const char * const | ||
| 3090 | +acx_reg_domain_strings[] = { | ||
| 3091 | + /* 0 */ " 1-11 FCC (USA)", | ||
| 3092 | + /* 1 */ " 1-11 DOC/IC (Canada)", | ||
| 3093 | +/* BTW: WLAN use in ETSI is regulated by ETSI standard EN 300 328-2 V1.1.2 */ | ||
| 3094 | + /* 2 */ " 1-13 ETSI (Europe)", | ||
| 3095 | + /* 3 */ "10-11 Spain", | ||
| 3096 | + /* 4 */ "10-13 France", | ||
| 3097 | + /* 5 */ " 14 MKK (Japan)", | ||
| 3098 | + /* 6 */ " 1-14 MKK1", | ||
| 3099 | + /* 7 */ " 3-9 Israel (not all firmware versions)", | ||
| 3100 | + NULL /* needs to remain as last entry */ | ||
| 3101 | +}; | ||
| 3102 | + | ||
| 3103 | + | ||
| 3104 | + | ||
| 3105 | +/*********************************************************************** | ||
| 3106 | +** Debugging support | ||
| 3107 | +*/ | ||
| 3108 | +#ifdef PARANOID_LOCKING | ||
| 3109 | +static unsigned max_lock_time; | ||
| 3110 | +static unsigned max_sem_time; | ||
| 3111 | + | ||
| 3112 | +void | ||
| 3113 | +acx_lock_unhold() { max_lock_time = 0; } | ||
| 3114 | +void | ||
| 3115 | +acx_sem_unhold() { max_sem_time = 0; } | ||
| 3116 | + | ||
| 3117 | +static inline const char* | ||
| 3118 | +sanitize_str(const char *s) | ||
| 3119 | +{ | ||
| 3120 | + const char* t = strrchr(s, '/'); | ||
| 3121 | + if (t) return t + 1; | ||
| 3122 | + return s; | ||
| 3123 | +} | ||
| 3124 | + | ||
| 3125 | +void | ||
| 3126 | +acx_lock_debug(acx_device_t *adev, const char* where) | ||
| 3127 | +{ | ||
| 3128 | + unsigned int count = 100*1000*1000; | ||
| 3129 | + where = sanitize_str(where); | ||
| 3130 | + while (--count) { | ||
| 3131 | + if (!spin_is_locked(&adev->lock)) break; | ||
| 3132 | + cpu_relax(); | ||
| 3133 | + } | ||
| 3134 | + if (!count) { | ||
| 3135 | + printk(KERN_EMERG "LOCKUP: already taken at %s!\n", adev->last_lock); | ||
| 3136 | + BUG(); | ||
| 3137 | + } | ||
| 3138 | + adev->last_lock = where; | ||
| 3139 | + rdtscl(adev->lock_time); | ||
| 3140 | +} | ||
| 3141 | +void | ||
| 3142 | +acx_unlock_debug(acx_device_t *adev, const char* where) | ||
| 3143 | +{ | ||
| 3144 | +#ifdef SMP | ||
| 3145 | + if (!spin_is_locked(&adev->lock)) { | ||
| 3146 | + where = sanitize_str(where); | ||
| 3147 | + printk(KERN_EMERG "STRAY UNLOCK at %s!\n", where); | ||
| 3148 | + BUG(); | ||
| 3149 | + } | ||
| 3150 | +#endif | ||
| 3151 | + if (acx_debug & L_LOCK) { | ||
| 3152 | + unsigned long diff; | ||
| 3153 | + rdtscl(diff); | ||
| 3154 | + diff -= adev->lock_time; | ||
| 3155 | + if (diff > max_lock_time) { | ||
| 3156 | + where = sanitize_str(where); | ||
| 3157 | + printk("max lock hold time %ld CPU ticks from %s " | ||
| 3158 | + "to %s\n", diff, adev->last_lock, where); | ||
| 3159 | + max_lock_time = diff; | ||
| 3160 | + } | ||
| 3161 | + } | ||
| 3162 | +} | ||
| 3163 | +void | ||
| 3164 | +acx_down_debug(acx_device_t *adev, const char* where) | ||
| 3165 | +{ | ||
| 3166 | + int sem_count; | ||
| 3167 | + unsigned long timeout = jiffies + 5*HZ; | ||
| 3168 | + | ||
| 3169 | + where = sanitize_str(where); | ||
| 3170 | + | ||
| 3171 | + for (;;) { | ||
| 3172 | + sem_count = atomic_read(&adev->sem.count); | ||
| 3173 | + if (sem_count) break; | ||
| 3174 | + if (time_after(jiffies, timeout)) | ||
| 3175 | + break; | ||
| 3176 | + msleep(5); | ||
| 3177 | + } | ||
| 3178 | + if (!sem_count) { | ||
| 3179 | + printk(KERN_EMERG "D STATE at %s! last sem at %s\n", | ||
| 3180 | + where, adev->last_sem); | ||
| 3181 | + dump_stack(); | ||
| 3182 | + } | ||
| 3183 | + adev->last_sem = where; | ||
| 3184 | + adev->sem_time = jiffies; | ||
| 3185 | + down(&adev->sem); | ||
| 3186 | + if (acx_debug & L_LOCK) { | ||
| 3187 | + printk("%s: sem_down %d -> %d\n", | ||
| 3188 | + where, sem_count, atomic_read(&adev->sem.count)); | ||
| 3189 | + } | ||
| 3190 | +} | ||
| 3191 | +void | ||
| 3192 | +acx_up_debug(acx_device_t *adev, const char* where) | ||
| 3193 | +{ | ||
| 3194 | + int sem_count = atomic_read(&adev->sem.count); | ||
| 3195 | + if (sem_count) { | ||
| 3196 | + where = sanitize_str(where); | ||
| 3197 | + printk(KERN_EMERG "STRAY UP at %s! sem.count=%d\n", where, sem_count); | ||
| 3198 | + dump_stack(); | ||
| 3199 | + } | ||
| 3200 | + if (acx_debug & L_LOCK) { | ||
| 3201 | + unsigned long diff = jiffies - adev->sem_time; | ||
| 3202 | + if (diff > max_sem_time) { | ||
| 3203 | + where = sanitize_str(where); | ||
| 3204 | + printk("max sem hold time %ld jiffies from %s " | ||
| 3205 | + "to %s\n", diff, adev->last_sem, where); | ||
| 3206 | + max_sem_time = diff; | ||
| 3207 | + } | ||
| 3208 | + } | ||
| 3209 | + up(&adev->sem); | ||
| 3210 | + if (acx_debug & L_LOCK) { | ||
| 3211 | + where = sanitize_str(where); | ||
| 3212 | + printk("%s: sem_up %d -> %d\n", | ||
| 3213 | + where, sem_count, atomic_read(&adev->sem.count)); | ||
| 3214 | + } | ||
| 3215 | +} | ||
| 3216 | +#endif /* PARANOID_LOCKING */ | ||
| 3217 | + | ||
| 3218 | + | ||
| 3219 | +/*********************************************************************** | ||
| 3220 | +*/ | ||
| 3221 | +#if ACX_DEBUG > 1 | ||
| 3222 | + | ||
| 3223 | +static int acx_debug_func_indent; | ||
| 3224 | +#define DEBUG_TSC 0 | ||
| 3225 | +#define FUNC_INDENT_INCREMENT 2 | ||
| 3226 | + | ||
| 3227 | +#if DEBUG_TSC | ||
| 3228 | +#define TIMESTAMP(d) unsigned long d; rdtscl(d) | ||
| 3229 | +#else | ||
| 3230 | +#define TIMESTAMP(d) unsigned long d = jiffies | ||
| 3231 | +#endif | ||
| 3232 | + | ||
| 3233 | +static const char | ||
| 3234 | +spaces[] = " " " "; /* Nx10 spaces */ | ||
| 3235 | + | ||
| 3236 | +void | ||
| 3237 | +log_fn_enter(const char *funcname) | ||
| 3238 | +{ | ||
| 3239 | + int indent; | ||
| 3240 | + TIMESTAMP(d); | ||
| 3241 | + | ||
| 3242 | + indent = acx_debug_func_indent; | ||
| 3243 | + if (indent >= sizeof(spaces)) | ||
| 3244 | + indent = sizeof(spaces)-1; | ||
| 3245 | + | ||
| 3246 | + printk("%08ld %s==> %s\n", | ||
| 3247 | + d % 100000000, | ||
| 3248 | + spaces + (sizeof(spaces)-1) - indent, | ||
| 3249 | + funcname | ||
| 3250 | + ); | ||
| 3251 | + | ||
| 3252 | + acx_debug_func_indent += FUNC_INDENT_INCREMENT; | ||
| 3253 | +} | ||
| 3254 | +void | ||
| 3255 | +log_fn_exit(const char *funcname) | ||
| 3256 | +{ | ||
| 3257 | + int indent; | ||
| 3258 | + TIMESTAMP(d); | ||
| 3259 | + | ||
| 3260 | + acx_debug_func_indent -= FUNC_INDENT_INCREMENT; | ||
| 3261 | + | ||
| 3262 | + indent = acx_debug_func_indent; | ||
| 3263 | + if (indent >= sizeof(spaces)) | ||
| 3264 | + indent = sizeof(spaces)-1; | ||
| 3265 | + | ||
| 3266 | + printk("%08ld %s<== %s\n", | ||
| 3267 | + d % 100000000, | ||
| 3268 | + spaces + (sizeof(spaces)-1) - indent, | ||
| 3269 | + funcname | ||
| 3270 | + ); | ||
| 3271 | +} | ||
| 3272 | +void | ||
| 3273 | +log_fn_exit_v(const char *funcname, int v) | ||
| 3274 | +{ | ||
| 3275 | + int indent; | ||
| 3276 | + TIMESTAMP(d); | ||
| 3277 | + | ||
| 3278 | + acx_debug_func_indent -= FUNC_INDENT_INCREMENT; | ||
| 3279 | + | ||
| 3280 | + indent = acx_debug_func_indent; | ||
| 3281 | + if (indent >= sizeof(spaces)) | ||
| 3282 | + indent = sizeof(spaces)-1; | ||
| 3283 | + | ||
| 3284 | + printk("%08ld %s<== %s: %08X\n", | ||
| 3285 | + d % 100000000, | ||
| 3286 | + spaces + (sizeof(spaces)-1) - indent, | ||
| 3287 | + funcname, | ||
| 3288 | + v | ||
| 3289 | + ); | ||
| 3290 | +} | ||
| 3291 | +#endif /* ACX_DEBUG > 1 */ | ||
| 3292 | + | ||
| 3293 | + | ||
| 3294 | +/*********************************************************************** | ||
| 3295 | +** Basically a msleep with logging | ||
| 3296 | +*/ | ||
| 3297 | +void | ||
| 3298 | +acx_s_msleep(int ms) | ||
| 3299 | +{ | ||
| 3300 | + FN_ENTER; | ||
| 3301 | + msleep(ms); | ||
| 3302 | + FN_EXIT0; | ||
| 3303 | +} | ||
| 3304 | + | ||
| 3305 | + | ||
| 3306 | +/*********************************************************************** | ||
| 3307 | +** Not inlined: it's larger than it seems | ||
| 3308 | +*/ | ||
| 3309 | +void | ||
| 3310 | +acx_print_mac(const char *head, const u8 *mac, const char *tail) | ||
| 3311 | +{ | ||
| 3312 | + printk("%s"MACSTR"%s", head, MAC(mac), tail); | ||
| 3313 | +} | ||
| 3314 | + | ||
| 3315 | + | ||
| 3316 | +/*********************************************************************** | ||
| 3317 | +** acx_get_status_name | ||
| 3318 | +*/ | ||
| 3319 | +static const char* | ||
| 3320 | +acx_get_status_name(u16 status) | ||
| 3321 | +{ | ||
| 3322 | + static const char * const str[] = { | ||
| 3323 | + "STOPPED", "SCANNING", "WAIT_AUTH", | ||
| 3324 | + "AUTHENTICATED", "ASSOCIATED", "INVALID??" | ||
| 3325 | + }; | ||
| 3326 | + if (status > VEC_SIZE(str)-1) | ||
| 3327 | + status = VEC_SIZE(str)-1; | ||
| 3328 | + | ||
| 3329 | + return str[status]; | ||
| 3330 | +} | ||
| 3331 | + | ||
| 3332 | + | ||
| 3333 | +/*********************************************************************** | ||
| 3334 | +** acx_get_packet_type_string | ||
| 3335 | +*/ | ||
| 3336 | +#if ACX_DEBUG | ||
| 3337 | +const char* | ||
| 3338 | +acx_get_packet_type_string(u16 fc) | ||
| 3339 | +{ | ||
| 3340 | + static const char * const mgmt_arr[] = { | ||
| 3341 | + "MGMT/AssocReq", "MGMT/AssocResp", "MGMT/ReassocReq", | ||
| 3342 | + "MGMT/ReassocResp", "MGMT/ProbeReq", "MGMT/ProbeResp", | ||
| 3343 | + "MGMT/UNKNOWN", "MGMT/UNKNOWN", "MGMT/Beacon", "MGMT/ATIM", | ||
| 3344 | + "MGMT/Disassoc", "MGMT/Authen", "MGMT/Deauthen" | ||
| 3345 | + }; | ||
| 3346 | + static const char * const ctl_arr[] = { | ||
| 3347 | + "CTL/PSPoll", "CTL/RTS", "CTL/CTS", "CTL/Ack", "CTL/CFEnd", | ||
| 3348 | + "CTL/CFEndCFAck" | ||
| 3349 | + }; | ||
| 3350 | + static const char * const data_arr[] = { | ||
| 3351 | + "DATA/DataOnly", "DATA/Data CFAck", "DATA/Data CFPoll", | ||
| 3352 | + "DATA/Data CFAck/CFPoll", "DATA/Null", "DATA/CFAck", | ||
| 3353 | + "DATA/CFPoll", "DATA/CFAck/CFPoll" | ||
| 3354 | + }; | ||
| 3355 | + const char *str; | ||
| 3356 | + u8 fstype = (WF_FC_FSTYPE & fc) >> 4; | ||
| 3357 | + u8 ctl; | ||
| 3358 | + | ||
| 3359 | + switch (WF_FC_FTYPE & fc) { | ||
| 3360 | + case WF_FTYPE_MGMT: | ||
| 3361 | + if (fstype < VEC_SIZE(mgmt_arr)) | ||
| 3362 | + str = mgmt_arr[fstype]; | ||
| 3363 | + else | ||
| 3364 | + str = "MGMT/UNKNOWN"; | ||
| 3365 | + break; | ||
| 3366 | + case WF_FTYPE_CTL: | ||
| 3367 | + ctl = fstype - 0x0a; | ||
| 3368 | + if (ctl < VEC_SIZE(ctl_arr)) | ||
| 3369 | + str = ctl_arr[ctl]; | ||
| 3370 | + else | ||
| 3371 | + str = "CTL/UNKNOWN"; | ||
| 3372 | + break; | ||
| 3373 | + case WF_FTYPE_DATA: | ||
| 3374 | + if (fstype < VEC_SIZE(data_arr)) | ||
| 3375 | + str = data_arr[fstype]; | ||
| 3376 | + else | ||
| 3377 | + str = "DATA/UNKNOWN"; | ||
| 3378 | + break; | ||
| 3379 | + default: | ||
| 3380 | + str = "UNKNOWN"; | ||
| 3381 | + break; | ||
| 3382 | + } | ||
| 3383 | + return str; | ||
| 3384 | +} | ||
| 3385 | +#endif | ||
| 3386 | + | ||
| 3387 | + | ||
| 3388 | +/*********************************************************************** | ||
| 3389 | +** acx_wlan_reason_str | ||
| 3390 | +*/ | ||
| 3391 | +static inline const char* | ||
| 3392 | +acx_wlan_reason_str(u16 reason) | ||
| 3393 | +{ | ||
| 3394 | + static const char* const reason_str[] = { | ||
| 3395 | + /* 0 */ "?", | ||
| 3396 | + /* 1 */ "unspecified", | ||
| 3397 | + /* 2 */ "prev auth is not valid", | ||
| 3398 | + /* 3 */ "leaving BBS", | ||
| 3399 | + /* 4 */ "due to inactivity", | ||
| 3400 | + /* 5 */ "AP is busy", | ||
| 3401 | + /* 6 */ "got class 2 frame from non-auth'ed STA", | ||
| 3402 | + /* 7 */ "got class 3 frame from non-assoc'ed STA", | ||
| 3403 | + /* 8 */ "STA has left BSS", | ||
| 3404 | + /* 9 */ "assoc without auth is not allowed", | ||
| 3405 | + /* 10 */ "bad power setting (802.11h)", | ||
| 3406 | + /* 11 */ "bad channel (802.11i)", | ||
| 3407 | + /* 12 */ "?", | ||
| 3408 | + /* 13 */ "invalid IE", | ||
| 3409 | + /* 14 */ "MIC failure", | ||
| 3410 | + /* 15 */ "four-way handshake timeout", | ||
| 3411 | + /* 16 */ "group key handshake timeout", | ||
| 3412 | + /* 17 */ "IE is different", | ||
| 3413 | + /* 18 */ "invalid group cipher", | ||
| 3414 | + /* 19 */ "invalid pairwise cipher", | ||
| 3415 | + /* 20 */ "invalid AKMP", | ||
| 3416 | + /* 21 */ "unsupported RSN version", | ||
| 3417 | + /* 22 */ "invalid RSN IE cap", | ||
| 3418 | + /* 23 */ "802.1x failed", | ||
| 3419 | + /* 24 */ "cipher suite rejected" | ||
| 3420 | + }; | ||
| 3421 | + return reason < VEC_SIZE(reason_str) ? reason_str[reason] : "?"; | ||
| 3422 | +} | ||
| 3423 | + | ||
| 3424 | + | ||
| 3425 | +/*********************************************************************** | ||
| 3426 | +** acx_cmd_status_str | ||
| 3427 | +*/ | ||
| 3428 | +const char* | ||
| 3429 | +acx_cmd_status_str(unsigned int state) | ||
| 3430 | +{ | ||
| 3431 | + static const char * const cmd_error_strings[] = { | ||
| 3432 | + "Idle", | ||
| 3433 | + "Success", | ||
| 3434 | + "Unknown Command", | ||
| 3435 | + "Invalid Information Element", | ||
| 3436 | + "Channel rejected", | ||
| 3437 | + "Channel invalid in current regulatory domain", | ||
| 3438 | + "MAC invalid", | ||
| 3439 | + "Command rejected (read-only information element)", | ||
| 3440 | + "Command rejected", | ||
| 3441 | + "Already asleep", | ||
| 3442 | + "TX in progress", | ||
| 3443 | + "Already awake", | ||
| 3444 | + "Write only", | ||
| 3445 | + "RX in progress", | ||
| 3446 | + "Invalid parameter", | ||
| 3447 | + "Scan in progress", | ||
| 3448 | + "Failed" | ||
| 3449 | + }; | ||
| 3450 | + return state < VEC_SIZE(cmd_error_strings) ? | ||
| 3451 | + cmd_error_strings[state] : "?"; | ||
| 3452 | +} | ||
| 3453 | + | ||
| 3454 | + | ||
| 3455 | +/*********************************************************************** | ||
| 3456 | +** get_status_string | ||
| 3457 | +*/ | ||
| 3458 | +static inline const char* | ||
| 3459 | +get_status_string(unsigned int status) | ||
| 3460 | +{ | ||
| 3461 | + /* A bit shortened, but hopefully still understandable */ | ||
| 3462 | + static const char * const status_str[] = { | ||
| 3463 | + /* 0 */ "Successful", | ||
| 3464 | + /* 1 */ "Unspecified failure", | ||
| 3465 | + /* 2 */ "reserved", | ||
| 3466 | + /* 3 */ "reserved", | ||
| 3467 | + /* 4 */ "reserved", | ||
| 3468 | + /* 5 */ "reserved", | ||
| 3469 | + /* 6 */ "reserved", | ||
| 3470 | + /* 7 */ "reserved", | ||
| 3471 | + /* 8 */ "reserved", | ||
| 3472 | + /* 9 */ "reserved", | ||
| 3473 | + /*10 */ "Cannot support all requested capabilities in Capability Information field", | ||
| 3474 | + /*11 */ "Reassoc denied (reason outside of 802.11b scope)", | ||
| 3475 | + /*12 */ "Assoc denied (reason outside of 802.11b scope) -- maybe MAC filtering by peer?", | ||
| 3476 | + /*13 */ "Responding station doesnt support specified auth algorithm -- maybe WEP auth Open vs. Restricted?", | ||
| 3477 | + /*14 */ "Auth rejected: wrong transaction sequence number", | ||
| 3478 | + /*15 */ "Auth rejected: challenge failure", | ||
| 3479 | + /*16 */ "Auth rejected: timeout for next frame in sequence", | ||
| 3480 | + /*17 */ "Assoc denied: too many STAs on this AP", | ||
| 3481 | + /*18 */ "Assoc denied: requesting STA doesnt support all data rates in basic set", | ||
| 3482 | + /*19 */ "Assoc denied: requesting STA doesnt support Short Preamble", | ||
| 3483 | + /*20 */ "Assoc denied: requesting STA doesnt support PBCC Modulation", | ||
| 3484 | + /*21 */ "Assoc denied: requesting STA doesnt support Channel Agility" | ||
| 3485 | + /*22 */ "reserved", | ||
| 3486 | + /*23 */ "reserved", | ||
| 3487 | + /*24 */ "reserved", | ||
| 3488 | + /*25 */ "Assoc denied: requesting STA doesnt support Short Slot Time", | ||
| 3489 | + /*26 */ "Assoc denied: requesting STA doesnt support DSSS-OFDM" | ||
| 3490 | + }; | ||
| 3491 | + | ||
| 3492 | + return status_str[status < VEC_SIZE(status_str) ? status : 2]; | ||
| 3493 | +} | ||
| 3494 | + | ||
| 3495 | + | ||
| 3496 | +/*********************************************************************** | ||
| 3497 | +*/ | ||
| 3498 | +void | ||
| 3499 | +acx_log_bad_eid(wlan_hdr_t* hdr, int len, wlan_ie_t* ie_ptr) | ||
| 3500 | +{ | ||
| 3501 | + if (acx_debug & L_ASSOC) { | ||
| 3502 | + int offset = (u8*)ie_ptr - (u8*)hdr; | ||
| 3503 | + printk("acx: unknown EID %d in mgmt frame at offset %d. IE: ", | ||
| 3504 | + ie_ptr->eid, offset); | ||
| 3505 | + /* IE len can be bogus, IE can extend past packet end. Oh well... */ | ||
| 3506 | + acx_dump_bytes(ie_ptr, ie_ptr->len + 2); | ||
| 3507 | + if (acx_debug & L_DATA) { | ||
| 3508 | + printk("frame (%s): ", | ||
| 3509 | + acx_get_packet_type_string(le16_to_cpu(hdr->fc))); | ||
| 3510 | + acx_dump_bytes(hdr, len); | ||
| 3511 | + } | ||
| 3512 | + } | ||
| 3513 | +} | ||
| 3514 | + | ||
| 3515 | + | ||
| 3516 | +/*********************************************************************** | ||
| 3517 | +*/ | ||
| 3518 | +#if ACX_DEBUG | ||
| 3519 | +void | ||
| 3520 | +acx_dump_bytes(const void *data, int num) | ||
| 3521 | +{ | ||
| 3522 | + const u8* ptr = (const u8*)data; | ||
| 3523 | + | ||
| 3524 | + if (num <= 0) { | ||
| 3525 | + printk("\n"); | ||
| 3526 | + return; | ||
| 3527 | + } | ||
| 3528 | + | ||
| 3529 | + while (num >= 16) { | ||
| 3530 | + printk( "%02X %02X %02X %02X %02X %02X %02X %02X " | ||
| 3531 | + "%02X %02X %02X %02X %02X %02X %02X %02X\n", | ||
| 3532 | + ptr[0], ptr[1], ptr[2], ptr[3], | ||
| 3533 | + ptr[4], ptr[5], ptr[6], ptr[7], | ||
| 3534 | + ptr[8], ptr[9], ptr[10], ptr[11], | ||
| 3535 | + ptr[12], ptr[13], ptr[14], ptr[15]); | ||
| 3536 | + num -= 16; | ||
| 3537 | + ptr += 16; | ||
| 3538 | + } | ||
| 3539 | + if (num > 0) { | ||
| 3540 | + while (--num > 0) | ||
| 3541 | + printk("%02X ", *ptr++); | ||
| 3542 | + printk("%02X\n", *ptr); | ||
| 3543 | + } | ||
| 3544 | +} | ||
| 3545 | +#endif | ||
| 3546 | + | ||
| 3547 | + | ||
| 3548 | +/*********************************************************************** | ||
| 3549 | +** acx_s_get_firmware_version | ||
| 3550 | +*/ | ||
| 3551 | +void | ||
| 3552 | +acx_s_get_firmware_version(acx_device_t *adev) | ||
| 3553 | +{ | ||
| 3554 | + fw_ver_t fw; | ||
| 3555 | + u8 hexarr[4] = { 0, 0, 0, 0 }; | ||
| 3556 | + int hexidx = 0, val = 0; | ||
| 3557 | + const char *num; | ||
| 3558 | + char c; | ||
| 3559 | + | ||
| 3560 | + FN_ENTER; | ||
| 3561 | + | ||
| 3562 | + memset(fw.fw_id, 'E', FW_ID_SIZE); | ||
| 3563 | + acx_s_interrogate(adev, &fw, ACX1xx_IE_FWREV); | ||
| 3564 | + memcpy(adev->firmware_version, fw.fw_id, FW_ID_SIZE); | ||
| 3565 | + adev->firmware_version[FW_ID_SIZE] = '\0'; | ||
| 3566 | + | ||
| 3567 | + log(L_DEBUG, "fw_ver: fw_id='%s' hw_id=%08X\n", | ||
| 3568 | + adev->firmware_version, fw.hw_id); | ||
| 3569 | + | ||
| 3570 | + if (strncmp(fw.fw_id, "Rev ", 4) != 0) { | ||
| 3571 | + printk("acx: strange firmware version string " | ||
| 3572 | + "'%s', please report\n", adev->firmware_version); | ||
| 3573 | + adev->firmware_numver = 0x01090407; /* assume 1.9.4.7 */ | ||
| 3574 | + } else { | ||
| 3575 | + num = &fw.fw_id[4]; | ||
| 3576 | + while (1) { | ||
| 3577 | + c = *num++; | ||
| 3578 | + if ((c == '.') || (c == '\0')) { | ||
| 3579 | + hexarr[hexidx++] = val; | ||
| 3580 | + if ((hexidx > 3) || (c == '\0')) /* end? */ | ||
| 3581 | + break; | ||
| 3582 | + val = 0; | ||
| 3583 | + continue; | ||
| 3584 | + } | ||
| 3585 | + if ((c >= '0') && (c <= '9')) | ||
| 3586 | + c -= '0'; | ||
| 3587 | + else | ||
| 3588 | + c = c - 'a' + (char)10; | ||
| 3589 | + val = val*16 + c; | ||
| 3590 | + } | ||
| 3591 | + | ||
| 3592 | + adev->firmware_numver = (u32)( | ||
| 3593 | + (hexarr[0] << 24) | (hexarr[1] << 16) | ||
| 3594 | + | (hexarr[2] << 8) | hexarr[3]); | ||
| 3595 | + log(L_DEBUG, "firmware_numver 0x%08X\n", adev->firmware_numver); | ||
| 3596 | + } | ||
| 3597 | + if (IS_ACX111(adev)) { | ||
| 3598 | + if (adev->firmware_numver == 0x00010011) { | ||
| 3599 | + /* This one does not survive floodpinging */ | ||
| 3600 | + printk("acx: firmware '%s' is known to be buggy, " | ||
| 3601 | + "please upgrade\n", adev->firmware_version); | ||
| 3602 | + } | ||
| 3603 | + } | ||
| 3604 | + | ||
| 3605 | + adev->firmware_id = le32_to_cpu(fw.hw_id); | ||
| 3606 | + | ||
| 3607 | + /* we're able to find out more detailed chip names now */ | ||
| 3608 | + switch (adev->firmware_id & 0xffff0000) { | ||
| 3609 | + case 0x01010000: | ||
| 3610 | + case 0x01020000: | ||
| 3611 | + adev->chip_name = "TNETW1100A"; | ||
| 3612 | + break; | ||
| 3613 | + case 0x01030000: | ||
| 3614 | + adev->chip_name = "TNETW1100B"; | ||
| 3615 | + break; | ||
| 3616 | + case 0x03000000: | ||
| 3617 | + case 0x03010000: | ||
| 3618 | + adev->chip_name = "TNETW1130"; | ||
| 3619 | + break; | ||
| 3620 | + case 0x04030000: /* 0x04030101 is TNETW1450 */ | ||
| 3621 | + adev->chip_name = "TNETW1450"; | ||
| 3622 | + break; | ||
| 3623 | + default: | ||
| 3624 | + printk("acx: unknown chip ID 0x%08X, " | ||
| 3625 | + "please report\n", adev->firmware_id); | ||
| 3626 | + break; | ||
| 3627 | + } | ||
| 3628 | + | ||
| 3629 | + FN_EXIT0; | ||
| 3630 | +} | ||
| 3631 | + | ||
| 3632 | + | ||
| 3633 | +/*********************************************************************** | ||
| 3634 | +** acx_display_hardware_details | ||
| 3635 | +** | ||
| 3636 | +** Displays hw/fw version, radio type etc... | ||
| 3637 | +*/ | ||
| 3638 | +void | ||
| 3639 | +acx_display_hardware_details(acx_device_t *adev) | ||
| 3640 | +{ | ||
| 3641 | + const char *radio_str, *form_str; | ||
| 3642 | + | ||
| 3643 | + FN_ENTER; | ||
| 3644 | + | ||
| 3645 | + switch (adev->radio_type) { | ||
| 3646 | + case RADIO_MAXIM_0D: | ||
| 3647 | + radio_str = "Maxim"; | ||
| 3648 | + break; | ||
| 3649 | + case RADIO_RFMD_11: | ||
| 3650 | + radio_str = "RFMD"; | ||
| 3651 | + break; | ||
| 3652 | + case RADIO_RALINK_15: | ||
| 3653 | + radio_str = "Ralink"; | ||
| 3654 | + break; | ||
| 3655 | + case RADIO_RADIA_16: | ||
| 3656 | + radio_str = "Radia"; | ||
| 3657 | + break; | ||
| 3658 | + case RADIO_UNKNOWN_17: | ||
| 3659 | + /* TI seems to have a radio which is | ||
| 3660 | + * additionally 802.11a capable, too */ | ||
| 3661 | + radio_str = "802.11a/b/g radio?! Please report"; | ||
| 3662 | + break; | ||
| 3663 | + case RADIO_UNKNOWN_19: | ||
| 3664 | + radio_str = "A radio used by Safecom cards?! Please report"; | ||
| 3665 | + break; | ||
| 3666 | + case RADIO_UNKNOWN_1B: | ||
| 3667 | + radio_str = "An unknown radio used by TNETW1450 USB adapters"; | ||
| 3668 | + break; | ||
| 3669 | + default: | ||
| 3670 | + radio_str = "UNKNOWN, please report radio type name!"; | ||
| 3671 | + break; | ||
| 3672 | + } | ||
| 3673 | + | ||
| 3674 | + switch (adev->form_factor) { | ||
| 3675 | + case 0x00: | ||
| 3676 | + form_str = "unspecified"; | ||
| 3677 | + break; | ||
| 3678 | + case 0x01: | ||
| 3679 | + form_str = "(mini-)PCI / CardBus"; | ||
| 3680 | + break; | ||
| 3681 | + case 0x02: | ||
| 3682 | + form_str = "USB"; | ||
| 3683 | + break; | ||
| 3684 | + case 0x03: | ||
| 3685 | + form_str = "Compact Flash"; | ||
| 3686 | + break; | ||
| 3687 | + default: | ||
| 3688 | + form_str = "UNKNOWN, please report"; | ||
| 3689 | + break; | ||
| 3690 | + } | ||
| 3691 | + | ||
| 3692 | + printk("acx: === chipset %s, radio type 0x%02X (%s), " | ||
| 3693 | + "form factor 0x%02X (%s), EEPROM version 0x%02X: " | ||
| 3694 | + "uploaded firmware '%s' ===\n", | ||
| 3695 | + adev->chip_name, adev->radio_type, radio_str, | ||
| 3696 | + adev->form_factor, form_str, adev->eeprom_version, | ||
| 3697 | + adev->firmware_version); | ||
| 3698 | + | ||
| 3699 | + FN_EXIT0; | ||
| 3700 | +} | ||
| 3701 | + | ||
| 3702 | + | ||
| 3703 | +/*********************************************************************** | ||
| 3704 | +*/ | ||
| 3705 | +int | ||
| 3706 | +acx_e_change_mtu(struct net_device *ndev, int mtu) | ||
| 3707 | +{ | ||
| 3708 | + enum { | ||
| 3709 | + MIN_MTU = 256, | ||
| 3710 | + MAX_MTU = WLAN_DATA_MAXLEN - (ETH_HLEN) | ||
| 3711 | + }; | ||
| 3712 | + | ||
| 3713 | + if (mtu < MIN_MTU || mtu > MAX_MTU) | ||
| 3714 | + return -EINVAL; | ||
| 3715 | + | ||
| 3716 | + ndev->mtu = mtu; | ||
| 3717 | + return 0; | ||
| 3718 | +} | ||
| 3719 | + | ||
| 3720 | + | ||
| 3721 | +/*********************************************************************** | ||
| 3722 | +** acx_e_get_stats, acx_e_get_wireless_stats | ||
| 3723 | +*/ | ||
| 3724 | +struct net_device_stats* | ||
| 3725 | +acx_e_get_stats(struct net_device *ndev) | ||
| 3726 | +{ | ||
| 3727 | + acx_device_t *adev = ndev2adev(ndev); | ||
| 3728 | + return &adev->stats; | ||
| 3729 | +} | ||
| 3730 | + | ||
| 3731 | +struct iw_statistics* | ||
| 3732 | +acx_e_get_wireless_stats(struct net_device *ndev) | ||
| 3733 | +{ | ||
| 3734 | + acx_device_t *adev = ndev2adev(ndev); | ||
| 3735 | + return &adev->wstats; | ||
| 3736 | +} | ||
| 3737 | + | ||
| 3738 | + | ||
| 3739 | +/*********************************************************************** | ||
| 3740 | +** maps acx111 tx descr rate field to acx100 one | ||
| 3741 | +*/ | ||
| 3742 | +const u8 | ||
| 3743 | +acx_bitpos2rate100[] = { | ||
| 3744 | + RATE100_1 ,/* 0 */ | ||
| 3745 | + RATE100_2 ,/* 1 */ | ||
| 3746 | + RATE100_5 ,/* 2 */ | ||
| 3747 | + RATE100_2 ,/* 3, should not happen */ | ||
| 3748 | + RATE100_2 ,/* 4, should not happen */ | ||
| 3749 | + RATE100_11 ,/* 5 */ | ||
| 3750 | + RATE100_2 ,/* 6, should not happen */ | ||
| 3751 | + RATE100_2 ,/* 7, should not happen */ | ||
| 3752 | + RATE100_22 ,/* 8 */ | ||
| 3753 | + RATE100_2 ,/* 9, should not happen */ | ||
| 3754 | + RATE100_2 ,/* 10, should not happen */ | ||
| 3755 | + RATE100_2 ,/* 11, should not happen */ | ||
| 3756 | + RATE100_2 ,/* 12, should not happen */ | ||
| 3757 | + RATE100_2 ,/* 13, should not happen */ | ||
| 3758 | + RATE100_2 ,/* 14, should not happen */ | ||
| 3759 | + RATE100_2 ,/* 15, should not happen */ | ||
| 3760 | +}; | ||
| 3761 | + | ||
| 3762 | +u8 | ||
| 3763 | +acx_rate111to100(u16 r) { | ||
| 3764 | + return acx_bitpos2rate100[highest_bit(r)]; | ||
| 3765 | +} | ||
| 3766 | + | ||
| 3767 | + | ||
| 3768 | +/*********************************************************************** | ||
| 3769 | +** Calculate level like the feb 2003 windows driver seems to do | ||
| 3770 | +*/ | ||
| 3771 | +static u8 | ||
| 3772 | +acx_signal_to_winlevel(u8 rawlevel) | ||
| 3773 | +{ | ||
| 3774 | + /* u8 winlevel = (u8) (0.5 + 0.625 * rawlevel); */ | ||
| 3775 | + u8 winlevel = ((4 + (rawlevel * 5)) / 8); | ||
| 3776 | + | ||
| 3777 | + if (winlevel > 100) | ||
| 3778 | + winlevel = 100; | ||
| 3779 | + return winlevel; | ||
| 3780 | +} | ||
| 3781 | + | ||
| 3782 | +u8 | ||
| 3783 | +acx_signal_determine_quality(u8 signal, u8 noise) | ||
| 3784 | +{ | ||
| 3785 | + int qual; | ||
| 3786 | + | ||
| 3787 | + qual = (((signal - 30) * 100 / 70) + (100 - noise * 4)) / 2; | ||
| 3788 | + | ||
| 3789 | + if (qual > 100) | ||
| 3790 | + return 100; | ||
| 3791 | + if (qual < 0) | ||
| 3792 | + return 0; | ||
| 3793 | + return qual; | ||
| 3794 | +} | ||
| 3795 | + | ||
| 3796 | + | ||
| 3797 | +/*********************************************************************** | ||
| 3798 | +** Interrogate/configure commands | ||
| 3799 | +*/ | ||
| 3800 | + | ||
| 3801 | +/* FIXME: the lengths given here probably aren't always correct. | ||
| 3802 | + * They should be gradually replaced by proper "sizeof(acx1XX_ie_XXXX)-4", | ||
| 3803 | + * unless the firmware actually expects a different length than the struct length */ | ||
| 3804 | +static const u16 | ||
| 3805 | +acx100_ie_len[] = { | ||
| 3806 | + 0, | ||
| 3807 | + ACX100_IE_ACX_TIMER_LEN, | ||
| 3808 | + sizeof(acx100_ie_powersave_t)-4, /* is that 6 or 8??? */ | ||
| 3809 | + ACX1xx_IE_QUEUE_CONFIG_LEN, | ||
| 3810 | + ACX100_IE_BLOCK_SIZE_LEN, | ||
| 3811 | + ACX1xx_IE_MEMORY_CONFIG_OPTIONS_LEN, | ||
| 3812 | + ACX1xx_IE_RATE_FALLBACK_LEN, | ||
| 3813 | + ACX100_IE_WEP_OPTIONS_LEN, | ||
| 3814 | + ACX1xx_IE_MEMORY_MAP_LEN, /* ACX1xx_IE_SSID_LEN, */ | ||
| 3815 | + 0, | ||
| 3816 | + ACX1xx_IE_ASSOC_ID_LEN, | ||
| 3817 | + 0, | ||
| 3818 | + ACX111_IE_CONFIG_OPTIONS_LEN, | ||
| 3819 | + ACX1xx_IE_FWREV_LEN, | ||
| 3820 | + ACX1xx_IE_FCS_ERROR_COUNT_LEN, | ||
| 3821 | + ACX1xx_IE_MEDIUM_USAGE_LEN, | ||
| 3822 | + ACX1xx_IE_RXCONFIG_LEN, | ||
| 3823 | + 0, | ||
| 3824 | + 0, | ||
| 3825 | + sizeof(fw_stats_t)-4, | ||
| 3826 | + 0, | ||
| 3827 | + ACX1xx_IE_FEATURE_CONFIG_LEN, | ||
| 3828 | + ACX111_IE_KEY_CHOOSE_LEN, | ||
| 3829 | + ACX1FF_IE_MISC_CONFIG_TABLE_LEN, | ||
| 3830 | + ACX1FF_IE_WONE_CONFIG_LEN, | ||
| 3831 | + 0, | ||
| 3832 | + ACX1FF_IE_TID_CONFIG_LEN, | ||
| 3833 | + 0, | ||
| 3834 | + 0, | ||
| 3835 | + 0, | ||
| 3836 | + ACX1FF_IE_CALIB_ASSESSMENT_LEN, | ||
| 3837 | + ACX1FF_IE_BEACON_FILTER_OPTIONS_LEN, | ||
| 3838 | + ACX1FF_IE_LOW_RSSI_THRESH_OPT_LEN, | ||
| 3839 | + ACX1FF_IE_NOISE_HISTOGRAM_RESULTS_LEN, | ||
| 3840 | + 0, | ||
| 3841 | + ACX1FF_IE_PACKET_DETECT_THRESH_LEN, | ||
| 3842 | + ACX1FF_IE_TX_CONFIG_OPTIONS_LEN, | ||
| 3843 | + ACX1FF_IE_CCA_THRESHOLD_LEN, | ||
| 3844 | + ACX1FF_IE_EVENT_MASK_LEN, | ||
| 3845 | + ACX1FF_IE_DTIM_PERIOD_LEN, | ||
| 3846 | + 0, | ||
| 3847 | + ACX1FF_IE_ACI_CONFIG_SET_LEN, | ||
| 3848 | + 0, | ||
| 3849 | + 0, | ||
| 3850 | + 0, | ||
| 3851 | + 0, | ||
| 3852 | + 0, | ||
| 3853 | + 0, | ||
| 3854 | + ACX1FF_IE_EEPROM_VER_LEN, | ||
| 3855 | +}; | ||
| 3856 | + | ||
| 3857 | +static const u16 | ||
| 3858 | +acx100_ie_len_dot11[] = { | ||
| 3859 | + 0, | ||
| 3860 | + ACX1xx_IE_DOT11_STATION_ID_LEN, | ||
| 3861 | + 0, | ||
| 3862 | + ACX100_IE_DOT11_BEACON_PERIOD_LEN, | ||
| 3863 | + ACX1xx_IE_DOT11_DTIM_PERIOD_LEN, | ||
| 3864 | + ACX1xx_IE_DOT11_SHORT_RETRY_LIMIT_LEN, | ||
| 3865 | + ACX1xx_IE_DOT11_LONG_RETRY_LIMIT_LEN, | ||
| 3866 | + ACX100_IE_DOT11_WEP_DEFAULT_KEY_WRITE_LEN, | ||
| 3867 | + ACX1xx_IE_DOT11_MAX_XMIT_MSDU_LIFETIME_LEN, | ||
| 3868 | + 0, | ||
| 3869 | + ACX1xx_IE_DOT11_CURRENT_REG_DOMAIN_LEN, | ||
| 3870 | + ACX1xx_IE_DOT11_CURRENT_ANTENNA_LEN, | ||
| 3871 | + 0, | ||
| 3872 | + ACX1xx_IE_DOT11_TX_POWER_LEVEL_LEN, | ||
| 3873 | + ACX1xx_IE_DOT11_CURRENT_CCA_MODE_LEN, | ||
| 3874 | + ACX100_IE_DOT11_ED_THRESHOLD_LEN, | ||
| 3875 | + ACX1xx_IE_DOT11_WEP_DEFAULT_KEY_SET_LEN, | ||
| 3876 | + 0, | ||
| 3877 | + 0, | ||
| 3878 | + 0, | ||
| 3879 | +}; | ||
| 3880 | + | ||
| 3881 | +static const u16 | ||
| 3882 | +acx111_ie_len[] = { | ||
| 3883 | + 0, | ||
| 3884 | + ACX100_IE_ACX_TIMER_LEN, | ||
| 3885 | + sizeof(acx111_ie_powersave_t)-4, | ||
| 3886 | + ACX1xx_IE_QUEUE_CONFIG_LEN, | ||
| 3887 | + ACX100_IE_BLOCK_SIZE_LEN, | ||
| 3888 | + ACX1xx_IE_MEMORY_CONFIG_OPTIONS_LEN, | ||
| 3889 | + ACX1xx_IE_RATE_FALLBACK_LEN, | ||
| 3890 | + ACX100_IE_WEP_OPTIONS_LEN, | ||
| 3891 | + ACX1xx_IE_MEMORY_MAP_LEN, /* ACX1xx_IE_SSID_LEN, */ | ||
| 3892 | + 0, | ||
| 3893 | + ACX1xx_IE_ASSOC_ID_LEN, | ||
| 3894 | + 0, | ||
| 3895 | + ACX111_IE_CONFIG_OPTIONS_LEN, | ||
| 3896 | + ACX1xx_IE_FWREV_LEN, | ||
| 3897 | + ACX1xx_IE_FCS_ERROR_COUNT_LEN, | ||
| 3898 | + ACX1xx_IE_MEDIUM_USAGE_LEN, | ||
| 3899 | + ACX1xx_IE_RXCONFIG_LEN, | ||
| 3900 | + 0, | ||
| 3901 | + 0, | ||
| 3902 | + sizeof(fw_stats_t)-4, | ||
| 3903 | + 0, | ||
| 3904 | + ACX1xx_IE_FEATURE_CONFIG_LEN, | ||
| 3905 | + ACX111_IE_KEY_CHOOSE_LEN, | ||
| 3906 | + ACX1FF_IE_MISC_CONFIG_TABLE_LEN, | ||
| 3907 | + ACX1FF_IE_WONE_CONFIG_LEN, | ||
| 3908 | + 0, | ||
| 3909 | + ACX1FF_IE_TID_CONFIG_LEN, | ||
| 3910 | + 0, | ||
| 3911 | + 0, | ||
| 3912 | + 0, | ||
| 3913 | + ACX1FF_IE_CALIB_ASSESSMENT_LEN, | ||
| 3914 | + ACX1FF_IE_BEACON_FILTER_OPTIONS_LEN, | ||
| 3915 | + ACX1FF_IE_LOW_RSSI_THRESH_OPT_LEN, | ||
| 3916 | + ACX1FF_IE_NOISE_HISTOGRAM_RESULTS_LEN, | ||
| 3917 | + 0, | ||
| 3918 | + ACX1FF_IE_PACKET_DETECT_THRESH_LEN, | ||
| 3919 | + ACX1FF_IE_TX_CONFIG_OPTIONS_LEN, | ||
| 3920 | + ACX1FF_IE_CCA_THRESHOLD_LEN, | ||
| 3921 | + ACX1FF_IE_EVENT_MASK_LEN, | ||
| 3922 | + ACX1FF_IE_DTIM_PERIOD_LEN, | ||
| 3923 | + 0, | ||
| 3924 | + ACX1FF_IE_ACI_CONFIG_SET_LEN, | ||
| 3925 | + 0, | ||
| 3926 | + 0, | ||
| 3927 | + 0, | ||
| 3928 | + 0, | ||
| 3929 | + 0, | ||
| 3930 | + 0, | ||
| 3931 | + ACX1FF_IE_EEPROM_VER_LEN, | ||
| 3932 | +}; | ||
| 3933 | + | ||
| 3934 | +static const u16 | ||
| 3935 | +acx111_ie_len_dot11[] = { | ||
| 3936 | + 0, | ||
| 3937 | + ACX1xx_IE_DOT11_STATION_ID_LEN, | ||
| 3938 | + 0, | ||
| 3939 | + ACX100_IE_DOT11_BEACON_PERIOD_LEN, | ||
| 3940 | + ACX1xx_IE_DOT11_DTIM_PERIOD_LEN, | ||
| 3941 | + ACX1xx_IE_DOT11_SHORT_RETRY_LIMIT_LEN, | ||
| 3942 | + ACX1xx_IE_DOT11_LONG_RETRY_LIMIT_LEN, | ||
| 3943 | + ACX100_IE_DOT11_WEP_DEFAULT_KEY_WRITE_LEN, | ||
| 3944 | + ACX1xx_IE_DOT11_MAX_XMIT_MSDU_LIFETIME_LEN, | ||
| 3945 | + 0, | ||
| 3946 | + ACX1xx_IE_DOT11_CURRENT_REG_DOMAIN_LEN, | ||
| 3947 | + ACX1xx_IE_DOT11_CURRENT_ANTENNA_LEN, | ||
| 3948 | + 0, | ||
| 3949 | + ACX1xx_IE_DOT11_TX_POWER_LEVEL_LEN, | ||
| 3950 | + ACX1xx_IE_DOT11_CURRENT_CCA_MODE_LEN, | ||
| 3951 | + ACX100_IE_DOT11_ED_THRESHOLD_LEN, | ||
| 3952 | + ACX1xx_IE_DOT11_WEP_DEFAULT_KEY_SET_LEN, | ||
| 3953 | + 0, | ||
| 3954 | + 0, | ||
| 3955 | + 0, | ||
| 3956 | +}; | ||
| 3957 | + | ||
| 3958 | + | ||
| 3959 | +#undef FUNC | ||
| 3960 | +#define FUNC "configure" | ||
| 3961 | +#if !ACX_DEBUG | ||
| 3962 | +int | ||
| 3963 | +acx_s_configure(acx_device_t *adev, void *pdr, int type) | ||
| 3964 | +{ | ||
| 3965 | +#else | ||
| 3966 | +int | ||
| 3967 | +acx_s_configure_debug(acx_device_t *adev, void *pdr, int type, const char* typestr) | ||
| 3968 | +{ | ||
| 3969 | +#endif | ||
| 3970 | + u16 len; | ||
| 3971 | + int res; | ||
| 3972 | + | ||
| 3973 | + if (type < 0x1000) | ||
| 3974 | + len = adev->ie_len[type]; | ||
| 3975 | + else | ||
| 3976 | + len = adev->ie_len_dot11[type - 0x1000]; | ||
| 3977 | + | ||
| 3978 | + log(L_CTL, FUNC"(type:%s,len:%u)\n", typestr, len); | ||
| 3979 | + if (unlikely(!len)) { | ||
| 3980 | + log(L_DEBUG, "zero-length type %s?!\n", typestr); | ||
| 3981 | + } | ||
| 3982 | + | ||
| 3983 | + ((acx_ie_generic_t *)pdr)->type = cpu_to_le16(type); | ||
| 3984 | + ((acx_ie_generic_t *)pdr)->len = cpu_to_le16(len); | ||
| 3985 | + res = acx_s_issue_cmd(adev, ACX1xx_CMD_CONFIGURE, pdr, len + 4); | ||
| 3986 | + if (unlikely(OK != res)) { | ||
| 3987 | +#if ACX_DEBUG | ||
| 3988 | + printk("%s: "FUNC"(type:%s) FAILED\n", adev->ndev->name, typestr); | ||
| 3989 | +#else | ||
| 3990 | + printk("%s: "FUNC"(type:0x%X) FAILED\n", adev->ndev->name, type); | ||
| 3991 | +#endif | ||
| 3992 | + /* dump_stack() is already done in issue_cmd() */ | ||
| 3993 | + } | ||
| 3994 | + return res; | ||
| 3995 | +} | ||
| 3996 | + | ||
| 3997 | +#undef FUNC | ||
| 3998 | +#define FUNC "interrogate" | ||
| 3999 | +#if !ACX_DEBUG | ||
| 4000 | +int | ||
| 4001 | +acx_s_interrogate(acx_device_t *adev, void *pdr, int type) | ||
| 4002 | +{ | ||
| 4003 | +#else | ||
| 4004 | +int | ||
| 4005 | +acx_s_interrogate_debug(acx_device_t *adev, void *pdr, int type, | ||
| 4006 | + const char* typestr) | ||
| 4007 | +{ | ||
| 4008 | +#endif | ||
| 4009 | + u16 len; | ||
| 4010 | + int res; | ||
| 4011 | + | ||
| 4012 | + /* FIXME: no check whether this exceeds the array yet. | ||
| 4013 | + * We should probably remember the number of entries... */ | ||
| 4014 | + if (type < 0x1000) | ||
| 4015 | + len = adev->ie_len[type]; | ||
| 4016 | + else | ||
| 4017 | + len = adev->ie_len_dot11[type-0x1000]; | ||
| 4018 | + | ||
| 4019 | + log(L_CTL, FUNC"(type:%s,len:%u)\n", typestr, len); | ||
| 4020 | + | ||
| 4021 | + ((acx_ie_generic_t *)pdr)->type = cpu_to_le16(type); | ||
| 4022 | + ((acx_ie_generic_t *)pdr)->len = cpu_to_le16(len); | ||
| 4023 | + res = acx_s_issue_cmd(adev, ACX1xx_CMD_INTERROGATE, pdr, len + 4); | ||
| 4024 | + if (unlikely(OK != res)) { | ||
| 4025 | +#if ACX_DEBUG | ||
| 4026 | + printk("%s: "FUNC"(type:%s) FAILED\n", adev->ndev->name, typestr); | ||
| 4027 | +#else | ||
| 4028 | + printk("%s: "FUNC"(type:0x%X) FAILED\n", adev->ndev->name, type); | ||
| 4029 | +#endif | ||
| 4030 | + /* dump_stack() is already done in issue_cmd() */ | ||
| 4031 | + } | ||
| 4032 | + return res; | ||
| 4033 | +} | ||
| 4034 | + | ||
| 4035 | +#if CMD_DISCOVERY | ||
| 4036 | +void | ||
| 4037 | +great_inquisitor(acx_device_t *adev) | ||
| 4038 | +{ | ||
| 4039 | + static struct { | ||
| 4040 | + u16 type; | ||
| 4041 | + u16 len; | ||
| 4042 | + /* 0x200 was too large here: */ | ||
| 4043 | + u8 data[0x100 - 4]; | ||
| 4044 | + } ACX_PACKED ie; | ||
| 4045 | + u16 type; | ||
| 4046 | + | ||
| 4047 | + FN_ENTER; | ||
| 4048 | + | ||
| 4049 | + /* 0..0x20, 0x1000..0x1020 */ | ||
| 4050 | + for (type = 0; type <= 0x1020; type++) { | ||
| 4051 | + if (type == 0x21) | ||
| 4052 | + type = 0x1000; | ||
| 4053 | + ie.type = cpu_to_le16(type); | ||
| 4054 | + ie.len = cpu_to_le16(sizeof(ie) - 4); | ||
| 4055 | + acx_s_issue_cmd(adev, ACX1xx_CMD_INTERROGATE, &ie, sizeof(ie)); | ||
| 4056 | + } | ||
| 4057 | + FN_EXIT0; | ||
| 4058 | +} | ||
| 4059 | +#endif | ||
| 4060 | + | ||
| 4061 | + | ||
| 4062 | +#ifdef CONFIG_PROC_FS | ||
| 4063 | +/*********************************************************************** | ||
| 4064 | +** /proc files | ||
| 4065 | +*/ | ||
| 4066 | +/*********************************************************************** | ||
| 4067 | +** acx_l_proc_output | ||
| 4068 | +** Generate content for our /proc entry | ||
| 4069 | +** | ||
| 4070 | +** Arguments: | ||
| 4071 | +** buf is a pointer to write output to | ||
| 4072 | +** adev is the usual pointer to our private struct acx_device | ||
| 4073 | +** Returns: | ||
| 4074 | +** number of bytes actually written to buf | ||
| 4075 | +** Side effects: | ||
| 4076 | +** none | ||
| 4077 | +*/ | ||
| 4078 | +static int | ||
| 4079 | +acx_l_proc_output(char *buf, acx_device_t *adev) | ||
| 4080 | +{ | ||
| 4081 | + char *p = buf; | ||
| 4082 | + int i; | ||
| 4083 | + | ||
| 4084 | + FN_ENTER; | ||
| 4085 | + | ||
| 4086 | + p += sprintf(p, | ||
| 4087 | + "acx driver version:\t\t" ACX_RELEASE "\n" | ||
| 4088 | + "Wireless extension version:\t" STRING(WIRELESS_EXT) "\n" | ||
| 4089 | + "chip name:\t\t\t%s (0x%08X)\n" | ||
| 4090 | + "radio type:\t\t\t0x%02X\n" | ||
| 4091 | + "form factor:\t\t\t0x%02X\n" | ||
| 4092 | + "EEPROM version:\t\t\t0x%02X\n" | ||
| 4093 | + "firmware version:\t\t%s (0x%08X)\n", | ||
| 4094 | + adev->chip_name, adev->firmware_id, | ||
| 4095 | + adev->radio_type, | ||
| 4096 | + adev->form_factor, | ||
| 4097 | + adev->eeprom_version, | ||
| 4098 | + adev->firmware_version, adev->firmware_numver); | ||
| 4099 | + | ||
| 4100 | + for (i = 0; i < VEC_SIZE(adev->sta_list); i++) { | ||
| 4101 | + struct client *bss = &adev->sta_list[i]; | ||
| 4102 | + if (!bss->used) continue; | ||
| 4103 | + p += sprintf(p, "BSS %u BSSID "MACSTR" ESSID %s channel %u " | ||
| 4104 | + "Cap 0x%X SIR %u SNR %u\n", | ||
| 4105 | + i, MAC(bss->bssid), (char*)bss->essid, bss->channel, | ||
| 4106 | + bss->cap_info, bss->sir, bss->snr); | ||
| 4107 | + } | ||
| 4108 | + p += sprintf(p, "status:\t\t\t%u (%s)\n", | ||
| 4109 | + adev->status, acx_get_status_name(adev->status)); | ||
| 4110 | + | ||
| 4111 | + FN_EXIT1(p - buf); | ||
| 4112 | + return p - buf; | ||
| 4113 | +} | ||
| 4114 | + | ||
| 4115 | + | ||
| 4116 | +/*********************************************************************** | ||
| 4117 | +*/ | ||
| 4118 | +static int | ||
| 4119 | +acx_s_proc_diag_output(char *buf, acx_device_t *adev) | ||
| 4120 | +{ | ||
| 4121 | + char *p = buf; | ||
| 4122 | + unsigned long flags; | ||
| 4123 | + unsigned int len = 0, partlen; | ||
| 4124 | + u32 temp1, temp2; | ||
| 4125 | + u8 *st, *st_end; | ||
| 4126 | +#ifdef __BIG_ENDIAN | ||
| 4127 | + u8 *st2; | ||
| 4128 | +#endif | ||
| 4129 | + fw_stats_t *fw_stats; | ||
| 4130 | + char *part_str = NULL; | ||
| 4131 | + fw_stats_tx_t *tx = NULL; | ||
| 4132 | + fw_stats_rx_t *rx = NULL; | ||
| 4133 | + fw_stats_dma_t *dma = NULL; | ||
| 4134 | + fw_stats_irq_t *irq = NULL; | ||
| 4135 | + fw_stats_wep_t *wep = NULL; | ||
| 4136 | + fw_stats_pwr_t *pwr = NULL; | ||
| 4137 | + fw_stats_mic_t *mic = NULL; | ||
| 4138 | + fw_stats_aes_t *aes = NULL; | ||
| 4139 | + fw_stats_event_t *evt = NULL; | ||
| 4140 | + | ||
| 4141 | + FN_ENTER; | ||
| 4142 | + | ||
| 4143 | + acx_lock(adev, flags); | ||
| 4144 | + | ||
| 4145 | +#if defined (ACX_MEM) | ||
| 4146 | + p = acxmem_s_proc_diag_output(p, adev); | ||
| 4147 | +#else | ||
| 4148 | + if (IS_PCI(adev)) | ||
| 4149 | + p = acxpci_s_proc_diag_output(p, adev); | ||
| 4150 | +#endif | ||
| 4151 | + | ||
| 4152 | + p += sprintf(p, | ||
| 4153 | + "\n" | ||
| 4154 | + "** network status **\n" | ||
| 4155 | + "dev_state_mask 0x%04X\n" | ||
| 4156 | + "status %u (%s), " | ||
| 4157 | + "mode %u, channel %u, " | ||
| 4158 | + "reg_dom_id 0x%02X, reg_dom_chanmask 0x%04X, ", | ||
| 4159 | + adev->dev_state_mask, | ||
| 4160 | + adev->status, acx_get_status_name(adev->status), | ||
| 4161 | + adev->mode, adev->channel, | ||
| 4162 | + adev->reg_dom_id, adev->reg_dom_chanmask | ||
| 4163 | + ); | ||
| 4164 | + p += sprintf(p, | ||
| 4165 | + "ESSID \"%s\", essid_active %d, essid_len %d, " | ||
| 4166 | + "essid_for_assoc \"%s\", nick \"%s\"\n" | ||
| 4167 | + "WEP ena %d, restricted %d, idx %d\n", | ||
| 4168 | + adev->essid, adev->essid_active, (int)adev->essid_len, | ||
| 4169 | + adev->essid_for_assoc, adev->nick, | ||
| 4170 | + adev->wep_enabled, adev->wep_restricted, | ||
| 4171 | + adev->wep_current_index); | ||
| 4172 | + p += sprintf(p, "dev_addr "MACSTR"\n", MAC(adev->dev_addr)); | ||
| 4173 | + p += sprintf(p, "bssid "MACSTR"\n", MAC(adev->bssid)); | ||
| 4174 | + p += sprintf(p, "ap_filter "MACSTR"\n", MAC(adev->ap)); | ||
| 4175 | + | ||
| 4176 | + p += sprintf(p, | ||
| 4177 | + "\n" | ||
| 4178 | + "** PHY status **\n" | ||
| 4179 | + "tx_disabled %d, tx_level_dbm %d\n" /* "tx_level_val %d, tx_level_auto %d\n" */ | ||
| 4180 | + "sensitivity %d, antenna 0x%02X, ed_threshold %d, cca %d, preamble_mode %d\n" | ||
| 4181 | + "rate_basic 0x%04X, rate_oper 0x%04X\n" | ||
| 4182 | + "rts_threshold %d, frag_threshold %d, short_retry %d, long_retry %d\n" | ||
| 4183 | + "msdu_lifetime %d, listen_interval %d, beacon_interval %d\n", | ||
| 4184 | + adev->tx_disabled, adev->tx_level_dbm, /* adev->tx_level_val, adev->tx_level_auto, */ | ||
| 4185 | + adev->sensitivity, adev->antenna, adev->ed_threshold, adev->cca, adev->preamble_mode, | ||
| 4186 | + adev->rate_basic, adev->rate_oper, | ||
| 4187 | + adev->rts_threshold, adev->frag_threshold, adev->short_retry, adev->long_retry, | ||
| 4188 | + adev->msdu_lifetime, adev->listen_interval, adev->beacon_interval); | ||
| 4189 | + | ||
| 4190 | + acx_unlock(adev, flags); | ||
| 4191 | + | ||
| 4192 | + p += sprintf(p, | ||
| 4193 | + "\n" | ||
| 4194 | + "** Firmware **\n" | ||
| 4195 | + "NOTE: version dependent statistics layout, " | ||
| 4196 | + "please report if you suspect wrong parsing!\n" | ||
| 4197 | + "\n" | ||
| 4198 | + "version \"%s\"\n", adev->firmware_version); | ||
| 4199 | + | ||
| 4200 | + /* TODO: may replace kmalloc/memset with kzalloc once | ||
| 4201 | + * Linux 2.6.14 is widespread */ | ||
| 4202 | + fw_stats = kmalloc(sizeof(*fw_stats), GFP_KERNEL); | ||
| 4203 | + if (!fw_stats) { | ||
| 4204 | + FN_EXIT1(0); | ||
| 4205 | + return 0; | ||
| 4206 | + } | ||
| 4207 | + memset(fw_stats, 0, sizeof(*fw_stats)); | ||
| 4208 | + | ||
| 4209 | + st = (u8 *)fw_stats; | ||
| 4210 | + | ||
| 4211 | + part_str = "statistics query command"; | ||
| 4212 | + | ||
| 4213 | + if (OK != acx_s_interrogate(adev, st, ACX1xx_IE_FIRMWARE_STATISTICS)) | ||
| 4214 | + goto fw_stats_end; | ||
| 4215 | + | ||
| 4216 | + st += sizeof(u16); | ||
| 4217 | + len = *(u16 *)st; | ||
| 4218 | + | ||
| 4219 | + if (len > sizeof(*fw_stats)) { | ||
| 4220 | + p += sprintf(p, | ||
| 4221 | + "firmware version with bigger fw_stats struct detected\n" | ||
| 4222 | + "(%u vs. %u), please report\n", len, sizeof(fw_stats_t)); | ||
| 4223 | + if (len > sizeof(*fw_stats)) { | ||
| 4224 | + p += sprintf(p, "struct size exceeded allocation!\n"); | ||
| 4225 | + len = sizeof(*fw_stats); | ||
| 4226 | + } | ||
| 4227 | + } | ||
| 4228 | + st += sizeof(u16); | ||
| 4229 | + st_end = st - 2*sizeof(u16) + len; | ||
| 4230 | + | ||
| 4231 | +#ifdef __BIG_ENDIAN | ||
| 4232 | + /* let's make one bold assumption here: | ||
| 4233 | + * (hopefully!) *all* statistics fields are u32 only, | ||
| 4234 | + * thus if we need to make endianness corrections | ||
| 4235 | + * we can simply do them in one go, in advance */ | ||
| 4236 | + st2 = (u8 *)fw_stats; | ||
| 4237 | + for (temp1 = 0; temp1 < len; temp1 += 4, st2 += 4) | ||
| 4238 | + *(u32 *)st2 = le32_to_cpu(*(u32 *)st2); | ||
| 4239 | +#endif | ||
| 4240 | + | ||
| 4241 | + part_str = "Rx/Tx"; | ||
| 4242 | + | ||
| 4243 | + /* directly at end of a struct part? --> no error! */ | ||
| 4244 | + if (st == st_end) | ||
| 4245 | + goto fw_stats_end; | ||
| 4246 | + | ||
| 4247 | + tx = (fw_stats_tx_t *)st; | ||
| 4248 | + st += sizeof(fw_stats_tx_t); | ||
| 4249 | + rx = (fw_stats_rx_t *)st; | ||
| 4250 | + st += sizeof(fw_stats_rx_t); | ||
| 4251 | + partlen = sizeof(fw_stats_tx_t) + sizeof(fw_stats_rx_t); | ||
| 4252 | + | ||
| 4253 | + if (IS_ACX100(adev)) { | ||
| 4254 | + /* at least ACX100 PCI F/W 1.9.8.b | ||
| 4255 | + * and ACX100 USB F/W 1.0.7-USB | ||
| 4256 | + * don't have those two fields... */ | ||
| 4257 | + st -= 2*sizeof(u32); | ||
| 4258 | + | ||
| 4259 | + /* our parsing doesn't quite match this firmware yet, | ||
| 4260 | + * log failure */ | ||
| 4261 | + if (st > st_end) | ||
| 4262 | + goto fw_stats_fail; | ||
| 4263 | + temp1 = temp2 = 999999999; | ||
| 4264 | + } else { | ||
| 4265 | + if (st > st_end) | ||
| 4266 | + goto fw_stats_fail; | ||
| 4267 | + temp1 = rx->rx_aci_events; | ||
| 4268 | + temp2 = rx->rx_aci_resets; | ||
| 4269 | + } | ||
| 4270 | + | ||
| 4271 | + p += sprintf(p, | ||
| 4272 | + "%s:\n" | ||
| 4273 | + " tx_desc_overfl %u\n" | ||
| 4274 | + " rx_OutOfMem %u, rx_hdr_overfl %u, rx_hw_stuck %u\n" | ||
| 4275 | + " rx_dropped_frame %u, rx_frame_ptr_err %u, rx_xfr_hint_trig %u\n" | ||
| 4276 | + " rx_aci_events %u, rx_aci_resets %u\n", | ||
| 4277 | + part_str, | ||
| 4278 | + tx->tx_desc_of, | ||
| 4279 | + rx->rx_oom, | ||
| 4280 | + rx->rx_hdr_of, | ||
| 4281 | + rx->rx_hw_stuck, | ||
| 4282 | + rx->rx_dropped_frame, | ||
| 4283 | + rx->rx_frame_ptr_err, | ||
| 4284 | + rx->rx_xfr_hint_trig, | ||
| 4285 | + temp1, | ||
| 4286 | + temp2); | ||
| 4287 | + | ||
| 4288 | + part_str = "DMA"; | ||
| 4289 | + | ||
| 4290 | + if (st == st_end) | ||
| 4291 | + goto fw_stats_end; | ||
| 4292 | + | ||
| 4293 | + dma = (fw_stats_dma_t *)st; | ||
| 4294 | + partlen = sizeof(fw_stats_dma_t); | ||
| 4295 | + st += partlen; | ||
| 4296 | + | ||
| 4297 | + if (st > st_end) | ||
| 4298 | + goto fw_stats_fail; | ||
| 4299 | + | ||
| 4300 | + p += sprintf(p, | ||
| 4301 | + "%s:\n" | ||
| 4302 | + " rx_dma_req %u, rx_dma_err %u, tx_dma_req %u, tx_dma_err %u\n", | ||
| 4303 | + part_str, | ||
| 4304 | + dma->rx_dma_req, | ||
| 4305 | + dma->rx_dma_err, | ||
| 4306 | + dma->tx_dma_req, | ||
| 4307 | + dma->tx_dma_err); | ||
| 4308 | + | ||
| 4309 | + part_str = "IRQ"; | ||
| 4310 | + | ||
| 4311 | + if (st == st_end) | ||
| 4312 | + goto fw_stats_end; | ||
| 4313 | + | ||
| 4314 | + irq = (fw_stats_irq_t *)st; | ||
| 4315 | + partlen = sizeof(fw_stats_irq_t); | ||
| 4316 | + st += partlen; | ||
| 4317 | + | ||
| 4318 | + if (st > st_end) | ||
| 4319 | + goto fw_stats_fail; | ||
| 4320 | + | ||
| 4321 | + p += sprintf(p, | ||
| 4322 | + "%s:\n" | ||
| 4323 | + " cmd_cplt %u, fiq %u\n" | ||
| 4324 | + " rx_hdrs %u, rx_cmplt %u, rx_mem_overfl %u, rx_rdys %u\n" | ||
| 4325 | + " irqs %u, tx_procs %u, decrypt_done %u\n" | ||
| 4326 | + " dma_0_done %u, dma_1_done %u, tx_exch_complet %u\n" | ||
| 4327 | + " commands %u, rx_procs %u, hw_pm_mode_changes %u\n" | ||
| 4328 | + " host_acks %u, pci_pm %u, acm_wakeups %u\n", | ||
| 4329 | + part_str, | ||
| 4330 | + irq->cmd_cplt, | ||
| 4331 | + irq->fiq, | ||
| 4332 | + irq->rx_hdrs, | ||
| 4333 | + irq->rx_cmplt, | ||
| 4334 | + irq->rx_mem_of, | ||
| 4335 | + irq->rx_rdys, | ||
| 4336 | + irq->irqs, | ||
| 4337 | + irq->tx_procs, | ||
| 4338 | + irq->decrypt_done, | ||
| 4339 | + irq->dma_0_done, | ||
| 4340 | + irq->dma_1_done, | ||
| 4341 | + irq->tx_exch_complet, | ||
| 4342 | + irq->commands, | ||
| 4343 | + irq->rx_procs, | ||
| 4344 | + irq->hw_pm_mode_changes, | ||
| 4345 | + irq->host_acks, | ||
| 4346 | + irq->pci_pm, | ||
| 4347 | + irq->acm_wakeups); | ||
| 4348 | + | ||
| 4349 | + part_str = "WEP"; | ||
| 4350 | + | ||
| 4351 | + if (st == st_end) | ||
| 4352 | + goto fw_stats_end; | ||
| 4353 | + | ||
| 4354 | + wep = (fw_stats_wep_t *)st; | ||
| 4355 | + partlen = sizeof(fw_stats_wep_t); | ||
| 4356 | + st += partlen; | ||
| 4357 | + | ||
| 4358 | + if ( | ||
| 4359 | + (IS_PCI(adev) && IS_ACX100(adev)) | ||
| 4360 | + || (IS_USB(adev) && IS_ACX100(adev)) | ||
| 4361 | + || (IS_MEM(adev) && IS_ACX100(adev)) | ||
| 4362 | + ) { | ||
| 4363 | + /* at least ACX100 PCI F/W 1.9.8.b, | ||
| 4364 | + * ACX100 USB F/W 1.0.7-USB | ||
| 4365 | + * and ACX100 Generic Slave F/W 1.10.7.K | ||
| 4366 | + * don't have those two fields... | ||
| 4367 | + */ | ||
| 4368 | + st -= 2*sizeof(u32); | ||
| 4369 | + if (st > st_end) | ||
| 4370 | + goto fw_stats_fail; | ||
| 4371 | + temp1 = temp2 = 999999999; | ||
| 4372 | + } else { | ||
| 4373 | + if (st > st_end) | ||
| 4374 | + goto fw_stats_fail; | ||
| 4375 | + temp1 = wep->wep_pkt_decrypt; | ||
| 4376 | + temp2 = wep->wep_decrypt_irqs; | ||
| 4377 | + } | ||
| 4378 | + | ||
| 4379 | + p += sprintf(p, | ||
| 4380 | + "%s:\n" | ||
| 4381 | + " wep_key_count %u, wep_default_key_count %u, dot11_def_key_mib %u\n" | ||
| 4382 | + " wep_key_not_found %u, wep_decrypt_fail %u\n" | ||
| 4383 | + " wep_pkt_decrypt %u, wep_decrypt_irqs %u\n", | ||
| 4384 | + part_str, | ||
| 4385 | + wep->wep_key_count, | ||
| 4386 | + wep->wep_default_key_count, | ||
| 4387 | + wep->dot11_def_key_mib, | ||
| 4388 | + wep->wep_key_not_found, | ||
| 4389 | + wep->wep_decrypt_fail, | ||
| 4390 | + temp1, | ||
| 4391 | + temp2); | ||
| 4392 | + | ||
| 4393 | + part_str = "power"; | ||
| 4394 | + | ||
| 4395 | + if (st == st_end) | ||
| 4396 | + goto fw_stats_end; | ||
| 4397 | + | ||
| 4398 | + pwr = (fw_stats_pwr_t *)st; | ||
| 4399 | + partlen = sizeof(fw_stats_pwr_t); | ||
| 4400 | + st += partlen; | ||
| 4401 | + | ||
| 4402 | + if (st > st_end) | ||
| 4403 | + goto fw_stats_fail; | ||
| 4404 | + | ||
| 4405 | + p += sprintf(p, | ||
| 4406 | + "%s:\n" | ||
| 4407 | + " tx_start_ctr %u, no_ps_tx_too_short %u\n" | ||
| 4408 | + " rx_start_ctr %u, no_ps_rx_too_short %u\n" | ||
| 4409 | + " lppd_started %u\n" | ||
| 4410 | + " no_lppd_too_noisy %u, no_lppd_too_short %u, no_lppd_matching_frame %u\n", | ||
| 4411 | + part_str, | ||
| 4412 | + pwr->tx_start_ctr, | ||
| 4413 | + pwr->no_ps_tx_too_short, | ||
| 4414 | + pwr->rx_start_ctr, | ||
| 4415 | + pwr->no_ps_rx_too_short, | ||
| 4416 | + pwr->lppd_started, | ||
| 4417 | + pwr->no_lppd_too_noisy, | ||
| 4418 | + pwr->no_lppd_too_short, | ||
| 4419 | + pwr->no_lppd_matching_frame); | ||
| 4420 | + | ||
| 4421 | + part_str = "MIC"; | ||
| 4422 | + | ||
| 4423 | + if (st == st_end) | ||
| 4424 | + goto fw_stats_end; | ||
| 4425 | + | ||
| 4426 | + mic = (fw_stats_mic_t *)st; | ||
| 4427 | + partlen = sizeof(fw_stats_mic_t); | ||
| 4428 | + st += partlen; | ||
| 4429 | + | ||
| 4430 | + if (st > st_end) | ||
| 4431 | + goto fw_stats_fail; | ||
| 4432 | + | ||
| 4433 | + p += sprintf(p, | ||
| 4434 | + "%s:\n" | ||
| 4435 | + " mic_rx_pkts %u, mic_calc_fail %u\n", | ||
| 4436 | + part_str, | ||
| 4437 | + mic->mic_rx_pkts, | ||
| 4438 | + mic->mic_calc_fail); | ||
| 4439 | + | ||
| 4440 | + part_str = "AES"; | ||
| 4441 | + | ||
| 4442 | + if (st == st_end) | ||
| 4443 | + goto fw_stats_end; | ||
| 4444 | + | ||
| 4445 | + aes = (fw_stats_aes_t *)st; | ||
| 4446 | + partlen = sizeof(fw_stats_aes_t); | ||
| 4447 | + st += partlen; | ||
| 4448 | + | ||
| 4449 | + if (st > st_end) | ||
| 4450 | + goto fw_stats_fail; | ||
| 4451 | + | ||
| 4452 | + p += sprintf(p, | ||
| 4453 | + "%s:\n" | ||
| 4454 | + " aes_enc_fail %u, aes_dec_fail %u\n" | ||
| 4455 | + " aes_enc_pkts %u, aes_dec_pkts %u\n" | ||
| 4456 | + " aes_enc_irq %u, aes_dec_irq %u\n", | ||
| 4457 | + part_str, | ||
| 4458 | + aes->aes_enc_fail, | ||
| 4459 | + aes->aes_dec_fail, | ||
| 4460 | + aes->aes_enc_pkts, | ||
| 4461 | + aes->aes_dec_pkts, | ||
| 4462 | + aes->aes_enc_irq, | ||
| 4463 | + aes->aes_dec_irq); | ||
| 4464 | + | ||
| 4465 | + part_str = "event"; | ||
| 4466 | + | ||
| 4467 | + if (st == st_end) | ||
| 4468 | + goto fw_stats_end; | ||
| 4469 | + | ||
| 4470 | + evt = (fw_stats_event_t *)st; | ||
| 4471 | + partlen = sizeof(fw_stats_event_t); | ||
| 4472 | + st += partlen; | ||
| 4473 | + | ||
| 4474 | + if (st > st_end) | ||
| 4475 | + goto fw_stats_fail; | ||
| 4476 | + | ||
| 4477 | + p += sprintf(p, | ||
| 4478 | + "%s:\n" | ||
| 4479 | + " heartbeat %u, calibration %u\n" | ||
| 4480 | + " rx_mismatch %u, rx_mem_empty %u, rx_pool %u\n" | ||
| 4481 | + " oom_late %u\n" | ||
| 4482 | + " phy_tx_err %u, tx_stuck %u\n", | ||
| 4483 | + part_str, | ||
| 4484 | + evt->heartbeat, | ||
| 4485 | + evt->calibration, | ||
| 4486 | + evt->rx_mismatch, | ||
| 4487 | + evt->rx_mem_empty, | ||
| 4488 | + evt->rx_pool, | ||
| 4489 | + evt->oom_late, | ||
| 4490 | + evt->phy_tx_err, | ||
| 4491 | + evt->tx_stuck); | ||
| 4492 | + | ||
| 4493 | + if (st < st_end) | ||
| 4494 | + goto fw_stats_bigger; | ||
| 4495 | + | ||
| 4496 | + goto fw_stats_end; | ||
| 4497 | + | ||
| 4498 | +fw_stats_fail: | ||
| 4499 | + st -= partlen; | ||
| 4500 | + p += sprintf(p, | ||
| 4501 | + "failed at %s part (size %u), offset %u (struct size %u), " | ||
| 4502 | + "please report\n", part_str, partlen, | ||
| 4503 | + (int)st - (int)fw_stats, len); | ||
| 4504 | + | ||
| 4505 | +fw_stats_bigger: | ||
| 4506 | + for (; st < st_end; st += 4) | ||
| 4507 | + p += sprintf(p, | ||
| 4508 | + "UNKN%3d: %u\n", (int)st - (int)fw_stats, *(u32 *)st); | ||
| 4509 | + | ||
| 4510 | +fw_stats_end: | ||
| 4511 | + kfree(fw_stats); | ||
| 4512 | + | ||
| 4513 | + FN_EXIT1(p - buf); | ||
| 4514 | + return p - buf; | ||
| 4515 | +} | ||
| 4516 | + | ||
| 4517 | + | ||
| 4518 | +/*********************************************************************** | ||
| 4519 | +*/ | ||
| 4520 | +static int | ||
| 4521 | +acx_s_proc_phy_output(char *buf, acx_device_t *adev) | ||
| 4522 | +{ | ||
| 4523 | + char *p = buf; | ||
| 4524 | + int i; | ||
| 4525 | + | ||
| 4526 | + FN_ENTER; | ||
| 4527 | + | ||
| 4528 | + /* | ||
| 4529 | + if (RADIO_RFMD_11 != adev->radio_type) { | ||
| 4530 | + printk("sorry, not yet adapted for radio types " | ||
| 4531 | + "other than RFMD, please verify " | ||
| 4532 | + "PHY size etc. first!\n"); | ||
| 4533 | + goto end; | ||
| 4534 | + } | ||
| 4535 | + */ | ||
| 4536 | + | ||
| 4537 | + /* The PHY area is only 0x80 bytes long; further pages after that | ||
| 4538 | + * only have some page number registers with altered value, | ||
| 4539 | + * all other registers remain the same. */ | ||
| 4540 | + for (i = 0; i < 0x80; i++) { | ||
| 4541 | + acx_s_read_phy_reg(adev, i, p++); | ||
| 4542 | + } | ||
| 4543 | + | ||
| 4544 | + FN_EXIT1(p - buf); | ||
| 4545 | + return p - buf; | ||
| 4546 | +} | ||
| 4547 | + | ||
| 4548 | + | ||
| 4549 | +/*********************************************************************** | ||
| 4550 | +** acx_e_read_proc_XXXX | ||
| 4551 | +** Handle our /proc entry | ||
| 4552 | +** | ||
| 4553 | +** Arguments: | ||
| 4554 | +** standard kernel read_proc interface | ||
| 4555 | +** Returns: | ||
| 4556 | +** number of bytes written to buf | ||
| 4557 | +** Side effects: | ||
| 4558 | +** none | ||
| 4559 | +*/ | ||
| 4560 | +static int | ||
| 4561 | +acx_e_read_proc(char *buf, char **start, off_t offset, int count, | ||
| 4562 | + int *eof, void *data) | ||
| 4563 | +{ | ||
| 4564 | + acx_device_t *adev = (acx_device_t*)data; | ||
| 4565 | + unsigned long flags; | ||
| 4566 | + int length; | ||
| 4567 | + | ||
| 4568 | + FN_ENTER; | ||
| 4569 | + | ||
| 4570 | + acx_sem_lock(adev); | ||
| 4571 | + acx_lock(adev, flags); | ||
| 4572 | + /* fill buf */ | ||
| 4573 | + length = acx_l_proc_output(buf, adev); | ||
| 4574 | + acx_unlock(adev, flags); | ||
| 4575 | + acx_sem_unlock(adev); | ||
| 4576 | + | ||
| 4577 | + /* housekeeping */ | ||
| 4578 | + if (length <= offset + count) | ||
| 4579 | + *eof = 1; | ||
| 4580 | + *start = buf + offset; | ||
| 4581 | + length -= offset; | ||
| 4582 | + if (length > count) | ||
| 4583 | + length = count; | ||
| 4584 | + if (length < 0) | ||
| 4585 | + length = 0; | ||
| 4586 | + FN_EXIT1(length); | ||
| 4587 | + return length; | ||
| 4588 | +} | ||
| 4589 | + | ||
| 4590 | +static char _buf[32768]; | ||
| 4591 | +static int | ||
| 4592 | +acx_e_read_proc_diag(char *buf, char **start, off_t offset, int count, | ||
| 4593 | + int *eof, void *data) | ||
| 4594 | +{ | ||
| 4595 | + acx_device_t *adev = (acx_device_t*)data; | ||
| 4596 | + int length; | ||
| 4597 | + | ||
| 4598 | + FN_ENTER; | ||
| 4599 | + | ||
| 4600 | + acx_sem_lock(adev); | ||
| 4601 | + /* fill buf */ | ||
| 4602 | + length = acx_s_proc_diag_output(_buf, adev); | ||
| 4603 | + acx_sem_unlock(adev); | ||
| 4604 | + | ||
| 4605 | + memcpy(buf, _buf + offset, count); | ||
| 4606 | + | ||
| 4607 | + /* housekeeping */ | ||
| 4608 | + if (length <= offset + count) | ||
| 4609 | + *eof = 1; | ||
| 4610 | + *start = count; | ||
| 4611 | + length -= offset; | ||
| 4612 | + if (length > count) | ||
| 4613 | + length = count; | ||
| 4614 | + if (length < 0) | ||
| 4615 | + length = 0; | ||
| 4616 | + FN_EXIT1(length); | ||
| 4617 | + return length; | ||
| 4618 | +} | ||
| 4619 | + | ||
| 4620 | +static int | ||
| 4621 | +acx_e_read_proc_eeprom(char *buf, char **start, off_t offset, int count, | ||
| 4622 | + int *eof, void *data) | ||
| 4623 | +{ | ||
| 4624 | + acx_device_t *adev = (acx_device_t*)data; | ||
| 4625 | + int length; | ||
| 4626 | + | ||
| 4627 | + FN_ENTER; | ||
| 4628 | + | ||
| 4629 | + /* fill buf */ | ||
| 4630 | + length = 0; | ||
| 4631 | +#if defined (ACX_MEM) | ||
| 4632 | + acx_sem_lock(adev); | ||
| 4633 | + length = acxmem_proc_eeprom_output(buf, adev); | ||
| 4634 | + acx_sem_unlock(adev); | ||
| 4635 | +#else | ||
| 4636 | + if (IS_PCI(adev)) { | ||
| 4637 | + acx_sem_lock(adev); | ||
| 4638 | + length = acxpci_proc_eeprom_output(buf, adev); | ||
| 4639 | + acx_sem_unlock(adev); | ||
| 4640 | + } | ||
| 4641 | +#endif | ||
| 4642 | + | ||
| 4643 | + /* housekeeping */ | ||
| 4644 | + if (length <= offset + count) | ||
| 4645 | + *eof = 1; | ||
| 4646 | + *start = buf + offset; | ||
| 4647 | + length -= offset; | ||
| 4648 | + if (length > count) | ||
| 4649 | + length = count; | ||
| 4650 | + if (length < 0) | ||
| 4651 | + length = 0; | ||
| 4652 | + FN_EXIT1(length); | ||
| 4653 | + return length; | ||
| 4654 | +} | ||
| 4655 | + | ||
| 4656 | +static int | ||
| 4657 | +acx_e_read_proc_phy(char *buf, char **start, off_t offset, int count, | ||
| 4658 | + int *eof, void *data) | ||
| 4659 | +{ | ||
| 4660 | + acx_device_t *adev = (acx_device_t*)data; | ||
| 4661 | + int length; | ||
| 4662 | + | ||
| 4663 | + FN_ENTER; | ||
| 4664 | + | ||
| 4665 | + acx_sem_lock(adev); | ||
| 4666 | + /* fill buf */ | ||
| 4667 | + length = acx_s_proc_phy_output(buf, adev); | ||
| 4668 | + acx_sem_unlock(adev); | ||
| 4669 | + | ||
| 4670 | + /* housekeeping */ | ||
| 4671 | + if (length <= offset + count) | ||
| 4672 | + *eof = 1; | ||
| 4673 | + *start = buf + offset; | ||
| 4674 | + length -= offset; | ||
| 4675 | + if (length > count) | ||
| 4676 | + length = count; | ||
| 4677 | + if (length < 0) | ||
| 4678 | + length = 0; | ||
| 4679 | + FN_EXIT1(length); | ||
| 4680 | + return length; | ||
| 4681 | +} | ||
| 4682 | + | ||
| 4683 | + | ||
| 4684 | +/*********************************************************************** | ||
| 4685 | +** /proc files registration | ||
| 4686 | +*/ | ||
| 4687 | +static const char * const | ||
| 4688 | +proc_files[] = { "", "_diag", "_eeprom", "_phy" }; | ||
| 4689 | + | ||
| 4690 | +static read_proc_t * const | ||
| 4691 | +proc_funcs[] = { | ||
| 4692 | + acx_e_read_proc, | ||
| 4693 | + acx_e_read_proc_diag, | ||
| 4694 | + acx_e_read_proc_eeprom, | ||
| 4695 | + acx_e_read_proc_phy | ||
| 4696 | +}; | ||
| 4697 | + | ||
| 4698 | +static int | ||
| 4699 | +manage_proc_entries(const struct net_device *ndev, int remove) | ||
| 4700 | +{ | ||
| 4701 | + acx_device_t *adev = ndev2adev((struct net_device *)ndev); | ||
| 4702 | + char procbuf[80]; | ||
| 4703 | + int i; | ||
| 4704 | + | ||
| 4705 | + for (i = 0; i < VEC_SIZE(proc_files); i++) { | ||
| 4706 | + snprintf(procbuf, sizeof(procbuf), | ||
| 4707 | + "driver/acx_%s%s", ndev->name, proc_files[i]); | ||
| 4708 | + log(L_INIT, "%sing /proc entry %s\n", | ||
| 4709 | + remove ? "remov" : "creat", procbuf); | ||
| 4710 | + if (!remove) { | ||
| 4711 | + if (!create_proc_read_entry(procbuf, 0, 0, proc_funcs[i], adev)) { | ||
| 4712 | + printk("acx: cannot register /proc entry %s\n", procbuf); | ||
| 4713 | + return NOT_OK; | ||
| 4714 | + } | ||
| 4715 | + } else { | ||
| 4716 | + remove_proc_entry(procbuf, NULL); | ||
| 4717 | + } | ||
| 4718 | + } | ||
| 4719 | + return OK; | ||
| 4720 | +} | ||
| 4721 | + | ||
| 4722 | +int | ||
| 4723 | +acx_proc_register_entries(const struct net_device *ndev) | ||
| 4724 | +{ | ||
| 4725 | + return manage_proc_entries(ndev, 0); | ||
| 4726 | +} | ||
| 4727 | + | ||
| 4728 | +int | ||
| 4729 | +acx_proc_unregister_entries(const struct net_device *ndev) | ||
| 4730 | +{ | ||
| 4731 | + return manage_proc_entries(ndev, 1); | ||
| 4732 | +} | ||
| 4733 | +#endif /* CONFIG_PROC_FS */ | ||
| 4734 | + | ||
| 4735 | + | ||
| 4736 | +/*********************************************************************** | ||
| 4737 | +** acx_cmd_join_bssid | ||
| 4738 | +** | ||
| 4739 | +** Common code for both acx100 and acx111. | ||
| 4740 | +*/ | ||
| 4741 | +/* NB: does NOT match RATE100_nn but matches ACX[111]_SCAN_RATE_n */ | ||
| 4742 | +static const u8 | ||
| 4743 | +bitpos2genframe_txrate[] = { | ||
| 4744 | + 10, /* 0. 1 Mbit/s */ | ||
| 4745 | + 20, /* 1. 2 Mbit/s */ | ||
| 4746 | + 55, /* 2. 5.5 Mbit/s */ | ||
| 4747 | + 0x0B, /* 3. 6 Mbit/s */ | ||
| 4748 | + 0x0F, /* 4. 9 Mbit/s */ | ||
| 4749 | + 110, /* 5. 11 Mbit/s */ | ||
| 4750 | + 0x0A, /* 6. 12 Mbit/s */ | ||
| 4751 | + 0x0E, /* 7. 18 Mbit/s */ | ||
| 4752 | + 220, /* 8. 22 Mbit/s */ | ||
| 4753 | + 0x09, /* 9. 24 Mbit/s */ | ||
| 4754 | + 0x0D, /* 10. 36 Mbit/s */ | ||
| 4755 | + 0x08, /* 11. 48 Mbit/s */ | ||
| 4756 | + 0x0C, /* 12. 54 Mbit/s */ | ||
| 4757 | + 10, /* 13. 1 Mbit/s, should never happen */ | ||
| 4758 | + 10, /* 14. 1 Mbit/s, should never happen */ | ||
| 4759 | + 10, /* 15. 1 Mbit/s, should never happen */ | ||
| 4760 | +}; | ||
| 4761 | + | ||
| 4762 | +/* Looks scary, eh? | ||
| 4763 | +** Actually, each one compiled into one AND and one SHIFT, | ||
| 4764 | +** 31 bytes in x86 asm (more if uints are replaced by u16/u8) */ | ||
| 4765 | +static inline unsigned int | ||
| 4766 | +rate111to5bits(unsigned int rate) | ||
| 4767 | +{ | ||
| 4768 | + return (rate & 0x7) | ||
| 4769 | + | ( (rate & RATE111_11) / (RATE111_11/JOINBSS_RATES_11) ) | ||
| 4770 | + | ( (rate & RATE111_22) / (RATE111_22/JOINBSS_RATES_22) ) | ||
| 4771 | + ; | ||
| 4772 | +} | ||
| 4773 | + | ||
| 4774 | +static void | ||
| 4775 | +acx_s_cmd_join_bssid(acx_device_t *adev, const u8 *bssid) | ||
| 4776 | +{ | ||
| 4777 | + acx_joinbss_t tmp; | ||
| 4778 | + int dtim_interval; | ||
| 4779 | + int i; | ||
| 4780 | + | ||
| 4781 | + if (mac_is_zero(bssid)) | ||
| 4782 | + return; | ||
| 4783 | + | ||
| 4784 | + FN_ENTER; | ||
| 4785 | + | ||
| 4786 | + dtim_interval = (ACX_MODE_0_ADHOC == adev->mode) ? | ||
| 4787 | + 1 : adev->dtim_interval; | ||
| 4788 | + | ||
| 4789 | + memset(&tmp, 0, sizeof(tmp)); | ||
| 4790 | + | ||
| 4791 | + for (i = 0; i < ETH_ALEN; i++) { | ||
| 4792 | + tmp.bssid[i] = bssid[ETH_ALEN-1 - i]; | ||
| 4793 | + } | ||
| 4794 | + | ||
| 4795 | + tmp.beacon_interval = cpu_to_le16(adev->beacon_interval); | ||
| 4796 | + | ||
| 4797 | + /* Basic rate set. Control frame responses (such as ACK or CTS frames) | ||
| 4798 | + ** are sent with one of these rates */ | ||
| 4799 | + if (IS_ACX111(adev)) { | ||
| 4800 | + /* It was experimentally determined that rates_basic | ||
| 4801 | + ** can take 11g rates as well, not only rates | ||
| 4802 | + ** defined with JOINBSS_RATES_BASIC111_nnn. | ||
| 4803 | + ** Just use RATE111_nnn constants... */ | ||
| 4804 | + tmp.u.acx111.dtim_interval = dtim_interval; | ||
| 4805 | + tmp.u.acx111.rates_basic = cpu_to_le16(adev->rate_basic); | ||
| 4806 | + log(L_ASSOC, "rates_basic:%04X, rates_supported:%04X\n", | ||
| 4807 | + adev->rate_basic, adev->rate_oper); | ||
| 4808 | + } else { | ||
| 4809 | + tmp.u.acx100.dtim_interval = dtim_interval; | ||
| 4810 | + tmp.u.acx100.rates_basic = rate111to5bits(adev->rate_basic); | ||
| 4811 | + tmp.u.acx100.rates_supported = rate111to5bits(adev->rate_oper); | ||
| 4812 | + log(L_ASSOC, "rates_basic:%04X->%02X, " | ||
| 4813 | + "rates_supported:%04X->%02X\n", | ||
| 4814 | + adev->rate_basic, tmp.u.acx100.rates_basic, | ||
| 4815 | + adev->rate_oper, tmp.u.acx100.rates_supported); | ||
| 4816 | + } | ||
| 4817 | + | ||
| 4818 | + /* Setting up how Beacon, Probe Response, RTS, and PS-Poll frames | ||
| 4819 | + ** will be sent (rate/modulation/preamble) */ | ||
| 4820 | + tmp.u.txrate.genfrm_txrate = bitpos2genframe_txrate[lowest_bit(adev->rate_basic)]; | ||
| 4821 | + tmp.genfrm_mod_pre = 0; /* FIXME: was = adev->capab_short (which was always 0); */ | ||
| 4822 | + /* we can use short pre *if* all peers can understand it */ | ||
| 4823 | + /* FIXME #2: we need to correctly set PBCC/OFDM bits here too */ | ||
| 4824 | + | ||
| 4825 | + /* we switch fw to STA mode in MONITOR mode, it seems to be | ||
| 4826 | + ** the only mode where fw does not emit beacons by itself | ||
| 4827 | + ** but allows us to send anything (we really want to retain | ||
| 4828 | + ** ability to tx arbitrary frames in MONITOR mode) | ||
| 4829 | + */ | ||
| 4830 | + tmp.macmode = (adev->mode != ACX_MODE_MONITOR ? adev->mode : ACX_MODE_2_STA); | ||
| 4831 | + tmp.channel = adev->channel; | ||
| 4832 | + tmp.essid_len = adev->essid_len; | ||
| 4833 | + /* NOTE: the code memcpy'd essid_len + 1 before, which is WRONG! */ | ||
| 4834 | + memcpy(tmp.essid, adev->essid, tmp.essid_len); | ||
| 4835 | + acx_s_issue_cmd(adev, ACX1xx_CMD_JOIN, &tmp, tmp.essid_len + 0x11); | ||
| 4836 | + | ||
| 4837 | + log(L_ASSOC|L_DEBUG, "BSS_Type = %u\n", tmp.macmode); | ||
| 4838 | + acxlog_mac(L_ASSOC|L_DEBUG, "JoinBSSID MAC:", adev->bssid, "\n"); | ||
| 4839 | + | ||
| 4840 | + acx_update_capabilities(adev); | ||
| 4841 | + FN_EXIT0; | ||
| 4842 | +} | ||
| 4843 | + | ||
| 4844 | + | ||
| 4845 | +/*********************************************************************** | ||
| 4846 | +** acx_s_cmd_start_scan | ||
| 4847 | +** | ||
| 4848 | +** Issue scan command to the hardware | ||
| 4849 | +** | ||
| 4850 | +** unified function for both ACX111 and ACX100 | ||
| 4851 | +*/ | ||
| 4852 | +static void | ||
| 4853 | +acx_s_scan_chan(acx_device_t *adev) | ||
| 4854 | +{ | ||
| 4855 | + union { | ||
| 4856 | + acx111_scan_t acx111; | ||
| 4857 | + acx100_scan_t acx100; | ||
| 4858 | + } s; | ||
| 4859 | + | ||
| 4860 | + FN_ENTER; | ||
| 4861 | + | ||
| 4862 | + memset(&s, 0, sizeof(s)); | ||
| 4863 | + | ||
| 4864 | + /* first common positions... */ | ||
| 4865 | + | ||
| 4866 | + s.acx111.count = cpu_to_le16(adev->scan_count); | ||
| 4867 | + s.acx111.rate = adev->scan_rate; | ||
| 4868 | + s.acx111.options = adev->scan_mode; | ||
| 4869 | + s.acx111.chan_duration = cpu_to_le16(adev->scan_duration); | ||
| 4870 | + s.acx111.max_probe_delay = cpu_to_le16(adev->scan_probe_delay); | ||
| 4871 | + | ||
| 4872 | + /* ...then differences */ | ||
| 4873 | + | ||
| 4874 | + if (IS_ACX111(adev)) { | ||
| 4875 | + s.acx111.channel_list_select = 0; /* scan every allowed channel */ | ||
| 4876 | + /*s.acx111.channel_list_select = 1;*/ /* scan given channels */ | ||
| 4877 | + /*s.acx111.modulation = 0x40;*/ /* long preamble? OFDM? -> only for active scan */ | ||
| 4878 | + s.acx111.modulation = 0; | ||
| 4879 | + /*s.acx111.channel_list[0] = 6; | ||
| 4880 | + s.acx111.channel_list[1] = 4;*/ | ||
| 4881 | + } else { | ||
| 4882 | + s.acx100.start_chan = cpu_to_le16(1); | ||
| 4883 | + s.acx100.flags = cpu_to_le16(0x8000); | ||
| 4884 | + } | ||
| 4885 | + | ||
| 4886 | + acx_s_issue_cmd(adev, ACX1xx_CMD_SCAN, &s, sizeof(s)); | ||
| 4887 | + FN_EXIT0; | ||
| 4888 | +} | ||
| 4889 | + | ||
| 4890 | + | ||
| 4891 | +void | ||
| 4892 | +acx_s_cmd_start_scan(acx_device_t *adev) | ||
| 4893 | +{ | ||
| 4894 | + /* time_before check is 'just in case' thing */ | ||
| 4895 | + if (!(adev->irq_status & HOST_INT_SCAN_COMPLETE) | ||
| 4896 | + && time_before(jiffies, adev->scan_start + 10*HZ) | ||
| 4897 | + ) { | ||
| 4898 | + log(L_INIT, "start_scan: seems like previous scan " | ||
| 4899 | + "is still running. Not starting anew. Please report\n"); | ||
| 4900 | + return; | ||
| 4901 | + } | ||
| 4902 | + | ||
| 4903 | + log(L_INIT, "starting radio scan\n"); | ||
| 4904 | + /* remember that fw is commanded to do scan */ | ||
| 4905 | + adev->scan_start = jiffies; | ||
| 4906 | + CLEAR_BIT(adev->irq_status, HOST_INT_SCAN_COMPLETE); | ||
| 4907 | + /* issue it */ | ||
| 4908 | + acx_s_scan_chan(adev); | ||
| 4909 | +} | ||
| 4910 | + | ||
| 4911 | + | ||
| 4912 | +/*********************************************************************** | ||
| 4913 | +** acx111 feature config | ||
| 4914 | +*/ | ||
| 4915 | +static int | ||
| 4916 | +acx111_s_get_feature_config(acx_device_t *adev, | ||
| 4917 | + u32 *feature_options, u32 *data_flow_options) | ||
| 4918 | +{ | ||
| 4919 | + struct acx111_ie_feature_config feat; | ||
| 4920 | + | ||
| 4921 | + if (!IS_ACX111(adev)) { | ||
| 4922 | + return NOT_OK; | ||
| 4923 | + } | ||
| 4924 | + | ||
| 4925 | + memset(&feat, 0, sizeof(feat)); | ||
| 4926 | + | ||
| 4927 | + if (OK != acx_s_interrogate(adev, &feat, ACX1xx_IE_FEATURE_CONFIG)) { | ||
| 4928 | + return NOT_OK; | ||
| 4929 | + } | ||
| 4930 | + log(L_DEBUG, | ||
| 4931 | + "got Feature option:0x%X, DataFlow option: 0x%X\n", | ||
| 4932 | + feat.feature_options, | ||
| 4933 | + feat.data_flow_options); | ||
| 4934 | + | ||
| 4935 | + if (feature_options) | ||
| 4936 | + *feature_options = le32_to_cpu(feat.feature_options); | ||
| 4937 | + if (data_flow_options) | ||
| 4938 | + *data_flow_options = le32_to_cpu(feat.data_flow_options); | ||
| 4939 | + | ||
| 4940 | + return OK; | ||
| 4941 | +} | ||
| 4942 | + | ||
| 4943 | +static int | ||
| 4944 | +acx111_s_set_feature_config(acx_device_t *adev, | ||
| 4945 | + u32 feature_options, u32 data_flow_options, | ||
| 4946 | + unsigned int mode /* 0 == remove, 1 == add, 2 == set */) | ||
| 4947 | +{ | ||
| 4948 | + struct acx111_ie_feature_config feat; | ||
| 4949 | + | ||
| 4950 | + if (!IS_ACX111(adev)) { | ||
| 4951 | + return NOT_OK; | ||
| 4952 | + } | ||
| 4953 | + | ||
| 4954 | + if ((mode < 0) || (mode > 2)) | ||
| 4955 | + return NOT_OK; | ||
| 4956 | + | ||
| 4957 | + if (mode != 2) | ||
| 4958 | + /* need to modify old data */ | ||
| 4959 | + acx111_s_get_feature_config(adev, &feat.feature_options, &feat.data_flow_options); | ||
| 4960 | + else { | ||
| 4961 | + /* need to set a completely new value */ | ||
| 4962 | + feat.feature_options = 0; | ||
| 4963 | + feat.data_flow_options = 0; | ||
| 4964 | + } | ||
| 4965 | + | ||
| 4966 | + if (mode == 0) { /* remove */ | ||
| 4967 | + CLEAR_BIT(feat.feature_options, cpu_to_le32(feature_options)); | ||
| 4968 | + CLEAR_BIT(feat.data_flow_options, cpu_to_le32(data_flow_options)); | ||
| 4969 | + } else { /* add or set */ | ||
| 4970 | + SET_BIT(feat.feature_options, cpu_to_le32(feature_options)); | ||
| 4971 | + SET_BIT(feat.data_flow_options, cpu_to_le32(data_flow_options)); | ||
| 4972 | + } | ||
| 4973 | + | ||
| 4974 | + log(L_DEBUG, | ||
| 4975 | + "old: feature 0x%08X dataflow 0x%08X. mode: %u\n" | ||
| 4976 | + "new: feature 0x%08X dataflow 0x%08X\n", | ||
| 4977 | + feature_options, data_flow_options, mode, | ||
| 4978 | + le32_to_cpu(feat.feature_options), | ||
| 4979 | + le32_to_cpu(feat.data_flow_options)); | ||
| 4980 | + | ||
| 4981 | + if (OK != acx_s_configure(adev, &feat, ACX1xx_IE_FEATURE_CONFIG)) { | ||
| 4982 | + return NOT_OK; | ||
| 4983 | + } | ||
| 4984 | + | ||
| 4985 | + return OK; | ||
| 4986 | +} | ||
| 4987 | + | ||
| 4988 | +static inline int | ||
| 4989 | +acx111_s_feature_off(acx_device_t *adev, u32 f, u32 d) | ||
| 4990 | +{ | ||
| 4991 | + return acx111_s_set_feature_config(adev, f, d, 0); | ||
| 4992 | +} | ||
| 4993 | +static inline int | ||
| 4994 | +acx111_s_feature_on(acx_device_t *adev, u32 f, u32 d) | ||
| 4995 | +{ | ||
| 4996 | + return acx111_s_set_feature_config(adev, f, d, 1); | ||
| 4997 | +} | ||
| 4998 | +static inline int | ||
| 4999 | +acx111_s_feature_set(acx_device_t *adev, u32 f, u32 d) | ||
| 5000 | +{ | ||
| 5001 | + return acx111_s_set_feature_config(adev, f, d, 2); | ||
| 5002 | +} | ||
| 5003 | + | ||
| 5004 | + | ||
| 5005 | +/*********************************************************************** | ||
| 5006 | +** acx100_s_init_memory_pools | ||
| 5007 | +*/ | ||
| 5008 | +static int | ||
| 5009 | +acx100_s_init_memory_pools(acx_device_t *adev, const acx_ie_memmap_t *mmt) | ||
| 5010 | +{ | ||
| 5011 | + acx100_ie_memblocksize_t MemoryBlockSize; | ||
| 5012 | + acx100_ie_memconfigoption_t MemoryConfigOption; | ||
| 5013 | + int TotalMemoryBlocks; | ||
| 5014 | + int RxBlockNum; | ||
| 5015 | + int TotalRxBlockSize; | ||
| 5016 | + int TxBlockNum; | ||
| 5017 | + int TotalTxBlockSize; | ||
| 5018 | + | ||
| 5019 | + FN_ENTER; | ||
| 5020 | + | ||
| 5021 | + /* Let's see if we can follow this: | ||
| 5022 | + first we select our memory block size (which I think is | ||
| 5023 | + completely arbitrary) */ | ||
| 5024 | + MemoryBlockSize.size = cpu_to_le16(adev->memblocksize); | ||
| 5025 | + | ||
| 5026 | + /* Then we alert the card to our decision of block size */ | ||
| 5027 | + if (OK != acx_s_configure(adev, &MemoryBlockSize, ACX100_IE_BLOCK_SIZE)) { | ||
| 5028 | + goto bad; | ||
| 5029 | + } | ||
| 5030 | + | ||
| 5031 | + /* We figure out how many total blocks we can create, using | ||
| 5032 | + the block size we chose, and the beginning and ending | ||
| 5033 | + memory pointers, i.e.: end-start/size */ | ||
| 5034 | + TotalMemoryBlocks = (le32_to_cpu(mmt->PoolEnd) - le32_to_cpu(mmt->PoolStart)) / adev->memblocksize; | ||
| 5035 | + | ||
| 5036 | + log(L_DEBUG, "TotalMemoryBlocks=%u (%u bytes)\n", | ||
| 5037 | + TotalMemoryBlocks, TotalMemoryBlocks*adev->memblocksize); | ||
| 5038 | + | ||
| 5039 | + /* MemoryConfigOption.DMA_config bitmask: | ||
| 5040 | + access to ACX memory is to be done: | ||
| 5041 | + 0x00080000 using PCI conf space?! | ||
| 5042 | + 0x00040000 using IO instructions? | ||
| 5043 | + 0x00000000 using memory access instructions | ||
| 5044 | + 0x00020000 using local memory block linked list (else what?) | ||
| 5045 | + 0x00010000 using host indirect descriptors (else host must access ACX memory?) | ||
| 5046 | + */ | ||
| 5047 | +#if defined (ACX_MEM) | ||
| 5048 | + /* | ||
| 5049 | + * ACX ignores DMA_config for generic slave mode. | ||
| 5050 | + */ | ||
| 5051 | + MemoryConfigOption.DMA_config = 0; | ||
| 5052 | + /* Declare start of the Rx host pool */ | ||
| 5053 | + MemoryConfigOption.pRxHostDesc = cpu2acx(0); | ||
| 5054 | + log(L_DEBUG, "pRxHostDesc 0x%08X, rxhostdesc_startphy 0x%lX\n", | ||
| 5055 | + acx2cpu(MemoryConfigOption.pRxHostDesc), | ||
| 5056 | + (long)adev->rxhostdesc_startphy); | ||
| 5057 | +#else | ||
| 5058 | + if (IS_PCI(adev)) { | ||
| 5059 | + MemoryConfigOption.DMA_config = cpu_to_le32(0x30000); | ||
| 5060 | + /* Declare start of the Rx host pool */ | ||
| 5061 | + MemoryConfigOption.pRxHostDesc = cpu2acx(adev->rxhostdesc_startphy); | ||
| 5062 | + log(L_DEBUG, "pRxHostDesc 0x%08X, rxhostdesc_startphy 0x%lX\n", | ||
| 5063 | + acx2cpu(MemoryConfigOption.pRxHostDesc), | ||
| 5064 | + (long)adev->rxhostdesc_startphy); | ||
| 5065 | + } else { | ||
| 5066 | + MemoryConfigOption.DMA_config = cpu_to_le32(0x20000); | ||
| 5067 | + } | ||
| 5068 | +#endif | ||
| 5069 | + | ||
| 5070 | + /* 50% of the allotment of memory blocks go to tx descriptors */ | ||
| 5071 | + TxBlockNum = TotalMemoryBlocks / 2; | ||
| 5072 | + MemoryConfigOption.TxBlockNum = cpu_to_le16(TxBlockNum); | ||
| 5073 | + | ||
| 5074 | + /* and 50% go to the rx descriptors */ | ||
| 5075 | + RxBlockNum = TotalMemoryBlocks - TxBlockNum; | ||
| 5076 | + MemoryConfigOption.RxBlockNum = cpu_to_le16(RxBlockNum); | ||
| 5077 | + | ||
| 5078 | + /* size of the tx and rx descriptor queues */ | ||
| 5079 | + TotalTxBlockSize = TxBlockNum * adev->memblocksize; | ||
| 5080 | + TotalRxBlockSize = RxBlockNum * adev->memblocksize; | ||
| 5081 | + log(L_DEBUG, "TxBlockNum %u RxBlockNum %u TotalTxBlockSize %u " | ||
| 5082 | + "TotalTxBlockSize %u\n", TxBlockNum, RxBlockNum, | ||
| 5083 | + TotalTxBlockSize, TotalRxBlockSize); | ||
| 5084 | + | ||
| 5085 | + | ||
| 5086 | + /* align the tx descriptor queue to an alignment of 0x20 (32 bytes) */ | ||
| 5087 | + MemoryConfigOption.rx_mem = | ||
| 5088 | + cpu_to_le32((le32_to_cpu(mmt->PoolStart) + 0x1f) & ~0x1f); | ||
| 5089 | + | ||
| 5090 | + /* align the rx descriptor queue to units of 0x20 | ||
| 5091 | + * and offset it by the tx descriptor queue */ | ||
| 5092 | + MemoryConfigOption.tx_mem = | ||
| 5093 | + cpu_to_le32((le32_to_cpu(mmt->PoolStart) + TotalRxBlockSize + 0x1f) & ~0x1f); | ||
| 5094 | + log(L_DEBUG, "rx_mem %08X rx_mem %08X\n", | ||
| 5095 | + MemoryConfigOption.tx_mem, MemoryConfigOption.rx_mem); | ||
| 5096 | + | ||
| 5097 | + /* alert the device to our decision */ | ||
| 5098 | + if (OK != acx_s_configure(adev, &MemoryConfigOption, ACX1xx_IE_MEMORY_CONFIG_OPTIONS)) { | ||
| 5099 | + goto bad; | ||
| 5100 | + } | ||
| 5101 | + | ||
| 5102 | + /* and tell the device to kick it into gear */ | ||
| 5103 | + if (OK != acx_s_issue_cmd(adev, ACX100_CMD_INIT_MEMORY, NULL, 0)) { | ||
| 5104 | + goto bad; | ||
| 5105 | + } | ||
| 5106 | +#ifdef ACX_MEM | ||
| 5107 | + /* | ||
| 5108 | + * slave memory interface has to manage the transmit pools for the ACX, | ||
| 5109 | + * so it needs to know what we chose here. | ||
| 5110 | + */ | ||
| 5111 | + adev->acx_txbuf_start = MemoryConfigOption.tx_mem; | ||
| 5112 | + adev->acx_txbuf_numblocks = MemoryConfigOption.TxBlockNum; | ||
| 5113 | +#endif | ||
| 5114 | + | ||
| 5115 | + FN_EXIT1(OK); | ||
| 5116 | + return OK; | ||
| 5117 | +bad: | ||
| 5118 | + FN_EXIT1(NOT_OK); | ||
| 5119 | + return NOT_OK; | ||
| 5120 | +} | ||
| 5121 | + | ||
| 5122 | + | ||
| 5123 | +/*********************************************************************** | ||
| 5124 | +** acx100_s_create_dma_regions | ||
| 5125 | +** | ||
| 5126 | +** Note that this fn messes up heavily with hardware, but we cannot | ||
| 5127 | +** lock it (we need to sleep). Not a problem since IRQs can't happen | ||
| 5128 | +*/ | ||
| 5129 | +static int | ||
| 5130 | +acx100_s_create_dma_regions(acx_device_t *adev) | ||
| 5131 | +{ | ||
| 5132 | + acx100_ie_queueconfig_t queueconf; | ||
| 5133 | + acx_ie_memmap_t memmap; | ||
| 5134 | + int res = NOT_OK; | ||
| 5135 | + u32 tx_queue_start, rx_queue_start; | ||
| 5136 | + | ||
| 5137 | + FN_ENTER; | ||
| 5138 | + | ||
| 5139 | + /* read out the acx100 physical start address for the queues */ | ||
| 5140 | + if (OK != acx_s_interrogate(adev, &memmap, ACX1xx_IE_MEMORY_MAP)) { | ||
| 5141 | + goto fail; | ||
| 5142 | + } | ||
| 5143 | + | ||
| 5144 | + tx_queue_start = le32_to_cpu(memmap.QueueStart); | ||
| 5145 | + rx_queue_start = tx_queue_start + TX_CNT * sizeof(txdesc_t); | ||
| 5146 | + | ||
| 5147 | + log(L_DEBUG, "initializing Queue Indicator\n"); | ||
| 5148 | + | ||
| 5149 | + memset(&queueconf, 0, sizeof(queueconf)); | ||
| 5150 | + | ||
| 5151 | + /* Not needed for PCI or slave memory, so we can avoid setting them altogether */ | ||
| 5152 | + if (IS_USB(adev)) { | ||
| 5153 | + queueconf.NumTxDesc = USB_TX_CNT; | ||
| 5154 | + queueconf.NumRxDesc = USB_RX_CNT; | ||
| 5155 | + } | ||
| 5156 | + | ||
| 5157 | + /* calculate size of queues */ | ||
| 5158 | + queueconf.AreaSize = cpu_to_le32( | ||
| 5159 | + TX_CNT * sizeof(txdesc_t) + | ||
| 5160 | + RX_CNT * sizeof(rxdesc_t) + 8 | ||
| 5161 | + ); | ||
| 5162 | + queueconf.NumTxQueues = 1; /* number of tx queues */ | ||
| 5163 | + /* sets the beginning of the tx descriptor queue */ | ||
| 5164 | + queueconf.TxQueueStart = memmap.QueueStart; | ||
| 5165 | + /* done by memset: queueconf.TxQueuePri = 0; */ | ||
| 5166 | + queueconf.RxQueueStart = cpu_to_le32(rx_queue_start); | ||
| 5167 | + queueconf.QueueOptions = 1; /* auto reset descriptor */ | ||
| 5168 | + /* sets the end of the rx descriptor queue */ | ||
| 5169 | + queueconf.QueueEnd = cpu_to_le32( | ||
| 5170 | + rx_queue_start + RX_CNT * sizeof(rxdesc_t) | ||
| 5171 | + ); | ||
| 5172 | + /* sets the beginning of the next queue */ | ||
| 5173 | + queueconf.HostQueueEnd = cpu_to_le32(le32_to_cpu(queueconf.QueueEnd) + 8); | ||
| 5174 | + if (OK != acx_s_configure(adev, &queueconf, ACX1xx_IE_QUEUE_CONFIG)) { | ||
| 5175 | + goto fail; | ||
| 5176 | + } | ||
| 5177 | + | ||
| 5178 | +#if defined (ACX_MEM) | ||
| 5179 | + /* sets the beginning of the rx descriptor queue, after the tx descrs */ | ||
| 5180 | + adev->acx_queue_indicator = | ||
| 5181 | + (queueindicator_t *) le32_to_cpu (queueconf.QueueEnd); | ||
| 5182 | + if (OK != acxmem_s_create_hostdesc_queues(adev)) | ||
| 5183 | + goto fail; | ||
| 5184 | + | ||
| 5185 | + acxmem_create_desc_queues(adev, tx_queue_start, rx_queue_start); | ||
| 5186 | +#else | ||
| 5187 | + if (IS_PCI(adev)) { | ||
| 5188 | + /* sets the beginning of the rx descriptor queue, after the tx descrs */ | ||
| 5189 | + if (OK != acxpci_s_create_hostdesc_queues(adev)) | ||
| 5190 | + goto fail; | ||
| 5191 | + acxpci_create_desc_queues(adev, tx_queue_start, rx_queue_start); | ||
| 5192 | + } | ||
| 5193 | +#endif | ||
| 5194 | + | ||
| 5195 | + if (OK != acx_s_interrogate(adev, &memmap, ACX1xx_IE_MEMORY_MAP)) { | ||
| 5196 | + goto fail; | ||
| 5197 | + } | ||
| 5198 | + | ||
| 5199 | + /* | ||
| 5200 | + * Have to make sure we skip past the Queue Indicator (QueueEnd) and Host Queue Indicator | ||
| 5201 | + * maps, each of which are 8 bytes and follow immediately after the transmit and | ||
| 5202 | + * receive queues. | ||
| 5203 | + */ | ||
| 5204 | + memmap.PoolStart = cpu_to_le32( | ||
| 5205 | + (le32_to_cpu(memmap.QueueEnd) + 4 + 0x1f) & ~0x1f | ||
| 5206 | + ); | ||
| 5207 | + | ||
| 5208 | + if (OK != acx_s_configure(adev, &memmap, ACX1xx_IE_MEMORY_MAP)) { | ||
| 5209 | + goto fail; | ||
| 5210 | + } | ||
| 5211 | + | ||
| 5212 | + if (OK != acx100_s_init_memory_pools(adev, &memmap)) { | ||
| 5213 | + goto fail; | ||
| 5214 | + } | ||
| 5215 | + | ||
| 5216 | + res = OK; | ||
| 5217 | + goto end; | ||
| 5218 | + | ||
| 5219 | +fail: | ||
| 5220 | + acx_s_msleep(1000); /* ? */ | ||
| 5221 | +#if defined (ACX_MEM) | ||
| 5222 | + acxmem_free_desc_queues(adev); | ||
| 5223 | +#else | ||
| 5224 | + if (IS_PCI(adev)) | ||
| 5225 | + acxpci_free_desc_queues(adev); | ||
| 5226 | +#endif | ||
| 5227 | +end: | ||
| 5228 | + FN_EXIT1(res); | ||
| 5229 | + return res; | ||
| 5230 | +} | ||
| 5231 | + | ||
| 5232 | + | ||
| 5233 | +/*********************************************************************** | ||
| 5234 | +** acx111_s_create_dma_regions | ||
| 5235 | +** | ||
| 5236 | +** Note that this fn messes heavily with hardware, but we cannot | ||
| 5237 | +** lock it (we need to sleep). Not a problem since IRQs can't happen | ||
| 5238 | +*/ | ||
| 5239 | +#define ACX111_PERCENT(percent) ((percent)/5) | ||
| 5240 | + | ||
| 5241 | +static int | ||
| 5242 | +acx111_s_create_dma_regions(acx_device_t *adev) | ||
| 5243 | +{ | ||
| 5244 | + struct acx111_ie_memoryconfig memconf; | ||
| 5245 | + struct acx111_ie_queueconfig queueconf; | ||
| 5246 | + u32 tx_queue_start, rx_queue_start; | ||
| 5247 | + | ||
| 5248 | + FN_ENTER; | ||
| 5249 | + | ||
| 5250 | + /* Calculate memory positions and queue sizes */ | ||
| 5251 | + | ||
| 5252 | + /* Set up our host descriptor pool + data pool */ | ||
| 5253 | +#if defined (ACX_MEM) | ||
| 5254 | + if (OK != acxmem_s_create_hostdesc_queues(adev)) | ||
| 5255 | + goto fail; | ||
| 5256 | +#else | ||
| 5257 | + if (IS_PCI(adev)) { | ||
| 5258 | + if (OK != acxpci_s_create_hostdesc_queues(adev)) | ||
| 5259 | + goto fail; | ||
| 5260 | + } | ||
| 5261 | +#endif | ||
| 5262 | + | ||
| 5263 | + memset(&memconf, 0, sizeof(memconf)); | ||
| 5264 | + /* the number of STAs (STA contexts) to support | ||
| 5265 | + ** NB: was set to 1 and everything seemed to work nevertheless... */ | ||
| 5266 | + memconf.no_of_stations = cpu_to_le16(VEC_SIZE(adev->sta_list)); | ||
| 5267 | + /* specify the memory block size. Default is 256 */ | ||
| 5268 | + memconf.memory_block_size = cpu_to_le16(adev->memblocksize); | ||
| 5269 | + /* let's use 50%/50% for tx/rx (specify percentage, units of 5%) */ | ||
| 5270 | + memconf.tx_rx_memory_block_allocation = ACX111_PERCENT(50); | ||
| 5271 | + /* set the count of our queues | ||
| 5272 | + ** NB: struct acx111_ie_memoryconfig shall be modified | ||
| 5273 | + ** if we ever will switch to more than one rx and/or tx queue */ | ||
| 5274 | + memconf.count_rx_queues = 1; | ||
| 5275 | + memconf.count_tx_queues = 1; | ||
| 5276 | + /* 0 == Busmaster Indirect Memory Organization, which is what we want | ||
| 5277 | + * (using linked host descs with their allocated mem). | ||
| 5278 | + * 2 == Generic Bus Slave */ | ||
| 5279 | + /* done by memset: memconf.options = 0; */ | ||
| 5280 | + /* let's use 25% for fragmentations and 75% for frame transfers | ||
| 5281 | + * (specified in units of 5%) */ | ||
| 5282 | + memconf.fragmentation = ACX111_PERCENT(75); | ||
| 5283 | + /* Rx descriptor queue config */ | ||
| 5284 | + memconf.rx_queue1_count_descs = RX_CNT; | ||
| 5285 | + memconf.rx_queue1_type = 7; /* must be set to 7 */ | ||
| 5286 | + /* done by memset: memconf.rx_queue1_prio = 0; low prio */ | ||
| 5287 | +#if defined (ACX_MEM) | ||
| 5288 | + memconf.rx_queue1_host_rx_start = cpu2acx(adev->rxhostdesc_startphy); | ||
| 5289 | +#else | ||
| 5290 | + if (IS_PCI(adev)) { | ||
| 5291 | + memconf.rx_queue1_host_rx_start = cpu2acx(adev->rxhostdesc_startphy); | ||
| 5292 | + } | ||
| 5293 | +#endif | ||
| 5294 | + /* Tx descriptor queue config */ | ||
| 5295 | + memconf.tx_queue1_count_descs = TX_CNT; | ||
| 5296 | + /* done by memset: memconf.tx_queue1_attributes = 0; lowest priority */ | ||
| 5297 | + | ||
| 5298 | + /* NB1: this looks wrong: (memconf,ACX1xx_IE_QUEUE_CONFIG), | ||
| 5299 | + ** (queueconf,ACX1xx_IE_MEMORY_CONFIG_OPTIONS) look swapped, eh? | ||
| 5300 | + ** But it is actually correct wrt IE numbers. | ||
| 5301 | + ** NB2: sizeof(memconf) == 28 == 0x1c but configure(ACX1xx_IE_QUEUE_CONFIG) | ||
| 5302 | + ** writes 0x20 bytes (because same IE for acx100 uses struct acx100_ie_queueconfig | ||
| 5303 | + ** which is 4 bytes larger. what a mess. TODO: clean it up) */ | ||
| 5304 | + if (OK != acx_s_configure(adev, &memconf, ACX1xx_IE_QUEUE_CONFIG)) { | ||
| 5305 | + goto fail; | ||
| 5306 | + } | ||
| 5307 | + | ||
| 5308 | + acx_s_interrogate(adev, &queueconf, ACX1xx_IE_MEMORY_CONFIG_OPTIONS); | ||
| 5309 | + | ||
| 5310 | + tx_queue_start = le32_to_cpu(queueconf.tx1_queue_address); | ||
| 5311 | + rx_queue_start = le32_to_cpu(queueconf.rx1_queue_address); | ||
| 5312 | + | ||
| 5313 | + log(L_INIT, "dump queue head (from card):\n" | ||
| 5314 | + "len: %u\n" | ||
| 5315 | + "tx_memory_block_address: %X\n" | ||
| 5316 | + "rx_memory_block_address: %X\n" | ||
| 5317 | + "tx1_queue address: %X\n" | ||
| 5318 | + "rx1_queue address: %X\n", | ||
| 5319 | + le16_to_cpu(queueconf.len), | ||
| 5320 | + le32_to_cpu(queueconf.tx_memory_block_address), | ||
| 5321 | + le32_to_cpu(queueconf.rx_memory_block_address), | ||
| 5322 | + tx_queue_start, | ||
| 5323 | + rx_queue_start); | ||
| 5324 | + | ||
| 5325 | +#if defined (ACX_MEM) | ||
| 5326 | + acxmem_create_desc_queues(adev, tx_queue_start, rx_queue_start); | ||
| 5327 | +#else | ||
| 5328 | + if (IS_PCI(adev)) | ||
| 5329 | + acxpci_create_desc_queues(adev, tx_queue_start, rx_queue_start); | ||
| 5330 | +#endif | ||
| 5331 | + | ||
| 5332 | + FN_EXIT1(OK); | ||
| 5333 | + return OK; | ||
| 5334 | +fail: | ||
| 5335 | +#if defined (ACX_MEM) | ||
| 5336 | + acxmem_free_desc_queues(adev); | ||
| 5337 | +#else | ||
| 5338 | + if (IS_PCI(adev)) | ||
| 5339 | + acxpci_free_desc_queues(adev); | ||
| 5340 | +#endif | ||
| 5341 | + | ||
| 5342 | + FN_EXIT1(NOT_OK); | ||
| 5343 | + return NOT_OK; | ||
| 5344 | +} | ||
| 5345 | + | ||
| 5346 | + | ||
| 5347 | +/*********************************************************************** | ||
| 5348 | +*/ | ||
| 5349 | +static void | ||
| 5350 | +acx_s_initialize_rx_config(acx_device_t *adev) | ||
| 5351 | +{ | ||
| 5352 | + struct { | ||
| 5353 | + u16 id; | ||
| 5354 | + u16 len; | ||
| 5355 | + u16 rx_cfg1; | ||
| 5356 | + u16 rx_cfg2; | ||
| 5357 | + } ACX_PACKED cfg; | ||
| 5358 | + | ||
| 5359 | + switch (adev->mode) { | ||
| 5360 | + case ACX_MODE_OFF: | ||
| 5361 | + adev->rx_config_1 = (u16) (0 | ||
| 5362 | + /* | RX_CFG1_INCLUDE_RXBUF_HDR */ | ||
| 5363 | + /* | RX_CFG1_FILTER_SSID */ | ||
| 5364 | + /* | RX_CFG1_FILTER_BCAST */ | ||
| 5365 | + /* | RX_CFG1_RCV_MC_ADDR1 */ | ||
| 5366 | + /* | RX_CFG1_RCV_MC_ADDR0 */ | ||
| 5367 | + /* | RX_CFG1_FILTER_ALL_MULTI */ | ||
| 5368 | + /* | RX_CFG1_FILTER_BSSID */ | ||
| 5369 | + /* | RX_CFG1_FILTER_MAC */ | ||
| 5370 | + /* | RX_CFG1_RCV_PROMISCUOUS */ | ||
| 5371 | + /* | RX_CFG1_INCLUDE_FCS */ | ||
| 5372 | + /* | RX_CFG1_INCLUDE_PHY_HDR */ | ||
| 5373 | + ); | ||
| 5374 | + adev->rx_config_2 = (u16) (0 | ||
| 5375 | + /*| RX_CFG2_RCV_ASSOC_REQ */ | ||
| 5376 | + /*| RX_CFG2_RCV_AUTH_FRAMES */ | ||
| 5377 | + /*| RX_CFG2_RCV_BEACON_FRAMES */ | ||
| 5378 | + /*| RX_CFG2_RCV_CONTENTION_FREE */ | ||
| 5379 | + /*| RX_CFG2_RCV_CTRL_FRAMES */ | ||
| 5380 | + /*| RX_CFG2_RCV_DATA_FRAMES */ | ||
| 5381 | + /*| RX_CFG2_RCV_BROKEN_FRAMES */ | ||
| 5382 | + /*| RX_CFG2_RCV_MGMT_FRAMES */ | ||
| 5383 | + /*| RX_CFG2_RCV_PROBE_REQ */ | ||
| 5384 | + /*| RX_CFG2_RCV_PROBE_RESP */ | ||
| 5385 | + /*| RX_CFG2_RCV_ACK_FRAMES */ | ||
| 5386 | + /*| RX_CFG2_RCV_OTHER */ | ||
| 5387 | + ); | ||
| 5388 | + break; | ||
| 5389 | + case ACX_MODE_MONITOR: | ||
| 5390 | + adev->rx_config_1 = (u16) (0 | ||
| 5391 | + /* | RX_CFG1_INCLUDE_RXBUF_HDR */ | ||
| 5392 | + /* | RX_CFG1_FILTER_SSID */ | ||
| 5393 | + /* | RX_CFG1_FILTER_BCAST */ | ||
| 5394 | + /* | RX_CFG1_RCV_MC_ADDR1 */ | ||
| 5395 | + /* | RX_CFG1_RCV_MC_ADDR0 */ | ||
| 5396 | + /* | RX_CFG1_FILTER_ALL_MULTI */ | ||
| 5397 | + /* | RX_CFG1_FILTER_BSSID */ | ||
| 5398 | + /* | RX_CFG1_FILTER_MAC */ | ||
| 5399 | + | RX_CFG1_RCV_PROMISCUOUS | ||
| 5400 | + /* | RX_CFG1_INCLUDE_FCS */ | ||
| 5401 | + /* | RX_CFG1_INCLUDE_PHY_HDR */ | ||
| 5402 | + ); | ||
| 5403 | + adev->rx_config_2 = (u16) (0 | ||
| 5404 | + | RX_CFG2_RCV_ASSOC_REQ | ||
| 5405 | + | RX_CFG2_RCV_AUTH_FRAMES | ||
| 5406 | + | RX_CFG2_RCV_BEACON_FRAMES | ||
| 5407 | + | RX_CFG2_RCV_CONTENTION_FREE | ||
| 5408 | + | RX_CFG2_RCV_CTRL_FRAMES | ||
| 5409 | + | RX_CFG2_RCV_DATA_FRAMES | ||
| 5410 | + | RX_CFG2_RCV_BROKEN_FRAMES | ||
| 5411 | + | RX_CFG2_RCV_MGMT_FRAMES | ||
| 5412 | + | RX_CFG2_RCV_PROBE_REQ | ||
| 5413 | + | RX_CFG2_RCV_PROBE_RESP | ||
| 5414 | + | RX_CFG2_RCV_ACK_FRAMES | ||
| 5415 | + | RX_CFG2_RCV_OTHER | ||
| 5416 | + ); | ||
| 5417 | + break; | ||
| 5418 | + default: | ||
| 5419 | + adev->rx_config_1 = (u16) (0 | ||
| 5420 | + /* | RX_CFG1_INCLUDE_RXBUF_HDR */ | ||
| 5421 | + /* | RX_CFG1_FILTER_SSID */ | ||
| 5422 | + /* | RX_CFG1_FILTER_BCAST */ | ||
| 5423 | + /* | RX_CFG1_RCV_MC_ADDR1 */ | ||
| 5424 | + /* | RX_CFG1_RCV_MC_ADDR0 */ | ||
| 5425 | + /* | RX_CFG1_FILTER_ALL_MULTI */ | ||
| 5426 | + /* | RX_CFG1_FILTER_BSSID */ | ||
| 5427 | + | RX_CFG1_FILTER_MAC | ||
| 5428 | + /* | RX_CFG1_RCV_PROMISCUOUS */ | ||
| 5429 | + /* | RX_CFG1_INCLUDE_FCS */ | ||
| 5430 | + /* | RX_CFG1_INCLUDE_PHY_HDR */ | ||
| 5431 | + ); | ||
| 5432 | + adev->rx_config_2 = (u16) (0 | ||
| 5433 | + | RX_CFG2_RCV_ASSOC_REQ | ||
| 5434 | + | RX_CFG2_RCV_AUTH_FRAMES | ||
| 5435 | + | RX_CFG2_RCV_BEACON_FRAMES | ||
| 5436 | + | RX_CFG2_RCV_CONTENTION_FREE | ||
| 5437 | + | RX_CFG2_RCV_CTRL_FRAMES | ||
| 5438 | + | RX_CFG2_RCV_DATA_FRAMES | ||
| 5439 | + /*| RX_CFG2_RCV_BROKEN_FRAMES */ | ||
| 5440 | + | RX_CFG2_RCV_MGMT_FRAMES | ||
| 5441 | + | RX_CFG2_RCV_PROBE_REQ | ||
| 5442 | + | RX_CFG2_RCV_PROBE_RESP | ||
| 5443 | + /*| RX_CFG2_RCV_ACK_FRAMES */ | ||
| 5444 | + | RX_CFG2_RCV_OTHER | ||
| 5445 | + ); | ||
| 5446 | + break; | ||
| 5447 | + } | ||
| 5448 | + adev->rx_config_1 |= RX_CFG1_INCLUDE_RXBUF_HDR; | ||
| 5449 | + | ||
| 5450 | + if ((adev->rx_config_1 & RX_CFG1_INCLUDE_PHY_HDR) | ||
| 5451 | + || (adev->firmware_numver >= 0x02000000)) | ||
| 5452 | + adev->phy_header_len = IS_ACX111(adev) ? 8 : 4; | ||
| 5453 | + else | ||
| 5454 | + adev->phy_header_len = 0; | ||
| 5455 | + | ||
| 5456 | + log(L_INIT, "setting RXconfig to %04X:%04X\n", | ||
| 5457 | + adev->rx_config_1, adev->rx_config_2); | ||
| 5458 | + cfg.rx_cfg1 = cpu_to_le16(adev->rx_config_1); | ||
| 5459 | + cfg.rx_cfg2 = cpu_to_le16(adev->rx_config_2); | ||
| 5460 | + acx_s_configure(adev, &cfg, ACX1xx_IE_RXCONFIG); | ||
| 5461 | +} | ||
| 5462 | + | ||
| 5463 | + | ||
| 5464 | +/*********************************************************************** | ||
| 5465 | +** acx_s_set_defaults | ||
| 5466 | +*/ | ||
| 5467 | +void | ||
| 5468 | +acx_s_set_defaults(acx_device_t *adev) | ||
| 5469 | +{ | ||
| 5470 | + unsigned long flags; | ||
| 5471 | + | ||
| 5472 | + FN_ENTER; | ||
| 5473 | + | ||
| 5474 | + /* do it before getting settings, prevent bogus channel 0 warning */ | ||
| 5475 | + adev->channel = 1; | ||
| 5476 | + | ||
| 5477 | + /* query some settings from the card. | ||
| 5478 | + * NOTE: for some settings, e.g. CCA and ED (ACX100!), an initial | ||
| 5479 | + * query is REQUIRED, otherwise the card won't work correctly! */ | ||
| 5480 | + adev->get_mask = GETSET_ANTENNA|GETSET_SENSITIVITY|GETSET_STATION_ID|GETSET_REG_DOMAIN; | ||
| 5481 | + /* Only ACX100 supports ED and CCA */ | ||
| 5482 | + if (IS_ACX100(adev)) | ||
| 5483 | + adev->get_mask |= GETSET_CCA|GETSET_ED_THRESH; | ||
| 5484 | + | ||
| 5485 | + acx_s_update_card_settings(adev); | ||
| 5486 | + | ||
| 5487 | + acx_lock(adev, flags); | ||
| 5488 | + | ||
| 5489 | + /* set our global interrupt mask */ | ||
| 5490 | +#if defined (ACX_MEM) | ||
| 5491 | + acxmem_set_interrupt_mask(adev); | ||
| 5492 | +#else | ||
| 5493 | + if (IS_PCI(adev)) | ||
| 5494 | + acxpci_set_interrupt_mask(adev); | ||
| 5495 | +#endif | ||
| 5496 | + | ||
| 5497 | + adev->led_power = 1; /* LED is active on startup */ | ||
| 5498 | + adev->brange_max_quality = 60; /* LED blink max quality is 60 */ | ||
| 5499 | + adev->brange_time_last_state_change = jiffies; | ||
| 5500 | + | ||
| 5501 | + /* copy the MAC address we just got from the card | ||
| 5502 | + * into our MAC address used during current 802.11 session */ | ||
| 5503 | + MAC_COPY(adev->dev_addr, adev->ndev->dev_addr); | ||
| 5504 | + MAC_BCAST(adev->ap); | ||
| 5505 | + | ||
| 5506 | + adev->essid_len = | ||
| 5507 | + snprintf(adev->essid, sizeof(adev->essid), "STA%02X%02X%02X", | ||
| 5508 | + adev->dev_addr[3], adev->dev_addr[4], adev->dev_addr[5]); | ||
| 5509 | + adev->essid_active = 1; | ||
| 5510 | + | ||
| 5511 | + /* we have a nick field to waste, so why not abuse it | ||
| 5512 | + * to announce the driver version? ;-) */ | ||
| 5513 | + strncpy(adev->nick, "acx " ACX_RELEASE, IW_ESSID_MAX_SIZE); | ||
| 5514 | + | ||
| 5515 | +#if defined (ACX_MEM) | ||
| 5516 | + adev->reg_dom_id = adev->cfgopt_domains.list[0]; | ||
| 5517 | +#else | ||
| 5518 | + if (IS_PCI(adev)) { /* FIXME: this should be made to apply to USB, too! */ | ||
| 5519 | + /* first regulatory domain entry in EEPROM == default reg. domain */ | ||
| 5520 | + adev->reg_dom_id = adev->cfgopt_domains.list[0]; | ||
| 5521 | + } | ||
| 5522 | +#endif | ||
| 5523 | + | ||
| 5524 | + /* 0xffff would be better, but then we won't get a "scan complete" | ||
| 5525 | + * interrupt, so our current infrastructure will fail: */ | ||
| 5526 | + adev->scan_count = 1; | ||
| 5527 | + adev->scan_mode = ACX_SCAN_OPT_ACTIVE; | ||
| 5528 | + adev->scan_duration = 100; | ||
| 5529 | + adev->scan_probe_delay = 200; | ||
| 5530 | + /* reported to break scanning: adev->scan_probe_delay = adev->cfgopt_probe_delay; */ | ||
| 5531 | + adev->scan_rate = ACX_SCAN_RATE_1; | ||
| 5532 | + | ||
| 5533 | + adev->mode = ACX_MODE_2_STA; | ||
| 5534 | + adev->auth_alg = WLAN_AUTH_ALG_OPENSYSTEM; | ||
| 5535 | + adev->listen_interval = 100; | ||
| 5536 | + adev->beacon_interval = DEFAULT_BEACON_INTERVAL; | ||
| 5537 | + adev->dtim_interval = DEFAULT_DTIM_INTERVAL; | ||
| 5538 | + | ||
| 5539 | + adev->msdu_lifetime = DEFAULT_MSDU_LIFETIME; | ||
| 5540 | + | ||
| 5541 | + adev->rts_threshold = DEFAULT_RTS_THRESHOLD; | ||
| 5542 | + adev->frag_threshold = 2346; | ||
| 5543 | + | ||
| 5544 | + /* use standard default values for retry limits */ | ||
| 5545 | + adev->short_retry = 7; /* max. retries for (short) non-RTS packets */ | ||
| 5546 | + adev->long_retry = 4; /* max. retries for long (RTS) packets */ | ||
| 5547 | + | ||
| 5548 | + adev->preamble_mode = 2; /* auto */ | ||
| 5549 | + adev->fallback_threshold = 3; | ||
| 5550 | + adev->stepup_threshold = 10; | ||
| 5551 | + adev->rate_bcast = RATE111_1; | ||
| 5552 | + adev->rate_bcast100 = RATE100_1; | ||
| 5553 | + adev->rate_basic = RATE111_1 | RATE111_2; | ||
| 5554 | + adev->rate_auto = 1; | ||
| 5555 | + if (IS_ACX111(adev)) { | ||
| 5556 | + adev->rate_oper = RATE111_ALL; | ||
| 5557 | + } else { | ||
| 5558 | + adev->rate_oper = RATE111_ACX100_COMPAT; | ||
| 5559 | + } | ||
| 5560 | + | ||
| 5561 | + /* Supported Rates element - the rates here are given in units of | ||
| 5562 | + * 500 kbit/s, plus 0x80 added. See 802.11-1999.pdf item 7.3.2.2 */ | ||
| 5563 | + acx_l_update_ratevector(adev); | ||
| 5564 | + | ||
| 5565 | + /* set some more defaults */ | ||
| 5566 | + if (IS_ACX111(adev)) { | ||
| 5567 | + /* 30mW (15dBm) is default, at least in my acx111 card: */ | ||
| 5568 | + adev->tx_level_dbm = 15; | ||
| 5569 | + } else { | ||
| 5570 | + /* don't use max. level, since it might be dangerous | ||
| 5571 | + * (e.g. WRT54G people experience | ||
| 5572 | + * excessive Tx power damage!) */ | ||
| 5573 | + adev->tx_level_dbm = 18; | ||
| 5574 | + /* | ||
| 5575 | + * Lower power for the iPaq hx4700 | ||
| 5576 | + */ | ||
| 5577 | + if (IS_MEM(adev)) { | ||
| 5578 | + adev->tx_level_dbm = 14; | ||
| 5579 | + } | ||
| 5580 | + } | ||
| 5581 | + /* adev->tx_level_auto = 1; */ | ||
| 5582 | + if (IS_ACX111(adev)) { | ||
| 5583 | + /* start with sensitivity level 1 out of 3: */ | ||
| 5584 | + adev->sensitivity = 1; | ||
| 5585 | + } | ||
| 5586 | + | ||
| 5587 | +/* #define ENABLE_POWER_SAVE */ | ||
| 5588 | +#ifdef ENABLE_POWER_SAVE | ||
| 5589 | + adev->ps_wakeup_cfg = PS_CFG_ENABLE | PS_CFG_WAKEUP_ALL_BEAC; | ||
| 5590 | + adev->ps_listen_interval = 1; | ||
| 5591 | + adev->ps_options = PS_OPT_ENA_ENHANCED_PS | PS_OPT_TX_PSPOLL | PS_OPT_STILL_RCV_BCASTS; | ||
| 5592 | + adev->ps_hangover_period = 30; | ||
| 5593 | + adev->ps_enhanced_transition_time = 0; | ||
| 5594 | +#else | ||
| 5595 | + adev->ps_wakeup_cfg = 0; | ||
| 5596 | + adev->ps_listen_interval = 0; | ||
| 5597 | + adev->ps_options = 0; | ||
| 5598 | + adev->ps_hangover_period = 0; | ||
| 5599 | + adev->ps_enhanced_transition_time = 0; | ||
| 5600 | +#endif | ||
| 5601 | + | ||
| 5602 | + /* These settings will be set in fw on ifup */ | ||
| 5603 | + adev->set_mask = 0 | ||
| 5604 | + | GETSET_RETRY | ||
| 5605 | + | SET_MSDU_LIFETIME | ||
| 5606 | + /* configure card to do rate fallback when in auto rate mode */ | ||
| 5607 | + | SET_RATE_FALLBACK | ||
| 5608 | + | SET_RXCONFIG | ||
| 5609 | + | GETSET_TXPOWER | ||
| 5610 | + /* better re-init the antenna value we got above */ | ||
| 5611 | + | GETSET_ANTENNA | ||
| 5612 | +#if POWER_SAVE_80211 | ||
| 5613 | + | GETSET_POWER_80211 | ||
| 5614 | +#endif | ||
| 5615 | + ; | ||
| 5616 | + | ||
| 5617 | + acx_unlock(adev, flags); | ||
| 5618 | + acx_lock_unhold(); /* hold time 844814 CPU ticks @2GHz */ | ||
| 5619 | + | ||
| 5620 | + acx_s_initialize_rx_config(adev); | ||
| 5621 | + | ||
| 5622 | + FN_EXIT0; | ||
| 5623 | +} | ||
| 5624 | + | ||
| 5625 | + | ||
| 5626 | +/*********************************************************************** | ||
| 5627 | +** FIXME: this should be solved in a general way for all radio types | ||
| 5628 | +** by decoding the radio firmware module, | ||
| 5629 | +** since it probably has some standard structure describing how to | ||
| 5630 | +** set the power level of the radio module which it controls. | ||
| 5631 | +** Or maybe not, since the radio module probably has a function interface | ||
| 5632 | +** instead which then manages Tx level programming :-\ | ||
| 5633 | +*/ | ||
| 5634 | +static int | ||
| 5635 | +acx111_s_set_tx_level(acx_device_t *adev, u8 level_dbm) | ||
| 5636 | +{ | ||
| 5637 | + struct acx111_ie_tx_level tx_level; | ||
| 5638 | + | ||
| 5639 | + /* my acx111 card has two power levels in its configoptions (== EEPROM): | ||
| 5640 | + * 1 (30mW) [15dBm] | ||
| 5641 | + * 2 (10mW) [10dBm] | ||
| 5642 | + * For now, just assume all other acx111 cards have the same. | ||
| 5643 | + * FIXME: Ideally we would query it here, but we first need a | ||
| 5644 | + * standard way to query individual configoptions easily. | ||
| 5645 | + * Well, now we have proper cfgopt txpower variables, but this still | ||
| 5646 | + * hasn't been done yet, since it also requires dBm <-> mW conversion here... */ | ||
| 5647 | + if (level_dbm <= 12) { | ||
| 5648 | + tx_level.level = 2; /* 10 dBm */ | ||
| 5649 | + adev->tx_level_dbm = 10; | ||
| 5650 | + } else { | ||
| 5651 | + tx_level.level = 1; /* 15 dBm */ | ||
| 5652 | + adev->tx_level_dbm = 15; | ||
| 5653 | + } | ||
| 5654 | + if (level_dbm != adev->tx_level_dbm) | ||
| 5655 | + log(L_INIT, "acx111 firmware has specific " | ||
| 5656 | + "power levels only: adjusted %d dBm to %d dBm!\n", | ||
| 5657 | + level_dbm, adev->tx_level_dbm); | ||
| 5658 | + | ||
| 5659 | + return acx_s_configure(adev, &tx_level, ACX1xx_IE_DOT11_TX_POWER_LEVEL); | ||
| 5660 | +} | ||
| 5661 | + | ||
| 5662 | +static int | ||
| 5663 | +acx_s_set_tx_level(acx_device_t *adev, u8 level_dbm) | ||
| 5664 | +{ | ||
| 5665 | + if (IS_ACX111(adev)) { | ||
| 5666 | + return acx111_s_set_tx_level(adev, level_dbm); | ||
| 5667 | + } | ||
| 5668 | +#if defined (ACX_MEM) | ||
| 5669 | + return acx100mem_s_set_tx_level(adev, level_dbm); | ||
| 5670 | +#else | ||
| 5671 | + if (IS_PCI(adev)) { | ||
| 5672 | + return acx100pci_s_set_tx_level(adev, level_dbm); | ||
| 5673 | + } | ||
| 5674 | +#endif | ||
| 5675 | + return OK; | ||
| 5676 | +} | ||
| 5677 | + | ||
| 5678 | + | ||
| 5679 | +/*********************************************************************** | ||
| 5680 | +*/ | ||
| 5681 | +#ifdef UNUSED | ||
| 5682 | +/* Returns the current tx level (ACX111) */ | ||
| 5683 | +static u8 | ||
| 5684 | +acx111_s_get_tx_level(acx_device_t *adev) | ||
| 5685 | +{ | ||
| 5686 | + struct acx111_ie_tx_level tx_level; | ||
| 5687 | + | ||
| 5688 | + tx_level.level = 0; | ||
| 5689 | + acx_s_interrogate(adev, &tx_level, ACX1xx_IE_DOT11_TX_POWER_LEVEL); | ||
| 5690 | + return tx_level.level; | ||
| 5691 | +} | ||
| 5692 | +#endif | ||
| 5693 | + | ||
| 5694 | + | ||
| 5695 | +/*********************************************************************** | ||
| 5696 | +** acx_l_rxmonitor | ||
| 5697 | +** Called from IRQ context only | ||
| 5698 | +*/ | ||
| 5699 | +static void | ||
| 5700 | +acx_l_rxmonitor(acx_device_t *adev, const rxbuffer_t *rxbuf) | ||
| 5701 | +{ | ||
| 5702 | + wlansniffrm_t *msg; | ||
| 5703 | + struct sk_buff *skb; | ||
| 5704 | + void *datap; | ||
| 5705 | + unsigned int skb_len; | ||
| 5706 | + int payload_offset; | ||
| 5707 | + | ||
| 5708 | + FN_ENTER; | ||
| 5709 | + | ||
| 5710 | + /* we are in big luck: the acx100 doesn't modify any of the fields */ | ||
| 5711 | + /* in the 802.11 frame. just pass this packet into the PF_PACKET */ | ||
| 5712 | + /* subsystem. yeah. */ | ||
| 5713 | + payload_offset = ((u8*)acx_get_wlan_hdr(adev, rxbuf) - (u8*)rxbuf); | ||
| 5714 | + skb_len = RXBUF_BYTES_USED(rxbuf) - payload_offset; | ||
| 5715 | + | ||
| 5716 | + /* sanity check */ | ||
| 5717 | + if (unlikely(skb_len > WLAN_A4FR_MAXLEN_WEP)) { | ||
| 5718 | + printk("%s: monitor mode panic: oversized frame!\n", | ||
| 5719 | + adev->ndev->name); | ||
| 5720 | + goto end; | ||
| 5721 | + } | ||
| 5722 | + | ||
| 5723 | + if (adev->ndev->type == ARPHRD_IEEE80211_PRISM) | ||
| 5724 | + skb_len += sizeof(*msg); | ||
| 5725 | + | ||
| 5726 | + /* allocate skb */ | ||
| 5727 | + skb = dev_alloc_skb(skb_len); | ||
| 5728 | + if (unlikely(!skb)) { | ||
| 5729 | + printk("%s: no memory for skb (%u bytes)\n", | ||
| 5730 | + adev->ndev->name, skb_len); | ||
| 5731 | + goto end; | ||
| 5732 | + } | ||
| 5733 | + | ||
| 5734 | + skb_put(skb, skb_len); | ||
| 5735 | + | ||
| 5736 | + if (adev->ndev->type == ARPHRD_IEEE80211) { | ||
| 5737 | + /* when in raw 802.11 mode, just copy frame as-is */ | ||
| 5738 | + datap = skb->data; | ||
| 5739 | + } else if (adev->ndev->type == ARPHRD_IEEE80211_PRISM) { | ||
| 5740 | + /* emulate prism header */ | ||
| 5741 | + msg = (wlansniffrm_t*)skb->data; | ||
| 5742 | + datap = msg + 1; | ||
| 5743 | + | ||
| 5744 | + msg->msgcode = WLANSNIFFFRM; | ||
| 5745 | + msg->msglen = sizeof(*msg); | ||
| 5746 | + strncpy(msg->devname, adev->ndev->name, sizeof(msg->devname)-1); | ||
| 5747 | + msg->devname[sizeof(msg->devname)-1] = '\0'; | ||
| 5748 | + | ||
| 5749 | + msg->hosttime.did = WLANSNIFFFRM_hosttime; | ||
| 5750 | + msg->hosttime.status = WLANITEM_STATUS_data_ok; | ||
| 5751 | + msg->hosttime.len = 4; | ||
| 5752 | + msg->hosttime.data = jiffies; | ||
| 5753 | + | ||
| 5754 | + msg->mactime.did = WLANSNIFFFRM_mactime; | ||
| 5755 | + msg->mactime.status = WLANITEM_STATUS_data_ok; | ||
| 5756 | + msg->mactime.len = 4; | ||
| 5757 | + msg->mactime.data = rxbuf->time; | ||
| 5758 | + | ||
| 5759 | + msg->channel.did = WLANSNIFFFRM_channel; | ||
| 5760 | + msg->channel.status = WLANITEM_STATUS_data_ok; | ||
| 5761 | + msg->channel.len = 4; | ||
| 5762 | + msg->channel.data = adev->channel; | ||
| 5763 | + | ||
| 5764 | + msg->rssi.did = WLANSNIFFFRM_rssi; | ||
| 5765 | + msg->rssi.status = WLANITEM_STATUS_no_value; | ||
| 5766 | + msg->rssi.len = 4; | ||
| 5767 | + msg->rssi.data = 0; | ||
| 5768 | + | ||
| 5769 | + msg->sq.did = WLANSNIFFFRM_sq; | ||
| 5770 | + msg->sq.status = WLANITEM_STATUS_no_value; | ||
| 5771 | + msg->sq.len = 4; | ||
| 5772 | + msg->sq.data = 0; | ||
| 5773 | + | ||
| 5774 | + msg->signal.did = WLANSNIFFFRM_signal; | ||
| 5775 | + msg->signal.status = WLANITEM_STATUS_data_ok; | ||
| 5776 | + msg->signal.len = 4; | ||
| 5777 | + msg->signal.data = rxbuf->phy_snr; | ||
| 5778 | + | ||
| 5779 | + msg->noise.did = WLANSNIFFFRM_noise; | ||
| 5780 | + msg->noise.status = WLANITEM_STATUS_data_ok; | ||
| 5781 | + msg->noise.len = 4; | ||
| 5782 | + msg->noise.data = rxbuf->phy_level; | ||
| 5783 | + | ||
| 5784 | + msg->rate.did = WLANSNIFFFRM_rate; | ||
| 5785 | + msg->rate.status = WLANITEM_STATUS_data_ok; | ||
| 5786 | + msg->rate.len = 4; | ||
| 5787 | + msg->rate.data = rxbuf->phy_plcp_signal / 5; | ||
| 5788 | + | ||
| 5789 | + msg->istx.did = WLANSNIFFFRM_istx; | ||
| 5790 | + msg->istx.status = WLANITEM_STATUS_data_ok; | ||
| 5791 | + msg->istx.len = 4; | ||
| 5792 | + msg->istx.data = 0; /* tx=0: it's not a tx packet */ | ||
| 5793 | + | ||
| 5794 | + skb_len -= sizeof(*msg); | ||
| 5795 | + | ||
| 5796 | + msg->frmlen.did = WLANSNIFFFRM_signal; | ||
| 5797 | + msg->frmlen.status = WLANITEM_STATUS_data_ok; | ||
| 5798 | + msg->frmlen.len = 4; | ||
| 5799 | + msg->frmlen.data = skb_len; | ||
| 5800 | + } else { | ||
| 5801 | + printk("acx: unsupported netdev type %d!\n", adev->ndev->type); | ||
| 5802 | + dev_kfree_skb(skb); | ||
| 5803 | + return; | ||
| 5804 | + } | ||
| 5805 | + | ||
| 5806 | + /* sanity check (keep it here) */ | ||
| 5807 | + if (unlikely((int)skb_len < 0)) { | ||
| 5808 | + printk("acx: skb_len=%d. Driver bug, please report\n", (int)skb_len); | ||
| 5809 | + dev_kfree_skb(skb); | ||
| 5810 | + return; | ||
| 5811 | + } | ||
| 5812 | + memcpy(datap, ((unsigned char*)rxbuf)+payload_offset, skb_len); | ||
| 5813 | + | ||
| 5814 | + skb->dev = adev->ndev; | ||
| 5815 | + skb->dev->last_rx = jiffies; | ||
| 5816 | + | ||
| 5817 | + skb_reset_mac_header(skb); | ||
| 5818 | + skb->ip_summed = CHECKSUM_NONE; | ||
| 5819 | + skb->pkt_type = PACKET_OTHERHOST; | ||
| 5820 | + skb->protocol = htons(ETH_P_80211_RAW); | ||
| 5821 | + netif_rx(skb); | ||
| 5822 | + | ||
| 5823 | + adev->stats.rx_packets++; | ||
| 5824 | + adev->stats.rx_bytes += skb->len; | ||
| 5825 | + | ||
| 5826 | +end: | ||
| 5827 | + FN_EXIT0; | ||
| 5828 | +} | ||
| 5829 | + | ||
| 5830 | + | ||
| 5831 | +/*********************************************************************** | ||
| 5832 | +** acx_l_rx_ieee802_11_frame | ||
| 5833 | +** | ||
| 5834 | +** Called from IRQ context only | ||
| 5835 | +*/ | ||
| 5836 | + | ||
| 5837 | +/* All these contortions are for saner dup logging | ||
| 5838 | +** | ||
| 5839 | +** We want: (a) to know about excessive dups | ||
| 5840 | +** (b) to not spam kernel log about occasional dups | ||
| 5841 | +** | ||
| 5842 | +** 1/64 threshold was chosen by running "ping -A" | ||
| 5843 | +** It gave "rx: 59 DUPs in 2878 packets" only with 4 parallel | ||
| 5844 | +** "ping -A" streams running. */ | ||
| 5845 | +/* 2005-10-11: bumped up to 1/8 | ||
| 5846 | +** subtract a $smallint from dup_count in order to | ||
| 5847 | +** avoid "2 DUPs in 19 packets" messages */ | ||
| 5848 | +static inline int | ||
| 5849 | +acx_l_handle_dup(acx_device_t *adev, u16 seq) | ||
| 5850 | +{ | ||
| 5851 | + if (adev->dup_count) { | ||
| 5852 | + adev->nondup_count++; | ||
| 5853 | + if (time_after(jiffies, adev->dup_msg_expiry)) { | ||
| 5854 | + /* Log only if more than 1 dup in 64 packets */ | ||
| 5855 | + if (adev->nondup_count/8 < adev->dup_count-5) { | ||
| 5856 | + printk(KERN_INFO "%s: rx: %d DUPs in " | ||
| 5857 | + "%d packets received in 10 secs\n", | ||
| 5858 | + adev->ndev->name, | ||
| 5859 | + adev->dup_count, | ||
| 5860 | + adev->nondup_count); | ||
| 5861 | + } | ||
| 5862 | + adev->dup_count = 0; | ||
| 5863 | + adev->nondup_count = 0; | ||
| 5864 | + } | ||
| 5865 | + } | ||
| 5866 | + if (unlikely(seq == adev->last_seq_ctrl)) { | ||
| 5867 | + if (!adev->dup_count++) | ||
| 5868 | + adev->dup_msg_expiry = jiffies + 10*HZ; | ||
| 5869 | + adev->stats.rx_errors++; | ||
| 5870 | + return 1; /* a dup */ | ||
| 5871 | + } | ||
| 5872 | + adev->last_seq_ctrl = seq; | ||
| 5873 | + return 0; | ||
| 5874 | +} | ||
| 5875 | + | ||
| 5876 | +static int | ||
| 5877 | +acx_l_rx_ieee802_11_frame(acx_device_t *adev, rxbuffer_t *rxbuf) | ||
| 5878 | +{ | ||
| 5879 | + unsigned int ftype, fstype; | ||
| 5880 | + const wlan_hdr_t *hdr; | ||
| 5881 | + int result = NOT_OK; | ||
| 5882 | + | ||
| 5883 | + FN_ENTER; | ||
| 5884 | + | ||
| 5885 | + hdr = acx_get_wlan_hdr(adev, rxbuf); | ||
| 5886 | + | ||
| 5887 | + /* see IEEE 802.11-1999.pdf chapter 7 "MAC frame formats" */ | ||
| 5888 | + if (unlikely((hdr->fc & WF_FC_PVERi) != 0)) { | ||
| 5889 | + printk_ratelimited(KERN_INFO "rx: unsupported 802.11 protocol\n"); | ||
| 5890 | + goto end; | ||
| 5891 | + } | ||
| 5892 | + | ||
| 5893 | + ftype = hdr->fc & WF_FC_FTYPEi; | ||
| 5894 | + fstype = hdr->fc & WF_FC_FSTYPEi; | ||
| 5895 | + | ||
| 5896 | + switch (ftype) { | ||
| 5897 | + /* check data frames first, for speed */ | ||
| 5898 | + case WF_FTYPE_DATAi: | ||
| 5899 | + switch (fstype) { | ||
| 5900 | + case WF_FSTYPE_DATAONLYi: | ||
| 5901 | + if (acx_l_handle_dup(adev, hdr->seq)) | ||
| 5902 | + break; /* a dup, simply discard it */ | ||
| 5903 | + | ||
| 5904 | + /* TODO: | ||
| 5905 | + if (WF_FC_FROMTODSi == (hdr->fc & WF_FC_FROMTODSi)) { | ||
| 5906 | + result = acx_l_process_data_frame_wds(adev, rxbuf); | ||
| 5907 | + break; | ||
| 5908 | + } | ||
| 5909 | + */ | ||
| 5910 | + | ||
| 5911 | + switch (adev->mode) { | ||
| 5912 | + case ACX_MODE_3_AP: | ||
| 5913 | + result = acx_l_process_data_frame_master(adev, rxbuf); | ||
| 5914 | + break; | ||
| 5915 | + case ACX_MODE_0_ADHOC: | ||
| 5916 | + case ACX_MODE_2_STA: | ||
| 5917 | + result = acx_l_process_data_frame_client(adev, rxbuf); | ||
| 5918 | + break; | ||
| 5919 | + } | ||
| 5920 | + case WF_FSTYPE_DATA_CFACKi: | ||
| 5921 | + case WF_FSTYPE_DATA_CFPOLLi: | ||
| 5922 | + case WF_FSTYPE_DATA_CFACK_CFPOLLi: | ||
| 5923 | + case WF_FSTYPE_CFPOLLi: | ||
| 5924 | + case WF_FSTYPE_CFACK_CFPOLLi: | ||
| 5925 | + /* see above. | ||
| 5926 | + acx_process_class_frame(adev, rxbuf, 3); */ | ||
| 5927 | + break; | ||
| 5928 | + case WF_FSTYPE_NULLi: | ||
| 5929 | + /* acx_l_process_NULL_frame(adev, rxbuf, 3); */ | ||
| 5930 | + break; | ||
| 5931 | + /* FIXME: same here, see above */ | ||
| 5932 | + case WF_FSTYPE_CFACKi: | ||
| 5933 | + default: | ||
| 5934 | + break; | ||
| 5935 | + } | ||
| 5936 | + break; | ||
| 5937 | + case WF_FTYPE_MGMTi: | ||
| 5938 | + result = acx_l_process_mgmt_frame(adev, rxbuf); | ||
| 5939 | + break; | ||
| 5940 | + case WF_FTYPE_CTLi: | ||
| 5941 | + if (fstype == WF_FSTYPE_PSPOLLi) | ||
| 5942 | + result = OK; | ||
| 5943 | + /* this call is irrelevant, since | ||
| 5944 | + * acx_process_class_frame is a stub, so return | ||
| 5945 | + * immediately instead. | ||
| 5946 | + * return acx_process_class_frame(adev, rxbuf, 3); */ | ||
| 5947 | + break; | ||
| 5948 | + default: | ||
| 5949 | + break; | ||
| 5950 | + } | ||
| 5951 | +end: | ||
| 5952 | + FN_EXIT1(result); | ||
| 5953 | + return result; | ||
| 5954 | +} | ||
| 5955 | + | ||
| 5956 | + | ||
| 5957 | +/*********************************************************************** | ||
| 5958 | +** acx_l_process_rxbuf | ||
| 5959 | +** | ||
| 5960 | +** NB: used by USB code also | ||
| 5961 | +*/ | ||
| 5962 | +void | ||
| 5963 | +acx_l_process_rxbuf(acx_device_t *adev, rxbuffer_t *rxbuf) | ||
| 5964 | +{ | ||
| 5965 | + struct wlan_hdr *hdr; | ||
| 5966 | + unsigned int qual; | ||
| 5967 | + int buf_len; | ||
| 5968 | + u16 fc; | ||
| 5969 | + | ||
| 5970 | + hdr = acx_get_wlan_hdr(adev, rxbuf); | ||
| 5971 | + fc = le16_to_cpu(hdr->fc); | ||
| 5972 | + /* length of frame from control field to first byte of FCS */ | ||
| 5973 | + buf_len = RXBUF_BYTES_RCVD(adev, rxbuf); | ||
| 5974 | + | ||
| 5975 | + if ( ((WF_FC_FSTYPE & fc) != WF_FSTYPE_BEACON) | ||
| 5976 | + || (acx_debug & L_XFER_BEACON) | ||
| 5977 | + ) { | ||
| 5978 | + log(L_XFER|L_DATA, "rx: %s " | ||
| 5979 | + "time:%u len:%u signal:%u SNR:%u macstat:%02X " | ||
| 5980 | + "phystat:%02X phyrate:%u status:%u\n", | ||
| 5981 | + acx_get_packet_type_string(fc), | ||
| 5982 | + le32_to_cpu(rxbuf->time), | ||
| 5983 | + buf_len, | ||
| 5984 | + acx_signal_to_winlevel(rxbuf->phy_level), | ||
| 5985 | + acx_signal_to_winlevel(rxbuf->phy_snr), | ||
| 5986 | + rxbuf->mac_status, | ||
| 5987 | + rxbuf->phy_stat_baseband, | ||
| 5988 | + rxbuf->phy_plcp_signal, | ||
| 5989 | + adev->status); | ||
| 5990 | + } | ||
| 5991 | + | ||
| 5992 | + if (unlikely(acx_debug & L_DATA)) { | ||
| 5993 | + printk("rx: 802.11 buf[%u]: ", buf_len); | ||
| 5994 | + acx_dump_bytes(hdr, buf_len); | ||
| 5995 | + } | ||
| 5996 | + | ||
| 5997 | + /* FIXME: should check for Rx errors (rxbuf->mac_status? | ||
| 5998 | + * discard broken packets - but NOT for monitor!) | ||
| 5999 | + * and update Rx packet statistics here */ | ||
| 6000 | + | ||
| 6001 | + if (unlikely(adev->mode == ACX_MODE_MONITOR)) { | ||
| 6002 | + acx_l_rxmonitor(adev, rxbuf); | ||
| 6003 | + } else if (likely(buf_len >= WLAN_HDR_A3_LEN)) { | ||
| 6004 | + acx_l_rx_ieee802_11_frame(adev, rxbuf); | ||
| 6005 | + } else { | ||
| 6006 | + log(L_DEBUG|L_XFER|L_DATA, | ||
| 6007 | + "rx: NOT receiving packet (%s): " | ||
| 6008 | + "size too small (%u)\n", | ||
| 6009 | + acx_get_packet_type_string(fc), | ||
| 6010 | + buf_len); | ||
| 6011 | + } | ||
| 6012 | + | ||
| 6013 | + /* Now check Rx quality level, AFTER processing packet. | ||
| 6014 | + * I tried to figure out how to map these levels to dBm | ||
| 6015 | + * values, but for the life of me I really didn't | ||
| 6016 | + * manage to get it. Either these values are not meant to | ||
| 6017 | + * be expressed in dBm, or it's some pretty complicated | ||
| 6018 | + * calculation. */ | ||
| 6019 | + | ||
| 6020 | +#ifdef FROM_SCAN_SOURCE_ONLY | ||
| 6021 | + /* only consider packets originating from the MAC | ||
| 6022 | + * address of the device that's managing our BSSID. | ||
| 6023 | + * Disable it for now, since it removes information (levels | ||
| 6024 | + * from different peers) and slows the Rx path. */ | ||
| 6025 | + if (adev->ap_client | ||
| 6026 | + && mac_is_equal(hdr->a2, adev->ap_client->address)) { | ||
| 6027 | +#endif | ||
| 6028 | + adev->wstats.qual.level = acx_signal_to_winlevel(rxbuf->phy_level); | ||
| 6029 | + adev->wstats.qual.noise = acx_signal_to_winlevel(rxbuf->phy_snr); | ||
| 6030 | +#ifndef OLD_QUALITY | ||
| 6031 | + qual = acx_signal_determine_quality(adev->wstats.qual.level, | ||
| 6032 | + adev->wstats.qual.noise); | ||
| 6033 | +#else | ||
| 6034 | + qual = (adev->wstats.qual.noise <= 100) ? | ||
| 6035 | + 100 - adev->wstats.qual.noise : 0; | ||
| 6036 | +#endif | ||
| 6037 | + adev->wstats.qual.qual = qual; | ||
| 6038 | + adev->wstats.qual.updated = 7; /* all 3 indicators updated */ | ||
| 6039 | +#ifdef FROM_SCAN_SOURCE_ONLY | ||
| 6040 | + } | ||
| 6041 | +#endif | ||
| 6042 | +} | ||
| 6043 | + | ||
| 6044 | + | ||
| 6045 | +/*********************************************************************** | ||
| 6046 | +** acx_l_handle_txrate_auto | ||
| 6047 | +** | ||
| 6048 | +** Theory of operation: | ||
| 6049 | +** client->rate_cap is a bitmask of rates client is capable of. | ||
| 6050 | +** client->rate_cfg is a bitmask of allowed (configured) rates. | ||
| 6051 | +** It is set as a result of iwconfig rate N [auto] | ||
| 6052 | +** or iwpriv set_rates "N,N,N N,N,N" commands. | ||
| 6053 | +** It can be fixed (e.g. 0x0080 == 18Mbit only), | ||
| 6054 | +** auto (0x00ff == 18Mbit or any lower value), | ||
| 6055 | +** and code handles any bitmask (0x1081 == try 54Mbit,18Mbit,1Mbit _only_). | ||
| 6056 | +** | ||
| 6057 | +** client->rate_cur is a value for rate111 field in tx descriptor. | ||
| 6058 | +** It is always set to txrate_cfg sans zero or more most significant | ||
| 6059 | +** bits. This routine handles selection of new rate_cur value depending on | ||
| 6060 | +** outcome of last tx event. | ||
| 6061 | +** | ||
| 6062 | +** client->rate_100 is a precalculated rate value for acx100 | ||
| 6063 | +** (we can do without it, but will need to calculate it on each tx). | ||
| 6064 | +** | ||
| 6065 | +** You cannot configure mixed usage of 5.5 and/or 11Mbit rate | ||
| 6066 | +** with PBCC and CCK modulation. Either both at CCK or both at PBCC. | ||
| 6067 | +** In theory you can implement it, but so far it is considered not worth doing. | ||
| 6068 | +** | ||
| 6069 | +** 22Mbit, of course, is PBCC always. */ | ||
| 6070 | + | ||
| 6071 | +/* maps acx100 tx descr rate field to acx111 one */ | ||
| 6072 | +static u16 | ||
| 6073 | +rate100to111(u8 r) | ||
| 6074 | +{ | ||
| 6075 | + switch (r) { | ||
| 6076 | + case RATE100_1: return RATE111_1; | ||
| 6077 | + case RATE100_2: return RATE111_2; | ||
| 6078 | + case RATE100_5: | ||
| 6079 | + case (RATE100_5 | RATE100_PBCC511): return RATE111_5; | ||
| 6080 | + case RATE100_11: | ||
| 6081 | + case (RATE100_11 | RATE100_PBCC511): return RATE111_11; | ||
| 6082 | + case RATE100_22: return RATE111_22; | ||
| 6083 | + default: | ||
| 6084 | + printk("acx: unexpected acx100 txrate: %u! " | ||
| 6085 | + "Please report\n", r); | ||
| 6086 | + return RATE111_1; | ||
| 6087 | + } | ||
| 6088 | +} | ||
| 6089 | + | ||
| 6090 | + | ||
| 6091 | +void | ||
| 6092 | +acx_l_handle_txrate_auto(acx_device_t *adev, struct client *txc, | ||
| 6093 | + u16 cur, u8 rate100, u16 rate111, | ||
| 6094 | + u8 error, int pkts_to_ignore) | ||
| 6095 | +{ | ||
| 6096 | + u16 sent_rate; | ||
| 6097 | + int slower_rate_was_used; | ||
| 6098 | + | ||
| 6099 | + /* vda: hmm. current code will do this: | ||
| 6100 | + ** 1. send packets at 11 Mbit, stepup++ | ||
| 6101 | + ** 2. will try to send at 22Mbit. hardware will see no ACK, | ||
| 6102 | + ** retries at 11Mbit, success. code notes that used rate | ||
| 6103 | + ** is lower. stepup = 0, fallback++ | ||
| 6104 | + ** 3. repeat step 2 fallback_count times. Fall back to | ||
| 6105 | + ** 11Mbit. go to step 1. | ||
| 6106 | + ** If stepup_count is large (say, 16) and fallback_count | ||
| 6107 | + ** is small (3), this wouldn't be too bad wrt throughput */ | ||
| 6108 | + | ||
| 6109 | + if (unlikely(!cur)) { | ||
| 6110 | + printk("acx: BUG! ratemask is empty\n"); | ||
| 6111 | + return; /* or else we may lock up the box */ | ||
| 6112 | + } | ||
| 6113 | + | ||
| 6114 | + /* do some preparations, i.e. calculate the one rate that was | ||
| 6115 | + * used to send this packet */ | ||
| 6116 | + if (IS_ACX111(adev)) { | ||
| 6117 | + sent_rate = 1 << highest_bit(rate111 & RATE111_ALL); | ||
| 6118 | + } else { | ||
| 6119 | + sent_rate = rate100to111(rate100); | ||
| 6120 | + } | ||
| 6121 | + /* sent_rate has only one bit set now, corresponding to tx rate | ||
| 6122 | + * which was used by hardware to tx this particular packet */ | ||
| 6123 | + | ||
| 6124 | + /* now do the actual auto rate management */ | ||
| 6125 | + log(L_XFER, "tx: %sclient=%p/"MACSTR" used=%04X cur=%04X cfg=%04X " | ||
| 6126 | + "__=%u/%u ^^=%u/%u\n", | ||
| 6127 | + (txc->ignore_count > 0) ? "[IGN] " : "", | ||
| 6128 | + txc, MAC(txc->address), sent_rate, cur, txc->rate_cfg, | ||
| 6129 | + txc->fallback_count, adev->fallback_threshold, | ||
| 6130 | + txc->stepup_count, adev->stepup_threshold | ||
| 6131 | + ); | ||
| 6132 | + | ||
| 6133 | + /* we need to ignore old packets already in the tx queue since | ||
| 6134 | + * they use older rate bytes configured before our last rate change, | ||
| 6135 | + * otherwise our mechanism will get confused by interpreting old data. | ||
| 6136 | + * Do it after logging above */ | ||
| 6137 | + if (txc->ignore_count) { | ||
| 6138 | + txc->ignore_count--; | ||
| 6139 | + return; | ||
| 6140 | + } | ||
| 6141 | + | ||
| 6142 | + /* true only if the only nonzero bit in sent_rate is | ||
| 6143 | + ** less significant than highest nonzero bit in cur */ | ||
| 6144 | + slower_rate_was_used = ( cur > ((sent_rate<<1)-1) ); | ||
| 6145 | + | ||
| 6146 | + if (slower_rate_was_used || error) { | ||
| 6147 | + txc->stepup_count = 0; | ||
| 6148 | + if (++txc->fallback_count <= adev->fallback_threshold) | ||
| 6149 | + return; | ||
| 6150 | + txc->fallback_count = 0; | ||
| 6151 | + | ||
| 6152 | + /* clear highest 1 bit in cur */ | ||
| 6153 | + sent_rate = RATE111_54; | ||
| 6154 | + while (!(cur & sent_rate)) sent_rate >>= 1; | ||
| 6155 | + CLEAR_BIT(cur, sent_rate); | ||
| 6156 | + if (!cur) /* we can't disable all rates! */ | ||
| 6157 | + cur = sent_rate; | ||
| 6158 | + log(L_XFER, "tx: falling back to ratemask %04X\n", cur); | ||
| 6159 | + | ||
| 6160 | + } else { /* there was neither lower rate nor error */ | ||
| 6161 | + txc->fallback_count = 0; | ||
| 6162 | + if (++txc->stepup_count <= adev->stepup_threshold) | ||
| 6163 | + return; | ||
| 6164 | + txc->stepup_count = 0; | ||
| 6165 | + | ||
| 6166 | + /* Sanitize. Sort of not needed, but I dont trust hw that much... | ||
| 6167 | + ** what if it can report bogus tx rates sometimes? */ | ||
| 6168 | + while (!(cur & sent_rate)) sent_rate >>= 1; | ||
| 6169 | + | ||
| 6170 | + /* try to find a higher sent_rate that isn't yet in our | ||
| 6171 | + * current set, but is an allowed cfg */ | ||
| 6172 | + while (1) { | ||
| 6173 | + sent_rate <<= 1; | ||
| 6174 | + if (sent_rate > txc->rate_cfg) | ||
| 6175 | + /* no higher rates allowed by config */ | ||
| 6176 | + return; | ||
| 6177 | + if (!(cur & sent_rate) && (txc->rate_cfg & sent_rate)) | ||
| 6178 | + /* found */ | ||
| 6179 | + break; | ||
| 6180 | + /* not found, try higher one */ | ||
| 6181 | + } | ||
| 6182 | + SET_BIT(cur, sent_rate); | ||
| 6183 | + log(L_XFER, "tx: stepping up to ratemask %04X\n", cur); | ||
| 6184 | + } | ||
| 6185 | + | ||
| 6186 | + txc->rate_cur = cur; | ||
| 6187 | + txc->ignore_count = pkts_to_ignore; | ||
| 6188 | + /* calculate acx100 style rate byte if needed */ | ||
| 6189 | + if (IS_ACX100(adev)) { | ||
| 6190 | + txc->rate_100 = acx_bitpos2rate100[highest_bit(cur)]; | ||
| 6191 | + } | ||
| 6192 | +} | ||
| 6193 | + | ||
| 6194 | + | ||
| 6195 | +/*********************************************************************** | ||
| 6196 | +** acx_i_start_xmit | ||
| 6197 | +** | ||
| 6198 | +** Called by network core. Can be called outside of process context. | ||
| 6199 | +*/ | ||
| 6200 | +int | ||
| 6201 | +acx_i_start_xmit(struct sk_buff *skb, struct net_device *ndev) | ||
| 6202 | +{ | ||
| 6203 | + acx_device_t *adev = ndev2adev(ndev); | ||
| 6204 | + tx_t *tx; | ||
| 6205 | + void *txbuf; | ||
| 6206 | + unsigned long flags; | ||
| 6207 | + int txresult = NOT_OK; | ||
| 6208 | + int len; | ||
| 6209 | + | ||
| 6210 | + FN_ENTER; | ||
| 6211 | + | ||
| 6212 | + if (unlikely(!skb)) { | ||
| 6213 | + /* indicate success */ | ||
| 6214 | + txresult = OK; | ||
| 6215 | + goto end_no_unlock; | ||
| 6216 | + } | ||
| 6217 | + if (unlikely(!adev)) { | ||
| 6218 | + goto end_no_unlock; | ||
| 6219 | + } | ||
| 6220 | + | ||
| 6221 | + acx_lock(adev, flags); | ||
| 6222 | + | ||
| 6223 | + if (unlikely(!(adev->dev_state_mask & ACX_STATE_IFACE_UP))) { | ||
| 6224 | + goto end; | ||
| 6225 | + } | ||
| 6226 | + if (unlikely(adev->mode == ACX_MODE_OFF)) { | ||
| 6227 | + goto end; | ||
| 6228 | + } | ||
| 6229 | + if (unlikely(acx_queue_stopped(ndev))) { | ||
| 6230 | + log(L_DEBUG, "%s: called when queue stopped\n", __func__); | ||
| 6231 | + goto end; | ||
| 6232 | + } | ||
| 6233 | + if (unlikely(ACX_STATUS_4_ASSOCIATED != adev->status)) { | ||
| 6234 | + log(L_XFER, "trying to xmit, but not associated yet: " | ||
| 6235 | + "aborting...\n"); | ||
| 6236 | + /* silently drop the packet, since we're not connected yet */ | ||
| 6237 | + txresult = OK; | ||
| 6238 | + /* ...but indicate an error nevertheless */ | ||
| 6239 | + adev->stats.tx_errors++; | ||
| 6240 | + goto end; | ||
| 6241 | + } | ||
| 6242 | + | ||
| 6243 | + tx = acx_l_alloc_tx(adev); | ||
| 6244 | + if (unlikely(!tx)) { | ||
| 6245 | +#ifndef ACX_MEM | ||
| 6246 | + /* | ||
| 6247 | + * generic slave interface has to make do with the tiny amount, around | ||
| 6248 | + * 7k, of transmit buffer space on the ACX itself. It is likely this will | ||
| 6249 | + * frequently be full. | ||
| 6250 | + */ | ||
| 6251 | + printk_ratelimited("%s: start_xmit: txdesc ring is full, " | ||
| 6252 | + "dropping tx\n", ndev->name); | ||
| 6253 | +#endif | ||
| 6254 | + txresult = NOT_OK; | ||
| 6255 | + goto end; | ||
| 6256 | + } | ||
| 6257 | + | ||
| 6258 | + txbuf = acx_l_get_txbuf(adev, tx); | ||
| 6259 | + if (unlikely(!txbuf)) { | ||
| 6260 | + /* Card was removed */ | ||
| 6261 | + txresult = NOT_OK; | ||
| 6262 | + acx_l_dealloc_tx(adev, tx); | ||
| 6263 | + goto end; | ||
| 6264 | + } | ||
| 6265 | + len = acx_ether_to_txbuf(adev, txbuf, skb); | ||
| 6266 | + if (unlikely(len < 0)) { | ||
| 6267 | + /* Error in packet conversion */ | ||
| 6268 | + txresult = NOT_OK; | ||
| 6269 | + acx_l_dealloc_tx(adev, tx); | ||
| 6270 | + goto end; | ||
| 6271 | + } | ||
| 6272 | + acx_l_tx_data(adev, tx, len); | ||
| 6273 | + ndev->trans_start = jiffies; | ||
| 6274 | + | ||
| 6275 | + txresult = OK; | ||
| 6276 | + adev->stats.tx_packets++; | ||
| 6277 | + adev->stats.tx_bytes += skb->len; | ||
| 6278 | + | ||
| 6279 | +end: | ||
| 6280 | + acx_unlock(adev, flags); | ||
| 6281 | + | ||
| 6282 | +end_no_unlock: | ||
| 6283 | + if ((txresult == OK) && skb) | ||
| 6284 | + dev_kfree_skb_any(skb); | ||
| 6285 | + | ||
| 6286 | + FN_EXIT1(txresult); | ||
| 6287 | + return txresult; | ||
| 6288 | +} | ||
| 6289 | + | ||
| 6290 | + | ||
| 6291 | +/*********************************************************************** | ||
| 6292 | +** acx_l_update_ratevector | ||
| 6293 | +** | ||
| 6294 | +** Updates adev->rate_supported[_len] according to rate_{basic,oper} | ||
| 6295 | +*/ | ||
| 6296 | +const u8 | ||
| 6297 | +acx_bitpos2ratebyte[] = { | ||
| 6298 | + DOT11RATEBYTE_1, | ||
| 6299 | + DOT11RATEBYTE_2, | ||
| 6300 | + DOT11RATEBYTE_5_5, | ||
| 6301 | + DOT11RATEBYTE_6_G, | ||
| 6302 | + DOT11RATEBYTE_9_G, | ||
| 6303 | + DOT11RATEBYTE_11, | ||
| 6304 | + DOT11RATEBYTE_12_G, | ||
| 6305 | + DOT11RATEBYTE_18_G, | ||
| 6306 | + DOT11RATEBYTE_22, | ||
| 6307 | + DOT11RATEBYTE_24_G, | ||
| 6308 | + DOT11RATEBYTE_36_G, | ||
| 6309 | + DOT11RATEBYTE_48_G, | ||
| 6310 | + DOT11RATEBYTE_54_G, | ||
| 6311 | +}; | ||
| 6312 | + | ||
| 6313 | +void | ||
| 6314 | +acx_l_update_ratevector(acx_device_t *adev) | ||
| 6315 | +{ | ||
| 6316 | + u16 bcfg = adev->rate_basic; | ||
| 6317 | + u16 ocfg = adev->rate_oper; | ||
| 6318 | + u8 *supp = adev->rate_supported; | ||
| 6319 | + const u8 *dot11 = acx_bitpos2ratebyte; | ||
| 6320 | + | ||
| 6321 | + FN_ENTER; | ||
| 6322 | + | ||
| 6323 | + while (ocfg) { | ||
| 6324 | + if (ocfg & 1) { | ||
| 6325 | + *supp = *dot11; | ||
| 6326 | + if (bcfg & 1) { | ||
| 6327 | + *supp |= 0x80; | ||
| 6328 | + } | ||
| 6329 | + supp++; | ||
| 6330 | + } | ||
| 6331 | + dot11++; | ||
| 6332 | + ocfg >>= 1; | ||
| 6333 | + bcfg >>= 1; | ||
| 6334 | + } | ||
| 6335 | + adev->rate_supported_len = supp - adev->rate_supported; | ||
| 6336 | + if (acx_debug & L_ASSOC) { | ||
| 6337 | + printk("new ratevector: "); | ||
| 6338 | + acx_dump_bytes(adev->rate_supported, adev->rate_supported_len); | ||
| 6339 | + } | ||
| 6340 | + FN_EXIT0; | ||
| 6341 | +} | ||
| 6342 | + | ||
| 6343 | + | ||
| 6344 | +/*********************************************************************** | ||
| 6345 | +** acx_l_sta_list_init | ||
| 6346 | +*/ | ||
| 6347 | +static void | ||
| 6348 | +acx_l_sta_list_init(acx_device_t *adev) | ||
| 6349 | +{ | ||
| 6350 | + FN_ENTER; | ||
| 6351 | + memset(adev->sta_hash_tab, 0, sizeof(adev->sta_hash_tab)); | ||
| 6352 | + memset(adev->sta_list, 0, sizeof(adev->sta_list)); | ||
| 6353 | + FN_EXIT0; | ||
| 6354 | +} | ||
| 6355 | + | ||
| 6356 | + | ||
| 6357 | +/*********************************************************************** | ||
| 6358 | +** acx_l_sta_list_get_from_hash | ||
| 6359 | +*/ | ||
| 6360 | +static inline client_t* | ||
| 6361 | +acx_l_sta_list_get_from_hash(acx_device_t *adev, const u8 *address) | ||
| 6362 | +{ | ||
| 6363 | + return adev->sta_hash_tab[address[5] % VEC_SIZE(adev->sta_hash_tab)]; | ||
| 6364 | +} | ||
| 6365 | + | ||
| 6366 | + | ||
| 6367 | +/*********************************************************************** | ||
| 6368 | +** acx_l_sta_list_get | ||
| 6369 | +*/ | ||
| 6370 | +client_t* | ||
| 6371 | +acx_l_sta_list_get(acx_device_t *adev, const u8 *address) | ||
| 6372 | +{ | ||
| 6373 | + client_t *client; | ||
| 6374 | + FN_ENTER; | ||
| 6375 | + client = acx_l_sta_list_get_from_hash(adev, address); | ||
| 6376 | + while (client) { | ||
| 6377 | + if (mac_is_equal(address, client->address)) { | ||
| 6378 | + client->mtime = jiffies; | ||
| 6379 | + break; | ||
| 6380 | + } | ||
| 6381 | + client = client->next; | ||
| 6382 | + } | ||
| 6383 | + FN_EXIT0; | ||
| 6384 | + return client; | ||
| 6385 | +} | ||
| 6386 | + | ||
| 6387 | + | ||
| 6388 | +/*********************************************************************** | ||
| 6389 | +** acx_l_sta_list_del | ||
| 6390 | +*/ | ||
| 6391 | +void | ||
| 6392 | +acx_l_sta_list_del(acx_device_t *adev, client_t *victim) | ||
| 6393 | +{ | ||
| 6394 | + client_t *client, *next; | ||
| 6395 | + | ||
| 6396 | + client = acx_l_sta_list_get_from_hash(adev, victim->address); | ||
| 6397 | + next = client; | ||
| 6398 | + /* tricky. next = client on first iteration only, | ||
| 6399 | + ** on all other iters next = client->next */ | ||
| 6400 | + while (next) { | ||
| 6401 | + if (next == victim) { | ||
| 6402 | + client->next = victim->next; | ||
| 6403 | + /* Overkill */ | ||
| 6404 | + memset(victim, 0, sizeof(*victim)); | ||
| 6405 | + break; | ||
| 6406 | + } | ||
| 6407 | + client = next; | ||
| 6408 | + next = client->next; | ||
| 6409 | + } | ||
| 6410 | +} | ||
| 6411 | + | ||
| 6412 | + | ||
| 6413 | +/*********************************************************************** | ||
| 6414 | +** acx_l_sta_list_alloc | ||
| 6415 | +** | ||
| 6416 | +** Never fails - will evict oldest client if needed | ||
| 6417 | +*/ | ||
| 6418 | +static client_t* | ||
| 6419 | +acx_l_sta_list_alloc(acx_device_t *adev) | ||
| 6420 | +{ | ||
| 6421 | + int i; | ||
| 6422 | + unsigned long age, oldest_age; | ||
| 6423 | + client_t *client, *oldest; | ||
| 6424 | + | ||
| 6425 | + FN_ENTER; | ||
| 6426 | + | ||
| 6427 | + oldest = &adev->sta_list[0]; | ||
| 6428 | + oldest_age = 0; | ||
| 6429 | + for (i = 0; i < VEC_SIZE(adev->sta_list); i++) { | ||
| 6430 | + client = &adev->sta_list[i]; | ||
| 6431 | + | ||
| 6432 | + if (!client->used) { | ||
| 6433 | + goto found; | ||
| 6434 | + } else { | ||
| 6435 | + age = jiffies - client->mtime; | ||
| 6436 | + if (oldest_age < age) { | ||
| 6437 | + oldest_age = age; | ||
| 6438 | + oldest = client; | ||
| 6439 | + } | ||
| 6440 | + } | ||
| 6441 | + } | ||
| 6442 | + acx_l_sta_list_del(adev, oldest); | ||
| 6443 | + client = oldest; | ||
| 6444 | +found: | ||
| 6445 | + memset(client, 0, sizeof(*client)); | ||
| 6446 | + FN_EXIT0; | ||
| 6447 | + return client; | ||
| 6448 | +} | ||
| 6449 | + | ||
| 6450 | + | ||
| 6451 | +/*********************************************************************** | ||
| 6452 | +** acx_l_sta_list_add | ||
| 6453 | +** | ||
| 6454 | +** Never fails - will evict oldest client if needed | ||
| 6455 | +*/ | ||
| 6456 | +/* In case we will reimplement it differently... */ | ||
| 6457 | +#define STA_LIST_ADD_CAN_FAIL 0 | ||
| 6458 | + | ||
| 6459 | +static client_t* | ||
| 6460 | +acx_l_sta_list_add(acx_device_t *adev, const u8 *address) | ||
| 6461 | +{ | ||
| 6462 | + client_t *client; | ||
| 6463 | + int index; | ||
| 6464 | + | ||
| 6465 | + FN_ENTER; | ||
| 6466 | + | ||
| 6467 | + client = acx_l_sta_list_alloc(adev); | ||
| 6468 | + | ||
| 6469 | + client->mtime = jiffies; | ||
| 6470 | + MAC_COPY(client->address, address); | ||
| 6471 | + client->used = CLIENT_EXIST_1; | ||
| 6472 | + client->auth_alg = WLAN_AUTH_ALG_SHAREDKEY; | ||
| 6473 | + client->auth_step = 1; | ||
| 6474 | + /* give some tentative peer rate values | ||
| 6475 | + ** (needed because peer may do auth without probing us first, | ||
| 6476 | + ** thus we'll have no idea of peer's ratevector yet). | ||
| 6477 | + ** Will be overwritten by scanning or assoc code */ | ||
| 6478 | + client->rate_cap = adev->rate_basic; | ||
| 6479 | + client->rate_cfg = adev->rate_basic; | ||
| 6480 | + client->rate_cur = 1 << lowest_bit(adev->rate_basic); | ||
| 6481 | + | ||
| 6482 | + index = address[5] % VEC_SIZE(adev->sta_hash_tab); | ||
| 6483 | + client->next = adev->sta_hash_tab[index]; | ||
| 6484 | + adev->sta_hash_tab[index] = client; | ||
| 6485 | + | ||
| 6486 | + acxlog_mac(L_ASSOC, "sta_list_add: sta=", address, "\n"); | ||
| 6487 | + | ||
| 6488 | + FN_EXIT0; | ||
| 6489 | + return client; | ||
| 6490 | +} | ||
| 6491 | + | ||
| 6492 | + | ||
| 6493 | +/*********************************************************************** | ||
| 6494 | +** acx_l_sta_list_get_or_add | ||
| 6495 | +** | ||
| 6496 | +** Never fails - will evict oldest client if needed | ||
| 6497 | +*/ | ||
| 6498 | +static client_t* | ||
| 6499 | +acx_l_sta_list_get_or_add(acx_device_t *adev, const u8 *address) | ||
| 6500 | +{ | ||
| 6501 | + client_t *client = acx_l_sta_list_get(adev, address); | ||
| 6502 | + if (!client) | ||
| 6503 | + client = acx_l_sta_list_add(adev, address); | ||
| 6504 | + return client; | ||
| 6505 | +} | ||
| 6506 | + | ||
| 6507 | + | ||
| 6508 | +/*********************************************************************** | ||
| 6509 | +** acx_set_status | ||
| 6510 | +** | ||
| 6511 | +** This function is called in many atomic regions, must not sleep | ||
| 6512 | +** | ||
| 6513 | +** This function does not need locking UNLESS you call it | ||
| 6514 | +** as acx_set_status(ACX_STATUS_4_ASSOCIATED), bacause this can | ||
| 6515 | +** wake queue. This can race with stop_queue elsewhere. | ||
| 6516 | +** See acx_stop_queue comment. */ | ||
| 6517 | +void | ||
| 6518 | +acx_set_status(acx_device_t *adev, u16 new_status) | ||
| 6519 | +{ | ||
| 6520 | +#define QUEUE_OPEN_AFTER_ASSOC 1 /* this really seems to be needed now */ | ||
| 6521 | + u16 old_status = adev->status; | ||
| 6522 | + | ||
| 6523 | + FN_ENTER; | ||
| 6524 | + | ||
| 6525 | + log(L_ASSOC, "%s(%d):%s\n", | ||
| 6526 | + __func__, new_status, acx_get_status_name(new_status)); | ||
| 6527 | + | ||
| 6528 | + /* wireless_send_event never sleeps */ | ||
| 6529 | + if (ACX_STATUS_4_ASSOCIATED == new_status) { | ||
| 6530 | + union iwreq_data wrqu; | ||
| 6531 | + | ||
| 6532 | + wrqu.data.length = 0; | ||
| 6533 | + wrqu.data.flags = 0; | ||
| 6534 | + wireless_send_event(adev->ndev, SIOCGIWSCAN, &wrqu, NULL); | ||
| 6535 | + | ||
| 6536 | + wrqu.data.length = 0; | ||
| 6537 | + wrqu.data.flags = 0; | ||
| 6538 | + MAC_COPY(wrqu.ap_addr.sa_data, adev->bssid); | ||
| 6539 | + wrqu.ap_addr.sa_family = ARPHRD_ETHER; | ||
| 6540 | + wireless_send_event(adev->ndev, SIOCGIWAP, &wrqu, NULL); | ||
| 6541 | + } else { | ||
| 6542 | + union iwreq_data wrqu; | ||
| 6543 | + | ||
| 6544 | + /* send event with empty BSSID to indicate we're not associated */ | ||
| 6545 | + MAC_ZERO(wrqu.ap_addr.sa_data); | ||
| 6546 | + wrqu.ap_addr.sa_family = ARPHRD_ETHER; | ||
| 6547 | + wireless_send_event(adev->ndev, SIOCGIWAP, &wrqu, NULL); | ||
| 6548 | + } | ||
| 6549 | + | ||
| 6550 | + adev->status = new_status; | ||
| 6551 | + | ||
| 6552 | + switch (new_status) { | ||
| 6553 | + case ACX_STATUS_1_SCANNING: | ||
| 6554 | + adev->scan_retries = 0; | ||
| 6555 | + /* 1.0 s initial scan time */ | ||
| 6556 | + acx_set_timer(adev, 1000000); | ||
| 6557 | + break; | ||
| 6558 | + case ACX_STATUS_2_WAIT_AUTH: | ||
| 6559 | + case ACX_STATUS_3_AUTHENTICATED: | ||
| 6560 | + adev->auth_or_assoc_retries = 0; | ||
| 6561 | + acx_set_timer(adev, 1500000); /* 1.5 s */ | ||
| 6562 | + break; | ||
| 6563 | + } | ||
| 6564 | + | ||
| 6565 | +#if QUEUE_OPEN_AFTER_ASSOC | ||
| 6566 | + if (new_status == ACX_STATUS_4_ASSOCIATED) { | ||
| 6567 | + if (old_status < ACX_STATUS_4_ASSOCIATED) { | ||
| 6568 | + /* ah, we're newly associated now, | ||
| 6569 | + * so let's indicate carrier */ | ||
| 6570 | + acx_carrier_on(adev->ndev, "after association"); | ||
| 6571 | + acx_wake_queue(adev->ndev, "after association"); | ||
| 6572 | + } | ||
| 6573 | + } else { | ||
| 6574 | + /* not associated any more, so let's kill carrier */ | ||
| 6575 | + if (old_status >= ACX_STATUS_4_ASSOCIATED) { | ||
| 6576 | + acx_carrier_off(adev->ndev, "after losing association"); | ||
| 6577 | + acx_stop_queue(adev->ndev, "after losing association"); | ||
| 6578 | + } | ||
| 6579 | + } | ||
| 6580 | +#endif | ||
| 6581 | + FN_EXIT0; | ||
| 6582 | +} | ||
| 6583 | + | ||
| 6584 | + | ||
| 6585 | +/*********************************************************************** | ||
| 6586 | +** acx_i_timer | ||
| 6587 | +** | ||
| 6588 | +** Fires up periodically. Used to kick scan/auth/assoc if something goes wrong | ||
| 6589 | +*/ | ||
| 6590 | +void | ||
| 6591 | +acx_i_timer(unsigned long address) | ||
| 6592 | +{ | ||
| 6593 | + unsigned long flags; | ||
| 6594 | + acx_device_t *adev = (acx_device_t*)address; | ||
| 6595 | + | ||
| 6596 | + FN_ENTER; | ||
| 6597 | + | ||
| 6598 | + acx_lock(adev, flags); | ||
| 6599 | + | ||
| 6600 | + log(L_DEBUG|L_ASSOC, "%s: adev->status=%d (%s)\n", | ||
| 6601 | + __func__, adev->status, acx_get_status_name(adev->status)); | ||
| 6602 | + | ||
| 6603 | + switch (adev->status) { | ||
| 6604 | + case ACX_STATUS_1_SCANNING: | ||
| 6605 | + /* was set to 0 by set_status() */ | ||
| 6606 | + if (++adev->scan_retries < 7) { | ||
| 6607 | + acx_set_timer(adev, 1000000); | ||
| 6608 | + /* used to interrogate for scan status. | ||
| 6609 | + ** We rely on SCAN_COMPLETE IRQ instead */ | ||
| 6610 | + log(L_ASSOC, "continuing scan (%d sec)\n", | ||
| 6611 | + adev->scan_retries); | ||
| 6612 | + } else { | ||
| 6613 | + log(L_ASSOC, "stopping scan\n"); | ||
| 6614 | + /* send stop_scan cmd when we leave the interrupt context, | ||
| 6615 | + * and make a decision what to do next (COMPLETE_SCAN) */ | ||
| 6616 | + acx_schedule_task(adev, | ||
| 6617 | + ACX_AFTER_IRQ_CMD_STOP_SCAN + ACX_AFTER_IRQ_COMPLETE_SCAN); | ||
| 6618 | + } | ||
| 6619 | + break; | ||
| 6620 | + case ACX_STATUS_2_WAIT_AUTH: | ||
| 6621 | + /* was set to 0 by set_status() */ | ||
| 6622 | + if (++adev->auth_or_assoc_retries < 10) { | ||
| 6623 | + log(L_ASSOC, "resend authen1 request (attempt %d)\n", | ||
| 6624 | + adev->auth_or_assoc_retries + 1); | ||
| 6625 | + acx_l_transmit_authen1(adev); | ||
| 6626 | + } else { | ||
| 6627 | + /* time exceeded: fall back to scanning mode */ | ||
| 6628 | + log(L_ASSOC, | ||
| 6629 | + "authen1 request reply timeout, giving up\n"); | ||
| 6630 | + /* we are a STA, need to find AP anyhow */ | ||
| 6631 | + acx_set_status(adev, ACX_STATUS_1_SCANNING); | ||
| 6632 | + acx_schedule_task(adev, ACX_AFTER_IRQ_RESTART_SCAN); | ||
| 6633 | + } | ||
| 6634 | + /* used to be 1500000, but some other driver uses 2.5s */ | ||
| 6635 | + acx_set_timer(adev, 2500000); | ||
| 6636 | + break; | ||
| 6637 | + case ACX_STATUS_3_AUTHENTICATED: | ||
| 6638 | + /* was set to 0 by set_status() */ | ||
| 6639 | + if (++adev->auth_or_assoc_retries < 10) { | ||
| 6640 | + log(L_ASSOC, "resend assoc request (attempt %d)\n", | ||
| 6641 | + adev->auth_or_assoc_retries + 1); | ||
| 6642 | + acx_l_transmit_assoc_req(adev); | ||
| 6643 | + } else { | ||
| 6644 | + /* time exceeded: give up */ | ||
| 6645 | + log(L_ASSOC, | ||
| 6646 | + "association request reply timeout, giving up\n"); | ||
| 6647 | + /* we are a STA, need to find AP anyhow */ | ||
| 6648 | + acx_set_status(adev, ACX_STATUS_1_SCANNING); | ||
| 6649 | + acx_schedule_task(adev, ACX_AFTER_IRQ_RESTART_SCAN); | ||
| 6650 | + } | ||
| 6651 | + acx_set_timer(adev, 2500000); /* see above */ | ||
| 6652 | + break; | ||
| 6653 | + case ACX_STATUS_4_ASSOCIATED: | ||
| 6654 | + default: | ||
| 6655 | + break; | ||
| 6656 | + } | ||
| 6657 | + | ||
| 6658 | + acx_unlock(adev, flags); | ||
| 6659 | + | ||
| 6660 | + FN_EXIT0; | ||
| 6661 | +} | ||
| 6662 | + | ||
| 6663 | + | ||
| 6664 | +/*********************************************************************** | ||
| 6665 | +** acx_set_timer | ||
| 6666 | +** | ||
| 6667 | +** Sets the 802.11 state management timer's timeout. | ||
| 6668 | +*/ | ||
| 6669 | +void | ||
| 6670 | +acx_set_timer(acx_device_t *adev, int timeout_us) | ||
| 6671 | +{ | ||
| 6672 | + FN_ENTER; | ||
| 6673 | + | ||
| 6674 | + log(L_DEBUG|L_IRQ, "%s(%u ms)\n", __func__, timeout_us/1000); | ||
| 6675 | + if (!(adev->dev_state_mask & ACX_STATE_IFACE_UP)) { | ||
| 6676 | + printk("attempt to set the timer " | ||
| 6677 | + "when the card interface is not up!\n"); | ||
| 6678 | + goto end; | ||
| 6679 | + } | ||
| 6680 | + | ||
| 6681 | + /* first check if the timer was already initialized, THEN modify it */ | ||
| 6682 | + if (adev->mgmt_timer.function) { | ||
| 6683 | + mod_timer(&adev->mgmt_timer, | ||
| 6684 | + jiffies + (timeout_us * HZ / 1000000)); | ||
| 6685 | + } | ||
| 6686 | +end: | ||
| 6687 | + FN_EXIT0; | ||
| 6688 | +} | ||
| 6689 | + | ||
| 6690 | + | ||
| 6691 | +/*********************************************************************** | ||
| 6692 | +** acx_l_transmit_assocresp | ||
| 6693 | +** | ||
| 6694 | +** We are an AP here | ||
| 6695 | +*/ | ||
| 6696 | +static const u8 | ||
| 6697 | +dot11ratebyte[] = { | ||
| 6698 | + DOT11RATEBYTE_1, | ||
| 6699 | + DOT11RATEBYTE_2, | ||
| 6700 | + DOT11RATEBYTE_5_5, | ||
| 6701 | + DOT11RATEBYTE_6_G, | ||
| 6702 | + DOT11RATEBYTE_9_G, | ||
| 6703 | + DOT11RATEBYTE_11, | ||
| 6704 | + DOT11RATEBYTE_12_G, | ||
| 6705 | + DOT11RATEBYTE_18_G, | ||
| 6706 | + DOT11RATEBYTE_22, | ||
| 6707 | + DOT11RATEBYTE_24_G, | ||
| 6708 | + DOT11RATEBYTE_36_G, | ||
| 6709 | + DOT11RATEBYTE_48_G, | ||
| 6710 | + DOT11RATEBYTE_54_G, | ||
| 6711 | +}; | ||
| 6712 | + | ||
| 6713 | +static inline int | ||
| 6714 | +find_pos(const u8 *p, int size, u8 v) | ||
| 6715 | +{ | ||
| 6716 | + int i; | ||
| 6717 | + for (i = 0; i < size; i++) | ||
| 6718 | + if (p[i] == v) | ||
| 6719 | + return i; | ||
| 6720 | + /* printk a message about strange byte? */ | ||
| 6721 | + return 0; | ||
| 6722 | +} | ||
| 6723 | + | ||
| 6724 | +static void | ||
| 6725 | +add_bits_to_ratemasks(u8* ratevec, int len, u16* brate, u16* orate) | ||
| 6726 | +{ | ||
| 6727 | + while (len--) { | ||
| 6728 | + int n = 1 << find_pos(dot11ratebyte, | ||
| 6729 | + sizeof(dot11ratebyte), *ratevec & 0x7f); | ||
| 6730 | + if (*ratevec & 0x80) | ||
| 6731 | + *brate |= n; | ||
| 6732 | + *orate |= n; | ||
| 6733 | + ratevec++; | ||
| 6734 | + } | ||
| 6735 | +} | ||
| 6736 | + | ||
| 6737 | +static int | ||
| 6738 | +acx_l_transmit_assocresp(acx_device_t *adev, const wlan_fr_assocreq_t *req) | ||
| 6739 | +{ | ||
| 6740 | + struct tx *tx; | ||
| 6741 | + struct wlan_hdr_mgmt *head; | ||
| 6742 | + struct assocresp_frame_body *body; | ||
| 6743 | + u8 *p; | ||
| 6744 | + const u8 *da; | ||
| 6745 | + /* const u8 *sa; */ | ||
| 6746 | + const u8 *bssid; | ||
| 6747 | + client_t *clt; | ||
| 6748 | + | ||
| 6749 | + FN_ENTER; | ||
| 6750 | + | ||
| 6751 | + /* sa = req->hdr->a1; */ | ||
| 6752 | + da = req->hdr->a2; | ||
| 6753 | + bssid = req->hdr->a3; | ||
| 6754 | + | ||
| 6755 | + clt = acx_l_sta_list_get(adev, da); | ||
| 6756 | + if (!clt) | ||
| 6757 | + goto ok; | ||
| 6758 | + | ||
| 6759 | + /* Assoc without auth is a big no-no */ | ||
| 6760 | + /* Let's be liberal: if already assoc'ed STA sends assoc req again, | ||
| 6761 | + ** we won't be rude */ | ||
| 6762 | + if (clt->used != CLIENT_AUTHENTICATED_2 | ||
| 6763 | + && clt->used != CLIENT_ASSOCIATED_3) { | ||
| 6764 | + acx_l_transmit_deauthen(adev, da, WLAN_MGMT_REASON_CLASS2_NONAUTH); | ||
| 6765 | + goto bad; | ||
| 6766 | + } | ||
| 6767 | + | ||
| 6768 | + clt->used = CLIENT_ASSOCIATED_3; | ||
| 6769 | + | ||
| 6770 | + if (clt->aid == 0) | ||
| 6771 | + clt->aid = ++adev->aid; | ||
| 6772 | + clt->cap_info = ieee2host16(*(req->cap_info)); | ||
| 6773 | + | ||
| 6774 | + /* We cheat here a bit. We don't really care which rates are flagged | ||
| 6775 | + ** as basic by the client, so we stuff them in single ratemask */ | ||
| 6776 | + clt->rate_cap = 0; | ||
| 6777 | + if (req->supp_rates) | ||
| 6778 | + add_bits_to_ratemasks(req->supp_rates->rates, | ||
| 6779 | + req->supp_rates->len, &clt->rate_cap, &clt->rate_cap); | ||
| 6780 | + if (req->ext_rates) | ||
| 6781 | + add_bits_to_ratemasks(req->ext_rates->rates, | ||
| 6782 | + req->ext_rates->len, &clt->rate_cap, &clt->rate_cap); | ||
| 6783 | + /* We can check that client supports all basic rates, | ||
| 6784 | + ** and deny assoc if not. But let's be liberal, right? ;) */ | ||
| 6785 | + clt->rate_cfg = clt->rate_cap & adev->rate_oper; | ||
| 6786 | + if (!clt->rate_cfg) clt->rate_cfg = 1 << lowest_bit(adev->rate_oper); | ||
| 6787 | + clt->rate_cur = 1 << lowest_bit(clt->rate_cfg); | ||
| 6788 | + if (IS_ACX100(adev)) | ||
| 6789 | + clt->rate_100 = acx_bitpos2rate100[lowest_bit(clt->rate_cfg)]; | ||
| 6790 | + clt->fallback_count = clt->stepup_count = 0; | ||
| 6791 | + clt->ignore_count = 16; | ||
| 6792 | + | ||
| 6793 | + tx = acx_l_alloc_tx(adev); | ||
| 6794 | + if (!tx) | ||
| 6795 | + goto bad; | ||
| 6796 | + head = acx_l_get_txbuf(adev, tx); | ||
| 6797 | + if (!head) { | ||
| 6798 | + acx_l_dealloc_tx(adev, tx); | ||
| 6799 | + goto bad; | ||
| 6800 | + } | ||
| 6801 | + body = (void*)(head + 1); | ||
| 6802 | + | ||
| 6803 | + head->fc = WF_FSTYPE_ASSOCRESPi; | ||
| 6804 | + head->dur = req->hdr->dur; | ||
| 6805 | + MAC_COPY(head->da, da); | ||
| 6806 | + MAC_COPY(head->sa, adev->dev_addr); | ||
| 6807 | + MAC_COPY(head->bssid, bssid); | ||
| 6808 | + head->seq = req->hdr->seq; | ||
| 6809 | + | ||
| 6810 | + body->cap_info = host2ieee16(adev->capabilities); | ||
| 6811 | + body->status = host2ieee16(0); | ||
| 6812 | + body->aid = host2ieee16(clt->aid); | ||
| 6813 | + p = wlan_fill_ie_rates((u8*)&body->rates, adev->rate_supported_len, | ||
| 6814 | + adev->rate_supported); | ||
| 6815 | + p = wlan_fill_ie_rates_ext(p, adev->rate_supported_len, | ||
| 6816 | + adev->rate_supported); | ||
| 6817 | + | ||
| 6818 | + acx_l_tx_data(adev, tx, p - (u8*)head); | ||
| 6819 | +ok: | ||
| 6820 | + FN_EXIT1(OK); | ||
| 6821 | + return OK; | ||
| 6822 | +bad: | ||
| 6823 | + FN_EXIT1(NOT_OK); | ||
| 6824 | + return NOT_OK; | ||
| 6825 | +} | ||
| 6826 | + | ||
| 6827 | + | ||
| 6828 | +/*********************************************************************** | ||
| 6829 | +* acx_l_transmit_reassocresp | ||
| 6830 | + | ||
| 6831 | +You may be wondering, just like me, what the hell ReAuth is. | ||
| 6832 | +In practice it was seen sent by STA when STA feels like losing connection. | ||
| 6833 | + | ||
| 6834 | +[802.11] | ||
| 6835 | + | ||
| 6836 | +5.4.2.3 Reassociation | ||
| 6837 | + | ||
| 6838 | +Association is sufficient for no-transition message delivery between | ||
| 6839 | +IEEE 802.11 stations. Additional functionality is needed to support | ||
| 6840 | +BSS-transition mobility. The additional required functionality | ||
| 6841 | +is provided by the reassociation service. Reassociation is a DSS. | ||
| 6842 | +The reassociation service is invoked to 'move' a current association | ||
| 6843 | +from one AP to another. This keeps the DS informed of the current | ||
| 6844 | +mapping between AP and STA as the station moves from BSS to BSS within | ||
| 6845 | +an ESS. Reassociation also enables changing association attributes | ||
| 6846 | +of an established association while the STA remains associated with | ||
| 6847 | +the same AP. Reassociation is always initiated by the mobile STA. | ||
| 6848 | + | ||
| 6849 | +5.4.3.1 Authentication | ||
| 6850 | +... | ||
| 6851 | +A STA may be authenticated with many other STAs at any given instant. | ||
| 6852 | + | ||
| 6853 | +5.4.3.1.1 Preauthentication | ||
| 6854 | + | ||
| 6855 | +Because the authentication process could be time-consuming (depending | ||
| 6856 | +on the authentication protocol in use), the authentication service can | ||
| 6857 | +be invoked independently of the association service. Preauthentication | ||
| 6858 | +is typically done by a STA while it is already associated with an AP | ||
| 6859 | +(with which it previously authenticated). IEEE 802.11 does not require | ||
| 6860 | +that STAs preauthenticate with APs. However, authentication is required | ||
| 6861 | +before an association can be established. If the authentication is left | ||
| 6862 | +until reassociation time, this may impact the speed with which a STA can | ||
| 6863 | +reassociate between APs, limiting BSS-transition mobility performance. | ||
| 6864 | +The use of preauthentication takes the authentication service overhead | ||
| 6865 | +out of the time-critical reassociation process. | ||
| 6866 | + | ||
| 6867 | +5.7.3 Reassociation | ||
| 6868 | + | ||
| 6869 | +For a STA to reassociate, the reassociation service causes the following | ||
| 6870 | +message to occur: | ||
| 6871 | + | ||
| 6872 | + Reassociation request | ||
| 6873 | + | ||
| 6874 | +* Message type: Management | ||
| 6875 | +* Message subtype: Reassociation request | ||
| 6876 | +* Information items: | ||
| 6877 | + - IEEE address of the STA | ||
| 6878 | + - IEEE address of the AP with which the STA will reassociate | ||
| 6879 | + - IEEE address of the AP with which the STA is currently associated | ||
| 6880 | + - ESSID | ||
| 6881 | +* Direction of message: From STA to 'new' AP | ||
| 6882 | + | ||
| 6883 | +The address of the current AP is included for efficiency. The inclusion | ||
| 6884 | +of the current AP address facilitates MAC reassociation to be independent | ||
| 6885 | +of the DS implementation. | ||
| 6886 | + | ||
| 6887 | + Reassociation response | ||
| 6888 | +* Message type: Management | ||
| 6889 | +* Message subtype: Reassociation response | ||
| 6890 | +* Information items: | ||
| 6891 | + - Result of the requested reassociation. (success/failure) | ||
| 6892 | + - If the reassociation is successful, the response shall include the AID. | ||
| 6893 | +* Direction of message: From AP to STA | ||
| 6894 | + | ||
| 6895 | +7.2.3.6 Reassociation Request frame format | ||
| 6896 | + | ||
| 6897 | +The frame body of a management frame of subtype Reassociation Request | ||
| 6898 | +contains the information shown in Table 9. | ||
| 6899 | + | ||
| 6900 | +Table 9 Reassociation Request frame body | ||
| 6901 | +Order Information | ||
| 6902 | +1 Capability information | ||
| 6903 | +2 Listen interval | ||
| 6904 | +3 Current AP address | ||
| 6905 | +4 SSID | ||
| 6906 | +5 Supported rates | ||
| 6907 | + | ||
| 6908 | +7.2.3.7 Reassociation Response frame format | ||
| 6909 | + | ||
| 6910 | +The frame body of a management frame of subtype Reassociation Response | ||
| 6911 | +contains the information shown in Table 10. | ||
| 6912 | + | ||
| 6913 | +Table 10 Reassociation Response frame body | ||
| 6914 | +Order Information | ||
| 6915 | +1 Capability information | ||
| 6916 | +2 Status code | ||
| 6917 | +3 Association ID (AID) | ||
| 6918 | +4 Supported rates | ||
| 6919 | + | ||
| 6920 | +*/ | ||
| 6921 | +static int | ||
| 6922 | +acx_l_transmit_reassocresp(acx_device_t *adev, const wlan_fr_reassocreq_t *req) | ||
| 6923 | +{ | ||
| 6924 | + struct tx *tx; | ||
| 6925 | + struct wlan_hdr_mgmt *head; | ||
| 6926 | + struct reassocresp_frame_body *body; | ||
| 6927 | + u8 *p; | ||
| 6928 | + const u8 *da; | ||
| 6929 | + /* const u8 *sa; */ | ||
| 6930 | + const u8 *bssid; | ||
| 6931 | + client_t *clt; | ||
| 6932 | + | ||
| 6933 | + FN_ENTER; | ||
| 6934 | + | ||
| 6935 | + /* sa = req->hdr->a1; */ | ||
| 6936 | + da = req->hdr->a2; | ||
| 6937 | + bssid = req->hdr->a3; | ||
| 6938 | + | ||
| 6939 | + /* Must be already authenticated, so it must be in the list */ | ||
| 6940 | + clt = acx_l_sta_list_get(adev, da); | ||
| 6941 | + if (!clt) | ||
| 6942 | + goto ok; | ||
| 6943 | + | ||
| 6944 | + /* Assoc without auth is a big no-no */ | ||
| 6945 | + /* Already assoc'ed STAs sending ReAssoc req are ok per 802.11 */ | ||
| 6946 | + if (clt->used != CLIENT_AUTHENTICATED_2 | ||
| 6947 | + && clt->used != CLIENT_ASSOCIATED_3) { | ||
| 6948 | + acx_l_transmit_deauthen(adev, da, WLAN_MGMT_REASON_CLASS2_NONAUTH); | ||
| 6949 | + goto bad; | ||
| 6950 | + } | ||
| 6951 | + | ||
| 6952 | + clt->used = CLIENT_ASSOCIATED_3; | ||
| 6953 | + if (clt->aid == 0) { | ||
| 6954 | + clt->aid = ++adev->aid; | ||
| 6955 | + } | ||
| 6956 | + if (req->cap_info) | ||
| 6957 | + clt->cap_info = ieee2host16(*(req->cap_info)); | ||
| 6958 | + | ||
| 6959 | + /* We cheat here a bit. We don't really care which rates are flagged | ||
| 6960 | + ** as basic by the client, so we stuff them in single ratemask */ | ||
| 6961 | + clt->rate_cap = 0; | ||
| 6962 | + if (req->supp_rates) | ||
| 6963 | + add_bits_to_ratemasks(req->supp_rates->rates, | ||
| 6964 | + req->supp_rates->len, &clt->rate_cap, &clt->rate_cap); | ||
| 6965 | + if (req->ext_rates) | ||
| 6966 | + add_bits_to_ratemasks(req->ext_rates->rates, | ||
| 6967 | + req->ext_rates->len, &clt->rate_cap, &clt->rate_cap); | ||
| 6968 | + /* We can check that client supports all basic rates, | ||
| 6969 | + ** and deny assoc if not. But let's be liberal, right? ;) */ | ||
| 6970 | + clt->rate_cfg = clt->rate_cap & adev->rate_oper; | ||
| 6971 | + if (!clt->rate_cfg) clt->rate_cfg = 1 << lowest_bit(adev->rate_oper); | ||
| 6972 | + clt->rate_cur = 1 << lowest_bit(clt->rate_cfg); | ||
| 6973 | + if (IS_ACX100(adev)) | ||
| 6974 | + clt->rate_100 = acx_bitpos2rate100[lowest_bit(clt->rate_cfg)]; | ||
| 6975 | + | ||
| 6976 | + clt->fallback_count = clt->stepup_count = 0; | ||
| 6977 | + clt->ignore_count = 16; | ||
| 6978 | + | ||
| 6979 | + tx = acx_l_alloc_tx(adev); | ||
| 6980 | + if (!tx) | ||
| 6981 | + goto ok; | ||
| 6982 | + head = acx_l_get_txbuf(adev, tx); | ||
| 6983 | + if (!head) { | ||
| 6984 | + acx_l_dealloc_tx(adev, tx); | ||
| 6985 | + goto ok; | ||
| 6986 | + } | ||
| 6987 | + body = (void*)(head + 1); | ||
| 6988 | + | ||
| 6989 | + head->fc = WF_FSTYPE_REASSOCRESPi; | ||
| 6990 | + head->dur = req->hdr->dur; | ||
| 6991 | + MAC_COPY(head->da, da); | ||
| 6992 | + MAC_COPY(head->sa, adev->dev_addr); | ||
| 6993 | + MAC_COPY(head->bssid, bssid); | ||
| 6994 | + head->seq = req->hdr->seq; | ||
| 6995 | + | ||
| 6996 | + /* IEs: 1. caps */ | ||
| 6997 | + body->cap_info = host2ieee16(adev->capabilities); | ||
| 6998 | + /* 2. status code */ | ||
| 6999 | + body->status = host2ieee16(0); | ||
| 7000 | + /* 3. AID */ | ||
| 7001 | + body->aid = host2ieee16(clt->aid); | ||
| 7002 | + /* 4. supp rates */ | ||
| 7003 | + p = wlan_fill_ie_rates((u8*)&body->rates, adev->rate_supported_len, | ||
| 7004 | + adev->rate_supported); | ||
| 7005 | + /* 5. ext supp rates */ | ||
| 7006 | + p = wlan_fill_ie_rates_ext(p, adev->rate_supported_len, | ||
| 7007 | + adev->rate_supported); | ||
| 7008 | + | ||
| 7009 | + acx_l_tx_data(adev, tx, p - (u8*)head); | ||
| 7010 | +ok: | ||
| 7011 | + FN_EXIT1(OK); | ||
| 7012 | + return OK; | ||
| 7013 | +bad: | ||
| 7014 | + FN_EXIT1(NOT_OK); | ||
| 7015 | + return NOT_OK; | ||
| 7016 | +} | ||
| 7017 | + | ||
| 7018 | + | ||
| 7019 | +/*********************************************************************** | ||
| 7020 | +** acx_l_process_disassoc_from_sta | ||
| 7021 | +*/ | ||
| 7022 | +static void | ||
| 7023 | +acx_l_process_disassoc_from_sta(acx_device_t *adev, const wlan_fr_disassoc_t *req) | ||
| 7024 | +{ | ||
| 7025 | + const u8 *ta; | ||
| 7026 | + client_t *clt; | ||
| 7027 | + | ||
| 7028 | + FN_ENTER; | ||
| 7029 | + | ||
| 7030 | + ta = req->hdr->a2; | ||
| 7031 | + clt = acx_l_sta_list_get(adev, ta); | ||
| 7032 | + if (!clt) | ||
| 7033 | + goto end; | ||
| 7034 | + | ||
| 7035 | + if (clt->used != CLIENT_ASSOCIATED_3 | ||
| 7036 | + && clt->used != CLIENT_AUTHENTICATED_2) { | ||
| 7037 | + /* it's disassociating, but it's | ||
| 7038 | + ** not even authenticated! Let it know that */ | ||
| 7039 | + acxlog_mac(L_ASSOC|L_XFER, "peer ", ta, "has sent disassoc " | ||
| 7040 | + "req but it is not even auth'ed! sending deauth\n"); | ||
| 7041 | + acx_l_transmit_deauthen(adev, ta, | ||
| 7042 | + WLAN_MGMT_REASON_CLASS2_NONAUTH); | ||
| 7043 | + clt->used = CLIENT_EXIST_1; | ||
| 7044 | + } else { | ||
| 7045 | + /* mark it as auth'ed only */ | ||
| 7046 | + clt->used = CLIENT_AUTHENTICATED_2; | ||
| 7047 | + } | ||
| 7048 | +end: | ||
| 7049 | + FN_EXIT0; | ||
| 7050 | +} | ||
| 7051 | + | ||
| 7052 | + | ||
| 7053 | +/*********************************************************************** | ||
| 7054 | +** acx_l_process_deauthen_from_sta | ||
| 7055 | +*/ | ||
| 7056 | +static void | ||
| 7057 | +acx_l_process_deauth_from_sta(acx_device_t *adev, const wlan_fr_deauthen_t *req) | ||
| 7058 | +{ | ||
| 7059 | + const wlan_hdr_t *hdr; | ||
| 7060 | + client_t *client; | ||
| 7061 | + | ||
| 7062 | + FN_ENTER; | ||
| 7063 | + | ||
| 7064 | + hdr = req->hdr; | ||
| 7065 | + | ||
| 7066 | + if (acx_debug & L_ASSOC) { | ||
| 7067 | + acx_print_mac("got deauth from sta:", hdr->a2, " "); | ||
| 7068 | + acx_print_mac("a1:", hdr->a1, " "); | ||
| 7069 | + acx_print_mac("a3:", hdr->a3, " "); | ||
| 7070 | + acx_print_mac("adev->addr:", adev->dev_addr, " "); | ||
| 7071 | + acx_print_mac("adev->bssid:", adev->bssid, "\n"); | ||
| 7072 | + } | ||
| 7073 | + | ||
| 7074 | + if (!mac_is_equal(adev->dev_addr, hdr->a1)) { | ||
| 7075 | + goto end; | ||
| 7076 | + } | ||
| 7077 | + | ||
| 7078 | + client = acx_l_sta_list_get(adev, hdr->a2); | ||
| 7079 | + if (!client) { | ||
| 7080 | + goto end; | ||
| 7081 | + } | ||
| 7082 | + client->used = CLIENT_EXIST_1; | ||
| 7083 | +end: | ||
| 7084 | + FN_EXIT0; | ||
| 7085 | +} | ||
| 7086 | + | ||
| 7087 | + | ||
| 7088 | +/*********************************************************************** | ||
| 7089 | +** acx_l_process_disassoc_from_ap | ||
| 7090 | +*/ | ||
| 7091 | +static void | ||
| 7092 | +acx_l_process_disassoc_from_ap(acx_device_t *adev, const wlan_fr_disassoc_t *req) | ||
| 7093 | +{ | ||
| 7094 | + FN_ENTER; | ||
| 7095 | + | ||
| 7096 | + if (!adev->ap_client) { | ||
| 7097 | + /* Hrm, we aren't assoc'ed yet anyhow... */ | ||
| 7098 | + goto end; | ||
| 7099 | + } | ||
| 7100 | + | ||
| 7101 | + printk("%s: got disassoc frame with reason %d (%s)\n", | ||
| 7102 | + adev->ndev->name, *req->reason, | ||
| 7103 | + acx_wlan_reason_str(*req->reason)); | ||
| 7104 | + | ||
| 7105 | + if (mac_is_equal(adev->dev_addr, req->hdr->a1)) { | ||
| 7106 | + acx_l_transmit_deauthen(adev, adev->bssid, | ||
| 7107 | + WLAN_MGMT_REASON_DEAUTH_LEAVING); | ||
| 7108 | + SET_BIT(adev->set_mask, GETSET_RESCAN); | ||
| 7109 | + acx_schedule_task(adev, ACX_AFTER_IRQ_UPDATE_CARD_CFG); | ||
| 7110 | + } | ||
| 7111 | +end: | ||
| 7112 | + FN_EXIT0; | ||
| 7113 | +} | ||
| 7114 | + | ||
| 7115 | + | ||
| 7116 | +/*********************************************************************** | ||
| 7117 | +** acx_l_process_deauth_from_ap | ||
| 7118 | +*/ | ||
| 7119 | +static void | ||
| 7120 | +acx_l_process_deauth_from_ap(acx_device_t *adev, const wlan_fr_deauthen_t *req) | ||
| 7121 | +{ | ||
| 7122 | + FN_ENTER; | ||
| 7123 | + | ||
| 7124 | + if (!adev->ap_client) { | ||
| 7125 | + /* Hrm, we aren't assoc'ed yet anyhow... */ | ||
| 7126 | + goto end; | ||
| 7127 | + } | ||
| 7128 | + | ||
| 7129 | + printk("%s: got deauth frame with reason %d (%s)\n", | ||
| 7130 | + adev->ndev->name, *req->reason, | ||
| 7131 | + acx_wlan_reason_str(*req->reason)); | ||
| 7132 | + | ||
| 7133 | + /* Chk: is ta verified to be from our AP? */ | ||
| 7134 | + if (mac_is_equal(adev->dev_addr, req->hdr->a1)) { | ||
| 7135 | + log(L_DEBUG, "AP sent us deauth packet\n"); | ||
| 7136 | + SET_BIT(adev->set_mask, GETSET_RESCAN); | ||
| 7137 | + acx_schedule_task(adev, ACX_AFTER_IRQ_UPDATE_CARD_CFG); | ||
| 7138 | + } | ||
| 7139 | +end: | ||
| 7140 | + FN_EXIT0; | ||
| 7141 | +} | ||
| 7142 | + | ||
| 7143 | + | ||
| 7144 | +/*********************************************************************** | ||
| 7145 | +** acx_l_rx | ||
| 7146 | +** | ||
| 7147 | +** The end of the Rx path. Pulls data from a rxhostdesc into a socket | ||
| 7148 | +** buffer and feeds it to the network stack via netif_rx(). | ||
| 7149 | +*/ | ||
| 7150 | +static void | ||
| 7151 | +acx_l_rx(acx_device_t *adev, rxbuffer_t *rxbuf) | ||
| 7152 | +{ | ||
| 7153 | + FN_ENTER; | ||
| 7154 | + if (likely(adev->dev_state_mask & ACX_STATE_IFACE_UP)) { | ||
| 7155 | + struct sk_buff *skb; | ||
| 7156 | + skb = acx_rxbuf_to_ether(adev, rxbuf); | ||
| 7157 | + if (likely(skb)) { | ||
| 7158 | + netif_rx(skb); | ||
| 7159 | + adev->ndev->last_rx = jiffies; | ||
| 7160 | + adev->stats.rx_packets++; | ||
| 7161 | + adev->stats.rx_bytes += skb->len; | ||
| 7162 | + } | ||
| 7163 | + } | ||
| 7164 | + FN_EXIT0; | ||
| 7165 | +} | ||
| 7166 | + | ||
| 7167 | + | ||
| 7168 | +/*********************************************************************** | ||
| 7169 | +** acx_l_process_data_frame_master | ||
| 7170 | +*/ | ||
| 7171 | +static int | ||
| 7172 | +acx_l_process_data_frame_master(acx_device_t *adev, rxbuffer_t *rxbuf) | ||
| 7173 | +{ | ||
| 7174 | + struct wlan_hdr *hdr; | ||
| 7175 | + struct tx *tx; | ||
| 7176 | + void *txbuf; | ||
| 7177 | + int len; | ||
| 7178 | + int result = NOT_OK; | ||
| 7179 | + | ||
| 7180 | + FN_ENTER; | ||
| 7181 | + | ||
| 7182 | + hdr = acx_get_wlan_hdr(adev, rxbuf); | ||
| 7183 | + | ||
| 7184 | + switch (WF_FC_FROMTODSi & hdr->fc) { | ||
| 7185 | + case 0: | ||
| 7186 | + case WF_FC_FROMDSi: | ||
| 7187 | + log(L_DEBUG, "ap->sta or adhoc->adhoc data frame ignored\n"); | ||
| 7188 | + goto done; | ||
| 7189 | + case WF_FC_TODSi: | ||
| 7190 | + break; | ||
| 7191 | + default: /* WF_FC_FROMTODSi */ | ||
| 7192 | + log(L_DEBUG, "wds data frame ignored (TODO)\n"); | ||
| 7193 | + goto done; | ||
| 7194 | + } | ||
| 7195 | + | ||
| 7196 | + /* check if it is our BSSID, if not, leave */ | ||
| 7197 | + if (!mac_is_equal(adev->bssid, hdr->a1)) { | ||
| 7198 | + goto done; | ||
| 7199 | + } | ||
| 7200 | + | ||
| 7201 | + if (mac_is_equal(adev->dev_addr, hdr->a3)) { | ||
| 7202 | + /* this one is for us */ | ||
| 7203 | + acx_l_rx(adev, rxbuf); | ||
| 7204 | + } else { | ||
| 7205 | + if (mac_is_bcast(hdr->a3)) { | ||
| 7206 | + /* this one is bcast, rx it too */ | ||
| 7207 | + acx_l_rx(adev, rxbuf); | ||
| 7208 | + } | ||
| 7209 | + tx = acx_l_alloc_tx(adev); | ||
| 7210 | + if (!tx) { | ||
| 7211 | + goto fail; | ||
| 7212 | + } | ||
| 7213 | + /* repackage, tx, and hope it someday reaches its destination */ | ||
| 7214 | + /* order is important, we do it in-place */ | ||
| 7215 | + MAC_COPY(hdr->a1, hdr->a3); | ||
| 7216 | + MAC_COPY(hdr->a3, hdr->a2); | ||
| 7217 | + MAC_COPY(hdr->a2, adev->bssid); | ||
| 7218 | + /* To_DS = 0, From_DS = 1 */ | ||
| 7219 | + hdr->fc = WF_FC_FROMDSi + WF_FTYPE_DATAi; | ||
| 7220 | + | ||
| 7221 | + txbuf = acx_l_get_txbuf(adev, tx); | ||
| 7222 | + if (txbuf) { | ||
| 7223 | + len = RXBUF_BYTES_RCVD(adev, rxbuf); | ||
| 7224 | + memcpy(txbuf, hdr, len); | ||
| 7225 | + acx_l_tx_data(adev, tx, len); | ||
| 7226 | + } else { | ||
| 7227 | + acx_l_dealloc_tx(adev, tx); | ||
| 7228 | + } | ||
| 7229 | + } | ||
| 7230 | +done: | ||
| 7231 | + result = OK; | ||
| 7232 | +fail: | ||
| 7233 | + FN_EXIT1(result); | ||
| 7234 | + return result; | ||
| 7235 | +} | ||
| 7236 | + | ||
| 7237 | + | ||
| 7238 | +/*********************************************************************** | ||
| 7239 | +** acx_l_process_data_frame_client | ||
| 7240 | +*/ | ||
| 7241 | +static int | ||
| 7242 | +acx_l_process_data_frame_client(acx_device_t *adev, rxbuffer_t *rxbuf) | ||
| 7243 | +{ | ||
| 7244 | + const u8 *da, *bssid; | ||
| 7245 | + const wlan_hdr_t *hdr; | ||
| 7246 | + struct net_device *ndev = adev->ndev; | ||
| 7247 | + int result = NOT_OK; | ||
| 7248 | + | ||
| 7249 | + FN_ENTER; | ||
| 7250 | + | ||
| 7251 | + if (ACX_STATUS_4_ASSOCIATED != adev->status) | ||
| 7252 | + goto drop; | ||
| 7253 | + | ||
| 7254 | + hdr = acx_get_wlan_hdr(adev, rxbuf); | ||
| 7255 | + | ||
| 7256 | + switch (WF_FC_FROMTODSi & hdr->fc) { | ||
| 7257 | + case 0: | ||
| 7258 | + if (adev->mode != ACX_MODE_0_ADHOC) { | ||
| 7259 | + log(L_DEBUG, "adhoc->adhoc data frame ignored\n"); | ||
| 7260 | + goto drop; | ||
| 7261 | + } | ||
| 7262 | + bssid = hdr->a3; | ||
| 7263 | + break; | ||
| 7264 | + case WF_FC_FROMDSi: | ||
| 7265 | + if (adev->mode != ACX_MODE_2_STA) { | ||
| 7266 | + log(L_DEBUG, "ap->sta data frame ignored\n"); | ||
| 7267 | + goto drop; | ||
| 7268 | + } | ||
| 7269 | + bssid = hdr->a2; | ||
| 7270 | + break; | ||
| 7271 | + case WF_FC_TODSi: | ||
| 7272 | + log(L_DEBUG, "sta->ap data frame ignored\n"); | ||
| 7273 | + goto drop; | ||
| 7274 | + default: /* WF_FC_FROMTODSi: wds->wds */ | ||
| 7275 | + log(L_DEBUG, "wds data frame ignored (todo)\n"); | ||
| 7276 | + goto drop; | ||
| 7277 | + } | ||
| 7278 | + | ||
| 7279 | + da = hdr->a1; | ||
| 7280 | + | ||
| 7281 | + if (unlikely(acx_debug & L_DEBUG)) { | ||
| 7282 | + acx_print_mac("rx: da=", da, ""); | ||
| 7283 | + acx_print_mac(" bssid=", bssid, ""); | ||
| 7284 | + acx_print_mac(" adev->bssid=", adev->bssid, ""); | ||
| 7285 | + acx_print_mac(" adev->addr=", adev->dev_addr, "\n"); | ||
| 7286 | + } | ||
| 7287 | + | ||
| 7288 | + /* promiscuous mode --> receive all packets */ | ||
| 7289 | + if (unlikely(ndev->flags & IFF_PROMISC)) | ||
| 7290 | + goto process; | ||
| 7291 | + | ||
| 7292 | + /* FIRST, check if it is our BSSID */ | ||
| 7293 | + if (!mac_is_equal(adev->bssid, bssid)) { | ||
| 7294 | + /* is not our BSSID, so bail out */ | ||
| 7295 | + goto drop; | ||
| 7296 | + } | ||
| 7297 | + | ||
| 7298 | + /* then, check if it is our address */ | ||
| 7299 | + if (mac_is_equal(adev->dev_addr, da)) { | ||
| 7300 | + goto process; | ||
| 7301 | + } | ||
| 7302 | + | ||
| 7303 | + /* then, check if it is broadcast */ | ||
| 7304 | + if (mac_is_bcast(da)) { | ||
| 7305 | + goto process; | ||
| 7306 | + } | ||
| 7307 | + | ||
| 7308 | + if (mac_is_mcast(da)) { | ||
| 7309 | + /* unconditionally receive all multicasts */ | ||
| 7310 | + if (ndev->flags & IFF_ALLMULTI) | ||
| 7311 | + goto process; | ||
| 7312 | + | ||
| 7313 | + /* FIXME: need to check against the list of | ||
| 7314 | + * multicast addresses that are configured | ||
| 7315 | + * for the interface (ifconfig) */ | ||
| 7316 | + log(L_XFER, "FIXME: multicast packet, need to check " | ||
| 7317 | + "against a list of multicast addresses " | ||
| 7318 | + "(to be created!); accepting packet for now\n"); | ||
| 7319 | + /* for now, just accept it here */ | ||
| 7320 | + goto process; | ||
| 7321 | + } | ||
| 7322 | + | ||
| 7323 | + log(L_DEBUG, "rx: foreign packet, dropping\n"); | ||
| 7324 | + goto drop; | ||
| 7325 | +process: | ||
| 7326 | + /* receive packet */ | ||
| 7327 | + acx_l_rx(adev, rxbuf); | ||
| 7328 | + | ||
| 7329 | + result = OK; | ||
| 7330 | +drop: | ||
| 7331 | + FN_EXIT1(result); | ||
| 7332 | + return result; | ||
| 7333 | +} | ||
| 7334 | + | ||
| 7335 | + | ||
| 7336 | +/*********************************************************************** | ||
| 7337 | +** acx_l_process_mgmt_frame | ||
| 7338 | +** | ||
| 7339 | +** Theory of operation: mgmt packet gets parsed (to make it easy | ||
| 7340 | +** to access variable-sized IEs), results stored in 'parsed'. | ||
| 7341 | +** Then we react to the packet. | ||
| 7342 | +*/ | ||
| 7343 | +typedef union parsed_mgmt_req { | ||
| 7344 | + wlan_fr_mgmt_t mgmt; | ||
| 7345 | + wlan_fr_assocreq_t assocreq; | ||
| 7346 | + wlan_fr_reassocreq_t reassocreq; | ||
| 7347 | + wlan_fr_assocresp_t assocresp; | ||
| 7348 | + wlan_fr_reassocresp_t reassocresp; | ||
| 7349 | + wlan_fr_beacon_t beacon; | ||
| 7350 | + wlan_fr_disassoc_t disassoc; | ||
| 7351 | + wlan_fr_authen_t authen; | ||
| 7352 | + wlan_fr_deauthen_t deauthen; | ||
| 7353 | + wlan_fr_proberesp_t proberesp; | ||
| 7354 | +} parsed_mgmt_req_t; | ||
| 7355 | + | ||
| 7356 | +void BUG_excessive_stack_usage(void); | ||
| 7357 | + | ||
| 7358 | +static int | ||
| 7359 | +acx_l_process_mgmt_frame(acx_device_t *adev, rxbuffer_t *rxbuf) | ||
| 7360 | +{ | ||
| 7361 | + parsed_mgmt_req_t parsed; /* takes ~100 bytes of stack */ | ||
| 7362 | + wlan_hdr_t *hdr; | ||
| 7363 | + int adhoc, sta_scan, sta, ap; | ||
| 7364 | + int len; | ||
| 7365 | + | ||
| 7366 | + if (sizeof(parsed) > 256) | ||
| 7367 | + BUG_excessive_stack_usage(); | ||
| 7368 | + | ||
| 7369 | + FN_ENTER; | ||
| 7370 | + | ||
| 7371 | + hdr = acx_get_wlan_hdr(adev, rxbuf); | ||
| 7372 | + | ||
| 7373 | + /* Management frames never have these set */ | ||
| 7374 | + if (WF_FC_FROMTODSi & hdr->fc) { | ||
| 7375 | + FN_EXIT1(NOT_OK); | ||
| 7376 | + return NOT_OK; | ||
| 7377 | + } | ||
| 7378 | + | ||
| 7379 | + len = RXBUF_BYTES_RCVD(adev, rxbuf); | ||
| 7380 | + if (WF_FC_ISWEPi & hdr->fc) | ||
| 7381 | + len -= 0x10; | ||
| 7382 | + | ||
| 7383 | + adhoc = (adev->mode == ACX_MODE_0_ADHOC); | ||
| 7384 | + sta_scan = ((adev->mode == ACX_MODE_2_STA) | ||
| 7385 | + && (adev->status != ACX_STATUS_4_ASSOCIATED)); | ||
| 7386 | + sta = ((adev->mode == ACX_MODE_2_STA) | ||
| 7387 | + && (adev->status == ACX_STATUS_4_ASSOCIATED)); | ||
| 7388 | + ap = (adev->mode == ACX_MODE_3_AP); | ||
| 7389 | + | ||
| 7390 | + switch (WF_FC_FSTYPEi & hdr->fc) { | ||
| 7391 | + /* beacons first, for speed */ | ||
| 7392 | + case WF_FSTYPE_BEACONi: | ||
| 7393 | + memset(&parsed.beacon, 0, sizeof(parsed.beacon)); | ||
| 7394 | + parsed.beacon.hdr = hdr; | ||
| 7395 | + parsed.beacon.len = len; | ||
| 7396 | + if (acx_debug & L_DATA) { | ||
| 7397 | + printk("beacon len:%d fc:%04X dur:%04X seq:%04X", | ||
| 7398 | + len, hdr->fc, hdr->dur, hdr->seq); | ||
| 7399 | + acx_print_mac(" a1:", hdr->a1, ""); | ||
| 7400 | + acx_print_mac(" a2:", hdr->a2, ""); | ||
| 7401 | + acx_print_mac(" a3:", hdr->a3, "\n"); | ||
| 7402 | + } | ||
| 7403 | + wlan_mgmt_decode_beacon(&parsed.beacon); | ||
| 7404 | + /* beacon and probe response are very similar, so... */ | ||
| 7405 | + acx_l_process_probe_response(adev, &parsed.beacon, rxbuf); | ||
| 7406 | + break; | ||
| 7407 | + case WF_FSTYPE_ASSOCREQi: | ||
| 7408 | + if (!ap) | ||
| 7409 | + break; | ||
| 7410 | + memset(&parsed.assocreq, 0, sizeof(parsed.assocreq)); | ||
| 7411 | + parsed.assocreq.hdr = hdr; | ||
| 7412 | + parsed.assocreq.len = len; | ||
| 7413 | + wlan_mgmt_decode_assocreq(&parsed.assocreq); | ||
| 7414 | + if (mac_is_equal(hdr->a1, adev->bssid) | ||
| 7415 | + && mac_is_equal(hdr->a3, adev->bssid)) { | ||
| 7416 | + acx_l_transmit_assocresp(adev, &parsed.assocreq); | ||
| 7417 | + } | ||
| 7418 | + break; | ||
| 7419 | + case WF_FSTYPE_REASSOCREQi: | ||
| 7420 | + if (!ap) | ||
| 7421 | + break; | ||
| 7422 | + memset(&parsed.assocreq, 0, sizeof(parsed.assocreq)); | ||
| 7423 | + parsed.assocreq.hdr = hdr; | ||
| 7424 | + parsed.assocreq.len = len; | ||
| 7425 | + wlan_mgmt_decode_assocreq(&parsed.assocreq); | ||
| 7426 | + /* reassocreq and assocreq are equivalent */ | ||
| 7427 | + acx_l_transmit_reassocresp(adev, &parsed.reassocreq); | ||
| 7428 | + break; | ||
| 7429 | + case WF_FSTYPE_ASSOCRESPi: | ||
| 7430 | + if (!sta_scan) | ||
| 7431 | + break; | ||
| 7432 | + memset(&parsed.assocresp, 0, sizeof(parsed.assocresp)); | ||
| 7433 | + parsed.assocresp.hdr = hdr; | ||
| 7434 | + parsed.assocresp.len = len; | ||
| 7435 | + wlan_mgmt_decode_assocresp(&parsed.assocresp); | ||
| 7436 | + acx_l_process_assocresp(adev, &parsed.assocresp); | ||
| 7437 | + break; | ||
| 7438 | + case WF_FSTYPE_REASSOCRESPi: | ||
| 7439 | + if (!sta_scan) | ||
| 7440 | + break; | ||
| 7441 | + memset(&parsed.assocresp, 0, sizeof(parsed.assocresp)); | ||
| 7442 | + parsed.assocresp.hdr = hdr; | ||
| 7443 | + parsed.assocresp.len = len; | ||
| 7444 | + wlan_mgmt_decode_assocresp(&parsed.assocresp); | ||
| 7445 | + acx_l_process_reassocresp(adev, &parsed.reassocresp); | ||
| 7446 | + break; | ||
| 7447 | + case WF_FSTYPE_PROBEREQi: | ||
| 7448 | + if (ap || adhoc) { | ||
| 7449 | + /* FIXME: since we're supposed to be an AP, | ||
| 7450 | + ** we need to return a Probe Response packet. | ||
| 7451 | + ** Currently firmware is doing it for us, | ||
| 7452 | + ** but firmware is buggy! See comment elsewhere --vda */ | ||
| 7453 | + } | ||
| 7454 | + break; | ||
| 7455 | + case WF_FSTYPE_PROBERESPi: | ||
| 7456 | + memset(&parsed.proberesp, 0, sizeof(parsed.proberesp)); | ||
| 7457 | + parsed.proberesp.hdr = hdr; | ||
| 7458 | + parsed.proberesp.len = len; | ||
| 7459 | + wlan_mgmt_decode_proberesp(&parsed.proberesp); | ||
| 7460 | + acx_l_process_probe_response(adev, &parsed.proberesp, rxbuf); | ||
| 7461 | + break; | ||
| 7462 | + case 6: | ||
| 7463 | + case 7: | ||
| 7464 | + /* exit */ | ||
| 7465 | + break; | ||
| 7466 | + case WF_FSTYPE_ATIMi: | ||
| 7467 | + /* exit */ | ||
| 7468 | + break; | ||
| 7469 | + case WF_FSTYPE_DISASSOCi: | ||
| 7470 | + if (!sta && !ap) | ||
| 7471 | + break; | ||
| 7472 | + memset(&parsed.disassoc, 0, sizeof(parsed.disassoc)); | ||
| 7473 | + parsed.disassoc.hdr = hdr; | ||
| 7474 | + parsed.disassoc.len = len; | ||
| 7475 | + wlan_mgmt_decode_disassoc(&parsed.disassoc); | ||
| 7476 | + if (sta) | ||
| 7477 | + acx_l_process_disassoc_from_ap(adev, &parsed.disassoc); | ||
| 7478 | + else | ||
| 7479 | + acx_l_process_disassoc_from_sta(adev, &parsed.disassoc); | ||
| 7480 | + break; | ||
| 7481 | + case WF_FSTYPE_AUTHENi: | ||
| 7482 | + if (!sta_scan && !ap) | ||
| 7483 | + break; | ||
| 7484 | + memset(&parsed.authen, 0, sizeof(parsed.authen)); | ||
| 7485 | + parsed.authen.hdr = hdr; | ||
| 7486 | + parsed.authen.len = len; | ||
| 7487 | + wlan_mgmt_decode_authen(&parsed.authen); | ||
| 7488 | + acx_l_process_authen(adev, &parsed.authen); | ||
| 7489 | + break; | ||
| 7490 | + case WF_FSTYPE_DEAUTHENi: | ||
| 7491 | + if (!sta && !ap) | ||
| 7492 | + break; | ||
| 7493 | + memset(&parsed.deauthen, 0, sizeof(parsed.deauthen)); | ||
| 7494 | + parsed.deauthen.hdr = hdr; | ||
| 7495 | + parsed.deauthen.len = len; | ||
| 7496 | + wlan_mgmt_decode_deauthen(&parsed.deauthen); | ||
| 7497 | + if (sta) | ||
| 7498 | + acx_l_process_deauth_from_ap(adev, &parsed.deauthen); | ||
| 7499 | + else | ||
| 7500 | + acx_l_process_deauth_from_sta(adev, &parsed.deauthen); | ||
| 7501 | + break; | ||
| 7502 | + } | ||
| 7503 | + | ||
| 7504 | + FN_EXIT1(OK); | ||
| 7505 | + return OK; | ||
| 7506 | +} | ||
| 7507 | + | ||
| 7508 | + | ||
| 7509 | +#ifdef UNUSED | ||
| 7510 | +/*********************************************************************** | ||
| 7511 | +** acx_process_class_frame | ||
| 7512 | +** | ||
| 7513 | +** Called from IRQ context only | ||
| 7514 | +*/ | ||
| 7515 | +static int | ||
| 7516 | +acx_process_class_frame(acx_device_t *adev, rxbuffer_t *rxbuf, int vala) | ||
| 7517 | +{ | ||
| 7518 | + return OK; | ||
| 7519 | +} | ||
| 7520 | +#endif | ||
| 7521 | + | ||
| 7522 | + | ||
| 7523 | +/*********************************************************************** | ||
| 7524 | +** acx_l_process_NULL_frame | ||
| 7525 | +*/ | ||
| 7526 | +#ifdef BOGUS_ITS_NOT_A_NULL_FRAME_HANDLER_AT_ALL | ||
| 7527 | +static int | ||
| 7528 | +acx_l_process_NULL_frame(acx_device_t *adev, rxbuffer_t *rxbuf, int vala) | ||
| 7529 | +{ | ||
| 7530 | + const signed char *esi; | ||
| 7531 | + const u8 *ebx; | ||
| 7532 | + const wlan_hdr_t *hdr; | ||
| 7533 | + const client_t *client; | ||
| 7534 | + int result = NOT_OK; | ||
| 7535 | + | ||
| 7536 | + hdr = acx_get_wlan_hdr(adev, rxbuf); | ||
| 7537 | + | ||
| 7538 | + switch (WF_FC_FROMTODSi & hdr->fc) { | ||
| 7539 | + case 0: | ||
| 7540 | + esi = hdr->a1; | ||
| 7541 | + ebx = hdr->a2; | ||
| 7542 | + break; | ||
| 7543 | + case WF_FC_FROMDSi: | ||
| 7544 | + esi = hdr->a1; | ||
| 7545 | + ebx = hdr->a3; | ||
| 7546 | + break; | ||
| 7547 | + case WF_FC_TODSi: | ||
| 7548 | + esi = hdr->a1; | ||
| 7549 | + ebx = hdr->a2; | ||
| 7550 | + break; | ||
| 7551 | + default: /* WF_FC_FROMTODSi */ | ||
| 7552 | + esi = hdr->a1; /* added by me! --vda */ | ||
| 7553 | + ebx = hdr->a2; | ||
| 7554 | + } | ||
| 7555 | + | ||
| 7556 | + if (esi[0x0] < 0) { | ||
| 7557 | + result = OK; | ||
| 7558 | + goto done; | ||
| 7559 | + } | ||
| 7560 | + | ||
| 7561 | + client = acx_l_sta_list_get(adev, ebx); | ||
| 7562 | + if (client) | ||
| 7563 | + result = NOT_OK; | ||
| 7564 | + else { | ||
| 7565 | +#ifdef IS_IT_BROKEN | ||
| 7566 | + log(L_DEBUG|L_XFER, "<transmit_deauth 7>\n"); | ||
| 7567 | + acx_l_transmit_deauthen(adev, ebx, | ||
| 7568 | + WLAN_MGMT_REASON_CLASS2_NONAUTH); | ||
| 7569 | +#else | ||
| 7570 | + log(L_DEBUG, "received NULL frame from unknown client! " | ||
| 7571 | + "We really shouldn't send deauthen here, right?\n"); | ||
| 7572 | +#endif | ||
| 7573 | + result = OK; | ||
| 7574 | + } | ||
| 7575 | +done: | ||
| 7576 | + return result; | ||
| 7577 | +} | ||
| 7578 | +#endif | ||
| 7579 | + | ||
| 7580 | + | ||
| 7581 | +/*********************************************************************** | ||
| 7582 | +** acx_l_process_probe_response | ||
| 7583 | +*/ | ||
| 7584 | +static int | ||
| 7585 | +acx_l_process_probe_response(acx_device_t *adev, wlan_fr_proberesp_t *req, | ||
| 7586 | + const rxbuffer_t *rxbuf) | ||
| 7587 | +{ | ||
| 7588 | + struct client *bss; | ||
| 7589 | + wlan_hdr_t *hdr; | ||
| 7590 | + | ||
| 7591 | + FN_ENTER; | ||
| 7592 | + | ||
| 7593 | + hdr = req->hdr; | ||
| 7594 | + | ||
| 7595 | + if (mac_is_equal(hdr->a3, adev->dev_addr)) { | ||
| 7596 | + log(L_ASSOC, "huh, scan found our own MAC!?\n"); | ||
| 7597 | + goto ok; /* just skip this one silently */ | ||
| 7598 | + } | ||
| 7599 | + | ||
| 7600 | + bss = acx_l_sta_list_get_or_add(adev, hdr->a2); | ||
| 7601 | + | ||
| 7602 | + /* NB: be careful modifying bss data! It may be one | ||
| 7603 | + ** of the already known clients (like our AP if we are a STA) | ||
| 7604 | + ** Thus do not blindly modify e.g. current ratemask! */ | ||
| 7605 | + | ||
| 7606 | + if (STA_LIST_ADD_CAN_FAIL && !bss) { | ||
| 7607 | + /* uh oh, we found more sites/stations than we can handle with | ||
| 7608 | + * our current setup: pull the emergency brake and stop scanning! */ | ||
| 7609 | + acx_schedule_task(adev, ACX_AFTER_IRQ_CMD_STOP_SCAN); | ||
| 7610 | + /* TODO: a nice comment what below call achieves --vda */ | ||
| 7611 | + acx_set_status(adev, ACX_STATUS_2_WAIT_AUTH); | ||
| 7612 | + goto ok; | ||
| 7613 | + } | ||
| 7614 | + /* NB: get_or_add already filled bss->address = hdr->a2 */ | ||
| 7615 | + MAC_COPY(bss->bssid, hdr->a3); | ||
| 7616 | + | ||
| 7617 | + /* copy the ESSID element */ | ||
| 7618 | + if (req->ssid && req->ssid->len <= IW_ESSID_MAX_SIZE) { | ||
| 7619 | + bss->essid_len = req->ssid->len; | ||
| 7620 | + memcpy(bss->essid, req->ssid->ssid, req->ssid->len); | ||
| 7621 | + bss->essid[req->ssid->len] = '\0'; | ||
| 7622 | + } else { | ||
| 7623 | + /* Either no ESSID IE or oversized one */ | ||
| 7624 | + printk("%s: received packet has bogus ESSID\n", | ||
| 7625 | + adev->ndev->name); | ||
| 7626 | + } | ||
| 7627 | + | ||
| 7628 | + if (req->ds_parms) | ||
| 7629 | + bss->channel = req->ds_parms->curr_ch; | ||
| 7630 | + if (req->cap_info) | ||
| 7631 | + bss->cap_info = ieee2host16(*req->cap_info); | ||
| 7632 | + | ||
| 7633 | + bss->sir = acx_signal_to_winlevel(rxbuf->phy_level); | ||
| 7634 | + bss->snr = acx_signal_to_winlevel(rxbuf->phy_snr); | ||
| 7635 | + | ||
| 7636 | + bss->rate_cap = 0; /* operational mask */ | ||
| 7637 | + bss->rate_bas = 0; /* basic mask */ | ||
| 7638 | + if (req->supp_rates) | ||
| 7639 | + add_bits_to_ratemasks(req->supp_rates->rates, | ||
| 7640 | + req->supp_rates->len, &bss->rate_bas, &bss->rate_cap); | ||
| 7641 | + if (req->ext_rates) | ||
| 7642 | + add_bits_to_ratemasks(req->ext_rates->rates, | ||
| 7643 | + req->ext_rates->len, &bss->rate_bas, &bss->rate_cap); | ||
| 7644 | + /* Fix up any possible bogosity - code elsewhere | ||
| 7645 | + * is not expecting empty masks */ | ||
| 7646 | + if (!bss->rate_cap) | ||
| 7647 | + bss->rate_cap = adev->rate_basic; | ||
| 7648 | + if (!bss->rate_bas) | ||
| 7649 | + bss->rate_bas = 1 << lowest_bit(bss->rate_cap); | ||
| 7650 | + if (!bss->rate_cur) | ||
| 7651 | + bss->rate_cur = 1 << lowest_bit(bss->rate_bas); | ||
| 7652 | + | ||
| 7653 | + /* People moan about this being too noisy at L_ASSOC */ | ||
| 7654 | + log(L_DEBUG, | ||
| 7655 | + "found %s: ESSID=\"%s\" ch=%d " | ||
| 7656 | + "BSSID="MACSTR" caps=0x%04X SIR=%d SNR=%d\n", | ||
| 7657 | + (bss->cap_info & WF_MGMT_CAP_IBSS) ? "Ad-Hoc peer" : "AP", | ||
| 7658 | + bss->essid, bss->channel, MAC(bss->bssid), bss->cap_info, | ||
| 7659 | + bss->sir, bss->snr); | ||
| 7660 | +ok: | ||
| 7661 | + FN_EXIT0; | ||
| 7662 | + return OK; | ||
| 7663 | +} | ||
| 7664 | + | ||
| 7665 | + | ||
| 7666 | +/*********************************************************************** | ||
| 7667 | +** acx_l_process_assocresp | ||
| 7668 | +*/ | ||
| 7669 | +static int | ||
| 7670 | +acx_l_process_assocresp(acx_device_t *adev, const wlan_fr_assocresp_t *req) | ||
| 7671 | +{ | ||
| 7672 | + const wlan_hdr_t *hdr; | ||
| 7673 | + int res = OK; | ||
| 7674 | + | ||
| 7675 | + FN_ENTER; | ||
| 7676 | + | ||
| 7677 | + hdr = req->hdr; | ||
| 7678 | + | ||
| 7679 | + if ((ACX_MODE_2_STA == adev->mode) | ||
| 7680 | + && mac_is_equal(adev->dev_addr, hdr->a1)) { | ||
| 7681 | + u16 st = ieee2host16(*(req->status)); | ||
| 7682 | + if (WLAN_MGMT_STATUS_SUCCESS == st) { | ||
| 7683 | + adev->aid = ieee2host16(*(req->aid)); | ||
| 7684 | + /* tell the card we are associated when | ||
| 7685 | + ** we are out of interrupt context */ | ||
| 7686 | + acx_schedule_task(adev, ACX_AFTER_IRQ_CMD_ASSOCIATE); | ||
| 7687 | + } else { | ||
| 7688 | + | ||
| 7689 | + /* TODO: we shall delete peer from sta_list, and try | ||
| 7690 | + ** other candidates... */ | ||
| 7691 | + | ||
| 7692 | + printk("%s: association FAILED: peer sent " | ||
| 7693 | + "Status Code %d (%s)\n", | ||
| 7694 | + adev->ndev->name, st, get_status_string(st)); | ||
| 7695 | + res = NOT_OK; | ||
| 7696 | + } | ||
| 7697 | + } | ||
| 7698 | + | ||
| 7699 | + FN_EXIT1(res); | ||
| 7700 | + return res; | ||
| 7701 | +} | ||
| 7702 | + | ||
| 7703 | + | ||
| 7704 | +/*********************************************************************** | ||
| 7705 | +** acx_l_process_reassocresp | ||
| 7706 | +*/ | ||
| 7707 | +static int | ||
| 7708 | +acx_l_process_reassocresp(acx_device_t *adev, const wlan_fr_reassocresp_t *req) | ||
| 7709 | +{ | ||
| 7710 | + const wlan_hdr_t *hdr; | ||
| 7711 | + int result = NOT_OK; | ||
| 7712 | + u16 st; | ||
| 7713 | + | ||
| 7714 | + FN_ENTER; | ||
| 7715 | + | ||
| 7716 | + hdr = req->hdr; | ||
| 7717 | + | ||
| 7718 | + if (!mac_is_equal(adev->dev_addr, hdr->a1)) { | ||
| 7719 | + goto end; | ||
| 7720 | + } | ||
| 7721 | + st = ieee2host16(*(req->status)); | ||
| 7722 | + if (st == WLAN_MGMT_STATUS_SUCCESS) { | ||
| 7723 | + acx_set_status(adev, ACX_STATUS_4_ASSOCIATED); | ||
| 7724 | + result = OK; | ||
| 7725 | + } else { | ||
| 7726 | + printk("%s: reassociation FAILED: peer sent " | ||
| 7727 | + "response code %d (%s)\n", | ||
| 7728 | + adev->ndev->name, st, get_status_string(st)); | ||
| 7729 | + } | ||
| 7730 | +end: | ||
| 7731 | + FN_EXIT1(result); | ||
| 7732 | + return result; | ||
| 7733 | +} | ||
| 7734 | + | ||
| 7735 | + | ||
| 7736 | +/*********************************************************************** | ||
| 7737 | +** acx_l_process_authen | ||
| 7738 | +** | ||
| 7739 | +** Called only in STA_SCAN or AP mode | ||
| 7740 | +*/ | ||
| 7741 | +static int | ||
| 7742 | +acx_l_process_authen(acx_device_t *adev, const wlan_fr_authen_t *req) | ||
| 7743 | +{ | ||
| 7744 | + const wlan_hdr_t *hdr; | ||
| 7745 | + client_t *clt; | ||
| 7746 | + wlan_ie_challenge_t *chal; | ||
| 7747 | + u16 alg, seq, status; | ||
| 7748 | + int ap, result; | ||
| 7749 | + | ||
| 7750 | + FN_ENTER; | ||
| 7751 | + | ||
| 7752 | + hdr = req->hdr; | ||
| 7753 | + | ||
| 7754 | + if (acx_debug & L_ASSOC) { | ||
| 7755 | + acx_print_mac("AUTHEN adev->addr=", adev->dev_addr, " "); | ||
| 7756 | + acx_print_mac("a1=", hdr->a1, " "); | ||
| 7757 | + acx_print_mac("a2=", hdr->a2, " "); | ||
| 7758 | + acx_print_mac("a3=", hdr->a3, " "); | ||
| 7759 | + acx_print_mac("adev->bssid=", adev->bssid, "\n"); | ||
| 7760 | + } | ||
| 7761 | + | ||
| 7762 | + if (!mac_is_equal(adev->dev_addr, hdr->a1) | ||
| 7763 | + || !mac_is_equal(adev->bssid, hdr->a3)) { | ||
| 7764 | + result = OK; | ||
| 7765 | + goto end; | ||
| 7766 | + } | ||
| 7767 | + | ||
| 7768 | + alg = ieee2host16(*(req->auth_alg)); | ||
| 7769 | + seq = ieee2host16(*(req->auth_seq)); | ||
| 7770 | + status = ieee2host16(*(req->status)); | ||
| 7771 | + | ||
| 7772 | + log(L_ASSOC, "auth algorithm %d, auth sequence %d, status %d\n", alg, seq, status); | ||
| 7773 | + | ||
| 7774 | + ap = (adev->mode == ACX_MODE_3_AP); | ||
| 7775 | + | ||
| 7776 | + if (adev->auth_alg <= 1) { | ||
| 7777 | + if (adev->auth_alg != alg) { | ||
| 7778 | + log(L_ASSOC, "auth algorithm mismatch: " | ||
| 7779 | + "our:%d peer:%d\n", adev->auth_alg, alg); | ||
| 7780 | + result = NOT_OK; | ||
| 7781 | + goto end; | ||
| 7782 | + } | ||
| 7783 | + } | ||
| 7784 | + if (ap) { | ||
| 7785 | + clt = acx_l_sta_list_get_or_add(adev, hdr->a2); | ||
| 7786 | + if (STA_LIST_ADD_CAN_FAIL && !clt) { | ||
| 7787 | + log(L_ASSOC, "could not allocate room for client\n"); | ||
| 7788 | + result = NOT_OK; | ||
| 7789 | + goto end; | ||
| 7790 | + } | ||
| 7791 | + } else { | ||
| 7792 | + clt = adev->ap_client; | ||
| 7793 | + if (!mac_is_equal(clt->address, hdr->a2)) { | ||
| 7794 | + printk("%s: malformed auth frame from AP?!\n", | ||
| 7795 | + adev->ndev->name); | ||
| 7796 | + result = NOT_OK; | ||
| 7797 | + goto end; | ||
| 7798 | + } | ||
| 7799 | + } | ||
| 7800 | + | ||
| 7801 | + /* now check which step in the authentication sequence we are | ||
| 7802 | + * currently in, and act accordingly */ | ||
| 7803 | + switch (seq) { | ||
| 7804 | + case 1: | ||
| 7805 | + if (!ap) | ||
| 7806 | + break; | ||
| 7807 | + acx_l_transmit_authen2(adev, req, clt); | ||
| 7808 | + break; | ||
| 7809 | + case 2: | ||
| 7810 | + if (ap) | ||
| 7811 | + break; | ||
| 7812 | + if (status == WLAN_MGMT_STATUS_SUCCESS) { | ||
| 7813 | + if (alg == WLAN_AUTH_ALG_OPENSYSTEM) { | ||
| 7814 | + acx_set_status(adev, ACX_STATUS_3_AUTHENTICATED); | ||
| 7815 | + acx_l_transmit_assoc_req(adev); | ||
| 7816 | + } else | ||
| 7817 | + if (alg == WLAN_AUTH_ALG_SHAREDKEY) { | ||
| 7818 | + acx_l_transmit_authen3(adev, req); | ||
| 7819 | + } | ||
| 7820 | + } else { | ||
| 7821 | + printk("%s: auth FAILED: peer sent " | ||
| 7822 | + "response code %d (%s), " | ||
| 7823 | + "still waiting for authentication\n", | ||
| 7824 | + adev->ndev->name, | ||
| 7825 | + status, get_status_string(status)); | ||
| 7826 | + acx_set_status(adev, ACX_STATUS_2_WAIT_AUTH); | ||
| 7827 | + } | ||
| 7828 | + break; | ||
| 7829 | + case 3: | ||
| 7830 | + if (!ap) | ||
| 7831 | + break; | ||
| 7832 | + if ((clt->auth_alg != WLAN_AUTH_ALG_SHAREDKEY) | ||
| 7833 | + || (alg != WLAN_AUTH_ALG_SHAREDKEY) | ||
| 7834 | + || (clt->auth_step != 2)) | ||
| 7835 | + break; | ||
| 7836 | + chal = req->challenge; | ||
| 7837 | + if (!chal | ||
| 7838 | + || memcmp(chal->challenge, clt->challenge_text, WLAN_CHALLENGE_LEN) | ||
| 7839 | + || (chal->eid != WLAN_EID_CHALLENGE) | ||
| 7840 | + || (chal->len != WLAN_CHALLENGE_LEN) | ||
| 7841 | + ) | ||
| 7842 | + break; | ||
| 7843 | + acx_l_transmit_authen4(adev, req); | ||
| 7844 | + MAC_COPY(clt->address, hdr->a2); | ||
| 7845 | + clt->used = CLIENT_AUTHENTICATED_2; | ||
| 7846 | + clt->auth_step = 4; | ||
| 7847 | + clt->seq = ieee2host16(hdr->seq); | ||
| 7848 | + break; | ||
| 7849 | + case 4: | ||
| 7850 | + if (ap) | ||
| 7851 | + break; | ||
| 7852 | + /* ok, we're through: we're authenticated. Woohoo!! */ | ||
| 7853 | + acx_set_status(adev, ACX_STATUS_3_AUTHENTICATED); | ||
| 7854 | + log(L_ASSOC, "Authenticated!\n"); | ||
| 7855 | + /* now that we're authenticated, request association */ | ||
| 7856 | + acx_l_transmit_assoc_req(adev); | ||
| 7857 | + break; | ||
| 7858 | + } | ||
| 7859 | + result = OK; | ||
| 7860 | +end: | ||
| 7861 | + FN_EXIT1(result); | ||
| 7862 | + return result; | ||
| 7863 | +} | ||
| 7864 | + | ||
| 7865 | + | ||
| 7866 | +/*********************************************************************** | ||
| 7867 | +** acx_gen_challenge | ||
| 7868 | +*/ | ||
| 7869 | +static inline void | ||
| 7870 | +acx_gen_challenge(wlan_ie_challenge_t* d) | ||
| 7871 | +{ | ||
| 7872 | + FN_ENTER; | ||
| 7873 | + d->eid = WLAN_EID_CHALLENGE; | ||
| 7874 | + d->len = WLAN_CHALLENGE_LEN; | ||
| 7875 | + get_random_bytes(d->challenge, WLAN_CHALLENGE_LEN); | ||
| 7876 | + FN_EXIT0; | ||
| 7877 | +} | ||
| 7878 | + | ||
| 7879 | + | ||
| 7880 | +/*********************************************************************** | ||
| 7881 | +** acx_l_transmit_deauthen | ||
| 7882 | +*/ | ||
| 7883 | +static int | ||
| 7884 | +acx_l_transmit_deauthen(acx_device_t *adev, const u8 *addr, u16 reason) | ||
| 7885 | +{ | ||
| 7886 | + struct tx *tx; | ||
| 7887 | + struct wlan_hdr_mgmt *head; | ||
| 7888 | + struct deauthen_frame_body *body; | ||
| 7889 | + | ||
| 7890 | + FN_ENTER; | ||
| 7891 | + | ||
| 7892 | + tx = acx_l_alloc_tx(adev); | ||
| 7893 | + if (!tx) | ||
| 7894 | + goto bad; | ||
| 7895 | + head = acx_l_get_txbuf(adev, tx); | ||
| 7896 | + if (!head) { | ||
| 7897 | + acx_l_dealloc_tx(adev, tx); | ||
| 7898 | + goto bad; | ||
| 7899 | + } | ||
| 7900 | + body = (void*)(head + 1); | ||
| 7901 | + | ||
| 7902 | + head->fc = (WF_FTYPE_MGMTi | WF_FSTYPE_DEAUTHENi); | ||
| 7903 | + head->dur = 0; | ||
| 7904 | + MAC_COPY(head->da, addr); | ||
| 7905 | + MAC_COPY(head->sa, adev->dev_addr); | ||
| 7906 | + MAC_COPY(head->bssid, adev->bssid); | ||
| 7907 | + head->seq = 0; | ||
| 7908 | + | ||
| 7909 | + log(L_DEBUG|L_ASSOC|L_XFER, | ||
| 7910 | + "sending deauthen to "MACSTR" for %d\n", | ||
| 7911 | + MAC(addr), reason); | ||
| 7912 | + | ||
| 7913 | + body->reason = host2ieee16(reason); | ||
| 7914 | + | ||
| 7915 | + /* body is fixed size here, but beware of cutting-and-pasting this - | ||
| 7916 | + ** do not use sizeof(*body) for variable sized mgmt packets! */ | ||
| 7917 | + acx_l_tx_data(adev, tx, WLAN_HDR_A3_LEN + sizeof(*body)); | ||
| 7918 | + | ||
| 7919 | + FN_EXIT1(OK); | ||
| 7920 | + return OK; | ||
| 7921 | +bad: | ||
| 7922 | + FN_EXIT1(NOT_OK); | ||
| 7923 | + return NOT_OK; | ||
| 7924 | +} | ||
| 7925 | + | ||
| 7926 | + | ||
| 7927 | +/*********************************************************************** | ||
| 7928 | +** acx_l_transmit_authen1 | ||
| 7929 | +*/ | ||
| 7930 | +static int | ||
| 7931 | +acx_l_transmit_authen1(acx_device_t *adev) | ||
| 7932 | +{ | ||
| 7933 | + struct tx *tx; | ||
| 7934 | + struct wlan_hdr_mgmt *head; | ||
| 7935 | + struct auth_frame_body *body; | ||
| 7936 | + | ||
| 7937 | + FN_ENTER; | ||
| 7938 | + | ||
| 7939 | + log(L_ASSOC, "sending authentication1 request (auth algo %d), " | ||
| 7940 | + "awaiting response\n", adev->auth_alg); | ||
| 7941 | + | ||
| 7942 | + tx = acx_l_alloc_tx(adev); | ||
| 7943 | + if (!tx) | ||
| 7944 | + goto bad; | ||
| 7945 | + head = acx_l_get_txbuf(adev, tx); | ||
| 7946 | + if (!head) { | ||
| 7947 | + acx_l_dealloc_tx(adev, tx); | ||
| 7948 | + goto bad; | ||
| 7949 | + } | ||
| 7950 | + body = (void*)(head + 1); | ||
| 7951 | + | ||
| 7952 | + head->fc = WF_FSTYPE_AUTHENi; | ||
| 7953 | + /* duration should be 0 instead of 0x8000 to have | ||
| 7954 | + * the firmware calculate the value, right? */ | ||
| 7955 | + head->dur = 0; | ||
| 7956 | + MAC_COPY(head->da, adev->bssid); | ||
| 7957 | + MAC_COPY(head->sa, adev->dev_addr); | ||
| 7958 | + MAC_COPY(head->bssid, adev->bssid); | ||
| 7959 | + head->seq = 0; | ||
| 7960 | + | ||
| 7961 | + body->auth_alg = host2ieee16(adev->auth_alg); | ||
| 7962 | + body->auth_seq = host2ieee16(1); | ||
| 7963 | + body->status = host2ieee16(0); | ||
| 7964 | + | ||
| 7965 | + acx_l_tx_data(adev, tx, WLAN_HDR_A3_LEN + 2 + 2 + 2); | ||
| 7966 | + | ||
| 7967 | + FN_EXIT1(OK); | ||
| 7968 | + return OK; | ||
| 7969 | +bad: | ||
| 7970 | + FN_EXIT1(NOT_OK); | ||
| 7971 | + return NOT_OK; | ||
| 7972 | +} | ||
| 7973 | + | ||
| 7974 | + | ||
| 7975 | +/*********************************************************************** | ||
| 7976 | +** acx_l_transmit_authen2 | ||
| 7977 | +*/ | ||
| 7978 | +static int | ||
| 7979 | +acx_l_transmit_authen2(acx_device_t *adev, const wlan_fr_authen_t *req, | ||
| 7980 | + client_t *clt) | ||
| 7981 | +{ | ||
| 7982 | + struct tx *tx; | ||
| 7983 | + struct wlan_hdr_mgmt *head; | ||
| 7984 | + struct auth_frame_body *body; | ||
| 7985 | + unsigned int packet_len; | ||
| 7986 | + | ||
| 7987 | + FN_ENTER; | ||
| 7988 | + | ||
| 7989 | + if (!clt) | ||
| 7990 | + goto ok; | ||
| 7991 | + | ||
| 7992 | + MAC_COPY(clt->address, req->hdr->a2); | ||
| 7993 | +#ifdef UNUSED | ||
| 7994 | + clt->ps = ((WF_FC_PWRMGTi & req->hdr->fc) != 0); | ||
| 7995 | +#endif | ||
| 7996 | + clt->auth_alg = ieee2host16(*(req->auth_alg)); | ||
| 7997 | + clt->auth_step = 2; | ||
| 7998 | + clt->seq = ieee2host16(req->hdr->seq); | ||
| 7999 | + | ||
| 8000 | + tx = acx_l_alloc_tx(adev); | ||
| 8001 | + if (!tx) | ||
| 8002 | + goto bad; | ||
| 8003 | + head = acx_l_get_txbuf(adev, tx); | ||
| 8004 | + if (!head) { | ||
| 8005 | + acx_l_dealloc_tx(adev, tx); | ||
| 8006 | + goto bad; | ||
| 8007 | + } | ||
| 8008 | + body = (void*)(head + 1); | ||
| 8009 | + | ||
| 8010 | + head->fc = WF_FSTYPE_AUTHENi; | ||
| 8011 | + head->dur = 0 /* req->hdr->dur */; | ||
| 8012 | + MAC_COPY(head->da, req->hdr->a2); | ||
| 8013 | + MAC_COPY(head->sa, adev->dev_addr); | ||
| 8014 | + MAC_COPY(head->bssid, req->hdr->a3); | ||
| 8015 | + head->seq = 0 /* req->hdr->seq */; | ||
| 8016 | + | ||
| 8017 | + /* already in IEEE format, no endianness conversion */ | ||
| 8018 | + body->auth_alg = *(req->auth_alg); | ||
| 8019 | + body->auth_seq = host2ieee16(2); | ||
| 8020 | + body->status = host2ieee16(0); | ||
| 8021 | + | ||
| 8022 | + packet_len = WLAN_HDR_A3_LEN + 2 + 2 + 2; | ||
| 8023 | + if (ieee2host16(*(req->auth_alg)) == WLAN_AUTH_ALG_OPENSYSTEM) { | ||
| 8024 | + clt->used = CLIENT_AUTHENTICATED_2; | ||
| 8025 | + } else { /* shared key */ | ||
| 8026 | + acx_gen_challenge(&body->challenge); | ||
| 8027 | + memcpy(&clt->challenge_text, body->challenge.challenge, WLAN_CHALLENGE_LEN); | ||
| 8028 | + packet_len += 2 + 2 + 2 + 1+1+WLAN_CHALLENGE_LEN; | ||
| 8029 | + } | ||
| 8030 | + | ||
| 8031 | + acxlog_mac(L_ASSOC|L_XFER, | ||
| 8032 | + "transmit_auth2: BSSID=", head->bssid, "\n"); | ||
| 8033 | + | ||
| 8034 | + acx_l_tx_data(adev, tx, packet_len); | ||
| 8035 | +ok: | ||
| 8036 | + FN_EXIT1(OK); | ||
| 8037 | + return OK; | ||
| 8038 | +bad: | ||
| 8039 | + FN_EXIT1(NOT_OK); | ||
| 8040 | + return NOT_OK; | ||
| 8041 | +} | ||
| 8042 | + | ||
| 8043 | + | ||
| 8044 | +/*********************************************************************** | ||
| 8045 | +** acx_l_transmit_authen3 | ||
| 8046 | +*/ | ||
| 8047 | +static int | ||
| 8048 | +acx_l_transmit_authen3(acx_device_t *adev, const wlan_fr_authen_t *req) | ||
| 8049 | +{ | ||
| 8050 | + struct tx *tx; | ||
| 8051 | + struct wlan_hdr_mgmt *head; | ||
| 8052 | + struct auth_frame_body *body; | ||
| 8053 | + unsigned int packet_len; | ||
| 8054 | + | ||
| 8055 | + FN_ENTER; | ||
| 8056 | + | ||
| 8057 | + tx = acx_l_alloc_tx(adev); | ||
| 8058 | + if (!tx) | ||
| 8059 | + goto ok; | ||
| 8060 | + head = acx_l_get_txbuf(adev, tx); | ||
| 8061 | + if (!head) { | ||
| 8062 | + acx_l_dealloc_tx(adev, tx); | ||
| 8063 | + goto ok; | ||
| 8064 | + } | ||
| 8065 | + body = (void*)(head + 1); | ||
| 8066 | + | ||
| 8067 | + /* add WF_FC_ISWEPi: auth step 3 needs to be encrypted */ | ||
| 8068 | + head->fc = WF_FC_ISWEPi + WF_FSTYPE_AUTHENi; | ||
| 8069 | + /* FIXME: is this needed?? authen4 does it... | ||
| 8070 | + * I think it's even wrong since we shouldn't re-use old | ||
| 8071 | + * values but instead let the firmware calculate proper ones | ||
| 8072 | + head->dur = req->hdr->dur; | ||
| 8073 | + head->seq = req->hdr->seq; | ||
| 8074 | + */ | ||
| 8075 | + MAC_COPY(head->da, adev->bssid); | ||
| 8076 | + MAC_COPY(head->sa, adev->dev_addr); | ||
| 8077 | + MAC_COPY(head->bssid, adev->bssid); | ||
| 8078 | + | ||
| 8079 | + /* already in IEEE format, no endianness conversion */ | ||
| 8080 | + body->auth_alg = *(req->auth_alg); | ||
| 8081 | + body->auth_seq = host2ieee16(3); | ||
| 8082 | + body->status = host2ieee16(0); | ||
| 8083 | + memcpy(&body->challenge, req->challenge, req->challenge->len + 2); | ||
| 8084 | + packet_len = WLAN_HDR_A3_LEN + 8 + req->challenge->len; | ||
| 8085 | + | ||
| 8086 | + log(L_ASSOC|L_XFER, "transmit_authen3!\n"); | ||
| 8087 | + | ||
| 8088 | + acx_l_tx_data(adev, tx, packet_len); | ||
| 8089 | +ok: | ||
| 8090 | + FN_EXIT1(OK); | ||
| 8091 | + return OK; | ||
| 8092 | +} | ||
| 8093 | + | ||
| 8094 | + | ||
| 8095 | +/*********************************************************************** | ||
| 8096 | +** acx_l_transmit_authen4 | ||
| 8097 | +*/ | ||
| 8098 | +static int | ||
| 8099 | +acx_l_transmit_authen4(acx_device_t *adev, const wlan_fr_authen_t *req) | ||
| 8100 | +{ | ||
| 8101 | + struct tx *tx; | ||
| 8102 | + struct wlan_hdr_mgmt *head; | ||
| 8103 | + struct auth_frame_body *body; | ||
| 8104 | + | ||
| 8105 | + FN_ENTER; | ||
| 8106 | + | ||
| 8107 | + tx = acx_l_alloc_tx(adev); | ||
| 8108 | + if (!tx) | ||
| 8109 | + goto ok; | ||
| 8110 | + head = acx_l_get_txbuf(adev, tx); | ||
| 8111 | + if (!head) { | ||
| 8112 | + acx_l_dealloc_tx(adev, tx); | ||
| 8113 | + goto ok; | ||
| 8114 | + } | ||
| 8115 | + body = (void*)(head + 1); | ||
| 8116 | + | ||
| 8117 | + head->fc = WF_FSTYPE_AUTHENi; /* 0xb0 */ | ||
| 8118 | + head->dur = 0 /* req->hdr->dur */; | ||
| 8119 | + MAC_COPY(head->da, req->hdr->a2); | ||
| 8120 | + MAC_COPY(head->sa, adev->dev_addr); | ||
| 8121 | + MAC_COPY(head->bssid, req->hdr->a3); | ||
| 8122 | + head->seq = 0 /* req->hdr->seq */; | ||
| 8123 | + | ||
| 8124 | + /* already in IEEE format, no endianness conversion */ | ||
| 8125 | + body->auth_alg = *(req->auth_alg); | ||
| 8126 | + body->auth_seq = host2ieee16(4); | ||
| 8127 | + body->status = host2ieee16(0); | ||
| 8128 | + | ||
| 8129 | + acx_l_tx_data(adev, tx, WLAN_HDR_A3_LEN + 2 + 2 + 2); | ||
| 8130 | +ok: | ||
| 8131 | + FN_EXIT1(OK); | ||
| 8132 | + return OK; | ||
| 8133 | +} | ||
| 8134 | + | ||
| 8135 | + | ||
| 8136 | +/*********************************************************************** | ||
| 8137 | +** acx_l_transmit_assoc_req | ||
| 8138 | +** | ||
| 8139 | +** adev->ap_client is a current candidate AP here | ||
| 8140 | +*/ | ||
| 8141 | +static int | ||
| 8142 | +acx_l_transmit_assoc_req(acx_device_t *adev) | ||
| 8143 | +{ | ||
| 8144 | + struct tx *tx; | ||
| 8145 | + struct wlan_hdr_mgmt *head; | ||
| 8146 | + u8 *body, *p, *prate; | ||
| 8147 | + unsigned int packet_len; | ||
| 8148 | + u16 cap; | ||
| 8149 | + | ||
| 8150 | + FN_ENTER; | ||
| 8151 | + | ||
| 8152 | + log(L_ASSOC, "sending association request, " | ||
| 8153 | + "awaiting response. NOT ASSOCIATED YET\n"); | ||
| 8154 | + tx = acx_l_alloc_tx(adev); | ||
| 8155 | + if (!tx) | ||
| 8156 | + goto bad; | ||
| 8157 | + head = acx_l_get_txbuf(adev, tx); | ||
| 8158 | + if (!head) { | ||
| 8159 | + acx_l_dealloc_tx(adev, tx); | ||
| 8160 | + goto bad; | ||
| 8161 | + } | ||
| 8162 | + body = (void*)(head + 1); | ||
| 8163 | + | ||
| 8164 | + head->fc = WF_FSTYPE_ASSOCREQi; | ||
| 8165 | + head->dur = host2ieee16(0x8000); | ||
| 8166 | + MAC_COPY(head->da, adev->bssid); | ||
| 8167 | + MAC_COPY(head->sa, adev->dev_addr); | ||
| 8168 | + MAC_COPY(head->bssid, adev->bssid); | ||
| 8169 | + head->seq = 0; | ||
| 8170 | + | ||
| 8171 | + p = body; | ||
| 8172 | + /* now start filling the AssocReq frame body */ | ||
| 8173 | + | ||
| 8174 | + /* since this assoc request will most likely only get | ||
| 8175 | + * sent in the STA to AP case (and not when Ad-Hoc IBSS), | ||
| 8176 | + * the cap combination indicated here will thus be | ||
| 8177 | + * WF_MGMT_CAP_ESSi *always* (no IBSS ever) | ||
| 8178 | + * The specs are more than non-obvious on all that: | ||
| 8179 | + * | ||
| 8180 | + * 802.11 7.3.1.4 Capability Information field | ||
| 8181 | + ** APs set the ESS subfield to 1 and the IBSS subfield to 0 within | ||
| 8182 | + ** Beacon or Probe Response management frames. STAs within an IBSS | ||
| 8183 | + ** set the ESS subfield to 0 and the IBSS subfield to 1 in transmitted | ||
| 8184 | + ** Beacon or Probe Response management frames | ||
| 8185 | + ** | ||
| 8186 | + ** APs set the Privacy subfield to 1 within transmitted Beacon, | ||
| 8187 | + ** Probe Response, Association Response, and Reassociation Response | ||
| 8188 | + ** if WEP is required for all data type frames within the BSS. | ||
| 8189 | + ** STAs within an IBSS set the Privacy subfield to 1 in Beacon | ||
| 8190 | + ** or Probe Response management frames if WEP is required | ||
| 8191 | + ** for all data type frames within the IBSS */ | ||
| 8192 | + | ||
| 8193 | + /* note that returning 0 will be refused by several APs... | ||
| 8194 | + * (so this indicates that you're probably supposed to | ||
| 8195 | + * "confirm" the ESS mode) */ | ||
| 8196 | + cap = WF_MGMT_CAP_ESSi; | ||
| 8197 | + | ||
| 8198 | + /* this one used to be a check on wep_restricted, | ||
| 8199 | + * but more likely it's wep_enabled instead */ | ||
| 8200 | + if (adev->wep_enabled) | ||
| 8201 | + SET_BIT(cap, WF_MGMT_CAP_PRIVACYi); | ||
| 8202 | + | ||
| 8203 | + /* Probably we can just set these always, because our hw is | ||
| 8204 | + ** capable of shortpre and PBCC --vda */ | ||
| 8205 | + /* only ask for short preamble if the peer station supports it */ | ||
| 8206 | + if (adev->ap_client->cap_info & WF_MGMT_CAP_SHORT) | ||
| 8207 | + SET_BIT(cap, WF_MGMT_CAP_SHORTi); | ||
| 8208 | + /* only ask for PBCC support if the peer station supports it */ | ||
| 8209 | + if (adev->ap_client->cap_info & WF_MGMT_CAP_PBCC) | ||
| 8210 | + SET_BIT(cap, WF_MGMT_CAP_PBCCi); | ||
| 8211 | + | ||
| 8212 | + /* IEs: 1. caps */ | ||
| 8213 | + *(u16*)p = cap; p += 2; | ||
| 8214 | + /* 2. listen interval */ | ||
| 8215 | + *(u16*)p = host2ieee16(adev->listen_interval); p += 2; | ||
| 8216 | + /* 3. ESSID */ | ||
| 8217 | + p = wlan_fill_ie_ssid(p, | ||
| 8218 | + strlen(adev->essid_for_assoc), adev->essid_for_assoc); | ||
| 8219 | + /* 4. supp rates */ | ||
| 8220 | + prate = p; | ||
| 8221 | + p = wlan_fill_ie_rates(p, | ||
| 8222 | + adev->rate_supported_len, adev->rate_supported); | ||
| 8223 | + /* 5. ext supp rates */ | ||
| 8224 | + p = wlan_fill_ie_rates_ext(p, | ||
| 8225 | + adev->rate_supported_len, adev->rate_supported); | ||
| 8226 | + | ||
| 8227 | + if (acx_debug & L_DEBUG) { | ||
| 8228 | + printk("association: rates element\n"); | ||
| 8229 | + acx_dump_bytes(prate, p - prate); | ||
| 8230 | + } | ||
| 8231 | + | ||
| 8232 | + /* calculate lengths */ | ||
| 8233 | + packet_len = WLAN_HDR_A3_LEN + (p - body); | ||
| 8234 | + | ||
| 8235 | + log(L_ASSOC, "association: requesting caps 0x%04X, ESSID \"%s\"\n", | ||
| 8236 | + cap, adev->essid_for_assoc); | ||
| 8237 | + | ||
| 8238 | + acx_l_tx_data(adev, tx, packet_len); | ||
| 8239 | + FN_EXIT1(OK); | ||
| 8240 | + return OK; | ||
| 8241 | +bad: | ||
| 8242 | + FN_EXIT1(NOT_OK); | ||
| 8243 | + return NOT_OK; | ||
| 8244 | +} | ||
| 8245 | + | ||
| 8246 | + | ||
| 8247 | +/*********************************************************************** | ||
| 8248 | +** acx_l_transmit_disassoc | ||
| 8249 | +** | ||
| 8250 | +** FIXME: looks like incomplete implementation of a helper: | ||
| 8251 | +** acx_l_transmit_disassoc(adev, clt) - kick this client (we're an AP) | ||
| 8252 | +** acx_l_transmit_disassoc(adev, NULL) - leave BSSID (we're a STA) | ||
| 8253 | +*/ | ||
| 8254 | +#ifdef BROKEN | ||
| 8255 | +int | ||
| 8256 | +acx_l_transmit_disassoc(acx_device_t *adev, client_t *clt) | ||
| 8257 | +{ | ||
| 8258 | + struct tx *tx; | ||
| 8259 | + struct wlan_hdr_mgmt *head; | ||
| 8260 | + struct disassoc_frame_body *body; | ||
| 8261 | + | ||
| 8262 | + FN_ENTER; | ||
| 8263 | +/* if (clt != NULL) { */ | ||
| 8264 | + tx = acx_l_alloc_tx(adev); | ||
| 8265 | + if (!tx) | ||
| 8266 | + goto bad; | ||
| 8267 | + head = acx_l_get_txbuf(adev, tx); | ||
| 8268 | + if (!head) { | ||
| 8269 | + acx_l_dealloc_tx(adev, tx); | ||
| 8270 | + goto bad; | ||
| 8271 | + } | ||
| 8272 | + body = (void*)(head + 1); | ||
| 8273 | + | ||
| 8274 | +/* clt->used = CLIENT_AUTHENTICATED_2; - not (yet?) associated */ | ||
| 8275 | + | ||
| 8276 | + head->fc = WF_FSTYPE_DISASSOCi; | ||
| 8277 | + head->dur = 0; | ||
| 8278 | + /* huh? It muchly depends on whether we're STA or AP... | ||
| 8279 | + ** sta->ap: da=bssid, sa=own, bssid=bssid | ||
| 8280 | + ** ap->sta: da=sta, sa=bssid, bssid=bssid. FIXME! */ | ||
| 8281 | + MAC_COPY(head->da, adev->bssid); | ||
| 8282 | + MAC_COPY(head->sa, adev->dev_addr); | ||
| 8283 | + MAC_COPY(head->bssid, adev->dev_addr); | ||
| 8284 | + head->seq = 0; | ||
| 8285 | + | ||
| 8286 | + /* "Class 3 frame received from nonassociated station." */ | ||
| 8287 | + body->reason = host2ieee16(7); | ||
| 8288 | + | ||
| 8289 | + /* fixed size struct, ok to sizeof */ | ||
| 8290 | + acx_l_tx_data(adev, tx, WLAN_HDR_A3_LEN + sizeof(*body)); | ||
| 8291 | +/* } */ | ||
| 8292 | + FN_EXIT1(OK); | ||
| 8293 | + return OK; | ||
| 8294 | +bad: | ||
| 8295 | + FN_EXIT1(NOT_OK); | ||
| 8296 | + return NOT_OK; | ||
| 8297 | +} | ||
| 8298 | +#endif | ||
| 8299 | + | ||
| 8300 | + | ||
| 8301 | +/*********************************************************************** | ||
| 8302 | +** acx_s_complete_scan | ||
| 8303 | +** | ||
| 8304 | +** Called either from after_interrupt_task() if: | ||
| 8305 | +** 1) there was Scan_Complete IRQ, or | ||
| 8306 | +** 2) scanning expired in timer() | ||
| 8307 | +** We need to decide which ESS or IBSS to join. | ||
| 8308 | +** Iterates thru adev->sta_list: | ||
| 8309 | +** if adev->ap is not bcast, will join only specified | ||
| 8310 | +** ESS or IBSS with this bssid | ||
| 8311 | +** checks peers' caps for ESS/IBSS bit | ||
| 8312 | +** checks peers' SSID, allows exact match or hidden SSID | ||
| 8313 | +** If station to join is chosen: | ||
| 8314 | +** points adev->ap_client to the chosen struct client | ||
| 8315 | +** sets adev->essid_for_assoc for future assoc attempt | ||
| 8316 | +** Auth/assoc is not yet performed | ||
| 8317 | +** Returns OK if there is no need to restart scan | ||
| 8318 | +*/ | ||
| 8319 | +int | ||
| 8320 | +acx_s_complete_scan(acx_device_t *adev) | ||
| 8321 | +{ | ||
| 8322 | + struct client *bss; | ||
| 8323 | + unsigned long flags; | ||
| 8324 | + u16 needed_cap; | ||
| 8325 | + int i; | ||
| 8326 | + int idx_found = -1; | ||
| 8327 | + int result = OK; | ||
| 8328 | + | ||
| 8329 | + FN_ENTER; | ||
| 8330 | + | ||
| 8331 | + switch (adev->mode) { | ||
| 8332 | + case ACX_MODE_0_ADHOC: | ||
| 8333 | + needed_cap = WF_MGMT_CAP_IBSS; /* 2, we require Ad-Hoc */ | ||
| 8334 | + break; | ||
| 8335 | + case ACX_MODE_2_STA: | ||
| 8336 | + needed_cap = WF_MGMT_CAP_ESS; /* 1, we require Managed */ | ||
| 8337 | + break; | ||
| 8338 | + default: | ||
| 8339 | + printk("acx: driver bug: mode=%d in complete_scan()\n", adev->mode); | ||
| 8340 | + dump_stack(); | ||
| 8341 | + goto end; | ||
| 8342 | + } | ||
| 8343 | + | ||
| 8344 | + acx_lock(adev, flags); | ||
| 8345 | + | ||
| 8346 | + /* TODO: sta_iterator hiding implementation would be nice here... */ | ||
| 8347 | + | ||
| 8348 | + for (i = 0; i < VEC_SIZE(adev->sta_list); i++) { | ||
| 8349 | + bss = &adev->sta_list[i]; | ||
| 8350 | + if (!bss->used) continue; | ||
| 8351 | + | ||
| 8352 | + | ||
| 8353 | + log(L_ASSOC, "scan table: SSID=\"%s\" CH=%d SIR=%d SNR=%d\n", | ||
| 8354 | + bss->essid, bss->channel, bss->sir, bss->snr); | ||
| 8355 | + | ||
| 8356 | + if (!mac_is_bcast(adev->ap)) | ||
| 8357 | + if (!mac_is_equal(bss->bssid, adev->ap)) | ||
| 8358 | + continue; /* keep looking */ | ||
| 8359 | + | ||
| 8360 | + /* broken peer with no mode flags set? */ | ||
| 8361 | + if (unlikely(!(bss->cap_info & (WF_MGMT_CAP_ESS | WF_MGMT_CAP_IBSS)))) { | ||
| 8362 | + printk("%s: strange peer "MACSTR" found with " | ||
| 8363 | + "neither ESS (AP) nor IBSS (Ad-Hoc) " | ||
| 8364 | + "capability - skipped\n", | ||
| 8365 | + adev->ndev->name, MAC(bss->address)); | ||
| 8366 | + continue; | ||
| 8367 | + } | ||
| 8368 | + log(L_ASSOC, "peer_cap 0x%04X, needed_cap 0x%04X\n", | ||
| 8369 | + bss->cap_info, needed_cap); | ||
| 8370 | + | ||
| 8371 | + /* does peer station support what we need? */ | ||
| 8372 | + if ((bss->cap_info & needed_cap) != needed_cap) | ||
| 8373 | + continue; /* keep looking */ | ||
| 8374 | + | ||
| 8375 | + /* strange peer with NO basic rates?! */ | ||
| 8376 | + if (unlikely(!bss->rate_bas)) { | ||
| 8377 | + printk("%s: strange peer "MACSTR" with empty rate set " | ||
| 8378 | + "- skipped\n", | ||
| 8379 | + adev->ndev->name, MAC(bss->address)); | ||
| 8380 | + continue; | ||
| 8381 | + } | ||
| 8382 | + | ||
| 8383 | + /* do we support all basic rates of this peer? */ | ||
| 8384 | + if ((bss->rate_bas & adev->rate_oper) != bss->rate_bas) { | ||
| 8385 | +/* we probably need to have all rates as operational rates, | ||
| 8386 | + even in case of an 11M-only configuration */ | ||
| 8387 | +#ifdef THIS_IS_TROUBLESOME | ||
| 8388 | + printk("%s: peer "MACSTR": incompatible basic rates " | ||
| 8389 | + "(AP requests 0x%04X, we have 0x%04X) " | ||
| 8390 | + "- skipped\n", | ||
| 8391 | + adev->ndev->name, MAC(bss->address), | ||
| 8392 | + bss->rate_bas, adev->rate_oper); | ||
| 8393 | + continue; | ||
| 8394 | +#else | ||
| 8395 | + printk("%s: peer "MACSTR": incompatible basic rates " | ||
| 8396 | + "(AP requests 0x%04X, we have 0x%04X). " | ||
| 8397 | + "Considering anyway...\n", | ||
| 8398 | + adev->ndev->name, MAC(bss->address), | ||
| 8399 | + bss->rate_bas, adev->rate_oper); | ||
| 8400 | +#endif | ||
| 8401 | + } | ||
| 8402 | + | ||
| 8403 | + if ( !(adev->reg_dom_chanmask & (1<<(bss->channel-1))) ) { | ||
| 8404 | + printk("%s: warning: peer "MACSTR" is on channel %d " | ||
| 8405 | + "outside of channel range of current " | ||
| 8406 | + "regulatory domain - couldn't join " | ||
| 8407 | + "even if other settings match. " | ||
| 8408 | + "You might want to adapt your config\n", | ||
| 8409 | + adev->ndev->name, MAC(bss->address), | ||
| 8410 | + bss->channel); | ||
| 8411 | + continue; /* keep looking */ | ||
| 8412 | + } | ||
| 8413 | + | ||
| 8414 | + if (!adev->essid_active || !strcmp(bss->essid, adev->essid)) { | ||
| 8415 | + log(L_ASSOC, | ||
| 8416 | + "found station with matching ESSID! ('%s' " | ||
| 8417 | + "station, '%s' config)\n", | ||
| 8418 | + bss->essid, | ||
| 8419 | + (adev->essid_active) ? adev->essid : "[any]"); | ||
| 8420 | + /* TODO: continue looking for peer with better SNR */ | ||
| 8421 | + bss->used = CLIENT_JOIN_CANDIDATE; | ||
| 8422 | + idx_found = i; | ||
| 8423 | + | ||
| 8424 | + /* stop searching if this station is | ||
| 8425 | + * on the current channel, otherwise | ||
| 8426 | + * keep looking for an even better match */ | ||
| 8427 | + if (bss->channel == adev->channel) | ||
| 8428 | + break; | ||
| 8429 | + } else | ||
| 8430 | + if (is_hidden_essid(bss->essid)) { | ||
| 8431 | + /* hmm, station with empty or single-space SSID: | ||
| 8432 | + * using hidden SSID broadcast? | ||
| 8433 | + */ | ||
| 8434 | + /* This behaviour is broken: which AP from zillion | ||
| 8435 | + ** of APs with hidden SSID you'd try? | ||
| 8436 | + ** We should use Probe requests to get Probe responses | ||
| 8437 | + ** and check for real SSID (are those never hidden?) */ | ||
| 8438 | + bss->used = CLIENT_JOIN_CANDIDATE; | ||
| 8439 | + if (idx_found == -1) | ||
| 8440 | + idx_found = i; | ||
| 8441 | + log(L_ASSOC, "found station with empty or " | ||
| 8442 | + "single-space (hidden) SSID, considering " | ||
| 8443 | + "for assoc attempt\n"); | ||
| 8444 | + /* ...and keep looking for better matches */ | ||
| 8445 | + } else { | ||
| 8446 | + log(L_ASSOC, "ESSID doesn't match! ('%s' " | ||
| 8447 | + "station, '%s' config)\n", | ||
| 8448 | + bss->essid, | ||
| 8449 | + (adev->essid_active) ? adev->essid : "[any]"); | ||
| 8450 | + } | ||
| 8451 | + } | ||
| 8452 | + | ||
| 8453 | + /* TODO: iterate thru join candidates instead */ | ||
| 8454 | + /* TODO: rescan if not associated within some timeout */ | ||
| 8455 | + if (idx_found != -1) { | ||
| 8456 | + char *essid_src; | ||
| 8457 | + size_t essid_len; | ||
| 8458 | + | ||
| 8459 | + bss = &adev->sta_list[idx_found]; | ||
| 8460 | + adev->ap_client = bss; | ||
| 8461 | + | ||
| 8462 | + if (is_hidden_essid(bss->essid)) { | ||
| 8463 | + /* if the ESSID of the station we found is empty | ||
| 8464 | + * (no broadcast), then use user-configured ESSID | ||
| 8465 | + * instead */ | ||
| 8466 | + essid_src = adev->essid; | ||
| 8467 | + essid_len = adev->essid_len; | ||
| 8468 | + } else { | ||
| 8469 | + essid_src = bss->essid; | ||
| 8470 | + essid_len = strlen(bss->essid); | ||
| 8471 | + } | ||
| 8472 | + | ||
| 8473 | + acx_update_capabilities(adev); | ||
| 8474 | + | ||
| 8475 | + memcpy(adev->essid_for_assoc, essid_src, essid_len); | ||
| 8476 | + adev->essid_for_assoc[essid_len] = '\0'; | ||
| 8477 | + adev->channel = bss->channel; | ||
| 8478 | + MAC_COPY(adev->bssid, bss->bssid); | ||
| 8479 | + | ||
| 8480 | + bss->rate_cfg = (bss->rate_cap & adev->rate_oper); | ||
| 8481 | + bss->rate_cur = 1 << lowest_bit(bss->rate_cfg); | ||
| 8482 | + bss->rate_100 = acx_rate111to100(bss->rate_cur); | ||
| 8483 | + | ||
| 8484 | + acxlog_mac(L_ASSOC, | ||
| 8485 | + "matching station found: ", adev->bssid, ", joining\n"); | ||
| 8486 | + | ||
| 8487 | + /* TODO: do we need to switch to the peer's channel first? */ | ||
| 8488 | + | ||
| 8489 | + if (ACX_MODE_0_ADHOC == adev->mode) { | ||
| 8490 | + acx_set_status(adev, ACX_STATUS_4_ASSOCIATED); | ||
| 8491 | + } else { | ||
| 8492 | + acx_l_transmit_authen1(adev); | ||
| 8493 | + acx_set_status(adev, ACX_STATUS_2_WAIT_AUTH); | ||
| 8494 | + } | ||
| 8495 | + } else { /* idx_found == -1 */ | ||
| 8496 | + /* uh oh, no station found in range */ | ||
| 8497 | + if (ACX_MODE_0_ADHOC == adev->mode) { | ||
| 8498 | + printk("%s: no matching station found in range, " | ||
| 8499 | + "generating our own IBSS instead\n", | ||
| 8500 | + adev->ndev->name); | ||
| 8501 | + /* we do it the HostAP way: */ | ||
| 8502 | + MAC_COPY(adev->bssid, adev->dev_addr); | ||
| 8503 | + adev->bssid[0] |= 0x02; /* 'local assigned addr' bit */ | ||
| 8504 | + /* add IBSS bit to our caps... */ | ||
| 8505 | + acx_update_capabilities(adev); | ||
| 8506 | + acx_set_status(adev, ACX_STATUS_4_ASSOCIATED); | ||
| 8507 | + /* In order to cmd_join be called below */ | ||
| 8508 | + idx_found = 0; | ||
| 8509 | + } else { | ||
| 8510 | + /* we shall scan again, AP can be | ||
| 8511 | + ** just temporarily powered off */ | ||
| 8512 | + log(L_ASSOC, | ||
| 8513 | + "no matching station found in range yet\n"); | ||
| 8514 | + acx_set_status(adev, ACX_STATUS_1_SCANNING); | ||
| 8515 | + result = NOT_OK; | ||
| 8516 | + } | ||
| 8517 | + } | ||
| 8518 | + | ||
| 8519 | + acx_unlock(adev, flags); | ||
| 8520 | + | ||
| 8521 | + if (idx_found != -1) { | ||
| 8522 | + if (ACX_MODE_0_ADHOC == adev->mode) { | ||
| 8523 | + /* need to update channel in beacon template */ | ||
| 8524 | + SET_BIT(adev->set_mask, SET_TEMPLATES); | ||
| 8525 | + if (ACX_STATE_IFACE_UP & adev->dev_state_mask) | ||
| 8526 | + acx_s_update_card_settings(adev); | ||
| 8527 | + } | ||
| 8528 | + /* Inform firmware on our decision to start or join BSS */ | ||
| 8529 | + acx_s_cmd_join_bssid(adev, adev->bssid); | ||
| 8530 | + } | ||
| 8531 | + | ||
| 8532 | +end: | ||
| 8533 | + FN_EXIT1(result); | ||
| 8534 | + return result; | ||
| 8535 | +} | ||
| 8536 | + | ||
| 8537 | + | ||
| 8538 | +/*********************************************************************** | ||
| 8539 | +** acx_s_read_fw | ||
| 8540 | +** | ||
| 8541 | +** Loads a firmware image | ||
| 8542 | +** | ||
| 8543 | +** Returns: | ||
| 8544 | +** 0 unable to load file | ||
| 8545 | +** pointer to firmware success | ||
| 8546 | +*/ | ||
| 8547 | +firmware_image_t* | ||
| 8548 | +acx_s_read_fw(struct device *dev, const char *file, u32 *size) | ||
| 8549 | +{ | ||
| 8550 | + firmware_image_t *res; | ||
| 8551 | + const struct firmware *fw_entry; | ||
| 8552 | + | ||
| 8553 | + res = NULL; | ||
| 8554 | + log(L_INIT, "requesting firmware image '%s'\n", file); | ||
| 8555 | + if (!request_firmware(&fw_entry, file, dev)) { | ||
| 8556 | + *size = 8; | ||
| 8557 | + if (fw_entry->size >= 8) | ||
| 8558 | + *size = 8 + le32_to_cpu(*(u32 *)(fw_entry->data + 4)); | ||
| 8559 | + if (fw_entry->size != *size) { | ||
| 8560 | + printk("acx: firmware size does not match " | ||
| 8561 | + "firmware header: %d != %d, " | ||
| 8562 | + "aborting fw upload\n", | ||
| 8563 | + (int) fw_entry->size, (int) *size); | ||
| 8564 | + goto release_ret; | ||
| 8565 | + } | ||
| 8566 | + res = vmalloc(*size); | ||
| 8567 | + if (!res) { | ||
| 8568 | + printk("acx: no memory for firmware " | ||
| 8569 | + "(%u bytes)\n", *size); | ||
| 8570 | + goto release_ret; | ||
| 8571 | + } | ||
| 8572 | + memcpy(res, fw_entry->data, fw_entry->size); | ||
| 8573 | +release_ret: | ||
| 8574 | + release_firmware(fw_entry); | ||
| 8575 | + return res; | ||
| 8576 | + } | ||
| 8577 | + printk("acx: firmware image '%s' was not provided. " | ||
| 8578 | + "Check your hotplug scripts\n", file); | ||
| 8579 | + | ||
| 8580 | + /* checksum will be verified in write_fw, so don't bother here */ | ||
| 8581 | + return res; | ||
| 8582 | +} | ||
| 8583 | + | ||
| 8584 | + | ||
| 8585 | +/*********************************************************************** | ||
| 8586 | +** acx_s_set_wepkey | ||
| 8587 | +*/ | ||
| 8588 | +static void | ||
| 8589 | +acx100_s_set_wepkey(acx_device_t *adev) | ||
| 8590 | +{ | ||
| 8591 | + ie_dot11WEPDefaultKey_t dk; | ||
| 8592 | + int i; | ||
| 8593 | + | ||
| 8594 | + for (i = 0; i < DOT11_MAX_DEFAULT_WEP_KEYS; i++) { | ||
| 8595 | + if (adev->wep_keys[i].size != 0) { | ||
| 8596 | + log(L_INIT, "setting WEP key: %d with " | ||
| 8597 | + "total size: %d\n", i, (int) adev->wep_keys[i].size); | ||
| 8598 | + dk.action = 1; | ||
| 8599 | + dk.keySize = adev->wep_keys[i].size; | ||
| 8600 | + dk.defaultKeyNum = i; | ||
| 8601 | + memcpy(dk.key, adev->wep_keys[i].key, dk.keySize); | ||
| 8602 | + acx_s_configure(adev, &dk, ACX100_IE_DOT11_WEP_DEFAULT_KEY_WRITE); | ||
| 8603 | + } | ||
| 8604 | + } | ||
| 8605 | +} | ||
| 8606 | + | ||
| 8607 | +static void | ||
| 8608 | +acx111_s_set_wepkey(acx_device_t *adev) | ||
| 8609 | +{ | ||
| 8610 | + acx111WEPDefaultKey_t dk; | ||
| 8611 | + int i; | ||
| 8612 | + | ||
| 8613 | + for (i = 0; i < DOT11_MAX_DEFAULT_WEP_KEYS; i++) { | ||
| 8614 | + if (adev->wep_keys[i].size != 0) { | ||
| 8615 | + log(L_INIT, "setting WEP key: %d with " | ||
| 8616 | + "total size: %d\n", i, (int) adev->wep_keys[i].size); | ||
| 8617 | + memset(&dk, 0, sizeof(dk)); | ||
| 8618 | + dk.action = cpu_to_le16(1); /* "add key"; yes, that's a 16bit value */ | ||
| 8619 | + dk.keySize = adev->wep_keys[i].size; | ||
| 8620 | + | ||
| 8621 | + /* are these two lines necessary? */ | ||
| 8622 | + dk.type = 0; /* default WEP key */ | ||
| 8623 | + dk.index = 0; /* ignored when setting default key */ | ||
| 8624 | + | ||
| 8625 | + dk.defaultKeyNum = i; | ||
| 8626 | + memcpy(dk.key, adev->wep_keys[i].key, dk.keySize); | ||
| 8627 | + acx_s_issue_cmd(adev, ACX1xx_CMD_WEP_MGMT, &dk, sizeof(dk)); | ||
| 8628 | + } | ||
| 8629 | + } | ||
| 8630 | +} | ||
| 8631 | + | ||
| 8632 | +static void | ||
| 8633 | +acx_s_set_wepkey(acx_device_t *adev) | ||
| 8634 | +{ | ||
| 8635 | + if (IS_ACX111(adev)) | ||
| 8636 | + acx111_s_set_wepkey(adev); | ||
| 8637 | + else | ||
| 8638 | + acx100_s_set_wepkey(adev); | ||
| 8639 | +} | ||
| 8640 | + | ||
| 8641 | + | ||
| 8642 | +/*********************************************************************** | ||
| 8643 | +** acx100_s_init_wep | ||
| 8644 | +** | ||
| 8645 | +** FIXME: this should probably be moved into the new card settings | ||
| 8646 | +** management, but since we're also modifying the memory map layout here | ||
| 8647 | +** due to the WEP key space we want, we should take care... | ||
| 8648 | +*/ | ||
| 8649 | +static int | ||
| 8650 | +acx100_s_init_wep(acx_device_t *adev) | ||
| 8651 | +{ | ||
| 8652 | + acx100_ie_wep_options_t options; | ||
| 8653 | + ie_dot11WEPDefaultKeyID_t dk; | ||
| 8654 | + acx_ie_memmap_t pt; | ||
| 8655 | + int res = NOT_OK; | ||
| 8656 | + | ||
| 8657 | + FN_ENTER; | ||
| 8658 | + | ||
| 8659 | + if (OK != acx_s_interrogate(adev, &pt, ACX1xx_IE_MEMORY_MAP)) { | ||
| 8660 | + goto fail; | ||
| 8661 | + } | ||
| 8662 | + | ||
| 8663 | + log(L_DEBUG, "CodeEnd:%X\n", pt.CodeEnd); | ||
| 8664 | + | ||
| 8665 | + pt.WEPCacheStart = cpu_to_le32(le32_to_cpu(pt.CodeEnd) + 0x4); | ||
| 8666 | + pt.WEPCacheEnd = cpu_to_le32(le32_to_cpu(pt.CodeEnd) + 0x4); | ||
| 8667 | + | ||
| 8668 | + if (OK != acx_s_configure(adev, &pt, ACX1xx_IE_MEMORY_MAP)) { | ||
| 8669 | + goto fail; | ||
| 8670 | + } | ||
| 8671 | + | ||
| 8672 | + /* let's choose maximum setting: 4 default keys, plus 10 other keys: */ | ||
| 8673 | + options.NumKeys = cpu_to_le16(DOT11_MAX_DEFAULT_WEP_KEYS + 10); | ||
| 8674 | + options.WEPOption = 0x00; | ||
| 8675 | + | ||
| 8676 | + log(L_ASSOC, "%s: writing WEP options\n", __func__); | ||
| 8677 | + acx_s_configure(adev, &options, ACX100_IE_WEP_OPTIONS); | ||
| 8678 | + | ||
| 8679 | + acx100_s_set_wepkey(adev); | ||
| 8680 | + | ||
| 8681 | + if (adev->wep_keys[adev->wep_current_index].size != 0) { | ||
| 8682 | + log(L_ASSOC, "setting active default WEP key number: %d\n", | ||
| 8683 | + adev->wep_current_index); | ||
| 8684 | + dk.KeyID = adev->wep_current_index; | ||
| 8685 | + acx_s_configure(adev, &dk, ACX1xx_IE_DOT11_WEP_DEFAULT_KEY_SET); /* 0x1010 */ | ||
| 8686 | + } | ||
| 8687 | + /* FIXME!!! wep_key_struct is filled nowhere! But adev | ||
| 8688 | + * is initialized to 0, and we don't REALLY need those keys either */ | ||
| 8689 | +/* for (i = 0; i < 10; i++) { | ||
| 8690 | + if (adev->wep_key_struct[i].len != 0) { | ||
| 8691 | + MAC_COPY(wep_mgmt.MacAddr, adev->wep_key_struct[i].addr); | ||
| 8692 | + wep_mgmt.KeySize = cpu_to_le16(adev->wep_key_struct[i].len); | ||
| 8693 | + memcpy(&wep_mgmt.Key, adev->wep_key_struct[i].key, le16_to_cpu(wep_mgmt.KeySize)); | ||
| 8694 | + wep_mgmt.Action = cpu_to_le16(1); | ||
| 8695 | + log(L_ASSOC, "writing WEP key %d (len %d)\n", i, le16_to_cpu(wep_mgmt.KeySize)); | ||
| 8696 | + if (OK == acx_s_issue_cmd(adev, ACX1xx_CMD_WEP_MGMT, &wep_mgmt, sizeof(wep_mgmt))) { | ||
| 8697 | + adev->wep_key_struct[i].index = i; | ||
| 8698 | + } | ||
| 8699 | + } | ||
| 8700 | + } | ||
| 8701 | +*/ | ||
| 8702 | + | ||
| 8703 | + /* now retrieve the updated WEPCacheEnd pointer... */ | ||
| 8704 | + if (OK != acx_s_interrogate(adev, &pt, ACX1xx_IE_MEMORY_MAP)) { | ||
| 8705 | + printk("%s: ACX1xx_IE_MEMORY_MAP read #2 FAILED\n", | ||
| 8706 | + adev->ndev->name); | ||
| 8707 | + goto fail; | ||
| 8708 | + } | ||
| 8709 | + /* ...and tell it to start allocating templates at that location */ | ||
| 8710 | + /* (no endianness conversion needed) */ | ||
| 8711 | + pt.PacketTemplateStart = pt.WEPCacheEnd; | ||
| 8712 | + | ||
| 8713 | + if (OK != acx_s_configure(adev, &pt, ACX1xx_IE_MEMORY_MAP)) { | ||
| 8714 | + printk("%s: ACX1xx_IE_MEMORY_MAP write #2 FAILED\n", | ||
| 8715 | + adev->ndev->name); | ||
| 8716 | + goto fail; | ||
| 8717 | + } | ||
| 8718 | + res = OK; | ||
| 8719 | + | ||
| 8720 | +fail: | ||
| 8721 | + FN_EXIT1(res); | ||
| 8722 | + return res; | ||
| 8723 | +} | ||
| 8724 | + | ||
| 8725 | + | ||
| 8726 | +static int | ||
| 8727 | +acx_s_init_max_template_generic(acx_device_t *adev, unsigned int len, unsigned int cmd) | ||
| 8728 | +{ | ||
| 8729 | + int res; | ||
| 8730 | + union { | ||
| 8731 | + acx_template_nullframe_t null; | ||
| 8732 | + acx_template_beacon_t b; | ||
| 8733 | + acx_template_tim_t tim; | ||
| 8734 | + acx_template_probereq_t preq; | ||
| 8735 | + acx_template_proberesp_t presp; | ||
| 8736 | + } templ; | ||
| 8737 | + | ||
| 8738 | + memset(&templ, 0, len); | ||
| 8739 | + templ.null.size = cpu_to_le16(len - 2); | ||
| 8740 | + res = acx_s_issue_cmd(adev, cmd, &templ, len); | ||
| 8741 | + return res; | ||
| 8742 | +} | ||
| 8743 | + | ||
| 8744 | +static inline int | ||
| 8745 | +acx_s_init_max_null_data_template(acx_device_t *adev) | ||
| 8746 | +{ | ||
| 8747 | + return acx_s_init_max_template_generic( | ||
| 8748 | + adev, sizeof(acx_template_nullframe_t), ACX1xx_CMD_CONFIG_NULL_DATA | ||
| 8749 | + ); | ||
| 8750 | +} | ||
| 8751 | + | ||
| 8752 | +static inline int | ||
| 8753 | +acx_s_init_max_beacon_template(acx_device_t *adev) | ||
| 8754 | +{ | ||
| 8755 | + return acx_s_init_max_template_generic( | ||
| 8756 | + adev, sizeof(acx_template_beacon_t), ACX1xx_CMD_CONFIG_BEACON | ||
| 8757 | + ); | ||
| 8758 | +} | ||
| 8759 | + | ||
| 8760 | +static inline int | ||
| 8761 | +acx_s_init_max_tim_template(acx_device_t *adev) | ||
| 8762 | +{ | ||
| 8763 | + return acx_s_init_max_template_generic( | ||
| 8764 | + adev, sizeof(acx_template_tim_t), ACX1xx_CMD_CONFIG_TIM | ||
| 8765 | + ); | ||
| 8766 | +} | ||
| 8767 | + | ||
| 8768 | +static inline int | ||
| 8769 | +acx_s_init_max_probe_response_template(acx_device_t *adev) | ||
| 8770 | +{ | ||
| 8771 | + return acx_s_init_max_template_generic( | ||
| 8772 | + adev, sizeof(acx_template_proberesp_t), ACX1xx_CMD_CONFIG_PROBE_RESPONSE | ||
| 8773 | + ); | ||
| 8774 | +} | ||
| 8775 | + | ||
| 8776 | +static inline int | ||
| 8777 | +acx_s_init_max_probe_request_template(acx_device_t *adev) | ||
| 8778 | +{ | ||
| 8779 | + return acx_s_init_max_template_generic( | ||
| 8780 | + adev, sizeof(acx_template_probereq_t), ACX1xx_CMD_CONFIG_PROBE_REQUEST | ||
| 8781 | + ); | ||
| 8782 | +} | ||
| 8783 | + | ||
| 8784 | +/*********************************************************************** | ||
| 8785 | +** acx_s_set_tim_template | ||
| 8786 | +** | ||
| 8787 | +** FIXME: In full blown driver we will regularly update partial virtual bitmap | ||
| 8788 | +** by calling this function | ||
| 8789 | +** (it can be done by irq handler on each DTIM irq or by timer...) | ||
| 8790 | + | ||
| 8791 | +[802.11 7.3.2.6] TIM information element: | ||
| 8792 | +- 1 EID | ||
| 8793 | +- 1 Length | ||
| 8794 | +1 1 DTIM Count | ||
| 8795 | + indicates how many beacons (including this) appear before next DTIM | ||
| 8796 | + (0=this one is a DTIM) | ||
| 8797 | +2 1 DTIM Period | ||
| 8798 | + number of beacons between successive DTIMs | ||
| 8799 | + (0=reserved, 1=all TIMs are DTIMs, 2=every other, etc) | ||
| 8800 | +3 1 Bitmap Control | ||
| 8801 | + bit0: Traffic Indicator bit associated with Assoc ID 0 (Bcast AID?) | ||
| 8802 | + set to 1 in TIM elements with a value of 0 in the DTIM Count field | ||
| 8803 | + when one or more broadcast or multicast frames are buffered at the AP. | ||
| 8804 | + bit1-7: Bitmap Offset (logically Bitmap_Offset = Bitmap_Control & 0xFE). | ||
| 8805 | +4 n Partial Virtual Bitmap | ||
| 8806 | + Visible part of traffic-indication bitmap. | ||
| 8807 | + Full bitmap consists of 2008 bits (251 octets) such that bit number N | ||
| 8808 | + (0<=N<=2007) in the bitmap corresponds to bit number (N mod 8) | ||
| 8809 | + in octet number N/8 where the low-order bit of each octet is bit0, | ||
| 8810 | + and the high order bit is bit7. | ||
| 8811 | + Each set bit in virtual bitmap corresponds to traffic buffered by AP | ||
| 8812 | + for a specific station (with corresponding AID?). | ||
| 8813 | + Partial Virtual Bitmap shows a part of bitmap which has non-zero. | ||
| 8814 | + Bitmap Offset is a number of skipped zero octets (see above). | ||
| 8815 | + 'Missing' octets at the tail are also assumed to be zero. | ||
| 8816 | + Example: Length=6, Bitmap_Offset=2, Partial_Virtual_Bitmap=55 55 55 | ||
| 8817 | + This means that traffic-indication bitmap is: | ||
| 8818 | + 00000000 00000000 01010101 01010101 01010101 00000000 00000000... | ||
| 8819 | + (is bit0 in the map is always 0 and real value is in Bitmap Control bit0?) | ||
| 8820 | +*/ | ||
| 8821 | +static int | ||
| 8822 | +acx_s_set_tim_template(acx_device_t *adev) | ||
| 8823 | +{ | ||
| 8824 | +/* For now, configure smallish test bitmap, all zero ("no pending data") */ | ||
| 8825 | + enum { bitmap_size = 5 }; | ||
| 8826 | + | ||
| 8827 | + acx_template_tim_t t; | ||
| 8828 | + int result; | ||
| 8829 | + | ||
| 8830 | + FN_ENTER; | ||
| 8831 | + | ||
| 8832 | + memset(&t, 0, sizeof(t)); | ||
| 8833 | + t.size = 5 + bitmap_size; /* eid+len+count+period+bmap_ctrl + bmap */ | ||
| 8834 | + t.tim_eid = WLAN_EID_TIM; | ||
| 8835 | + t.len = 3 + bitmap_size; /* count+period+bmap_ctrl + bmap */ | ||
| 8836 | + result = acx_s_issue_cmd(adev, ACX1xx_CMD_CONFIG_TIM, &t, sizeof(t)); | ||
| 8837 | + FN_EXIT1(result); | ||
| 8838 | + return result; | ||
| 8839 | +} | ||
| 8840 | + | ||
| 8841 | + | ||
| 8842 | +/*********************************************************************** | ||
| 8843 | +** acx_fill_beacon_or_proberesp_template | ||
| 8844 | +** | ||
| 8845 | +** For frame format info, please see 802.11-1999.pdf item 7.2.3.9 and below!! | ||
| 8846 | +** | ||
| 8847 | +** NB: we use the fact that | ||
| 8848 | +** struct acx_template_proberesp and struct acx_template_beacon are the same | ||
| 8849 | +** (well, almost...) | ||
| 8850 | +** | ||
| 8851 | +** [802.11] Beacon's body consist of these IEs: | ||
| 8852 | +** 1 Timestamp | ||
| 8853 | +** 2 Beacon interval | ||
| 8854 | +** 3 Capability information | ||
| 8855 | +** 4 SSID | ||
| 8856 | +** 5 Supported rates (up to 8 rates) | ||
| 8857 | +** 6 FH Parameter Set (frequency-hopping PHYs only) | ||
| 8858 | +** 7 DS Parameter Set (direct sequence PHYs only) | ||
| 8859 | +** 8 CF Parameter Set (only if PCF is supported) | ||
| 8860 | +** 9 IBSS Parameter Set (ad-hoc only) | ||
| 8861 | +** | ||
| 8862 | +** Beacon only: | ||
| 8863 | +** 10 TIM (AP only) (see 802.11 7.3.2.6) | ||
| 8864 | +** 11 Country Information (802.11d) | ||
| 8865 | +** 12 FH Parameters (802.11d) | ||
| 8866 | +** 13 FH Pattern Table (802.11d) | ||
| 8867 | +** ... (?!! did not yet find relevant PDF file... --vda) | ||
| 8868 | +** 19 ERP Information (extended rate PHYs) | ||
| 8869 | +** 20 Extended Supported Rates (if more than 8 rates) | ||
| 8870 | +** | ||
| 8871 | +** Proberesp only: | ||
| 8872 | +** 10 Country information (802.11d) | ||
| 8873 | +** 11 FH Parameters (802.11d) | ||
| 8874 | +** 12 FH Pattern Table (802.11d) | ||
| 8875 | +** 13-n Requested information elements (802.11d) | ||
| 8876 | +** ???? | ||
| 8877 | +** 18 ERP Information (extended rate PHYs) | ||
| 8878 | +** 19 Extended Supported Rates (if more than 8 rates) | ||
| 8879 | +*/ | ||
| 8880 | +static int | ||
| 8881 | +acx_fill_beacon_or_proberesp_template(acx_device_t *adev, | ||
| 8882 | + struct acx_template_beacon *templ, | ||
| 8883 | + u16 fc /* in host order! */) | ||
| 8884 | +{ | ||
| 8885 | + int len; | ||
| 8886 | + u8 *p; | ||
| 8887 | + | ||
| 8888 | + FN_ENTER; | ||
| 8889 | + | ||
| 8890 | + memset(templ, 0, sizeof(*templ)); | ||
| 8891 | + MAC_BCAST(templ->da); | ||
| 8892 | + MAC_COPY(templ->sa, adev->dev_addr); | ||
| 8893 | + MAC_COPY(templ->bssid, adev->bssid); | ||
| 8894 | + | ||
| 8895 | + templ->beacon_interval = cpu_to_le16(adev->beacon_interval); | ||
| 8896 | + acx_update_capabilities(adev); | ||
| 8897 | + templ->cap = cpu_to_le16(adev->capabilities); | ||
| 8898 | + | ||
| 8899 | + p = templ->variable; | ||
| 8900 | + p = wlan_fill_ie_ssid(p, adev->essid_len, adev->essid); | ||
| 8901 | + p = wlan_fill_ie_rates(p, adev->rate_supported_len, adev->rate_supported); | ||
| 8902 | + p = wlan_fill_ie_ds_parms(p, adev->channel); | ||
| 8903 | + /* NB: should go AFTER tim, but acx seem to keep tim last always */ | ||
| 8904 | + p = wlan_fill_ie_rates_ext(p, adev->rate_supported_len, adev->rate_supported); | ||
| 8905 | + | ||
| 8906 | + switch (adev->mode) { | ||
| 8907 | + case ACX_MODE_0_ADHOC: | ||
| 8908 | + /* ATIM window */ | ||
| 8909 | + p = wlan_fill_ie_ibss_parms(p, 0); break; | ||
| 8910 | + case ACX_MODE_3_AP: | ||
| 8911 | + /* TIM IE is set up as separate template */ | ||
| 8912 | + break; | ||
| 8913 | + } | ||
| 8914 | + | ||
| 8915 | + len = p - (u8*)templ; | ||
| 8916 | + templ->fc = cpu_to_le16(WF_FTYPE_MGMT | fc); | ||
| 8917 | + /* - 2: do not count 'u16 size' field */ | ||
| 8918 | + templ->size = cpu_to_le16(len - 2); | ||
| 8919 | + | ||
| 8920 | + FN_EXIT1(len); | ||
| 8921 | + return len; | ||
| 8922 | +} | ||
| 8923 | + | ||
| 8924 | + | ||
| 8925 | +#if POWER_SAVE_80211 | ||
| 8926 | +/*********************************************************************** | ||
| 8927 | +** acx_s_set_null_data_template | ||
| 8928 | +*/ | ||
| 8929 | +static int | ||
| 8930 | +acx_s_set_null_data_template(acx_device_t *adev) | ||
| 8931 | +{ | ||
| 8932 | + struct acx_template_nullframe b; | ||
| 8933 | + int result; | ||
| 8934 | + | ||
| 8935 | + FN_ENTER; | ||
| 8936 | + | ||
| 8937 | + /* memset(&b, 0, sizeof(b)); not needed, setting all members */ | ||
| 8938 | + | ||
| 8939 | + b.size = cpu_to_le16(sizeof(b) - 2); | ||
| 8940 | + b.hdr.fc = WF_FTYPE_MGMTi | WF_FSTYPE_NULLi; | ||
| 8941 | + b.hdr.dur = 0; | ||
| 8942 | + MAC_BCAST(b.hdr.a1); | ||
| 8943 | + MAC_COPY(b.hdr.a2, adev->dev_addr); | ||
| 8944 | + MAC_COPY(b.hdr.a3, adev->bssid); | ||
| 8945 | + b.hdr.seq = 0; | ||
| 8946 | + | ||
| 8947 | + result = acx_s_issue_cmd(adev, ACX1xx_CMD_CONFIG_NULL_DATA, &b, sizeof(b)); | ||
| 8948 | + | ||
| 8949 | + FN_EXIT1(result); | ||
| 8950 | + return result; | ||
| 8951 | +} | ||
| 8952 | +#endif | ||
| 8953 | + | ||
| 8954 | + | ||
| 8955 | +/*********************************************************************** | ||
| 8956 | +** acx_s_set_beacon_template | ||
| 8957 | +*/ | ||
| 8958 | +static int | ||
| 8959 | +acx_s_set_beacon_template(acx_device_t *adev) | ||
| 8960 | +{ | ||
| 8961 | + struct acx_template_beacon bcn; | ||
| 8962 | + int len, result; | ||
| 8963 | + | ||
| 8964 | + FN_ENTER; | ||
| 8965 | + | ||
| 8966 | + len = acx_fill_beacon_or_proberesp_template(adev, &bcn, WF_FSTYPE_BEACON); | ||
| 8967 | + result = acx_s_issue_cmd(adev, ACX1xx_CMD_CONFIG_BEACON, &bcn, len); | ||
| 8968 | + | ||
| 8969 | + FN_EXIT1(result); | ||
| 8970 | + return result; | ||
| 8971 | +} | ||
| 8972 | + | ||
| 8973 | + | ||
| 8974 | +/*********************************************************************** | ||
| 8975 | +** acx_s_set_probe_response_template | ||
| 8976 | +*/ | ||
| 8977 | +static int | ||
| 8978 | +acx_s_set_probe_response_template(acx_device_t *adev) | ||
| 8979 | +{ | ||
| 8980 | + struct acx_template_proberesp pr; | ||
| 8981 | + int len, result; | ||
| 8982 | + | ||
| 8983 | + FN_ENTER; | ||
| 8984 | + | ||
| 8985 | + len = acx_fill_beacon_or_proberesp_template(adev, &pr, WF_FSTYPE_PROBERESP); | ||
| 8986 | + result = acx_s_issue_cmd(adev, ACX1xx_CMD_CONFIG_PROBE_RESPONSE, &pr, len); | ||
| 8987 | + | ||
| 8988 | + FN_EXIT1(result); | ||
| 8989 | + return result; | ||
| 8990 | +} | ||
| 8991 | + | ||
| 8992 | + | ||
| 8993 | +/*********************************************************************** | ||
| 8994 | +** acx_s_init_packet_templates() | ||
| 8995 | +** | ||
| 8996 | +** NOTE: order is very important here, to have a correct memory layout! | ||
| 8997 | +** init templates: max Probe Request (station mode), max NULL data, | ||
| 8998 | +** max Beacon, max TIM, max Probe Response. | ||
| 8999 | +*/ | ||
| 9000 | +static int | ||
| 9001 | +acx_s_init_packet_templates(acx_device_t *adev) | ||
| 9002 | +{ | ||
| 9003 | + acx_ie_memmap_t mm; /* ACX100 only */ | ||
| 9004 | + int result = NOT_OK; | ||
| 9005 | + | ||
| 9006 | + FN_ENTER; | ||
| 9007 | + | ||
| 9008 | + log(L_DEBUG|L_INIT, "initializing max packet templates\n"); | ||
| 9009 | + | ||
| 9010 | + if (OK != acx_s_init_max_probe_request_template(adev)) | ||
| 9011 | + goto failed; | ||
| 9012 | + | ||
| 9013 | + if (OK != acx_s_init_max_null_data_template(adev)) | ||
| 9014 | + goto failed; | ||
| 9015 | + | ||
| 9016 | + if (OK != acx_s_init_max_beacon_template(adev)) | ||
| 9017 | + goto failed; | ||
| 9018 | + | ||
| 9019 | + if (OK != acx_s_init_max_tim_template(adev)) | ||
| 9020 | + goto failed; | ||
| 9021 | + | ||
| 9022 | + if (OK != acx_s_init_max_probe_response_template(adev)) | ||
| 9023 | + goto failed; | ||
| 9024 | + | ||
| 9025 | + if (IS_ACX111(adev)) { | ||
| 9026 | + /* ACX111 doesn't need the memory map magic below, | ||
| 9027 | + * and the other templates will be set later (acx_start) */ | ||
| 9028 | + result = OK; | ||
| 9029 | + goto success; | ||
| 9030 | + } | ||
| 9031 | + | ||
| 9032 | + /* ACX100 will have its TIM template set, | ||
| 9033 | + * and we also need to update the memory map */ | ||
| 9034 | + | ||
| 9035 | + if (OK != acx_s_set_tim_template(adev)) | ||
| 9036 | + goto failed_acx100; | ||
| 9037 | + | ||
| 9038 | + log(L_DEBUG, "sizeof(memmap)=%d bytes\n", (int)sizeof(mm)); | ||
| 9039 | + | ||
| 9040 | + if (OK != acx_s_interrogate(adev, &mm, ACX1xx_IE_MEMORY_MAP)) | ||
| 9041 | + goto failed_acx100; | ||
| 9042 | + | ||
| 9043 | + mm.QueueStart = cpu_to_le32(le32_to_cpu(mm.PacketTemplateEnd) + 4); | ||
| 9044 | + if (OK != acx_s_configure(adev, &mm, ACX1xx_IE_MEMORY_MAP)) | ||
| 9045 | + goto failed_acx100; | ||
| 9046 | + | ||
| 9047 | + result = OK; | ||
| 9048 | + goto success; | ||
| 9049 | + | ||
| 9050 | +failed_acx100: | ||
| 9051 | + log(L_DEBUG|L_INIT, | ||
| 9052 | + /* "cb=0x%X\n" */ | ||
| 9053 | + "ACXMemoryMap:\n" | ||
| 9054 | + ".CodeStart=0x%X\n" | ||
| 9055 | + ".CodeEnd=0x%X\n" | ||
| 9056 | + ".WEPCacheStart=0x%X\n" | ||
| 9057 | + ".WEPCacheEnd=0x%X\n" | ||
| 9058 | + ".PacketTemplateStart=0x%X\n" | ||
| 9059 | + ".PacketTemplateEnd=0x%X\n", | ||
| 9060 | + /* len, */ | ||
| 9061 | + le32_to_cpu(mm.CodeStart), | ||
| 9062 | + le32_to_cpu(mm.CodeEnd), | ||
| 9063 | + le32_to_cpu(mm.WEPCacheStart), | ||
| 9064 | + le32_to_cpu(mm.WEPCacheEnd), | ||
| 9065 | + le32_to_cpu(mm.PacketTemplateStart), | ||
| 9066 | + le32_to_cpu(mm.PacketTemplateEnd)); | ||
| 9067 | + | ||
| 9068 | +failed: | ||
| 9069 | + printk("%s: %s() FAILED\n", adev->ndev->name, __func__); | ||
| 9070 | + | ||
| 9071 | +success: | ||
| 9072 | + FN_EXIT1(result); | ||
| 9073 | + return result; | ||
| 9074 | +} | ||
| 9075 | + | ||
| 9076 | + | ||
| 9077 | +/*********************************************************************** | ||
| 9078 | +*/ | ||
| 9079 | +static int | ||
| 9080 | +acx_s_set_probe_request_template(acx_device_t *adev) | ||
| 9081 | +{ | ||
| 9082 | + struct acx_template_probereq probereq; | ||
| 9083 | + char *p; | ||
| 9084 | + int res; | ||
| 9085 | + int frame_len; | ||
| 9086 | + | ||
| 9087 | + FN_ENTER; | ||
| 9088 | + | ||
| 9089 | + memset(&probereq, 0, sizeof(probereq)); | ||
| 9090 | + | ||
| 9091 | + probereq.fc = WF_FTYPE_MGMTi | WF_FSTYPE_PROBEREQi; | ||
| 9092 | + MAC_BCAST(probereq.da); | ||
| 9093 | + MAC_COPY(probereq.sa, adev->dev_addr); | ||
| 9094 | + MAC_BCAST(probereq.bssid); | ||
| 9095 | + | ||
| 9096 | + p = probereq.variable; | ||
| 9097 | + p = wlan_fill_ie_ssid(p, adev->essid_len, adev->essid); | ||
| 9098 | + p = wlan_fill_ie_rates(p, adev->rate_supported_len, adev->rate_supported); | ||
| 9099 | + p = wlan_fill_ie_rates_ext(p, adev->rate_supported_len, adev->rate_supported); | ||
| 9100 | + frame_len = p - (char*)&probereq; | ||
| 9101 | + probereq.size = cpu_to_le16(frame_len - 2); | ||
| 9102 | + | ||
| 9103 | + res = acx_s_issue_cmd(adev, ACX1xx_CMD_CONFIG_PROBE_REQUEST, &probereq, frame_len); | ||
| 9104 | + FN_EXIT0; | ||
| 9105 | + return res; | ||
| 9106 | +} | ||
| 9107 | + | ||
| 9108 | + | ||
| 9109 | +/*********************************************************************** | ||
| 9110 | +** acx_s_init_mac | ||
| 9111 | +*/ | ||
| 9112 | +int | ||
| 9113 | +acx_s_init_mac(acx_device_t *adev) | ||
| 9114 | +{ | ||
| 9115 | + int result = NOT_OK; | ||
| 9116 | + | ||
| 9117 | + FN_ENTER; | ||
| 9118 | + | ||
| 9119 | + if (IS_ACX111(adev)) { | ||
| 9120 | + adev->ie_len = acx111_ie_len; | ||
| 9121 | + adev->ie_len_dot11 = acx111_ie_len_dot11; | ||
| 9122 | + } else { | ||
| 9123 | + adev->ie_len = acx100_ie_len; | ||
| 9124 | + adev->ie_len_dot11 = acx100_ie_len_dot11; | ||
| 9125 | + } | ||
| 9126 | + | ||
| 9127 | +#if defined (ACX_MEM) | ||
| 9128 | + adev->memblocksize = 256; /* 256 is default */ | ||
| 9129 | + /* try to load radio for both ACX100 and ACX111, since both | ||
| 9130 | + * chips have at least some firmware versions making use of an | ||
| 9131 | + * external radio module */ | ||
| 9132 | + acxmem_s_upload_radio(adev); | ||
| 9133 | +#else | ||
| 9134 | + if (IS_PCI(adev)) { | ||
| 9135 | + adev->memblocksize = 256; /* 256 is default */ | ||
| 9136 | + /* try to load radio for both ACX100 and ACX111, since both | ||
| 9137 | + * chips have at least some firmware versions making use of an | ||
| 9138 | + * external radio module */ | ||
| 9139 | + acxpci_s_upload_radio(adev); | ||
| 9140 | + } else { | ||
| 9141 | + adev->memblocksize = 128; | ||
| 9142 | + } | ||
| 9143 | +#endif | ||
| 9144 | + | ||
| 9145 | + if (IS_ACX111(adev)) { | ||
| 9146 | + /* for ACX111, the order is different from ACX100 | ||
| 9147 | + 1. init packet templates | ||
| 9148 | + 2. create station context and create dma regions | ||
| 9149 | + 3. init wep default keys | ||
| 9150 | + */ | ||
| 9151 | + if (OK != acx_s_init_packet_templates(adev)) | ||
| 9152 | + goto fail; | ||
| 9153 | + if (OK != acx111_s_create_dma_regions(adev)) { | ||
| 9154 | + printk("%s: acx111_create_dma_regions FAILED\n", | ||
| 9155 | + adev->ndev->name); | ||
| 9156 | + goto fail; | ||
| 9157 | + } | ||
| 9158 | + } else { | ||
| 9159 | + if (OK != acx100_s_init_wep(adev)) | ||
| 9160 | + goto fail; | ||
| 9161 | + if (OK != acx_s_init_packet_templates(adev)) | ||
| 9162 | + goto fail; | ||
| 9163 | + if (OK != acx100_s_create_dma_regions(adev)) { | ||
| 9164 | + printk("%s: acx100_create_dma_regions FAILED\n", | ||
| 9165 | + adev->ndev->name); | ||
| 9166 | + goto fail; | ||
| 9167 | + } | ||
| 9168 | + } | ||
| 9169 | + | ||
| 9170 | + MAC_COPY(adev->ndev->dev_addr, adev->dev_addr); | ||
| 9171 | + result = OK; | ||
| 9172 | + | ||
| 9173 | +fail: | ||
| 9174 | + if (result) | ||
| 9175 | + printk("acx: init_mac() FAILED\n"); | ||
| 9176 | + FN_EXIT1(result); | ||
| 9177 | + return result; | ||
| 9178 | +} | ||
| 9179 | + | ||
| 9180 | + | ||
| 9181 | +void | ||
| 9182 | +acx_s_set_sane_reg_domain(acx_device_t *adev, int do_set) | ||
| 9183 | +{ | ||
| 9184 | + unsigned mask; | ||
| 9185 | + | ||
| 9186 | + unsigned int i; | ||
| 9187 | + | ||
| 9188 | + for (i = 0; i < sizeof(acx_reg_domain_ids); i++) | ||
| 9189 | + if (acx_reg_domain_ids[i] == adev->reg_dom_id) | ||
| 9190 | + break; | ||
| 9191 | + | ||
| 9192 | + if (sizeof(acx_reg_domain_ids) == i) { | ||
| 9193 | + log(L_INIT, "Invalid or unsupported regulatory domain" | ||
| 9194 | + " 0x%02X specified, falling back to FCC (USA)!" | ||
| 9195 | + " Please report if this sounds fishy!\n", | ||
| 9196 | + adev->reg_dom_id); | ||
| 9197 | + i = 0; | ||
| 9198 | + adev->reg_dom_id = acx_reg_domain_ids[i]; | ||
| 9199 | + | ||
| 9200 | + /* since there was a mismatch, we need to force updating */ | ||
| 9201 | + do_set = 1; | ||
| 9202 | + } | ||
| 9203 | + | ||
| 9204 | + if (do_set) { | ||
| 9205 | + acx_ie_generic_t dom; | ||
| 9206 | + dom.m.bytes[0] = adev->reg_dom_id; | ||
| 9207 | + acx_s_configure(adev, &dom, ACX1xx_IE_DOT11_CURRENT_REG_DOMAIN); | ||
| 9208 | + } | ||
| 9209 | + | ||
| 9210 | + adev->reg_dom_chanmask = reg_domain_channel_masks[i]; | ||
| 9211 | + | ||
| 9212 | + mask = (1 << (adev->channel - 1)); | ||
| 9213 | + if (!(adev->reg_dom_chanmask & mask)) { | ||
| 9214 | + /* hmm, need to adjust our channel to reside within domain */ | ||
| 9215 | + mask = 1; | ||
| 9216 | + for (i = 1; i <= 14; i++) { | ||
| 9217 | + if (adev->reg_dom_chanmask & mask) { | ||
| 9218 | + printk("%s: adjusting selected channel from %d " | ||
| 9219 | + "to %d due to new regulatory domain\n", | ||
| 9220 | + adev->ndev->name, adev->channel, i); | ||
| 9221 | + adev->channel = i; | ||
| 9222 | + break; | ||
| 9223 | + } | ||
| 9224 | + mask <<= 1; | ||
| 9225 | + } | ||
| 9226 | + } | ||
| 9227 | +} | ||
| 9228 | + | ||
| 9229 | + | ||
| 9230 | +#if POWER_SAVE_80211 | ||
| 9231 | +static void | ||
| 9232 | +acx_s_update_80211_powersave_mode(acx_device_t *adev) | ||
| 9233 | +{ | ||
| 9234 | + /* merge both structs in a union to be able to have common code */ | ||
| 9235 | + union { | ||
| 9236 | + acx111_ie_powersave_t acx111; | ||
| 9237 | + acx100_ie_powersave_t acx100; | ||
| 9238 | + } pm; | ||
| 9239 | + | ||
| 9240 | + /* change 802.11 power save mode settings */ | ||
| 9241 | + log(L_INIT, "updating 802.11 power save mode settings: " | ||
| 9242 | + "wakeup_cfg 0x%02X, listen interval %u, " | ||
| 9243 | + "options 0x%02X, hangover period %u, " | ||
| 9244 | + "enhanced_ps_transition_time %u\n", | ||
| 9245 | + adev->ps_wakeup_cfg, adev->ps_listen_interval, | ||
| 9246 | + adev->ps_options, adev->ps_hangover_period, | ||
| 9247 | + adev->ps_enhanced_transition_time); | ||
| 9248 | + acx_s_interrogate(adev, &pm, ACX1xx_IE_POWER_MGMT); | ||
| 9249 | + log(L_INIT, "Previous PS mode settings: wakeup_cfg 0x%02X, " | ||
| 9250 | + "listen interval %u, options 0x%02X, " | ||
| 9251 | + "hangover period %u, " | ||
| 9252 | + "enhanced_ps_transition_time %u, beacon_rx_time %u\n", | ||
| 9253 | + pm.acx111.wakeup_cfg, | ||
| 9254 | + pm.acx111.listen_interval, | ||
| 9255 | + pm.acx111.options, | ||
| 9256 | + pm.acx111.hangover_period, | ||
| 9257 | + IS_ACX111(adev) ? | ||
| 9258 | + pm.acx111.enhanced_ps_transition_time | ||
| 9259 | + : pm.acx100.enhanced_ps_transition_time, | ||
| 9260 | + IS_ACX111(adev) ? | ||
| 9261 | + pm.acx111.beacon_rx_time | ||
| 9262 | + : (u32)-1 | ||
| 9263 | + ); | ||
| 9264 | + pm.acx111.wakeup_cfg = adev->ps_wakeup_cfg; | ||
| 9265 | + pm.acx111.listen_interval = adev->ps_listen_interval; | ||
| 9266 | + pm.acx111.options = adev->ps_options; | ||
| 9267 | + pm.acx111.hangover_period = adev->ps_hangover_period; | ||
| 9268 | + if (IS_ACX111(adev)) { | ||
| 9269 | + pm.acx111.beacon_rx_time = cpu_to_le32(adev->ps_beacon_rx_time); | ||
| 9270 | + pm.acx111.enhanced_ps_transition_time = cpu_to_le32(adev->ps_enhanced_transition_time); | ||
| 9271 | + } else { | ||
| 9272 | + pm.acx100.enhanced_ps_transition_time = cpu_to_le16(adev->ps_enhanced_transition_time); | ||
| 9273 | + } | ||
| 9274 | + acx_s_configure(adev, &pm, ACX1xx_IE_POWER_MGMT); | ||
| 9275 | + acx_s_interrogate(adev, &pm, ACX1xx_IE_POWER_MGMT); | ||
| 9276 | + log(L_INIT, "wakeup_cfg: 0x%02X\n", pm.acx111.wakeup_cfg); | ||
| 9277 | + acx_s_msleep(40); | ||
| 9278 | + acx_s_interrogate(adev, &pm, ACX1xx_IE_POWER_MGMT); | ||
| 9279 | + log(L_INIT, "wakeup_cfg: 0x%02X\n", pm.acx111.wakeup_cfg); | ||
| 9280 | + log(L_INIT, "power save mode change %s\n", | ||
| 9281 | + (pm.acx111.wakeup_cfg & PS_CFG_PENDING) ? "FAILED" : "was successful"); | ||
| 9282 | + /* FIXME: maybe verify via PS_CFG_PENDING bit here | ||
| 9283 | + * that power save mode change was successful. */ | ||
| 9284 | + /* FIXME: we shouldn't trigger a scan immediately after | ||
| 9285 | + * fiddling with power save mode (since the firmware is sending | ||
| 9286 | + * a NULL frame then). */ | ||
| 9287 | +} | ||
| 9288 | +#endif | ||
| 9289 | + | ||
| 9290 | + | ||
| 9291 | +/*********************************************************************** | ||
| 9292 | +** acx_s_update_card_settings | ||
| 9293 | +** | ||
| 9294 | +** Applies accumulated changes in various adev->xxxx members | ||
| 9295 | +** Called by ioctl commit handler, acx_start, acx_set_defaults, | ||
| 9296 | +** acx_s_after_interrupt_task (if IRQ_CMD_UPDATE_CARD_CFG), | ||
| 9297 | +*/ | ||
| 9298 | +static void | ||
| 9299 | +acx111_s_sens_radio_16_17(acx_device_t *adev) | ||
| 9300 | +{ | ||
| 9301 | + u32 feature1, feature2; | ||
| 9302 | + | ||
| 9303 | + if ((adev->sensitivity < 1) || (adev->sensitivity > 3)) { | ||
| 9304 | + printk("%s: invalid sensitivity setting (1..3), " | ||
| 9305 | + "setting to 1\n", adev->ndev->name); | ||
| 9306 | + adev->sensitivity = 1; | ||
| 9307 | + } | ||
| 9308 | + acx111_s_get_feature_config(adev, &feature1, &feature2); | ||
| 9309 | + CLEAR_BIT(feature1, FEATURE1_LOW_RX|FEATURE1_EXTRA_LOW_RX); | ||
| 9310 | + if (adev->sensitivity > 1) | ||
| 9311 | + SET_BIT(feature1, FEATURE1_LOW_RX); | ||
| 9312 | + if (adev->sensitivity > 2) | ||
| 9313 | + SET_BIT(feature1, FEATURE1_EXTRA_LOW_RX); | ||
| 9314 | + acx111_s_feature_set(adev, feature1, feature2); | ||
| 9315 | +} | ||
| 9316 | + | ||
| 9317 | + | ||
| 9318 | +void | ||
| 9319 | +acx_s_update_card_settings(acx_device_t *adev) | ||
| 9320 | +{ | ||
| 9321 | + unsigned long flags; | ||
| 9322 | + unsigned int start_scan = 0; | ||
| 9323 | + int i; | ||
| 9324 | + | ||
| 9325 | + FN_ENTER; | ||
| 9326 | + | ||
| 9327 | + log(L_INIT, "get_mask 0x%08X, set_mask 0x%08X\n", | ||
| 9328 | + adev->get_mask, adev->set_mask); | ||
| 9329 | + | ||
| 9330 | + /* Track dependencies betweed various settings */ | ||
| 9331 | + | ||
| 9332 | + if (adev->set_mask & (GETSET_MODE|GETSET_RESCAN|GETSET_WEP)) { | ||
| 9333 | + log(L_INIT, "important setting has been changed. " | ||
| 9334 | + "Need to update packet templates, too\n"); | ||
| 9335 | + SET_BIT(adev->set_mask, SET_TEMPLATES); | ||
| 9336 | + } | ||
| 9337 | + if (adev->set_mask & GETSET_CHANNEL) { | ||
| 9338 | + /* This will actually tune RX/TX to the channel */ | ||
| 9339 | + SET_BIT(adev->set_mask, GETSET_RX|GETSET_TX); | ||
| 9340 | + switch (adev->mode) { | ||
| 9341 | + case ACX_MODE_0_ADHOC: | ||
| 9342 | + case ACX_MODE_3_AP: | ||
| 9343 | + /* Beacons contain channel# - update them */ | ||
| 9344 | + SET_BIT(adev->set_mask, SET_TEMPLATES); | ||
| 9345 | + } | ||
| 9346 | + switch (adev->mode) { | ||
| 9347 | + case ACX_MODE_0_ADHOC: | ||
| 9348 | + case ACX_MODE_2_STA: | ||
| 9349 | + start_scan = 1; | ||
| 9350 | + } | ||
| 9351 | + } | ||
| 9352 | + | ||
| 9353 | + /* Apply settings */ | ||
| 9354 | + | ||
| 9355 | +#ifdef WHY_SHOULD_WE_BOTHER /* imagine we were just powered off */ | ||
| 9356 | + /* send a disassoc request in case it's required */ | ||
| 9357 | + if (adev->set_mask & (GETSET_MODE|GETSET_RESCAN|GETSET_CHANNEL|GETSET_WEP)) { | ||
| 9358 | + if (ACX_MODE_2_STA == adev->mode) { | ||
| 9359 | + if (ACX_STATUS_4_ASSOCIATED == adev->status) { | ||
| 9360 | + log(L_ASSOC, "we were ASSOCIATED - " | ||
| 9361 | + "sending disassoc request\n"); | ||
| 9362 | + acx_lock(adev, flags); | ||
| 9363 | + acx_l_transmit_disassoc(adev, NULL); | ||
| 9364 | + /* FIXME: deauth? */ | ||
| 9365 | + acx_unlock(adev, flags); | ||
| 9366 | + } | ||
| 9367 | + /* need to reset some other stuff as well */ | ||
| 9368 | + log(L_DEBUG, "resetting bssid\n"); | ||
| 9369 | + MAC_ZERO(adev->bssid); | ||
| 9370 | + SET_BIT(adev->set_mask, SET_TEMPLATES|SET_STA_LIST); | ||
| 9371 | + start_scan = 1; | ||
| 9372 | + } | ||
| 9373 | + } | ||
| 9374 | +#endif | ||
| 9375 | + | ||
| 9376 | + if (adev->get_mask & GETSET_STATION_ID) { | ||
| 9377 | + u8 stationID[4 + ACX1xx_IE_DOT11_STATION_ID_LEN]; | ||
| 9378 | + const u8 *paddr; | ||
| 9379 | + | ||
| 9380 | + acx_s_interrogate(adev, &stationID, ACX1xx_IE_DOT11_STATION_ID); | ||
| 9381 | + paddr = &stationID[4]; | ||
| 9382 | + for (i = 0; i < ETH_ALEN; i++) { | ||
| 9383 | + /* we copy the MAC address (reversed in | ||
| 9384 | + * the card) to the netdevice's MAC | ||
| 9385 | + * address, and on ifup it will be | ||
| 9386 | + * copied into iwadev->dev_addr */ | ||
| 9387 | + adev->ndev->dev_addr[ETH_ALEN - 1 - i] = paddr[i]; | ||
| 9388 | + } | ||
| 9389 | + CLEAR_BIT(adev->get_mask, GETSET_STATION_ID); | ||
| 9390 | + } | ||
| 9391 | + | ||
| 9392 | + if (adev->get_mask & GETSET_SENSITIVITY) { | ||
| 9393 | + if ((RADIO_RFMD_11 == adev->radio_type) | ||
| 9394 | + || (RADIO_MAXIM_0D == adev->radio_type) | ||
| 9395 | + || (RADIO_RALINK_15 == adev->radio_type)) { | ||
| 9396 | + acx_s_read_phy_reg(adev, 0x30, &adev->sensitivity); | ||
| 9397 | + } else { | ||
| 9398 | + log(L_INIT, "don't know how to get sensitivity " | ||
| 9399 | + "for radio type 0x%02X\n", adev->radio_type); | ||
| 9400 | + adev->sensitivity = 0; | ||
| 9401 | + } | ||
| 9402 | + log(L_INIT, "got sensitivity value %u\n", adev->sensitivity); | ||
| 9403 | + | ||
| 9404 | + CLEAR_BIT(adev->get_mask, GETSET_SENSITIVITY); | ||
| 9405 | + } | ||
| 9406 | + | ||
| 9407 | + if (adev->get_mask & GETSET_ANTENNA) { | ||
| 9408 | + u8 antenna[4 + ACX1xx_IE_DOT11_CURRENT_ANTENNA_LEN]; | ||
| 9409 | + | ||
| 9410 | + memset(antenna, 0, sizeof(antenna)); | ||
| 9411 | + acx_s_interrogate(adev, antenna, ACX1xx_IE_DOT11_CURRENT_ANTENNA); | ||
| 9412 | + adev->antenna = antenna[4]; | ||
| 9413 | + log(L_INIT, "got antenna value 0x%02X\n", adev->antenna); | ||
| 9414 | + CLEAR_BIT(adev->get_mask, GETSET_ANTENNA); | ||
| 9415 | + } | ||
| 9416 | + | ||
| 9417 | + if (adev->get_mask & GETSET_ED_THRESH) { | ||
| 9418 | + if (IS_ACX100(adev)) { | ||
| 9419 | + u8 ed_threshold[4 + ACX100_IE_DOT11_ED_THRESHOLD_LEN]; | ||
| 9420 | + | ||
| 9421 | + memset(ed_threshold, 0, sizeof(ed_threshold)); | ||
| 9422 | + acx_s_interrogate(adev, ed_threshold, ACX100_IE_DOT11_ED_THRESHOLD); | ||
| 9423 | + adev->ed_threshold = ed_threshold[4]; | ||
| 9424 | + } else { | ||
| 9425 | + log(L_INIT, "acx111 doesn't support ED\n"); | ||
| 9426 | + adev->ed_threshold = 0; | ||
| 9427 | + } | ||
| 9428 | + log(L_INIT, "got Energy Detect (ED) threshold %u\n", adev->ed_threshold); | ||
| 9429 | + CLEAR_BIT(adev->get_mask, GETSET_ED_THRESH); | ||
| 9430 | + } | ||
| 9431 | + | ||
| 9432 | + if (adev->get_mask & GETSET_CCA) { | ||
| 9433 | + if (IS_ACX100(adev)) { | ||
| 9434 | + u8 cca[4 + ACX1xx_IE_DOT11_CURRENT_CCA_MODE_LEN]; | ||
| 9435 | + | ||
| 9436 | + memset(cca, 0, sizeof(adev->cca)); | ||
| 9437 | + acx_s_interrogate(adev, cca, ACX1xx_IE_DOT11_CURRENT_CCA_MODE); | ||
| 9438 | + adev->cca = cca[4]; | ||
| 9439 | + } else { | ||
| 9440 | + log(L_INIT, "acx111 doesn't support CCA\n"); | ||
| 9441 | + adev->cca = 0; | ||
| 9442 | + } | ||
| 9443 | + log(L_INIT, "got Channel Clear Assessment (CCA) value %u\n", adev->cca); | ||
| 9444 | + CLEAR_BIT(adev->get_mask, GETSET_CCA); | ||
| 9445 | + } | ||
| 9446 | + | ||
| 9447 | + if (adev->get_mask & GETSET_REG_DOMAIN) { | ||
| 9448 | + acx_ie_generic_t dom; | ||
| 9449 | + | ||
| 9450 | + acx_s_interrogate(adev, &dom, ACX1xx_IE_DOT11_CURRENT_REG_DOMAIN); | ||
| 9451 | + adev->reg_dom_id = dom.m.bytes[0]; | ||
| 9452 | + acx_s_set_sane_reg_domain(adev, 0); | ||
| 9453 | + log(L_INIT, "got regulatory domain 0x%02X\n", adev->reg_dom_id); | ||
| 9454 | + CLEAR_BIT(adev->get_mask, GETSET_REG_DOMAIN); | ||
| 9455 | + } | ||
| 9456 | + | ||
| 9457 | + if (adev->set_mask & GETSET_STATION_ID) { | ||
| 9458 | + u8 stationID[4 + ACX1xx_IE_DOT11_STATION_ID_LEN]; | ||
| 9459 | + u8 *paddr; | ||
| 9460 | + | ||
| 9461 | + paddr = &stationID[4]; | ||
| 9462 | + memcpy(adev->dev_addr, adev->ndev->dev_addr, ETH_ALEN); | ||
| 9463 | + for (i = 0; i < ETH_ALEN; i++) { | ||
| 9464 | + /* copy the MAC address we obtained when we noticed | ||
| 9465 | + * that the ethernet iface's MAC changed | ||
| 9466 | + * to the card (reversed in | ||
| 9467 | + * the card!) */ | ||
| 9468 | + paddr[i] = adev->dev_addr[ETH_ALEN - 1 - i]; | ||
| 9469 | + } | ||
| 9470 | + acx_s_configure(adev, &stationID, ACX1xx_IE_DOT11_STATION_ID); | ||
| 9471 | + CLEAR_BIT(adev->set_mask, GETSET_STATION_ID); | ||
| 9472 | + } | ||
| 9473 | + | ||
| 9474 | + if (adev->set_mask & SET_TEMPLATES) { | ||
| 9475 | + log(L_INIT, "updating packet templates\n"); | ||
| 9476 | + switch (adev->mode) { | ||
| 9477 | + case ACX_MODE_2_STA: | ||
| 9478 | + acx_s_set_probe_request_template(adev); | ||
| 9479 | +#if POWER_SAVE_80211 | ||
| 9480 | + acx_s_set_null_data_template(adev); | ||
| 9481 | +#endif | ||
| 9482 | + break; | ||
| 9483 | + case ACX_MODE_0_ADHOC: | ||
| 9484 | + acx_s_set_probe_request_template(adev); | ||
| 9485 | +#if POWER_SAVE_80211 | ||
| 9486 | + /* maybe power save functionality is somehow possible | ||
| 9487 | + * for Ad-Hoc mode, too... FIXME: verify it somehow? firmware debug fields? */ | ||
| 9488 | + acx_s_set_null_data_template(adev); | ||
| 9489 | +#endif | ||
| 9490 | + /* fall through */ | ||
| 9491 | + case ACX_MODE_3_AP: | ||
| 9492 | + acx_s_set_beacon_template(adev); | ||
| 9493 | + acx_s_set_tim_template(adev); | ||
| 9494 | + /* BTW acx111 firmware would not send probe responses | ||
| 9495 | + ** if probe request does not have all basic rates flagged | ||
| 9496 | + ** by 0x80! Thus firmware does not conform to 802.11, | ||
| 9497 | + ** it should ignore 0x80 bit in ratevector from STA. | ||
| 9498 | + ** We can 'fix' it by not using this template and | ||
| 9499 | + ** sending probe responses by hand. TODO --vda */ | ||
| 9500 | + acx_s_set_probe_response_template(adev); | ||
| 9501 | + } | ||
| 9502 | + /* Needed if generated frames are to be emitted at different tx rate now */ | ||
| 9503 | + log(L_IRQ, "redoing cmd_join_bssid() after template cfg\n"); | ||
| 9504 | + acx_s_cmd_join_bssid(adev, adev->bssid); | ||
| 9505 | + CLEAR_BIT(adev->set_mask, SET_TEMPLATES); | ||
| 9506 | + } | ||
| 9507 | + if (adev->set_mask & SET_STA_LIST) { | ||
| 9508 | + acx_lock(adev, flags); | ||
| 9509 | + acx_l_sta_list_init(adev); | ||
| 9510 | + CLEAR_BIT(adev->set_mask, SET_STA_LIST); | ||
| 9511 | + acx_unlock(adev, flags); | ||
| 9512 | + } | ||
| 9513 | + if (adev->set_mask & SET_RATE_FALLBACK) { | ||
| 9514 | + u8 rate[4 + ACX1xx_IE_RATE_FALLBACK_LEN]; | ||
| 9515 | + | ||
| 9516 | + /* configure to not do fallbacks when not in auto rate mode */ | ||
| 9517 | + rate[4] = (adev->rate_auto) ? /* adev->txrate_fallback_retries */ 1 : 0; | ||
| 9518 | + log(L_INIT, "updating Tx fallback to %u retries\n", rate[4]); | ||
| 9519 | + acx_s_configure(adev, &rate, ACX1xx_IE_RATE_FALLBACK); | ||
| 9520 | + CLEAR_BIT(adev->set_mask, SET_RATE_FALLBACK); | ||
| 9521 | + } | ||
| 9522 | + if (adev->set_mask & GETSET_TXPOWER) { | ||
| 9523 | + log(L_INIT, "updating transmit power: %u dBm\n", | ||
| 9524 | + adev->tx_level_dbm); | ||
| 9525 | + acx_s_set_tx_level(adev, adev->tx_level_dbm); | ||
| 9526 | + CLEAR_BIT(adev->set_mask, GETSET_TXPOWER); | ||
| 9527 | + } | ||
| 9528 | + | ||
| 9529 | + if (adev->set_mask & GETSET_SENSITIVITY) { | ||
| 9530 | + log(L_INIT, "updating sensitivity value: %u\n", | ||
| 9531 | + adev->sensitivity); | ||
| 9532 | + switch (adev->radio_type) { | ||
| 9533 | + case RADIO_RFMD_11: | ||
| 9534 | + case RADIO_MAXIM_0D: | ||
| 9535 | + case RADIO_RALINK_15: | ||
| 9536 | + acx_s_write_phy_reg(adev, 0x30, adev->sensitivity); | ||
| 9537 | + break; | ||
| 9538 | + case RADIO_RADIA_16: | ||
| 9539 | + case RADIO_UNKNOWN_17: | ||
| 9540 | + acx111_s_sens_radio_16_17(adev); | ||
| 9541 | + break; | ||
| 9542 | + default: | ||
| 9543 | + log(L_INIT, "don't know how to modify sensitivity " | ||
| 9544 | + "for radio type 0x%02X\n", adev->radio_type); | ||
| 9545 | + } | ||
| 9546 | + CLEAR_BIT(adev->set_mask, GETSET_SENSITIVITY); | ||
| 9547 | + } | ||
| 9548 | + | ||
| 9549 | + if (adev->set_mask & GETSET_ANTENNA) { | ||
| 9550 | + /* antenna */ | ||
| 9551 | + u8 antenna[4 + ACX1xx_IE_DOT11_CURRENT_ANTENNA_LEN]; | ||
| 9552 | + | ||
| 9553 | + memset(antenna, 0, sizeof(antenna)); | ||
| 9554 | + antenna[4] = adev->antenna; | ||
| 9555 | + log(L_INIT, "updating antenna value: 0x%02X\n", | ||
| 9556 | + adev->antenna); | ||
| 9557 | + acx_s_configure(adev, &antenna, ACX1xx_IE_DOT11_CURRENT_ANTENNA); | ||
| 9558 | + CLEAR_BIT(adev->set_mask, GETSET_ANTENNA); | ||
| 9559 | + } | ||
| 9560 | + | ||
| 9561 | + if (adev->set_mask & GETSET_ED_THRESH) { | ||
| 9562 | + /* ed_threshold */ | ||
| 9563 | + log(L_INIT, "updating Energy Detect (ED) threshold: %u\n", | ||
| 9564 | + adev->ed_threshold); | ||
| 9565 | + if (IS_ACX100(adev)) { | ||
| 9566 | + u8 ed_threshold[4 + ACX100_IE_DOT11_ED_THRESHOLD_LEN]; | ||
| 9567 | + | ||
| 9568 | + memset(ed_threshold, 0, sizeof(ed_threshold)); | ||
| 9569 | + ed_threshold[4] = adev->ed_threshold; | ||
| 9570 | + acx_s_configure(adev, &ed_threshold, ACX100_IE_DOT11_ED_THRESHOLD); | ||
| 9571 | + } | ||
| 9572 | + else | ||
| 9573 | + log(L_INIT, "acx111 doesn't support ED!\n"); | ||
| 9574 | + CLEAR_BIT(adev->set_mask, GETSET_ED_THRESH); | ||
| 9575 | + } | ||
| 9576 | + | ||
| 9577 | + if (adev->set_mask & GETSET_CCA) { | ||
| 9578 | + /* CCA value */ | ||
| 9579 | + log(L_INIT, "updating Channel Clear Assessment " | ||
| 9580 | + "(CCA) value: 0x%02X\n", adev->cca); | ||
| 9581 | + if (IS_ACX100(adev)) { | ||
| 9582 | + u8 cca[4 + ACX1xx_IE_DOT11_CURRENT_CCA_MODE_LEN]; | ||
| 9583 | + | ||
| 9584 | + memset(cca, 0, sizeof(cca)); | ||
| 9585 | + cca[4] = adev->cca; | ||
| 9586 | + acx_s_configure(adev, &cca, ACX1xx_IE_DOT11_CURRENT_CCA_MODE); | ||
| 9587 | + } | ||
| 9588 | + else | ||
| 9589 | + log(L_INIT, "acx111 doesn't support CCA!\n"); | ||
| 9590 | + CLEAR_BIT(adev->set_mask, GETSET_CCA); | ||
| 9591 | + } | ||
| 9592 | + | ||
| 9593 | + if (adev->set_mask & GETSET_LED_POWER) { | ||
| 9594 | + /* Enable Tx */ | ||
| 9595 | + log(L_INIT, "updating power LED status: %u\n", adev->led_power); | ||
| 9596 | + | ||
| 9597 | + acx_lock(adev, flags); | ||
| 9598 | +#if defined (ACX_MEM) | ||
| 9599 | + acxmem_l_power_led(adev, adev->led_power); | ||
| 9600 | +#else | ||
| 9601 | + if (IS_PCI(adev)) | ||
| 9602 | + acxpci_l_power_led(adev, adev->led_power); | ||
| 9603 | +#endif | ||
| 9604 | + CLEAR_BIT(adev->set_mask, GETSET_LED_POWER); | ||
| 9605 | + acx_unlock(adev, flags); | ||
| 9606 | + } | ||
| 9607 | + | ||
| 9608 | + if (adev->set_mask & GETSET_POWER_80211) { | ||
| 9609 | +#if POWER_SAVE_80211 | ||
| 9610 | + acx_s_update_80211_powersave_mode(adev); | ||
| 9611 | +#endif | ||
| 9612 | + CLEAR_BIT(adev->set_mask, GETSET_POWER_80211); | ||
| 9613 | + } | ||
| 9614 | + | ||
| 9615 | + if (adev->set_mask & GETSET_CHANNEL) { | ||
| 9616 | + /* channel */ | ||
| 9617 | + log(L_INIT, "updating channel to: %u\n", adev->channel); | ||
| 9618 | + CLEAR_BIT(adev->set_mask, GETSET_CHANNEL); | ||
| 9619 | + } | ||
| 9620 | + | ||
| 9621 | + if (adev->set_mask & GETSET_TX) { | ||
| 9622 | + /* set Tx */ | ||
| 9623 | + log(L_INIT, "updating: %s Tx\n", | ||
| 9624 | + adev->tx_disabled ? "disable" : "enable"); | ||
| 9625 | + if (adev->tx_disabled) | ||
| 9626 | + acx_s_issue_cmd(adev, ACX1xx_CMD_DISABLE_TX, NULL, 0); | ||
| 9627 | + else | ||
| 9628 | + acx_s_issue_cmd(adev, ACX1xx_CMD_ENABLE_TX, &adev->channel, 1); | ||
| 9629 | + CLEAR_BIT(adev->set_mask, GETSET_TX); | ||
| 9630 | + } | ||
| 9631 | + | ||
| 9632 | + if (adev->set_mask & GETSET_RX) { | ||
| 9633 | + /* Enable Rx */ | ||
| 9634 | + log(L_INIT, "updating: enable Rx on channel: %u\n", | ||
| 9635 | + adev->channel); | ||
| 9636 | + acx_s_issue_cmd(adev, ACX1xx_CMD_ENABLE_RX, &adev->channel, 1); | ||
| 9637 | + CLEAR_BIT(adev->set_mask, GETSET_RX); | ||
| 9638 | + } | ||
| 9639 | + | ||
| 9640 | + if (adev->set_mask & GETSET_RETRY) { | ||
| 9641 | + u8 short_retry[4 + ACX1xx_IE_DOT11_SHORT_RETRY_LIMIT_LEN]; | ||
| 9642 | + u8 long_retry[4 + ACX1xx_IE_DOT11_LONG_RETRY_LIMIT_LEN]; | ||
| 9643 | + | ||
| 9644 | + log(L_INIT, "updating short retry limit: %u, long retry limit: %u\n", | ||
| 9645 | + adev->short_retry, adev->long_retry); | ||
| 9646 | + short_retry[0x4] = adev->short_retry; | ||
| 9647 | + long_retry[0x4] = adev->long_retry; | ||
| 9648 | + acx_s_configure(adev, &short_retry, ACX1xx_IE_DOT11_SHORT_RETRY_LIMIT); | ||
| 9649 | + acx_s_configure(adev, &long_retry, ACX1xx_IE_DOT11_LONG_RETRY_LIMIT); | ||
| 9650 | + CLEAR_BIT(adev->set_mask, GETSET_RETRY); | ||
| 9651 | + } | ||
| 9652 | + | ||
| 9653 | + if (adev->set_mask & SET_MSDU_LIFETIME) { | ||
| 9654 | + u8 xmt_msdu_lifetime[4 + ACX1xx_IE_DOT11_MAX_XMIT_MSDU_LIFETIME_LEN]; | ||
| 9655 | + | ||
| 9656 | + log(L_INIT, "updating tx MSDU lifetime: %u\n", | ||
| 9657 | + adev->msdu_lifetime); | ||
| 9658 | + *(u32 *)&xmt_msdu_lifetime[4] = cpu_to_le32((u32)adev->msdu_lifetime); | ||
| 9659 | + acx_s_configure(adev, &xmt_msdu_lifetime, ACX1xx_IE_DOT11_MAX_XMIT_MSDU_LIFETIME); | ||
| 9660 | + CLEAR_BIT(adev->set_mask, SET_MSDU_LIFETIME); | ||
| 9661 | + } | ||
| 9662 | + | ||
| 9663 | + if (adev->set_mask & GETSET_REG_DOMAIN) { | ||
| 9664 | + log(L_INIT, "updating regulatory domain: 0x%02X\n", | ||
| 9665 | + adev->reg_dom_id); | ||
| 9666 | + acx_s_set_sane_reg_domain(adev, 1); | ||
| 9667 | + CLEAR_BIT(adev->set_mask, GETSET_REG_DOMAIN); | ||
| 9668 | + } | ||
| 9669 | + | ||
| 9670 | + if (adev->set_mask & GETSET_MODE) { | ||
| 9671 | + adev->ndev->type = (adev->mode == ACX_MODE_MONITOR) ? | ||
| 9672 | + adev->monitor_type : ARPHRD_ETHER; | ||
| 9673 | + | ||
| 9674 | + switch (adev->mode) { | ||
| 9675 | + case ACX_MODE_3_AP: | ||
| 9676 | + | ||
| 9677 | + acx_lock(adev, flags); | ||
| 9678 | + acx_l_sta_list_init(adev); | ||
| 9679 | + adev->aid = 0; | ||
| 9680 | + adev->ap_client = NULL; | ||
| 9681 | + MAC_COPY(adev->bssid, adev->dev_addr); | ||
| 9682 | + /* this basically says "we're connected" */ | ||
| 9683 | + acx_set_status(adev, ACX_STATUS_4_ASSOCIATED); | ||
| 9684 | + acx_unlock(adev, flags); | ||
| 9685 | + | ||
| 9686 | + acx111_s_feature_off(adev, 0, FEATURE2_NO_TXCRYPT|FEATURE2_SNIFFER); | ||
| 9687 | + /* start sending beacons */ | ||
| 9688 | + acx_s_cmd_join_bssid(adev, adev->bssid); | ||
| 9689 | + break; | ||
| 9690 | + case ACX_MODE_MONITOR: | ||
| 9691 | + acx111_s_feature_on(adev, 0, FEATURE2_NO_TXCRYPT|FEATURE2_SNIFFER); | ||
| 9692 | + /* this stops beacons */ | ||
| 9693 | + acx_s_cmd_join_bssid(adev, adev->bssid); | ||
| 9694 | + /* this basically says "we're connected" */ | ||
| 9695 | + acx_set_status(adev, ACX_STATUS_4_ASSOCIATED); | ||
| 9696 | + SET_BIT(adev->set_mask, SET_RXCONFIG|SET_WEP_OPTIONS); | ||
| 9697 | + break; | ||
| 9698 | + case ACX_MODE_0_ADHOC: | ||
| 9699 | + case ACX_MODE_2_STA: | ||
| 9700 | + acx111_s_feature_off(adev, 0, FEATURE2_NO_TXCRYPT|FEATURE2_SNIFFER); | ||
| 9701 | + | ||
| 9702 | + acx_lock(adev, flags); | ||
| 9703 | + adev->aid = 0; | ||
| 9704 | + adev->ap_client = NULL; | ||
| 9705 | + acx_unlock(adev, flags); | ||
| 9706 | + | ||
| 9707 | + /* we want to start looking for peer or AP */ | ||
| 9708 | + start_scan = 1; | ||
| 9709 | + break; | ||
| 9710 | + case ACX_MODE_OFF: | ||
| 9711 | + /* TODO: disable RX/TX, stop any scanning activity etc: */ | ||
| 9712 | + /* adev->tx_disabled = 1; */ | ||
| 9713 | + /* SET_BIT(adev->set_mask, GETSET_RX|GETSET_TX); */ | ||
| 9714 | + | ||
| 9715 | + /* This stops beacons (invalid macmode...) */ | ||
| 9716 | + acx_s_cmd_join_bssid(adev, adev->bssid); | ||
| 9717 | + acx_set_status(adev, ACX_STATUS_0_STOPPED); | ||
| 9718 | + break; | ||
| 9719 | + } | ||
| 9720 | + CLEAR_BIT(adev->set_mask, GETSET_MODE); | ||
| 9721 | + } | ||
| 9722 | + | ||
| 9723 | + if (adev->set_mask & SET_RXCONFIG) { | ||
| 9724 | + acx_s_initialize_rx_config(adev); | ||
| 9725 | + CLEAR_BIT(adev->set_mask, SET_RXCONFIG); | ||
| 9726 | + } | ||
| 9727 | + | ||
| 9728 | + if (adev->set_mask & GETSET_RESCAN) { | ||
| 9729 | + switch (adev->mode) { | ||
| 9730 | + case ACX_MODE_0_ADHOC: | ||
| 9731 | + case ACX_MODE_2_STA: | ||
| 9732 | + start_scan = 1; | ||
| 9733 | + break; | ||
| 9734 | + } | ||
| 9735 | + CLEAR_BIT(adev->set_mask, GETSET_RESCAN); | ||
| 9736 | + } | ||
| 9737 | + | ||
| 9738 | + if (adev->set_mask & GETSET_WEP) { | ||
| 9739 | + /* encode */ | ||
| 9740 | + | ||
| 9741 | + ie_dot11WEPDefaultKeyID_t dkey; | ||
| 9742 | +#ifdef DEBUG_WEP | ||
| 9743 | + struct { | ||
| 9744 | + u16 type; | ||
| 9745 | + u16 len; | ||
| 9746 | + u8 val; | ||
| 9747 | + } ACX_PACKED keyindic; | ||
| 9748 | +#endif | ||
| 9749 | + log(L_INIT, "updating WEP key settings\n"); | ||
| 9750 | + | ||
| 9751 | + acx_s_set_wepkey(adev); | ||
| 9752 | + | ||
| 9753 | + dkey.KeyID = adev->wep_current_index; | ||
| 9754 | + log(L_INIT, "setting WEP key %u as default\n", dkey.KeyID); | ||
| 9755 | + acx_s_configure(adev, &dkey, ACX1xx_IE_DOT11_WEP_DEFAULT_KEY_SET); | ||
| 9756 | +#ifdef DEBUG_WEP | ||
| 9757 | + keyindic.val = 3; | ||
| 9758 | + acx_s_configure(adev, &keyindic, ACX111_IE_KEY_CHOOSE); | ||
| 9759 | +#endif | ||
| 9760 | + start_scan = 1; | ||
| 9761 | + CLEAR_BIT(adev->set_mask, GETSET_WEP); | ||
| 9762 | + } | ||
| 9763 | + | ||
| 9764 | + if (adev->set_mask & SET_WEP_OPTIONS) { | ||
| 9765 | + acx100_ie_wep_options_t options; | ||
| 9766 | + if (IS_ACX111(adev)) { | ||
| 9767 | + log(L_DEBUG, "setting WEP Options for acx111 is not supported\n"); | ||
| 9768 | + } else { | ||
| 9769 | + log(L_INIT, "setting WEP Options\n"); | ||
| 9770 | + acx100_s_init_wep(adev); | ||
| 9771 | +#if 0 | ||
| 9772 | + /* let's choose maximum setting: 4 default keys, | ||
| 9773 | + * plus 10 other keys: */ | ||
| 9774 | + options.NumKeys = cpu_to_le16(DOT11_MAX_DEFAULT_WEP_KEYS + 10); | ||
| 9775 | + /* don't decrypt default key only, | ||
| 9776 | + * don't override decryption: */ | ||
| 9777 | + options.WEPOption = 0; | ||
| 9778 | + if (adev->mode == ACX_MODE_MONITOR) { | ||
| 9779 | + /* don't decrypt default key only, | ||
| 9780 | + * override decryption mechanism: */ | ||
| 9781 | + options.WEPOption = 2; | ||
| 9782 | + } | ||
| 9783 | + | ||
| 9784 | + acx_s_configure(adev, &options, ACX100_IE_WEP_OPTIONS); | ||
| 9785 | +#endif | ||
| 9786 | + } | ||
| 9787 | + CLEAR_BIT(adev->set_mask, SET_WEP_OPTIONS); | ||
| 9788 | + } | ||
| 9789 | + | ||
| 9790 | + /* Rescan was requested */ | ||
| 9791 | + if (start_scan) { | ||
| 9792 | + switch (adev->mode) { | ||
| 9793 | + case ACX_MODE_0_ADHOC: | ||
| 9794 | + case ACX_MODE_2_STA: | ||
| 9795 | + /* We can avoid clearing list if join code | ||
| 9796 | + ** will be a bit more clever about not picking | ||
| 9797 | + ** 'bad' AP over and over again */ | ||
| 9798 | + acx_lock(adev, flags); | ||
| 9799 | + adev->ap_client = NULL; | ||
| 9800 | + acx_l_sta_list_init(adev); | ||
| 9801 | + acx_set_status(adev, ACX_STATUS_1_SCANNING); | ||
| 9802 | + acx_unlock(adev, flags); | ||
| 9803 | + | ||
| 9804 | + acx_s_cmd_start_scan(adev); | ||
| 9805 | + } | ||
| 9806 | + } | ||
| 9807 | + | ||
| 9808 | + /* debug, rate, and nick don't need any handling */ | ||
| 9809 | + /* what about sniffing mode?? */ | ||
| 9810 | + | ||
| 9811 | + log(L_INIT, "get_mask 0x%08X, set_mask 0x%08X - after update\n", | ||
| 9812 | + adev->get_mask, adev->set_mask); | ||
| 9813 | + | ||
| 9814 | +/* end: */ | ||
| 9815 | + FN_EXIT0; | ||
| 9816 | +} | ||
| 9817 | + | ||
| 9818 | + | ||
| 9819 | +/*********************************************************************** | ||
| 9820 | +** acx_e_after_interrupt_task | ||
| 9821 | +*/ | ||
| 9822 | +static int | ||
| 9823 | +acx_s_recalib_radio(acx_device_t *adev) | ||
| 9824 | +{ | ||
| 9825 | + if (IS_ACX111(adev)) { | ||
| 9826 | + acx111_cmd_radiocalib_t cal; | ||
| 9827 | + | ||
| 9828 | + printk("%s: recalibrating radio\n", adev->ndev->name); | ||
| 9829 | + /* automatic recalibration, choose all methods: */ | ||
| 9830 | + cal.methods = cpu_to_le32(0x8000000f); | ||
| 9831 | + /* automatic recalibration every 60 seconds (value in TUs) | ||
| 9832 | + * I wonder what the firmware default here is? */ | ||
| 9833 | + cal.interval = cpu_to_le32(58594); | ||
| 9834 | + return acx_s_issue_cmd_timeo(adev, ACX111_CMD_RADIOCALIB, | ||
| 9835 | + &cal, sizeof(cal), CMD_TIMEOUT_MS(100)); | ||
| 9836 | + } else { | ||
| 9837 | + /* On ACX100, we need to recalibrate the radio | ||
| 9838 | + * by issuing a GETSET_TX|GETSET_RX */ | ||
| 9839 | + if (/* (OK == acx_s_issue_cmd(adev, ACX1xx_CMD_DISABLE_TX, NULL, 0)) && | ||
| 9840 | + (OK == acx_s_issue_cmd(adev, ACX1xx_CMD_DISABLE_RX, NULL, 0)) && */ | ||
| 9841 | + (OK == acx_s_issue_cmd(adev, ACX1xx_CMD_ENABLE_TX, &adev->channel, 1)) && | ||
| 9842 | + (OK == acx_s_issue_cmd(adev, ACX1xx_CMD_ENABLE_RX, &adev->channel, 1)) ) | ||
| 9843 | + return OK; | ||
| 9844 | + return NOT_OK; | ||
| 9845 | + } | ||
| 9846 | +} | ||
| 9847 | + | ||
| 9848 | +static void | ||
| 9849 | +acx_s_after_interrupt_recalib(acx_device_t *adev) | ||
| 9850 | +{ | ||
| 9851 | + int res; | ||
| 9852 | + | ||
| 9853 | + /* this helps with ACX100 at least; | ||
| 9854 | + * hopefully ACX111 also does a | ||
| 9855 | + * recalibration here */ | ||
| 9856 | + | ||
| 9857 | + /* clear flag beforehand, since we want to make sure | ||
| 9858 | + * it's cleared; then only set it again on specific circumstances */ | ||
| 9859 | + CLEAR_BIT(adev->after_interrupt_jobs, ACX_AFTER_IRQ_CMD_RADIO_RECALIB); | ||
| 9860 | + | ||
| 9861 | + /* better wait a bit between recalibrations to | ||
| 9862 | + * prevent overheating due to torturing the card | ||
| 9863 | + * into working too long despite high temperature | ||
| 9864 | + * (just a safety measure) */ | ||
| 9865 | + if (adev->recalib_time_last_success | ||
| 9866 | + && time_before(jiffies, adev->recalib_time_last_success | ||
| 9867 | + + RECALIB_PAUSE * 60 * HZ)) { | ||
| 9868 | + if (adev->recalib_msg_ratelimit <= 4) { | ||
| 9869 | + printk("%s: less than " STRING(RECALIB_PAUSE) | ||
| 9870 | + " minutes since last radio recalibration, " | ||
| 9871 | + "not recalibrating (maybe card is too hot?)\n", | ||
| 9872 | + adev->ndev->name); | ||
| 9873 | + adev->recalib_msg_ratelimit++; | ||
| 9874 | + if (adev->recalib_msg_ratelimit == 5) | ||
| 9875 | + printk("disabling above message until next recalib\n"); | ||
| 9876 | + } | ||
| 9877 | + return; | ||
| 9878 | + } | ||
| 9879 | + | ||
| 9880 | + adev->recalib_msg_ratelimit = 0; | ||
| 9881 | + | ||
| 9882 | + /* note that commands sometimes fail (card busy), | ||
| 9883 | + * so only clear flag if we were fully successful */ | ||
| 9884 | + res = acx_s_recalib_radio(adev); | ||
| 9885 | + if (res == OK) { | ||
| 9886 | + printk("%s: successfully recalibrated radio\n", | ||
| 9887 | + adev->ndev->name); | ||
| 9888 | + adev->recalib_time_last_success = jiffies; | ||
| 9889 | + adev->recalib_failure_count = 0; | ||
| 9890 | + } else { | ||
| 9891 | + /* failed: resubmit, but only limited | ||
| 9892 | + * amount of times within some time range | ||
| 9893 | + * to prevent endless loop */ | ||
| 9894 | + | ||
| 9895 | + adev->recalib_time_last_success = 0; /* we failed */ | ||
| 9896 | + | ||
| 9897 | + /* if some time passed between last | ||
| 9898 | + * attempts, then reset failure retry counter | ||
| 9899 | + * to be able to do next recalib attempt */ | ||
| 9900 | + if (time_after(jiffies, adev->recalib_time_last_attempt + 5*HZ)) | ||
| 9901 | + adev->recalib_failure_count = 0; | ||
| 9902 | + | ||
| 9903 | + if (adev->recalib_failure_count < 5) { | ||
| 9904 | + /* increment inside only, for speedup of outside path */ | ||
| 9905 | + adev->recalib_failure_count++; | ||
| 9906 | + adev->recalib_time_last_attempt = jiffies; | ||
| 9907 | + acx_schedule_task(adev, ACX_AFTER_IRQ_CMD_RADIO_RECALIB); | ||
| 9908 | + } | ||
| 9909 | + } | ||
| 9910 | +} | ||
| 9911 | + | ||
| 9912 | +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 20) | ||
| 9913 | +static void | ||
| 9914 | +acx_e_after_interrupt_task(struct work_struct *work) | ||
| 9915 | +{ | ||
| 9916 | + acx_device_t *adev = container_of(work, acx_device_t, after_interrupt_task); | ||
| 9917 | +#else | ||
| 9918 | + static void | ||
| 9919 | + acx_e_after_interrupt_task(void *data) | ||
| 9920 | + { | ||
| 9921 | + struct net_device *ndev = (struct net_device*)data; | ||
| 9922 | + acx_device_t *adev = ndev2adev(ndev); | ||
| 9923 | +#endif | ||
| 9924 | + FN_ENTER; | ||
| 9925 | + | ||
| 9926 | + acx_sem_lock(adev); | ||
| 9927 | + | ||
| 9928 | + if (!adev->after_interrupt_jobs) | ||
| 9929 | + goto end; /* no jobs to do */ | ||
| 9930 | + | ||
| 9931 | +#if TX_CLEANUP_IN_SOFTIRQ | ||
| 9932 | + /* can happen only on PCI */ | ||
| 9933 | + if (adev->after_interrupt_jobs & ACX_AFTER_IRQ_TX_CLEANUP) { | ||
| 9934 | + acx_lock(adev, flags); | ||
| 9935 | + acxpci_l_clean_txdesc(adev); | ||
| 9936 | + CLEAR_BIT(adev->after_interrupt_jobs, ACX_AFTER_IRQ_TX_CLEANUP); | ||
| 9937 | + acx_unlock(adev, flags); | ||
| 9938 | + } | ||
| 9939 | +#endif | ||
| 9940 | + /* we see lotsa tx errors */ | ||
| 9941 | + if (adev->after_interrupt_jobs & ACX_AFTER_IRQ_CMD_RADIO_RECALIB) { | ||
| 9942 | + acx_s_after_interrupt_recalib(adev); | ||
| 9943 | + } | ||
| 9944 | + | ||
| 9945 | + /* a poor interrupt code wanted to do update_card_settings() */ | ||
| 9946 | + if (adev->after_interrupt_jobs & ACX_AFTER_IRQ_UPDATE_CARD_CFG) { | ||
| 9947 | + if (ACX_STATE_IFACE_UP & adev->dev_state_mask) | ||
| 9948 | + acx_s_update_card_settings(adev); | ||
| 9949 | + CLEAR_BIT(adev->after_interrupt_jobs, ACX_AFTER_IRQ_UPDATE_CARD_CFG); | ||
| 9950 | + } | ||
| 9951 | + | ||
| 9952 | + /* 1) we detected that no Scan_Complete IRQ came from fw, or | ||
| 9953 | + ** 2) we found too many STAs */ | ||
| 9954 | + if (adev->after_interrupt_jobs & ACX_AFTER_IRQ_CMD_STOP_SCAN) { | ||
| 9955 | + log(L_IRQ, "sending a stop scan cmd...\n"); | ||
| 9956 | + acx_s_issue_cmd(adev, ACX1xx_CMD_STOP_SCAN, NULL, 0); | ||
| 9957 | + /* HACK: set the IRQ bit, since we won't get a | ||
| 9958 | + * scan complete IRQ any more on ACX111 (works on ACX100!), | ||
| 9959 | + * since _we_, not a fw, have stopped the scan */ | ||
| 9960 | + SET_BIT(adev->irq_status, HOST_INT_SCAN_COMPLETE); | ||
| 9961 | + CLEAR_BIT(adev->after_interrupt_jobs, ACX_AFTER_IRQ_CMD_STOP_SCAN); | ||
| 9962 | + } | ||
| 9963 | + | ||
| 9964 | + /* either fw sent Scan_Complete or we detected that | ||
| 9965 | + ** no Scan_Complete IRQ came from fw. Finish scanning, | ||
| 9966 | + ** pick join partner if any */ | ||
| 9967 | + if (adev->after_interrupt_jobs & ACX_AFTER_IRQ_COMPLETE_SCAN) { | ||
| 9968 | + if (adev->status == ACX_STATUS_1_SCANNING) { | ||
| 9969 | + if (OK != acx_s_complete_scan(adev)) { | ||
| 9970 | + SET_BIT(adev->after_interrupt_jobs, | ||
| 9971 | + ACX_AFTER_IRQ_RESTART_SCAN); | ||
| 9972 | + } | ||
| 9973 | + } else { | ||
| 9974 | + /* + scan kills current join status - restore it | ||
| 9975 | + ** (do we need it for STA?) */ | ||
| 9976 | + /* + does it happen only with active scans? | ||
| 9977 | + ** active and passive scans? ALL scans including | ||
| 9978 | + ** background one? */ | ||
| 9979 | + /* + was not verified that everything is restored | ||
| 9980 | + ** (but at least we start to emit beacons again) */ | ||
| 9981 | + switch (adev->mode) { | ||
| 9982 | + case ACX_MODE_0_ADHOC: | ||
| 9983 | + case ACX_MODE_3_AP: | ||
| 9984 | + log(L_IRQ, "redoing cmd_join_bssid() after scan\n"); | ||
| 9985 | + acx_s_cmd_join_bssid(adev, adev->bssid); | ||
| 9986 | + } | ||
| 9987 | + } | ||
| 9988 | + CLEAR_BIT(adev->after_interrupt_jobs, ACX_AFTER_IRQ_COMPLETE_SCAN); | ||
| 9989 | + } | ||
| 9990 | + | ||
| 9991 | + /* STA auth or assoc timed out, start over again */ | ||
| 9992 | + if (adev->after_interrupt_jobs & ACX_AFTER_IRQ_RESTART_SCAN) { | ||
| 9993 | + log(L_IRQ, "sending a start_scan cmd...\n"); | ||
| 9994 | + acx_s_cmd_start_scan(adev); | ||
| 9995 | + CLEAR_BIT(adev->after_interrupt_jobs, ACX_AFTER_IRQ_RESTART_SCAN); | ||
| 9996 | + } | ||
| 9997 | + | ||
| 9998 | + /* whee, we got positive assoc response! 8) */ | ||
| 9999 | + if (adev->after_interrupt_jobs & ACX_AFTER_IRQ_CMD_ASSOCIATE) { | ||
| 10000 | + acx_ie_generic_t pdr; | ||
| 10001 | + /* tiny race window exists, checking that we still a STA */ | ||
| 10002 | + switch (adev->mode) { | ||
| 10003 | + case ACX_MODE_2_STA: | ||
| 10004 | + pdr.m.aid = cpu_to_le16(adev->aid); | ||
| 10005 | + acx_s_configure(adev, &pdr, ACX1xx_IE_ASSOC_ID); | ||
| 10006 | + acx_set_status(adev, ACX_STATUS_4_ASSOCIATED); | ||
| 10007 | + log(L_ASSOC|L_DEBUG, "ASSOCIATED!\n"); | ||
| 10008 | + CLEAR_BIT(adev->after_interrupt_jobs, ACX_AFTER_IRQ_CMD_ASSOCIATE); | ||
| 10009 | + } | ||
| 10010 | + } | ||
| 10011 | +end: | ||
| 10012 | + acx_sem_unlock(adev); | ||
| 10013 | + FN_EXIT0; | ||
| 10014 | +} | ||
| 10015 | + | ||
| 10016 | + | ||
| 10017 | +/*********************************************************************** | ||
| 10018 | +** acx_schedule_task | ||
| 10019 | +** | ||
| 10020 | +** Schedule the call of the after_interrupt method after leaving | ||
| 10021 | +** the interrupt context. | ||
| 10022 | +*/ | ||
| 10023 | +void | ||
| 10024 | +acx_schedule_task(acx_device_t *adev, unsigned int set_flag) | ||
| 10025 | +{ | ||
| 10026 | + SET_BIT(adev->after_interrupt_jobs, set_flag); | ||
| 10027 | + SCHEDULE_WORK(&adev->after_interrupt_task); | ||
| 10028 | +} | ||
| 10029 | + | ||
| 10030 | + | ||
| 10031 | +/*********************************************************************** | ||
| 10032 | +*/ | ||
| 10033 | +void | ||
| 10034 | +acx_init_task_scheduler(acx_device_t *adev) | ||
| 10035 | +{ | ||
| 10036 | + /* configure task scheduler */ | ||
| 10037 | +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 20) | ||
| 10038 | + INIT_WORK(&adev->after_interrupt_task, acx_e_after_interrupt_task); | ||
| 10039 | +#else | ||
| 10040 | + INIT_WORK(&adev->after_interrupt_task, acx_e_after_interrupt_task, | ||
| 10041 | + adev->ndev); | ||
| 10042 | +#endif | ||
| 10043 | +} | ||
| 10044 | + | ||
| 10045 | + | ||
| 10046 | +/*********************************************************************** | ||
| 10047 | +** acx_s_start | ||
| 10048 | +*/ | ||
| 10049 | +void | ||
| 10050 | +acx_s_start(acx_device_t *adev) | ||
| 10051 | +{ | ||
| 10052 | + FN_ENTER; | ||
| 10053 | + | ||
| 10054 | + /* | ||
| 10055 | + * Ok, now we do everything that can possibly be done with ioctl | ||
| 10056 | + * calls to make sure that when it was called before the card | ||
| 10057 | + * was up we get the changes asked for | ||
| 10058 | + */ | ||
| 10059 | + | ||
| 10060 | + SET_BIT(adev->set_mask, SET_TEMPLATES|SET_STA_LIST|GETSET_WEP | ||
| 10061 | + |GETSET_TXPOWER|GETSET_ANTENNA|GETSET_ED_THRESH|GETSET_CCA | ||
| 10062 | + |GETSET_REG_DOMAIN|GETSET_MODE|GETSET_CHANNEL | ||
| 10063 | + |GETSET_TX|GETSET_RX|GETSET_STATION_ID); | ||
| 10064 | + | ||
| 10065 | + log(L_INIT, "updating initial settings on iface activation\n"); | ||
| 10066 | + acx_s_update_card_settings(adev); | ||
| 10067 | + | ||
| 10068 | + FN_EXIT0; | ||
| 10069 | +} | ||
| 10070 | + | ||
| 10071 | + | ||
| 10072 | +/*********************************************************************** | ||
| 10073 | +** acx_update_capabilities | ||
| 10074 | +*/ | ||
| 10075 | +void | ||
| 10076 | +acx_update_capabilities(acx_device_t *adev) | ||
| 10077 | +{ | ||
| 10078 | + u16 cap = 0; | ||
| 10079 | + | ||
| 10080 | + switch (adev->mode) { | ||
| 10081 | + case ACX_MODE_3_AP: | ||
| 10082 | + SET_BIT(cap, WF_MGMT_CAP_ESS); break; | ||
| 10083 | + case ACX_MODE_0_ADHOC: | ||
| 10084 | + SET_BIT(cap, WF_MGMT_CAP_IBSS); break; | ||
| 10085 | + /* other types of stations do not emit beacons */ | ||
| 10086 | + } | ||
| 10087 | + | ||
| 10088 | + if (adev->wep_restricted) { | ||
| 10089 | + SET_BIT(cap, WF_MGMT_CAP_PRIVACY); | ||
| 10090 | + } | ||
| 10091 | + if (adev->cfgopt_dot11ShortPreambleOption) { | ||
| 10092 | + SET_BIT(cap, WF_MGMT_CAP_SHORT); | ||
| 10093 | + } | ||
| 10094 | + if (adev->cfgopt_dot11PBCCOption) { | ||
| 10095 | + SET_BIT(cap, WF_MGMT_CAP_PBCC); | ||
| 10096 | + } | ||
| 10097 | + if (adev->cfgopt_dot11ChannelAgility) { | ||
| 10098 | + SET_BIT(cap, WF_MGMT_CAP_AGILITY); | ||
| 10099 | + } | ||
| 10100 | + log(L_DEBUG, "caps updated from 0x%04X to 0x%04X\n", | ||
| 10101 | + adev->capabilities, cap); | ||
| 10102 | + adev->capabilities = cap; | ||
| 10103 | +} | ||
| 10104 | + | ||
| 10105 | +/*********************************************************************** | ||
| 10106 | +** Common function to parse ALL configoption struct formats | ||
| 10107 | +** (ACX100 and ACX111; FIXME: how to make it work with ACX100 USB!?!?). | ||
| 10108 | +** FIXME: logging should be removed here and added to a /proc file instead | ||
| 10109 | +*/ | ||
| 10110 | +void | ||
| 10111 | +acx_s_parse_configoption(acx_device_t *adev, const acx111_ie_configoption_t *pcfg) | ||
| 10112 | +{ | ||
| 10113 | + const u8 *pEle; | ||
| 10114 | + int i; | ||
| 10115 | + int is_acx111 = IS_ACX111(adev); | ||
| 10116 | + | ||
| 10117 | + if (acx_debug & L_DEBUG) { | ||
| 10118 | + printk("configoption struct content:\n"); | ||
| 10119 | + acx_dump_bytes(pcfg, sizeof(*pcfg)); | ||
| 10120 | + } | ||
| 10121 | + | ||
| 10122 | + if (( is_acx111 && (adev->eeprom_version == 5)) | ||
| 10123 | + || (!is_acx111 && (adev->eeprom_version == 4)) | ||
| 10124 | + || (!is_acx111 && (adev->eeprom_version == 5))) { | ||
| 10125 | + /* these versions are known to be supported */ | ||
| 10126 | + } else { | ||
| 10127 | + printk("unknown chip and EEPROM version combination (%s, v%d), " | ||
| 10128 | + "don't know how to parse config options yet. " | ||
| 10129 | + "Please report\n", is_acx111 ? "ACX111" : "ACX100", | ||
| 10130 | + adev->eeprom_version); | ||
| 10131 | + return; | ||
| 10132 | + } | ||
| 10133 | + | ||
| 10134 | + /* first custom-parse the first part which has chip-specific layout */ | ||
| 10135 | + | ||
| 10136 | + pEle = (const u8 *) pcfg; | ||
| 10137 | + | ||
| 10138 | + pEle += 4; /* skip (type,len) header */ | ||
| 10139 | + | ||
| 10140 | + memcpy(adev->cfgopt_NVSv, pEle, sizeof(adev->cfgopt_NVSv)); | ||
| 10141 | + pEle += sizeof(adev->cfgopt_NVSv); | ||
| 10142 | + | ||
| 10143 | + if (is_acx111) { | ||
| 10144 | + adev->cfgopt_NVS_vendor_offs = le16_to_cpu(*(u16 *)pEle); | ||
| 10145 | + pEle += sizeof(adev->cfgopt_NVS_vendor_offs); | ||
| 10146 | + | ||
| 10147 | + adev->cfgopt_probe_delay = 200; /* good default value? */ | ||
| 10148 | + pEle += 2; /* FIXME: unknown, value 0x0001 */ | ||
| 10149 | + } else { | ||
| 10150 | + memcpy(adev->cfgopt_MAC, pEle, sizeof(adev->cfgopt_MAC)); | ||
| 10151 | + pEle += sizeof(adev->cfgopt_MAC); | ||
| 10152 | + | ||
| 10153 | + adev->cfgopt_probe_delay = le16_to_cpu(*(u16 *)pEle); | ||
| 10154 | + pEle += sizeof(adev->cfgopt_probe_delay); | ||
| 10155 | + if ((adev->cfgopt_probe_delay < 100) || (adev->cfgopt_probe_delay > 500)) { | ||
| 10156 | + printk("strange probe_delay value %d, " | ||
| 10157 | + "tweaking to 200\n", adev->cfgopt_probe_delay); | ||
| 10158 | + adev->cfgopt_probe_delay = 200; | ||
| 10159 | + } | ||
| 10160 | + } | ||
| 10161 | + | ||
| 10162 | + adev->cfgopt_eof_memory = le32_to_cpu(*(u32 *)pEle); | ||
| 10163 | + pEle += sizeof(adev->cfgopt_eof_memory); | ||
| 10164 | + | ||
| 10165 | + printk("NVS_vendor_offs:%04X probe_delay:%d eof_memory:%d\n", | ||
| 10166 | + adev->cfgopt_NVS_vendor_offs, | ||
| 10167 | + adev->cfgopt_probe_delay, | ||
| 10168 | + adev->cfgopt_eof_memory); | ||
| 10169 | + | ||
| 10170 | + adev->cfgopt_dot11CCAModes = *pEle++; | ||
| 10171 | + adev->cfgopt_dot11Diversity = *pEle++; | ||
| 10172 | + adev->cfgopt_dot11ShortPreambleOption = *pEle++; | ||
| 10173 | + adev->cfgopt_dot11PBCCOption = *pEle++; | ||
| 10174 | + adev->cfgopt_dot11ChannelAgility = *pEle++; | ||
| 10175 | + adev->cfgopt_dot11PhyType = *pEle++; | ||
| 10176 | + adev->cfgopt_dot11TempType = *pEle++; | ||
| 10177 | + printk("CCAModes:%02X Diversity:%02X ShortPreOpt:%02X " | ||
| 10178 | + "PBCC:%02X ChanAgil:%02X PHY:%02X Temp:%02X\n", | ||
| 10179 | + adev->cfgopt_dot11CCAModes, | ||
| 10180 | + adev->cfgopt_dot11Diversity, | ||
| 10181 | + adev->cfgopt_dot11ShortPreambleOption, | ||
| 10182 | + adev->cfgopt_dot11PBCCOption, | ||
| 10183 | + adev->cfgopt_dot11ChannelAgility, | ||
| 10184 | + adev->cfgopt_dot11PhyType, | ||
| 10185 | + adev->cfgopt_dot11TempType); | ||
| 10186 | + | ||
| 10187 | + /* then use common parsing for next part which has common layout */ | ||
| 10188 | + | ||
| 10189 | + pEle++; /* skip table_count (6) */ | ||
| 10190 | + | ||
| 10191 | + if (IS_MEM(adev) && IS_ACX100(adev)) | ||
| 10192 | + { | ||
| 10193 | + /* | ||
| 10194 | + * For iPaq hx4700 Generic Slave F/W 1.10.7.K. I'm not sure if these | ||
| 10195 | + * 4 extra bytes are before the dot11 things above or after, so I'm just | ||
| 10196 | + * going to guess after. If someone sees these aren't reasonable numbers, | ||
| 10197 | + * please fix this. | ||
| 10198 | + * The area from which the dot11 values above are read contains: | ||
| 10199 | + * 04 01 01 01 00 05 01 06 00 02 01 02 | ||
| 10200 | + * the 8 dot11 reads above take care of 8 of them, but which 8... | ||
| 10201 | + */ | ||
| 10202 | + pEle += 4; | ||
| 10203 | + } | ||
| 10204 | + | ||
| 10205 | + adev->cfgopt_antennas.type = pEle[0]; | ||
| 10206 | + adev->cfgopt_antennas.len = pEle[1]; | ||
| 10207 | + printk("AntennaID:%02X Len:%02X Data:", | ||
| 10208 | + adev->cfgopt_antennas.type, adev->cfgopt_antennas.len); | ||
| 10209 | + for (i = 0; i < pEle[1]; i++) { | ||
| 10210 | + adev->cfgopt_antennas.list[i] = pEle[i+2]; | ||
| 10211 | + printk("%02X ", pEle[i+2]); | ||
| 10212 | + } | ||
| 10213 | + printk("\n"); | ||
| 10214 | + | ||
| 10215 | + pEle += pEle[1] + 2; | ||
| 10216 | + adev->cfgopt_power_levels.type = pEle[0]; | ||
| 10217 | + adev->cfgopt_power_levels.len = pEle[1]; | ||
| 10218 | + printk("PowerLevelID:%02X Len:%02X Data:", | ||
| 10219 | + adev->cfgopt_power_levels.type, adev->cfgopt_power_levels.len); | ||
| 10220 | + for (i = 0; i < pEle[1]; i++) { | ||
| 10221 | + adev->cfgopt_power_levels.list[i] = le16_to_cpu(*(u16 *)&pEle[i*2+2]); | ||
| 10222 | + printk("%04X ", adev->cfgopt_power_levels.list[i]); | ||
| 10223 | + } | ||
| 10224 | + printk("\n"); | ||
| 10225 | + | ||
| 10226 | + pEle += pEle[1]*2 + 2; | ||
| 10227 | + adev->cfgopt_data_rates.type = pEle[0]; | ||
| 10228 | + adev->cfgopt_data_rates.len = pEle[1]; | ||
| 10229 | + printk("DataRatesID:%02X Len:%02X Data:", | ||
| 10230 | + adev->cfgopt_data_rates.type, adev->cfgopt_data_rates.len); | ||
| 10231 | + for (i = 0; i < pEle[1]; i++) { | ||
| 10232 | + adev->cfgopt_data_rates.list[i] = pEle[i+2]; | ||
| 10233 | + printk("%02X ", pEle[i+2]); | ||
| 10234 | + } | ||
| 10235 | + printk("\n"); | ||
| 10236 | + | ||
| 10237 | + pEle += pEle[1] + 2; | ||
| 10238 | + adev->cfgopt_domains.type = pEle[0]; | ||
| 10239 | + adev->cfgopt_domains.len = pEle[1]; | ||
| 10240 | + if (IS_MEM(adev) && IS_ACX100(adev)) | ||
| 10241 | + { | ||
| 10242 | + /* | ||
| 10243 | + * For iPaq hx4700 Generic Slave F/W 1.10.7.K. | ||
| 10244 | + * There's an extra byte between this structure and the next | ||
| 10245 | + * that is not accounted for with this structure's length. It's | ||
| 10246 | + * most likely a bug in the firmware, but we can fix it here | ||
| 10247 | + * by bumping the length of this field by 1. | ||
| 10248 | + */ | ||
| 10249 | + adev->cfgopt_domains.len++; | ||
| 10250 | + } | ||
| 10251 | + printk("DomainID:%02X Len:%02X Data:", | ||
| 10252 | + adev->cfgopt_domains.type, adev->cfgopt_domains.len); | ||
| 10253 | + for (i = 0; i < adev->cfgopt_domains.len; i++) { | ||
| 10254 | + adev->cfgopt_domains.list[i] = pEle[i+2]; | ||
| 10255 | + printk("%02X ", pEle[i+2]); | ||
| 10256 | + } | ||
| 10257 | + printk("\n"); | ||
| 10258 | + | ||
| 10259 | + pEle += adev->cfgopt_domains.len + 2; | ||
| 10260 | + | ||
| 10261 | + adev->cfgopt_product_id.type = pEle[0]; | ||
| 10262 | + adev->cfgopt_product_id.len = pEle[1]; | ||
| 10263 | + for (i = 0; i < pEle[1]; i++) { | ||
| 10264 | + adev->cfgopt_product_id.list[i] = pEle[i+2]; | ||
| 10265 | + } | ||
| 10266 | + printk("ProductID:%02X Len:%02X Data:%.*s\n", | ||
| 10267 | + adev->cfgopt_product_id.type, adev->cfgopt_product_id.len, | ||
| 10268 | + adev->cfgopt_product_id.len, (char *)adev->cfgopt_product_id.list); | ||
| 10269 | + | ||
| 10270 | + pEle += pEle[1] + 2; | ||
| 10271 | + adev->cfgopt_manufacturer.type = pEle[0]; | ||
| 10272 | + adev->cfgopt_manufacturer.len = pEle[1]; | ||
| 10273 | + for (i = 0; i < pEle[1]; i++) { | ||
| 10274 | + adev->cfgopt_manufacturer.list[i] = pEle[i+2]; | ||
| 10275 | + } | ||
| 10276 | + printk("ManufacturerID:%02X Len:%02X Data:%.*s\n", | ||
| 10277 | + adev->cfgopt_manufacturer.type, adev->cfgopt_manufacturer.len, | ||
| 10278 | + adev->cfgopt_manufacturer.len, (char *)adev->cfgopt_manufacturer.list); | ||
| 10279 | +/* | ||
| 10280 | + printk("EEPROM part:\n"); | ||
| 10281 | + for (i=0; i<58; i++) { | ||
| 10282 | + printk("%02X =======> 0x%02X\n", | ||
| 10283 | + i, (u8 *)adev->cfgopt_NVSv[i-2]); | ||
| 10284 | + } | ||
| 10285 | +*/ | ||
| 10286 | +} | ||
| 10287 | + | ||
| 10288 | + | ||
| 10289 | +/*********************************************************************** | ||
| 10290 | +*/ | ||
| 10291 | +static int __init | ||
| 10292 | +acx_e_init_module(void) | ||
| 10293 | +{ | ||
| 10294 | + int r1,r2,r3,r4; | ||
| 10295 | + | ||
| 10296 | + acx_struct_size_check(); | ||
| 10297 | + | ||
| 10298 | + printk("acx: this driver is still EXPERIMENTAL\n" | ||
| 10299 | + "acx: reading README file and/or Craig's HOWTO is " | ||
| 10300 | + "recommended, visit http://acx100.sf.net in case " | ||
| 10301 | + "of further questions/discussion\n"); | ||
| 10302 | + | ||
| 10303 | +#if defined(CONFIG_ACX_PCI) | ||
| 10304 | + r1 = acxpci_e_init_module(); | ||
| 10305 | +#else | ||
| 10306 | + r1 = -EINVAL; | ||
| 10307 | +#endif | ||
| 10308 | +#if defined(CONFIG_ACX_MEM) | ||
| 10309 | + r2 = acxmem_e_init_module(); | ||
| 10310 | +#else | ||
| 10311 | + r2 = -EINVAL; | ||
| 10312 | +#endif | ||
| 10313 | +#if defined(CONFIG_ACX_USB) | ||
| 10314 | + r3 = acxusb_e_init_module(); | ||
| 10315 | +#else | ||
| 10316 | + r3 = -EINVAL; | ||
| 10317 | +#endif | ||
| 10318 | +#if defined(CONFIG_ACX_CS) | ||
| 10319 | + r4 = acx_cs_init(); | ||
| 10320 | +#else | ||
| 10321 | + r4 = -EINVAL; | ||
| 10322 | +#endif | ||
| 10323 | + if (r2 && r1 && r3 && r4) { /* all failed! */ | ||
| 10324 | + if (r3 || r1) | ||
| 10325 | + return r3 ? r3 : r1; | ||
| 10326 | + else | ||
| 10327 | + return r2; | ||
| 10328 | + } | ||
| 10329 | + /* return success if at least one succeeded */ | ||
| 10330 | + return 0; | ||
| 10331 | + | ||
| 10332 | +} | ||
| 10333 | + | ||
| 10334 | +static void __exit | ||
| 10335 | +acx_e_cleanup_module(void) | ||
| 10336 | +{ | ||
| 10337 | +#if defined(CONFIG_ACX_PCI) | ||
| 10338 | + acxpci_e_cleanup_module(); | ||
| 10339 | +#endif | ||
| 10340 | +#if defined(CONFIG_ACX_MEM) | ||
| 10341 | + acxmem_e_cleanup_module(); | ||
| 10342 | +#endif | ||
| 10343 | +#if defined(CONFIG_ACX_USB) | ||
| 10344 | + acxusb_e_cleanup_module(); | ||
| 10345 | +#endif | ||
| 10346 | +#if defined(CONFIG_ACX_CS) | ||
| 10347 | + acx_cs_cleanup(); | ||
| 10348 | +#endif | ||
| 10349 | +} | ||
| 10350 | + | ||
| 10351 | +module_init(acx_e_init_module) | ||
| 10352 | +module_exit(acx_e_cleanup_module) | ||
| 10353 | Index: linux-2.6.23/drivers/net/wireless/acx/conv.c | ||
| 10354 | =================================================================== | ||
| 10355 | --- /dev/null 1970-01-01 00:00:00.000000000 +0000 | ||
| 10356 | +++ linux-2.6.23/drivers/net/wireless/acx/conv.c 2008-01-20 21:13:40.000000000 +0000 | ||
| 10357 | @@ -0,0 +1,504 @@ | ||
| 10358 | +/*********************************************************************** | ||
| 10359 | +** Copyright (C) 2003 ACX100 Open Source Project | ||
| 10360 | +** | ||
| 10361 | +** The contents of this file are subject to the Mozilla Public | ||
| 10362 | +** License Version 1.1 (the "License"); you may not use this file | ||
| 10363 | +** except in compliance with the License. You may obtain a copy of | ||
| 10364 | +** the License at http://www.mozilla.org/MPL/ | ||
| 10365 | +** | ||
| 10366 | +** Software distributed under the License is distributed on an "AS | ||
| 10367 | +** IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or | ||
| 10368 | +** implied. See the License for the specific language governing | ||
| 10369 | +** rights and limitations under the License. | ||
| 10370 | +** | ||
| 10371 | +** Alternatively, the contents of this file may be used under the | ||
| 10372 | +** terms of the GNU Public License version 2 (the "GPL"), in which | ||
| 10373 | +** case the provisions of the GPL are applicable instead of the | ||
| 10374 | +** above. If you wish to allow the use of your version of this file | ||
| 10375 | +** only under the terms of the GPL and not to allow others to use | ||
| 10376 | +** your version of this file under the MPL, indicate your decision | ||
| 10377 | +** by deleting the provisions above and replace them with the notice | ||
| 10378 | +** and other provisions required by the GPL. If you do not delete | ||
| 10379 | +** the provisions above, a recipient may use your version of this | ||
| 10380 | +** file under either the MPL or the GPL. | ||
| 10381 | +** --------------------------------------------------------------------- | ||
| 10382 | +** Inquiries regarding the ACX100 Open Source Project can be | ||
| 10383 | +** made directly to: | ||
| 10384 | +** | ||
| 10385 | +** acx100-users@lists.sf.net | ||
| 10386 | +** http://acx100.sf.net | ||
| 10387 | +** --------------------------------------------------------------------- | ||
| 10388 | +*/ | ||
| 10389 | + | ||
| 10390 | +#include <linux/version.h> | ||
| 10391 | +#if LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 18) | ||
| 10392 | +#include <linux/config.h> | ||
| 10393 | +#endif | ||
| 10394 | +#include <linux/skbuff.h> | ||
| 10395 | +#include <linux/if_arp.h> | ||
| 10396 | +#include <linux/etherdevice.h> | ||
| 10397 | +#include <linux/wireless.h> | ||
| 10398 | +#include <net/iw_handler.h> | ||
| 10399 | + | ||
| 10400 | +#include "acx.h" | ||
| 10401 | + | ||
| 10402 | + | ||
| 10403 | +/*********************************************************************** | ||
| 10404 | +** proto_is_stt | ||
| 10405 | +** | ||
| 10406 | +** Searches the 802.1h Selective Translation Table for a given | ||
| 10407 | +** protocol. | ||
| 10408 | +** | ||
| 10409 | +** prottype - protocol number (in host order) to search for. | ||
| 10410 | +** | ||
| 10411 | +** Returns: | ||
| 10412 | +** 1 - if the table is empty or a match is found. | ||
| 10413 | +** 0 - if the table is non-empty and a match is not found. | ||
| 10414 | +** | ||
| 10415 | +** Based largely on p80211conv.c of the linux-wlan-ng project | ||
| 10416 | +*/ | ||
| 10417 | +static inline int | ||
| 10418 | +proto_is_stt(unsigned int proto) | ||
| 10419 | +{ | ||
| 10420 | + /* Always return found for now. This is the behavior used by the */ | ||
| 10421 | + /* Zoom Win95 driver when 802.1h mode is selected */ | ||
| 10422 | + /* TODO: If necessary, add an actual search we'll probably | ||
| 10423 | + need this to match the CMAC's way of doing things. | ||
| 10424 | + Need to do some testing to confirm. | ||
| 10425 | + */ | ||
| 10426 | + | ||
| 10427 | + if (proto == 0x80f3) /* APPLETALK */ | ||
| 10428 | + return 1; | ||
| 10429 | + | ||
| 10430 | + return 0; | ||
| 10431 | +/* return ((prottype == ETH_P_AARP) || (prottype == ETH_P_IPX)); */ | ||
| 10432 | +} | ||
| 10433 | + | ||
| 10434 | +/* Helpers */ | ||
| 10435 | + | ||
| 10436 | +static inline void | ||
| 10437 | +store_llc_snap(struct wlan_llc *llc) | ||
| 10438 | +{ | ||
| 10439 | + llc->dsap = 0xaa; /* SNAP, see IEEE 802 */ | ||
| 10440 | + llc->ssap = 0xaa; | ||
| 10441 | + llc->ctl = 0x03; | ||
| 10442 | +} | ||
| 10443 | +static inline int | ||
| 10444 | +llc_is_snap(const struct wlan_llc *llc) | ||
| 10445 | +{ | ||
| 10446 | + return (llc->dsap == 0xaa) | ||
| 10447 | + && (llc->ssap == 0xaa) | ||
| 10448 | + && (llc->ctl == 0x03); | ||
| 10449 | +} | ||
| 10450 | +static inline void | ||
| 10451 | +store_oui_rfc1042(struct wlan_snap *snap) | ||
| 10452 | +{ | ||
| 10453 | + snap->oui[0] = 0; | ||
| 10454 | + snap->oui[1] = 0; | ||
| 10455 | + snap->oui[2] = 0; | ||
| 10456 | +} | ||
| 10457 | +static inline int | ||
| 10458 | +oui_is_rfc1042(const struct wlan_snap *snap) | ||
| 10459 | +{ | ||
| 10460 | + return (snap->oui[0] == 0) | ||
| 10461 | + && (snap->oui[1] == 0) | ||
| 10462 | + && (snap->oui[2] == 0); | ||
| 10463 | +} | ||
| 10464 | +static inline void | ||
| 10465 | +store_oui_8021h(struct wlan_snap *snap) | ||
| 10466 | +{ | ||
| 10467 | + snap->oui[0] = 0; | ||
| 10468 | + snap->oui[1] = 0; | ||
| 10469 | + snap->oui[2] = 0xf8; | ||
| 10470 | +} | ||
| 10471 | +static inline int | ||
| 10472 | +oui_is_8021h(const struct wlan_snap *snap) | ||
| 10473 | +{ | ||
| 10474 | + return (snap->oui[0] == 0) | ||
| 10475 | + && (snap->oui[1] == 0) | ||
| 10476 | + && (snap->oui[2] == 0xf8); | ||
| 10477 | +} | ||
| 10478 | + | ||
| 10479 | + | ||
| 10480 | +/*********************************************************************** | ||
| 10481 | +** acx_ether_to_txbuf | ||
| 10482 | +** | ||
| 10483 | +** Uses the contents of the ether frame to build the elements of | ||
| 10484 | +** the 802.11 frame. | ||
| 10485 | +** | ||
| 10486 | +** We don't actually set up the frame header here. That's the | ||
| 10487 | +** MAC's job. We're only handling conversion of DIXII or 802.3+LLC | ||
| 10488 | +** frames to something that works with 802.11. | ||
| 10489 | +** | ||
| 10490 | +** Based largely on p80211conv.c of the linux-wlan-ng project | ||
| 10491 | +*/ | ||
| 10492 | +int | ||
| 10493 | +acx_ether_to_txbuf(acx_device_t *adev, void *txbuf, const struct sk_buff *skb) | ||
| 10494 | +{ | ||
| 10495 | + struct wlan_hdr_a3 *w_hdr; | ||
| 10496 | + struct wlan_ethhdr *e_hdr; | ||
| 10497 | + struct wlan_llc *e_llc; | ||
| 10498 | + struct wlan_snap *e_snap; | ||
| 10499 | + const u8 *a1, *a3; | ||
| 10500 | + int header_len, payload_len = -1; | ||
| 10501 | + /* protocol type or data length, depending on whether | ||
| 10502 | + * DIX or 802.3 ethernet format */ | ||
| 10503 | + u16 proto; | ||
| 10504 | + u16 fc; | ||
| 10505 | + | ||
| 10506 | + FN_ENTER; | ||
| 10507 | + | ||
| 10508 | + if (unlikely(!skb->len)) { | ||
| 10509 | + log(L_DEBUG, "zero-length skb!\n"); | ||
| 10510 | + goto end; | ||
| 10511 | + } | ||
| 10512 | + | ||
| 10513 | + w_hdr = (struct wlan_hdr_a3*)txbuf; | ||
| 10514 | + | ||
| 10515 | + switch (adev->mode) { | ||
| 10516 | + case ACX_MODE_MONITOR: | ||
| 10517 | + /* NB: one day we might want to play with DESC_CTL2_FCS | ||
| 10518 | + ** Will need to stop doing "- WLAN_FCS_LEN" here then */ | ||
| 10519 | + if (unlikely(skb->len >= WLAN_A4FR_MAXLEN_WEP_FCS - WLAN_FCS_LEN)) { | ||
| 10520 | + printk("%s: can't tx oversized frame (%d bytes)\n", | ||
| 10521 | + adev->ndev->name, skb->len); | ||
| 10522 | + goto end; | ||
| 10523 | + } | ||
| 10524 | + memcpy(w_hdr, skb->data, skb->len); | ||
| 10525 | + payload_len = skb->len; | ||
| 10526 | + goto end; | ||
| 10527 | + } | ||
| 10528 | + | ||
| 10529 | + /* step 1: classify ether frame, DIX or 802.3? */ | ||
| 10530 | + e_hdr = (wlan_ethhdr_t *)skb->data; | ||
| 10531 | + proto = ntohs(e_hdr->type); | ||
| 10532 | + if (proto <= 1500) { | ||
| 10533 | + log(L_DEBUG, "tx: 802.3 len: %d\n", skb->len); | ||
| 10534 | + /* codes <= 1500 reserved for 802.3 lengths */ | ||
| 10535 | + /* it's 802.3, pass ether payload unchanged, */ | ||
| 10536 | + /* trim off ethernet header and copy payload to txdesc */ | ||
| 10537 | + header_len = WLAN_HDR_A3_LEN; | ||
| 10538 | + } else { | ||
| 10539 | + /* it's DIXII, time for some conversion */ | ||
| 10540 | + /* Create 802.11 packet. Header also contains llc and snap. */ | ||
| 10541 | + | ||
| 10542 | + log(L_DEBUG, "tx: DIXII len: %d\n", skb->len); | ||
| 10543 | + | ||
| 10544 | + /* size of header is 802.11 header + llc + snap */ | ||
| 10545 | + header_len = WLAN_HDR_A3_LEN + sizeof(wlan_llc_t) + sizeof(wlan_snap_t); | ||
| 10546 | + /* llc is located behind the 802.11 header */ | ||
| 10547 | + e_llc = (wlan_llc_t*)(w_hdr + 1); | ||
| 10548 | + /* snap is located behind the llc */ | ||
| 10549 | + e_snap = (wlan_snap_t*)(e_llc + 1); | ||
| 10550 | + | ||
| 10551 | + /* setup the LLC header */ | ||
| 10552 | + store_llc_snap(e_llc); | ||
| 10553 | + | ||
| 10554 | + /* setup the SNAP header */ | ||
| 10555 | + e_snap->type = htons(proto); | ||
| 10556 | + if (proto_is_stt(proto)) { | ||
| 10557 | + store_oui_8021h(e_snap); | ||
| 10558 | + } else { | ||
| 10559 | + store_oui_rfc1042(e_snap); | ||
| 10560 | + } | ||
| 10561 | + } | ||
| 10562 | + /* trim off ethernet header and copy payload to txbuf */ | ||
| 10563 | + payload_len = skb->len - sizeof(wlan_ethhdr_t); | ||
| 10564 | + /* TODO: can we just let acx DMA payload from skb instead? */ | ||
| 10565 | + memcpy((u8*)txbuf + header_len, skb->data + sizeof(wlan_ethhdr_t), payload_len); | ||
| 10566 | + payload_len += header_len; | ||
| 10567 | + | ||
| 10568 | + /* Set up the 802.11 header */ | ||
| 10569 | + switch (adev->mode) { | ||
| 10570 | + case ACX_MODE_0_ADHOC: | ||
| 10571 | + fc = (WF_FTYPE_DATAi | WF_FSTYPE_DATAONLYi); | ||
| 10572 | + a1 = e_hdr->daddr; | ||
| 10573 | + a3 = adev->bssid; | ||
| 10574 | + break; | ||
| 10575 | + case ACX_MODE_2_STA: | ||
| 10576 | + fc = (WF_FTYPE_DATAi | WF_FSTYPE_DATAONLYi | WF_FC_TODSi); | ||
| 10577 | + a1 = adev->bssid; | ||
| 10578 | + a3 = e_hdr->daddr; | ||
| 10579 | + break; | ||
| 10580 | + case ACX_MODE_3_AP: | ||
| 10581 | + fc = (WF_FTYPE_DATAi | WF_FSTYPE_DATAONLYi | WF_FC_FROMDSi); | ||
| 10582 | + a1 = e_hdr->daddr; | ||
| 10583 | + a3 = e_hdr->saddr; | ||
| 10584 | + break; | ||
| 10585 | + default: | ||
| 10586 | + printk("%s: error - converting eth to wlan in unknown mode\n", | ||
| 10587 | + adev->ndev->name); | ||
| 10588 | + payload_len = -1; | ||
| 10589 | + goto end; | ||
| 10590 | + } | ||
| 10591 | + if (adev->wep_enabled) | ||
| 10592 | + SET_BIT(fc, WF_FC_ISWEPi); | ||
| 10593 | + | ||
| 10594 | + w_hdr->fc = fc; | ||
| 10595 | + w_hdr->dur = 0; | ||
| 10596 | + MAC_COPY(w_hdr->a1, a1); | ||
| 10597 | + MAC_COPY(w_hdr->a2, adev->dev_addr); | ||
| 10598 | + MAC_COPY(w_hdr->a3, a3); | ||
| 10599 | + w_hdr->seq = 0; | ||
| 10600 | + | ||
| 10601 | +#ifdef DEBUG_CONVERT | ||
| 10602 | + if (acx_debug & L_DATA) { | ||
| 10603 | + printk("original eth frame [%d]: ", skb->len); | ||
| 10604 | + acx_dump_bytes(skb->data, skb->len); | ||
| 10605 | + printk("802.11 frame [%d]: ", payload_len); | ||
| 10606 | + acx_dump_bytes(w_hdr, payload_len); | ||
| 10607 | + } | ||
| 10608 | +#endif | ||
| 10609 | + | ||
| 10610 | +end: | ||
| 10611 | + FN_EXIT1(payload_len); | ||
| 10612 | + return payload_len; | ||
| 10613 | +} | ||
| 10614 | + | ||
| 10615 | + | ||
| 10616 | +/*********************************************************************** | ||
| 10617 | +** acx_rxbuf_to_ether | ||
| 10618 | +** | ||
| 10619 | +** Uses the contents of a received 802.11 frame to build an ether | ||
| 10620 | +** frame. | ||
| 10621 | +** | ||
| 10622 | +** This function extracts the src and dest address from the 802.11 | ||
| 10623 | +** frame to use in the construction of the eth frame. | ||
| 10624 | +** | ||
| 10625 | +** Based largely on p80211conv.c of the linux-wlan-ng project | ||
| 10626 | +*/ | ||
| 10627 | +struct sk_buff* | ||
| 10628 | +acx_rxbuf_to_ether(acx_device_t *adev, rxbuffer_t *rxbuf) | ||
| 10629 | +{ | ||
| 10630 | + struct wlan_hdr *w_hdr; | ||
| 10631 | + struct wlan_ethhdr *e_hdr; | ||
| 10632 | + struct wlan_llc *e_llc; | ||
| 10633 | + struct wlan_snap *e_snap; | ||
| 10634 | + struct sk_buff *skb; | ||
| 10635 | + const u8 *daddr; | ||
| 10636 | + const u8 *saddr; | ||
| 10637 | + const u8 *e_payload; | ||
| 10638 | + int buflen, payload_length; | ||
| 10639 | + unsigned int payload_offset, mtu; | ||
| 10640 | + u16 fc; | ||
| 10641 | + | ||
| 10642 | + FN_ENTER; | ||
| 10643 | + | ||
| 10644 | + /* This looks complex because it must handle possible | ||
| 10645 | + ** phy header in rxbuff */ | ||
| 10646 | + w_hdr = acx_get_wlan_hdr(adev, rxbuf); | ||
| 10647 | + payload_offset = WLAN_HDR_A3_LEN; /* it is relative to w_hdr */ | ||
| 10648 | + payload_length = RXBUF_BYTES_USED(rxbuf) /* entire rxbuff... */ | ||
| 10649 | + - ((u8*)w_hdr - (u8*)rxbuf) /* minus space before 802.11 frame */ | ||
| 10650 | + - WLAN_HDR_A3_LEN; /* minus 802.11 header */ | ||
| 10651 | + | ||
| 10652 | + /* setup some vars for convenience */ | ||
| 10653 | + fc = w_hdr->fc; | ||
| 10654 | + switch (WF_FC_FROMTODSi & fc) { | ||
| 10655 | + case 0: | ||
| 10656 | + daddr = w_hdr->a1; | ||
| 10657 | + saddr = w_hdr->a2; | ||
| 10658 | + break; | ||
| 10659 | + case WF_FC_FROMDSi: | ||
| 10660 | + daddr = w_hdr->a1; | ||
| 10661 | + saddr = w_hdr->a3; | ||
| 10662 | + break; | ||
| 10663 | + case WF_FC_TODSi: | ||
| 10664 | + daddr = w_hdr->a3; | ||
| 10665 | + saddr = w_hdr->a2; | ||
| 10666 | + break; | ||
| 10667 | + default: /* WF_FC_FROMTODSi */ | ||
| 10668 | + payload_offset += (WLAN_HDR_A4_LEN - WLAN_HDR_A3_LEN); | ||
| 10669 | + payload_length -= (WLAN_HDR_A4_LEN - WLAN_HDR_A3_LEN); | ||
| 10670 | + daddr = w_hdr->a3; | ||
| 10671 | + saddr = w_hdr->a4; | ||
| 10672 | + } | ||
| 10673 | + | ||
| 10674 | + if ((WF_FC_ISWEPi & fc) && IS_ACX100(adev)) { | ||
| 10675 | + /* chop off the IV+ICV WEP header and footer */ | ||
| 10676 | + log(L_DATA|L_DEBUG, "rx: WEP packet, " | ||
| 10677 | + "chopping off IV and ICV\n"); | ||
| 10678 | + payload_offset += WLAN_WEP_IV_LEN; | ||
| 10679 | + payload_length -= WLAN_WEP_IV_LEN + WLAN_WEP_ICV_LEN; | ||
| 10680 | + } | ||
| 10681 | + | ||
| 10682 | + if (unlikely(payload_length < 0)) { | ||
| 10683 | + printk("%s: rx frame too short, ignored\n", adev->ndev->name); | ||
| 10684 | + goto ret_null; | ||
| 10685 | + } | ||
| 10686 | + | ||
| 10687 | + e_hdr = (wlan_ethhdr_t*) ((u8*) w_hdr + payload_offset); | ||
| 10688 | + e_llc = (wlan_llc_t*) e_hdr; | ||
| 10689 | + e_snap = (wlan_snap_t*) (e_llc + 1); | ||
| 10690 | + mtu = adev->ndev->mtu; | ||
| 10691 | + e_payload = (u8*) (e_snap + 1); | ||
| 10692 | + | ||
| 10693 | + log(L_DATA, "rx: payload_offset %d, payload_length %d\n", | ||
| 10694 | + payload_offset, payload_length); | ||
| 10695 | + log(L_XFER|L_DATA, | ||
| 10696 | + "rx: frame info: llc=%02X%02X%02X " | ||
| 10697 | + "snap.oui=%02X%02X%02X snap.type=%04X\n", | ||
| 10698 | + e_llc->dsap, e_llc->ssap, e_llc->ctl, | ||
| 10699 | + e_snap->oui[0], e_snap->oui[1], e_snap->oui[2], | ||
| 10700 | + ntohs(e_snap->type)); | ||
| 10701 | + | ||
| 10702 | + /* Test for the various encodings */ | ||
| 10703 | + if ((payload_length >= sizeof(wlan_ethhdr_t)) | ||
| 10704 | + && ((e_llc->dsap != 0xaa) || (e_llc->ssap != 0xaa)) | ||
| 10705 | + && ( (mac_is_equal(daddr, e_hdr->daddr)) | ||
| 10706 | + || (mac_is_equal(saddr, e_hdr->saddr)) | ||
| 10707 | + ) | ||
| 10708 | + ) { | ||
| 10709 | + /* 802.3 Encapsulated: */ | ||
| 10710 | + /* wlan frame body contains complete eth frame (header+body) */ | ||
| 10711 | + log(L_DEBUG|L_DATA, "rx: 802.3 ENCAP len=%d\n", payload_length); | ||
| 10712 | + | ||
| 10713 | + if (unlikely(payload_length > (mtu + ETH_HLEN))) { | ||
| 10714 | + printk("%s: rx: ENCAP frame too large (%d > %d)\n", | ||
| 10715 | + adev->ndev->name, | ||
| 10716 | + payload_length, mtu + ETH_HLEN); | ||
| 10717 | + goto ret_null; | ||
| 10718 | + } | ||
| 10719 | + | ||
| 10720 | + /* allocate space and setup host buffer */ | ||
| 10721 | + buflen = payload_length; | ||
| 10722 | + /* Attempt to align IP header (14 bytes eth header + 2 = 16) */ | ||
| 10723 | + skb = dev_alloc_skb(buflen + 2); | ||
| 10724 | + if (unlikely(!skb)) | ||
| 10725 | + goto no_skb; | ||
| 10726 | + skb_reserve(skb, 2); | ||
| 10727 | + skb_put(skb, buflen); /* make room */ | ||
| 10728 | + | ||
| 10729 | + /* now copy the data from the 80211 frame */ | ||
| 10730 | + memcpy(skb->data, e_hdr, payload_length); | ||
| 10731 | + | ||
| 10732 | + } else if ( (payload_length >= sizeof(wlan_llc_t)+sizeof(wlan_snap_t)) | ||
| 10733 | + && llc_is_snap(e_llc) ) { | ||
| 10734 | + /* wlan frame body contains: AA AA 03 ... (it's a SNAP) */ | ||
| 10735 | + | ||
| 10736 | + if ( !oui_is_rfc1042(e_snap) | ||
| 10737 | + || (proto_is_stt(ieee2host16(e_snap->type)) /* && (ethconv == WLAN_ETHCONV_8021h) */)) { | ||
| 10738 | + log(L_DEBUG|L_DATA, "rx: SNAP+RFC1042 len=%d\n", payload_length); | ||
| 10739 | + /* wlan frame body contains: AA AA 03 !(00 00 00) ... -or- */ | ||
| 10740 | + /* wlan frame body contains: AA AA 03 00 00 00 0x80f3 ... */ | ||
| 10741 | + /* build eth hdr, type = len, copy AA AA 03... as eth body */ | ||
| 10742 | + /* it's a SNAP + RFC1042 frame && protocol is in STT */ | ||
| 10743 | + | ||
| 10744 | + if (unlikely(payload_length > mtu)) { | ||
| 10745 | + printk("%s: rx: SNAP frame too large (%d > %d)\n", | ||
| 10746 | + adev->ndev->name, | ||
| 10747 | + payload_length, mtu); | ||
| 10748 | + goto ret_null; | ||
| 10749 | + } | ||
| 10750 | + | ||
| 10751 | + /* allocate space and setup host buffer */ | ||
| 10752 | + buflen = payload_length + ETH_HLEN; | ||
| 10753 | + skb = dev_alloc_skb(buflen + 2); | ||
| 10754 | + if (unlikely(!skb)) | ||
| 10755 | + goto no_skb; | ||
| 10756 | + skb_reserve(skb, 2); | ||
| 10757 | + skb_put(skb, buflen); /* make room */ | ||
| 10758 | + | ||
| 10759 | + /* create 802.3 header */ | ||
| 10760 | + e_hdr = (wlan_ethhdr_t*) skb->data; | ||
| 10761 | + MAC_COPY(e_hdr->daddr, daddr); | ||
| 10762 | + MAC_COPY(e_hdr->saddr, saddr); | ||
| 10763 | + e_hdr->type = htons(payload_length); | ||
| 10764 | + | ||
| 10765 | + /* Now copy the data from the 80211 frame. | ||
| 10766 | + Make room in front for the eth header, and keep the | ||
| 10767 | + llc and snap from the 802.11 payload */ | ||
| 10768 | + memcpy(skb->data + ETH_HLEN, | ||
| 10769 | + e_llc, payload_length); | ||
| 10770 | + | ||
| 10771 | + } else { | ||
| 10772 | + /* wlan frame body contains: AA AA 03 00 00 00 [type] [tail] */ | ||
| 10773 | + /* build eth hdr, type=[type], copy [tail] as eth body */ | ||
| 10774 | + log(L_DEBUG|L_DATA, "rx: 802.1h/RFC1042 len=%d\n", | ||
| 10775 | + payload_length); | ||
| 10776 | + /* it's an 802.1h frame (an RFC1042 && protocol is not in STT) */ | ||
| 10777 | + /* build a DIXII + RFC894 */ | ||
| 10778 | + | ||
| 10779 | + payload_length -= sizeof(wlan_llc_t) + sizeof(wlan_snap_t); | ||
| 10780 | + if (unlikely(payload_length > mtu)) { | ||
| 10781 | + printk("%s: rx: DIXII frame too large (%d > %d)\n", | ||
| 10782 | + adev->ndev->name, | ||
| 10783 | + payload_length, mtu); | ||
| 10784 | + goto ret_null; | ||
| 10785 | + } | ||
| 10786 | + | ||
| 10787 | + /* allocate space and setup host buffer */ | ||
| 10788 | + buflen = payload_length + ETH_HLEN; | ||
| 10789 | + skb = dev_alloc_skb(buflen + 2); | ||
| 10790 | + if (unlikely(!skb)) | ||
| 10791 | + goto no_skb; | ||
| 10792 | + skb_reserve(skb, 2); | ||
| 10793 | + skb_put(skb, buflen); /* make room */ | ||
| 10794 | + | ||
| 10795 | + /* create 802.3 header */ | ||
| 10796 | + e_hdr = (wlan_ethhdr_t *) skb->data; | ||
| 10797 | + MAC_COPY(e_hdr->daddr, daddr); | ||
| 10798 | + MAC_COPY(e_hdr->saddr, saddr); | ||
| 10799 | + e_hdr->type = e_snap->type; | ||
| 10800 | + | ||
| 10801 | + /* Now copy the data from the 80211 frame. | ||
| 10802 | + Make room in front for the eth header, and cut off the | ||
| 10803 | + llc and snap from the 802.11 payload */ | ||
| 10804 | + memcpy(skb->data + ETH_HLEN, | ||
| 10805 | + e_payload, payload_length); | ||
| 10806 | + } | ||
| 10807 | + | ||
| 10808 | + } else { | ||
| 10809 | + log(L_DEBUG|L_DATA, "rx: NON-ENCAP len=%d\n", payload_length); | ||
| 10810 | + /* build eth hdr, type=len, copy wlan body as eth body */ | ||
| 10811 | + /* any NON-ENCAP */ | ||
| 10812 | + /* it's a generic 80211+LLC or IPX 'Raw 802.3' */ | ||
| 10813 | + /* build an 802.3 frame */ | ||
| 10814 | + | ||
| 10815 | + if (unlikely(payload_length > mtu)) { | ||
| 10816 | + printk("%s: rx: OTHER frame too large (%d > %d)\n", | ||
| 10817 | + adev->ndev->name, payload_length, mtu); | ||
| 10818 | + goto ret_null; | ||
| 10819 | + } | ||
| 10820 | + | ||
| 10821 | + /* allocate space and setup host buffer */ | ||
| 10822 | + buflen = payload_length + ETH_HLEN; | ||
| 10823 | + skb = dev_alloc_skb(buflen + 2); | ||
| 10824 | + if (unlikely(!skb)) | ||
| 10825 | + goto no_skb; | ||
| 10826 | + skb_reserve(skb, 2); | ||
| 10827 | + skb_put(skb, buflen); /* make room */ | ||
| 10828 | + | ||
| 10829 | + /* set up the 802.3 header */ | ||
| 10830 | + e_hdr = (wlan_ethhdr_t *) skb->data; | ||
| 10831 | + MAC_COPY(e_hdr->daddr, daddr); | ||
| 10832 | + MAC_COPY(e_hdr->saddr, saddr); | ||
| 10833 | + e_hdr->type = htons(payload_length); | ||
| 10834 | + | ||
| 10835 | + /* now copy the data from the 80211 frame */ | ||
| 10836 | + memcpy(skb->data + ETH_HLEN, e_llc, payload_length); | ||
| 10837 | + } | ||
| 10838 | + | ||
| 10839 | + skb->dev = adev->ndev; | ||
| 10840 | + skb->protocol = eth_type_trans(skb, adev->ndev); | ||
| 10841 | + | ||
| 10842 | +#ifdef DEBUG_CONVERT | ||
| 10843 | + if (acx_debug & L_DATA) { | ||
| 10844 | + int len = RXBUF_BYTES_RCVD(adev, rxbuf); | ||
| 10845 | + printk("p802.11 frame [%d]: ", len); | ||
| 10846 | + acx_dump_bytes(w_hdr, len); | ||
| 10847 | + printk("eth frame [%d]: ", skb->len); | ||
| 10848 | + acx_dump_bytes(skb->data, skb->len); | ||
| 10849 | + } | ||
| 10850 | +#endif | ||
| 10851 | + | ||
| 10852 | + FN_EXIT0; | ||
| 10853 | + return skb; | ||
| 10854 | + | ||
| 10855 | +no_skb: | ||
| 10856 | + printk("%s: rx: no memory for skb (%d bytes)\n", | ||
| 10857 | + adev->ndev->name, buflen + 2); | ||
| 10858 | +ret_null: | ||
| 10859 | + FN_EXIT1((int)NULL); | ||
| 10860 | + return NULL; | ||
| 10861 | +} | ||
| 10862 | Index: linux-2.6.23/drivers/net/wireless/acx/cs.c | ||
| 10863 | =================================================================== | ||
| 10864 | --- /dev/null 1970-01-01 00:00:00.000000000 +0000 | ||
| 10865 | +++ linux-2.6.23/drivers/net/wireless/acx/cs.c 2008-01-20 21:13:40.000000000 +0000 | ||
| 10866 | @@ -0,0 +1,5703 @@ | ||
| 10867 | +/*********************************************************************** | ||
| 10868 | +** Copyright (C) 2003 ACX100 Open Source Project | ||
| 10869 | +** | ||
| 10870 | +** The contents of this file are subject to the Mozilla Public | ||
| 10871 | +** License Version 1.1 (the "License"); you may not use this file | ||
| 10872 | +** except in compliance with the License. You may obtain a copy of | ||
| 10873 | +** the License at http://www.mozilla.org/MPL/ | ||
| 10874 | +** | ||
| 10875 | +** Software distributed under the License is distributed on an "AS | ||
| 10876 | +** IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or | ||
| 10877 | +** implied. See the License for the specific language governing | ||
| 10878 | +** rights and limitations under the License. | ||
| 10879 | +** | ||
| 10880 | +** Alternatively, the contents of this file may be used under the | ||
| 10881 | +** terms of the GNU Public License version 2 (the "GPL"), in which | ||
| 10882 | +** case the provisions of the GPL are applicable instead of the | ||
| 10883 | +** above. If you wish to allow the use of your version of this file | ||
| 10884 | +** only under the terms of the GPL and not to allow others to use | ||
| 10885 | +** your version of this file under the MPL, indicate your decision | ||
| 10886 | +** by deleting the provisions above and replace them with the notice | ||
| 10887 | +** and other provisions required by the GPL. If you do not delete | ||
| 10888 | +** the provisions above, a recipient may use your version of this | ||
| 10889 | +** file under either the MPL or the GPL. | ||
| 10890 | +** --------------------------------------------------------------------- | ||
| 10891 | +** Inquiries regarding the ACX100 Open Source Project can be | ||
| 10892 | +** made directly to: | ||
| 10893 | +** | ||
| 10894 | +** acx100-users@lists.sf.net | ||
| 10895 | +** http://acx100.sf.net | ||
| 10896 | +** --------------------------------------------------------------------- | ||
| 10897 | +** | ||
| 10898 | +** Slave memory interface support: | ||
| 10899 | +** | ||
| 10900 | +** Todd Blumer - SDG Systems | ||
| 10901 | +** Bill Reese - HP | ||
| 10902 | +** Eric McCorkle - Shadowsun | ||
| 10903 | +** | ||
| 10904 | +** CF support, (c) Fabrice Crohas, Paul Sokolovsky | ||
| 10905 | +*/ | ||
| 10906 | +#define ACX_MEM 1 | ||
| 10907 | + | ||
| 10908 | +/* | ||
| 10909 | + * non-zero makes it dump the ACX memory to the console then | ||
| 10910 | + * panic when you cat /proc/driver/acx_wlan0_diag | ||
| 10911 | + */ | ||
| 10912 | +#define DUMP_MEM_DEFINED 1 | ||
| 10913 | + | ||
| 10914 | +#define DUMP_MEM_DURING_DIAG 0 | ||
| 10915 | +#define DUMP_IF_SLOW 0 | ||
| 10916 | + | ||
| 10917 | +#define PATCH_AROUND_BAD_SPOTS 1 | ||
| 10918 | +#define HX4700_FIRMWARE_CHECKSUM 0x0036862e | ||
| 10919 | +#define HX4700_ALTERNATE_FIRMWARE_CHECKSUM 0x00368a75 | ||
| 10920 | + | ||
| 10921 | +#include <linux/version.h> | ||
| 10922 | +#if LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 18) | ||
| 10923 | +#include <linux/config.h> | ||
| 10924 | +#endif | ||
| 10925 | + | ||
| 10926 | +/* Linux 2.6.18+ uses <linux/utsrelease.h> */ | ||
| 10927 | +#ifndef UTS_RELEASE | ||
| 10928 | +#include <linux/utsrelease.h> | ||
| 10929 | +#endif | ||
| 10930 | + | ||
| 10931 | +#include <linux/compiler.h> /* required for Lx 2.6.8 ?? */ | ||
| 10932 | +#include <linux/kernel.h> | ||
| 10933 | +#include <linux/module.h> | ||
| 10934 | +#include <linux/moduleparam.h> | ||
| 10935 | +#include <linux/sched.h> | ||
| 10936 | +#include <linux/types.h> | ||
| 10937 | +#include <linux/skbuff.h> | ||
| 10938 | +#include <linux/slab.h> | ||
| 10939 | +#include <linux/if_arp.h> | ||
| 10940 | +#include <linux/irq.h> | ||
| 10941 | +#include <linux/rtnetlink.h> | ||
| 10942 | +#include <linux/wireless.h> | ||
| 10943 | +#include <net/iw_handler.h> | ||
| 10944 | +#include <linux/netdevice.h> | ||
| 10945 | +#include <linux/ioport.h> | ||
| 10946 | +#include <linux/pci.h> | ||
| 10947 | +#include <linux/platform_device.h> | ||
| 10948 | +#include <linux/pm.h> | ||
| 10949 | +#include <linux/vmalloc.h> | ||
| 10950 | +#include <linux/delay.h> | ||
| 10951 | +#include <linux/workqueue.h> | ||
| 10952 | +#include <linux/inetdevice.h> | ||
| 10953 | + | ||
| 10954 | +#define PCMCIA_DEBUG 1 | ||
| 10955 | + | ||
| 10956 | +/* | ||
| 10957 | + All the PCMCIA modules use PCMCIA_DEBUG to control debugging. If | ||
| 10958 | + you do not define PCMCIA_DEBUG at all, all the debug code will be | ||
| 10959 | + left out. If you compile with PCMCIA_DEBUG=0, the debug code will | ||
| 10960 | + be present but disabled -- but it can then be enabled for specific | ||
| 10961 | + modules at load time with a 'pc_debug=#' option to insmod. | ||
| 10962 | + | ||
| 10963 | +*/ | ||
| 10964 | +#include <pcmcia/cs_types.h> | ||
| 10965 | +#include <pcmcia/cs.h> | ||
| 10966 | +#include <pcmcia/cistpl.h> | ||
| 10967 | +#include <pcmcia/cisreg.h> | ||
| 10968 | +#include <pcmcia/ds.h> | ||
| 10969 | +#include "acx.h" | ||
| 10970 | +#include "acx_hw.h" | ||
| 10971 | + | ||
| 10972 | +#ifdef PCMCIA_DEBUG | ||
| 10973 | +static int pc_debug = PCMCIA_DEBUG; | ||
| 10974 | +module_param(pc_debug, int, 0); | ||
| 10975 | +static char *version = "$Revision: 1.10 $"; | ||
| 10976 | +#define DEBUG(n, args...) if (pc_debug>(n)) printk(KERN_DEBUG args); | ||
| 10977 | +#else | ||
| 10978 | +#define DEBUG(n, args...) | ||
| 10979 | +#endif | ||
| 10980 | + | ||
| 10981 | + | ||
| 10982 | +static win_req_t memwin; | ||
| 10983 | + | ||
| 10984 | +typedef struct local_info_t { | ||
| 10985 | + dev_node_t node; | ||
| 10986 | + struct net_device *ndev; | ||
| 10987 | +} local_info_t; | ||
| 10988 | + | ||
| 10989 | +static struct net_device *resume_ndev; | ||
| 10990 | + | ||
| 10991 | + | ||
| 10992 | +/*********************************************************************** | ||
| 10993 | +*/ | ||
| 10994 | + | ||
| 10995 | +#define CARD_EEPROM_ID_SIZE 6 | ||
| 10996 | + | ||
| 10997 | +#include <asm/io.h> | ||
| 10998 | + | ||
| 10999 | +#define REG_ACX_VENDOR_ID 0x900 | ||
| 11000 | +/* | ||
| 11001 | + * This is the vendor id on the HX4700, anyway | ||
| 11002 | + */ | ||
| 11003 | +#define ACX_VENDOR_ID 0x8400104c | ||
| 11004 | + | ||
| 11005 | +typedef enum { | ||
| 11006 | + ACX_SOFT_RESET = 0, | ||
| 11007 | + | ||
| 11008 | + ACX_SLV_REG_ADDR, | ||
| 11009 | + ACX_SLV_REG_DATA, | ||
| 11010 | + ACX_SLV_REG_ADATA, | ||
| 11011 | + | ||
| 11012 | + ACX_SLV_MEM_CP, | ||
| 11013 | + ACX_SLV_MEM_ADDR, | ||
| 11014 | + ACX_SLV_MEM_DATA, | ||
| 11015 | + ACX_SLV_MEM_CTL, | ||
| 11016 | +} acxreg_t; | ||
| 11017 | + | ||
| 11018 | +/*********************************************************************** | ||
| 11019 | +*/ | ||
| 11020 | +static void acxmem_i_tx_timeout(struct net_device *ndev); | ||
| 11021 | +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 19) | ||
| 11022 | +static irqreturn_t acxmem_i_interrupt(int irq, void *dev_id); | ||
| 11023 | +#else | ||
| 11024 | +static irqreturn_t acxmem_i_interrupt(int irq, void *dev_id, struct pt_regs *regs); | ||
| 11025 | +#endif | ||
| 11026 | +static void acxmem_i_set_multicast_list(struct net_device *ndev); | ||
| 11027 | + | ||
| 11028 | +static int acxmem_e_open(struct net_device *ndev); | ||
| 11029 | +static int acxmem_e_close(struct net_device *ndev); | ||
| 11030 | +static void acxmem_s_up(struct net_device *ndev); | ||
| 11031 | +static void acxmem_s_down(struct net_device *ndev); | ||
| 11032 | + | ||
| 11033 | +static void dump_acxmem (acx_device_t *adev, u32 start, int length); | ||
| 11034 | +static int acxmem_complete_hw_reset (acx_device_t *adev); | ||
| 11035 | +static void acxmem_s_delete_dma_regions(acx_device_t *adev); | ||
| 11036 | + | ||
| 11037 | +static int | ||
| 11038 | +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 11) | ||
| 11039 | +acxmem_e_suspend( struct net_device *ndev, pm_message_t state); | ||
| 11040 | +#else | ||
| 11041 | +acxmem_e_suspend( struct net_device *ndev, u32 state); | ||
| 11042 | +#endif | ||
| 11043 | +static void | ||
| 11044 | +fw_resumer(struct work_struct *notused); | ||
| 11045 | +//fw_resumer( void *data ); | ||
| 11046 | + | ||
| 11047 | +static int acx_netdev_event(struct notifier_block *this, unsigned long event, void *ptr) | ||
| 11048 | +{ | ||
| 11049 | + struct net_device *ndev = ptr; | ||
| 11050 | + acx_device_t *adev = ndev2adev(ndev); | ||
| 11051 | + | ||
| 11052 | + /* | ||
| 11053 | + * Upper level ioctl() handlers send a NETDEV_CHANGEADDR if the MAC address changes. | ||
| 11054 | + */ | ||
| 11055 | + | ||
| 11056 | + if (NETDEV_CHANGEADDR == event) { | ||
| 11057 | + /* | ||
| 11058 | + * the upper layers put the new MAC address in ndev->dev_addr; we just copy | ||
| 11059 | + * it over and update the ACX with it. | ||
| 11060 | + */ | ||
| 11061 | + MAC_COPY(adev->dev_addr, adev->ndev->dev_addr); | ||
| 11062 | + adev->set_mask |= GETSET_STATION_ID; | ||
| 11063 | + acx_s_update_card_settings (adev); | ||
| 11064 | + } | ||
| 11065 | + | ||
| 11066 | + return 0; | ||
| 11067 | +} | ||
| 11068 | + | ||
| 11069 | +static struct notifier_block acx_netdev_notifier = { | ||
| 11070 | + .notifier_call = acx_netdev_event, | ||
| 11071 | +}; | ||
| 11072 | + | ||
| 11073 | +/*********************************************************************** | ||
| 11074 | +** Register access | ||
| 11075 | +*/ | ||
| 11076 | + | ||
| 11077 | +/* Pick one */ | ||
| 11078 | +/* #define INLINE_IO static */ | ||
| 11079 | +#define INLINE_IO static inline | ||
| 11080 | + | ||
| 11081 | +INLINE_IO u32 | ||
| 11082 | +read_id_register (acx_device_t *adev) | ||
| 11083 | +{ | ||
| 11084 | + writel (0x24, &adev->iobase[ACX_SLV_REG_ADDR]); | ||
| 11085 | + return readl (&adev->iobase[ACX_SLV_REG_DATA]); | ||
| 11086 | +} | ||
| 11087 | + | ||
| 11088 | +INLINE_IO u32 | ||
| 11089 | +read_reg32(acx_device_t *adev, unsigned int offset) | ||
| 11090 | +{ | ||
| 11091 | + u32 val; | ||
| 11092 | + u32 addr; | ||
| 11093 | + | ||
| 11094 | + if (offset > IO_ACX_ECPU_CTRL) | ||
| 11095 | + addr = offset; | ||
| 11096 | + else | ||
| 11097 | + addr = adev->io[offset]; | ||
| 11098 | + | ||
| 11099 | + if (addr < 0x20) { | ||
| 11100 | + return readl(((u8*)adev->iobase) + addr); | ||
| 11101 | + } | ||
| 11102 | + | ||
| 11103 | + writel( addr, &adev->iobase[ACX_SLV_REG_ADDR] ); | ||
| 11104 | + val = readl( &adev->iobase[ACX_SLV_REG_DATA] ); | ||
| 11105 | + | ||
| 11106 | + return val; | ||
| 11107 | +} | ||
| 11108 | + | ||
| 11109 | +INLINE_IO u16 | ||
| 11110 | +read_reg16(acx_device_t *adev, unsigned int offset) | ||
| 11111 | +{ | ||
| 11112 | + u16 lo; | ||
| 11113 | + u32 addr; | ||
| 11114 | + | ||
| 11115 | + if (offset > IO_ACX_ECPU_CTRL) | ||
| 11116 | + addr = offset; | ||
| 11117 | + else | ||
| 11118 | + addr = adev->io[offset]; | ||
| 11119 | + | ||
| 11120 | + if (addr < 0x20) { | ||
| 11121 | + return readw(((u8 *) adev->iobase) + addr); | ||
| 11122 | + } | ||
| 11123 | + | ||
| 11124 | + writel( addr, &adev->iobase[ACX_SLV_REG_ADDR] ); | ||
| 11125 | + lo = readw( (u16 *)&adev->iobase[ACX_SLV_REG_DATA] ); | ||
| 11126 | + | ||
| 11127 | + return lo; | ||
| 11128 | +} | ||
| 11129 | + | ||
| 11130 | +INLINE_IO u8 | ||
| 11131 | +read_reg8(acx_device_t *adev, unsigned int offset) | ||
| 11132 | +{ | ||
| 11133 | + u8 lo; | ||
| 11134 | + u32 addr; | ||
| 11135 | + | ||
| 11136 | + if (offset > IO_ACX_ECPU_CTRL) | ||
| 11137 | + addr = offset; | ||
| 11138 | + else | ||
| 11139 | + addr = adev->io[offset]; | ||
| 11140 | + | ||
| 11141 | + if (addr < 0x20) | ||
| 11142 | + return readb(((u8 *)adev->iobase) + addr); | ||
| 11143 | + | ||
| 11144 | + writel( addr, &adev->iobase[ACX_SLV_REG_ADDR] ); | ||
| 11145 | + lo = readw( (u8 *)&adev->iobase[ACX_SLV_REG_DATA] ); | ||
| 11146 | + | ||
| 11147 | + return (u8)lo; | ||
| 11148 | +} | ||
| 11149 | + | ||
| 11150 | +INLINE_IO void | ||
| 11151 | +write_reg32(acx_device_t *adev, unsigned int offset, u32 val) | ||
| 11152 | +{ | ||
| 11153 | + u32 addr; | ||
| 11154 | + | ||
| 11155 | + if (offset > IO_ACX_ECPU_CTRL) | ||
| 11156 | + addr = offset; | ||
| 11157 | + else | ||
| 11158 | + addr = adev->io[offset]; | ||
| 11159 | + | ||
| 11160 | + if (addr < 0x20) { | ||
| 11161 | + writel(val, ((u8*)adev->iobase) + addr); | ||
| 11162 | + return; | ||
| 11163 | + } | ||
| 11164 | + | ||
| 11165 | + writel( addr, &adev->iobase[ACX_SLV_REG_ADDR] ); | ||
| 11166 | + writel( val, &adev->iobase[ACX_SLV_REG_DATA] ); | ||
| 11167 | +} | ||
| 11168 | + | ||
| 11169 | +INLINE_IO void | ||
| 11170 | +write_reg16(acx_device_t *adev, unsigned int offset, u16 val) | ||
| 11171 | +{ | ||
| 11172 | + u32 addr; | ||
| 11173 | + | ||
| 11174 | + if (offset > IO_ACX_ECPU_CTRL) | ||
| 11175 | + addr = offset; | ||
| 11176 | + else | ||
| 11177 | + addr = adev->io[offset]; | ||
| 11178 | + | ||
| 11179 | + if (addr < 0x20) { | ||
| 11180 | + writew(val, ((u8 *)adev->iobase) + addr); | ||
| 11181 | + return; | ||
| 11182 | + } | ||
| 11183 | + writel( addr, &adev->iobase[ACX_SLV_REG_ADDR] ); | ||
| 11184 | + writew( val, (u16 *) &adev->iobase[ACX_SLV_REG_DATA] ); | ||
| 11185 | +} | ||
| 11186 | + | ||
| 11187 | +INLINE_IO void | ||
| 11188 | +write_reg8(acx_device_t *adev, unsigned int offset, u8 val) | ||
| 11189 | +{ | ||
| 11190 | + u32 addr; | ||
| 11191 | + | ||
| 11192 | + if (offset > IO_ACX_ECPU_CTRL) | ||
| 11193 | + addr = offset; | ||
| 11194 | + else | ||
| 11195 | + addr = adev->io[offset]; | ||
| 11196 | + | ||
| 11197 | + if (addr < 0x20) { | ||
| 11198 | + writeb(val, ((u8 *) adev->iobase) + addr); | ||
| 11199 | + return; | ||
| 11200 | + } | ||
| 11201 | + writel( addr, &adev->iobase[ACX_SLV_REG_ADDR] ); | ||
| 11202 | + writeb( val, (u8 *)&adev->iobase[ACX_SLV_REG_DATA] ); | ||
| 11203 | +} | ||
| 11204 | + | ||
| 11205 | +/* Handle PCI posting properly: | ||
| 11206 | + * Make sure that writes reach the adapter in case they require to be executed | ||
| 11207 | + * *before* the next write, by reading a random (and safely accessible) register. | ||
| 11208 | + * This call has to be made if there is no read following (which would flush the data | ||
| 11209 | + * to the adapter), yet the written data has to reach the adapter immediately. */ | ||
| 11210 | +INLINE_IO void | ||
| 11211 | +write_flush(acx_device_t *adev) | ||
| 11212 | +{ | ||
| 11213 | + /* readb(adev->iobase + adev->io[IO_ACX_INFO_MAILBOX_OFFS]); */ | ||
| 11214 | + /* faster version (accesses the first register, IO_ACX_SOFT_RESET, | ||
| 11215 | + * which should also be safe): */ | ||
| 11216 | + (void) readl(adev->iobase); | ||
| 11217 | +} | ||
| 11218 | + | ||
| 11219 | +INLINE_IO void | ||
| 11220 | +set_regbits (acx_device_t *adev, unsigned int offset, u32 bits) { | ||
| 11221 | + u32 tmp; | ||
| 11222 | + | ||
| 11223 | + tmp = read_reg32 (adev, offset); | ||
| 11224 | + tmp = tmp | bits; | ||
| 11225 | + write_reg32 (adev, offset, tmp); | ||
| 11226 | + write_flush (adev); | ||
| 11227 | +} | ||
| 11228 | + | ||
| 11229 | +INLINE_IO void | ||
| 11230 | +clear_regbits (acx_device_t *adev, unsigned int offset, u32 bits) { | ||
| 11231 | + u32 tmp; | ||
| 11232 | + | ||
| 11233 | + tmp = read_reg32 (adev, offset); | ||
| 11234 | + tmp = tmp & ~bits; | ||
| 11235 | + write_reg32 (adev, offset, tmp); | ||
| 11236 | + write_flush (adev); | ||
| 11237 | +} | ||
| 11238 | + | ||
| 11239 | +/* | ||
| 11240 | + * Copy from PXA memory to the ACX memory. This assumes both the PXA and ACX | ||
| 11241 | + * addresses are 32 bit aligned. Count is in bytes. | ||
| 11242 | + */ | ||
| 11243 | +INLINE_IO void | ||
| 11244 | +write_slavemem32 (acx_device_t *adev, u32 slave_address, u32 val) | ||
| 11245 | +{ | ||
| 11246 | + write_reg32 (adev, IO_ACX_SLV_MEM_CTL, 0x0); | ||
| 11247 | + write_reg32 (adev, IO_ACX_SLV_MEM_ADDR, slave_address); | ||
| 11248 | + udelay (10); | ||
| 11249 | + write_reg32 (adev, IO_ACX_SLV_MEM_DATA, val); | ||
| 11250 | +} | ||
| 11251 | + | ||
| 11252 | +INLINE_IO u32 | ||
| 11253 | +read_slavemem32 (acx_device_t *adev, u32 slave_address) | ||
| 11254 | +{ | ||
| 11255 | + u32 val; | ||
| 11256 | + | ||
| 11257 | + write_reg32 (adev, IO_ACX_SLV_MEM_CTL, 0x0); | ||
| 11258 | + write_reg32 (adev, IO_ACX_SLV_MEM_ADDR, slave_address); | ||
| 11259 | + udelay (10); | ||
| 11260 | + val = read_reg32 (adev, IO_ACX_SLV_MEM_DATA); | ||
| 11261 | + | ||
| 11262 | + return val; | ||
| 11263 | +} | ||
| 11264 | + | ||
| 11265 | +INLINE_IO void | ||
| 11266 | +write_slavemem8 (acx_device_t *adev, u32 slave_address, u8 val) | ||
| 11267 | +{ | ||
| 11268 | + u32 data; | ||
| 11269 | + u32 base; | ||
| 11270 | + int offset; | ||
| 11271 | + | ||
| 11272 | + /* | ||
| 11273 | + * Get the word containing the target address and the byte offset in that word. | ||
| 11274 | + */ | ||
| 11275 | + base = slave_address & ~3; | ||
| 11276 | + offset = (slave_address & 3) * 8; | ||
| 11277 | + | ||
| 11278 | + data = read_slavemem32 (adev, base); | ||
| 11279 | + data &= ~(0xff << offset); | ||
| 11280 | + data |= val << offset; | ||
| 11281 | + write_slavemem32 (adev, base, data); | ||
| 11282 | +} | ||
| 11283 | + | ||
| 11284 | +INLINE_IO u8 | ||
| 11285 | +read_slavemem8 (acx_device_t *adev, u32 slave_address) | ||
| 11286 | +{ | ||
| 11287 | + u8 val; | ||
| 11288 | + u32 base; | ||
| 11289 | + u32 data; | ||
| 11290 | + int offset; | ||
| 11291 | + | ||
| 11292 | + base = slave_address & ~3; | ||
| 11293 | + offset = (slave_address & 3) * 8; | ||
| 11294 | + | ||
| 11295 | + data = read_slavemem32 (adev, base); | ||
| 11296 | + | ||
| 11297 | + val = (data >> offset) & 0xff; | ||
| 11298 | + | ||
| 11299 | + return val; | ||
| 11300 | +} | ||
| 11301 | + | ||
| 11302 | +/* | ||
| 11303 | + * doesn't split across word boundaries | ||
| 11304 | + */ | ||
| 11305 | +INLINE_IO void | ||
| 11306 | +write_slavemem16 (acx_device_t *adev, u32 slave_address, u16 val) | ||
| 11307 | +{ | ||
| 11308 | + u32 data; | ||
| 11309 | + u32 base; | ||
| 11310 | + int offset; | ||
| 11311 | + | ||
| 11312 | + /* | ||
| 11313 | + * Get the word containing the target address and the byte offset in that word. | ||
| 11314 | + */ | ||
| 11315 | + base = slave_address & ~3; | ||
| 11316 | + offset = (slave_address & 3) * 8; | ||
| 11317 | + | ||
| 11318 | + data = read_slavemem32 (adev, base); | ||
| 11319 | + data &= ~(0xffff << offset); | ||
| 11320 | + data |= val << offset; | ||
| 11321 | + write_slavemem32 (adev, base, data); | ||
| 11322 | +} | ||
| 11323 | + | ||
| 11324 | +/* | ||
| 11325 | + * doesn't split across word boundaries | ||
| 11326 | + */ | ||
| 11327 | +INLINE_IO u16 | ||
| 11328 | +read_slavemem16 (acx_device_t *adev, u32 slave_address) | ||
| 11329 | +{ | ||
| 11330 | + u16 val; | ||
| 11331 | + u32 base; | ||
| 11332 | + u32 data; | ||
| 11333 | + int offset; | ||
| 11334 | + | ||
| 11335 | + base = slave_address & ~3; | ||
| 11336 | + offset = (slave_address & 3) * 8; | ||
| 11337 | + | ||
| 11338 | + data = read_slavemem32 (adev, base); | ||
| 11339 | + | ||
| 11340 | + val = (data >> offset) & 0xffff; | ||
| 11341 | + | ||
| 11342 | + return val; | ||
| 11343 | +} | ||
| 11344 | + | ||
| 11345 | +/* | ||
| 11346 | + * Copy from slave memory | ||
| 11347 | + * | ||
| 11348 | + * TODO - rewrite using address autoincrement, handle partial words | ||
| 11349 | + */ | ||
| 11350 | +void | ||
| 11351 | +copy_from_slavemem (acx_device_t *adev, u8 *destination, u32 source, int count) { | ||
| 11352 | + u32 tmp = 0; | ||
| 11353 | + u8 *ptmp = (u8 *) &tmp; | ||
| 11354 | + | ||
| 11355 | + /* | ||
| 11356 | + * Right now I'm making the assumption that the destination is aligned, but | ||
| 11357 | + * I'd better check. | ||
| 11358 | + */ | ||
| 11359 | + if ((u32) destination & 3) { | ||
| 11360 | + printk ("acx copy_from_slavemem: warning! destination not word-aligned!\n"); | ||
| 11361 | + } | ||
| 11362 | + | ||
| 11363 | + while (count >= 4) { | ||
| 11364 | + write_reg32 (adev, IO_ACX_SLV_MEM_ADDR, source); | ||
| 11365 | + udelay (10); | ||
| 11366 | + *((u32 *) destination) = read_reg32 (adev, IO_ACX_SLV_MEM_DATA); | ||
| 11367 | + count -= 4; | ||
| 11368 | + source += 4; | ||
| 11369 | + destination += 4; | ||
| 11370 | + } | ||
| 11371 | + | ||
| 11372 | + /* | ||
| 11373 | + * If the word reads above didn't satisfy the count, read one more word | ||
| 11374 | + * and transfer a byte at a time until the request is satisfied. | ||
| 11375 | + */ | ||
| 11376 | + if (count) { | ||
| 11377 | + write_reg32 (adev, IO_ACX_SLV_MEM_ADDR, source); | ||
| 11378 | + udelay (10); | ||
| 11379 | + tmp = read_reg32 (adev, IO_ACX_SLV_MEM_DATA); | ||
| 11380 | + while (count--) { | ||
| 11381 | + *destination++ = *ptmp++; | ||
| 11382 | + } | ||
| 11383 | + } | ||
| 11384 | +} | ||
| 11385 | + | ||
| 11386 | +/* | ||
| 11387 | + * Copy to slave memory | ||
| 11388 | + * | ||
| 11389 | + * TODO - rewrite using autoincrement, handle partial words | ||
| 11390 | + */ | ||
| 11391 | +void | ||
| 11392 | +copy_to_slavemem (acx_device_t *adev, u32 destination, u8 *source, int count) | ||
| 11393 | +{ | ||
| 11394 | + u32 tmp = 0; | ||
| 11395 | + u8* ptmp = (u8 *) &tmp; | ||
| 11396 | + static u8 src[512]; /* make static to avoid huge stack objects */ | ||
| 11397 | + | ||
| 11398 | + /* | ||
| 11399 | + * For now, make sure the source is word-aligned by copying it to a word-aligned | ||
| 11400 | + * buffer. Someday rewrite to avoid the extra copy. | ||
| 11401 | + */ | ||
| 11402 | + if (count > sizeof (src)) { | ||
| 11403 | + printk ("acx copy_to_slavemem: Warning! buffer overflow!\n"); | ||
| 11404 | + count = sizeof (src); | ||
| 11405 | + } | ||
| 11406 | + memcpy (src, source, count); | ||
| 11407 | + source = src; | ||
| 11408 | + | ||
| 11409 | + while (count >= 4) { | ||
| 11410 | + write_reg32 (adev, IO_ACX_SLV_MEM_ADDR, destination); | ||
| 11411 | + udelay (10); | ||
| 11412 | + write_reg32 (adev, IO_ACX_SLV_MEM_DATA, *((u32 *) source)); | ||
| 11413 | + count -= 4; | ||
| 11414 | + source += 4; | ||
| 11415 | + destination += 4; | ||
| 11416 | + } | ||
| 11417 | + | ||
| 11418 | + /* | ||
| 11419 | + * If there are leftovers read the next word from the acx and merge in | ||
| 11420 | + * what they want to write. | ||
| 11421 | + */ | ||
| 11422 | + if (count) { | ||
| 11423 | + write_reg32 (adev, IO_ACX_SLV_MEM_ADDR, destination); | ||
| 11424 | + udelay (10); | ||
| 11425 | + tmp = read_reg32 (adev, IO_ACX_SLV_MEM_DATA); | ||
| 11426 | + while (count--) { | ||
| 11427 | + *ptmp++ = *source++; | ||
| 11428 | + } | ||
| 11429 | + /* | ||
| 11430 | + * reset address in case we're currently in auto-increment mode | ||
| 11431 | + */ | ||
| 11432 | + write_reg32 (adev, IO_ACX_SLV_MEM_ADDR, destination); | ||
| 11433 | + udelay (10); | ||
| 11434 | + write_reg32 (adev, IO_ACX_SLV_MEM_DATA, tmp); | ||
| 11435 | + udelay (10); | ||
| 11436 | + } | ||
| 11437 | + | ||
| 11438 | +} | ||
| 11439 | + | ||
| 11440 | +/* | ||
| 11441 | + * Block copy to slave buffers using memory block chain mode. Copies to the ACX | ||
| 11442 | + * transmit buffer structure with minimal intervention on our part. | ||
| 11443 | + * Interrupts should be disabled when calling this. | ||
| 11444 | + */ | ||
| 11445 | +void | ||
| 11446 | +chaincopy_to_slavemem (acx_device_t *adev, u32 destination, u8 *source, int count) | ||
| 11447 | +{ | ||
| 11448 | + u32 val; | ||
| 11449 | + u32 *data = (u32 *) source; | ||
| 11450 | + static u8 aligned_source[WLAN_A4FR_MAXLEN_WEP_FCS]; | ||
| 11451 | + | ||
| 11452 | + /* | ||
| 11453 | + * Warn if the pointers don't look right. Destination must fit in [23:5] with | ||
| 11454 | + * zero elsewhere and source should be 32 bit aligned. | ||
| 11455 | + * This should never happen since we're in control of both, but I want to know about | ||
| 11456 | + * it if it does. | ||
| 11457 | + */ | ||
| 11458 | + if ((destination & 0x00ffffe0) != destination) { | ||
| 11459 | + printk ("acx chaincopy: destination block 0x%04x not aligned!\n", destination); | ||
| 11460 | + } | ||
| 11461 | + if (count > sizeof aligned_source) { | ||
| 11462 | + printk( KERN_ERR "chaincopy_to_slavemem overflow!\n" ); | ||
| 11463 | + count = sizeof aligned_source; | ||
| 11464 | + } | ||
| 11465 | + if ((u32) source & 3) { | ||
| 11466 | + memcpy (aligned_source, source, count); | ||
| 11467 | + data = (u32 *) aligned_source; | ||
| 11468 | + } | ||
| 11469 | + | ||
| 11470 | + /* | ||
| 11471 | + * SLV_MEM_CTL[17:16] = memory block chain mode with auto-increment | ||
| 11472 | + * SLV_MEM_CTL[5:2] = offset to data portion = 1 word | ||
| 11473 | + */ | ||
| 11474 | + val = 2 << 16 | 1 << 2; | ||
| 11475 | + writel (val, &adev->iobase[ACX_SLV_MEM_CTL]); | ||
| 11476 | + | ||
| 11477 | + /* | ||
| 11478 | + * SLV_MEM_CP[23:5] = start of 1st block | ||
| 11479 | + * SLV_MEM_CP[3:2] = offset to memblkptr = 0 | ||
| 11480 | + */ | ||
| 11481 | + val = destination & 0x00ffffe0; | ||
| 11482 | + writel (val, &adev->iobase[ACX_SLV_MEM_CP]); | ||
| 11483 | + | ||
| 11484 | + /* | ||
| 11485 | + * SLV_MEM_ADDR[23:2] = SLV_MEM_CTL[5:2] + SLV_MEM_CP[23:5] | ||
| 11486 | + */ | ||
| 11487 | + val = (destination & 0x00ffffe0) + (1<<2); | ||
| 11488 | + writel (val, &adev->iobase[ACX_SLV_MEM_ADDR]); | ||
| 11489 | + | ||
| 11490 | + /* | ||
| 11491 | + * Write the data to the slave data register, rounding up to the end | ||
| 11492 | + * of the word containing the last byte (hence the > 0) | ||
| 11493 | + */ | ||
| 11494 | + while (count > 0) { | ||
| 11495 | + writel (*data++, &adev->iobase[ACX_SLV_MEM_DATA]); | ||
| 11496 | + count -= 4; | ||
| 11497 | + } | ||
| 11498 | +} | ||
| 11499 | + | ||
| 11500 | + | ||
| 11501 | +/* | ||
| 11502 | + * Block copy from slave buffers using memory block chain mode. Copies from the ACX | ||
| 11503 | + * receive buffer structures with minimal intervention on our part. | ||
| 11504 | + * Interrupts should be disabled when calling this. | ||
| 11505 | + */ | ||
| 11506 | +void | ||
| 11507 | +chaincopy_from_slavemem (acx_device_t *adev, u8 *destination, u32 source, int count) | ||
| 11508 | +{ | ||
| 11509 | + u32 val; | ||
| 11510 | + u32 *data = (u32 *) destination; | ||
| 11511 | + static u8 aligned_destination[WLAN_A4FR_MAXLEN_WEP_FCS]; | ||
| 11512 | + int saved_count = count; | ||
| 11513 | + | ||
| 11514 | + /* | ||
| 11515 | + * Warn if the pointers don't look right. Destination must fit in [23:5] with | ||
| 11516 | + * zero elsewhere and source should be 32 bit aligned. | ||
| 11517 | + * Turns out the network stack sends unaligned things, so fix them before | ||
| 11518 | + * copying to the ACX. | ||
| 11519 | + */ | ||
| 11520 | + if ((source & 0x00ffffe0) != source) { | ||
| 11521 | + printk ("acx chaincopy: source block 0x%04x not aligned!\n", source); | ||
| 11522 | + dump_acxmem (adev, 0, 0x10000); | ||
| 11523 | + } | ||
| 11524 | + if ((u32) destination & 3) { | ||
| 11525 | + //printk ("acx chaincopy: data destination not word aligned!\n"); | ||
| 11526 | + data = (u32 *) aligned_destination; | ||
| 11527 | + if (count > sizeof aligned_destination) { | ||
| 11528 | + printk( KERN_ERR "chaincopy_from_slavemem overflow!\n" ); | ||
| 11529 | + count = sizeof aligned_destination; | ||
| 11530 | + } | ||
| 11531 | + } | ||
| 11532 | + | ||
| 11533 | + /* | ||
| 11534 | + * SLV_MEM_CTL[17:16] = memory block chain mode with auto-increment | ||
| 11535 | + * SLV_MEM_CTL[5:2] = offset to data portion = 1 word | ||
| 11536 | + */ | ||
| 11537 | + val = (2 << 16) | (1 << 2); | ||
| 11538 | + writel (val, &adev->iobase[ACX_SLV_MEM_CTL]); | ||
| 11539 | + | ||
| 11540 | + /* | ||
| 11541 | + * SLV_MEM_CP[23:5] = start of 1st block | ||
| 11542 | + * SLV_MEM_CP[3:2] = offset to memblkptr = 0 | ||
| 11543 | + */ | ||
| 11544 | + val = source & 0x00ffffe0; | ||
| 11545 | + writel (val, &adev->iobase[ACX_SLV_MEM_CP]); | ||
| 11546 | + | ||
| 11547 | + /* | ||
| 11548 | + * SLV_MEM_ADDR[23:2] = SLV_MEM_CTL[5:2] + SLV_MEM_CP[23:5] | ||
| 11549 | + */ | ||
| 11550 | + val = (source & 0x00ffffe0) + (1<<2); | ||
| 11551 | + writel (val, &adev->iobase[ACX_SLV_MEM_ADDR]); | ||
| 11552 | + | ||
| 11553 | + /* | ||
| 11554 | + * Read the data from the slave data register, rounding up to the end | ||
| 11555 | + * of the word containing the last byte (hence the > 0) | ||
| 11556 | + */ | ||
| 11557 | + while (count > 0) { | ||
| 11558 | + *data++ = readl (&adev->iobase[ACX_SLV_MEM_DATA]); | ||
| 11559 | + count -= 4; | ||
| 11560 | + } | ||
| 11561 | + | ||
| 11562 | + /* | ||
| 11563 | + * If the destination wasn't aligned, we would have saved it in | ||
| 11564 | + * the aligned buffer, so copy it where it should go. | ||
| 11565 | + */ | ||
| 11566 | + if ((u32) destination & 3) { | ||
| 11567 | + memcpy (destination, aligned_destination, saved_count); | ||
| 11568 | + } | ||
| 11569 | +} | ||
| 11570 | + | ||
| 11571 | +char | ||
| 11572 | +printable (char c) | ||
| 11573 | +{ | ||
| 11574 | + return ((c >= 20) && (c < 127)) ? c : '.'; | ||
| 11575 | +} | ||
| 11576 | + | ||
| 11577 | +#if DUMP_MEM_DEFINED > 0 | ||
| 11578 | +static void | ||
| 11579 | +dump_acxmem (acx_device_t *adev, u32 start, int length) | ||
| 11580 | +{ | ||
| 11581 | + int i; | ||
| 11582 | + u8 buf[16]; | ||
| 11583 | + | ||
| 11584 | + while (length > 0) { | ||
| 11585 | + printk ("%04x ", start); | ||
| 11586 | + copy_from_slavemem (adev, buf, start, 16); | ||
| 11587 | + for (i = 0; (i < 16) && (i < length); i++) { | ||
| 11588 | + printk ("%02x ", buf[i]); | ||
| 11589 | + } | ||
| 11590 | + for (i = 0; (i < 16) && (i < length); i++) { | ||
| 11591 | + printk ("%c", printable (buf[i])); | ||
| 11592 | + } | ||
| 11593 | + printk ("\n"); | ||
| 11594 | + start += 16; | ||
| 11595 | + length -= 16; | ||
| 11596 | + } | ||
| 11597 | +} | ||
| 11598 | +#endif | ||
| 11599 | + | ||
| 11600 | +static void | ||
| 11601 | +enable_acx_irq(acx_device_t *adev); | ||
| 11602 | +static void | ||
| 11603 | +disable_acx_irq(acx_device_t *adev); | ||
| 11604 | + | ||
| 11605 | +/* | ||
| 11606 | + * Return an acx pointer to the next transmit data block. | ||
| 11607 | + */ | ||
| 11608 | +u32 | ||
| 11609 | +allocate_acx_txbuf_space (acx_device_t *adev, int count) { | ||
| 11610 | + u32 block, next, last_block; | ||
| 11611 | + int blocks_needed; | ||
| 11612 | + unsigned long flags; | ||
| 11613 | + | ||
| 11614 | + spin_lock_irqsave(&adev->txbuf_lock, flags); | ||
| 11615 | + /* | ||
| 11616 | + * Take 4 off the memory block size to account for the reserved word at the start of | ||
| 11617 | + * the block. | ||
| 11618 | + */ | ||
| 11619 | + blocks_needed = count / (adev->memblocksize - 4); | ||
| 11620 | + if (count % (adev->memblocksize - 4)) | ||
| 11621 | + blocks_needed++; | ||
| 11622 | + | ||
| 11623 | + if (blocks_needed <= adev->acx_txbuf_blocks_free) { | ||
| 11624 | + /* | ||
| 11625 | + * Take blocks at the head of the free list. | ||
| 11626 | + */ | ||
| 11627 | + last_block = block = adev->acx_txbuf_free; | ||
| 11628 | + | ||
| 11629 | + /* | ||
| 11630 | + * Follow block pointers through the requested number of blocks both to | ||
| 11631 | + * find the new head of the free list and to set the flags for the blocks | ||
| 11632 | + * appropriately. | ||
| 11633 | + */ | ||
| 11634 | + while (blocks_needed--) { | ||
| 11635 | + /* | ||
| 11636 | + * Keep track of the last block of the allocation | ||
| 11637 | + */ | ||
| 11638 | + last_block = adev->acx_txbuf_free; | ||
| 11639 | + | ||
| 11640 | + /* | ||
| 11641 | + * Make sure the end control flag is not set. | ||
| 11642 | + */ | ||
| 11643 | + next = read_slavemem32 (adev, adev->acx_txbuf_free) & 0x7ffff; | ||
| 11644 | + write_slavemem32 (adev, adev->acx_txbuf_free, next); | ||
| 11645 | + | ||
| 11646 | + /* | ||
| 11647 | + * Update the new head of the free list | ||
| 11648 | + */ | ||
| 11649 | + adev->acx_txbuf_free = next << 5; | ||
| 11650 | + adev->acx_txbuf_blocks_free--; | ||
| 11651 | + | ||
| 11652 | + } | ||
| 11653 | + | ||
| 11654 | + /* | ||
| 11655 | + * Flag the last block both by clearing out the next pointer | ||
| 11656 | + * and marking the control field. | ||
| 11657 | + */ | ||
| 11658 | + write_slavemem32 (adev, last_block, 0x02000000); | ||
| 11659 | + | ||
| 11660 | + /* | ||
| 11661 | + * If we're out of buffers make sure the free list pointer is NULL | ||
| 11662 | + */ | ||
| 11663 | + if (!adev->acx_txbuf_blocks_free) { | ||
| 11664 | + adev->acx_txbuf_free = 0; | ||
| 11665 | + } | ||
| 11666 | + } | ||
| 11667 | + else { | ||
| 11668 | + block = 0; | ||
| 11669 | + } | ||
| 11670 | + spin_unlock_irqrestore (&adev->txbuf_lock, flags); | ||
| 11671 | + return block; | ||
| 11672 | +} | ||
| 11673 | + | ||
| 11674 | +/* | ||
| 11675 | + * Return buffer space back to the pool by following the next pointers until we find | ||
| 11676 | + * the block marked as the end. Point the last block to the head of the free list, | ||
| 11677 | + * then update the head of the free list to point to the newly freed memory. | ||
| 11678 | + * This routine gets called in interrupt context, so it shouldn't block to protect | ||
| 11679 | + * the integrity of the linked list. The ISR already holds the lock. | ||
| 11680 | + */ | ||
| 11681 | +void | ||
| 11682 | +reclaim_acx_txbuf_space (acx_device_t *adev, u32 blockptr) { | ||
| 11683 | + u32 cur, last, next; | ||
| 11684 | + unsigned long flags; | ||
| 11685 | + | ||
| 11686 | + spin_lock_irqsave (&adev->txbuf_lock, flags); | ||
| 11687 | + if ((blockptr >= adev->acx_txbuf_start) && | ||
| 11688 | + (blockptr <= adev->acx_txbuf_start + | ||
| 11689 | + (adev->acx_txbuf_numblocks - 1) * adev->memblocksize)) { | ||
| 11690 | + cur = blockptr; | ||
| 11691 | + do { | ||
| 11692 | + last = cur; | ||
| 11693 | + next = read_slavemem32 (adev, cur); | ||
| 11694 | + | ||
| 11695 | + /* | ||
| 11696 | + * Advance to the next block in this allocation | ||
| 11697 | + */ | ||
| 11698 | + cur = (next & 0x7ffff) << 5; | ||
| 11699 | + | ||
| 11700 | + /* | ||
| 11701 | + * This block now counts as free. | ||
| 11702 | + */ | ||
| 11703 | + adev->acx_txbuf_blocks_free++; | ||
| 11704 | + } while (!(next & 0x02000000)); | ||
| 11705 | + | ||
| 11706 | + /* | ||
| 11707 | + * last now points to the last block of that allocation. Update the pointer | ||
| 11708 | + * in that block to point to the free list and reset the free list to the | ||
| 11709 | + * first block of the free call. If there were no free blocks, make sure | ||
| 11710 | + * the new end of the list marks itself as truly the end. | ||
| 11711 | + */ | ||
| 11712 | + if (adev->acx_txbuf_free) { | ||
| 11713 | + write_slavemem32 (adev, last, adev->acx_txbuf_free >> 5); | ||
| 11714 | + } | ||
| 11715 | + else { | ||
| 11716 | + write_slavemem32 (adev, last, 0x02000000); | ||
| 11717 | + } | ||
| 11718 | + adev->acx_txbuf_free = blockptr; | ||
| 11719 | + } | ||
| 11720 | + spin_unlock_irqrestore(&adev->txbuf_lock, flags); | ||
| 11721 | +} | ||
| 11722 | + | ||
| 11723 | +/* | ||
| 11724 | + * Initialize the pieces managing the transmit buffer pool on the ACX. The transmit | ||
| 11725 | + * buffer is a circular queue with one 32 bit word reserved at the beginning of each | ||
| 11726 | + * block. The upper 13 bits are a control field, of which only 0x02000000 has any | ||
| 11727 | + * meaning. The lower 19 bits are the address of the next block divided by 32. | ||
| 11728 | + */ | ||
| 11729 | +void | ||
| 11730 | +init_acx_txbuf (acx_device_t *adev) { | ||
| 11731 | + | ||
| 11732 | + /* | ||
| 11733 | + * acx100_s_init_memory_pools set up txbuf_start and txbuf_numblocks for us. | ||
| 11734 | + * All we need to do is reset the rest of the bookeeping. | ||
| 11735 | + */ | ||
| 11736 | + | ||
| 11737 | + adev->acx_txbuf_free = adev->acx_txbuf_start; | ||
| 11738 | + adev->acx_txbuf_blocks_free = adev->acx_txbuf_numblocks; | ||
| 11739 | + | ||
| 11740 | + /* | ||
| 11741 | + * Initialization leaves the last transmit pool block without a pointer back to | ||
| 11742 | + * the head of the list, but marked as the end of the list. That's how we want | ||
| 11743 | + * to see it, too, so leave it alone. This is only ever called after a firmware | ||
| 11744 | + * reset, so the ACX memory is in the state we want. | ||
| 11745 | + */ | ||
| 11746 | + | ||
| 11747 | +} | ||
| 11748 | + | ||
| 11749 | +INLINE_IO int | ||
| 11750 | +adev_present(acx_device_t *adev) | ||
| 11751 | +{ | ||
| 11752 | + /* fast version (accesses the first register, IO_ACX_SOFT_RESET, | ||
| 11753 | + * which should be safe): */ | ||
| 11754 | + return readl(adev->iobase) != 0xffffffff; | ||
| 11755 | +} | ||
| 11756 | + | ||
| 11757 | +/*********************************************************************** | ||
| 11758 | +*/ | ||
| 11759 | +static inline txdesc_t* | ||
| 11760 | +get_txdesc(acx_device_t *adev, int index) | ||
| 11761 | +{ | ||
| 11762 | + return (txdesc_t*) (((u8*)adev->txdesc_start) + index * adev->txdesc_size); | ||
| 11763 | +} | ||
| 11764 | + | ||
| 11765 | +static inline txdesc_t* | ||
| 11766 | +advance_txdesc(acx_device_t *adev, txdesc_t* txdesc, int inc) | ||
| 11767 | +{ | ||
| 11768 | + return (txdesc_t*) (((u8*)txdesc) + inc * adev->txdesc_size); | ||
| 11769 | +} | ||
| 11770 | + | ||
| 11771 | +static txhostdesc_t* | ||
| 11772 | +get_txhostdesc(acx_device_t *adev, txdesc_t* txdesc) | ||
| 11773 | +{ | ||
| 11774 | + int index = (u8*)txdesc - (u8*)adev->txdesc_start; | ||
| 11775 | + if (unlikely(ACX_DEBUG && (index % adev->txdesc_size))) { | ||
| 11776 | + printk("bad txdesc ptr %p\n", txdesc); | ||
| 11777 | + return NULL; | ||
| 11778 | + } | ||
| 11779 | + index /= adev->txdesc_size; | ||
| 11780 | + if (unlikely(ACX_DEBUG && (index >= TX_CNT))) { | ||
| 11781 | + printk("bad txdesc ptr %p\n", txdesc); | ||
| 11782 | + return NULL; | ||
| 11783 | + } | ||
| 11784 | + return &adev->txhostdesc_start[index*2]; | ||
| 11785 | +} | ||
| 11786 | + | ||
| 11787 | +static inline client_t* | ||
| 11788 | +get_txc(acx_device_t *adev, txdesc_t* txdesc) | ||
| 11789 | +{ | ||
| 11790 | + int index = (u8*)txdesc - (u8*)adev->txdesc_start; | ||
| 11791 | + if (unlikely(ACX_DEBUG && (index % adev->txdesc_size))) { | ||
| 11792 | + printk("bad txdesc ptr %p\n", txdesc); | ||
| 11793 | + return NULL; | ||
| 11794 | + } | ||
| 11795 | + index /= adev->txdesc_size; | ||
| 11796 | + if (unlikely(ACX_DEBUG && (index >= TX_CNT))) { | ||
| 11797 | + printk("bad txdesc ptr %p\n", txdesc); | ||
| 11798 | + return NULL; | ||
| 11799 | + } | ||
| 11800 | + return adev->txc[index]; | ||
| 11801 | +} | ||
| 11802 | + | ||
| 11803 | +static inline u16 | ||
| 11804 | +get_txr(acx_device_t *adev, txdesc_t* txdesc) | ||
| 11805 | +{ | ||
| 11806 | + int index = (u8*)txdesc - (u8*)adev->txdesc_start; | ||
| 11807 | + index /= adev->txdesc_size; | ||
| 11808 | + return adev->txr[index]; | ||
| 11809 | +} | ||
| 11810 | + | ||
| 11811 | +static inline void | ||
| 11812 | +put_txcr(acx_device_t *adev, txdesc_t* txdesc, client_t* c, u16 r111) | ||
| 11813 | +{ | ||
| 11814 | + int index = (u8*)txdesc - (u8*)adev->txdesc_start; | ||
| 11815 | + if (unlikely(ACX_DEBUG && (index % adev->txdesc_size))) { | ||
| 11816 | + printk("bad txdesc ptr %p\n", txdesc); | ||
| 11817 | + return; | ||
| 11818 | + } | ||
| 11819 | + index /= adev->txdesc_size; | ||
| 11820 | + if (unlikely(ACX_DEBUG && (index >= TX_CNT))) { | ||
| 11821 | + printk("bad txdesc ptr %p\n", txdesc); | ||
| 11822 | + return; | ||
| 11823 | + } | ||
| 11824 | + adev->txc[index] = c; | ||
| 11825 | + adev->txr[index] = r111; | ||
| 11826 | +} | ||
| 11827 | + | ||
| 11828 | + | ||
| 11829 | +/*********************************************************************** | ||
| 11830 | +** EEPROM and PHY read/write helpers | ||
| 11831 | +*/ | ||
| 11832 | +/*********************************************************************** | ||
| 11833 | +** acxmem_read_eeprom_byte | ||
| 11834 | +** | ||
| 11835 | +** Function called to read an octet in the EEPROM. | ||
| 11836 | +** | ||
| 11837 | +** This function is used by acxmem_e_probe to check if the | ||
| 11838 | +** connected card is a legal one or not. | ||
| 11839 | +** | ||
| 11840 | +** Arguments: | ||
| 11841 | +** adev ptr to acx_device structure | ||
| 11842 | +** addr address to read in the EEPROM | ||
| 11843 | +** charbuf ptr to a char. This is where the read octet | ||
| 11844 | +** will be stored | ||
| 11845 | +*/ | ||
| 11846 | +int | ||
| 11847 | +acxmem_read_eeprom_byte(acx_device_t *adev, u32 addr, u8 *charbuf) | ||
| 11848 | +{ | ||
| 11849 | + int result; | ||
| 11850 | + int count; | ||
| 11851 | + | ||
| 11852 | + write_reg32(adev, IO_ACX_EEPROM_CFG, 0); | ||
| 11853 | + write_reg32(adev, IO_ACX_EEPROM_ADDR, addr); | ||
| 11854 | + write_flush(adev); | ||
| 11855 | + write_reg32(adev, IO_ACX_EEPROM_CTL, 2); | ||
| 11856 | + | ||
| 11857 | + count = 0xffff; | ||
| 11858 | + while (read_reg16(adev, IO_ACX_EEPROM_CTL)) { | ||
| 11859 | + /* scheduling away instead of CPU burning loop | ||
| 11860 | + * doesn't seem to work here at all: | ||
| 11861 | + * awful delay, sometimes also failure. | ||
| 11862 | + * Doesn't matter anyway (only small delay). */ | ||
| 11863 | + if (unlikely(!--count)) { | ||
| 11864 | + printk("%s: timeout waiting for EEPROM read\n", | ||
| 11865 | + adev->ndev->name); | ||
| 11866 | + result = NOT_OK; | ||
| 11867 | + goto fail; | ||
| 11868 | + } | ||
| 11869 | + cpu_relax(); | ||
| 11870 | + } | ||
| 11871 | + | ||
| 11872 | + *charbuf = read_reg8(adev, IO_ACX_EEPROM_DATA); | ||
| 11873 | + log(L_DEBUG, "EEPROM at 0x%04X = 0x%02X\n", addr, *charbuf); | ||
| 11874 | + result = OK; | ||
| 11875 | + | ||
| 11876 | +fail: | ||
| 11877 | + return result; | ||
| 11878 | +} | ||
| 11879 | + | ||
| 11880 | + | ||
| 11881 | +/*********************************************************************** | ||
| 11882 | +** We don't lock hw accesses here since we never r/w eeprom in IRQ | ||
| 11883 | +** Note: this function sleeps only because of GFP_KERNEL alloc | ||
| 11884 | +*/ | ||
| 11885 | +#ifdef UNUSED | ||
| 11886 | +int | ||
| 11887 | +acxmem_s_write_eeprom(acx_device_t *adev, u32 addr, u32 len, const u8 *charbuf) | ||
| 11888 | +{ | ||
| 11889 | + u8 *data_verify = NULL; | ||
| 11890 | + unsigned long flags; | ||
| 11891 | + int count, i; | ||
| 11892 | + int result = NOT_OK; | ||
| 11893 | + u16 gpio_orig; | ||
| 11894 | + | ||
| 11895 | + printk("acx: WARNING! I would write to EEPROM now. " | ||
| 11896 | + "Since I really DON'T want to unless you know " | ||
| 11897 | + "what you're doing (THIS CODE WILL PROBABLY " | ||
| 11898 | + "NOT WORK YET!), I will abort that now. And " | ||
| 11899 | + "definitely make sure to make a " | ||
| 11900 | + "/proc/driver/acx_wlan0_eeprom backup copy first!!! " | ||
| 11901 | + "(the EEPROM content includes the PCI config header!! " | ||
| 11902 | + "If you kill important stuff, then you WILL " | ||
| 11903 | + "get in trouble and people DID get in trouble already)\n"); | ||
| 11904 | + return OK; | ||
| 11905 | + | ||
| 11906 | + FN_ENTER; | ||
| 11907 | + | ||
| 11908 | + data_verify = kmalloc(len, GFP_KERNEL); | ||
| 11909 | + if (!data_verify) { | ||
| 11910 | + goto end; | ||
| 11911 | + } | ||
| 11912 | + | ||
| 11913 | + /* first we need to enable the OE (EEPROM Output Enable) GPIO line | ||
| 11914 | + * to be able to write to the EEPROM. | ||
| 11915 | + * NOTE: an EEPROM writing success has been reported, | ||
| 11916 | + * but you probably have to modify GPIO_OUT, too, | ||
| 11917 | + * and you probably need to activate a different GPIO | ||
| 11918 | + * line instead! */ | ||
| 11919 | + gpio_orig = read_reg16(adev, IO_ACX_GPIO_OE); | ||
| 11920 | + write_reg16(adev, IO_ACX_GPIO_OE, gpio_orig & ~1); | ||
| 11921 | + write_flush(adev); | ||
| 11922 | + | ||
| 11923 | + /* ok, now start writing the data out */ | ||
| 11924 | + for (i = 0; i < len; i++) { | ||
| 11925 | + write_reg32(adev, IO_ACX_EEPROM_CFG, 0); | ||
| 11926 | + write_reg32(adev, IO_ACX_EEPROM_ADDR, addr + i); | ||
| 11927 | + write_reg32(adev, IO_ACX_EEPROM_DATA, *(charbuf + i)); | ||
| 11928 | + write_flush(adev); | ||
| 11929 | + write_reg32(adev, IO_ACX_EEPROM_CTL, 1); | ||
| 11930 | + | ||
| 11931 | + count = 0xffff; | ||
| 11932 | + while (read_reg16(adev, IO_ACX_EEPROM_CTL)) { | ||
| 11933 | + if (unlikely(!--count)) { | ||
| 11934 | + printk("WARNING, DANGER!!! " | ||
| 11935 | + "Timeout waiting for EEPROM write\n"); | ||
| 11936 | + goto end; | ||
| 11937 | + } | ||
| 11938 | + cpu_relax(); | ||
| 11939 | + } | ||
| 11940 | + } | ||
| 11941 | + | ||
| 11942 | + /* disable EEPROM writing */ | ||
| 11943 | + write_reg16(adev, IO_ACX_GPIO_OE, gpio_orig); | ||
| 11944 | + write_flush(adev); | ||
| 11945 | + | ||
| 11946 | + /* now start a verification run */ | ||
| 11947 | + for (i = 0; i < len; i++) { | ||
| 11948 | + write_reg32(adev, IO_ACX_EEPROM_CFG, 0); | ||
| 11949 | + write_reg32(adev, IO_ACX_EEPROM_ADDR, addr + i); | ||
| 11950 | + write_flush(adev); | ||
| 11951 | + write_reg32(adev, IO_ACX_EEPROM_CTL, 2); | ||
| 11952 | + | ||
| 11953 | + count = 0xffff; | ||
| 11954 | + while (read_reg16(adev, IO_ACX_EEPROM_CTL)) { | ||
| 11955 | + if (unlikely(!--count)) { | ||
| 11956 | + printk("timeout waiting for EEPROM read\n"); | ||
| 11957 | + goto end; | ||
| 11958 | + } | ||
| 11959 | + cpu_relax(); | ||
| 11960 | + } | ||
| 11961 | + | ||
| 11962 | + data_verify[i] = read_reg16(adev, IO_ACX_EEPROM_DATA); | ||
| 11963 | + } | ||
| 11964 | + | ||
| 11965 | + if (0 == memcmp(charbuf, data_verify, len)) | ||
| 11966 | + result = OK; /* read data matches, success */ | ||
| 11967 | + | ||
| 11968 | +end: | ||
| 11969 | + kfree(data_verify); | ||
| 11970 | + FN_EXIT1(result); | ||
| 11971 | + return result; | ||
| 11972 | +} | ||
| 11973 | +#endif /* UNUSED */ | ||
| 11974 | + | ||
| 11975 | + | ||
| 11976 | +/*********************************************************************** | ||
| 11977 | +** acxmem_s_read_phy_reg | ||
| 11978 | +** | ||
| 11979 | +** Messing with rx/tx disabling and enabling here | ||
| 11980 | +** (write_reg32(adev, IO_ACX_ENABLE, 0b000000xx)) kills traffic | ||
| 11981 | +*/ | ||
| 11982 | +int | ||
| 11983 | +acxmem_s_read_phy_reg(acx_device_t *adev, u32 reg, u8 *charbuf) | ||
| 11984 | +{ | ||
| 11985 | + int result = NOT_OK; | ||
| 11986 | + int count; | ||
| 11987 | + | ||
| 11988 | + FN_ENTER; | ||
| 11989 | + | ||
| 11990 | + write_reg32(adev, IO_ACX_PHY_ADDR, reg); | ||
| 11991 | + write_flush(adev); | ||
| 11992 | + write_reg32(adev, IO_ACX_PHY_CTL, 2); | ||
| 11993 | + | ||
| 11994 | + count = 0xffff; | ||
| 11995 | + while (read_reg32(adev, IO_ACX_PHY_CTL)) { | ||
| 11996 | + /* scheduling away instead of CPU burning loop | ||
| 11997 | + * doesn't seem to work here at all: | ||
| 11998 | + * awful delay, sometimes also failure. | ||
| 11999 | + * Doesn't matter anyway (only small delay). */ | ||
| 12000 | + if (unlikely(!--count)) { | ||
| 12001 | + printk("%s: timeout waiting for phy read\n", | ||
| 12002 | + adev->ndev->name); | ||
| 12003 | + *charbuf = 0; | ||
| 12004 | + goto fail; | ||
| 12005 | + } | ||
| 12006 | + cpu_relax(); | ||
| 12007 | + } | ||
| 12008 | + | ||
| 12009 | + log(L_DEBUG, "count was %u\n", count); | ||
| 12010 | + *charbuf = read_reg8(adev, IO_ACX_PHY_DATA); | ||
| 12011 | + | ||
| 12012 | + log(L_DEBUG, "radio PHY at 0x%04X = 0x%02X\n", *charbuf, reg); | ||
| 12013 | + result = OK; | ||
| 12014 | + goto fail; /* silence compiler warning */ | ||
| 12015 | +fail: | ||
| 12016 | + FN_EXIT1(result); | ||
| 12017 | + return result; | ||
| 12018 | +} | ||
| 12019 | + | ||
| 12020 | + | ||
| 12021 | +/*********************************************************************** | ||
| 12022 | +*/ | ||
| 12023 | +int | ||
| 12024 | +acxmem_s_write_phy_reg(acx_device_t *adev, u32 reg, u8 value) | ||
| 12025 | +{ | ||
| 12026 | + int count; | ||
| 12027 | + FN_ENTER; | ||
| 12028 | + | ||
| 12029 | + /* mprusko said that 32bit accesses result in distorted sensitivity | ||
| 12030 | + * on his card. Unconfirmed, looks like it's not true (most likely since we | ||
| 12031 | + * now properly flush writes). */ | ||
| 12032 | + write_reg32(adev, IO_ACX_PHY_DATA, value); | ||
| 12033 | + write_reg32(adev, IO_ACX_PHY_ADDR, reg); | ||
| 12034 | + write_flush(adev); | ||
| 12035 | + write_reg32(adev, IO_ACX_PHY_CTL, 1); | ||
| 12036 | + write_flush(adev); | ||
| 12037 | + | ||
| 12038 | + count = 0xffff; | ||
| 12039 | + while (read_reg32(adev, IO_ACX_PHY_CTL)) { | ||
| 12040 | + /* scheduling away instead of CPU burning loop | ||
| 12041 | + * doesn't seem to work here at all: | ||
| 12042 | + * awful delay, sometimes also failure. | ||
| 12043 | + * Doesn't matter anyway (only small delay). */ | ||
| 12044 | + if (unlikely(!--count)) { | ||
| 12045 | + printk("%s: timeout waiting for phy read\n", | ||
| 12046 | + adev->ndev->name); | ||
| 12047 | + goto fail; | ||
| 12048 | + } | ||
| 12049 | + cpu_relax(); | ||
| 12050 | + } | ||
| 12051 | + | ||
| 12052 | + log(L_DEBUG, "radio PHY write 0x%02X at 0x%04X\n", value, reg); | ||
| 12053 | + fail: | ||
| 12054 | + FN_EXIT1(OK); | ||
| 12055 | + return OK; | ||
| 12056 | +} | ||
| 12057 | + | ||
| 12058 | + | ||
| 12059 | +#define NO_AUTO_INCREMENT 1 | ||
| 12060 | + | ||
| 12061 | +/*********************************************************************** | ||
| 12062 | +** acxmem_s_write_fw | ||
| 12063 | +** | ||
| 12064 | +** Write the firmware image into the card. | ||
| 12065 | +** | ||
| 12066 | +** Arguments: | ||
| 12067 | +** adev wlan device structure | ||
| 12068 | +** fw_image firmware image. | ||
| 12069 | +** | ||
| 12070 | +** Returns: | ||
| 12071 | +** 1 firmware image corrupted | ||
| 12072 | +** 0 success | ||
| 12073 | +*/ | ||
| 12074 | +static int | ||
| 12075 | +acxmem_s_write_fw(acx_device_t *adev, const firmware_image_t *fw_image, u32 offset) | ||
| 12076 | +{ | ||
| 12077 | + int len, size, checkMismatch = -1; | ||
| 12078 | + u32 sum, v32, tmp, id; | ||
| 12079 | + /* we skip the first four bytes which contain the control sum */ | ||
| 12080 | + const u8 *p = (u8*)fw_image + 4; | ||
| 12081 | + | ||
| 12082 | + /* start the image checksum by adding the image size value */ | ||
| 12083 | + sum = p[0]+p[1]+p[2]+p[3]; | ||
| 12084 | + p += 4; | ||
| 12085 | + | ||
| 12086 | +#ifdef NOPE | ||
| 12087 | +#if NO_AUTO_INCREMENT | ||
| 12088 | + write_reg32(adev, IO_ACX_SLV_MEM_CTL, 0); /* use basic mode */ | ||
| 12089 | +#else | ||
| 12090 | + write_reg32(adev, IO_ACX_SLV_MEM_CTL, 1); /* use autoincrement mode */ | ||
| 12091 | + write_reg32(adev, IO_ACX_SLV_MEM_ADDR, offset); /* configure start address */ | ||
| 12092 | + write_flush(adev); | ||
| 12093 | +#endif | ||
| 12094 | +#endif | ||
| 12095 | + len = 0; | ||
| 12096 | + size = le32_to_cpu(fw_image->size) & (~3); | ||
| 12097 | + | ||
| 12098 | + while (likely(len < size)) { | ||
| 12099 | + v32 = be32_to_cpu(*(u32*)p); | ||
| 12100 | + sum += p[0]+p[1]+p[2]+p[3]; | ||
| 12101 | + p += 4; | ||
| 12102 | + len += 4; | ||
| 12103 | + | ||
| 12104 | +#ifdef NOPE | ||
| 12105 | +#if NO_AUTO_INCREMENT | ||
| 12106 | + write_reg32(adev, IO_ACX_SLV_MEM_ADDR, offset + len - 4); | ||
| 12107 | + write_flush(adev); | ||
| 12108 | +#endif | ||
| 12109 | + write_reg32(adev, IO_ACX_SLV_MEM_DATA, v32); | ||
| 12110 | + write_flush(adev); | ||
| 12111 | +#endif | ||
| 12112 | + write_slavemem32 (adev, offset + len - 4, v32); | ||
| 12113 | + | ||
| 12114 | + id = read_id_register (adev); | ||
| 12115 | + | ||
| 12116 | + /* | ||
| 12117 | + * check the data written | ||
| 12118 | + */ | ||
| 12119 | + tmp = read_slavemem32 (adev, offset + len - 4); | ||
| 12120 | + if (checkMismatch && (tmp != v32)) { | ||
| 12121 | + printk ("first data mismatch at 0x%08x good 0x%08x bad 0x%08x id 0x%08x\n", | ||
| 12122 | + offset + len - 4, v32, tmp, id); | ||
| 12123 | + checkMismatch = 0; | ||
| 12124 | + } | ||
| 12125 | + } | ||
| 12126 | + log(L_DEBUG, "firmware written, size:%d sum1:%x sum2:%x\n", | ||
| 12127 | + size, sum, le32_to_cpu(fw_image->chksum)); | ||
| 12128 | + | ||
| 12129 | + /* compare our checksum with the stored image checksum */ | ||
| 12130 | + return (sum != le32_to_cpu(fw_image->chksum)); | ||
| 12131 | +} | ||
| 12132 | + | ||
| 12133 | + | ||
| 12134 | +/*********************************************************************** | ||
| 12135 | +** acxmem_s_validate_fw | ||
| 12136 | +** | ||
| 12137 | +** Compare the firmware image given with | ||
| 12138 | +** the firmware image written into the card. | ||
| 12139 | +** | ||
| 12140 | +** Arguments: | ||
| 12141 | +** adev wlan device structure | ||
| 12142 | +** fw_image firmware image. | ||
| 12143 | +** | ||
| 12144 | +** Returns: | ||
| 12145 | +** NOT_OK firmware image corrupted or not correctly written | ||
| 12146 | +** OK success | ||
| 12147 | +*/ | ||
| 12148 | +static int | ||
| 12149 | +acxmem_s_validate_fw(acx_device_t *adev, const firmware_image_t *fw_image, | ||
| 12150 | + u32 offset) | ||
| 12151 | +{ | ||
| 12152 | + u32 sum, v32, w32; | ||
| 12153 | + int len, size; | ||
| 12154 | + int result = OK; | ||
| 12155 | + /* we skip the first four bytes which contain the control sum */ | ||
| 12156 | + const u8 *p = (u8*)fw_image + 4; | ||
| 12157 | + | ||
| 12158 | + /* start the image checksum by adding the image size value */ | ||
| 12159 | + sum = p[0]+p[1]+p[2]+p[3]; | ||
| 12160 | + p += 4; | ||
| 12161 | + | ||
| 12162 | + write_reg32(adev, IO_ACX_SLV_END_CTL, 0); | ||
| 12163 | + | ||
| 12164 | +#if NO_AUTO_INCREMENT | ||
| 12165 | + write_reg32(adev, IO_ACX_SLV_MEM_CTL, 0); /* use basic mode */ | ||
| 12166 | +#else | ||
| 12167 | + write_reg32(adev, IO_ACX_SLV_MEM_CTL, 1); /* use autoincrement mode */ | ||
| 12168 | + write_reg32(adev, IO_ACX_SLV_MEM_ADDR, offset); /* configure start address */ | ||
| 12169 | +#endif | ||
| 12170 | + | ||
| 12171 | + len = 0; | ||
| 12172 | + size = le32_to_cpu(fw_image->size) & (~3); | ||
| 12173 | + | ||
| 12174 | + while (likely(len < size)) { | ||
| 12175 | + v32 = be32_to_cpu(*(u32*)p); | ||
| 12176 | + p += 4; | ||
| 12177 | + len += 4; | ||
| 12178 | + | ||
| 12179 | +#ifdef NOPE | ||
| 12180 | +#if NO_AUTO_INCREMENT | ||
| 12181 | + write_reg32(adev, IO_ACX_SLV_MEM_ADDR, offset + len - 4); | ||
| 12182 | +#endif | ||
| 12183 | + udelay(10); | ||
| 12184 | + w32 = read_reg32(adev, IO_ACX_SLV_MEM_DATA); | ||
| 12185 | +#endif | ||
| 12186 | + w32 = read_slavemem32 (adev, offset + len - 4); | ||
| 12187 | + | ||
| 12188 | + if (unlikely(w32 != v32)) { | ||
| 12189 | + printk("acx: FATAL: firmware upload: " | ||
| 12190 | + "data parts at offset %d don't match\n(0x%08X vs. 0x%08X)!\n" | ||
| 12191 | + "I/O timing issues or defective memory, with DWL-xx0+? " | ||
| 12192 | + "ACX_IO_WIDTH=16 may help. Please report\n", | ||
| 12193 | + len, v32, w32); | ||
| 12194 | + result = NOT_OK; | ||
| 12195 | + break; | ||
| 12196 | + } | ||
| 12197 | + | ||
| 12198 | + sum += (u8)w32 + (u8)(w32>>8) + (u8)(w32>>16) + (u8)(w32>>24); | ||
| 12199 | + } | ||
| 12200 | + | ||
| 12201 | + /* sum control verification */ | ||
| 12202 | + if (result != NOT_OK) { | ||
| 12203 | + if (sum != le32_to_cpu(fw_image->chksum)) { | ||
| 12204 | + printk("acx: FATAL: firmware upload: " | ||
| 12205 | + "checksums don't match!\n"); | ||
| 12206 | + result = NOT_OK; | ||
| 12207 | + } | ||
| 12208 | + } | ||
| 12209 | + | ||
| 12210 | + return result; | ||
| 12211 | +} | ||
| 12212 | + | ||
| 12213 | + | ||
| 12214 | +/*********************************************************************** | ||
| 12215 | +** acxmem_s_upload_fw | ||
| 12216 | +** | ||
| 12217 | +** Called from acx_reset_dev | ||
| 12218 | +*/ | ||
| 12219 | +static int | ||
| 12220 | +acxmem_s_upload_fw(acx_device_t *adev) | ||
| 12221 | +{ | ||
| 12222 | + firmware_image_t *fw_image = NULL; | ||
| 12223 | + int res = NOT_OK; | ||
| 12224 | + int try; | ||
| 12225 | + u32 file_size; | ||
| 12226 | + char *filename = "WLANGEN.BIN"; | ||
| 12227 | +#ifdef PATCH_AROUND_BAD_SPOTS | ||
| 12228 | + u32 offset; | ||
| 12229 | + int i; | ||
| 12230 | + /* | ||
| 12231 | + * arm-linux-objdump -d patch.bin, or | ||
| 12232 | + * od -Ax -t x4 patch.bin after finding the bounds | ||
| 12233 | + * of the .text section with arm-linux-objdump -s patch.bin | ||
| 12234 | + */ | ||
| 12235 | + u32 patch[] = { | ||
| 12236 | + 0xe584c030, 0xe59fc008, | ||
| 12237 | + 0xe92d1000, 0xe59fc004, 0xe8bd8000, 0x0000080c, | ||
| 12238 | + 0x0000aa68, 0x605a2200, 0x2c0a689c, 0x2414d80a, | ||
| 12239 | + 0x2f00689f, 0x1c27d007, 0x06241e7c, 0x2f000e24, | ||
| 12240 | + 0xe000d1f6, 0x602e6018, 0x23036468, 0x480203db, | ||
| 12241 | + 0x60ca6003, 0xbdf0750a, 0xffff0808 | ||
| 12242 | + }; | ||
| 12243 | +#endif | ||
| 12244 | + | ||
| 12245 | + FN_ENTER; | ||
| 12246 | + /* No combined image; tell common we need the radio firmware, too */ | ||
| 12247 | + adev->need_radio_fw = 1; | ||
| 12248 | + | ||
| 12249 | + fw_image = acx_s_read_fw(adev->dev, filename, &file_size); | ||
| 12250 | + if (!fw_image) { | ||
| 12251 | + FN_EXIT1(NOT_OK); | ||
| 12252 | + return NOT_OK; | ||
| 12253 | + } | ||
| 12254 | + | ||
| 12255 | + for (try = 1; try <= 5; try++) { | ||
| 12256 | + res = acxmem_s_write_fw(adev, fw_image, 0); | ||
| 12257 | + log(L_DEBUG|L_INIT, "acx_write_fw (main): %d\n", res); | ||
| 12258 | + if (OK == res) { | ||
| 12259 | + res = acxmem_s_validate_fw(adev, fw_image, 0); | ||
| 12260 | + log(L_DEBUG|L_INIT, "acx_validate_fw " | ||
| 12261 | + "(main): %d\n", res); | ||
| 12262 | + } | ||
| 12263 | + | ||
| 12264 | + if (OK == res) { | ||
| 12265 | + SET_BIT(adev->dev_state_mask, ACX_STATE_FW_LOADED); | ||
| 12266 | + break; | ||
| 12267 | + } | ||
| 12268 | + printk("acx: firmware upload attempt #%d FAILED, " | ||
| 12269 | + "retrying...\n", try); | ||
| 12270 | + acx_s_msleep(1000); /* better wait for a while... */ | ||
| 12271 | + } | ||
| 12272 | + | ||
| 12273 | +#ifdef PATCH_AROUND_BAD_SPOTS | ||
| 12274 | + /* | ||
| 12275 | + * Only want to do this if the firmware is exactly what we expect for an | ||
| 12276 | + * iPaq 4700; otherwise, bad things would ensue. | ||
| 12277 | + */ | ||
| 12278 | + if ((HX4700_FIRMWARE_CHECKSUM == fw_image->chksum) || | ||
| 12279 | + (HX4700_ALTERNATE_FIRMWARE_CHECKSUM == fw_image->chksum)) { | ||
| 12280 | + /* | ||
| 12281 | + * Put the patch after the main firmware image. 0x950c contains | ||
| 12282 | + * the ACX's idea of the end of the firmware. Use that location to | ||
| 12283 | + * load ours (which depends on that location being 0xab58) then | ||
| 12284 | + * update that location to point to after ours. | ||
| 12285 | + */ | ||
| 12286 | + | ||
| 12287 | + offset = read_slavemem32 (adev, 0x950c); | ||
| 12288 | + | ||
| 12289 | + log (L_DEBUG, "acx: patching in at 0x%04x\n", offset); | ||
| 12290 | + | ||
| 12291 | + for (i = 0; i < sizeof(patch) / sizeof(patch[0]); i++) { | ||
| 12292 | + write_slavemem32 (adev, offset, patch[i]); | ||
| 12293 | + offset += sizeof(u32); | ||
| 12294 | + } | ||
| 12295 | + | ||
| 12296 | + /* | ||
| 12297 | + * Patch the instruction at 0x0804 to branch to our ARM patch at 0xab58 | ||
| 12298 | + */ | ||
| 12299 | + write_slavemem32 (adev, 0x0804, 0xea000000 + (0xab58-0x0804-8)/4); | ||
| 12300 | + | ||
| 12301 | + /* | ||
| 12302 | + * Patch the instructions at 0x1f40 to branch to our Thumb patch at 0xab74 | ||
| 12303 | + * | ||
| 12304 | + * 4a00 ldr r2, [pc, #0] | ||
| 12305 | + * 4710 bx r2 | ||
| 12306 | + * .data 0xab74+1 | ||
| 12307 | + */ | ||
| 12308 | + write_slavemem32 (adev, 0x1f40, 0x47104a00); | ||
| 12309 | + write_slavemem32 (adev, 0x1f44, 0x0000ab74+1); | ||
| 12310 | + | ||
| 12311 | + /* | ||
| 12312 | + * Bump the end of the firmware up to beyond our patch. | ||
| 12313 | + */ | ||
| 12314 | + write_slavemem32 (adev, 0x950c, offset); | ||
| 12315 | + | ||
| 12316 | + } | ||
| 12317 | +#endif | ||
| 12318 | + | ||
| 12319 | + vfree(fw_image); | ||
| 12320 | + | ||
| 12321 | + FN_EXIT1(res); | ||
| 12322 | + return res; | ||
| 12323 | +} | ||
| 12324 | + | ||
| 12325 | + | ||
| 12326 | +/*********************************************************************** | ||
| 12327 | +** acxmem_s_upload_radio | ||
| 12328 | +** | ||
| 12329 | +** Uploads the appropriate radio module firmware into the card. | ||
| 12330 | +*/ | ||
| 12331 | +int | ||
| 12332 | +acxmem_s_upload_radio(acx_device_t *adev) | ||
| 12333 | +{ | ||
| 12334 | + acx_ie_memmap_t mm; | ||
| 12335 | + firmware_image_t *radio_image; | ||
| 12336 | + acx_cmd_radioinit_t radioinit; | ||
| 12337 | + int res = NOT_OK; | ||
| 12338 | + int try; | ||
| 12339 | + u32 offset; | ||
| 12340 | + u32 size; | ||
| 12341 | + char filename[sizeof("RADIONN.BIN")]; | ||
| 12342 | + | ||
| 12343 | + if (!adev->need_radio_fw) return OK; | ||
| 12344 | + | ||
| 12345 | + FN_ENTER; | ||
| 12346 | + | ||
| 12347 | + acx_s_interrogate(adev, &mm, ACX1xx_IE_MEMORY_MAP); | ||
| 12348 | + offset = le32_to_cpu(mm.CodeEnd); | ||
| 12349 | + | ||
| 12350 | + snprintf(filename, sizeof(filename), "RADIO%02x.BIN", | ||
| 12351 | + adev->radio_type); | ||
| 12352 | + radio_image = acx_s_read_fw(adev->dev, filename, &size); | ||
| 12353 | + if (!radio_image) { | ||
| 12354 | + printk("acx: can't load radio module '%s'\n", filename); | ||
| 12355 | + goto fail; | ||
| 12356 | + } | ||
| 12357 | + | ||
| 12358 | + acx_s_issue_cmd(adev, ACX1xx_CMD_SLEEP, NULL, 0); | ||
| 12359 | + | ||
| 12360 | + for (try = 1; try <= 5; try++) { | ||
| 12361 | + res = acxmem_s_write_fw(adev, radio_image, offset); | ||
| 12362 | + log(L_DEBUG|L_INIT, "acx_write_fw (radio): %d\n", res); | ||
| 12363 | + if (OK == res) { | ||
| 12364 | + res = acxmem_s_validate_fw(adev, radio_image, offset); | ||
| 12365 | + log(L_DEBUG|L_INIT, "acx_validate_fw (radio): %d\n", res); | ||
| 12366 | + } | ||
| 12367 | + | ||
| 12368 | + if (OK == res) | ||
| 12369 | + break; | ||
| 12370 | + printk("acx: radio firmware upload attempt #%d FAILED, " | ||
| 12371 | + "retrying...\n", try); | ||
| 12372 | + acx_s_msleep(1000); /* better wait for a while... */ | ||
| 12373 | + } | ||
| 12374 | + | ||
| 12375 | + acx_s_issue_cmd(adev, ACX1xx_CMD_WAKE, NULL, 0); | ||
| 12376 | + radioinit.offset = cpu_to_le32(offset); | ||
| 12377 | + | ||
| 12378 | + /* no endian conversion needed, remains in card CPU area: */ | ||
| 12379 | + radioinit.len = radio_image->size; | ||
| 12380 | + | ||
| 12381 | + vfree(radio_image); | ||
| 12382 | + | ||
| 12383 | + if (OK != res) | ||
| 12384 | + goto fail; | ||
| 12385 | + | ||
| 12386 | + /* will take a moment so let's have a big timeout */ | ||
| 12387 | + acx_s_issue_cmd_timeo(adev, ACX1xx_CMD_RADIOINIT, | ||
| 12388 | + &radioinit, sizeof(radioinit), CMD_TIMEOUT_MS(1000)); | ||
| 12389 | + | ||
| 12390 | + res = acx_s_interrogate(adev, &mm, ACX1xx_IE_MEMORY_MAP); | ||
| 12391 | + | ||
| 12392 | +fail: | ||
| 12393 | + FN_EXIT1(res); | ||
| 12394 | + return res; | ||
| 12395 | +} | ||
| 12396 | + | ||
| 12397 | +/*********************************************************************** | ||
| 12398 | +** acxmem_l_reset_mac | ||
| 12399 | +** | ||
| 12400 | +** MAC will be reset | ||
| 12401 | +** Call context: reset_dev | ||
| 12402 | +*/ | ||
| 12403 | +static void | ||
| 12404 | +acxmem_l_reset_mac(acx_device_t *adev) | ||
| 12405 | +{ | ||
| 12406 | + int count; | ||
| 12407 | + FN_ENTER; | ||
| 12408 | + | ||
| 12409 | + /* halt eCPU */ | ||
| 12410 | + set_regbits (adev, IO_ACX_ECPU_CTRL, 0x1); | ||
| 12411 | + | ||
| 12412 | + /* now do soft reset of eCPU, set bit */ | ||
| 12413 | + set_regbits (adev, IO_ACX_SOFT_RESET, 0x1); | ||
| 12414 | + log(L_DEBUG, "%s: enable soft reset...\n", __func__); | ||
| 12415 | + | ||
| 12416 | + /* Windows driver sleeps here for a while with this sequence */ | ||
| 12417 | + for (count = 0; count < 200; count++) { | ||
| 12418 | + udelay (50); | ||
| 12419 | + } | ||
| 12420 | + | ||
| 12421 | + /* now clear bit again: deassert eCPU reset */ | ||
| 12422 | + log(L_DEBUG, "%s: disable soft reset and go to init mode...\n", __func__); | ||
| 12423 | + clear_regbits (adev, IO_ACX_SOFT_RESET, 0x1); | ||
| 12424 | + | ||
| 12425 | + /* now start a burst read from initial EEPROM */ | ||
| 12426 | + set_regbits (adev, IO_ACX_EE_START, 0x1); | ||
| 12427 | + | ||
| 12428 | + /* | ||
| 12429 | + * Windows driver sleeps here for a while with this sequence | ||
| 12430 | + */ | ||
| 12431 | + for (count = 0; count < 200; count++) { | ||
| 12432 | + udelay (50); | ||
| 12433 | + } | ||
| 12434 | + | ||
| 12435 | + /* Windows driver writes 0x10000 to register 0x808 here */ | ||
| 12436 | + | ||
| 12437 | + write_reg32 (adev, 0x808, 0x10000); | ||
| 12438 | + | ||
| 12439 | + FN_EXIT0; | ||
| 12440 | +} | ||
| 12441 | + | ||
| 12442 | + | ||
| 12443 | +/*********************************************************************** | ||
| 12444 | +** acxmem_s_verify_init | ||
| 12445 | +*/ | ||
| 12446 | +static int | ||
| 12447 | +acxmem_s_verify_init(acx_device_t *adev) | ||
| 12448 | +{ | ||
| 12449 | + int result = NOT_OK; | ||
| 12450 | + unsigned long timeout; | ||
| 12451 | + | ||
| 12452 | + FN_ENTER; | ||
| 12453 | + | ||
| 12454 | + timeout = jiffies + 2*HZ; | ||
| 12455 | + for (;;) { | ||
| 12456 | + u32 irqstat = read_reg32(adev, IO_ACX_IRQ_STATUS_NON_DES); | ||
| 12457 | + if ((irqstat != 0xFFFFFFFF) && (irqstat & HOST_INT_FCS_THRESHOLD)) { | ||
| 12458 | + result = OK; | ||
| 12459 | + write_reg32(adev, IO_ACX_IRQ_ACK, HOST_INT_FCS_THRESHOLD); | ||
| 12460 | + break; | ||
| 12461 | + } | ||
| 12462 | + if (time_after(jiffies, timeout)) | ||
| 12463 | + break; | ||
| 12464 | + /* Init may take up to ~0.5 sec total */ | ||
| 12465 | + acx_s_msleep(50); | ||
| 12466 | + } | ||
| 12467 | + | ||
| 12468 | + FN_EXIT1(result); | ||
| 12469 | + return result; | ||
| 12470 | +} | ||
| 12471 | + | ||
| 12472 | + | ||
| 12473 | +/*********************************************************************** | ||
| 12474 | +** A few low-level helpers | ||
| 12475 | +** | ||
| 12476 | +** Note: these functions are not protected by lock | ||
| 12477 | +** and thus are never allowed to be called from IRQ. | ||
| 12478 | +** Also they must not race with fw upload which uses same hw regs | ||
| 12479 | +*/ | ||
| 12480 | + | ||
| 12481 | +/*********************************************************************** | ||
| 12482 | +** acxmem_write_cmd_type_status | ||
| 12483 | +*/ | ||
| 12484 | + | ||
| 12485 | +static inline void | ||
| 12486 | +acxmem_write_cmd_type_status(acx_device_t *adev, u16 type, u16 status) | ||
| 12487 | +{ | ||
| 12488 | + write_slavemem32 (adev, (u32) adev->cmd_area, type | (status << 16)); | ||
| 12489 | + write_flush(adev); | ||
| 12490 | +} | ||
| 12491 | + | ||
| 12492 | + | ||
| 12493 | +/*********************************************************************** | ||
| 12494 | +** acxmem_read_cmd_type_status | ||
| 12495 | +*/ | ||
| 12496 | +static u32 | ||
| 12497 | +acxmem_read_cmd_type_status(acx_device_t *adev) | ||
| 12498 | +{ | ||
| 12499 | + u32 cmd_type, cmd_status; | ||
| 12500 | + | ||
| 12501 | + cmd_type = read_slavemem32 (adev, (u32) adev->cmd_area); | ||
| 12502 | + | ||
| 12503 | + cmd_status = (cmd_type >> 16); | ||
| 12504 | + cmd_type = (u16)cmd_type; | ||
| 12505 | + | ||
| 12506 | + log(L_CTL, "cmd_type:%04X cmd_status:%04X [%s]\n", | ||
| 12507 | + cmd_type, cmd_status, | ||
| 12508 | + acx_cmd_status_str(cmd_status)); | ||
| 12509 | + | ||
| 12510 | + return cmd_status; | ||
| 12511 | +} | ||
| 12512 | + | ||
| 12513 | + | ||
| 12514 | +/*********************************************************************** | ||
| 12515 | +** acxmem_s_reset_dev | ||
| 12516 | +** | ||
| 12517 | +** Arguments: | ||
| 12518 | +** netdevice that contains the adev variable | ||
| 12519 | +** Returns: | ||
| 12520 | +** NOT_OK on fail | ||
| 12521 | +** OK on success | ||
| 12522 | +** Side effects: | ||
| 12523 | +** device is hard reset | ||
| 12524 | +** Call context: | ||
| 12525 | +** acxmem_e_probe | ||
| 12526 | +** Comment: | ||
| 12527 | +** This resets the device using low level hardware calls | ||
| 12528 | +** as well as uploads and verifies the firmware to the card | ||
| 12529 | +*/ | ||
| 12530 | + | ||
| 12531 | +static inline void | ||
| 12532 | +init_mboxes(acx_device_t *adev) | ||
| 12533 | +{ | ||
| 12534 | + u32 cmd_offs, info_offs; | ||
| 12535 | + | ||
| 12536 | + cmd_offs = read_reg32(adev, IO_ACX_CMD_MAILBOX_OFFS); | ||
| 12537 | + info_offs = read_reg32(adev, IO_ACX_INFO_MAILBOX_OFFS); | ||
| 12538 | + adev->cmd_area = (u8*) cmd_offs; | ||
| 12539 | + adev->info_area = (u8*) info_offs; | ||
| 12540 | + /* | ||
| 12541 | + log(L_DEBUG, "iobase2=%p\n" | ||
| 12542 | + */ | ||
| 12543 | + log( L_DEBUG, "cmd_mbox_offset=%X cmd_area=%p\n" | ||
| 12544 | + "info_mbox_offset=%X info_area=%p\n", | ||
| 12545 | + cmd_offs, adev->cmd_area, | ||
| 12546 | + info_offs, adev->info_area); | ||
| 12547 | +} | ||
| 12548 | + | ||
| 12549 | + | ||
| 12550 | +static inline void | ||
| 12551 | +read_eeprom_area(acx_device_t *adev) | ||
| 12552 | +{ | ||
| 12553 | +#if ACX_DEBUG > 1 | ||
| 12554 | + int offs; | ||
| 12555 | + u8 tmp; | ||
| 12556 | + | ||
| 12557 | + for (offs = 0x8c; offs < 0xb9; offs++) | ||
| 12558 | + acxmem_read_eeprom_byte(adev, offs, &tmp); | ||
| 12559 | +#endif | ||
| 12560 | +} | ||
| 12561 | + | ||
| 12562 | +static int | ||
| 12563 | +acxmem_s_reset_dev(acx_device_t *adev) | ||
| 12564 | +{ | ||
| 12565 | + const char* msg = ""; | ||
| 12566 | + unsigned long flags; | ||
| 12567 | + int result = NOT_OK; | ||
| 12568 | + u16 hardware_info; | ||
| 12569 | + u16 ecpu_ctrl; | ||
| 12570 | + int count; | ||
| 12571 | + u32 tmp; | ||
| 12572 | + | ||
| 12573 | + FN_ENTER; | ||
| 12574 | + /* | ||
| 12575 | + write_reg32 (adev, IO_ACX_SLV_MEM_CP, 0); | ||
| 12576 | + */ | ||
| 12577 | + /* reset the device to make sure the eCPU is stopped | ||
| 12578 | + * to upload the firmware correctly */ | ||
| 12579 | + | ||
| 12580 | + acx_lock(adev, flags); | ||
| 12581 | + | ||
| 12582 | + /* Windows driver does some funny things here */ | ||
| 12583 | + /* | ||
| 12584 | + * clear bit 0x200 in register 0x2A0 | ||
| 12585 | + */ | ||
| 12586 | + clear_regbits (adev, 0x2A0, 0x200); | ||
| 12587 | + | ||
| 12588 | + /* | ||
| 12589 | + * Set bit 0x200 in ACX_GPIO_OUT | ||
| 12590 | + */ | ||
| 12591 | + set_regbits (adev, IO_ACX_GPIO_OUT, 0x200); | ||
| 12592 | + | ||
| 12593 | + /* | ||
| 12594 | + * read register 0x900 until its value is 0x8400104C, sleeping | ||
| 12595 | + * in between reads if it's not immediate | ||
| 12596 | + */ | ||
| 12597 | + tmp = read_reg32 (adev, REG_ACX_VENDOR_ID); | ||
| 12598 | + count = 500; | ||
| 12599 | + while (count-- && (tmp != ACX_VENDOR_ID)) { | ||
| 12600 | + mdelay (10); | ||
| 12601 | + tmp = read_reg32 (adev, REG_ACX_VENDOR_ID); | ||
| 12602 | + } | ||
| 12603 | + | ||
| 12604 | + /* end what Windows driver does */ | ||
| 12605 | + | ||
| 12606 | + acxmem_l_reset_mac(adev); | ||
| 12607 | + | ||
| 12608 | + ecpu_ctrl = read_reg32(adev, IO_ACX_ECPU_CTRL) & 1; | ||
| 12609 | + if (!ecpu_ctrl) { | ||
| 12610 | + msg = "eCPU is already running. "; | ||
| 12611 | + goto end_unlock; | ||
| 12612 | + } | ||
| 12613 | + | ||
| 12614 | +#ifdef WE_DONT_NEED_THAT_DO_WE | ||
| 12615 | + if (read_reg16(adev, IO_ACX_SOR_CFG) & 2) { | ||
| 12616 | + /* eCPU most likely means "embedded CPU" */ | ||
| 12617 | + msg = "eCPU did not start after boot from flash. "; | ||
| 12618 | + goto end_unlock; | ||
| 12619 | + } | ||
| 12620 | + | ||
| 12621 | + /* check sense on reset flags */ | ||
| 12622 | + if (read_reg16(adev, IO_ACX_SOR_CFG) & 0x10) { | ||
| 12623 | + printk("%s: eCPU did not start after boot (SOR), " | ||
| 12624 | + "is this fatal?\n", adev->ndev->name); | ||
| 12625 | + } | ||
| 12626 | +#endif | ||
| 12627 | + /* scan, if any, is stopped now, setting corresponding IRQ bit */ | ||
| 12628 | + adev->irq_status |= HOST_INT_SCAN_COMPLETE; | ||
| 12629 | + | ||
| 12630 | + acx_unlock(adev, flags); | ||
| 12631 | + | ||
| 12632 | + /* need to know radio type before fw load */ | ||
| 12633 | + /* Need to wait for arrival of this information in a loop, | ||
| 12634 | + * most probably since eCPU runs some init code from EEPROM | ||
| 12635 | + * (started burst read in reset_mac()) which also | ||
| 12636 | + * sets the radio type ID */ | ||
| 12637 | + | ||
| 12638 | + count = 0xffff; | ||
| 12639 | + do { | ||
| 12640 | + hardware_info = read_reg16(adev, IO_ACX_EEPROM_INFORMATION); | ||
| 12641 | + if (!--count) { | ||
| 12642 | + msg = "eCPU didn't indicate radio type"; | ||
| 12643 | + goto end_fail; | ||
| 12644 | + } | ||
| 12645 | + cpu_relax(); | ||
| 12646 | + } while (!(hardware_info & 0xff00)); /* radio type still zero? */ | ||
| 12647 | + printk("ACX radio type 0x%02x\n", (hardware_info >> 8) & 0xff); | ||
| 12648 | + /* printk("DEBUG: count %d\n", count); */ | ||
| 12649 | + adev->form_factor = hardware_info & 0xff; | ||
| 12650 | + adev->radio_type = hardware_info >> 8; | ||
| 12651 | + | ||
| 12652 | + /* load the firmware */ | ||
| 12653 | + if (OK != acxmem_s_upload_fw(adev)) | ||
| 12654 | + goto end_fail; | ||
| 12655 | + | ||
| 12656 | + /* acx_s_msleep(10); this one really shouldn't be required */ | ||
| 12657 | + | ||
| 12658 | + /* now start eCPU by clearing bit */ | ||
| 12659 | + clear_regbits (adev, IO_ACX_ECPU_CTRL, 0x1); | ||
| 12660 | + log(L_DEBUG, "booted eCPU up and waiting for completion...\n"); | ||
| 12661 | + | ||
| 12662 | + /* Windows driver clears bit 0x200 in register 0x2A0 here */ | ||
| 12663 | + clear_regbits (adev, 0x2A0, 0x200); | ||
| 12664 | + | ||
| 12665 | + /* Windows driver sets bit 0x200 in ACX_GPIO_OUT here */ | ||
| 12666 | + set_regbits (adev, IO_ACX_GPIO_OUT, 0x200); | ||
| 12667 | + /* wait for eCPU bootup */ | ||
| 12668 | + if (OK != acxmem_s_verify_init(adev)) { | ||
| 12669 | + msg = "timeout waiting for eCPU. "; | ||
| 12670 | + goto end_fail; | ||
| 12671 | + } | ||
| 12672 | + log(L_DEBUG, "eCPU has woken up, card is ready to be configured\n"); | ||
| 12673 | + init_mboxes(adev); | ||
| 12674 | + acxmem_write_cmd_type_status(adev, ACX1xx_CMD_RESET, 0); | ||
| 12675 | + | ||
| 12676 | + /* test that EEPROM is readable */ | ||
| 12677 | + read_eeprom_area(adev); | ||
| 12678 | + | ||
| 12679 | + result = OK; | ||
| 12680 | + goto end; | ||
| 12681 | + | ||
| 12682 | +/* Finish error message. Indicate which function failed */ | ||
| 12683 | +end_unlock: | ||
| 12684 | + acx_unlock(adev, flags); | ||
| 12685 | +end_fail: | ||
| 12686 | + printk("acx: %sreset_dev() FAILED\n", msg); | ||
| 12687 | +end: | ||
| 12688 | + FN_EXIT1(result); | ||
| 12689 | + return result; | ||
| 12690 | +} | ||
| 12691 | + | ||
| 12692 | + | ||
| 12693 | +/*********************************************************************** | ||
| 12694 | +** acxmem_s_issue_cmd_timeo | ||
| 12695 | +** | ||
| 12696 | +** Sends command to fw, extract result | ||
| 12697 | +** | ||
| 12698 | +** NB: we do _not_ take lock inside, so be sure to not touch anything | ||
| 12699 | +** which may interfere with IRQ handler operation | ||
| 12700 | +** | ||
| 12701 | +** TODO: busy wait is a bit silly, so: | ||
| 12702 | +** 1) stop doing many iters - go to sleep after first | ||
| 12703 | +** 2) go to waitqueue based approach: wait, not poll! | ||
| 12704 | +*/ | ||
| 12705 | +#undef FUNC | ||
| 12706 | +#define FUNC "issue_cmd" | ||
| 12707 | + | ||
| 12708 | +#if !ACX_DEBUG | ||
| 12709 | +int | ||
| 12710 | +acxmem_s_issue_cmd_timeo( | ||
| 12711 | + acx_device_t *adev, | ||
| 12712 | + unsigned int cmd, | ||
| 12713 | + void *buffer, | ||
| 12714 | + unsigned buflen, | ||
| 12715 | + unsigned cmd_timeout) | ||
| 12716 | +{ | ||
| 12717 | +#else | ||
| 12718 | +int | ||
| 12719 | +acxmem_s_issue_cmd_timeo_debug( | ||
| 12720 | + acx_device_t *adev, | ||
| 12721 | + unsigned cmd, | ||
| 12722 | + void *buffer, | ||
| 12723 | + unsigned buflen, | ||
| 12724 | + unsigned cmd_timeout, | ||
| 12725 | + const char* cmdstr) | ||
| 12726 | +{ | ||
| 12727 | + unsigned long start = jiffies; | ||
| 12728 | +#endif | ||
| 12729 | + const char *devname; | ||
| 12730 | + unsigned counter; | ||
| 12731 | + u16 irqtype; | ||
| 12732 | + int i, j; | ||
| 12733 | + u8 *p; | ||
| 12734 | + u16 cmd_status; | ||
| 12735 | + unsigned long timeout; | ||
| 12736 | + | ||
| 12737 | + FN_ENTER; | ||
| 12738 | + | ||
| 12739 | + devname = adev->ndev->name; | ||
| 12740 | + if (!devname || !devname[0] || devname[4]=='%') | ||
| 12741 | + devname = "acx"; | ||
| 12742 | + | ||
| 12743 | + log(L_CTL, FUNC"(cmd:%s,buflen:%u,timeout:%ums,type:0x%04X)\n", | ||
| 12744 | + cmdstr, buflen, cmd_timeout, | ||
| 12745 | + buffer ? le16_to_cpu(((acx_ie_generic_t *)buffer)->type) : -1); | ||
| 12746 | + | ||
| 12747 | + if (!(adev->dev_state_mask & ACX_STATE_FW_LOADED)) { | ||
| 12748 | + printk("%s: "FUNC"(): firmware is not loaded yet, " | ||
| 12749 | + "cannot execute commands!\n", devname); | ||
| 12750 | + goto bad; | ||
| 12751 | + } | ||
| 12752 | + | ||
| 12753 | + if ((acx_debug & L_DEBUG) && (cmd != ACX1xx_CMD_INTERROGATE)) { | ||
| 12754 | + printk("input buffer (len=%u):\n", buflen); | ||
| 12755 | + acx_dump_bytes(buffer, buflen); | ||
| 12756 | + } | ||
| 12757 | + | ||
| 12758 | + /* wait for firmware to become idle for our command submission */ | ||
| 12759 | + timeout = HZ/5; | ||
| 12760 | + counter = (timeout * 1000 / HZ) - 1; /* in ms */ | ||
| 12761 | + timeout += jiffies; | ||
| 12762 | + do { | ||
| 12763 | + cmd_status = acxmem_read_cmd_type_status(adev); | ||
| 12764 | + /* Test for IDLE state */ | ||
| 12765 | + if (!cmd_status) | ||
| 12766 | + break; | ||
| 12767 | + if (counter % 8 == 0) { | ||
| 12768 | + if (time_after(jiffies, timeout)) { | ||
| 12769 | + counter = 0; | ||
| 12770 | + break; | ||
| 12771 | + } | ||
| 12772 | + /* we waited 8 iterations, no luck. Sleep 8 ms */ | ||
| 12773 | + acx_s_msleep(8); | ||
| 12774 | + } | ||
| 12775 | + } while (likely(--counter)); | ||
| 12776 | + | ||
| 12777 | + if (!counter) { | ||
| 12778 | + /* the card doesn't get idle, we're in trouble */ | ||
| 12779 | + printk("%s: "FUNC"(): cmd_status is not IDLE: 0x%04X!=0\n", | ||
| 12780 | + devname, cmd_status); | ||
| 12781 | +#if DUMP_IF_SLOW > 0 | ||
| 12782 | + dump_acxmem (adev, 0, 0x10000); | ||
| 12783 | + panic ("not idle"); | ||
| 12784 | +#endif | ||
| 12785 | + goto bad; | ||
| 12786 | + } else if (counter < 190) { /* if waited >10ms... */ | ||
| 12787 | + log(L_CTL|L_DEBUG, FUNC"(): waited for IDLE %dms. " | ||
| 12788 | + "Please report\n", 199 - counter); | ||
| 12789 | + } | ||
| 12790 | + | ||
| 12791 | + /* now write the parameters of the command if needed */ | ||
| 12792 | + if (buffer && buflen) { | ||
| 12793 | + /* if it's an INTERROGATE command, just pass the length | ||
| 12794 | + * of parameters to read, as data */ | ||
| 12795 | +#if CMD_DISCOVERY | ||
| 12796 | + if (cmd == ACX1xx_CMD_INTERROGATE) | ||
| 12797 | + memset_io(adev->cmd_area + 4, 0xAA, buflen); | ||
| 12798 | +#endif | ||
| 12799 | + /* | ||
| 12800 | + * slave memory version | ||
| 12801 | + */ | ||
| 12802 | + copy_to_slavemem (adev, (u32) (adev->cmd_area + 4), buffer, | ||
| 12803 | + (cmd == ACX1xx_CMD_INTERROGATE) ? 4 : buflen); | ||
| 12804 | + } | ||
| 12805 | + /* now write the actual command type */ | ||
| 12806 | + acxmem_write_cmd_type_status(adev, cmd, 0); | ||
| 12807 | + | ||
| 12808 | + /* clear CMD_COMPLETE bit. can be set only by IRQ handler: */ | ||
| 12809 | + adev->irq_status &= ~HOST_INT_CMD_COMPLETE; | ||
| 12810 | + | ||
| 12811 | + /* execute command */ | ||
| 12812 | + write_reg16(adev, IO_ACX_INT_TRIG, INT_TRIG_CMD); | ||
| 12813 | + write_flush(adev); | ||
| 12814 | + | ||
| 12815 | + /* wait for firmware to process command */ | ||
| 12816 | + | ||
| 12817 | + /* Ensure nonzero and not too large timeout. | ||
| 12818 | + ** Also converts e.g. 100->99, 200->199 | ||
| 12819 | + ** which is nice but not essential */ | ||
| 12820 | + cmd_timeout = (cmd_timeout-1) | 1; | ||
| 12821 | + if (unlikely(cmd_timeout > 1199)) | ||
| 12822 | + cmd_timeout = 1199; | ||
| 12823 | + | ||
| 12824 | + /* we schedule away sometimes (timeout can be large) */ | ||
| 12825 | + counter = cmd_timeout; | ||
| 12826 | + timeout = jiffies + cmd_timeout * HZ / 1000; | ||
| 12827 | + do { | ||
| 12828 | + if (!adev->irqs_active) { /* IRQ disabled: poll */ | ||
| 12829 | + irqtype = read_reg16(adev, IO_ACX_IRQ_STATUS_NON_DES); | ||
| 12830 | + if (irqtype & HOST_INT_CMD_COMPLETE) { | ||
| 12831 | + write_reg16(adev, IO_ACX_IRQ_ACK, | ||
| 12832 | + HOST_INT_CMD_COMPLETE); | ||
| 12833 | + break; | ||
| 12834 | + } | ||
| 12835 | + } else { /* Wait when IRQ will set the bit */ | ||
| 12836 | + irqtype = adev->irq_status; | ||
| 12837 | + if (irqtype & HOST_INT_CMD_COMPLETE) | ||
| 12838 | + break; | ||
| 12839 | + } | ||
| 12840 | + | ||
| 12841 | + if (counter % 8 == 0) { | ||
| 12842 | + if (time_after(jiffies, timeout)) { | ||
| 12843 | + counter = 0; | ||
| 12844 | + break; | ||
| 12845 | + } | ||
| 12846 | + /* we waited 8 iterations, no luck. Sleep 8 ms */ | ||
| 12847 | + acx_s_msleep(8); | ||
| 12848 | + } | ||
| 12849 | + } while (likely(--counter)); | ||
| 12850 | + | ||
| 12851 | + /* save state for debugging */ | ||
| 12852 | + cmd_status = acxmem_read_cmd_type_status(adev); | ||
| 12853 | + | ||
| 12854 | + /* put the card in IDLE state */ | ||
| 12855 | + acxmem_write_cmd_type_status(adev, ACX1xx_CMD_RESET, 0); | ||
| 12856 | + | ||
| 12857 | + if (!counter) { /* timed out! */ | ||
| 12858 | + printk("%s: "FUNC"(): timed out %s for CMD_COMPLETE. " | ||
| 12859 | + "irq bits:0x%04X irq_status:0x%04X timeout:%dms " | ||
| 12860 | + "cmd_status:%d (%s)\n", | ||
| 12861 | + devname, (adev->irqs_active) ? "waiting" : "polling", | ||
| 12862 | + irqtype, adev->irq_status, cmd_timeout, | ||
| 12863 | + cmd_status, acx_cmd_status_str(cmd_status)); | ||
| 12864 | + printk("%s: "FUNC"(): device irq status 0x%04x\n", | ||
| 12865 | + devname, read_reg16(adev, IO_ACX_IRQ_STATUS_NON_DES)); | ||
| 12866 | + printk("%s: "FUNC"(): IO_ACX_IRQ_MASK 0x%04x IO_ACX_FEMR 0x%04x\n", | ||
| 12867 | + devname, | ||
| 12868 | + read_reg16 (adev, IO_ACX_IRQ_MASK), | ||
| 12869 | + read_reg16 (adev, IO_ACX_FEMR)); | ||
| 12870 | + if (read_reg16 (adev, IO_ACX_IRQ_MASK) == 0xffff) { | ||
| 12871 | + printk ("acxmem: firmware probably hosed - reloading\n"); | ||
| 12872 | +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 11) | ||
| 12873 | + { | ||
| 12874 | + pm_message_t state; | ||
| 12875 | + /* acxmem_e_suspend (resume_pdev, state); */ | ||
| 12876 | + acxmem_e_suspend (adev->ndev , state); | ||
| 12877 | + } | ||
| 12878 | +#else | ||
| 12879 | + acxmem_e_suspend (adev, 0); | ||
| 12880 | +#endif | ||
| 12881 | + { | ||
| 12882 | + resume_ndev = adev->ndev; | ||
| 12883 | + fw_resumer (NULL); | ||
| 12884 | + } | ||
| 12885 | + } | ||
| 12886 | + | ||
| 12887 | + goto bad; | ||
| 12888 | + } else if (cmd_timeout - counter > 30) { /* if waited >30ms... */ | ||
| 12889 | + log(L_CTL|L_DEBUG, FUNC"(): %s for CMD_COMPLETE %dms. " | ||
| 12890 | + "count:%d. Please report\n", | ||
| 12891 | + (adev->irqs_active) ? "waited" : "polled", | ||
| 12892 | + cmd_timeout - counter, counter); | ||
| 12893 | + } | ||
| 12894 | + | ||
| 12895 | + if (1 != cmd_status) { /* it is not a 'Success' */ | ||
| 12896 | + printk("%s: "FUNC"(): cmd_status is not SUCCESS: %d (%s). " | ||
| 12897 | + "Took %dms of %d\n", | ||
| 12898 | + devname, cmd_status, acx_cmd_status_str(cmd_status), | ||
| 12899 | + cmd_timeout - counter, cmd_timeout); | ||
| 12900 | + /* zero out result buffer | ||
| 12901 | + * WARNING: this will trash stack in case of illegally large input | ||
| 12902 | + * length! */ | ||
| 12903 | + if (buflen > 388) { | ||
| 12904 | + /* | ||
| 12905 | + * 388 is maximum command length | ||
| 12906 | + */ | ||
| 12907 | + printk ("invalid length 0x%08x\n", buflen); | ||
| 12908 | + buflen = 388; | ||
| 12909 | + } | ||
| 12910 | + p = (u8 *) buffer; | ||
| 12911 | + for (i = 0; i < buflen; i+= 16) { | ||
| 12912 | + printk ("%04x:", i); | ||
| 12913 | + for (j = 0; (j < 16) && (i+j < buflen); j++) { | ||
| 12914 | + printk (" %02x", *p++); | ||
| 12915 | + } | ||
| 12916 | + printk ("\n"); | ||
| 12917 | + } | ||
| 12918 | + if (buffer && buflen) | ||
| 12919 | + memset(buffer, 0, buflen); | ||
| 12920 | + goto bad; | ||
| 12921 | + } | ||
| 12922 | + | ||
| 12923 | + /* read in result parameters if needed */ | ||
| 12924 | + if (buffer && buflen && (cmd == ACX1xx_CMD_INTERROGATE)) { | ||
| 12925 | + copy_from_slavemem (adev, buffer, (u32) (adev->cmd_area + 4), buflen); | ||
| 12926 | + if (acx_debug & L_DEBUG) { | ||
| 12927 | + printk("output buffer (len=%u): ", buflen); | ||
| 12928 | + acx_dump_bytes(buffer, buflen); | ||
| 12929 | + } | ||
| 12930 | + } | ||
| 12931 | + | ||
| 12932 | +/* ok: */ | ||
| 12933 | + log(L_CTL, FUNC"(%s): took %ld jiffies to complete\n", | ||
| 12934 | + cmdstr, jiffies - start); | ||
| 12935 | + FN_EXIT1(OK); | ||
| 12936 | + return OK; | ||
| 12937 | + | ||
| 12938 | +bad: | ||
| 12939 | + /* Give enough info so that callers can avoid | ||
| 12940 | + ** printing their own diagnostic messages */ | ||
| 12941 | +#if ACX_DEBUG | ||
| 12942 | + printk("%s: "FUNC"(cmd:%s) FAILED\n", devname, cmdstr); | ||
| 12943 | +#else | ||
| 12944 | + printk("%s: "FUNC"(cmd:0x%04X) FAILED\n", devname, cmd); | ||
| 12945 | +#endif | ||
| 12946 | + dump_stack(); | ||
| 12947 | + FN_EXIT1(NOT_OK); | ||
| 12948 | + return NOT_OK; | ||
| 12949 | +} | ||
| 12950 | + | ||
| 12951 | + | ||
| 12952 | +/*********************************************************************** | ||
| 12953 | +*/ | ||
| 12954 | +#if defined(NONESSENTIAL_FEATURES) | ||
| 12955 | +typedef struct device_id { | ||
| 12956 | + unsigned char id[6]; | ||
| 12957 | + char *descr; | ||
| 12958 | + char *type; | ||
| 12959 | +} device_id_t; | ||
| 12960 | + | ||
| 12961 | +static const device_id_t | ||
| 12962 | +device_ids[] = | ||
| 12963 | +{ | ||
| 12964 | + { | ||
| 12965 | + {'G', 'l', 'o', 'b', 'a', 'l'}, | ||
| 12966 | + NULL, | ||
| 12967 | + NULL, | ||
| 12968 | + }, | ||
| 12969 | + { | ||
| 12970 | + {0xff, 0xff, 0xff, 0xff, 0xff, 0xff}, | ||
| 12971 | + "uninitialized", | ||
| 12972 | + "SpeedStream SS1021 or Gigafast WF721-AEX" | ||
| 12973 | + }, | ||
| 12974 | + { | ||
| 12975 | + {0x80, 0x81, 0x82, 0x83, 0x84, 0x85}, | ||
| 12976 | + "non-standard", | ||
| 12977 | + "DrayTek Vigor 520" | ||
| 12978 | + }, | ||
| 12979 | + { | ||
| 12980 | + {'?', '?', '?', '?', '?', '?'}, | ||
| 12981 | + "non-standard", | ||
| 12982 | + "Level One WPC-0200" | ||
| 12983 | + }, | ||
| 12984 | + { | ||
| 12985 | + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, | ||
| 12986 | + "empty", | ||
| 12987 | + "DWL-650+ variant" | ||
| 12988 | + } | ||
| 12989 | +}; | ||
| 12990 | + | ||
| 12991 | +static void | ||
| 12992 | +acx_show_card_eeprom_id(acx_device_t *adev) | ||
| 12993 | +{ | ||
| 12994 | + unsigned char buffer[CARD_EEPROM_ID_SIZE]; | ||
| 12995 | + int i; | ||
| 12996 | + | ||
| 12997 | + memset(&buffer, 0, CARD_EEPROM_ID_SIZE); | ||
| 12998 | + /* use direct EEPROM access */ | ||
| 12999 | + for (i = 0; i < CARD_EEPROM_ID_SIZE; i++) { | ||
| 13000 | + if (OK != acxmem_read_eeprom_byte(adev, | ||
| 13001 | + ACX100_EEPROM_ID_OFFSET + i, | ||
| 13002 | + &buffer[i])) { | ||
| 13003 | + printk("acx: reading EEPROM FAILED\n"); | ||
| 13004 | + break; | ||
| 13005 | + } | ||
| 13006 | + } | ||
| 13007 | + | ||
| 13008 | + for (i = 0; i < VEC_SIZE(device_ids); i++) { | ||
| 13009 | + if (!memcmp(&buffer, device_ids[i].id, CARD_EEPROM_ID_SIZE)) { | ||
| 13010 | + if (device_ids[i].descr) { | ||
| 13011 | + printk("acx: EEPROM card ID string check " | ||
| 13012 | + "found %s card ID: is this %s?\n", | ||
| 13013 | + device_ids[i].descr, device_ids[i].type); | ||
| 13014 | + } | ||
| 13015 | + break; | ||
| 13016 | + } | ||
| 13017 | + } | ||
| 13018 | + if (i == VEC_SIZE(device_ids)) { | ||
| 13019 | + printk("acx: EEPROM card ID string check found " | ||
| 13020 | + "unknown card: expected 'Global', got '%.*s\'. " | ||
| 13021 | + "Please report\n", CARD_EEPROM_ID_SIZE, buffer); | ||
| 13022 | + } | ||
| 13023 | +} | ||
| 13024 | +#endif /* NONESSENTIAL_FEATURES */ | ||
| 13025 | + | ||
| 13026 | +/*********************************************************************** | ||
| 13027 | +** acxmem_free_desc_queues | ||
| 13028 | +** | ||
| 13029 | +** Releases the queues that have been allocated, the | ||
| 13030 | +** others have been initialised to NULL so this | ||
| 13031 | +** function can be used if only part of the queues were allocated. | ||
| 13032 | +*/ | ||
| 13033 | + | ||
| 13034 | +void | ||
| 13035 | +acxmem_free_desc_queues(acx_device_t *adev) | ||
| 13036 | +{ | ||
| 13037 | +#define ACX_FREE_QUEUE(size, ptr, phyaddr) \ | ||
| 13038 | + if (ptr) { \ | ||
| 13039 | + kfree(ptr); \ | ||
| 13040 | + ptr = NULL; \ | ||
| 13041 | + size = 0; \ | ||
| 13042 | + } | ||
| 13043 | + | ||
| 13044 | + FN_ENTER; | ||
| 13045 | + | ||
| 13046 | + ACX_FREE_QUEUE(adev->txhostdesc_area_size, adev->txhostdesc_start, adev->txhostdesc_startphy); | ||
| 13047 | + ACX_FREE_QUEUE(adev->txbuf_area_size, adev->txbuf_start, adev->txbuf_startphy); | ||
| 13048 | + | ||
| 13049 | + adev->txdesc_start = NULL; | ||
| 13050 | + | ||
| 13051 | + ACX_FREE_QUEUE(adev->rxhostdesc_area_size, adev->rxhostdesc_start, adev->rxhostdesc_startphy); | ||
| 13052 | + ACX_FREE_QUEUE(adev->rxbuf_area_size, adev->rxbuf_start, adev->rxbuf_startphy); | ||
| 13053 | + | ||
| 13054 | + adev->rxdesc_start = NULL; | ||
| 13055 | + | ||
| 13056 | + FN_EXIT0; | ||
| 13057 | +} | ||
| 13058 | + | ||
| 13059 | + | ||
| 13060 | +/*********************************************************************** | ||
| 13061 | +** acxmem_s_delete_dma_regions | ||
| 13062 | +*/ | ||
| 13063 | +static void | ||
| 13064 | +acxmem_s_delete_dma_regions(acx_device_t *adev) | ||
| 13065 | +{ | ||
| 13066 | + unsigned long flags; | ||
| 13067 | + | ||
| 13068 | + FN_ENTER; | ||
| 13069 | + /* disable radio Tx/Rx. Shouldn't we use the firmware commands | ||
| 13070 | + * here instead? Or are we that much down the road that it's no | ||
| 13071 | + * longer possible here? */ | ||
| 13072 | + /* | ||
| 13073 | + * slave memory interface really doesn't like this. | ||
| 13074 | + */ | ||
| 13075 | + /* | ||
| 13076 | + write_reg16(adev, IO_ACX_ENABLE, 0); | ||
| 13077 | + */ | ||
| 13078 | + | ||
| 13079 | + acx_s_msleep(100); | ||
| 13080 | + | ||
| 13081 | + acx_lock(adev, flags); | ||
| 13082 | + acxmem_free_desc_queues(adev); | ||
| 13083 | + acx_unlock(adev, flags); | ||
| 13084 | + | ||
| 13085 | + FN_EXIT0; | ||
| 13086 | +} | ||
| 13087 | + | ||
| 13088 | + | ||
| 13089 | +/*********************************************************************** | ||
| 13090 | +** acxmem_e_probe | ||
| 13091 | +** | ||
| 13092 | +** Probe routine called when a PCI device w/ matching ID is found. | ||
| 13093 | +** Here's the sequence: | ||
| 13094 | +** - Allocate the PCI resources. | ||
| 13095 | +** - Read the PCMCIA attribute memory to make sure we have a WLAN card | ||
| 13096 | +** - Reset the MAC | ||
| 13097 | +** - Initialize the dev and wlan data | ||
| 13098 | +** - Initialize the MAC | ||
| 13099 | +** | ||
| 13100 | +** pdev - ptr to pci device structure containing info about pci configuration | ||
| 13101 | +** id - ptr to the device id entry that matched this device | ||
| 13102 | +*/ | ||
| 13103 | +static const u16 | ||
| 13104 | +IO_ACX100[] = | ||
| 13105 | +{ | ||
| 13106 | + 0x0000, /* IO_ACX_SOFT_RESET */ | ||
| 13107 | + | ||
| 13108 | + 0x0014, /* IO_ACX_SLV_MEM_ADDR */ | ||
| 13109 | + 0x0018, /* IO_ACX_SLV_MEM_DATA */ | ||
| 13110 | + 0x001c, /* IO_ACX_SLV_MEM_CTL */ | ||
| 13111 | + 0x0020, /* IO_ACX_SLV_END_CTL */ | ||
| 13112 | + | ||
| 13113 | + 0x0034, /* IO_ACX_FEMR */ | ||
| 13114 | + | ||
| 13115 | + 0x007c, /* IO_ACX_INT_TRIG */ | ||
| 13116 | + 0x0098, /* IO_ACX_IRQ_MASK */ | ||
| 13117 | + 0x00a4, /* IO_ACX_IRQ_STATUS_NON_DES */ | ||
| 13118 | + 0x00a8, /* IO_ACX_IRQ_STATUS_CLEAR */ | ||
| 13119 | + 0x00ac, /* IO_ACX_IRQ_ACK */ | ||
| 13120 | + 0x00b0, /* IO_ACX_HINT_TRIG */ | ||
| 13121 | + | ||
| 13122 | + 0x0104, /* IO_ACX_ENABLE */ | ||
| 13123 | + | ||
| 13124 | + 0x0250, /* IO_ACX_EEPROM_CTL */ | ||
| 13125 | + 0x0254, /* IO_ACX_EEPROM_ADDR */ | ||
| 13126 | + 0x0258, /* IO_ACX_EEPROM_DATA */ | ||
| 13127 | + 0x025c, /* IO_ACX_EEPROM_CFG */ | ||
| 13128 | + | ||
| 13129 | + 0x0268, /* IO_ACX_PHY_ADDR */ | ||
| 13130 | + 0x026c, /* IO_ACX_PHY_DATA */ | ||
| 13131 | + 0x0270, /* IO_ACX_PHY_CTL */ | ||
| 13132 | + | ||
| 13133 | + 0x0290, /* IO_ACX_GPIO_OE */ | ||
| 13134 | + | ||
| 13135 | + 0x0298, /* IO_ACX_GPIO_OUT */ | ||
| 13136 | + | ||
| 13137 | + 0x02a4, /* IO_ACX_CMD_MAILBOX_OFFS */ | ||
| 13138 | + 0x02a8, /* IO_ACX_INFO_MAILBOX_OFFS */ | ||
| 13139 | + 0x02ac, /* IO_ACX_EEPROM_INFORMATION */ | ||
| 13140 | + | ||
| 13141 | + 0x02d0, /* IO_ACX_EE_START */ | ||
| 13142 | + 0x02d4, /* IO_ACX_SOR_CFG */ | ||
| 13143 | + 0x02d8 /* IO_ACX_ECPU_CTRL */ | ||
| 13144 | +}; | ||
| 13145 | + | ||
| 13146 | +static const u16 | ||
| 13147 | +IO_ACX111[] = | ||
| 13148 | +{ | ||
| 13149 | + 0x0000, /* IO_ACX_SOFT_RESET */ | ||
| 13150 | + | ||
| 13151 | + 0x0014, /* IO_ACX_SLV_MEM_ADDR */ | ||
| 13152 | + 0x0018, /* IO_ACX_SLV_MEM_DATA */ | ||
| 13153 | + 0x001c, /* IO_ACX_SLV_MEM_CTL */ | ||
| 13154 | + 0x0020, /* IO_ACX_SLV_MEM_CP */ | ||
| 13155 | + | ||
| 13156 | + 0x0034, /* IO_ACX_FEMR */ | ||
| 13157 | + | ||
| 13158 | + 0x00b4, /* IO_ACX_INT_TRIG */ | ||
| 13159 | + 0x00d4, /* IO_ACX_IRQ_MASK */ | ||
| 13160 | + /* we do mean NON_DES (0xf0), not NON_DES_MASK which is at 0xe0: */ | ||
| 13161 | + 0x00f0, /* IO_ACX_IRQ_STATUS_NON_DES */ | ||
| 13162 | + 0x00e4, /* IO_ACX_IRQ_STATUS_CLEAR */ | ||
| 13163 | + 0x00e8, /* IO_ACX_IRQ_ACK */ | ||
| 13164 | + 0x00ec, /* IO_ACX_HINT_TRIG */ | ||
| 13165 | + | ||
| 13166 | + 0x01d0, /* IO_ACX_ENABLE */ | ||
| 13167 | + | ||
| 13168 | + 0x0338, /* IO_ACX_EEPROM_CTL */ | ||
| 13169 | + 0x033c, /* IO_ACX_EEPROM_ADDR */ | ||
| 13170 | + 0x0340, /* IO_ACX_EEPROM_DATA */ | ||
| 13171 | + 0x0344, /* IO_ACX_EEPROM_CFG */ | ||
| 13172 | + | ||
| 13173 | + 0x0350, /* IO_ACX_PHY_ADDR */ | ||
| 13174 | + 0x0354, /* IO_ACX_PHY_DATA */ | ||
| 13175 | + 0x0358, /* IO_ACX_PHY_CTL */ | ||
| 13176 | + | ||
| 13177 | + 0x0374, /* IO_ACX_GPIO_OE */ | ||
| 13178 | + | ||
| 13179 | + 0x037c, /* IO_ACX_GPIO_OUT */ | ||
| 13180 | + | ||
| 13181 | + 0x0388, /* IO_ACX_CMD_MAILBOX_OFFS */ | ||
| 13182 | + 0x038c, /* IO_ACX_INFO_MAILBOX_OFFS */ | ||
| 13183 | + 0x0390, /* IO_ACX_EEPROM_INFORMATION */ | ||
| 13184 | + | ||
| 13185 | + 0x0100, /* IO_ACX_EE_START */ | ||
| 13186 | + 0x0104, /* IO_ACX_SOR_CFG */ | ||
| 13187 | + 0x0108, /* IO_ACX_ECPU_CTRL */ | ||
| 13188 | +}; | ||
| 13189 | + | ||
| 13190 | +static void | ||
| 13191 | +dummy_netdev_init(struct net_device *ndev) {} | ||
| 13192 | + | ||
| 13193 | +/* | ||
| 13194 | + * Most of the acx specific pieces of hardware reset. | ||
| 13195 | + */ | ||
| 13196 | +static int | ||
| 13197 | +acxmem_complete_hw_reset (acx_device_t *adev) | ||
| 13198 | +{ | ||
| 13199 | + acx111_ie_configoption_t co; | ||
| 13200 | + | ||
| 13201 | + /* NB: read_reg() reads may return bogus data before reset_dev(), | ||
| 13202 | + * since the firmware which directly controls large parts of the I/O | ||
| 13203 | + * registers isn't initialized yet. | ||
| 13204 | + * acx100 seems to be more affected than acx111 */ | ||
| 13205 | + if (OK != acxmem_s_reset_dev (adev)) | ||
| 13206 | + return -1; | ||
| 13207 | + | ||
| 13208 | + if (IS_ACX100(adev)) { | ||
| 13209 | + /* ACX100: configopt struct in cmd mailbox - directly after reset */ | ||
| 13210 | + copy_from_slavemem (adev, (u8*) &co, (u32) adev->cmd_area, sizeof (co)); | ||
| 13211 | + } | ||
| 13212 | + | ||
| 13213 | + if (OK != acx_s_init_mac(adev)) | ||
| 13214 | + return -3; | ||
| 13215 | + | ||
| 13216 | + if (IS_ACX111(adev)) { | ||
| 13217 | + /* ACX111: configopt struct needs to be queried after full init */ | ||
| 13218 | + acx_s_interrogate(adev, &co, ACX111_IE_CONFIG_OPTIONS); | ||
| 13219 | + } | ||
| 13220 | + | ||
| 13221 | + /* | ||
| 13222 | + * Set up transmit buffer administration | ||
| 13223 | + */ | ||
| 13224 | + init_acx_txbuf (adev); | ||
| 13225 | + | ||
| 13226 | + /* | ||
| 13227 | + * Windows driver writes 0x01000000 to register 0x288, RADIO_CTL, if the form factor | ||
| 13228 | + * is 3. It also write protects the EEPROM by writing 1<<9 to GPIO_OUT | ||
| 13229 | + */ | ||
| 13230 | + if (adev->form_factor == 3) { | ||
| 13231 | + set_regbits (adev, 0x288, 0x01000000); | ||
| 13232 | + set_regbits (adev, 0x298, 1<<9); | ||
| 13233 | + } | ||
| 13234 | + | ||
| 13235 | +/* TODO: merge them into one function, they are called just once and are the same for pci & usb */ | ||
| 13236 | + if (OK != acxmem_read_eeprom_byte(adev, 0x05, &adev->eeprom_version)) | ||
| 13237 | + return -2; | ||
| 13238 | + | ||
| 13239 | + acx_s_parse_configoption(adev, &co); | ||
| 13240 | + acx_s_get_firmware_version(adev); /* needs to be after acx_s_init_mac() */ | ||
| 13241 | + acx_display_hardware_details(adev); | ||
| 13242 | + | ||
| 13243 | + return 0; | ||
| 13244 | +} | ||
| 13245 | + | ||
| 13246 | +static int acx_init_netdev(struct net_device *ndev, struct device *dev, int base_addr, int addr_size, int irq) | ||
| 13247 | +{ | ||
| 13248 | + const char *chip_name; | ||
| 13249 | + int result = -EIO; | ||
| 13250 | + int err; | ||
| 13251 | + u8 chip_type; | ||
| 13252 | + acx_device_t *adev = NULL; | ||
| 13253 | + | ||
| 13254 | + FN_ENTER; | ||
| 13255 | + | ||
| 13256 | + /* FIXME: prism54 calls pci_set_mwi() here, | ||
| 13257 | + * should we do/support the same? */ | ||
| 13258 | + | ||
| 13259 | + /* chiptype is u8 but id->driver_data is ulong | ||
| 13260 | + ** Works for now (possible values are 1 and 2) */ | ||
| 13261 | + chip_type = CHIPTYPE_ACX100; | ||
| 13262 | + /* acx100 and acx111 have different PCI memory regions */ | ||
| 13263 | + if (chip_type == CHIPTYPE_ACX100) { | ||
| 13264 | + chip_name = "ACX100"; | ||
| 13265 | + } else if (chip_type == CHIPTYPE_ACX111) { | ||
| 13266 | + chip_name = "ACX111"; | ||
| 13267 | + } else { | ||
| 13268 | + printk("acx: unknown chip type 0x%04X\n", chip_type); | ||
| 13269 | + goto fail_unknown_chiptype; | ||
| 13270 | + } | ||
| 13271 | + | ||
| 13272 | + printk("acx: found %s-based wireless network card\n", chip_name); | ||
| 13273 | + log(L_ANY, "initial debug setting is 0x%04X\n", acx_debug); | ||
| 13274 | + | ||
| 13275 | + | ||
| 13276 | + dev_set_drvdata(dev, ndev); | ||
| 13277 | + | ||
| 13278 | + ether_setup(ndev); | ||
| 13279 | + | ||
| 13280 | + ndev->irq = irq; | ||
| 13281 | + | ||
| 13282 | + ndev->base_addr = base_addr; | ||
| 13283 | +printk (KERN_INFO "memwinbase=%lx memwinsize=%u\n",memwin.Base,memwin.Size); | ||
| 13284 | + if (addr_size == 0 || ndev->irq == 0) | ||
| 13285 | + goto fail_hw_params; | ||
| 13286 | + ndev->open = &acxmem_e_open; | ||
| 13287 | + ndev->stop = &acxmem_e_close; | ||
| 13288 | + //pdev->dev.release = &acxmem_e_release; | ||
| 13289 | + ndev->hard_start_xmit = &acx_i_start_xmit; | ||
| 13290 | + ndev->get_stats = &acx_e_get_stats; | ||
| 13291 | +#if IW_HANDLER_VERSION <= 5 | ||
| 13292 | + ndev->get_wireless_stats = &acx_e_get_wireless_stats; | ||
| 13293 | +#endif | ||
| 13294 | + ndev->wireless_handlers = (struct iw_handler_def *)&acx_ioctl_handler_def; | ||
| 13295 | + ndev->set_multicast_list = &acxmem_i_set_multicast_list; | ||
| 13296 | + ndev->tx_timeout = &acxmem_i_tx_timeout; | ||
| 13297 | + ndev->change_mtu = &acx_e_change_mtu; | ||
| 13298 | + ndev->watchdog_timeo = 4 * HZ; | ||
| 13299 | + | ||
| 13300 | + adev = ndev2adev(ndev); | ||
| 13301 | + spin_lock_init(&adev->lock); /* initial state: unlocked */ | ||
| 13302 | + spin_lock_init(&adev->txbuf_lock); | ||
| 13303 | + /* We do not start with downed sem: we want PARANOID_LOCKING to work */ | ||
| 13304 | + sema_init(&adev->sem, 1); /* initial state: 1 (upped) */ | ||
| 13305 | + /* since nobody can see new netdev yet, we can as well | ||
| 13306 | + ** just _presume_ that we're under sem (instead of actually taking it): */ | ||
| 13307 | + /* acx_sem_lock(adev); */ | ||
| 13308 | + adev->dev = dev; | ||
| 13309 | + adev->ndev = ndev; | ||
| 13310 | + adev->dev_type = DEVTYPE_MEM; | ||
| 13311 | + adev->chip_type = chip_type; | ||
| 13312 | + adev->chip_name = chip_name; | ||
| 13313 | + adev->io = (CHIPTYPE_ACX100 == chip_type) ? IO_ACX100 : IO_ACX111; | ||
| 13314 | + adev->membase = (volatile u32 *) ndev->base_addr; | ||
| 13315 | + adev->iobase = (volatile u32 *) ioremap_nocache (ndev->base_addr, addr_size); | ||
| 13316 | + /* to find crashes due to weird driver access | ||
| 13317 | + * to unconfigured interface (ifup) */ | ||
| 13318 | + adev->mgmt_timer.function = (void (*)(unsigned long))0x0000dead; | ||
| 13319 | + | ||
| 13320 | +#if defined(NONESSENTIAL_FEATURES) | ||
| 13321 | + acx_show_card_eeprom_id(adev); | ||
| 13322 | +#endif /* NONESSENTIAL_FEATURES */ | ||
| 13323 | + | ||
| 13324 | +#ifdef SET_MODULE_OWNER | ||
| 13325 | + SET_MODULE_OWNER(ndev); | ||
| 13326 | +#endif | ||
| 13327 | + // need to fix that @@ | ||
| 13328 | + SET_NETDEV_DEV(ndev, dev); | ||
| 13329 | + | ||
| 13330 | + log(L_IRQ|L_INIT, "using IRQ %d\n", ndev->irq); | ||
| 13331 | + | ||
| 13332 | + /* ok, pci setup is finished, now start initializing the card */ | ||
| 13333 | + | ||
| 13334 | + if (OK != acxmem_complete_hw_reset (adev)) | ||
| 13335 | + goto fail_reset; | ||
| 13336 | + | ||
| 13337 | + /* | ||
| 13338 | + * Set up default things for most of the card settings. | ||
| 13339 | + */ | ||
| 13340 | + acx_s_set_defaults(adev); | ||
| 13341 | + | ||
| 13342 | + /* Register the card, AFTER everything else has been set up, | ||
| 13343 | + * since otherwise an ioctl could step on our feet due to | ||
| 13344 | + * firmware operations happening in parallel or uninitialized data */ | ||
| 13345 | + err = register_netdev(ndev); | ||
| 13346 | + if (OK != err) { | ||
| 13347 | + printk("acx: register_netdev() FAILED: %d\n", err); | ||
| 13348 | + goto fail_register_netdev; | ||
| 13349 | + } | ||
| 13350 | + | ||
| 13351 | + acx_proc_register_entries(ndev); | ||
| 13352 | + | ||
| 13353 | + /* Now we have our device, so make sure the kernel doesn't try | ||
| 13354 | + * to send packets even though we're not associated to a network yet */ | ||
| 13355 | + acx_stop_queue(ndev, "on probe"); | ||
| 13356 | + acx_carrier_off(ndev, "on probe"); | ||
| 13357 | + | ||
| 13358 | + /* | ||
| 13359 | + * Set up a default monitor type so that poor combinations of initialization | ||
| 13360 | + * sequences in monitor mode don't end up destroying the hardware type. | ||
| 13361 | + */ | ||
| 13362 | + adev->monitor_type = ARPHRD_ETHER; | ||
| 13363 | + | ||
| 13364 | + /* | ||
| 13365 | + * Register to receive inetaddr notifier changes. This will allow us to | ||
| 13366 | + * catch if the user changes the MAC address of the interface. | ||
| 13367 | + */ | ||
| 13368 | + register_netdevice_notifier(&acx_netdev_notifier); | ||
| 13369 | + | ||
| 13370 | + /* after register_netdev() userspace may start working with dev | ||
| 13371 | + * (in particular, on other CPUs), we only need to up the sem */ | ||
| 13372 | + /* acx_sem_unlock(adev); */ | ||
| 13373 | + | ||
| 13374 | + printk("acx "ACX_RELEASE": net device %s, driver compiled " | ||
| 13375 | + "against wireless extensions %d and Linux %s\n", | ||
| 13376 | + ndev->name, WIRELESS_EXT, UTS_RELEASE); | ||
| 13377 | + | ||
| 13378 | +#if CMD_DISCOVERY | ||
| 13379 | + great_inquisitor(adev); | ||
| 13380 | +#endif | ||
| 13381 | + | ||
| 13382 | + result = OK; | ||
| 13383 | + goto done; | ||
| 13384 | + | ||
| 13385 | + /* error paths: undo everything in reverse order... */ | ||
| 13386 | + | ||
| 13387 | +fail_register_netdev: | ||
| 13388 | + | ||
| 13389 | + acxmem_s_delete_dma_regions(adev); | ||
| 13390 | + | ||
| 13391 | +fail_reset: | ||
| 13392 | +fail_hw_params: | ||
| 13393 | + free_netdev(ndev); | ||
| 13394 | +fail_unknown_chiptype: | ||
| 13395 | + | ||
| 13396 | + | ||
| 13397 | +done: | ||
| 13398 | + FN_EXIT1(result); | ||
| 13399 | + return result; | ||
| 13400 | +} | ||
| 13401 | + | ||
| 13402 | + | ||
| 13403 | +/*********************************************************************** | ||
| 13404 | +** acxmem_e_remove | ||
| 13405 | +** | ||
| 13406 | +** Shut device down (if not hot unplugged) | ||
| 13407 | +** and deallocate PCI resources for the acx chip. | ||
| 13408 | +** | ||
| 13409 | +** pdev - ptr to PCI device structure containing info about pci configuration | ||
| 13410 | +*/ | ||
| 13411 | +static int __devexit | ||
| 13412 | +acxmem_e_remove(struct pcmcia_device *link) | ||
| 13413 | +{ | ||
| 13414 | + struct net_device *ndev; | ||
| 13415 | + acx_device_t *adev; | ||
| 13416 | + unsigned long flags; | ||
| 13417 | + | ||
| 13418 | + FN_ENTER; | ||
| 13419 | + | ||
| 13420 | + ndev = ((local_info_t*)link->priv)->ndev; | ||
| 13421 | + if (!ndev) { | ||
| 13422 | + log(L_DEBUG, "%s: card is unused. Skipping any release code\n", | ||
| 13423 | + __func__); | ||
| 13424 | + goto end; | ||
| 13425 | + } | ||
| 13426 | + | ||
| 13427 | + adev = ndev2adev(ndev); | ||
| 13428 | + | ||
| 13429 | + /* If device wasn't hot unplugged... */ | ||
| 13430 | + if (adev_present(adev)) { | ||
| 13431 | + | ||
| 13432 | + acx_sem_lock(adev); | ||
| 13433 | + | ||
| 13434 | + /* disable both Tx and Rx to shut radio down properly */ | ||
| 13435 | + acx_s_issue_cmd(adev, ACX1xx_CMD_DISABLE_TX, NULL, 0); | ||
| 13436 | + acx_s_issue_cmd(adev, ACX1xx_CMD_DISABLE_RX, NULL, 0); | ||
| 13437 | + | ||
| 13438 | +#ifdef REDUNDANT | ||
| 13439 | + /* put the eCPU to sleep to save power | ||
| 13440 | + * Halting is not possible currently, | ||
| 13441 | + * since not supported by all firmware versions */ | ||
| 13442 | + acx_s_issue_cmd(adev, ACX100_CMD_SLEEP, NULL, 0); | ||
| 13443 | +#endif | ||
| 13444 | + acx_lock(adev, flags); | ||
| 13445 | + | ||
| 13446 | + /* disable power LED to save power :-) */ | ||
| 13447 | + log(L_INIT, "switching off power LED to save power\n"); | ||
| 13448 | + acxmem_l_power_led(adev, 0); | ||
| 13449 | + | ||
| 13450 | + /* stop our eCPU */ | ||
| 13451 | + if (IS_ACX111(adev)) { | ||
| 13452 | + /* FIXME: does this actually keep halting the eCPU? | ||
| 13453 | + * I don't think so... | ||
| 13454 | + */ | ||
| 13455 | + acxmem_l_reset_mac(adev); | ||
| 13456 | + } else { | ||
| 13457 | + u16 temp; | ||
| 13458 | + | ||
| 13459 | + /* halt eCPU */ | ||
| 13460 | + temp = read_reg16(adev, IO_ACX_ECPU_CTRL) | 0x1; | ||
| 13461 | + write_reg16(adev, IO_ACX_ECPU_CTRL, temp); | ||
| 13462 | + write_flush(adev); | ||
| 13463 | + } | ||
| 13464 | + | ||
| 13465 | + acx_unlock(adev, flags); | ||
| 13466 | + | ||
| 13467 | + acx_sem_unlock(adev); | ||
| 13468 | + } | ||
| 13469 | + | ||
| 13470 | + | ||
| 13471 | + /* | ||
| 13472 | + * Unregister the notifier chain | ||
| 13473 | + */ | ||
| 13474 | + unregister_netdevice_notifier(&acx_netdev_notifier); | ||
| 13475 | + | ||
| 13476 | + /* unregister the device to not let the kernel | ||
| 13477 | + * (e.g. ioctls) access a half-deconfigured device | ||
| 13478 | + * NB: this will cause acxmem_e_close() to be called, | ||
| 13479 | + * thus we shouldn't call it under sem! */ | ||
| 13480 | + log(L_INIT, "removing device %s\n", ndev->name); | ||
| 13481 | + unregister_netdev(ndev); | ||
| 13482 | + | ||
| 13483 | + /* unregister_netdev ensures that no references to us left. | ||
| 13484 | + * For paranoid reasons we continue to follow the rules */ | ||
| 13485 | + acx_sem_lock(adev); | ||
| 13486 | + | ||
| 13487 | + if (adev->dev_state_mask & ACX_STATE_IFACE_UP) { | ||
| 13488 | + acxmem_s_down(ndev); | ||
| 13489 | + CLEAR_BIT(adev->dev_state_mask, ACX_STATE_IFACE_UP); | ||
| 13490 | + } | ||
| 13491 | + | ||
| 13492 | + acx_proc_unregister_entries(ndev); | ||
| 13493 | + | ||
| 13494 | + acxmem_s_delete_dma_regions(adev); | ||
| 13495 | + | ||
| 13496 | + /* finally, clean up PCI bus state */ | ||
| 13497 | + if (adev->iobase) iounmap((void *)adev->iobase); | ||
| 13498 | + | ||
| 13499 | + acx_sem_unlock(adev); | ||
| 13500 | + | ||
| 13501 | + /* Free netdev (quite late, | ||
| 13502 | + * since otherwise we might get caught off-guard | ||
| 13503 | + * by a netdev timeout handler execution | ||
| 13504 | + * expecting to see a working dev...) */ | ||
| 13505 | + free_netdev(ndev); | ||
| 13506 | + | ||
| 13507 | + printk ("e_remove done\n"); | ||
| 13508 | +end: | ||
| 13509 | + FN_EXIT0; | ||
| 13510 | + | ||
| 13511 | + return 0; | ||
| 13512 | +} | ||
| 13513 | + | ||
| 13514 | + | ||
| 13515 | +/*********************************************************************** | ||
| 13516 | +** TODO: PM code needs to be fixed / debugged / tested. | ||
| 13517 | +*/ | ||
| 13518 | +#ifdef CONFIG_PM | ||
| 13519 | +static int | ||
| 13520 | +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 11) | ||
| 13521 | +acxmem_e_suspend( struct net_device *ndev, pm_message_t state) | ||
| 13522 | +#else | ||
| 13523 | +acxmem_e_suspend( struct net_device *ndev, u32 state) | ||
| 13524 | +#endif | ||
| 13525 | +{ | ||
| 13526 | + FN_ENTER; | ||
| 13527 | + acx_device_t *adev; | ||
| 13528 | + printk("acx: suspend handler is experimental!\n"); | ||
| 13529 | + printk("sus: dev %p\n", ndev); | ||
| 13530 | + | ||
| 13531 | + if (!netif_running(ndev)) | ||
| 13532 | + goto end; | ||
| 13533 | + // @@ need to get it from link or something like that | ||
| 13534 | + adev = ndev2adev(ndev); | ||
| 13535 | + printk("sus: adev %p\n", adev); | ||
| 13536 | + | ||
| 13537 | + acx_sem_lock(adev); | ||
| 13538 | + | ||
| 13539 | + netif_device_detach(adev->ndev); /* this one cannot sleep */ | ||
| 13540 | + acxmem_s_down(adev->ndev); | ||
| 13541 | + /* down() does not set it to 0xffff, but here we really want that */ | ||
| 13542 | + write_reg16(adev, IO_ACX_IRQ_MASK, 0xffff); | ||
| 13543 | + write_reg16(adev, IO_ACX_FEMR, 0x0); | ||
| 13544 | + acxmem_s_delete_dma_regions(adev); | ||
| 13545 | + | ||
| 13546 | + /* | ||
| 13547 | + * Turn the ACX chip off. | ||
| 13548 | + */ | ||
| 13549 | + | ||
| 13550 | + acx_sem_unlock(adev); | ||
| 13551 | +end: | ||
| 13552 | + FN_EXIT0; | ||
| 13553 | + return OK; | ||
| 13554 | +} | ||
| 13555 | + | ||
| 13556 | + | ||
| 13557 | +static void | ||
| 13558 | +fw_resumer(struct work_struct *notused) | ||
| 13559 | +{ | ||
| 13560 | + acx_device_t *adev; | ||
| 13561 | + struct net_device *ndev = resume_ndev; | ||
| 13562 | + | ||
| 13563 | + printk("acx: resume handler is experimental!\n"); | ||
| 13564 | + printk("rsm: got dev %p\n", ndev); | ||
| 13565 | + | ||
| 13566 | + if (!netif_running(ndev)) | ||
| 13567 | + return; | ||
| 13568 | + | ||
| 13569 | + adev = ndev2adev(ndev); | ||
| 13570 | + printk("rsm: got adev %p\n", adev); | ||
| 13571 | + | ||
| 13572 | + acx_sem_lock(adev); | ||
| 13573 | + | ||
| 13574 | + /* | ||
| 13575 | + * Turn on the ACX. | ||
| 13576 | + */ | ||
| 13577 | + | ||
| 13578 | + acxmem_complete_hw_reset (adev); | ||
| 13579 | + | ||
| 13580 | + /* | ||
| 13581 | + * done by acx_s_set_defaults for initial startup | ||
| 13582 | + */ | ||
| 13583 | + acxmem_set_interrupt_mask(adev); | ||
| 13584 | + | ||
| 13585 | + printk ("rsm: bringing up interface\n"); | ||
| 13586 | + SET_BIT (adev->set_mask, GETSET_ALL); | ||
| 13587 | + acxmem_s_up(ndev); | ||
| 13588 | + printk("rsm: acx up done\n"); | ||
| 13589 | + | ||
| 13590 | + /* now even reload all card parameters as they were before suspend, | ||
| 13591 | + * and possibly be back in the network again already :-) | ||
| 13592 | + */ | ||
| 13593 | + /* - most settings updated in acxmem_s_up() | ||
| 13594 | + if (ACX_STATE_IFACE_UP & adev->dev_state_mask) { | ||
| 13595 | + adev->set_mask = GETSET_ALL; | ||
| 13596 | + acx_s_update_card_settings(adev); | ||
| 13597 | + printk("rsm: settings updated\n"); | ||
| 13598 | + } | ||
| 13599 | + */ | ||
| 13600 | + netif_device_attach(ndev); | ||
| 13601 | + printk("rsm: device attached\n"); | ||
| 13602 | + | ||
| 13603 | + acx_sem_unlock(adev); | ||
| 13604 | +} | ||
| 13605 | + | ||
| 13606 | +DECLARE_WORK( fw_resume_work, fw_resumer ); | ||
| 13607 | + | ||
| 13608 | +static int | ||
| 13609 | +acxmem_e_resume(struct pcmcia_device *link) | ||
| 13610 | +{ | ||
| 13611 | + FN_ENTER; | ||
| 13612 | + | ||
| 13613 | + //resume_pdev = pdev; | ||
| 13614 | + schedule_work( &fw_resume_work ); | ||
| 13615 | + | ||
| 13616 | + FN_EXIT0; | ||
| 13617 | + return OK; | ||
| 13618 | +} | ||
| 13619 | +#endif /* CONFIG_PM */ | ||
| 13620 | + | ||
| 13621 | + | ||
| 13622 | +/*********************************************************************** | ||
| 13623 | +** acxmem_s_up | ||
| 13624 | +** | ||
| 13625 | +** This function is called by acxmem_e_open (when ifconfig sets the device as up) | ||
| 13626 | +** | ||
| 13627 | +** Side effects: | ||
| 13628 | +** - Enables on-card interrupt requests | ||
| 13629 | +** - calls acx_s_start | ||
| 13630 | +*/ | ||
| 13631 | + | ||
| 13632 | +static void | ||
| 13633 | +enable_acx_irq(acx_device_t *adev) | ||
| 13634 | +{ | ||
| 13635 | + FN_ENTER; | ||
| 13636 | + write_reg16(adev, IO_ACX_IRQ_MASK, adev->irq_mask); | ||
| 13637 | + write_reg16(adev, IO_ACX_FEMR, 0x8000); | ||
| 13638 | + adev->irqs_active = 1; | ||
| 13639 | + FN_EXIT0; | ||
| 13640 | +} | ||
| 13641 | + | ||
| 13642 | +static void | ||
| 13643 | +acxmem_s_up(struct net_device *ndev) | ||
| 13644 | +{ | ||
| 13645 | + acx_device_t *adev = ndev2adev(ndev); | ||
| 13646 | + unsigned long flags; | ||
| 13647 | + | ||
| 13648 | + FN_ENTER; | ||
| 13649 | + | ||
| 13650 | + acx_lock(adev, flags); | ||
| 13651 | + enable_acx_irq(adev); | ||
| 13652 | + acx_unlock(adev, flags); | ||
| 13653 | + | ||
| 13654 | + /* acx fw < 1.9.3.e has a hardware timer, and older drivers | ||
| 13655 | + ** used to use it. But we don't do that anymore, our OS | ||
| 13656 | + ** has reliable software timers */ | ||
| 13657 | + init_timer(&adev->mgmt_timer); | ||
| 13658 | + adev->mgmt_timer.function = acx_i_timer; | ||
| 13659 | + adev->mgmt_timer.data = (unsigned long)adev; | ||
| 13660 | + | ||
| 13661 | + /* Need to set ACX_STATE_IFACE_UP first, or else | ||
| 13662 | + ** timer won't be started by acx_set_status() */ | ||
| 13663 | + SET_BIT(adev->dev_state_mask, ACX_STATE_IFACE_UP); | ||
| 13664 | + switch (adev->mode) { | ||
| 13665 | + case ACX_MODE_0_ADHOC: | ||
| 13666 | + case ACX_MODE_2_STA: | ||
| 13667 | + /* actual scan cmd will happen in start() */ | ||
| 13668 | + acx_set_status(adev, ACX_STATUS_1_SCANNING); break; | ||
| 13669 | + case ACX_MODE_3_AP: | ||
| 13670 | + case ACX_MODE_MONITOR: | ||
| 13671 | + acx_set_status(adev, ACX_STATUS_4_ASSOCIATED); break; | ||
| 13672 | + } | ||
| 13673 | + | ||
| 13674 | + acx_s_start(adev); | ||
| 13675 | + | ||
| 13676 | + FN_EXIT0; | ||
| 13677 | +} | ||
| 13678 | + | ||
| 13679 | + | ||
| 13680 | +/*********************************************************************** | ||
| 13681 | +** acxmem_s_down | ||
| 13682 | +** | ||
| 13683 | +** This disables the netdevice | ||
| 13684 | +** | ||
| 13685 | +** Side effects: | ||
| 13686 | +** - disables on-card interrupt request | ||
| 13687 | +*/ | ||
| 13688 | + | ||
| 13689 | +static void | ||
| 13690 | +disable_acx_irq(acx_device_t *adev) | ||
| 13691 | +{ | ||
| 13692 | + FN_ENTER; | ||
| 13693 | + | ||
| 13694 | + /* I guess mask is not 0xffff because acx100 won't signal | ||
| 13695 | + ** cmd completion then (needed for ifup). | ||
| 13696 | + ** Someone with acx100 please confirm */ | ||
| 13697 | + write_reg16(adev, IO_ACX_IRQ_MASK, adev->irq_mask_off); | ||
| 13698 | + write_reg16(adev, IO_ACX_FEMR, 0x0); | ||
| 13699 | + adev->irqs_active = 0; | ||
| 13700 | + FN_EXIT0; | ||
| 13701 | +} | ||
| 13702 | + | ||
| 13703 | +static void | ||
| 13704 | +acxmem_s_down(struct net_device *ndev) | ||
| 13705 | +{ | ||
| 13706 | + acx_device_t *adev = ndev2adev(ndev); | ||
| 13707 | + unsigned long flags; | ||
| 13708 | + | ||
| 13709 | + FN_ENTER; | ||
| 13710 | + | ||
| 13711 | + /* Disable IRQs first, so that IRQs cannot race with us */ | ||
| 13712 | + /* then wait until interrupts have finished executing on other CPUs */ | ||
| 13713 | + acx_lock(adev, flags); | ||
| 13714 | + disable_acx_irq(adev); | ||
| 13715 | + synchronize_irq(adev->pdev->irq); | ||
| 13716 | + acx_unlock(adev, flags); | ||
| 13717 | + | ||
| 13718 | + /* we really don't want to have an asynchronous tasklet disturb us | ||
| 13719 | + ** after something vital for its job has been shut down, so | ||
| 13720 | + ** end all remaining work now. | ||
| 13721 | + ** | ||
| 13722 | + ** NB: carrier_off (done by set_status below) would lead to | ||
| 13723 | + ** not yet fully understood deadlock in FLUSH_SCHEDULED_WORK(). | ||
| 13724 | + ** That's why we do FLUSH first. | ||
| 13725 | + ** | ||
| 13726 | + ** NB2: we have a bad locking bug here: FLUSH_SCHEDULED_WORK() | ||
| 13727 | + ** waits for acx_e_after_interrupt_task to complete if it is running | ||
| 13728 | + ** on another CPU, but acx_e_after_interrupt_task | ||
| 13729 | + ** will sleep on sem forever, because it is taken by us! | ||
| 13730 | + ** Work around that by temporary sem unlock. | ||
| 13731 | + ** This will fail miserably if we'll be hit by concurrent | ||
| 13732 | + ** iwconfig or something in between. TODO! */ | ||
| 13733 | + acx_sem_unlock(adev); | ||
| 13734 | + FLUSH_SCHEDULED_WORK(); | ||
| 13735 | + acx_sem_lock(adev); | ||
| 13736 | + | ||
| 13737 | + /* This is possible: | ||
| 13738 | + ** FLUSH_SCHEDULED_WORK -> acx_e_after_interrupt_task -> | ||
| 13739 | + ** -> set_status(ASSOCIATED) -> wake_queue() | ||
| 13740 | + ** That's why we stop queue _after_ FLUSH_SCHEDULED_WORK | ||
| 13741 | + ** lock/unlock is just paranoia, maybe not needed */ | ||
| 13742 | + acx_lock(adev, flags); | ||
| 13743 | + acx_stop_queue(ndev, "on ifdown"); | ||
| 13744 | + acx_set_status(adev, ACX_STATUS_0_STOPPED); | ||
| 13745 | + acx_unlock(adev, flags); | ||
| 13746 | + | ||
| 13747 | + /* kernel/timer.c says it's illegal to del_timer_sync() | ||
| 13748 | + ** a timer which restarts itself. We guarantee this cannot | ||
| 13749 | + ** ever happen because acx_i_timer() never does this if | ||
| 13750 | + ** status is ACX_STATUS_0_STOPPED */ | ||
| 13751 | + del_timer_sync(&adev->mgmt_timer); | ||
| 13752 | + | ||
| 13753 | + FN_EXIT0; | ||
| 13754 | +} | ||
| 13755 | + | ||
| 13756 | + | ||
| 13757 | +/*********************************************************************** | ||
| 13758 | +** acxmem_e_open | ||
| 13759 | +** | ||
| 13760 | +** Called as a result of SIOCSIFFLAGS ioctl changing the flags bit IFF_UP | ||
| 13761 | +** from clear to set. In other words: ifconfig up. | ||
| 13762 | +** | ||
| 13763 | +** Returns: | ||
| 13764 | +** 0 success | ||
| 13765 | +** >0 f/w reported error | ||
| 13766 | +** <0 driver reported error | ||
| 13767 | +*/ | ||
| 13768 | +static int | ||
| 13769 | +acxmem_e_open(struct net_device *ndev) | ||
| 13770 | +{ | ||
| 13771 | + acx_device_t *adev = ndev2adev(ndev); | ||
| 13772 | + int result = OK; | ||
| 13773 | + | ||
| 13774 | + FN_ENTER; | ||
| 13775 | + | ||
| 13776 | + acx_sem_lock(adev); | ||
| 13777 | + | ||
| 13778 | + acx_init_task_scheduler(adev); | ||
| 13779 | + | ||
| 13780 | +/* TODO: pci_set_power_state(pdev, PCI_D0); ? */ | ||
| 13781 | + | ||
| 13782 | +#if 0 | ||
| 13783 | + /* request shared IRQ handler */ | ||
| 13784 | + if (request_irq(ndev->irq, acxmem_i_interrupt, SA_INTERRUPT, ndev->name, ndev)) { | ||
| 13785 | + printk("%s: request_irq FAILED\n", ndev->name); | ||
| 13786 | + result = -EAGAIN; | ||
| 13787 | + goto done; | ||
| 13788 | + } | ||
| 13789 | + set_irq_type (ndev->irq, IRQT_FALLING); | ||
| 13790 | + log(L_DEBUG|L_IRQ, "request_irq %d successful\n", ndev->irq); | ||
| 13791 | +#endif | ||
| 13792 | + | ||
| 13793 | + /* ifup device */ | ||
| 13794 | + acxmem_s_up(ndev); | ||
| 13795 | + | ||
| 13796 | + /* We don't currently have to do anything else. | ||
| 13797 | + * The setup of the MAC should be subsequently completed via | ||
| 13798 | + * the mlme commands. | ||
| 13799 | + * Higher layers know we're ready from dev->start==1 and | ||
| 13800 | + * dev->tbusy==0. Our rx path knows to pass up received/ | ||
| 13801 | + * frames because of dev->flags&IFF_UP is true. | ||
| 13802 | + */ | ||
| 13803 | +done: | ||
| 13804 | + acx_sem_unlock(adev); | ||
| 13805 | + | ||
| 13806 | + FN_EXIT1(result); | ||
| 13807 | + return result; | ||
| 13808 | +} | ||
| 13809 | + | ||
| 13810 | + | ||
| 13811 | +/*********************************************************************** | ||
| 13812 | +** acxmem_e_close | ||
| 13813 | +** | ||
| 13814 | +** Called as a result of SIOCSIIFFLAGS ioctl changing the flags bit IFF_UP | ||
| 13815 | +** from set to clear. I.e. called by "ifconfig DEV down" | ||
| 13816 | +** | ||
| 13817 | +** Returns: | ||
| 13818 | +** 0 success | ||
| 13819 | +** >0 f/w reported error | ||
| 13820 | +** <0 driver reported error | ||
| 13821 | +*/ | ||
| 13822 | +static int | ||
| 13823 | +acxmem_e_close(struct net_device *ndev) | ||
| 13824 | +{ | ||
| 13825 | + acx_device_t *adev = ndev2adev(ndev); | ||
| 13826 | + | ||
| 13827 | + FN_ENTER; | ||
| 13828 | + | ||
| 13829 | + acx_sem_lock(adev); | ||
| 13830 | + | ||
| 13831 | + /* ifdown device */ | ||
| 13832 | + CLEAR_BIT(adev->dev_state_mask, ACX_STATE_IFACE_UP); | ||
| 13833 | + if (netif_device_present(ndev)) { | ||
| 13834 | + acxmem_s_down(ndev); | ||
| 13835 | + } | ||
| 13836 | + | ||
| 13837 | + /* disable all IRQs, release shared IRQ handler */ | ||
| 13838 | + write_reg16(adev, IO_ACX_IRQ_MASK, 0xffff); | ||
| 13839 | + write_reg16(adev, IO_ACX_FEMR, 0x0); | ||
| 13840 | + free_irq(ndev->irq, ndev); | ||
| 13841 | + | ||
| 13842 | +/* TODO: pci_set_power_state(pdev, PCI_D3hot); ? */ | ||
| 13843 | + | ||
| 13844 | + /* We currently don't have to do anything else. | ||
| 13845 | + * Higher layers know we're not ready from dev->start==0 and | ||
| 13846 | + * dev->tbusy==1. Our rx path knows to not pass up received | ||
| 13847 | + * frames because of dev->flags&IFF_UP is false. | ||
| 13848 | + */ | ||
| 13849 | + acx_sem_unlock(adev); | ||
| 13850 | + | ||
| 13851 | + log(L_INIT, "closed device\n"); | ||
| 13852 | + FN_EXIT0; | ||
| 13853 | + return OK; | ||
| 13854 | +} | ||
| 13855 | + | ||
| 13856 | + | ||
| 13857 | +/*********************************************************************** | ||
| 13858 | +** acxmem_i_tx_timeout | ||
| 13859 | +** | ||
| 13860 | +** Called from network core. Must not sleep! | ||
| 13861 | +*/ | ||
| 13862 | +static void | ||
| 13863 | +acxmem_i_tx_timeout(struct net_device *ndev) | ||
| 13864 | +{ | ||
| 13865 | + acx_device_t *adev = ndev2adev(ndev); | ||
| 13866 | + unsigned long flags; | ||
| 13867 | + unsigned int tx_num_cleaned; | ||
| 13868 | + | ||
| 13869 | + FN_ENTER; | ||
| 13870 | + | ||
| 13871 | + acx_lock(adev, flags); | ||
| 13872 | + | ||
| 13873 | + /* clean processed tx descs, they may have been completely full */ | ||
| 13874 | + tx_num_cleaned = acxmem_l_clean_txdesc(adev); | ||
| 13875 | + | ||
| 13876 | + /* nothing cleaned, yet (almost) no free buffers available? | ||
| 13877 | + * --> clean all tx descs, no matter which status!! | ||
| 13878 | + * Note that I strongly suspect that doing emergency cleaning | ||
| 13879 | + * may confuse the firmware. This is a last ditch effort to get | ||
| 13880 | + * ANYTHING to work again... | ||
| 13881 | + * | ||
| 13882 | + * TODO: it's best to simply reset & reinit hw from scratch... | ||
| 13883 | + */ | ||
| 13884 | + if ((adev->tx_free <= TX_EMERG_CLEAN) && (tx_num_cleaned == 0)) { | ||
| 13885 | + printk("%s: FAILED to free any of the many full tx buffers. " | ||
| 13886 | + "Switching to emergency freeing. " | ||
| 13887 | + "Please report!\n", ndev->name); | ||
| 13888 | + acxmem_l_clean_txdesc_emergency(adev); | ||
| 13889 | + } | ||
| 13890 | + | ||
| 13891 | + if (acx_queue_stopped(ndev) && (ACX_STATUS_4_ASSOCIATED == adev->status)) | ||
| 13892 | + acx_wake_queue(ndev, "after tx timeout"); | ||
| 13893 | + | ||
| 13894 | + /* stall may have happened due to radio drift, so recalib radio */ | ||
| 13895 | + acx_schedule_task(adev, ACX_AFTER_IRQ_CMD_RADIO_RECALIB); | ||
| 13896 | + | ||
| 13897 | + /* do unimportant work last */ | ||
| 13898 | + printk("%s: tx timeout!\n", ndev->name); | ||
| 13899 | + adev->stats.tx_errors++; | ||
| 13900 | + | ||
| 13901 | + acx_unlock(adev, flags); | ||
| 13902 | + | ||
| 13903 | + FN_EXIT0; | ||
| 13904 | +} | ||
| 13905 | + | ||
| 13906 | + | ||
| 13907 | +/*********************************************************************** | ||
| 13908 | +** acxmem_i_set_multicast_list | ||
| 13909 | +** FIXME: most likely needs refinement | ||
| 13910 | +*/ | ||
| 13911 | +static void | ||
| 13912 | +acxmem_i_set_multicast_list(struct net_device *ndev) | ||
| 13913 | +{ | ||
| 13914 | + acx_device_t *adev = ndev2adev(ndev); | ||
| 13915 | + unsigned long flags; | ||
| 13916 | + | ||
| 13917 | + FN_ENTER; | ||
| 13918 | + | ||
| 13919 | + acx_lock(adev, flags); | ||
| 13920 | + | ||
| 13921 | + /* firmwares don't have allmulti capability, | ||
| 13922 | + * so just use promiscuous mode instead in this case. */ | ||
| 13923 | + if (ndev->flags & (IFF_PROMISC|IFF_ALLMULTI)) { | ||
| 13924 | + SET_BIT(adev->rx_config_1, RX_CFG1_RCV_PROMISCUOUS); | ||
| 13925 | + CLEAR_BIT(adev->rx_config_1, RX_CFG1_FILTER_ALL_MULTI); | ||
| 13926 | + SET_BIT(adev->set_mask, SET_RXCONFIG); | ||
| 13927 | + /* let kernel know in case *we* needed to set promiscuous */ | ||
| 13928 | + ndev->flags |= (IFF_PROMISC|IFF_ALLMULTI); | ||
| 13929 | + } else { | ||
| 13930 | + CLEAR_BIT(adev->rx_config_1, RX_CFG1_RCV_PROMISCUOUS); | ||
| 13931 | + SET_BIT(adev->rx_config_1, RX_CFG1_FILTER_ALL_MULTI); | ||
| 13932 | + SET_BIT(adev->set_mask, SET_RXCONFIG); | ||
| 13933 | + ndev->flags &= ~(IFF_PROMISC|IFF_ALLMULTI); | ||
| 13934 | + } | ||
| 13935 | + | ||
| 13936 | + /* cannot update card settings directly here, atomic context */ | ||
| 13937 | + acx_schedule_task(adev, ACX_AFTER_IRQ_UPDATE_CARD_CFG); | ||
| 13938 | + | ||
| 13939 | + acx_unlock(adev, flags); | ||
| 13940 | + | ||
| 13941 | + FN_EXIT0; | ||
| 13942 | +} | ||
| 13943 | + | ||
| 13944 | + | ||
| 13945 | +/*************************************************************** | ||
| 13946 | +** acxmem_l_process_rxdesc | ||
| 13947 | +** | ||
| 13948 | +** Called directly and only from the IRQ handler | ||
| 13949 | +*/ | ||
| 13950 | + | ||
| 13951 | +#if !ACX_DEBUG | ||
| 13952 | +static inline void log_rxbuffer(const acx_device_t *adev) {} | ||
| 13953 | +#else | ||
| 13954 | +static void | ||
| 13955 | +log_rxbuffer(const acx_device_t *adev) | ||
| 13956 | +{ | ||
| 13957 | + register const struct rxhostdesc *rxhostdesc; | ||
| 13958 | + int i; | ||
| 13959 | + /* no FN_ENTER here, we don't want that */ | ||
| 13960 | + | ||
| 13961 | + rxhostdesc = adev->rxhostdesc_start; | ||
| 13962 | + if (unlikely(!rxhostdesc)) return; | ||
| 13963 | + for (i = 0; i < RX_CNT; i++) { | ||
| 13964 | + if ((rxhostdesc->Ctl_16 & cpu_to_le16(DESC_CTL_HOSTOWN)) | ||
| 13965 | + && (rxhostdesc->Status & cpu_to_le32(DESC_STATUS_FULL))) | ||
| 13966 | + printk("rx: buf %d full\n", i); | ||
| 13967 | + rxhostdesc++; | ||
| 13968 | + } | ||
| 13969 | +} | ||
| 13970 | +#endif | ||
| 13971 | + | ||
| 13972 | +static void | ||
| 13973 | +acxmem_l_process_rxdesc(acx_device_t *adev) | ||
| 13974 | +{ | ||
| 13975 | + register rxhostdesc_t *hostdesc; | ||
| 13976 | + register rxdesc_t *rxdesc; | ||
| 13977 | + unsigned count, tail; | ||
| 13978 | + u32 addr; | ||
| 13979 | + u8 Ctl_8; | ||
| 13980 | + | ||
| 13981 | + FN_ENTER; | ||
| 13982 | + | ||
| 13983 | + if (unlikely(acx_debug & L_BUFR)) | ||
| 13984 | + log_rxbuffer(adev); | ||
| 13985 | + | ||
| 13986 | + /* First, have a loop to determine the first descriptor that's | ||
| 13987 | + * full, just in case there's a mismatch between our current | ||
| 13988 | + * rx_tail and the full descriptor we're supposed to handle. */ | ||
| 13989 | + tail = adev->rx_tail; | ||
| 13990 | + count = RX_CNT; | ||
| 13991 | + while (1) { | ||
| 13992 | + hostdesc = &adev->rxhostdesc_start[tail]; | ||
| 13993 | + rxdesc = &adev->rxdesc_start[tail]; | ||
| 13994 | + /* advance tail regardless of outcome of the below test */ | ||
| 13995 | + tail = (tail + 1) % RX_CNT; | ||
| 13996 | + | ||
| 13997 | + /* | ||
| 13998 | + * Unlike the PCI interface, where the ACX can write directly to | ||
| 13999 | + * the host descriptors, on the slave memory interface we have to | ||
| 14000 | + * pull these. All we really need to do is check the Ctl_8 field | ||
| 14001 | + * in the rx descriptor on the ACX, which should be 0x11000000 if | ||
| 14002 | + * we should process it. | ||
| 14003 | + */ | ||
| 14004 | + Ctl_8 = hostdesc->Ctl_16 = read_slavemem8 (adev, (u32) &(rxdesc->Ctl_8)); | ||
| 14005 | + if ((Ctl_8 & DESC_CTL_HOSTOWN) && | ||
| 14006 | + (Ctl_8 & DESC_CTL_ACXDONE)) | ||
| 14007 | + break; /* found it! */ | ||
| 14008 | + | ||
| 14009 | + if (unlikely(!--count)) /* hmm, no luck: all descs empty, bail out */ | ||
| 14010 | + goto end; | ||
| 14011 | + } | ||
| 14012 | + | ||
| 14013 | + /* now process descriptors, starting with the first we figured out */ | ||
| 14014 | + while (1) { | ||
| 14015 | + log(L_BUFR, "rx: tail=%u Ctl_8=%02X\n", tail, Ctl_8); | ||
| 14016 | + /* | ||
| 14017 | + * If the ACX has CTL_RECLAIM set on this descriptor there | ||
| 14018 | + * is no buffer associated; it just wants us to tell it to | ||
| 14019 | + * reclaim the memory. | ||
| 14020 | + */ | ||
| 14021 | + if (!(Ctl_8 & DESC_CTL_RECLAIM)) { | ||
| 14022 | + | ||
| 14023 | + /* | ||
| 14024 | + * slave interface - pull data now | ||
| 14025 | + */ | ||
| 14026 | + hostdesc->length = read_slavemem16 (adev, (u32) &(rxdesc->total_length)); | ||
| 14027 | + | ||
| 14028 | + /* | ||
| 14029 | + * hostdesc->data is an rxbuffer_t, which includes header information, | ||
| 14030 | + * but the length in the data packet doesn't. The header information | ||
| 14031 | + * takes up an additional 12 bytes, so add that to the length we copy. | ||
| 14032 | + */ | ||
| 14033 | + addr = read_slavemem32 (adev, (u32) &(rxdesc->ACXMemPtr)); | ||
| 14034 | + if (addr) { | ||
| 14035 | + /* | ||
| 14036 | + * How can &(rxdesc->ACXMemPtr) above ever be zero? Looks like we | ||
| 14037 | + * get that now and then - try to trap it for debug. | ||
| 14038 | + */ | ||
| 14039 | + if (addr & 0xffff0000) { | ||
| 14040 | + printk("rxdesc 0x%08x\n", (u32) rxdesc); | ||
| 14041 | + dump_acxmem (adev, 0, 0x10000); | ||
| 14042 | + panic ("Bad access!"); | ||
| 14043 | + } | ||
| 14044 | + chaincopy_from_slavemem (adev, (u8 *) hostdesc->data, addr, | ||
| 14045 | + hostdesc->length + | ||
| 14046 | + (u32) &((rxbuffer_t *)0)->hdr_a3); | ||
| 14047 | + acx_l_process_rxbuf(adev, hostdesc->data); | ||
| 14048 | + } | ||
| 14049 | + } | ||
| 14050 | + else { | ||
| 14051 | + printk ("rx reclaim only!\n"); | ||
| 14052 | + } | ||
| 14053 | + | ||
| 14054 | + hostdesc->Status = 0; | ||
| 14055 | + | ||
| 14056 | + /* | ||
| 14057 | + * Let the ACX know we're done. | ||
| 14058 | + */ | ||
| 14059 | + CLEAR_BIT (Ctl_8, DESC_CTL_HOSTOWN); | ||
| 14060 | + SET_BIT (Ctl_8, DESC_CTL_HOSTDONE); | ||
| 14061 | + SET_BIT (Ctl_8, DESC_CTL_RECLAIM); | ||
| 14062 | + write_slavemem8 (adev, (u32) &rxdesc->Ctl_8, Ctl_8); | ||
| 14063 | + | ||
| 14064 | + /* | ||
| 14065 | + * Now tell the ACX we've finished with the receive buffer so | ||
| 14066 | + * it can finish the reclaim. | ||
| 14067 | + */ | ||
| 14068 | + write_reg16 (adev, IO_ACX_INT_TRIG, INT_TRIG_RXPRC); | ||
| 14069 | + | ||
| 14070 | + /* ok, descriptor is handled, now check the next descriptor */ | ||
| 14071 | + hostdesc = &adev->rxhostdesc_start[tail]; | ||
| 14072 | + rxdesc = &adev->rxdesc_start[tail]; | ||
| 14073 | + | ||
| 14074 | + Ctl_8 = hostdesc->Ctl_16 = read_slavemem8 (adev, (u32) &(rxdesc->Ctl_8)); | ||
| 14075 | + | ||
| 14076 | + /* if next descriptor is empty, then bail out */ | ||
| 14077 | + if (!(Ctl_8 & DESC_CTL_HOSTOWN) || !(Ctl_8 & DESC_CTL_ACXDONE)) | ||
| 14078 | + break; | ||
| 14079 | + | ||
| 14080 | + tail = (tail + 1) % RX_CNT; | ||
| 14081 | + } | ||
| 14082 | +end: | ||
| 14083 | + adev->rx_tail = tail; | ||
| 14084 | + FN_EXIT0; | ||
| 14085 | +} | ||
| 14086 | + | ||
| 14087 | + | ||
| 14088 | +/*********************************************************************** | ||
| 14089 | +** acxmem_i_interrupt | ||
| 14090 | +** | ||
| 14091 | +** IRQ handler (atomic context, must not sleep, blah, blah) | ||
| 14092 | +*/ | ||
| 14093 | + | ||
| 14094 | +/* scan is complete. all frames now on the receive queue are valid */ | ||
| 14095 | +#define INFO_SCAN_COMPLETE 0x0001 | ||
| 14096 | +#define INFO_WEP_KEY_NOT_FOUND 0x0002 | ||
| 14097 | +/* hw has been reset as the result of a watchdog timer timeout */ | ||
| 14098 | +#define INFO_WATCH_DOG_RESET 0x0003 | ||
| 14099 | +/* failed to send out NULL frame from PS mode notification to AP */ | ||
| 14100 | +/* recommended action: try entering 802.11 PS mode again */ | ||
| 14101 | +#define INFO_PS_FAIL 0x0004 | ||
| 14102 | +/* encryption/decryption process on a packet failed */ | ||
| 14103 | +#define INFO_IV_ICV_FAILURE 0x0005 | ||
| 14104 | + | ||
| 14105 | +/* Info mailbox format: | ||
| 14106 | +2 bytes: type | ||
| 14107 | +2 bytes: status | ||
| 14108 | +more bytes may follow | ||
| 14109 | + rumors say about status: | ||
| 14110 | + 0x0000 info available (set by hw) | ||
| 14111 | + 0x0001 information received (must be set by host) | ||
| 14112 | + 0x1000 info available, mailbox overflowed (messages lost) (set by hw) | ||
| 14113 | + but in practice we've seen: | ||
| 14114 | + 0x9000 when we did not set status to 0x0001 on prev message | ||
| 14115 | + 0x1001 when we did set it | ||
| 14116 | + 0x0000 was never seen | ||
| 14117 | + conclusion: this is really a bitfield: | ||
| 14118 | + 0x1000 is 'info available' bit | ||
| 14119 | + 'mailbox overflowed' bit is 0x8000, not 0x1000 | ||
| 14120 | + value of 0x0000 probably means that there are no messages at all | ||
| 14121 | + P.S. I dunno how in hell hw is supposed to notice that messages are lost - | ||
| 14122 | + it does NOT clear bit 0x0001, and this bit will probably stay forever set | ||
| 14123 | + after we set it once. Let's hope this will be fixed in firmware someday | ||
| 14124 | +*/ | ||
| 14125 | + | ||
| 14126 | +static void | ||
| 14127 | +handle_info_irq(acx_device_t *adev) | ||
| 14128 | +{ | ||
| 14129 | +#if ACX_DEBUG | ||
| 14130 | + static const char * const info_type_msg[] = { | ||
| 14131 | + "(unknown)", | ||
| 14132 | + "scan complete", | ||
| 14133 | + "WEP key not found", | ||
| 14134 | + "internal watchdog reset was done", | ||
| 14135 | + "failed to send powersave (NULL frame) notification to AP", | ||
| 14136 | + "encrypt/decrypt on a packet has failed", | ||
| 14137 | + "TKIP tx keys disabled", | ||
| 14138 | + "TKIP rx keys disabled", | ||
| 14139 | + "TKIP rx: key ID not found", | ||
| 14140 | + "???", | ||
| 14141 | + "???", | ||
| 14142 | + "???", | ||
| 14143 | + "???", | ||
| 14144 | + "???", | ||
| 14145 | + "???", | ||
| 14146 | + "???", | ||
| 14147 | + "TKIP IV value exceeds thresh" | ||
| 14148 | + }; | ||
| 14149 | +#endif | ||
| 14150 | + u32 info_type, info_status; | ||
| 14151 | + | ||
| 14152 | + info_type = read_slavemem32 (adev, (u32) adev->info_area); | ||
| 14153 | + | ||
| 14154 | + info_status = (info_type >> 16); | ||
| 14155 | + info_type = (u16)info_type; | ||
| 14156 | + | ||
| 14157 | + /* inform fw that we have read this info message */ | ||
| 14158 | + write_slavemem32(adev, (u32) adev->info_area, info_type | 0x00010000); | ||
| 14159 | + write_reg16(adev, IO_ACX_INT_TRIG, INT_TRIG_INFOACK); | ||
| 14160 | + write_flush(adev); | ||
| 14161 | + | ||
| 14162 | + log(L_CTL, "info_type:%04X info_status:%04X\n", | ||
| 14163 | + info_type, info_status); | ||
| 14164 | + | ||
| 14165 | + log(L_IRQ, "got Info IRQ: status %04X type %04X: %s\n", | ||
| 14166 | + info_status, info_type, | ||
| 14167 | + info_type_msg[(info_type >= VEC_SIZE(info_type_msg)) ? | ||
| 14168 | + 0 : info_type] | ||
| 14169 | + ); | ||
| 14170 | +} | ||
| 14171 | + | ||
| 14172 | + | ||
| 14173 | +static void | ||
| 14174 | +log_unusual_irq(u16 irqtype) { | ||
| 14175 | + /* | ||
| 14176 | + if (!printk_ratelimit()) | ||
| 14177 | + return; | ||
| 14178 | + */ | ||
| 14179 | + | ||
| 14180 | + printk("acx: got"); | ||
| 14181 | + if (irqtype & HOST_INT_TX_XFER) { | ||
| 14182 | + printk(" Tx_Xfer"); | ||
| 14183 | + } | ||
| 14184 | + if (irqtype & HOST_INT_RX_COMPLETE) { | ||
| 14185 | + printk(" Rx_Complete"); | ||
| 14186 | + } | ||
| 14187 | + if (irqtype & HOST_INT_DTIM) { | ||
| 14188 | + printk(" DTIM"); | ||
| 14189 | + } | ||
| 14190 | + if (irqtype & HOST_INT_BEACON) { | ||
| 14191 | + printk(" Beacon"); | ||
| 14192 | + } | ||
| 14193 | + if (irqtype & HOST_INT_TIMER) { | ||
| 14194 | + log(L_IRQ, " Timer"); | ||
| 14195 | + } | ||
| 14196 | + if (irqtype & HOST_INT_KEY_NOT_FOUND) { | ||
| 14197 | + printk(" Key_Not_Found"); | ||
| 14198 | + } | ||
| 14199 | + if (irqtype & HOST_INT_IV_ICV_FAILURE) { | ||
| 14200 | + printk(" IV_ICV_Failure (crypto)"); | ||
| 14201 | + } | ||
| 14202 | + /* HOST_INT_CMD_COMPLETE */ | ||
| 14203 | + /* HOST_INT_INFO */ | ||
| 14204 | + if (irqtype & HOST_INT_OVERFLOW) { | ||
| 14205 | + printk(" Overflow"); | ||
| 14206 | + } | ||
| 14207 | + if (irqtype & HOST_INT_PROCESS_ERROR) { | ||
| 14208 | + printk(" Process_Error"); | ||
| 14209 | + } | ||
| 14210 | + /* HOST_INT_SCAN_COMPLETE */ | ||
| 14211 | + if (irqtype & HOST_INT_FCS_THRESHOLD) { | ||
| 14212 | + printk(" FCS_Threshold"); | ||
| 14213 | + } | ||
| 14214 | + if (irqtype & HOST_INT_UNKNOWN) { | ||
| 14215 | + printk(" Unknown"); | ||
| 14216 | + } | ||
| 14217 | + printk(" IRQ(s)\n"); | ||
| 14218 | +} | ||
| 14219 | + | ||
| 14220 | + | ||
| 14221 | +static void | ||
| 14222 | +update_link_quality_led(acx_device_t *adev) | ||
| 14223 | +{ | ||
| 14224 | + int qual; | ||
| 14225 | + | ||
| 14226 | + qual = acx_signal_determine_quality(adev->wstats.qual.level, adev->wstats.qual.noise); | ||
| 14227 | + if (qual > adev->brange_max_quality) | ||
| 14228 | + qual = adev->brange_max_quality; | ||
| 14229 | + | ||
| 14230 | + if (time_after(jiffies, adev->brange_time_last_state_change + | ||
| 14231 | + (HZ/2 - HZ/2 * (unsigned long)qual / adev->brange_max_quality ) )) { | ||
| 14232 | + acxmem_l_power_led(adev, (adev->brange_last_state == 0)); | ||
| 14233 | + adev->brange_last_state ^= 1; /* toggle */ | ||
| 14234 | + adev->brange_time_last_state_change = jiffies; | ||
| 14235 | + } | ||
| 14236 | +} | ||
| 14237 | + | ||
| 14238 | + | ||
| 14239 | +#define MAX_IRQLOOPS_PER_JIFFY (20000/HZ) /* a la orinoco.c */ | ||
| 14240 | + | ||
| 14241 | +static irqreturn_t | ||
| 14242 | +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 19) | ||
| 14243 | +acxmem_i_interrupt(int irq, void *dev_id) | ||
| 14244 | +#else | ||
| 14245 | +acxmwm_i_interrupt(int irq, void *dev_id, struct pt_regs *regs) | ||
| 14246 | +#endif | ||
| 14247 | +{ | ||
| 14248 | + acx_device_t *adev; | ||
| 14249 | + unsigned long flags; | ||
| 14250 | + unsigned int irqcount = MAX_IRQLOOPS_PER_JIFFY; | ||
| 14251 | + register u16 irqtype; | ||
| 14252 | + u16 unmasked; | ||
| 14253 | + | ||
| 14254 | + adev = ndev2adev((struct net_device*)dev_id); | ||
| 14255 | + | ||
| 14256 | + /* LOCKING: can just spin_lock() since IRQs are disabled anyway. | ||
| 14257 | + * I am paranoid */ | ||
| 14258 | + acx_lock(adev, flags); | ||
| 14259 | + | ||
| 14260 | + unmasked = read_reg16(adev, IO_ACX_IRQ_STATUS_CLEAR); | ||
| 14261 | + if (unlikely(0xffff == unmasked)) { | ||
| 14262 | + /* 0xffff value hints at missing hardware, | ||
| 14263 | + * so don't do anything. | ||
| 14264 | + * Not very clean, but other drivers do the same... */ | ||
| 14265 | + log(L_IRQ, "IRQ type:FFFF - device removed? IRQ_NONE\n"); | ||
| 14266 | + goto none; | ||
| 14267 | + } | ||
| 14268 | + | ||
| 14269 | + /* We will check only "interesting" IRQ types */ | ||
| 14270 | + irqtype = unmasked & ~adev->irq_mask; | ||
| 14271 | + if (!irqtype) { | ||
| 14272 | + /* We are on a shared IRQ line and it wasn't our IRQ */ | ||
| 14273 | + log(L_IRQ, "IRQ type:%04X, mask:%04X - all are masked, IRQ_NONE\n", | ||
| 14274 | + unmasked, adev->irq_mask); | ||
| 14275 | + goto none; | ||
| 14276 | + } | ||
| 14277 | + | ||
| 14278 | + /* Done here because IRQ_NONEs taking three lines of log | ||
| 14279 | + ** drive me crazy */ | ||
| 14280 | + FN_ENTER; | ||
| 14281 | + | ||
| 14282 | +#define IRQ_ITERATE 1 | ||
| 14283 | +#if IRQ_ITERATE | ||
| 14284 | +if (jiffies != adev->irq_last_jiffies) { | ||
| 14285 | + adev->irq_loops_this_jiffy = 0; | ||
| 14286 | + adev->irq_last_jiffies = jiffies; | ||
| 14287 | +} | ||
| 14288 | + | ||
| 14289 | +/* safety condition; we'll normally abort loop below | ||
| 14290 | + * in case no IRQ type occurred */ | ||
| 14291 | +while (likely(--irqcount)) { | ||
| 14292 | +#endif | ||
| 14293 | + /* ACK all IRQs ASAP */ | ||
| 14294 | + write_reg16(adev, IO_ACX_IRQ_ACK, 0xffff); | ||
| 14295 | + | ||
| 14296 | + log(L_IRQ, "IRQ type:%04X, mask:%04X, type & ~mask:%04X\n", | ||
| 14297 | + unmasked, adev->irq_mask, irqtype); | ||
| 14298 | + | ||
| 14299 | + /* Handle most important IRQ types first */ | ||
| 14300 | + if (irqtype & HOST_INT_RX_DATA) { | ||
| 14301 | + log(L_IRQ, "got Rx_Data IRQ\n"); | ||
| 14302 | + acxmem_l_process_rxdesc(adev); | ||
| 14303 | + } | ||
| 14304 | + if (irqtype & HOST_INT_TX_COMPLETE) { | ||
| 14305 | + log(L_IRQ, "got Tx_Complete IRQ\n"); | ||
| 14306 | + /* don't clean up on each Tx complete, wait a bit | ||
| 14307 | + * unless we're going towards full, in which case | ||
| 14308 | + * we do it immediately, too (otherwise we might lockup | ||
| 14309 | + * with a full Tx buffer if we go into | ||
| 14310 | + * acxmem_l_clean_txdesc() at a time when we won't wakeup | ||
| 14311 | + * the net queue in there for some reason...) */ | ||
| 14312 | + if (adev->tx_free <= TX_START_CLEAN) { | ||
| 14313 | +#if TX_CLEANUP_IN_SOFTIRQ | ||
| 14314 | + acx_schedule_task(adev, ACX_AFTER_IRQ_TX_CLEANUP); | ||
| 14315 | +#else | ||
| 14316 | + acxmem_l_clean_txdesc(adev); | ||
| 14317 | +#endif | ||
| 14318 | + } | ||
| 14319 | + } | ||
| 14320 | + | ||
| 14321 | + /* Less frequent ones */ | ||
| 14322 | + if (irqtype & (0 | ||
| 14323 | + | HOST_INT_CMD_COMPLETE | ||
| 14324 | + | HOST_INT_INFO | ||
| 14325 | + | HOST_INT_SCAN_COMPLETE | ||
| 14326 | + )) { | ||
| 14327 | + if (irqtype & HOST_INT_CMD_COMPLETE) { | ||
| 14328 | + log(L_IRQ, "got Command_Complete IRQ\n"); | ||
| 14329 | + /* save the state for the running issue_cmd() */ | ||
| 14330 | + SET_BIT(adev->irq_status, HOST_INT_CMD_COMPLETE); | ||
| 14331 | + } | ||
| 14332 | + if (irqtype & HOST_INT_INFO) { | ||
| 14333 | + handle_info_irq(adev); | ||
| 14334 | + } | ||
| 14335 | + if (irqtype & HOST_INT_SCAN_COMPLETE) { | ||
| 14336 | + log(L_IRQ, "got Scan_Complete IRQ\n"); | ||
| 14337 | + /* need to do that in process context */ | ||
| 14338 | + acx_schedule_task(adev, ACX_AFTER_IRQ_COMPLETE_SCAN); | ||
| 14339 | + /* remember that fw is not scanning anymore */ | ||
| 14340 | + SET_BIT(adev->irq_status, HOST_INT_SCAN_COMPLETE); | ||
| 14341 | + } | ||
| 14342 | + } | ||
| 14343 | + | ||
| 14344 | + /* These we just log, but either they happen rarely | ||
| 14345 | + * or we keep them masked out */ | ||
| 14346 | + if (irqtype & (0 | ||
| 14347 | + /* | HOST_INT_RX_DATA */ | ||
| 14348 | + /* | HOST_INT_TX_COMPLETE */ | ||
| 14349 | + | HOST_INT_TX_XFER | ||
| 14350 | + | HOST_INT_RX_COMPLETE | ||
| 14351 | + | HOST_INT_DTIM | ||
| 14352 | + | HOST_INT_BEACON | ||
| 14353 | + | HOST_INT_TIMER | ||
| 14354 | + | HOST_INT_KEY_NOT_FOUND | ||
| 14355 | + | HOST_INT_IV_ICV_FAILURE | ||
| 14356 | + /* | HOST_INT_CMD_COMPLETE */ | ||
| 14357 | + /* | HOST_INT_INFO */ | ||
| 14358 | + | HOST_INT_OVERFLOW | ||
| 14359 | + | HOST_INT_PROCESS_ERROR | ||
| 14360 | + /* | HOST_INT_SCAN_COMPLETE */ | ||
| 14361 | + | HOST_INT_FCS_THRESHOLD | ||
| 14362 | + | HOST_INT_UNKNOWN | ||
| 14363 | + )) { | ||
| 14364 | + log_unusual_irq(irqtype); | ||
| 14365 | + } | ||
| 14366 | + | ||
| 14367 | +#if IRQ_ITERATE | ||
| 14368 | + unmasked = read_reg16(adev, IO_ACX_IRQ_STATUS_CLEAR); | ||
| 14369 | + irqtype = unmasked & ~adev->irq_mask; | ||
| 14370 | + /* Bail out if no new IRQ bits or if all are masked out */ | ||
| 14371 | + if (!irqtype) | ||
| 14372 | + break; | ||
| 14373 | + | ||
| 14374 | + if (unlikely(++adev->irq_loops_this_jiffy > MAX_IRQLOOPS_PER_JIFFY)) { | ||
| 14375 | + printk(KERN_ERR "acx: too many interrupts per jiffy!\n"); | ||
| 14376 | + /* Looks like card floods us with IRQs! Try to stop that */ | ||
| 14377 | + write_reg16(adev, IO_ACX_IRQ_MASK, 0xffff); | ||
| 14378 | + /* This will short-circuit all future attempts to handle IRQ. | ||
| 14379 | + * We cant do much more... */ | ||
| 14380 | + adev->irq_mask = 0; | ||
| 14381 | + break; | ||
| 14382 | + } | ||
| 14383 | +} | ||
| 14384 | +#endif | ||
| 14385 | + /* Routine to perform blink with range */ | ||
| 14386 | + if (unlikely(adev->led_power == 2)) | ||
| 14387 | + update_link_quality_led(adev); | ||
| 14388 | + | ||
| 14389 | +/* handled: */ | ||
| 14390 | + /* write_flush(adev); - not needed, last op was read anyway */ | ||
| 14391 | + acx_unlock(adev, flags); | ||
| 14392 | + FN_EXIT0; | ||
| 14393 | + return IRQ_HANDLED; | ||
| 14394 | + | ||
| 14395 | +none: | ||
| 14396 | + acx_unlock(adev, flags); | ||
| 14397 | + return IRQ_NONE; | ||
| 14398 | +} | ||
| 14399 | + | ||
| 14400 | + | ||
| 14401 | +/*********************************************************************** | ||
| 14402 | +** acxmem_l_power_led | ||
| 14403 | +*/ | ||
| 14404 | +void | ||
| 14405 | +acxmem_l_power_led(acx_device_t *adev, int enable) | ||
| 14406 | +{ | ||
| 14407 | + u16 gpio_pled = IS_ACX111(adev) ? 0x0040 : 0x0800; | ||
| 14408 | + | ||
| 14409 | + /* A hack. Not moving message rate limiting to adev->xxx | ||
| 14410 | + * (it's only a debug message after all) */ | ||
| 14411 | + static int rate_limit = 0; | ||
| 14412 | + | ||
| 14413 | + if (rate_limit++ < 3) | ||
| 14414 | + log(L_IOCTL, "Please report in case toggling the power " | ||
| 14415 | + "LED doesn't work for your card!\n"); | ||
| 14416 | + if (enable) | ||
| 14417 | + write_reg16(adev, IO_ACX_GPIO_OUT, | ||
| 14418 | + read_reg16(adev, IO_ACX_GPIO_OUT) & ~gpio_pled); | ||
| 14419 | + else | ||
| 14420 | + write_reg16(adev, IO_ACX_GPIO_OUT, | ||
| 14421 | + read_reg16(adev, IO_ACX_GPIO_OUT) | gpio_pled); | ||
| 14422 | +} | ||
| 14423 | + | ||
| 14424 | + | ||
| 14425 | +/*********************************************************************** | ||
| 14426 | +** Ioctls | ||
| 14427 | +*/ | ||
| 14428 | + | ||
| 14429 | +/*********************************************************************** | ||
| 14430 | +*/ | ||
| 14431 | +int | ||
| 14432 | +acx111pci_ioctl_info( | ||
| 14433 | + struct net_device *ndev, | ||
| 14434 | + struct iw_request_info *info, | ||
| 14435 | + struct iw_param *vwrq, | ||
| 14436 | + char *extra) | ||
| 14437 | +{ | ||
| 14438 | +#if ACX_DEBUG > 1 | ||
| 14439 | + acx_device_t *adev = ndev2adev(ndev); | ||
| 14440 | + rxdesc_t *rxdesc; | ||
| 14441 | + txdesc_t *txdesc; | ||
| 14442 | + rxhostdesc_t *rxhostdesc; | ||
| 14443 | + txhostdesc_t *txhostdesc; | ||
| 14444 | + struct acx111_ie_memoryconfig memconf; | ||
| 14445 | + struct acx111_ie_queueconfig queueconf; | ||
| 14446 | + unsigned long flags; | ||
| 14447 | + int i; | ||
| 14448 | + char memmap[0x34]; | ||
| 14449 | + char rxconfig[0x8]; | ||
| 14450 | + char fcserror[0x8]; | ||
| 14451 | + char ratefallback[0x5]; | ||
| 14452 | + | ||
| 14453 | + if ( !(acx_debug & (L_IOCTL|L_DEBUG)) ) | ||
| 14454 | + return OK; | ||
| 14455 | + /* using printk() since we checked debug flag already */ | ||
| 14456 | + | ||
| 14457 | + acx_sem_lock(adev); | ||
| 14458 | + | ||
| 14459 | + if (!IS_ACX111(adev)) { | ||
| 14460 | + printk("acx111-specific function called " | ||
| 14461 | + "with non-acx111 chip, aborting\n"); | ||
| 14462 | + goto end_ok; | ||
| 14463 | + } | ||
| 14464 | + | ||
| 14465 | + /* get Acx111 Memory Configuration */ | ||
| 14466 | + memset(&memconf, 0, sizeof(memconf)); | ||
| 14467 | + /* BTW, fails with 12 (Write only) error code. | ||
| 14468 | + ** Retained for easy testing of issue_cmd error handling :) */ | ||
| 14469 | + printk ("Interrogating queue config\n"); | ||
| 14470 | + acx_s_interrogate(adev, &memconf, ACX1xx_IE_QUEUE_CONFIG); | ||
| 14471 | + printk ("done with queue config\n"); | ||
| 14472 | + | ||
| 14473 | + /* get Acx111 Queue Configuration */ | ||
| 14474 | + memset(&queueconf, 0, sizeof(queueconf)); | ||
| 14475 | + printk ("Interrogating mem config options\n"); | ||
| 14476 | + acx_s_interrogate(adev, &queueconf, ACX1xx_IE_MEMORY_CONFIG_OPTIONS); | ||
| 14477 | + printk ("done with mem config options\n"); | ||
| 14478 | + | ||
| 14479 | + /* get Acx111 Memory Map */ | ||
| 14480 | + memset(memmap, 0, sizeof(memmap)); | ||
| 14481 | + printk ("Interrogating mem map\n"); | ||
| 14482 | + acx_s_interrogate(adev, &memmap, ACX1xx_IE_MEMORY_MAP); | ||
| 14483 | + printk ("done with mem map\n"); | ||
| 14484 | + | ||
| 14485 | + /* get Acx111 Rx Config */ | ||
| 14486 | + memset(rxconfig, 0, sizeof(rxconfig)); | ||
| 14487 | + printk ("Interrogating rxconfig\n"); | ||
| 14488 | + acx_s_interrogate(adev, &rxconfig, ACX1xx_IE_RXCONFIG); | ||
| 14489 | + printk ("done with queue rxconfig\n"); | ||
| 14490 | + | ||
| 14491 | + /* get Acx111 fcs error count */ | ||
| 14492 | + memset(fcserror, 0, sizeof(fcserror)); | ||
| 14493 | + printk ("Interrogating fcs err count\n"); | ||
| 14494 | + acx_s_interrogate(adev, &fcserror, ACX1xx_IE_FCS_ERROR_COUNT); | ||
| 14495 | + printk ("done with err count\n"); | ||
| 14496 | + | ||
| 14497 | + /* get Acx111 rate fallback */ | ||
| 14498 | + memset(ratefallback, 0, sizeof(ratefallback)); | ||
| 14499 | + printk ("Interrogating rate fallback\n"); | ||
| 14500 | + acx_s_interrogate(adev, &ratefallback, ACX1xx_IE_RATE_FALLBACK); | ||
| 14501 | + printk ("done with rate fallback\n"); | ||
| 14502 | + | ||
| 14503 | + /* force occurrence of a beacon interrupt */ | ||
| 14504 | + /* TODO: comment why is this necessary */ | ||
| 14505 | + write_reg16(adev, IO_ACX_HINT_TRIG, HOST_INT_BEACON); | ||
| 14506 | + | ||
| 14507 | + /* dump Acx111 Mem Configuration */ | ||
| 14508 | + printk("dump mem config:\n" | ||
| 14509 | + "data read: %d, struct size: %d\n" | ||
| 14510 | + "Number of stations: %1X\n" | ||
| 14511 | + "Memory block size: %1X\n" | ||
| 14512 | + "tx/rx memory block allocation: %1X\n" | ||
| 14513 | + "count rx: %X / tx: %X queues\n" | ||
| 14514 | + "options %1X\n" | ||
| 14515 | + "fragmentation %1X\n" | ||
| 14516 | + "Rx Queue 1 Count Descriptors: %X\n" | ||
| 14517 | + "Rx Queue 1 Host Memory Start: %X\n" | ||
| 14518 | + "Tx Queue 1 Count Descriptors: %X\n" | ||
| 14519 | + "Tx Queue 1 Attributes: %X\n", | ||
| 14520 | + memconf.len, (int) sizeof(memconf), | ||
| 14521 | + memconf.no_of_stations, | ||
| 14522 | + memconf.memory_block_size, | ||
| 14523 | + memconf.tx_rx_memory_block_allocation, | ||
| 14524 | + memconf.count_rx_queues, memconf.count_tx_queues, | ||
| 14525 | + memconf.options, | ||
| 14526 | + memconf.fragmentation, | ||
| 14527 | + memconf.rx_queue1_count_descs, | ||
| 14528 | + acx2cpu(memconf.rx_queue1_host_rx_start), | ||
| 14529 | + memconf.tx_queue1_count_descs, | ||
| 14530 | + memconf.tx_queue1_attributes); | ||
| 14531 | + | ||
| 14532 | + /* dump Acx111 Queue Configuration */ | ||
| 14533 | + printk("dump queue head:\n" | ||
| 14534 | + "data read: %d, struct size: %d\n" | ||
| 14535 | + "tx_memory_block_address (from card): %X\n" | ||
| 14536 | + "rx_memory_block_address (from card): %X\n" | ||
| 14537 | + "rx1_queue address (from card): %X\n" | ||
| 14538 | + "tx1_queue address (from card): %X\n" | ||
| 14539 | + "tx1_queue attributes (from card): %X\n", | ||
| 14540 | + queueconf.len, (int) sizeof(queueconf), | ||
| 14541 | + queueconf.tx_memory_block_address, | ||
| 14542 | + queueconf.rx_memory_block_address, | ||
| 14543 | + queueconf.rx1_queue_address, | ||
| 14544 | + queueconf.tx1_queue_address, | ||
| 14545 | + queueconf.tx1_attributes); | ||
| 14546 | + | ||
| 14547 | + /* dump Acx111 Mem Map */ | ||
| 14548 | + printk("dump mem map:\n" | ||
| 14549 | + "data read: %d, struct size: %d\n" | ||
| 14550 | + "Code start: %X\n" | ||
| 14551 | + "Code end: %X\n" | ||
| 14552 | + "WEP default key start: %X\n" | ||
| 14553 | + "WEP default key end: %X\n" | ||
| 14554 | + "STA table start: %X\n" | ||
| 14555 | + "STA table end: %X\n" | ||
| 14556 | + "Packet template start: %X\n" | ||
| 14557 | + "Packet template end: %X\n" | ||
| 14558 | + "Queue memory start: %X\n" | ||
| 14559 | + "Queue memory end: %X\n" | ||
| 14560 | + "Packet memory pool start: %X\n" | ||
| 14561 | + "Packet memory pool end: %X\n" | ||
| 14562 | + "iobase: %p\n" | ||
| 14563 | + "iobase2: %p\n", | ||
| 14564 | + *((u16 *)&memmap[0x02]), (int) sizeof(memmap), | ||
| 14565 | + *((u32 *)&memmap[0x04]), | ||
| 14566 | + *((u32 *)&memmap[0x08]), | ||
| 14567 | + *((u32 *)&memmap[0x0C]), | ||
| 14568 | + *((u32 *)&memmap[0x10]), | ||
| 14569 | + *((u32 *)&memmap[0x14]), | ||
| 14570 | + *((u32 *)&memmap[0x18]), | ||
| 14571 | + *((u32 *)&memmap[0x1C]), | ||
| 14572 | + *((u32 *)&memmap[0x20]), | ||
| 14573 | + *((u32 *)&memmap[0x24]), | ||
| 14574 | + *((u32 *)&memmap[0x28]), | ||
| 14575 | + *((u32 *)&memmap[0x2C]), | ||
| 14576 | + *((u32 *)&memmap[0x30]), | ||
| 14577 | + adev->iobase, | ||
| 14578 | + adev->iobase2); | ||
| 14579 | + | ||
| 14580 | + /* dump Acx111 Rx Config */ | ||
| 14581 | + printk("dump rx config:\n" | ||
| 14582 | + "data read: %d, struct size: %d\n" | ||
| 14583 | + "rx config: %X\n" | ||
| 14584 | + "rx filter config: %X\n", | ||
| 14585 | + *((u16 *)&rxconfig[0x02]), (int) sizeof(rxconfig), | ||
| 14586 | + *((u16 *)&rxconfig[0x04]), | ||
| 14587 | + *((u16 *)&rxconfig[0x06])); | ||
| 14588 | + | ||
| 14589 | + /* dump Acx111 fcs error */ | ||
| 14590 | + printk("dump fcserror:\n" | ||
| 14591 | + "data read: %d, struct size: %d\n" | ||
| 14592 | + "fcserrors: %X\n", | ||
| 14593 | + *((u16 *)&fcserror[0x02]), (int) sizeof(fcserror), | ||
| 14594 | + *((u32 *)&fcserror[0x04])); | ||
| 14595 | + | ||
| 14596 | + /* dump Acx111 rate fallback */ | ||
| 14597 | + printk("dump rate fallback:\n" | ||
| 14598 | + "data read: %d, struct size: %d\n" | ||
| 14599 | + "ratefallback: %X\n", | ||
| 14600 | + *((u16 *)&ratefallback[0x02]), (int) sizeof(ratefallback), | ||
| 14601 | + *((u8 *)&ratefallback[0x04])); | ||
| 14602 | + | ||
| 14603 | + /* protect against IRQ */ | ||
| 14604 | + acx_lock(adev, flags); | ||
| 14605 | + | ||
| 14606 | + /* dump acx111 internal rx descriptor ring buffer */ | ||
| 14607 | + rxdesc = adev->rxdesc_start; | ||
| 14608 | + | ||
| 14609 | + /* loop over complete receive pool */ | ||
| 14610 | + if (rxdesc) for (i = 0; i < RX_CNT; i++) { | ||
| 14611 | + printk("\ndump internal rxdesc %d:\n" | ||
| 14612 | + "mem pos %p\n" | ||
| 14613 | + "next 0x%X\n" | ||
| 14614 | + "acx mem pointer (dynamic) 0x%X\n" | ||
| 14615 | + "CTL (dynamic) 0x%X\n" | ||
| 14616 | + "Rate (dynamic) 0x%X\n" | ||
| 14617 | + "RxStatus (dynamic) 0x%X\n" | ||
| 14618 | + "Mod/Pre (dynamic) 0x%X\n", | ||
| 14619 | + i, | ||
| 14620 | + rxdesc, | ||
| 14621 | + acx2cpu(rxdesc->pNextDesc), | ||
| 14622 | + acx2cpu(rxdesc->ACXMemPtr), | ||
| 14623 | + rxdesc->Ctl_8, | ||
| 14624 | + rxdesc->rate, | ||
| 14625 | + rxdesc->error, | ||
| 14626 | + rxdesc->SNR); | ||
| 14627 | + rxdesc++; | ||
| 14628 | + } | ||
| 14629 | + | ||
| 14630 | + /* dump host rx descriptor ring buffer */ | ||
| 14631 | + | ||
| 14632 | + rxhostdesc = adev->rxhostdesc_start; | ||
| 14633 | + | ||
| 14634 | + /* loop over complete receive pool */ | ||
| 14635 | + if (rxhostdesc) for (i = 0; i < RX_CNT; i++) { | ||
| 14636 | + printk("\ndump host rxdesc %d:\n" | ||
| 14637 | + "mem pos %p\n" | ||
| 14638 | + "buffer mem pos 0x%X\n" | ||
| 14639 | + "buffer mem offset 0x%X\n" | ||
| 14640 | + "CTL 0x%X\n" | ||
| 14641 | + "Length 0x%X\n" | ||
| 14642 | + "next 0x%X\n" | ||
| 14643 | + "Status 0x%X\n", | ||
| 14644 | + i, | ||
| 14645 | + rxhostdesc, | ||
| 14646 | + acx2cpu(rxhostdesc->data_phy), | ||
| 14647 | + rxhostdesc->data_offset, | ||
| 14648 | + le16_to_cpu(rxhostdesc->Ctl_16), | ||
| 14649 | + le16_to_cpu(rxhostdesc->length), | ||
| 14650 | + acx2cpu(rxhostdesc->desc_phy_next), | ||
| 14651 | + rxhostdesc->Status); | ||
| 14652 | + rxhostdesc++; | ||
| 14653 | + } | ||
| 14654 | + | ||
| 14655 | + /* dump acx111 internal tx descriptor ring buffer */ | ||
| 14656 | + txdesc = adev->txdesc_start; | ||
| 14657 | + | ||
| 14658 | + /* loop over complete transmit pool */ | ||
| 14659 | + if (txdesc) for (i = 0; i < TX_CNT; i++) { | ||
| 14660 | + printk("\ndump internal txdesc %d:\n" | ||
| 14661 | + "size 0x%X\n" | ||
| 14662 | + "mem pos %p\n" | ||
| 14663 | + "next 0x%X\n" | ||
| 14664 | + "acx mem pointer (dynamic) 0x%X\n" | ||
| 14665 | + "host mem pointer (dynamic) 0x%X\n" | ||
| 14666 | + "length (dynamic) 0x%X\n" | ||
| 14667 | + "CTL (dynamic) 0x%X\n" | ||
| 14668 | + "CTL2 (dynamic) 0x%X\n" | ||
| 14669 | + "Status (dynamic) 0x%X\n" | ||
| 14670 | + "Rate (dynamic) 0x%X\n", | ||
| 14671 | + i, | ||
| 14672 | + (int) sizeof(struct txdesc), | ||
| 14673 | + txdesc, | ||
| 14674 | + acx2cpu(txdesc->pNextDesc), | ||
| 14675 | + acx2cpu(txdesc->AcxMemPtr), | ||
| 14676 | + acx2cpu(txdesc->HostMemPtr), | ||
| 14677 | + le16_to_cpu(txdesc->total_length), | ||
| 14678 | + txdesc->Ctl_8, | ||
| 14679 | + txdesc->Ctl2_8, txdesc->error, | ||
| 14680 | + txdesc->u.r1.rate); | ||
| 14681 | + txdesc = advance_txdesc(adev, txdesc, 1); | ||
| 14682 | + } | ||
| 14683 | + | ||
| 14684 | + /* dump host tx descriptor ring buffer */ | ||
| 14685 | + | ||
| 14686 | + txhostdesc = adev->txhostdesc_start; | ||
| 14687 | + | ||
| 14688 | + /* loop over complete host send pool */ | ||
| 14689 | + if (txhostdesc) for (i = 0; i < TX_CNT * 2; i++) { | ||
| 14690 | + printk("\ndump host txdesc %d:\n" | ||
| 14691 | + "mem pos %p\n" | ||
| 14692 | + "buffer mem pos 0x%X\n" | ||
| 14693 | + "buffer mem offset 0x%X\n" | ||
| 14694 | + "CTL 0x%X\n" | ||
| 14695 | + "Length 0x%X\n" | ||
| 14696 | + "next 0x%X\n" | ||
| 14697 | + "Status 0x%X\n", | ||
| 14698 | + i, | ||
| 14699 | + txhostdesc, | ||
| 14700 | + acx2cpu(txhostdesc->data_phy), | ||
| 14701 | + txhostdesc->data_offset, | ||
| 14702 | + le16_to_cpu(txhostdesc->Ctl_16), | ||
| 14703 | + le16_to_cpu(txhostdesc->length), | ||
| 14704 | + acx2cpu(txhostdesc->desc_phy_next), | ||
| 14705 | + le32_to_cpu(txhostdesc->Status)); | ||
| 14706 | + txhostdesc++; | ||
| 14707 | + } | ||
| 14708 | + | ||
| 14709 | + /* write_reg16(adev, 0xb4, 0x4); */ | ||
| 14710 | + | ||
| 14711 | + acx_unlock(adev, flags); | ||
| 14712 | +end_ok: | ||
| 14713 | + | ||
| 14714 | + acx_sem_unlock(adev); | ||
| 14715 | +#endif /* ACX_DEBUG */ | ||
| 14716 | + return OK; | ||
| 14717 | +} | ||
| 14718 | + | ||
| 14719 | + | ||
| 14720 | +/*********************************************************************** | ||
| 14721 | +*/ | ||
| 14722 | +int | ||
| 14723 | +acx100mem_ioctl_set_phy_amp_bias( | ||
| 14724 | + struct net_device *ndev, | ||
| 14725 | + struct iw_request_info *info, | ||
| 14726 | + struct iw_param *vwrq, | ||
| 14727 | + char *extra) | ||
| 14728 | +{ | ||
| 14729 | + acx_device_t *adev = ndev2adev(ndev); | ||
| 14730 | + unsigned long flags; | ||
| 14731 | + u16 gpio_old; | ||
| 14732 | + | ||
| 14733 | + if (!IS_ACX100(adev)) { | ||
| 14734 | + /* WARNING!!! | ||
| 14735 | + * Removing this check *might* damage | ||
| 14736 | + * hardware, since we're tweaking GPIOs here after all!!! | ||
| 14737 | + * You've been warned... | ||
| 14738 | + * WARNING!!! */ | ||
| 14739 | + printk("acx: sorry, setting bias level for non-acx100 " | ||
| 14740 | + "is not supported yet\n"); | ||
| 14741 | + return OK; | ||
| 14742 | + } | ||
| 14743 | + | ||
| 14744 | + if (*extra > 7) { | ||
| 14745 | + printk("acx: invalid bias parameter, range is 0-7\n"); | ||
| 14746 | + return -EINVAL; | ||
| 14747 | + } | ||
| 14748 | + | ||
| 14749 | + acx_sem_lock(adev); | ||
| 14750 | + | ||
| 14751 | + /* Need to lock accesses to [IO_ACX_GPIO_OUT]: | ||
| 14752 | + * IRQ handler uses it to update LED */ | ||
| 14753 | + acx_lock(adev, flags); | ||
| 14754 | + gpio_old = read_reg16(adev, IO_ACX_GPIO_OUT); | ||
| 14755 | + write_reg16(adev, IO_ACX_GPIO_OUT, (gpio_old & 0xf8ff) | ((u16)*extra << 8)); | ||
| 14756 | + acx_unlock(adev, flags); | ||
| 14757 | + | ||
| 14758 | + log(L_DEBUG, "gpio_old: 0x%04X\n", gpio_old); | ||
| 14759 | + printk("%s: PHY power amplifier bias: old:%d, new:%d\n", | ||
| 14760 | + ndev->name, | ||
| 14761 | + (gpio_old & 0x0700) >> 8, (unsigned char)*extra); | ||
| 14762 | + | ||
| 14763 | + acx_sem_unlock(adev); | ||
| 14764 | + | ||
| 14765 | + return OK; | ||
| 14766 | +} | ||
| 14767 | + | ||
| 14768 | +/*************************************************************** | ||
| 14769 | +** acxmem_l_alloc_tx | ||
| 14770 | +** Actually returns a txdesc_t* ptr | ||
| 14771 | +** | ||
| 14772 | +** FIXME: in case of fragments, should allocate multiple descrs | ||
| 14773 | +** after figuring out how many we need and whether we still have | ||
| 14774 | +** sufficiently many. | ||
| 14775 | +*/ | ||
| 14776 | +tx_t* | ||
| 14777 | +acxmem_l_alloc_tx(acx_device_t *adev) | ||
| 14778 | +{ | ||
| 14779 | + struct txdesc *txdesc; | ||
| 14780 | + unsigned head; | ||
| 14781 | + u8 ctl8; | ||
| 14782 | + static int txattempts = 0; | ||
| 14783 | + | ||
| 14784 | + FN_ENTER; | ||
| 14785 | + | ||
| 14786 | + if (unlikely(!adev->tx_free)) { | ||
| 14787 | + printk("acx: BUG: no free txdesc left\n"); | ||
| 14788 | + /* | ||
| 14789 | + * Probably the ACX ignored a transmit attempt and now there's a packet | ||
| 14790 | + * sitting in the queue we think should be transmitting but the ACX doesn't | ||
| 14791 | + * know about. | ||
| 14792 | + * On the first pass, send the ACX a TxProc interrupt to try moving | ||
| 14793 | + * things along, and if that doesn't work (ie, we get called again) completely | ||
| 14794 | + * flush the transmit queue. | ||
| 14795 | + */ | ||
| 14796 | + if (txattempts < 10) { | ||
| 14797 | + txattempts++; | ||
| 14798 | + printk ("acx: trying to wake up ACX\n"); | ||
| 14799 | + write_reg16(adev, IO_ACX_INT_TRIG, INT_TRIG_TXPRC); | ||
| 14800 | + write_flush(adev); } | ||
| 14801 | + else { | ||
| 14802 | + txattempts = 0; | ||
| 14803 | + printk ("acx: flushing transmit queue.\n"); | ||
| 14804 | + acxmem_l_clean_txdesc_emergency (adev); | ||
| 14805 | + } | ||
| 14806 | + txdesc = NULL; | ||
| 14807 | + goto end; | ||
| 14808 | + } | ||
| 14809 | + | ||
| 14810 | + /* | ||
| 14811 | + * Make a quick check to see if there is transmit buffer space on | ||
| 14812 | + * the ACX. This can't guarantee there is enough space for the packet | ||
| 14813 | + * since we don't yet know how big it is, but it will prevent at least some | ||
| 14814 | + * annoyances. | ||
| 14815 | + */ | ||
| 14816 | + if (!adev->acx_txbuf_blocks_free) { | ||
| 14817 | + txdesc = NULL; | ||
| 14818 | + goto end; | ||
| 14819 | + } | ||
| 14820 | + | ||
| 14821 | + head = adev->tx_head; | ||
| 14822 | + /* | ||
| 14823 | + * txdesc points to ACX memory | ||
| 14824 | + */ | ||
| 14825 | + txdesc = get_txdesc(adev, head); | ||
| 14826 | + ctl8 = read_slavemem8 (adev, (u32) &(txdesc->Ctl_8)); | ||
| 14827 | + | ||
| 14828 | + /* | ||
| 14829 | + * If we don't own the buffer (HOSTOWN) it is certainly not free; however, | ||
| 14830 | + * we may have previously thought we had enough memory to send | ||
| 14831 | + * a packet, allocated the buffer then gave up when we found not enough | ||
| 14832 | + * transmit buffer space on the ACX. In that case, HOSTOWN and | ||
| 14833 | + * ACXDONE will both be set. | ||
| 14834 | + */ | ||
| 14835 | + if (unlikely(DESC_CTL_HOSTOWN != (ctl8 & DESC_CTL_HOSTOWN))) { | ||
| 14836 | + /* whoops, descr at current index is not free, so probably | ||
| 14837 | + * ring buffer already full */ | ||
| 14838 | + printk("acx: BUG: tx_head:%d Ctl8:0x%02X - failed to find " | ||
| 14839 | + "free txdesc\n", head, ctl8); | ||
| 14840 | + txdesc = NULL; | ||
| 14841 | + goto end; | ||
| 14842 | + } | ||
| 14843 | + | ||
| 14844 | + /* Needed in case txdesc won't be eventually submitted for tx */ | ||
| 14845 | + write_slavemem8 (adev, (u32) &(txdesc->Ctl_8), DESC_CTL_ACXDONE_HOSTOWN); | ||
| 14846 | + | ||
| 14847 | + adev->tx_free--; | ||
| 14848 | + log(L_BUFT, "tx: got desc %u, %u remain\n", | ||
| 14849 | + head, adev->tx_free); | ||
| 14850 | + /* Keep a few free descs between head and tail of tx ring. | ||
| 14851 | + ** It is not absolutely needed, just feels safer */ | ||
| 14852 | + if (adev->tx_free < TX_STOP_QUEUE) { | ||
| 14853 | + log(L_BUF, "stop queue (%u tx desc left)\n", | ||
| 14854 | + adev->tx_free); | ||
| 14855 | + acx_stop_queue(adev->ndev, NULL); | ||
| 14856 | + } | ||
| 14857 | + | ||
| 14858 | + /* returning current descriptor, so advance to next free one */ | ||
| 14859 | + adev->tx_head = (head + 1) % TX_CNT; | ||
| 14860 | +end: | ||
| 14861 | + FN_EXIT0; | ||
| 14862 | + | ||
| 14863 | + return (tx_t*)txdesc; | ||
| 14864 | +} | ||
| 14865 | + | ||
| 14866 | + | ||
| 14867 | +/*************************************************************** | ||
| 14868 | +** acxmem_l_dealloc_tx | ||
| 14869 | +** Clears out a previously allocatedvoid acxmem_l_dealloc_tx(tx_t *tx_opaque); | ||
| 14870 | + transmit descriptor. The ACX | ||
| 14871 | +** can get confused if we skip transmit descriptors in the queue, | ||
| 14872 | +** so when we don't need a descriptor return it to its original | ||
| 14873 | +** state and move the queue head pointer back. | ||
| 14874 | +** | ||
| 14875 | +*/ | ||
| 14876 | +void | ||
| 14877 | +acxmem_l_dealloc_tx(acx_device_t *adev, tx_t *tx_opaque) | ||
| 14878 | +{ | ||
| 14879 | + /* | ||
| 14880 | + * txdesc is the address of the descriptor on the ACX. | ||
| 14881 | + */ | ||
| 14882 | + txdesc_t *txdesc = (txdesc_t*)tx_opaque; | ||
| 14883 | + txdesc_t tmptxdesc; | ||
| 14884 | + int index; | ||
| 14885 | + | ||
| 14886 | + memset (&tmptxdesc, 0, sizeof(tmptxdesc)); | ||
| 14887 | + tmptxdesc.Ctl_8 = DESC_CTL_HOSTOWN | DESC_CTL_FIRSTFRAG; | ||
| 14888 | + tmptxdesc.u.r1.rate = 0x0a; | ||
| 14889 | + | ||
| 14890 | + /* | ||
| 14891 | + * Clear out all of the transmit descriptor except for the next pointer | ||
| 14892 | + */ | ||
| 14893 | + copy_to_slavemem (adev, (u32) &(txdesc->HostMemPtr), | ||
| 14894 | + (u8 *) &(tmptxdesc.HostMemPtr), | ||
| 14895 | + sizeof (tmptxdesc) - sizeof(tmptxdesc.pNextDesc)); | ||
| 14896 | + | ||
| 14897 | + /* | ||
| 14898 | + * This is only called immediately after we've allocated, so we should | ||
| 14899 | + * be able to set the head back to this descriptor. | ||
| 14900 | + */ | ||
| 14901 | + index = ((u8*) txdesc - (u8*)adev->txdesc_start) / adev->txdesc_size; | ||
| 14902 | + printk ("acx_dealloc: moving head from %d to %d\n", adev->tx_head, index); | ||
| 14903 | + adev->tx_head = index; | ||
| 14904 | +} | ||
| 14905 | + | ||
| 14906 | + | ||
| 14907 | +/*********************************************************************** | ||
| 14908 | +*/ | ||
| 14909 | +void* | ||
| 14910 | +acxmem_l_get_txbuf(acx_device_t *adev, tx_t* tx_opaque) | ||
| 14911 | +{ | ||
| 14912 | + return get_txhostdesc(adev, (txdesc_t*)tx_opaque)->data; | ||
| 14913 | +} | ||
| 14914 | + | ||
| 14915 | + | ||
| 14916 | +/*********************************************************************** | ||
| 14917 | +** acxmem_l_tx_data | ||
| 14918 | +** | ||
| 14919 | +** Can be called from IRQ (rx -> (AP bridging or mgmt response) -> tx). | ||
| 14920 | +** Can be called from acx_i_start_xmit (data frames from net core). | ||
| 14921 | +** | ||
| 14922 | +** FIXME: in case of fragments, should loop over the number of | ||
| 14923 | +** pre-allocated tx descrs, properly setting up transfer data and | ||
| 14924 | +** CTL_xxx flags according to fragment number. | ||
| 14925 | +*/ | ||
| 14926 | +void | ||
| 14927 | +acxmem_update_queue_indicator (acx_device_t *adev, int txqueue) | ||
| 14928 | +{ | ||
| 14929 | +#ifdef USING_MORE_THAN_ONE_TRANSMIT_QUEUE | ||
| 14930 | + u32 indicator; | ||
| 14931 | + unsigned long flags; | ||
| 14932 | + int count; | ||
| 14933 | + | ||
| 14934 | + /* | ||
| 14935 | + * Can't handle an interrupt while we're fiddling with the ACX's lock, | ||
| 14936 | + * according to TI. The ACX is supposed to hold fw_lock for at most | ||
| 14937 | + * 500ns. | ||
| 14938 | + */ | ||
| 14939 | + local_irq_save (flags); | ||
| 14940 | + | ||
| 14941 | + /* | ||
| 14942 | + * Wait for ACX to release the lock (at most 500ns). | ||
| 14943 | + */ | ||
| 14944 | + count = 0; | ||
| 14945 | + while (read_slavemem16 (adev, (u32) &(adev->acx_queue_indicator->fw_lock)) | ||
| 14946 | + && (count++ < 50)) { | ||
| 14947 | + ndelay (10); | ||
| 14948 | + } | ||
| 14949 | + if (count < 50) { | ||
| 14950 | + | ||
| 14951 | + /* | ||
| 14952 | + * Take out the host lock - anything non-zero will work, so don't worry about | ||
| 14953 | + * be/le | ||
| 14954 | + */ | ||
| 14955 | + write_slavemem16 (adev, (u32) &(adev->acx_queue_indicator->host_lock), 1); | ||
| 14956 | + | ||
| 14957 | + /* | ||
| 14958 | + * Avoid a race condition | ||
| 14959 | + */ | ||
| 14960 | + count = 0; | ||
| 14961 | + while (read_slavemem16 (adev, (u32) &(adev->acx_queue_indicator->fw_lock)) | ||
| 14962 | + && (count++ < 50)) { | ||
| 14963 | + ndelay (10); | ||
| 14964 | + } | ||
| 14965 | + | ||
| 14966 | + if (count < 50) { | ||
| 14967 | + /* | ||
| 14968 | + * Mark the queue active | ||
| 14969 | + */ | ||
| 14970 | + indicator = read_slavemem32 (adev, (u32) &(adev->acx_queue_indicator->indicator)); | ||
| 14971 | + indicator |= cpu_to_le32 (1 << txqueue); | ||
| 14972 | + write_slavemem32 (adev, (u32) &(adev->acx_queue_indicator->indicator), indicator); | ||
| 14973 | + } | ||
| 14974 | + | ||
| 14975 | + /* | ||
| 14976 | + * Release the host lock | ||
| 14977 | + */ | ||
| 14978 | + write_slavemem16 (adev, (u32) &(adev->acx_queue_indicator->host_lock), 0); | ||
| 14979 | + | ||
| 14980 | + } | ||
| 14981 | + | ||
| 14982 | + /* | ||
| 14983 | + * Restore interrupts | ||
| 14984 | + */ | ||
| 14985 | + local_irq_restore (flags); | ||
| 14986 | +#endif | ||
| 14987 | +} | ||
| 14988 | + | ||
| 14989 | +void | ||
| 14990 | +acxmem_l_tx_data(acx_device_t *adev, tx_t* tx_opaque, int len) | ||
| 14991 | +{ | ||
| 14992 | + /* | ||
| 14993 | + * txdesc is the address on the ACX | ||
| 14994 | + */ | ||
| 14995 | + txdesc_t *txdesc = (txdesc_t*)tx_opaque; | ||
| 14996 | + txhostdesc_t *hostdesc1, *hostdesc2; | ||
| 14997 | + client_t *clt; | ||
| 14998 | + u16 rate_cur; | ||
| 14999 | + u8 Ctl_8, Ctl2_8; | ||
| 15000 | + u32 addr; | ||
| 15001 | + | ||
| 15002 | + FN_ENTER; | ||
| 15003 | + /* fw doesn't tx such packets anyhow */ | ||
| 15004 | + if (unlikely(len < WLAN_HDR_A3_LEN)) | ||
| 15005 | + goto end; | ||
| 15006 | + | ||
| 15007 | + hostdesc1 = get_txhostdesc(adev, txdesc); | ||
| 15008 | + /* modify flag status in separate variable to be able to write it back | ||
| 15009 | + * in one big swoop later (also in order to have less device memory | ||
| 15010 | + * accesses) */ | ||
| 15011 | + Ctl_8 = read_slavemem8 (adev, (u32) &(txdesc->Ctl_8)); | ||
| 15012 | + Ctl2_8 = 0; /* really need to init it to 0, not txdesc->Ctl2_8, it seems */ | ||
| 15013 | + | ||
| 15014 | + hostdesc2 = hostdesc1 + 1; | ||
| 15015 | + | ||
| 15016 | + /* DON'T simply set Ctl field to 0 here globally, | ||
| 15017 | + * it needs to maintain a consistent flag status (those are state flags!!), | ||
| 15018 | + * otherwise it may lead to severe disruption. Only set or reset particular | ||
| 15019 | + * flags at the exact moment this is needed... */ | ||
| 15020 | + | ||
| 15021 | + /* let chip do RTS/CTS handshaking before sending | ||
| 15022 | + * in case packet size exceeds threshold */ | ||
| 15023 | + if (len > adev->rts_threshold) | ||
| 15024 | + SET_BIT(Ctl2_8, DESC_CTL2_RTS); | ||
| 15025 | + else | ||
| 15026 | + CLEAR_BIT(Ctl2_8, DESC_CTL2_RTS); | ||
| 15027 | + | ||
| 15028 | + switch (adev->mode) { | ||
| 15029 | + case ACX_MODE_0_ADHOC: | ||
| 15030 | + case ACX_MODE_3_AP: | ||
| 15031 | + clt = acx_l_sta_list_get(adev, ((wlan_hdr_t*)hostdesc1->data)->a1); | ||
| 15032 | + break; | ||
| 15033 | + case ACX_MODE_2_STA: | ||
| 15034 | + clt = adev->ap_client; | ||
| 15035 | + break; | ||
| 15036 | +#if 0 | ||
| 15037 | +/* testing was done on acx111: */ | ||
| 15038 | + case ACX_MODE_MONITOR: | ||
| 15039 | + SET_BIT(Ctl2_8, 0 | ||
| 15040 | +/* sends CTS to self before packet */ | ||
| 15041 | + + DESC_CTL2_SEQ /* don't increase sequence field */ | ||
| 15042 | +/* not working (looks like good fcs is still added) */ | ||
| 15043 | + + DESC_CTL2_FCS /* don't add the FCS */ | ||
| 15044 | +/* not tested */ | ||
| 15045 | + + DESC_CTL2_MORE_FRAG | ||
| 15046 | +/* not tested */ | ||
| 15047 | + + DESC_CTL2_RETRY /* don't increase retry field */ | ||
| 15048 | +/* not tested */ | ||
| 15049 | + + DESC_CTL2_POWER /* don't increase power mgmt. field */ | ||
| 15050 | +/* no effect */ | ||
| 15051 | + + DESC_CTL2_WEP /* encrypt this frame */ | ||
| 15052 | +/* not tested */ | ||
| 15053 | + + DESC_CTL2_DUR /* don't increase duration field */ | ||
| 15054 | + ); | ||
| 15055 | + /* fallthrough */ | ||
| 15056 | +#endif | ||
| 15057 | + default: /* ACX_MODE_OFF, ACX_MODE_MONITOR */ | ||
| 15058 | + clt = NULL; | ||
| 15059 | + break; | ||
| 15060 | + } | ||
| 15061 | + | ||
| 15062 | + rate_cur = clt ? clt->rate_cur : adev->rate_bcast; | ||
| 15063 | + if (unlikely(!rate_cur)) { | ||
| 15064 | + printk("acx: driver bug! bad ratemask\n"); | ||
| 15065 | + goto end; | ||
| 15066 | + } | ||
| 15067 | + | ||
| 15068 | + /* used in tx cleanup routine for auto rate and accounting: */ | ||
| 15069 | + put_txcr(adev, txdesc, clt, rate_cur); | ||
| 15070 | + | ||
| 15071 | + write_slavemem16 (adev, (u32) &(txdesc->total_length), cpu_to_le16(len)); | ||
| 15072 | + hostdesc2->length = cpu_to_le16(len - WLAN_HDR_A3_LEN); | ||
| 15073 | + if (IS_ACX111(adev)) { | ||
| 15074 | + /* note that if !txdesc->do_auto, txrate->cur | ||
| 15075 | + ** has only one nonzero bit */ | ||
| 15076 | + txdesc->u.r2.rate111 = cpu_to_le16( | ||
| 15077 | + rate_cur | ||
| 15078 | + /* WARNING: I was never able to make it work with prism54 AP. | ||
| 15079 | + ** It was falling down to 1Mbit where shortpre is not applicable, | ||
| 15080 | + ** and not working at all at "5,11 basic rates only" setting. | ||
| 15081 | + ** I even didn't see tx packets in radio packet capture. | ||
| 15082 | + ** Disabled for now --vda */ | ||
| 15083 | + /*| ((clt->shortpre && clt->cur!=RATE111_1) ? RATE111_SHORTPRE : 0) */ | ||
| 15084 | + ); | ||
| 15085 | +#ifdef TODO_FIGURE_OUT_WHEN_TO_SET_THIS | ||
| 15086 | + /* should add this to rate111 above as necessary */ | ||
| 15087 | + | (clt->pbcc511 ? RATE111_PBCC511 : 0) | ||
| 15088 | +#endif | ||
| 15089 | + hostdesc1->length = cpu_to_le16(len); | ||
| 15090 | + } else { /* ACX100 */ | ||
| 15091 | + u8 rate_100 = clt ? clt->rate_100 : adev->rate_bcast100; | ||
| 15092 | + write_slavemem8 (adev, (u32) &(txdesc->u.r1.rate), rate_100); | ||
| 15093 | +#ifdef TODO_FIGURE_OUT_WHEN_TO_SET_THIS | ||
| 15094 | + if (clt->pbcc511) { | ||
| 15095 | + if (n == RATE100_5 || n == RATE100_11) | ||
| 15096 | + n |= RATE100_PBCC511; | ||
| 15097 | + } | ||
| 15098 | + | ||
| 15099 | + if (clt->shortpre && (clt->cur != RATE111_1)) | ||
| 15100 | + SET_BIT(Ctl_8, DESC_CTL_SHORT_PREAMBLE); /* set Short Preamble */ | ||
| 15101 | +#endif | ||
| 15102 | + /* set autodma and reclaim and 1st mpdu */ | ||
| 15103 | + SET_BIT(Ctl_8, DESC_CTL_FIRSTFRAG); | ||
| 15104 | + | ||
| 15105 | +#if ACX_FRAGMENTATION | ||
| 15106 | + /* SET_BIT(Ctl2_8, DESC_CTL2_MORE_FRAG); cannot set it unconditionally, needs to be set for all non-last fragments */ | ||
| 15107 | +#endif | ||
| 15108 | + hostdesc1->length = cpu_to_le16(WLAN_HDR_A3_LEN); | ||
| 15109 | + | ||
| 15110 | + /* | ||
| 15111 | + * Since we're not using autodma copy the packet data to the acx now. | ||
| 15112 | + * Even host descriptors point to the packet header, and the odd indexed | ||
| 15113 | + * descriptor following points to the packet data. | ||
| 15114 | + * | ||
| 15115 | + * The first step is to find free memory in the ACX transmit buffers. | ||
| 15116 | + * They don't necessarily map one to one with the transmit queue entries, | ||
| 15117 | + * so search through them starting just after the last one used. | ||
| 15118 | + */ | ||
| 15119 | + addr = allocate_acx_txbuf_space (adev, len); | ||
| 15120 | + if (addr) { | ||
| 15121 | + chaincopy_to_slavemem (adev, addr, hostdesc1->data, len); | ||
| 15122 | + } | ||
| 15123 | + else { | ||
| 15124 | + /* | ||
| 15125 | + * Bummer. We thought we might have enough room in the transmit | ||
| 15126 | + * buffers to send this packet, but it turns out we don't. alloc_tx | ||
| 15127 | + * has already marked this transmit descriptor as HOSTOWN and ACXDONE, | ||
| 15128 | + * which means the ACX will hang when it gets to this descriptor unless | ||
| 15129 | + * we do something about it. Having a bubble in the transmit queue just | ||
| 15130 | + * doesn't seem to work, so we have to reset this transmit queue entry's | ||
| 15131 | + * state to its original value and back up our head pointer to point | ||
| 15132 | + * back to this entry. | ||
| 15133 | + */ | ||
| 15134 | + hostdesc1->length = 0; | ||
| 15135 | + hostdesc2->length = 0; | ||
| 15136 | + write_slavemem16 (adev, (u32) &(txdesc->total_length), 0); | ||
| 15137 | + write_slavemem8 (adev, (u32) &(txdesc->Ctl_8), DESC_CTL_HOSTOWN | DESC_CTL_FIRSTFRAG); | ||
| 15138 | + adev->tx_head = ((u8*) txdesc - (u8*) adev->txdesc_start) / adev->txdesc_size; | ||
| 15139 | + goto end; | ||
| 15140 | + } | ||
| 15141 | + /* | ||
| 15142 | + * Tell the ACX where the packet is. | ||
| 15143 | + */ | ||
| 15144 | + write_slavemem32 (adev, (u32) &(txdesc->AcxMemPtr), addr); | ||
| 15145 | + | ||
| 15146 | + } | ||
| 15147 | + /* don't need to clean ack/rts statistics here, already | ||
| 15148 | + * done on descr cleanup */ | ||
| 15149 | + | ||
| 15150 | + /* clears HOSTOWN and ACXDONE bits, thus telling that the descriptors | ||
| 15151 | + * are now owned by the acx100; do this as LAST operation */ | ||
| 15152 | + CLEAR_BIT(Ctl_8, DESC_CTL_ACXDONE_HOSTOWN); | ||
| 15153 | + /* flush writes before we release hostdesc to the adapter here */ | ||
| 15154 | + //wmb(); | ||
| 15155 | + | ||
| 15156 | + /* write back modified flags */ | ||
| 15157 | + /* | ||
| 15158 | + * At this point Ctl_8 should just be FIRSTFRAG | ||
| 15159 | + */ | ||
| 15160 | + write_slavemem8 (adev, (u32) &(txdesc->Ctl2_8),Ctl2_8); | ||
| 15161 | + write_slavemem8 (adev, (u32) &(txdesc->Ctl_8), Ctl_8); | ||
| 15162 | + /* unused: txdesc->tx_time = cpu_to_le32(jiffies); */ | ||
| 15163 | + | ||
| 15164 | + /* | ||
| 15165 | + * Update the queue indicator to say there's data on the first queue. | ||
| 15166 | + */ | ||
| 15167 | + acxmem_update_queue_indicator (adev, 0); | ||
| 15168 | + | ||
| 15169 | + /* flush writes before we tell the adapter that it's its turn now */ | ||
| 15170 | + mmiowb(); | ||
| 15171 | + write_reg16(adev, IO_ACX_INT_TRIG, INT_TRIG_TXPRC); | ||
| 15172 | + write_flush(adev); | ||
| 15173 | + | ||
| 15174 | + /* log the packet content AFTER sending it, | ||
| 15175 | + * in order to not delay sending any further than absolutely needed | ||
| 15176 | + * Do separate logs for acx100/111 to have human-readable rates */ | ||
| 15177 | + if (unlikely(acx_debug & (L_XFER|L_DATA))) { | ||
| 15178 | + u16 fc = ((wlan_hdr_t*)hostdesc1->data)->fc; | ||
| 15179 | + if (IS_ACX111(adev)) | ||
| 15180 | + printk("tx: pkt (%s): len %d " | ||
| 15181 | + "rate %04X%s status %u\n", | ||
| 15182 | + acx_get_packet_type_string(le16_to_cpu(fc)), len, | ||
| 15183 | + le16_to_cpu(txdesc->u.r2.rate111), | ||
| 15184 | + (le16_to_cpu(txdesc->u.r2.rate111) & RATE111_SHORTPRE) ? "(SPr)" : "", | ||
| 15185 | + adev->status); | ||
| 15186 | + else | ||
| 15187 | + printk("tx: pkt (%s): len %d rate %03u%s status %u\n", | ||
| 15188 | + acx_get_packet_type_string(fc), len, | ||
| 15189 | + read_slavemem8 (adev, (u32) &(txdesc->u.r1.rate)), | ||
| 15190 | + (Ctl_8 & DESC_CTL_SHORT_PREAMBLE) ? "(SPr)" : "", | ||
| 15191 | + adev->status); | ||
| 15192 | + | ||
| 15193 | + if (acx_debug & L_DATA) { | ||
| 15194 | + printk("tx: 802.11 [%d]: ", len); | ||
| 15195 | + acx_dump_bytes(hostdesc1->data, len); | ||
| 15196 | + } | ||
| 15197 | + } | ||
| 15198 | +end: | ||
| 15199 | + FN_EXIT0; | ||
| 15200 | +} | ||
| 15201 | + | ||
| 15202 | + | ||
| 15203 | +/*********************************************************************** | ||
| 15204 | +** acxmem_l_clean_txdesc | ||
| 15205 | +** | ||
| 15206 | +** This function resets the txdescs' status when the ACX100 | ||
| 15207 | +** signals the TX done IRQ (txdescs have been processed), starting with | ||
| 15208 | +** the pool index of the descriptor which we would use next, | ||
| 15209 | +** in order to make sure that we can be as fast as possible | ||
| 15210 | +** in filling new txdescs. | ||
| 15211 | +** Everytime we get called we know where the next packet to be cleaned is. | ||
| 15212 | +*/ | ||
| 15213 | + | ||
| 15214 | +#if !ACX_DEBUG | ||
| 15215 | +static inline void log_txbuffer(const acx_device_t *adev) {} | ||
| 15216 | +#else | ||
| 15217 | +static void | ||
| 15218 | +log_txbuffer(acx_device_t *adev) | ||
| 15219 | +{ | ||
| 15220 | + txdesc_t *txdesc; | ||
| 15221 | + int i; | ||
| 15222 | + u8 Ctl_8; | ||
| 15223 | + | ||
| 15224 | + /* no FN_ENTER here, we don't want that */ | ||
| 15225 | + /* no locks here, since it's entirely non-critical code */ | ||
| 15226 | + txdesc = adev->txdesc_start; | ||
| 15227 | + if (unlikely(!txdesc)) return; | ||
| 15228 | + printk("tx: desc->Ctl8's:"); | ||
| 15229 | + for (i = 0; i < TX_CNT; i++) { | ||
| 15230 | + Ctl_8 = read_slavemem8 (adev, (u32) &(txdesc->Ctl_8)); | ||
| 15231 | + printk(" %02X", Ctl_8); | ||
| 15232 | + txdesc = advance_txdesc(adev, txdesc, 1); | ||
| 15233 | + } | ||
| 15234 | + printk("\n"); | ||
| 15235 | +} | ||
| 15236 | +#endif | ||
| 15237 | + | ||
| 15238 | + | ||
| 15239 | +static void | ||
| 15240 | +handle_tx_error(acx_device_t *adev, u8 error, unsigned int finger) | ||
| 15241 | +{ | ||
| 15242 | + const char *err = "unknown error"; | ||
| 15243 | + | ||
| 15244 | + /* hmm, should we handle this as a mask | ||
| 15245 | + * of *several* bits? | ||
| 15246 | + * For now I think only caring about | ||
| 15247 | + * individual bits is ok... */ | ||
| 15248 | + switch (error) { | ||
| 15249 | + case 0x01: | ||
| 15250 | + err = "no Tx due to error in other fragment"; | ||
| 15251 | + adev->wstats.discard.fragment++; | ||
| 15252 | + break; | ||
| 15253 | + case 0x02: | ||
| 15254 | + err = "Tx aborted"; | ||
| 15255 | + adev->stats.tx_aborted_errors++; | ||
| 15256 | + break; | ||
| 15257 | + case 0x04: | ||
| 15258 | + err = "Tx desc wrong parameters"; | ||
| 15259 | + adev->wstats.discard.misc++; | ||
| 15260 | + break; | ||
| 15261 | + case 0x08: | ||
| 15262 | + err = "WEP key not found"; | ||
| 15263 | + adev->wstats.discard.misc++; | ||
| 15264 | + break; | ||
| 15265 | + case 0x10: | ||
| 15266 | + err = "MSDU lifetime timeout? - try changing " | ||
| 15267 | + "'iwconfig retry lifetime XXX'"; | ||
| 15268 | + adev->wstats.discard.misc++; | ||
| 15269 | + break; | ||
| 15270 | + case 0x20: | ||
| 15271 | + err = "excessive Tx retries due to either distance " | ||
| 15272 | + "too high or unable to Tx or Tx frame error - " | ||
| 15273 | + "try changing 'iwconfig txpower XXX' or " | ||
| 15274 | + "'sens'itivity or 'retry'"; | ||
| 15275 | + adev->wstats.discard.retries++; | ||
| 15276 | + /* Tx error 0x20 also seems to occur on | ||
| 15277 | + * overheating, so I'm not sure whether we | ||
| 15278 | + * actually want to do aggressive radio recalibration, | ||
| 15279 | + * since people maybe won't notice then that their hardware | ||
| 15280 | + * is slowly getting cooked... | ||
| 15281 | + * Or is it still a safe long distance from utter | ||
| 15282 | + * radio non-functionality despite many radio recalibs | ||
| 15283 | + * to final destructive overheating of the hardware? | ||
| 15284 | + * In this case we really should do recalib here... | ||
| 15285 | + * I guess the only way to find out is to do a | ||
| 15286 | + * potentially fatal self-experiment :-\ | ||
| 15287 | + * Or maybe only recalib in case we're using Tx | ||
| 15288 | + * rate auto (on errors switching to lower speed | ||
| 15289 | + * --> less heat?) or 802.11 power save mode? | ||
| 15290 | + * | ||
| 15291 | + * ok, just do it. */ | ||
| 15292 | + if (++adev->retry_errors_msg_ratelimit % 4 == 0) { | ||
| 15293 | + if (adev->retry_errors_msg_ratelimit <= 20) { | ||
| 15294 | + printk("%s: several excessive Tx " | ||
| 15295 | + "retry errors occurred, attempting " | ||
| 15296 | + "to recalibrate radio. Radio " | ||
| 15297 | + "drift might be caused by increasing " | ||
| 15298 | + "card temperature, please check the card " | ||
| 15299 | + "before it's too late!\n", | ||
| 15300 | + adev->ndev->name); | ||
| 15301 | + if (adev->retry_errors_msg_ratelimit == 20) | ||
| 15302 | + printk("disabling above message\n"); | ||
| 15303 | + } | ||
| 15304 | + | ||
| 15305 | + acx_schedule_task(adev, ACX_AFTER_IRQ_CMD_RADIO_RECALIB); | ||
| 15306 | + } | ||
| 15307 | + break; | ||
| 15308 | + case 0x40: | ||
| 15309 | + err = "Tx buffer overflow"; | ||
| 15310 | + adev->stats.tx_fifo_errors++; | ||
| 15311 | + break; | ||
| 15312 | + case 0x80: | ||
| 15313 | + err = "DMA error"; | ||
| 15314 | + adev->wstats.discard.misc++; | ||
| 15315 | + break; | ||
| 15316 | + } | ||
| 15317 | + adev->stats.tx_errors++; | ||
| 15318 | + if (adev->stats.tx_errors <= 20) | ||
| 15319 | + printk("%s: tx error 0x%02X, buf %02u! (%s)\n", | ||
| 15320 | + adev->ndev->name, error, finger, err); | ||
| 15321 | + else | ||
| 15322 | + printk("%s: tx error 0x%02X, buf %02u!\n", | ||
| 15323 | + adev->ndev->name, error, finger); | ||
| 15324 | +} | ||
| 15325 | + | ||
| 15326 | + | ||
| 15327 | +unsigned int | ||
| 15328 | +acxmem_l_clean_txdesc(acx_device_t *adev) | ||
| 15329 | +{ | ||
| 15330 | + txdesc_t *txdesc; | ||
| 15331 | + unsigned finger; | ||
| 15332 | + int num_cleaned; | ||
| 15333 | + u16 r111; | ||
| 15334 | + u8 error, ack_failures, rts_failures, rts_ok, r100, Ctl_8; | ||
| 15335 | + u32 acxmem; | ||
| 15336 | + txdesc_t tmptxdesc; | ||
| 15337 | + | ||
| 15338 | + FN_ENTER; | ||
| 15339 | + | ||
| 15340 | + /* | ||
| 15341 | + * Set up a template descriptor for re-initialization. The only | ||
| 15342 | + * things that get set are Ctl_8 and the rate, and the rate defaults | ||
| 15343 | + * to 1Mbps. | ||
| 15344 | + */ | ||
| 15345 | + memset (&tmptxdesc, 0, sizeof (tmptxdesc)); | ||
| 15346 | + tmptxdesc.Ctl_8 = DESC_CTL_HOSTOWN | DESC_CTL_FIRSTFRAG; | ||
| 15347 | + tmptxdesc.u.r1.rate = 0x0a; | ||
| 15348 | + | ||
| 15349 | + if (unlikely(acx_debug & L_DEBUG)) | ||
| 15350 | + log_txbuffer(adev); | ||
| 15351 | + | ||
| 15352 | + log(L_BUFT, "tx: cleaning up bufs from %u\n", adev->tx_tail); | ||
| 15353 | + | ||
| 15354 | + /* We know first descr which is not free yet. We advance it as far | ||
| 15355 | + ** as we see correct bits set in following descs (if next desc | ||
| 15356 | + ** is NOT free, we shouldn't advance at all). We know that in | ||
| 15357 | + ** front of tx_tail may be "holes" with isolated free descs. | ||
| 15358 | + ** We will catch up when all intermediate descs will be freed also */ | ||
| 15359 | + | ||
| 15360 | + finger = adev->tx_tail; | ||
| 15361 | + num_cleaned = 0; | ||
| 15362 | + while (likely(finger != adev->tx_head)) { | ||
| 15363 | + txdesc = get_txdesc(adev, finger); | ||
| 15364 | + | ||
| 15365 | + /* If we allocated txdesc on tx path but then decided | ||
| 15366 | + ** to NOT use it, then it will be left as a free "bubble" | ||
| 15367 | + ** in the "allocated for tx" part of the ring. | ||
| 15368 | + ** We may meet it on the next ring pass here. */ | ||
| 15369 | + | ||
| 15370 | + /* stop if not marked as "tx finished" and "host owned" */ | ||
| 15371 | + Ctl_8 = read_slavemem8 (adev, (u32) &(txdesc->Ctl_8)); | ||
| 15372 | + if ((Ctl_8 & DESC_CTL_ACXDONE_HOSTOWN) | ||
| 15373 | + != DESC_CTL_ACXDONE_HOSTOWN) { | ||
| 15374 | + if (unlikely(!num_cleaned)) { /* maybe remove completely */ | ||
| 15375 | + log(L_BUFT, "clean_txdesc: tail isn't free. " | ||
| 15376 | + "tail:%d head:%d\n", | ||
| 15377 | + adev->tx_tail, adev->tx_head); | ||
| 15378 | + } | ||
| 15379 | + break; | ||
| 15380 | + } | ||
| 15381 | + | ||
| 15382 | + /* remember desc values... */ | ||
| 15383 | + error = read_slavemem8 (adev, (u32) &(txdesc->error)); | ||
| 15384 | + ack_failures = read_slavemem8 (adev, (u32) &(txdesc->ack_failures)); | ||
| 15385 | + rts_failures = read_slavemem8 (adev, (u32) &(txdesc->u.rts.rts_failures)); | ||
| 15386 | + rts_ok = read_slavemem8 (adev, (u32) &(txdesc->u.rts.rts_ok)); | ||
| 15387 | + r100 = read_slavemem8 (adev, (u32) &(txdesc->u.r1.rate)); | ||
| 15388 | + r111 = le16_to_cpu(read_slavemem16 (adev, (u32) &(txdesc->u.r2.rate111))); | ||
| 15389 | + | ||
| 15390 | + /* need to check for certain error conditions before we | ||
| 15391 | + * clean the descriptor: we still need valid descr data here */ | ||
| 15392 | + if (unlikely(0x30 & error)) { | ||
| 15393 | + /* only send IWEVTXDROP in case of retry or lifetime exceeded; | ||
| 15394 | + * all other errors mean we screwed up locally */ | ||
| 15395 | + union iwreq_data wrqu; | ||
| 15396 | + wlan_hdr_t *hdr; | ||
| 15397 | + txhostdesc_t *hostdesc; | ||
| 15398 | + | ||
| 15399 | + hostdesc = get_txhostdesc(adev, txdesc); | ||
| 15400 | + hdr = (wlan_hdr_t *)hostdesc->data; | ||
| 15401 | + MAC_COPY(wrqu.addr.sa_data, hdr->a1); | ||
| 15402 | + wireless_send_event(adev->ndev, IWEVTXDROP, &wrqu, NULL); | ||
| 15403 | + } | ||
| 15404 | + | ||
| 15405 | + /* | ||
| 15406 | + * Free up the transmit data buffers | ||
| 15407 | + */ | ||
| 15408 | + acxmem = read_slavemem32 (adev, (u32) &(txdesc->AcxMemPtr)); | ||
| 15409 | + if (acxmem) { | ||
| 15410 | + reclaim_acx_txbuf_space (adev, acxmem); | ||
| 15411 | + } | ||
| 15412 | + | ||
| 15413 | + /* ...and free the desc by clearing all the fields | ||
| 15414 | + except the next pointer */ | ||
| 15415 | + copy_to_slavemem (adev, | ||
| 15416 | + (u32) &(txdesc->HostMemPtr), | ||
| 15417 | + (u8 *) &(tmptxdesc.HostMemPtr), | ||
| 15418 | + sizeof (tmptxdesc) - sizeof(tmptxdesc.pNextDesc) | ||
| 15419 | + ); | ||
| 15420 | + | ||
| 15421 | + adev->tx_free++; | ||
| 15422 | + num_cleaned++; | ||
| 15423 | + | ||
| 15424 | + if ((adev->tx_free >= TX_START_QUEUE) | ||
| 15425 | + && (adev->status == ACX_STATUS_4_ASSOCIATED) | ||
| 15426 | + && (acx_queue_stopped(adev->ndev)) | ||
| 15427 | + ) { | ||
| 15428 | + log(L_BUF, "tx: wake queue (avail. Tx desc %u)\n", | ||
| 15429 | + adev->tx_free); | ||
| 15430 | + acx_wake_queue(adev->ndev, NULL); | ||
| 15431 | + } | ||
| 15432 | + | ||
| 15433 | + /* do error checking, rate handling and logging | ||
| 15434 | + * AFTER having done the work, it's faster */ | ||
| 15435 | + | ||
| 15436 | + /* do rate handling */ | ||
| 15437 | + if (adev->rate_auto) { | ||
| 15438 | + struct client *clt = get_txc(adev, txdesc); | ||
| 15439 | + if (clt) { | ||
| 15440 | + u16 cur = get_txr(adev, txdesc); | ||
| 15441 | + if (clt->rate_cur == cur) { | ||
| 15442 | + acx_l_handle_txrate_auto(adev, clt, | ||
| 15443 | + cur, /* intended rate */ | ||
| 15444 | + r100, r111, /* actually used rate */ | ||
| 15445 | + (error & 0x30), /* was there an error? */ | ||
| 15446 | + TX_CNT + TX_CLEAN_BACKLOG - adev->tx_free); | ||
| 15447 | + } | ||
| 15448 | + } | ||
| 15449 | + } | ||
| 15450 | + | ||
| 15451 | + if (unlikely(error)) | ||
| 15452 | + handle_tx_error(adev, error, finger); | ||
| 15453 | + | ||
| 15454 | + if (IS_ACX111(adev)) | ||
| 15455 | + log(L_BUFT, "tx: cleaned %u: !ACK=%u !RTS=%u RTS=%u r111=%04X\n", | ||
| 15456 | + finger, ack_failures, rts_failures, rts_ok, r111); | ||
| 15457 | + else | ||
| 15458 | + log(L_BUFT, "tx: cleaned %u: !ACK=%u !RTS=%u RTS=%u rate=%u\n", | ||
| 15459 | + finger, ack_failures, rts_failures, rts_ok, r100); | ||
| 15460 | + | ||
| 15461 | + /* update pointer for descr to be cleaned next */ | ||
| 15462 | + finger = (finger + 1) % TX_CNT; | ||
| 15463 | + } | ||
| 15464 | + | ||
| 15465 | + /* remember last position */ | ||
| 15466 | + adev->tx_tail = finger; | ||
| 15467 | +/* end: */ | ||
| 15468 | + FN_EXIT1(num_cleaned); | ||
| 15469 | + return num_cleaned; | ||
| 15470 | +} | ||
| 15471 | + | ||
| 15472 | +/* clean *all* Tx descriptors, and regardless of their previous state. | ||
| 15473 | + * Used for brute-force reset handling. */ | ||
| 15474 | +void | ||
| 15475 | +acxmem_l_clean_txdesc_emergency(acx_device_t *adev) | ||
| 15476 | +{ | ||
| 15477 | + txdesc_t *txdesc; | ||
| 15478 | + int i; | ||
| 15479 | + u32 acxmem; | ||
| 15480 | + | ||
| 15481 | + FN_ENTER; | ||
| 15482 | + | ||
| 15483 | + for (i = 0; i < TX_CNT; i++) { | ||
| 15484 | + txdesc = get_txdesc(adev, i); | ||
| 15485 | + | ||
| 15486 | + /* free it */ | ||
| 15487 | + write_slavemem8 (adev, (u32) &(txdesc->ack_failures), 0); | ||
| 15488 | + write_slavemem8 (adev, (u32) &(txdesc->u.rts.rts_failures), 0); | ||
| 15489 | + write_slavemem8 (adev, (u32) &(txdesc->u.rts.rts_ok), 0); | ||
| 15490 | + write_slavemem8 (adev, (u32) &(txdesc->error), 0); | ||
| 15491 | + write_slavemem8 (adev, (u32) &(txdesc->Ctl_8), DESC_CTL_HOSTOWN); | ||
| 15492 | + | ||
| 15493 | + /* | ||
| 15494 | + * Clean up the memory allocated on the ACX for this transmit descriptor. | ||
| 15495 | + */ | ||
| 15496 | + acxmem = read_slavemem32 (adev, (u32) &(txdesc->AcxMemPtr)); | ||
| 15497 | + if (acxmem) { | ||
| 15498 | + reclaim_acx_txbuf_space (adev, acxmem); | ||
| 15499 | + } | ||
| 15500 | + | ||
| 15501 | + write_slavemem32 (adev, (u32) &(txdesc->AcxMemPtr), 0); | ||
| 15502 | + } | ||
| 15503 | + | ||
| 15504 | + adev->tx_free = TX_CNT; | ||
| 15505 | + | ||
| 15506 | + FN_EXIT0; | ||
| 15507 | +} | ||
| 15508 | + | ||
| 15509 | + | ||
| 15510 | +/*********************************************************************** | ||
| 15511 | +** acxmem_s_create_tx_host_desc_queue | ||
| 15512 | +*/ | ||
| 15513 | + | ||
| 15514 | +static void* | ||
| 15515 | +allocate(acx_device_t *adev, size_t size, dma_addr_t *phy, const char *msg) | ||
| 15516 | +{ | ||
| 15517 | + void *ptr; | ||
| 15518 | + ptr = kmalloc (size, GFP_KERNEL); | ||
| 15519 | + /* | ||
| 15520 | + * The ACX can't use the physical address, so we'll have to fake it | ||
| 15521 | + * later and it might be handy to have the virtual address. | ||
| 15522 | + */ | ||
| 15523 | + *phy = (dma_addr_t) NULL; | ||
| 15524 | + | ||
| 15525 | + if (ptr) { | ||
| 15526 | + log(L_DEBUG, "%s sz=%d adr=0x%p phy=0x%08llx\n", | ||
| 15527 | + msg, (int)size, ptr, (unsigned long long)*phy); | ||
| 15528 | + memset(ptr, 0, size); | ||
| 15529 | + return ptr; | ||
| 15530 | + } | ||
| 15531 | + printk(KERN_ERR "acx: %s allocation FAILED (%d bytes)\n", | ||
| 15532 | + msg, (int)size); | ||
| 15533 | + return NULL; | ||
| 15534 | +} | ||
| 15535 | + | ||
| 15536 | + | ||
| 15537 | +/* | ||
| 15538 | + * In the generic slave memory access mode, most of the stuff in | ||
| 15539 | + * the txhostdesc_t is unused. It's only here because the rest of | ||
| 15540 | + * the ACX driver expects it to be since the PCI version uses indirect | ||
| 15541 | + * host memory organization with DMA. Since we're not using DMA the | ||
| 15542 | + * only use we have for the host descriptors is to store the packets | ||
| 15543 | + * on the way out. | ||
| 15544 | + */ | ||
| 15545 | +static int | ||
| 15546 | +acxmem_s_create_tx_host_desc_queue(acx_device_t *adev) | ||
| 15547 | +{ | ||
| 15548 | + txhostdesc_t *hostdesc; | ||
| 15549 | + u8 *txbuf; | ||
| 15550 | + int i; | ||
| 15551 | + | ||
| 15552 | + FN_ENTER; | ||
| 15553 | + | ||
| 15554 | + /* allocate TX buffer */ | ||
| 15555 | + adev->txbuf_area_size = TX_CNT * WLAN_A4FR_MAXLEN_WEP_FCS; | ||
| 15556 | + | ||
| 15557 | + adev->txbuf_start = allocate(adev, adev->txbuf_area_size, | ||
| 15558 | + &adev->txbuf_startphy, "txbuf_start"); | ||
| 15559 | + if (!adev->txbuf_start) | ||
| 15560 | + goto fail; | ||
| 15561 | + | ||
| 15562 | + /* allocate the TX host descriptor queue pool */ | ||
| 15563 | + adev->txhostdesc_area_size = TX_CNT * 2*sizeof(*hostdesc); | ||
| 15564 | + | ||
| 15565 | + adev->txhostdesc_start = allocate(adev, adev->txhostdesc_area_size, | ||
| 15566 | + &adev->txhostdesc_startphy, "txhostdesc_start"); | ||
| 15567 | + if (!adev->txhostdesc_start) | ||
| 15568 | + goto fail; | ||
| 15569 | + | ||
| 15570 | + /* check for proper alignment of TX host descriptor pool */ | ||
| 15571 | + if ((long) adev->txhostdesc_start & 3) { | ||
| 15572 | + printk("acx: driver bug: dma alloc returns unaligned address\n"); | ||
| 15573 | + goto fail; | ||
| 15574 | + } | ||
| 15575 | + | ||
| 15576 | + hostdesc = adev->txhostdesc_start; | ||
| 15577 | + txbuf = adev->txbuf_start; | ||
| 15578 | + | ||
| 15579 | +#if 0 | ||
| 15580 | +/* Each tx buffer is accessed by hardware via | ||
| 15581 | +** txdesc -> txhostdesc(s) -> txbuffer(s). | ||
| 15582 | +** We use only one txhostdesc per txdesc, but it looks like | ||
| 15583 | +** acx111 is buggy: it accesses second txhostdesc | ||
| 15584 | +** (via hostdesc.desc_phy_next field) even if | ||
| 15585 | +** txdesc->length == hostdesc->length and thus | ||
| 15586 | +** entire packet was placed into first txhostdesc. | ||
| 15587 | +** Due to this bug acx111 hangs unless second txhostdesc | ||
| 15588 | +** has le16_to_cpu(hostdesc.length) = 3 (or larger) | ||
| 15589 | +** Storing NULL into hostdesc.desc_phy_next | ||
| 15590 | +** doesn't seem to help. | ||
| 15591 | +** | ||
| 15592 | +** Update: although it worked on Xterasys XN-2522g | ||
| 15593 | +** with len=3 trick, WG311v2 is even more bogus, doesn't work. | ||
| 15594 | +** Keeping this code (#ifdef'ed out) for documentational purposes. | ||
| 15595 | +*/ | ||
| 15596 | + for (i = 0; i < TX_CNT*2; i++) { | ||
| 15597 | + hostdesc_phy += sizeof(*hostdesc); | ||
| 15598 | + if (!(i & 1)) { | ||
| 15599 | + hostdesc->data_phy = cpu2acx(txbuf_phy); | ||
| 15600 | + /* hostdesc->data_offset = ... */ | ||
| 15601 | + /* hostdesc->reserved = ... */ | ||
| 15602 | + hostdesc->Ctl_16 = cpu_to_le16(DESC_CTL_HOSTOWN); | ||
| 15603 | + /* hostdesc->length = ... */ | ||
| 15604 | + hostdesc->desc_phy_next = cpu2acx(hostdesc_phy); | ||
| 15605 | + hostdesc->pNext = ptr2acx(NULL); | ||
| 15606 | + /* hostdesc->Status = ... */ | ||
| 15607 | + /* below: non-hardware fields */ | ||
| 15608 | + hostdesc->data = txbuf; | ||
| 15609 | + | ||
| 15610 | + txbuf += WLAN_A4FR_MAXLEN_WEP_FCS; | ||
| 15611 | + txbuf_phy += WLAN_A4FR_MAXLEN_WEP_FCS; | ||
| 15612 | + } else { | ||
| 15613 | + /* hostdesc->data_phy = ... */ | ||
| 15614 | + /* hostdesc->data_offset = ... */ | ||
| 15615 | + /* hostdesc->reserved = ... */ | ||
| 15616 | + /* hostdesc->Ctl_16 = ... */ | ||
| 15617 | + hostdesc->length = cpu_to_le16(3); /* bug workaround */ | ||
| 15618 | + /* hostdesc->desc_phy_next = ... */ | ||
| 15619 | + /* hostdesc->pNext = ... */ | ||
| 15620 | + /* hostdesc->Status = ... */ | ||
| 15621 | + /* below: non-hardware fields */ | ||
| 15622 | + /* hostdesc->data = ... */ | ||
| 15623 | + } | ||
| 15624 | + hostdesc++; | ||
| 15625 | + } | ||
| 15626 | +#endif | ||
| 15627 | +/* We initialize two hostdescs so that they point to adjacent | ||
| 15628 | +** memory areas. Thus txbuf is really just a contiguous memory area */ | ||
| 15629 | + for (i = 0; i < TX_CNT*2; i++) { | ||
| 15630 | + /* ->data is a non-hardware field: */ | ||
| 15631 | + hostdesc->data = txbuf; | ||
| 15632 | + | ||
| 15633 | + if (!(i & 1)) { | ||
| 15634 | + txbuf += WLAN_HDR_A3_LEN; | ||
| 15635 | + } else { | ||
| 15636 | + txbuf += WLAN_A4FR_MAXLEN_WEP_FCS - WLAN_HDR_A3_LEN; | ||
| 15637 | + } | ||
| 15638 | + hostdesc++; | ||
| 15639 | + } | ||
| 15640 | + hostdesc--; | ||
| 15641 | + | ||
| 15642 | + FN_EXIT1(OK); | ||
| 15643 | + return OK; | ||
| 15644 | +fail: | ||
| 15645 | + printk("acx: create_tx_host_desc_queue FAILED\n"); | ||
| 15646 | + /* dealloc will be done by free function on error case */ | ||
| 15647 | + FN_EXIT1(NOT_OK); | ||
| 15648 | + return NOT_OK; | ||
| 15649 | +} | ||
| 15650 | + | ||
| 15651 | + | ||
| 15652 | +/*************************************************************** | ||
| 15653 | +** acxmem_s_create_rx_host_desc_queue | ||
| 15654 | +*/ | ||
| 15655 | +/* the whole size of a data buffer (header plus data body) | ||
| 15656 | + * plus 32 bytes safety offset at the end */ | ||
| 15657 | +#define RX_BUFFER_SIZE (sizeof(rxbuffer_t) + 32) | ||
| 15658 | + | ||
| 15659 | +static int | ||
| 15660 | +acxmem_s_create_rx_host_desc_queue(acx_device_t *adev) | ||
| 15661 | +{ | ||
| 15662 | + rxhostdesc_t *hostdesc; | ||
| 15663 | + rxbuffer_t *rxbuf; | ||
| 15664 | + int i; | ||
| 15665 | + | ||
| 15666 | + FN_ENTER; | ||
| 15667 | + | ||
| 15668 | + /* allocate the RX host descriptor queue pool */ | ||
| 15669 | + adev->rxhostdesc_area_size = RX_CNT * sizeof(*hostdesc); | ||
| 15670 | + | ||
| 15671 | + adev->rxhostdesc_start = allocate(adev, adev->rxhostdesc_area_size, | ||
| 15672 | + &adev->rxhostdesc_startphy, "rxhostdesc_start"); | ||
| 15673 | + if (!adev->rxhostdesc_start) | ||
| 15674 | + goto fail; | ||
| 15675 | + | ||
| 15676 | + /* check for proper alignment of RX host descriptor pool */ | ||
| 15677 | + if ((long) adev->rxhostdesc_start & 3) { | ||
| 15678 | + printk("acx: driver bug: dma alloc returns unaligned address\n"); | ||
| 15679 | + goto fail; | ||
| 15680 | + } | ||
| 15681 | + | ||
| 15682 | + /* allocate Rx buffer pool which will be used by the acx | ||
| 15683 | + * to store the whole content of the received frames in it */ | ||
| 15684 | + adev->rxbuf_area_size = RX_CNT * RX_BUFFER_SIZE; | ||
| 15685 | + | ||
| 15686 | + adev->rxbuf_start = allocate(adev, adev->rxbuf_area_size, | ||
| 15687 | + &adev->rxbuf_startphy, "rxbuf_start"); | ||
| 15688 | + if (!adev->rxbuf_start) | ||
| 15689 | + goto fail; | ||
| 15690 | + | ||
| 15691 | + rxbuf = adev->rxbuf_start; | ||
| 15692 | + hostdesc = adev->rxhostdesc_start; | ||
| 15693 | + | ||
| 15694 | + /* don't make any popular C programming pointer arithmetic mistakes | ||
| 15695 | + * here, otherwise I'll kill you... | ||
| 15696 | + * (and don't dare asking me why I'm warning you about that...) */ | ||
| 15697 | + for (i = 0; i < RX_CNT; i++) { | ||
| 15698 | + hostdesc->data = rxbuf; | ||
| 15699 | + hostdesc->length = cpu_to_le16(RX_BUFFER_SIZE); | ||
| 15700 | + rxbuf++; | ||
| 15701 | + hostdesc++; | ||
| 15702 | + } | ||
| 15703 | + hostdesc--; | ||
| 15704 | + FN_EXIT1(OK); | ||
| 15705 | + return OK; | ||
| 15706 | +fail: | ||
| 15707 | + printk("acx: create_rx_host_desc_queue FAILED\n"); | ||
| 15708 | + /* dealloc will be done by free function on error case */ | ||
| 15709 | + FN_EXIT1(NOT_OK); | ||
| 15710 | + return NOT_OK; | ||
| 15711 | +} | ||
| 15712 | + | ||
| 15713 | + | ||
| 15714 | +/*************************************************************** | ||
| 15715 | +** acxmem_s_create_hostdesc_queues | ||
| 15716 | +*/ | ||
| 15717 | +int | ||
| 15718 | +acxmem_s_create_hostdesc_queues(acx_device_t *adev) | ||
| 15719 | +{ | ||
| 15720 | + int result; | ||
| 15721 | + result = acxmem_s_create_tx_host_desc_queue(adev); | ||
| 15722 | + if (OK != result) return result; | ||
| 15723 | + result = acxmem_s_create_rx_host_desc_queue(adev); | ||
| 15724 | + return result; | ||
| 15725 | +} | ||
| 15726 | + | ||
| 15727 | + | ||
| 15728 | +/*************************************************************** | ||
| 15729 | +** acxmem_create_tx_desc_queue | ||
| 15730 | +*/ | ||
| 15731 | +static void | ||
| 15732 | +acxmem_create_tx_desc_queue(acx_device_t *adev, u32 tx_queue_start) | ||
| 15733 | +{ | ||
| 15734 | + txdesc_t *txdesc; | ||
| 15735 | + u32 clr; | ||
| 15736 | + int i; | ||
| 15737 | + | ||
| 15738 | + FN_ENTER; | ||
| 15739 | + | ||
| 15740 | + if (IS_ACX100(adev)) | ||
| 15741 | + adev->txdesc_size = sizeof(*txdesc); | ||
| 15742 | + else | ||
| 15743 | + /* the acx111 txdesc is 4 bytes larger */ | ||
| 15744 | + adev->txdesc_size = sizeof(*txdesc) + 4; | ||
| 15745 | + | ||
| 15746 | + /* | ||
| 15747 | + * This refers to an ACX address, not one of ours | ||
| 15748 | + */ | ||
| 15749 | + adev->txdesc_start = (txdesc_t *) tx_queue_start; | ||
| 15750 | + | ||
| 15751 | + log(L_DEBUG, "adev->txdesc_start=%p\n", | ||
| 15752 | + adev->txdesc_start); | ||
| 15753 | + | ||
| 15754 | + adev->tx_free = TX_CNT; | ||
| 15755 | + /* done by memset: adev->tx_head = 0; */ | ||
| 15756 | + /* done by memset: adev->tx_tail = 0; */ | ||
| 15757 | + txdesc = adev->txdesc_start; | ||
| 15758 | + | ||
| 15759 | + if (IS_ACX111(adev)) { | ||
| 15760 | + /* ACX111 has a preinitialized Tx buffer! */ | ||
| 15761 | + /* loop over whole send pool */ | ||
| 15762 | + /* FIXME: do we have to do the hostmemptr stuff here?? */ | ||
| 15763 | + for (i = 0; i < TX_CNT; i++) { | ||
| 15764 | + txdesc->Ctl_8 = DESC_CTL_HOSTOWN; | ||
| 15765 | + /* reserve two (hdr desc and payload desc) */ | ||
| 15766 | + txdesc = advance_txdesc(adev, txdesc, 1); | ||
| 15767 | + } | ||
| 15768 | + } else { | ||
| 15769 | + /* ACX100 Tx buffer needs to be initialized by us */ | ||
| 15770 | + /* clear whole send pool. sizeof is safe here (we are acx100) */ | ||
| 15771 | + | ||
| 15772 | + /* | ||
| 15773 | + * adev->txdesc_start refers to device memory, so we can't write | ||
| 15774 | + * directly to it. | ||
| 15775 | + */ | ||
| 15776 | + clr = (u32) adev->txdesc_start; | ||
| 15777 | + while (clr < (u32) adev->txdesc_start + (TX_CNT * sizeof(*txdesc))) { | ||
| 15778 | + write_slavemem32 (adev, clr, 0); | ||
| 15779 | + clr += 4; | ||
| 15780 | + } | ||
| 15781 | + | ||
| 15782 | + /* loop over whole send pool */ | ||
| 15783 | + for (i = 0; i < TX_CNT; i++) { | ||
| 15784 | + log(L_DEBUG, "configure card tx descriptor: 0x%p, " | ||
| 15785 | + "size: 0x%X\n", txdesc, adev->txdesc_size); | ||
| 15786 | + | ||
| 15787 | + /* initialise ctl */ | ||
| 15788 | + /* | ||
| 15789 | + * No auto DMA here | ||
| 15790 | + */ | ||
| 15791 | + write_slavemem8 (adev, (u32) &(txdesc->Ctl_8), | ||
| 15792 | + (u8) (DESC_CTL_HOSTOWN | DESC_CTL_FIRSTFRAG)); | ||
| 15793 | + /* done by memset(0): txdesc->Ctl2_8 = 0; */ | ||
| 15794 | + | ||
| 15795 | + /* point to next txdesc */ | ||
| 15796 | + write_slavemem32 (adev, (u32) &(txdesc->pNextDesc), | ||
| 15797 | + (u32) cpu_to_le32 ((u8 *) txdesc + adev->txdesc_size)); | ||
| 15798 | + | ||
| 15799 | + /* go to the next one */ | ||
| 15800 | + /* ++ is safe here (we are acx100) */ | ||
| 15801 | + txdesc++; | ||
| 15802 | + } | ||
| 15803 | + /* go back to the last one */ | ||
| 15804 | + txdesc--; | ||
| 15805 | + /* and point to the first making it a ring buffer */ | ||
| 15806 | + write_slavemem32 (adev, (u32) &(txdesc->pNextDesc), | ||
| 15807 | + (u32) cpu_to_le32 (tx_queue_start)); | ||
| 15808 | + } | ||
| 15809 | + FN_EXIT0; | ||
| 15810 | +} | ||
| 15811 | + | ||
| 15812 | + | ||
| 15813 | +/*************************************************************** | ||
| 15814 | +** acxmem_create_rx_desc_queue | ||
| 15815 | +*/ | ||
| 15816 | +static void | ||
| 15817 | +acxmem_create_rx_desc_queue(acx_device_t *adev, u32 rx_queue_start) | ||
| 15818 | +{ | ||
| 15819 | + rxdesc_t *rxdesc; | ||
| 15820 | + u32 mem_offs; | ||
| 15821 | + int i; | ||
| 15822 | + | ||
| 15823 | + FN_ENTER; | ||
| 15824 | + | ||
| 15825 | + /* done by memset: adev->rx_tail = 0; */ | ||
| 15826 | + | ||
| 15827 | + /* ACX111 doesn't need any further config: preconfigures itself. | ||
| 15828 | + * Simply print ring buffer for debugging */ | ||
| 15829 | + if (IS_ACX111(adev)) { | ||
| 15830 | + /* rxdesc_start already set here */ | ||
| 15831 | + | ||
| 15832 | + adev->rxdesc_start = (rxdesc_t *) rx_queue_start; | ||
| 15833 | + | ||
| 15834 | + rxdesc = adev->rxdesc_start; | ||
| 15835 | + for (i = 0; i < RX_CNT; i++) { | ||
| 15836 | + log(L_DEBUG, "rx descriptor %d @ 0x%p\n", i, rxdesc); | ||
| 15837 | + rxdesc = adev->rxdesc_start = (rxdesc_t *) | ||
| 15838 | + acx2cpu(rxdesc->pNextDesc); | ||
| 15839 | + } | ||
| 15840 | + } else { | ||
| 15841 | + /* we didn't pre-calculate rxdesc_start in case of ACX100 */ | ||
| 15842 | + /* rxdesc_start should be right AFTER Tx pool */ | ||
| 15843 | + adev->rxdesc_start = (rxdesc_t *) | ||
| 15844 | + ((u8 *) adev->txdesc_start + (TX_CNT * sizeof(txdesc_t))); | ||
| 15845 | + /* NB: sizeof(txdesc_t) above is valid because we know | ||
| 15846 | + ** we are in if (acx100) block. Beware of cut-n-pasting elsewhere! | ||
| 15847 | + ** acx111's txdesc is larger! */ | ||
| 15848 | + | ||
| 15849 | + mem_offs = (u32) adev->rxdesc_start; | ||
| 15850 | + while (mem_offs < (u32) adev->rxdesc_start + (RX_CNT * sizeof (*rxdesc))) { | ||
| 15851 | + write_slavemem32 (adev, mem_offs, 0); | ||
| 15852 | + mem_offs += 4; | ||
| 15853 | + } | ||
| 15854 | + | ||
| 15855 | + /* loop over whole receive pool */ | ||
| 15856 | + rxdesc = adev->rxdesc_start; | ||
| 15857 | + for (i = 0; i < RX_CNT; i++) { | ||
| 15858 | + log(L_DEBUG, "rx descriptor @ 0x%p\n", rxdesc); | ||
| 15859 | + /* point to next rxdesc */ | ||
| 15860 | + write_slavemem32 (adev, (u32) &(rxdesc->pNextDesc), | ||
| 15861 | + (u32) cpu_to_le32 ((u8 *) rxdesc + sizeof(*rxdesc))); | ||
| 15862 | + /* go to the next one */ | ||
| 15863 | + rxdesc++; | ||
| 15864 | + } | ||
| 15865 | + /* go to the last one */ | ||
| 15866 | + rxdesc--; | ||
| 15867 | + | ||
| 15868 | + /* and point to the first making it a ring buffer */ | ||
| 15869 | + write_slavemem32 (adev, (u32) &(rxdesc->pNextDesc), | ||
| 15870 | + (u32) cpu_to_le32 (rx_queue_start)); | ||
| 15871 | + } | ||
| 15872 | + FN_EXIT0; | ||
| 15873 | +} | ||
| 15874 | + | ||
| 15875 | + | ||
| 15876 | +/*************************************************************** | ||
| 15877 | +** acxmem_create_desc_queues | ||
| 15878 | +*/ | ||
| 15879 | +void | ||
| 15880 | +acxmem_create_desc_queues(acx_device_t *adev, u32 tx_queue_start, u32 rx_queue_start) | ||
| 15881 | +{ | ||
| 15882 | + u32 *p; | ||
| 15883 | + int i; | ||
| 15884 | + | ||
| 15885 | + acxmem_create_tx_desc_queue(adev, tx_queue_start); | ||
| 15886 | + acxmem_create_rx_desc_queue(adev, rx_queue_start); | ||
| 15887 | + p = (u32 *) adev->acx_queue_indicator; | ||
| 15888 | + for (i = 0; i < 4; i++) { | ||
| 15889 | + write_slavemem32 (adev, (u32) p, 0); | ||
| 15890 | + p++; | ||
| 15891 | + } | ||
| 15892 | +} | ||
| 15893 | + | ||
| 15894 | + | ||
| 15895 | +/*************************************************************** | ||
| 15896 | +** acxmem_s_proc_diag_output | ||
| 15897 | +*/ | ||
| 15898 | +char* | ||
| 15899 | +acxmem_s_proc_diag_output(char *p, acx_device_t *adev) | ||
| 15900 | +{ | ||
| 15901 | + const char *rtl, *thd, *ttl; | ||
| 15902 | + txdesc_t *txdesc; | ||
| 15903 | + u8 Ctl_8; | ||
| 15904 | + rxdesc_t *rxdesc; | ||
| 15905 | + int i; | ||
| 15906 | + u32 tmp; | ||
| 15907 | + txdesc_t txd; | ||
| 15908 | + u8 buf[0x200]; | ||
| 15909 | + int j, k; | ||
| 15910 | + | ||
| 15911 | + FN_ENTER; | ||
| 15912 | + | ||
| 15913 | +#if DUMP_MEM_DURING_DIAG > 0 | ||
| 15914 | + dump_acxmem (adev, 0, 0x10000); | ||
| 15915 | + panic ("dump finished"); | ||
| 15916 | +#endif | ||
| 15917 | + | ||
| 15918 | + p += sprintf(p, "** Rx buf **\n"); | ||
| 15919 | + rxdesc = adev->rxdesc_start; | ||
| 15920 | + if (rxdesc) for (i = 0; i < RX_CNT; i++) { | ||
| 15921 | + rtl = (i == adev->rx_tail) ? " [tail]" : ""; | ||
| 15922 | + Ctl_8 = read_slavemem8 (adev, (u32) &(rxdesc->Ctl_8)); | ||
| 15923 | + if (Ctl_8 & DESC_CTL_HOSTOWN) | ||
| 15924 | + p += sprintf(p, "%02u (%02x) FULL%s\n", i, Ctl_8, rtl); | ||
| 15925 | + else | ||
| 15926 | + p += sprintf(p, "%02u (%02x) empty%s\n", i, Ctl_8, rtl); | ||
| 15927 | + rxdesc++; | ||
| 15928 | + } | ||
| 15929 | + p += sprintf(p, "** Tx buf (free %d, Linux netqueue %s) **\n", adev->tx_free, | ||
| 15930 | + acx_queue_stopped(adev->ndev) ? "STOPPED" : "running"); | ||
| 15931 | + | ||
| 15932 | + p += sprintf(p, "** Tx buf %d blocks total, %d available, free list head %04x\n", | ||
| 15933 | + adev->acx_txbuf_numblocks, adev->acx_txbuf_blocks_free, adev->acx_txbuf_free); | ||
| 15934 | + txdesc = adev->txdesc_start; | ||
| 15935 | + if (txdesc) { | ||
| 15936 | + for (i = 0; i < TX_CNT; i++) { | ||
| 15937 | + thd = (i == adev->tx_head) ? " [head]" : ""; | ||
| 15938 | + ttl = (i == adev->tx_tail) ? " [tail]" : ""; | ||
| 15939 | + copy_from_slavemem (adev, (u8 *) &txd, (u32) txdesc, sizeof (txd)); | ||
| 15940 | + Ctl_8 = read_slavemem8 (adev, (u32) &(txdesc->Ctl_8)); | ||
| 15941 | + if (Ctl_8 & DESC_CTL_ACXDONE) | ||
| 15942 | + p += sprintf(p, "%02u ready to free (%02X)%s%s", i, Ctl_8, thd, ttl); | ||
| 15943 | + else if (Ctl_8 & DESC_CTL_HOSTOWN) | ||
| 15944 | + p += sprintf(p, "%02u available (%02X)%s%s", i, Ctl_8, thd, ttl); | ||
| 15945 | + else | ||
| 15946 | + p += sprintf(p, "%02u busy (%02X)%s%s", i, Ctl_8, thd, ttl); | ||
| 15947 | + tmp = read_slavemem32 (adev, (u32) &(txdesc->AcxMemPtr)); | ||
| 15948 | + if (tmp) { | ||
| 15949 | + p += sprintf (p, " %04x", tmp); | ||
| 15950 | + while ((tmp = read_slavemem32 (adev, (u32) tmp)) != 0x02000000) { | ||
| 15951 | + tmp <<= 5; | ||
| 15952 | + p += sprintf (p, " %04x", tmp); | ||
| 15953 | + } | ||
| 15954 | + } | ||
| 15955 | + p += sprintf (p, "\n"); | ||
| 15956 | + p += sprintf (p, " %04x: %04x %04x %04x %04x %04x %04x %04x %04x %04x %04x %02x %02x %02x %02x\n" | ||
| 15957 | + "%02x %02x %02x %02x %04x\n", | ||
| 15958 | + (u32) txdesc, | ||
| 15959 | + txd.pNextDesc.v, txd.HostMemPtr.v, txd.AcxMemPtr.v, txd.tx_time, | ||
| 15960 | + txd.total_length, txd.Reserved, | ||
| 15961 | + txd.dummy[0], txd.dummy[1], txd.dummy[2], txd.dummy[3], | ||
| 15962 | + txd.Ctl_8, txd.Ctl2_8, txd.error, txd.ack_failures, | ||
| 15963 | + txd.u.rts.rts_failures, txd.u.rts.rts_ok, txd.u.r1.rate, txd.u.r1.queue_ctrl, | ||
| 15964 | + txd.queue_info | ||
| 15965 | + ); | ||
| 15966 | + if (txd.AcxMemPtr.v) { | ||
| 15967 | + copy_from_slavemem (adev, buf, txd.AcxMemPtr.v, sizeof (buf)); | ||
| 15968 | + for (j = 0; (j < txd.total_length) && (j<(sizeof(buf)-4)); j+=16) { | ||
| 15969 | + p += sprintf (p, " "); | ||
| 15970 | + for (k = 0; (k < 16) && (j+k < txd.total_length); k++) { | ||
| 15971 | + p += sprintf (p, " %02x", buf[j+k+4]); | ||
| 15972 | + } | ||
| 15973 | + p += sprintf (p, "\n"); | ||
| 15974 | + } | ||
| 15975 | + } | ||
| 15976 | + txdesc = advance_txdesc(adev, txdesc, 1); | ||
| 15977 | + } | ||
| 15978 | + } | ||
| 15979 | + | ||
| 15980 | + p += sprintf(p, | ||
| 15981 | + "\n" | ||
| 15982 | + "** Generic slave data **\n" | ||
| 15983 | + "irq_mask 0x%04x irq_status 0x%04x irq on acx 0x%04x\n" | ||
| 15984 | + "txbuf_start 0x%p, txbuf_area_size %u\n" | ||
| 15985 | + "txdesc_size %u, txdesc_start 0x%p\n" | ||
| 15986 | + "txhostdesc_start 0x%p, txhostdesc_area_size %u\n" | ||
| 15987 | + "txbuf start 0x%04x, txbuf size %d\n" | ||
| 15988 | + "rxdesc_start 0x%p\n" | ||
| 15989 | + "rxhostdesc_start 0x%p, rxhostdesc_area_size %u\n" | ||
| 15990 | + "rxbuf_start 0x%p, rxbuf_area_size %u\n", | ||
| 15991 | + adev->irq_mask, adev->irq_status, read_reg32(adev, IO_ACX_IRQ_STATUS_NON_DES), | ||
| 15992 | + adev->txbuf_start, adev->txbuf_area_size, | ||
| 15993 | + adev->txdesc_size, adev->txdesc_start, | ||
| 15994 | + adev->txhostdesc_start, adev->txhostdesc_area_size, | ||
| 15995 | + adev->acx_txbuf_start, adev->acx_txbuf_numblocks * adev->memblocksize, | ||
| 15996 | + adev->rxdesc_start, | ||
| 15997 | + adev->rxhostdesc_start, adev->rxhostdesc_area_size, | ||
| 15998 | + adev->rxbuf_start, adev->rxbuf_area_size); | ||
| 15999 | + FN_EXIT0; | ||
| 16000 | + return p; | ||
| 16001 | +} | ||
| 16002 | + | ||
| 16003 | + | ||
| 16004 | +/*********************************************************************** | ||
| 16005 | +*/ | ||
| 16006 | +int | ||
| 16007 | +acxmem_proc_eeprom_output(char *buf, acx_device_t *adev) | ||
| 16008 | +{ | ||
| 16009 | + char *p = buf; | ||
| 16010 | + int i; | ||
| 16011 | + | ||
| 16012 | + FN_ENTER; | ||
| 16013 | + | ||
| 16014 | + for (i = 0; i < 0x400; i++) { | ||
| 16015 | + acxmem_read_eeprom_byte(adev, i, p++); | ||
| 16016 | + } | ||
| 16017 | + | ||
| 16018 | + FN_EXIT1(p - buf); | ||
| 16019 | + return p - buf; | ||
| 16020 | +} | ||
| 16021 | + | ||
| 16022 | + | ||
| 16023 | +/*********************************************************************** | ||
| 16024 | +*/ | ||
| 16025 | +void | ||
| 16026 | +acxmem_set_interrupt_mask(acx_device_t *adev) | ||
| 16027 | +{ | ||
| 16028 | + if (IS_ACX111(adev)) { | ||
| 16029 | + adev->irq_mask = (u16) ~(0 | ||
| 16030 | + | HOST_INT_RX_DATA | ||
| 16031 | + | HOST_INT_TX_COMPLETE | ||
| 16032 | + /* | HOST_INT_TX_XFER */ | ||
| 16033 | + /* | HOST_INT_RX_COMPLETE */ | ||
| 16034 | + /* | HOST_INT_DTIM */ | ||
| 16035 | + /* | HOST_INT_BEACON */ | ||
| 16036 | + /* | HOST_INT_TIMER */ | ||
| 16037 | + /* | HOST_INT_KEY_NOT_FOUND */ | ||
| 16038 | + | HOST_INT_IV_ICV_FAILURE | ||
| 16039 | + | HOST_INT_CMD_COMPLETE | ||
| 16040 | + | HOST_INT_INFO | ||
| 16041 | + | HOST_INT_OVERFLOW | ||
| 16042 | + /* | HOST_INT_PROCESS_ERROR */ | ||
| 16043 | + | HOST_INT_SCAN_COMPLETE | ||
| 16044 | + | HOST_INT_FCS_THRESHOLD | ||
| 16045 | + | HOST_INT_UNKNOWN | ||
| 16046 | + ); | ||
| 16047 | + /* Or else acx100 won't signal cmd completion, right? */ | ||
| 16048 | + adev->irq_mask_off = (u16)~( HOST_INT_CMD_COMPLETE ); /* 0xfdff */ | ||
| 16049 | + } else { | ||
| 16050 | + adev->irq_mask = (u16) ~(0 | ||
| 16051 | + | HOST_INT_RX_DATA | ||
| 16052 | + | HOST_INT_TX_COMPLETE | ||
| 16053 | + /* | HOST_INT_TX_XFER */ | ||
| 16054 | + /* | HOST_INT_RX_COMPLETE */ | ||
| 16055 | + /* | HOST_INT_DTIM */ | ||
| 16056 | + /* | HOST_INT_BEACON */ | ||
| 16057 | + /* | HOST_INT_TIMER */ | ||
| 16058 | + /* | HOST_INT_KEY_NOT_FOUND */ | ||
| 16059 | + /* | HOST_INT_IV_ICV_FAILURE */ | ||
| 16060 | + | HOST_INT_CMD_COMPLETE | ||
| 16061 | + | HOST_INT_INFO | ||
| 16062 | + /* | HOST_INT_OVERFLOW */ | ||
| 16063 | + /* | HOST_INT_PROCESS_ERROR */ | ||
| 16064 | + | HOST_INT_SCAN_COMPLETE | ||
| 16065 | + /* | HOST_INT_FCS_THRESHOLD */ | ||
| 16066 | + /* | HOST_INT_BEACON_MISSED */ | ||
| 16067 | + ); | ||
| 16068 | + adev->irq_mask_off = (u16)~( HOST_INT_UNKNOWN ); /* 0x7fff */ | ||
| 16069 | + } | ||
| 16070 | +} | ||
| 16071 | + | ||
| 16072 | + | ||
| 16073 | +/*********************************************************************** | ||
| 16074 | +*/ | ||
| 16075 | +int | ||
| 16076 | +acx100mem_s_set_tx_level(acx_device_t *adev, u8 level_dbm) | ||
| 16077 | +{ | ||
| 16078 | + struct acx111_ie_tx_level tx_level; | ||
| 16079 | + | ||
| 16080 | + /* since it can be assumed that at least the Maxim radio has a | ||
| 16081 | + * maximum power output of 20dBm and since it also can be | ||
| 16082 | + * assumed that these values drive the DAC responsible for | ||
| 16083 | + * setting the linear Tx level, I'd guess that these values | ||
| 16084 | + * should be the corresponding linear values for a dBm value, | ||
| 16085 | + * in other words: calculate the values from that formula: | ||
| 16086 | + * Y [dBm] = 10 * log (X [mW]) | ||
| 16087 | + * then scale the 0..63 value range onto the 1..100mW range (0..20 dBm) | ||
| 16088 | + * and you're done... | ||
| 16089 | + * Hopefully that's ok, but you never know if we're actually | ||
| 16090 | + * right... (especially since Windows XP doesn't seem to show | ||
| 16091 | + * actual Tx dBm values :-P) */ | ||
| 16092 | + | ||
| 16093 | + /* NOTE: on Maxim, value 30 IS 30mW, and value 10 IS 10mW - so the | ||
| 16094 | + * values are EXACTLY mW!!! Not sure about RFMD and others, | ||
| 16095 | + * though... */ | ||
| 16096 | + static const u8 dbm2val_maxim[21] = { | ||
| 16097 | + 63, 63, 63, 62, | ||
| 16098 | + 61, 61, 60, 60, | ||
| 16099 | + 59, 58, 57, 55, | ||
| 16100 | + 53, 50, 47, 43, | ||
| 16101 | + 38, 31, 23, 13, | ||
| 16102 | + 0 | ||
| 16103 | + }; | ||
| 16104 | + static const u8 dbm2val_rfmd[21] = { | ||
| 16105 | + 0, 0, 0, 1, | ||
| 16106 | + 2, 2, 3, 3, | ||
| 16107 | + 4, 5, 6, 8, | ||
| 16108 | + 10, 13, 16, 20, | ||
| 16109 | + 25, 32, 41, 50, | ||
| 16110 | + 63 | ||
| 16111 | + }; | ||
| 16112 | + const u8 *table; | ||
| 16113 | + | ||
| 16114 | + switch (adev->radio_type) { | ||
| 16115 | + case RADIO_MAXIM_0D: | ||
| 16116 | + table = &dbm2val_maxim[0]; | ||
| 16117 | + break; | ||
| 16118 | + case RADIO_RFMD_11: | ||
| 16119 | + case RADIO_RALINK_15: | ||
| 16120 | + table = &dbm2val_rfmd[0]; | ||
| 16121 | + break; | ||
| 16122 | + default: | ||
| 16123 | + printk("%s: unknown/unsupported radio type, " | ||
| 16124 | + "cannot modify tx power level yet!\n", | ||
| 16125 | + adev->ndev->name); | ||
| 16126 | + return NOT_OK; | ||
| 16127 | + } | ||
| 16128 | + /* | ||
| 16129 | + * The hx4700 EEPROM, at least, only supports 1 power setting. The configure | ||
| 16130 | + * routine matches the PA bias with the gain, so just use its default value. | ||
| 16131 | + * The values are: 0x2b for the gain and 0x03 for the PA bias. The firmware | ||
| 16132 | + * writes the gain level to the Tx gain control DAC and the PA bias to the Maxim | ||
| 16133 | + * radio's PA bias register. The firmware limits itself to 0 - 64 when writing to the | ||
| 16134 | + * gain control DAC. | ||
| 16135 | + * | ||
| 16136 | + * Physically between the ACX and the radio, higher Tx gain control DAC values result | ||
| 16137 | + * in less power output; 0 volts to the Maxim radio results in the highest output power | ||
| 16138 | + * level, which I'm assuming matches up with 0 in the Tx Gain DAC register. | ||
| 16139 | + * | ||
| 16140 | + * Although there is only the 1 power setting, one of the radio firmware functions adjusts | ||
| 16141 | + * the transmit power level up and down. That function is called by the ACX FIQ handler | ||
| 16142 | + * under certain conditions. | ||
| 16143 | + */ | ||
| 16144 | + tx_level.level = 1; | ||
| 16145 | + //return acx_s_configure(adev, &tx_level, ACX1xx_IE_DOT11_TX_POWER_LEVEL); | ||
| 16146 | + | ||
| 16147 | + printk("%s: changing radio power level to %u dBm (%u)\n", | ||
| 16148 | + adev->ndev->name, level_dbm, table[level_dbm]); | ||
| 16149 | + acxmem_s_write_phy_reg(adev, 0x11, table[level_dbm]); | ||
| 16150 | + | ||
| 16151 | + return 0; | ||
| 16152 | +} | ||
| 16153 | + | ||
| 16154 | +void acxmem_e_release(struct device *dev) { | ||
| 16155 | +} | ||
| 16156 | + | ||
| 16157 | +/*********************************************************************** | ||
| 16158 | +** acx_cs part | ||
| 16159 | +** | ||
| 16160 | +** called by pcmcia card service | ||
| 16161 | +*/ | ||
| 16162 | + | ||
| 16163 | +/* | ||
| 16164 | + The event() function is this driver's Card Services event handler. | ||
| 16165 | + It will be called by Card Services when an appropriate card status | ||
| 16166 | + event is received. The config() and release() entry points are | ||
| 16167 | + used to configure or release a socket, in response to card | ||
| 16168 | + insertion and ejection events. They are invoked from the acx_cs | ||
| 16169 | + event handler. | ||
| 16170 | +*/ | ||
| 16171 | + | ||
| 16172 | +static int acx_cs_config(struct pcmcia_device *link); | ||
| 16173 | +static void acx_cs_release(struct pcmcia_device *link); | ||
| 16174 | + | ||
| 16175 | +/* | ||
| 16176 | + The attach() and detach() entry points are used to create and destroy | ||
| 16177 | + "instances" of the driver, where each instance represents everything | ||
| 16178 | + needed to manage one actual PCMCIA card. | ||
| 16179 | +*/ | ||
| 16180 | + | ||
| 16181 | +static void acx_cs_detach(struct pcmcia_device *p_dev); | ||
| 16182 | + | ||
| 16183 | +/* | ||
| 16184 | + You'll also need to prototype all the functions that will actually | ||
| 16185 | + be used to talk to your device. See 'pcmem_cs' for a good example | ||
| 16186 | + of a fully self-sufficient driver; the other drivers rely more or | ||
| 16187 | + less on other parts of the kernel. | ||
| 16188 | +*/ | ||
| 16189 | + | ||
| 16190 | +/* | ||
| 16191 | + A linked list of "instances" of the acxnet device. Each actual | ||
| 16192 | + PCMCIA card corresponds to one device instance, and is described | ||
| 16193 | + by one struct pcmcia_device structure (defined in ds.h). | ||
| 16194 | + | ||
| 16195 | + You may not want to use a linked list for this -- for example, the | ||
| 16196 | + memory card driver uses an array of struct pcmcia_device pointers, where minor | ||
| 16197 | + device numbers are used to derive the corresponding array index. | ||
| 16198 | +*/ | ||
| 16199 | + | ||
| 16200 | +/* | ||
| 16201 | + A driver needs to provide a dev_node_t structure for each device | ||
| 16202 | + on a card. In some cases, there is only one device per card (for | ||
| 16203 | + example, ethernet cards, modems). In other cases, there may be | ||
| 16204 | + many actual or logical devices (SCSI adapters, memory cards with | ||
| 16205 | + multiple partitions). The dev_node_t structures need to be kept | ||
| 16206 | + in a linked list starting at the 'dev' field of a struct pcmcia_device | ||
| 16207 | + structure. We allocate them in the card's private data structure, | ||
| 16208 | + because they generally shouldn't be allocated dynamically. | ||
| 16209 | + | ||
| 16210 | + In this case, we also provide a flag to indicate if a device is | ||
| 16211 | + "stopped" due to a power management event, or card ejection. The | ||
| 16212 | + device IO routines can use a flag like this to throttle IO to a | ||
| 16213 | + card that is not ready to accept it. | ||
| 16214 | +*/ | ||
| 16215 | + | ||
| 16216 | + | ||
| 16217 | +/*====================================================================== | ||
| 16218 | + | ||
| 16219 | + acx_attach() creates an "instance" of the driver, allocating | ||
| 16220 | + local data structures for one device. The device is registered | ||
| 16221 | + with Card Services. | ||
| 16222 | + | ||
| 16223 | + The dev_link structure is initialized, but we don't actually | ||
| 16224 | + configure the card at this point -- we wait until we receive a | ||
| 16225 | + card insertion event. | ||
| 16226 | + | ||
| 16227 | + ======================================================================*/ | ||
| 16228 | + | ||
| 16229 | +static int acx_cs_probe(struct pcmcia_device *link) | ||
| 16230 | +{ | ||
| 16231 | + local_info_t *local; | ||
| 16232 | + struct net_device *ndev; | ||
| 16233 | + | ||
| 16234 | + DEBUG(0, "acx_attach()\n"); | ||
| 16235 | + | ||
| 16236 | + ndev = alloc_netdev(sizeof(acx_device_t), "wlan%d", dummy_netdev_init); | ||
| 16237 | + if (!ndev) { | ||
| 16238 | + printk("acx: no memory for netdevice struct\n"); | ||
| 16239 | + return -ENOMEM; | ||
| 16240 | + } | ||
| 16241 | + | ||
| 16242 | + /* Interrupt setup */ | ||
| 16243 | + link->irq.Attributes = IRQ_TYPE_EXCLUSIVE | IRQ_HANDLE_PRESENT; | ||
| 16244 | + link->irq.IRQInfo1 = IRQ_LEVEL_ID; | ||
| 16245 | + link->irq.Handler = acxmem_i_interrupt; | ||
| 16246 | + link->irq.Instance = ndev; | ||
| 16247 | + | ||
| 16248 | + /* | ||
| 16249 | + General socket configuration defaults can go here. In this | ||
| 16250 | + client, we assume very little, and rely on the CIS for almost | ||
| 16251 | + everything. In most clients, many details (i.e., number, sizes, | ||
| 16252 | + and attributes of IO windows) are fixed by the nature of the | ||
| 16253 | + device, and can be hard-wired here. | ||
| 16254 | + */ | ||
| 16255 | + link->conf.Attributes = CONF_ENABLE_IRQ; | ||
| 16256 | + link->conf.IntType = INT_MEMORY_AND_IO; | ||
| 16257 | + link->conf.Present = PRESENT_OPTION | PRESENT_COPY; | ||
| 16258 | + | ||
| 16259 | + /* Allocate space for private device-specific data */ | ||
| 16260 | + local = kzalloc(sizeof(local_info_t), GFP_KERNEL); | ||
| 16261 | + if (!local) { | ||
| 16262 | + printk(KERN_ERR "acx_cs: no memory for new device\n"); | ||
| 16263 | + return -ENOMEM; | ||
| 16264 | + } | ||
| 16265 | + local->ndev = ndev; | ||
| 16266 | + | ||
| 16267 | + link->priv = local; | ||
| 16268 | + | ||
| 16269 | + return acx_cs_config(link); | ||
| 16270 | +} /* acx_attach */ | ||
| 16271 | + | ||
| 16272 | +/*====================================================================== | ||
| 16273 | + | ||
| 16274 | + This deletes a driver "instance". The device is de-registered | ||
| 16275 | + with Card Services. If it has been released, all local data | ||
| 16276 | + structures are freed. Otherwise, the structures will be freed | ||
| 16277 | + when the device is released. | ||
| 16278 | + | ||
| 16279 | + ======================================================================*/ | ||
| 16280 | + | ||
| 16281 | +static void acx_cs_detach(struct pcmcia_device *link) | ||
| 16282 | +{ | ||
| 16283 | + DEBUG(0, "acx_detach(0x%p)\n", link); | ||
| 16284 | + | ||
| 16285 | + | ||
| 16286 | + if ( ((local_info_t*)link->priv)->ndev ) { | ||
| 16287 | + acxmem_e_close( ((local_info_t*)link->priv)->ndev ); | ||
| 16288 | + } | ||
| 16289 | + | ||
| 16290 | + acx_cs_release(link); | ||
| 16291 | + | ||
| 16292 | + ((local_info_t*)link->priv)->ndev = NULL; | ||
| 16293 | + | ||
| 16294 | + kfree(link->priv); | ||
| 16295 | +} /* acx_detach */ | ||
| 16296 | + | ||
| 16297 | +/*====================================================================== | ||
| 16298 | + | ||
| 16299 | + acx_config() is scheduled to run after a CARD_INSERTION event | ||
| 16300 | + is received, to configure the PCMCIA socket, and to make the | ||
| 16301 | + device available to the system. | ||
| 16302 | + | ||
| 16303 | + ======================================================================*/ | ||
| 16304 | + | ||
| 16305 | +#define CS_CHECK(fn, ret) \ | ||
| 16306 | +do { last_fn = (fn); if ((last_ret = (ret)) != 0) goto cs_failed; } while (0) | ||
| 16307 | + | ||
| 16308 | +static int acx_cs_config(struct pcmcia_device *link) | ||
| 16309 | +{ | ||
| 16310 | + tuple_t tuple; | ||
| 16311 | + cisparse_t parse; | ||
| 16312 | + local_info_t *local = link->priv; | ||
| 16313 | + int last_fn, last_ret; | ||
| 16314 | + u_char buf[64]; | ||
| 16315 | + win_req_t req; | ||
| 16316 | + memreq_t map; | ||
| 16317 | +// int i; | ||
| 16318 | +// acx_device_t *adev; | ||
| 16319 | + | ||
| 16320 | +// adev = (acx_device_t *)link->priv; | ||
| 16321 | + | ||
| 16322 | + DEBUG(0, "acx_cs_config(0x%p)\n", link); | ||
| 16323 | + | ||
| 16324 | + /* | ||
| 16325 | + In this loop, we scan the CIS for configuration table entries, | ||
| 16326 | + each of which describes a valid card configuration, including | ||
| 16327 | + voltage, IO window, memory window, and interrupt settings. | ||
| 16328 | + | ||
| 16329 | + We make no assumptions about the card to be configured: we use | ||
| 16330 | + just the information available in the CIS. In an ideal world, | ||
| 16331 | + this would work for any PCMCIA card, but it requires a complete | ||
| 16332 | + and accurate CIS. In practice, a driver usually "knows" most of | ||
| 16333 | + these things without consulting the CIS, and most client drivers | ||
| 16334 | + will only use the CIS to fill in implementation-defined details. | ||
| 16335 | + */ | ||
| 16336 | + tuple.Attributes = 0; | ||
| 16337 | + tuple.TupleData = (cisdata_t *)buf; | ||
| 16338 | + tuple.TupleDataMax = sizeof(buf); | ||
| 16339 | + tuple.TupleOffset = 0; | ||
| 16340 | + tuple.DesiredTuple = CISTPL_CFTABLE_ENTRY; | ||
| 16341 | + | ||
| 16342 | + /* don't trust the CIS on this; Linksys got it wrong */ | ||
| 16343 | + //link->conf.Present = 0x63; | ||
| 16344 | + | ||
| 16345 | + CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(link, &tuple)); | ||
| 16346 | + while (1) { | ||
| 16347 | + cistpl_cftable_entry_t dflt = { 0 }; | ||
| 16348 | + cistpl_cftable_entry_t *cfg = &(parse.cftable_entry); | ||
| 16349 | + if (pcmcia_get_tuple_data(link, &tuple) != 0 || | ||
| 16350 | + pcmcia_parse_tuple(link, &tuple, &parse) != 0) | ||
| 16351 | + goto next_entry; | ||
| 16352 | + | ||
| 16353 | + if (cfg->flags & CISTPL_CFTABLE_DEFAULT) dflt = *cfg; | ||
| 16354 | + if (cfg->index == 0) goto next_entry; | ||
| 16355 | + link->conf.ConfigIndex = cfg->index; | ||
| 16356 | + | ||
| 16357 | + /* Does this card need audio output? */ | ||
| 16358 | + if (cfg->flags & CISTPL_CFTABLE_AUDIO) { | ||
| 16359 | + link->conf.Attributes |= CONF_ENABLE_SPKR; | ||
| 16360 | + link->conf.Status = CCSR_AUDIO_ENA; | ||
| 16361 | + } | ||
| 16362 | + | ||
| 16363 | + /* Use power settings for Vcc and Vpp if present */ | ||
| 16364 | + /* Note that the CIS values need to be rescaled */ | ||
| 16365 | + if (cfg->vpp1.present & (1<<CISTPL_POWER_VNOM)) | ||
| 16366 | + link->conf.Vpp = | ||
| 16367 | + cfg->vpp1.param[CISTPL_POWER_VNOM]/10000; | ||
| 16368 | + else if (dflt.vpp1.present & (1<<CISTPL_POWER_VNOM)) | ||
| 16369 | + link->conf.Vpp = | ||
| 16370 | + dflt.vpp1.param[CISTPL_POWER_VNOM]/10000; | ||
| 16371 | + | ||
| 16372 | + /* Do we need to allocate an interrupt? */ | ||
| 16373 | + if (cfg->irq.IRQInfo1 || dflt.irq.IRQInfo1) | ||
| 16374 | + link->conf.Attributes |= CONF_ENABLE_IRQ; | ||
| 16375 | + if ((cfg->mem.nwin > 0) || (dflt.mem.nwin > 0)) { | ||
| 16376 | + cistpl_mem_t *mem = | ||
| 16377 | + (cfg->mem.nwin) ? &cfg->mem : &dflt.mem; | ||
| 16378 | +// req.Attributes = WIN_DATA_WIDTH_16|WIN_MEMORY_TYPE_AM|WIN_ENABLE|WIN_USE_WAIT; | ||
| 16379 | + req.Attributes = WIN_DATA_WIDTH_16|WIN_MEMORY_TYPE_CM|WIN_ENABLE|WIN_USE_WAIT; | ||
| 16380 | + req.Base = mem->win[0].host_addr; | ||
| 16381 | + req.Size = mem->win[0].len; | ||
| 16382 | + req.Size=0x1000; | ||
| 16383 | + req.AccessSpeed = 0; | ||
| 16384 | + if (pcmcia_request_window(&link, &req, &link->win) != 0) | ||
| 16385 | + goto next_entry; | ||
| 16386 | + map.Page = 0; map.CardOffset = mem->win[0].card_addr; | ||
| 16387 | + if (pcmcia_map_mem_page(link->win, &map) != 0) | ||
| 16388 | + goto next_entry; | ||
| 16389 | + else | ||
| 16390 | + printk(KERN_INFO "MEMORY WINDOW FOUND!!!\n"); | ||
| 16391 | + } | ||
| 16392 | + /* If we got this far, we're cool! */ | ||
| 16393 | + break; | ||
| 16394 | + | ||
| 16395 | + next_entry: | ||
| 16396 | + CS_CHECK(GetNextTuple, pcmcia_get_next_tuple(link, &tuple)); | ||
| 16397 | + } | ||
| 16398 | + | ||
| 16399 | + if (link->conf.Attributes & CONF_ENABLE_IRQ) { | ||
| 16400 | + printk(KERN_INFO "requesting Irq...\n"); | ||
| 16401 | + CS_CHECK(RequestIRQ, pcmcia_request_irq(link, &link->irq)); | ||
| 16402 | + } | ||
| 16403 | + | ||
| 16404 | + /* | ||
| 16405 | + This actually configures the PCMCIA socket -- setting up | ||
| 16406 | + the I/O windows and the interrupt mapping, and putting the | ||
| 16407 | + card and host interface into "Memory and IO" mode. | ||
| 16408 | + */ | ||
| 16409 | + CS_CHECK(RequestConfiguration, pcmcia_request_configuration(link, &link->conf)); | ||
| 16410 | + DEBUG(0,"RequestConfiguration OK\n"); | ||
| 16411 | + | ||
| 16412 | + | ||
| 16413 | + memwin.Base=req.Base; | ||
| 16414 | + memwin.Size=req.Size; | ||
| 16415 | + | ||
| 16416 | + acx_init_netdev(local->ndev, &link->dev, memwin.Base, memwin.Size, link->irq.AssignedIRQ); | ||
| 16417 | + | ||
| 16418 | +#if 1 | ||
| 16419 | + /* | ||
| 16420 | + At this point, the dev_node_t structure(s) need to be | ||
| 16421 | + initialized and arranged in a linked list at link->dev_node. | ||
| 16422 | + */ | ||
| 16423 | + strcpy(local->node.dev_name, local->ndev->name ); | ||
| 16424 | + local->node.major = local->node.minor = 0; | ||
| 16425 | + link->dev_node = &local->node; | ||
| 16426 | + | ||
| 16427 | + /* Finally, report what we've done */ | ||
| 16428 | + printk(KERN_INFO "%s: index 0x%02x: ", | ||
| 16429 | + local->ndev->name, link->conf.ConfigIndex); | ||
| 16430 | +#endif | ||
| 16431 | + if (link->conf.Attributes & CONF_ENABLE_IRQ) | ||
| 16432 | + printk("irq %d", link->irq.AssignedIRQ); | ||
| 16433 | + if (link->io.NumPorts1) | ||
| 16434 | + printk(", io 0x%04x-0x%04x", link->io.BasePort1, | ||
| 16435 | + link->io.BasePort1+link->io.NumPorts1-1); | ||
| 16436 | + if (link->io.NumPorts2) | ||
| 16437 | + printk(" & 0x%04x-0x%04x", link->io.BasePort2, | ||
| 16438 | + link->io.BasePort2+link->io.NumPorts2-1); | ||
| 16439 | + if (link->win) | ||
| 16440 | + printk(", mem 0x%06lx-0x%06lx\n", req.Base, | ||
| 16441 | + req.Base+req.Size-1); | ||
| 16442 | + return 0; | ||
| 16443 | + | ||
| 16444 | + cs_failed: | ||
| 16445 | + cs_error(link, last_fn, last_ret); | ||
| 16446 | + acx_cs_release(link); | ||
| 16447 | + return -ENODEV; | ||
| 16448 | +} /* acx_config */ | ||
| 16449 | + | ||
| 16450 | +/*====================================================================== | ||
| 16451 | + | ||
| 16452 | + After a card is removed, acx_release() will unregister the | ||
| 16453 | + device, and release the PCMCIA configuration. If the device is | ||
| 16454 | + still open, this will be postponed until it is closed. | ||
| 16455 | + | ||
| 16456 | + ======================================================================*/ | ||
| 16457 | + | ||
| 16458 | +static void acx_cs_release(struct pcmcia_device *link) | ||
| 16459 | +{ | ||
| 16460 | + DEBUG(0, "acx_release(0x%p)\n", link); | ||
| 16461 | + acxmem_e_remove(link); | ||
| 16462 | + pcmcia_disable_device(link); | ||
| 16463 | +} | ||
| 16464 | + | ||
| 16465 | +static int acx_cs_suspend(struct pcmcia_device *link) | ||
| 16466 | +{ | ||
| 16467 | + local_info_t *local = link->priv; | ||
| 16468 | + | ||
| 16469 | + pm_message_t state; | ||
| 16470 | + acxmem_e_suspend ( local->ndev, state); | ||
| 16471 | + /* Already done in suspend | ||
| 16472 | + * netif_device_detach(local->ndev); */ | ||
| 16473 | + | ||
| 16474 | + return 0; | ||
| 16475 | +} | ||
| 16476 | + | ||
| 16477 | +static int acx_cs_resume(struct pcmcia_device *link) | ||
| 16478 | +{ | ||
| 16479 | + local_info_t *local = link->priv; | ||
| 16480 | + | ||
| 16481 | + FN_ENTER; | ||
| 16482 | + resume_ndev = local->ndev; | ||
| 16483 | + | ||
| 16484 | + schedule_work( &fw_resume_work ); | ||
| 16485 | + | ||
| 16486 | + /* Already done in suspend | ||
| 16487 | + if (link->open) { | ||
| 16488 | + // do we need reset for ACX, if so what function nane is ? | ||
| 16489 | + //reset_acx_card(local->eth_dev); | ||
| 16490 | + netif_device_attach(local->ndev); | ||
| 16491 | + } */ | ||
| 16492 | + | ||
| 16493 | + FN_EXIT0; | ||
| 16494 | + return 0; | ||
| 16495 | +} | ||
| 16496 | + | ||
| 16497 | +static struct pcmcia_device_id acx_ids[] = { | ||
| 16498 | + PCMCIA_DEVICE_MANF_CARD(0x0097, 0x8402), | ||
| 16499 | + PCMCIA_DEVICE_MANF_CARD(0x0250, 0xb001), | ||
| 16500 | + PCMCIA_DEVICE_NULL, | ||
| 16501 | +}; | ||
| 16502 | +MODULE_DEVICE_TABLE(pcmcia, acx_ids); | ||
| 16503 | + | ||
| 16504 | +static struct pcmcia_driver acx_driver = { | ||
| 16505 | + .owner = THIS_MODULE, | ||
| 16506 | + .drv = { | ||
| 16507 | + .name = "acx_cs", | ||
| 16508 | + }, | ||
| 16509 | + .probe = acx_cs_probe, | ||
| 16510 | + .remove = acx_cs_detach, | ||
| 16511 | + .id_table = acx_ids, | ||
| 16512 | + .suspend = acx_cs_suspend, | ||
| 16513 | + .resume = acx_cs_resume, | ||
| 16514 | +}; | ||
| 16515 | + | ||
| 16516 | +int acx_cs_init(void) | ||
| 16517 | +{ | ||
| 16518 | + /* return success if at least one succeeded */ | ||
| 16519 | + DEBUG(0, "acxcs_init()\n"); | ||
| 16520 | + return pcmcia_register_driver(&acx_driver); | ||
| 16521 | +} | ||
| 16522 | + | ||
| 16523 | +void acx_cs_cleanup(void) | ||
| 16524 | +{ | ||
| 16525 | + pcmcia_unregister_driver(&acx_driver); | ||
| 16526 | +} | ||
| 16527 | + | ||
| 16528 | +/* | ||
| 16529 | + This program is free software; you can redistribute it and/or | ||
| 16530 | + modify it under the terms of the GNU General Public License | ||
| 16531 | + as published by the Free Software Foundation; either version 2 | ||
| 16532 | + of the License, or (at your option) any later version. | ||
| 16533 | + | ||
| 16534 | + This program is distributed in the hope that it will be useful, | ||
| 16535 | + but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 16536 | + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 16537 | + GNU General Public License for more details. | ||
| 16538 | + | ||
| 16539 | + In addition: | ||
| 16540 | + | ||
| 16541 | + Redistribution and use in source and binary forms, with or without | ||
| 16542 | + modification, are permitted provided that the following conditions | ||
| 16543 | + are met: | ||
| 16544 | + | ||
| 16545 | + 1. Redistributions of source code must retain the above copyright | ||
| 16546 | + notice, this list of conditions and the following disclaimer. | ||
| 16547 | + 2. Redistributions in binary form must reproduce the above copyright | ||
| 16548 | + notice, this list of conditions and the following disclaimer in the | ||
| 16549 | + documentation and/or other materials provided with the distribution. | ||
| 16550 | + 3. The name of the author may not be used to endorse or promote | ||
| 16551 | + products derived from this software without specific prior written | ||
| 16552 | + permission. | ||
| 16553 | + | ||
| 16554 | + THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR | ||
| 16555 | + IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||
| 16556 | + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||
| 16557 | + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, | ||
| 16558 | + INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||
| 16559 | + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR | ||
| 16560 | + SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | ||
| 16561 | + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, | ||
| 16562 | + STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING | ||
| 16563 | + IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||
| 16564 | + POSSIBILITY OF SUCH DAMAGE. | ||
| 16565 | +*/ | ||
| 16566 | + | ||
| 16567 | +MODULE_DESCRIPTION( "ACX Cardbus Driver" ); | ||
| 16568 | +MODULE_LICENSE( "GPL" ); | ||
| 16569 | + | ||
| 16570 | Index: linux-2.6.23/drivers/net/wireless/acx/htcsable_acx.c | ||
| 16571 | =================================================================== | ||
| 16572 | --- /dev/null 1970-01-01 00:00:00.000000000 +0000 | ||
| 16573 | +++ linux-2.6.23/drivers/net/wireless/acx/htcsable_acx.c 2008-01-20 21:13:40.000000000 +0000 | ||
| 16574 | @@ -0,0 +1,118 @@ | ||
| 16575 | +/* | ||
| 16576 | + * WLAN (TI TNETW1100B) support in the HTC Sable | ||
| 16577 | + * | ||
| 16578 | + * Copyright (c) 2006 SDG Systems, LLC | ||
| 16579 | + * | ||
| 16580 | + * This file is subject to the terms and conditions of the GNU General Public | ||
| 16581 | + * License. See the file COPYING in the main directory of this archive for | ||
| 16582 | + * more details. | ||
| 16583 | + * | ||
| 16584 | + * 28-March-2006 Todd Blumer <todd@sdgsystems.com> | ||
| 16585 | + */ | ||
| 16586 | + | ||
| 16587 | + | ||
| 16588 | +#include <linux/kernel.h> | ||
| 16589 | +#include <linux/platform_device.h> | ||
| 16590 | +#include <linux/delay.h> | ||
| 16591 | + | ||
| 16592 | +#include <asm/hardware.h> | ||
| 16593 | + | ||
| 16594 | +#include <asm/arch/pxa-regs.h> | ||
| 16595 | +#include <linux/mfd/asic3_base.h> | ||
| 16596 | +#include <asm/arch/htcsable-gpio.h> | ||
| 16597 | +#include <asm/arch/htcsable-asic.h> | ||
| 16598 | +#include <asm/io.h> | ||
| 16599 | + | ||
| 16600 | +#include "acx_hw.h" | ||
| 16601 | + | ||
| 16602 | +#define WLAN_BASE PXA_CS2_PHYS | ||
| 16603 | + | ||
| 16604 | +/* | ||
| 16605 | +off: b15 c8 d3 | ||
| 16606 | +on: d3 c8 b5 b5- | ||
| 16607 | +*/ | ||
| 16608 | + | ||
| 16609 | +#define GPIO_NR_HTCSABLE_ACX111 111 | ||
| 16610 | + | ||
| 16611 | +static int | ||
| 16612 | +htcsable_wlan_stop( void ); | ||
| 16613 | + | ||
| 16614 | +static int | ||
| 16615 | +htcsable_wlan_start( void ) | ||
| 16616 | +{ | ||
| 16617 | + printk( "htcsable_wlan_start\n" ); | ||
| 16618 | + | ||
| 16619 | + /*asic3_set_gpio_out_c(&htcsable_asic3.dev, 1<<GPIOC_ACX_RESET, 0);*/ | ||
| 16620 | + asic3_set_gpio_out_c(&htcsable_asic3.dev, 1<<GPIOC_ACX_PWR_3, 1<<GPIOC_ACX_PWR_3); /* related to acx */ | ||
| 16621 | + SET_HTCSABLE_GPIO(ACX111, 1); | ||
| 16622 | + asic3_set_gpio_out_b(&htcsable_asic3.dev, 1<<GPIOB_ACX_PWR_1, 1<<GPIOB_ACX_PWR_1); | ||
| 16623 | + asic3_set_gpio_out_d(&htcsable_asic3.dev, 1<<GPIOD_ACX_PWR_2, 1<<GPIOD_ACX_PWR_2); | ||
| 16624 | + mdelay(260); | ||
| 16625 | + asic3_set_gpio_out_c(&htcsable_asic3.dev, 1<<GPIOC_ACX_RESET, 1<<GPIOC_ACX_RESET); | ||
| 16626 | + | ||
| 16627 | + return 0; | ||
| 16628 | +} | ||
| 16629 | + | ||
| 16630 | +static int | ||
| 16631 | +htcsable_wlan_stop( void ) | ||
| 16632 | +{ | ||
| 16633 | + printk( "htcsable_wlan_stop\n" ); | ||
| 16634 | + asic3_set_gpio_out_b(&htcsable_asic3.dev, 1<<GPIOB_ACX_PWR_1, 0); | ||
| 16635 | + asic3_set_gpio_out_c(&htcsable_asic3.dev, 1<<GPIOC_ACX_RESET, 0); | ||
| 16636 | + asic3_set_gpio_out_d(&htcsable_asic3.dev, 1<<GPIOD_ACX_PWR_2, 0); | ||
| 16637 | + SET_HTCSABLE_GPIO(ACX111, 0); /* not necessary to power down this one? */ | ||
| 16638 | + asic3_set_gpio_out_c(&htcsable_asic3.dev, 1<<GPIOC_ACX_PWR_3, 0); /* not necessary to power down this one? */ | ||
| 16639 | + | ||
| 16640 | + return 0; | ||
| 16641 | +} | ||
| 16642 | + | ||
| 16643 | +static struct resource acx_resources[] = { | ||
| 16644 | + [0] = { | ||
| 16645 | + .start = WLAN_BASE, | ||
| 16646 | + .end = WLAN_BASE + 0x20, | ||
| 16647 | + .flags = IORESOURCE_MEM, | ||
| 16648 | + }, | ||
| 16649 | + [1] = { | ||
| 16650 | +// .start = asic3_irq_base(&htcsable_asic3.dev) + ASIC3_GPIOC_IRQ_BASE+GPIOC_WIFI_IRQ_N, | ||
| 16651 | +// .end = asic3_irq_base(&htcsable_asic3.dev) + ASIC3_GPIOC_IRQ_BASE+GPIOC_WIFI_IRQ_N, | ||
| 16652 | + .flags = IORESOURCE_IRQ, | ||
| 16653 | + }, | ||
| 16654 | +}; | ||
| 16655 | + | ||
| 16656 | +static struct acx_hardware_data acx_data = { | ||
| 16657 | + .start_hw = htcsable_wlan_start, | ||
| 16658 | + .stop_hw = htcsable_wlan_stop, | ||
| 16659 | +}; | ||
| 16660 | + | ||
| 16661 | +static struct platform_device acx_device = { | ||
| 16662 | + .name = "acx-mem", | ||
| 16663 | + .dev = { | ||
| 16664 | + .platform_data = &acx_data, | ||
| 16665 | + }, | ||
| 16666 | + .num_resources = ARRAY_SIZE( acx_resources ), | ||
| 16667 | + .resource = acx_resources, | ||
| 16668 | +}; | ||
| 16669 | + | ||
| 16670 | +static int __init | ||
| 16671 | +htcsable_wlan_init( void ) | ||
| 16672 | +{ | ||
| 16673 | + printk( "htcsable_wlan_init: acx-mem platform_device_register\n" ); | ||
| 16674 | + acx_device.resource[1].start = asic3_irq_base(&htcsable_asic3.dev) + ASIC3_GPIOB_IRQ_BASE+GPIOB_ACX_IRQ_N; | ||
| 16675 | + acx_device.resource[1].end = asic3_irq_base(&htcsable_asic3.dev) + ASIC3_GPIOB_IRQ_BASE+GPIOB_ACX_IRQ_N; | ||
| 16676 | + return platform_device_register( &acx_device ); | ||
| 16677 | +} | ||
| 16678 | + | ||
| 16679 | + | ||
| 16680 | +static void __exit | ||
| 16681 | +htcsable_wlan_exit( void ) | ||
| 16682 | +{ | ||
| 16683 | + platform_device_unregister( &acx_device ); | ||
| 16684 | +} | ||
| 16685 | + | ||
| 16686 | +module_init( htcsable_wlan_init ); | ||
| 16687 | +module_exit( htcsable_wlan_exit ); | ||
| 16688 | + | ||
| 16689 | +MODULE_AUTHOR( "Todd Blumer <todd@sdgsystems.com>" ); | ||
| 16690 | +MODULE_DESCRIPTION( "WLAN driver for HTC Sable" ); | ||
| 16691 | +MODULE_LICENSE( "GPL" ); | ||
| 16692 | + | ||
| 16693 | Index: linux-2.6.23/drivers/net/wireless/acx/htcuniversal_acx.c | ||
| 16694 | =================================================================== | ||
| 16695 | --- /dev/null 1970-01-01 00:00:00.000000000 +0000 | ||
| 16696 | +++ linux-2.6.23/drivers/net/wireless/acx/htcuniversal_acx.c 2008-01-20 21:13:40.000000000 +0000 | ||
| 16697 | @@ -0,0 +1,108 @@ | ||
| 16698 | +/* | ||
| 16699 | + * WLAN (TI TNETW1100B) support in the HTC Universal | ||
| 16700 | + * | ||
| 16701 | + * Copyright (c) 2006 SDG Systems, LLC | ||
| 16702 | + * | ||
| 16703 | + * This file is subject to the terms and conditions of the GNU General Public | ||
| 16704 | + * License. See the file COPYING in the main directory of this archive for | ||
| 16705 | + * more details. | ||
| 16706 | + * | ||
| 16707 | + * 28-March-2006 Todd Blumer <todd@sdgsystems.com> | ||
| 16708 | + */ | ||
| 16709 | + | ||
| 16710 | + | ||
| 16711 | +#include <linux/kernel.h> | ||
| 16712 | +#include <linux/platform_device.h> | ||
| 16713 | +#include <linux/delay.h> | ||
| 16714 | + | ||
| 16715 | +#include <asm/hardware.h> | ||
| 16716 | + | ||
| 16717 | +#include <asm/arch/pxa-regs.h> | ||
| 16718 | +#include <linux/soc/asic3_base.h> | ||
| 16719 | +#include <asm/arch/htcuniversal-gpio.h> | ||
| 16720 | +#include <asm/arch/htcuniversal-asic.h> | ||
| 16721 | +#include <asm/io.h> | ||
| 16722 | + | ||
| 16723 | +#include "acx_hw.h" | ||
| 16724 | + | ||
| 16725 | +#define WLAN_BASE PXA_CS2_PHYS | ||
| 16726 | + | ||
| 16727 | + | ||
| 16728 | +static int | ||
| 16729 | +htcuniversal_wlan_start( void ) | ||
| 16730 | +{ | ||
| 16731 | + htcuniversal_egpio_enable(1<<EGPIO6_WIFI_ON); | ||
| 16732 | + asic3_set_gpio_out_c(&htcuniversal_asic3.dev, 1<<GPIOC_WIFI_PWR1_ON, 1<<GPIOC_WIFI_PWR1_ON); | ||
| 16733 | + asic3_set_gpio_out_d(&htcuniversal_asic3.dev, 1<<GPIOD_WIFI_PWR3_ON, 1<<GPIOD_WIFI_PWR3_ON); | ||
| 16734 | + asic3_set_gpio_out_d(&htcuniversal_asic3.dev, 1<<GPIOD_WIFI_PWR2_ON, 1<<GPIOD_WIFI_PWR2_ON); | ||
| 16735 | + mdelay(100); | ||
| 16736 | + | ||
| 16737 | + asic3_set_gpio_out_c(&htcuniversal_asic3.dev, 1<<GPIOC_WIFI_RESET, 0); | ||
| 16738 | + mdelay(100); | ||
| 16739 | + asic3_set_gpio_out_c(&htcuniversal_asic3.dev, 1<<GPIOC_WIFI_RESET, 1<<GPIOC_WIFI_RESET); | ||
| 16740 | + mdelay(100); | ||
| 16741 | + return 0; | ||
| 16742 | +} | ||
| 16743 | + | ||
| 16744 | +static int | ||
| 16745 | +htcuniversal_wlan_stop( void ) | ||
| 16746 | +{ | ||
| 16747 | + asic3_set_gpio_out_c(&htcuniversal_asic3.dev, 1<<GPIOC_WIFI_RESET, 0); | ||
| 16748 | + | ||
| 16749 | + htcuniversal_egpio_disable(1<<EGPIO6_WIFI_ON); | ||
| 16750 | + asic3_set_gpio_out_c(&htcuniversal_asic3.dev, 1<<GPIOC_WIFI_PWR1_ON, 0); | ||
| 16751 | + asic3_set_gpio_out_d(&htcuniversal_asic3.dev, 1<<GPIOD_WIFI_PWR2_ON, 0); | ||
| 16752 | + asic3_set_gpio_out_d(&htcuniversal_asic3.dev, 1<<GPIOD_WIFI_PWR3_ON, 0); | ||
| 16753 | + return 0; | ||
| 16754 | +} | ||
| 16755 | + | ||
| 16756 | +static struct resource acx_resources[] = { | ||
| 16757 | + [0] = { | ||
| 16758 | + .start = WLAN_BASE, | ||
| 16759 | + .end = WLAN_BASE + 0x20, | ||
| 16760 | + .flags = IORESOURCE_MEM, | ||
| 16761 | + }, | ||
| 16762 | + [1] = { | ||
| 16763 | +// .start = asic3_irq_base(&htcuniversal_asic3.dev) + ASIC3_GPIOC_IRQ_BASE+GPIOC_WIFI_IRQ_N, | ||
| 16764 | +// .end = asic3_irq_base(&htcuniversal_asic3.dev) + ASIC3_GPIOC_IRQ_BASE+GPIOC_WIFI_IRQ_N, | ||
| 16765 | + .flags = IORESOURCE_IRQ, | ||
| 16766 | + }, | ||
| 16767 | +}; | ||
| 16768 | + | ||
| 16769 | +static struct acx_hardware_data acx_data = { | ||
| 16770 | + .start_hw = htcuniversal_wlan_start, | ||
| 16771 | + .stop_hw = htcuniversal_wlan_stop, | ||
| 16772 | +}; | ||
| 16773 | + | ||
| 16774 | +static struct platform_device acx_device = { | ||
| 16775 | + .name = "acx-mem", | ||
| 16776 | + .dev = { | ||
| 16777 | + .platform_data = &acx_data, | ||
| 16778 | + }, | ||
| 16779 | + .num_resources = ARRAY_SIZE( acx_resources ), | ||
| 16780 | + .resource = acx_resources, | ||
| 16781 | +}; | ||
| 16782 | + | ||
| 16783 | +static int __init | ||
| 16784 | +htcuniversal_wlan_init( void ) | ||
| 16785 | +{ | ||
| 16786 | + printk( "htcuniversal_wlan_init: acx-mem platform_device_register\n" ); | ||
| 16787 | + acx_device.resource[1].start = asic3_irq_base(&htcuniversal_asic3.dev) + ASIC3_GPIOC_IRQ_BASE+GPIOC_WIFI_IRQ_N; | ||
| 16788 | + acx_device.resource[1].end = asic3_irq_base(&htcuniversal_asic3.dev) + ASIC3_GPIOC_IRQ_BASE+GPIOC_WIFI_IRQ_N; | ||
| 16789 | + return platform_device_register( &acx_device ); | ||
| 16790 | +} | ||
| 16791 | + | ||
| 16792 | + | ||
| 16793 | +static void __exit | ||
| 16794 | +htcuniversal_wlan_exit( void ) | ||
| 16795 | +{ | ||
| 16796 | + platform_device_unregister( &acx_device ); | ||
| 16797 | +} | ||
| 16798 | + | ||
| 16799 | +module_init( htcuniversal_wlan_init ); | ||
| 16800 | +module_exit( htcuniversal_wlan_exit ); | ||
| 16801 | + | ||
| 16802 | +MODULE_AUTHOR( "Todd Blumer <todd@sdgsystems.com>" ); | ||
| 16803 | +MODULE_DESCRIPTION( "WLAN driver for HTC Universal" ); | ||
| 16804 | +MODULE_LICENSE( "GPL" ); | ||
| 16805 | + | ||
| 16806 | Index: linux-2.6.23/drivers/net/wireless/acx/hx4700_acx.c | ||
| 16807 | =================================================================== | ||
| 16808 | --- /dev/null 1970-01-01 00:00:00.000000000 +0000 | ||
| 16809 | +++ linux-2.6.23/drivers/net/wireless/acx/hx4700_acx.c 2008-01-20 21:13:40.000000000 +0000 | ||
| 16810 | @@ -0,0 +1,108 @@ | ||
| 16811 | +/* | ||
| 16812 | + * WLAN (TI TNETW1100B) support in the hx470x. | ||
| 16813 | + * | ||
| 16814 | + * Copyright (c) 2006 SDG Systems, LLC | ||
| 16815 | + * | ||
| 16816 | + * This file is subject to the terms and conditions of the GNU General Public | ||
| 16817 | + * License. See the file COPYING in the main directory of this archive for | ||
| 16818 | + * more details. | ||
| 16819 | + * | ||
| 16820 | + * 28-March-2006 Todd Blumer <todd@sdgsystems.com> | ||
| 16821 | + */ | ||
| 16822 | + | ||
| 16823 | + | ||
| 16824 | +#include <linux/kernel.h> | ||
| 16825 | +#include <linux/platform_device.h> | ||
| 16826 | +#include <linux/delay.h> | ||
| 16827 | +#include <linux/leds.h> | ||
| 16828 | + | ||
| 16829 | +#include <asm/hardware.h> | ||
| 16830 | + | ||
| 16831 | +#include <asm/arch/pxa-regs.h> | ||
| 16832 | +#include <asm/arch/hx4700-gpio.h> | ||
| 16833 | +#include <asm/arch/hx4700-core.h> | ||
| 16834 | +#include <asm/io.h> | ||
| 16835 | + | ||
| 16836 | +#include "acx_hw.h" | ||
| 16837 | + | ||
| 16838 | +#define WLAN_OFFSET 0x1000000 | ||
| 16839 | +#define WLAN_BASE (PXA_CS5_PHYS+WLAN_OFFSET) | ||
| 16840 | + | ||
| 16841 | + | ||
| 16842 | +static int | ||
| 16843 | +hx4700_wlan_start( void ) | ||
| 16844 | +{ | ||
| 16845 | + SET_HX4700_GPIO( WLAN_RESET_N, 0 ); | ||
| 16846 | + mdelay(5); | ||
| 16847 | + hx4700_egpio_enable( EGPIO0_VCC_3V3_EN ); | ||
| 16848 | + mdelay(100); | ||
| 16849 | + hx4700_egpio_enable( EGPIO7_VCC_3V3_WL_EN ); | ||
| 16850 | + mdelay(150); | ||
| 16851 | + hx4700_egpio_enable( EGPIO1_WL_VREG_EN | EGPIO2_VCC_2V1_WL_EN | | ||
| 16852 | + EGPIO6_WL1V8_EN ); | ||
| 16853 | + mdelay(10); | ||
| 16854 | + SET_HX4700_GPIO( WLAN_RESET_N, 1 ); | ||
| 16855 | + mdelay(50); | ||
| 16856 | + led_trigger_event_shared(hx4700_radio_trig, LED_FULL); | ||
| 16857 | + return 0; | ||
| 16858 | +} | ||
| 16859 | + | ||
| 16860 | +static int | ||
| 16861 | +hx4700_wlan_stop( void ) | ||
| 16862 | +{ | ||
| 16863 | + hx4700_egpio_disable( EGPIO0_VCC_3V3_EN | EGPIO1_WL_VREG_EN | | ||
| 16864 | + EGPIO7_VCC_3V3_WL_EN | EGPIO2_VCC_2V1_WL_EN | | ||
| 16865 | + EGPIO6_WL1V8_EN ); | ||
| 16866 | + SET_HX4700_GPIO( WLAN_RESET_N, 0 ); | ||
| 16867 | + led_trigger_event_shared(hx4700_radio_trig, LED_OFF); | ||
| 16868 | + return 0; | ||
| 16869 | +} | ||
| 16870 | + | ||
| 16871 | +static struct resource acx_resources[] = { | ||
| 16872 | + [0] = { | ||
| 16873 | + .start = WLAN_BASE, | ||
| 16874 | + .end = WLAN_BASE + 0x20, | ||
| 16875 | + .flags = IORESOURCE_MEM, | ||
| 16876 | + }, | ||
| 16877 | + [1] = { | ||
| 16878 | + .start = HX4700_IRQ(WLAN_IRQ_N), | ||
| 16879 | + .end = HX4700_IRQ(WLAN_IRQ_N), | ||
| 16880 | + .flags = IORESOURCE_IRQ, | ||
| 16881 | + }, | ||
| 16882 | +}; | ||
| 16883 | + | ||
| 16884 | +static struct acx_hardware_data acx_data = { | ||
| 16885 | + .start_hw = hx4700_wlan_start, | ||
| 16886 | + .stop_hw = hx4700_wlan_stop, | ||
| 16887 | +}; | ||
| 16888 | + | ||
| 16889 | +static struct platform_device acx_device = { | ||
| 16890 | + .name = "acx-mem", | ||
| 16891 | + .dev = { | ||
| 16892 | + .platform_data = &acx_data, | ||
| 16893 | + }, | ||
| 16894 | + .num_resources = ARRAY_SIZE( acx_resources ), | ||
| 16895 | + .resource = acx_resources, | ||
| 16896 | +}; | ||
| 16897 | + | ||
| 16898 | +static int __init | ||
| 16899 | +hx4700_wlan_init( void ) | ||
| 16900 | +{ | ||
| 16901 | + printk( "hx4700_wlan_init: acx-mem platform_device_register\n" ); | ||
| 16902 | + return platform_device_register( &acx_device ); | ||
| 16903 | +} | ||
| 16904 | + | ||
| 16905 | + | ||
| 16906 | +static void __exit | ||
| 16907 | +hx4700_wlan_exit( void ) | ||
| 16908 | +{ | ||
| 16909 | + platform_device_unregister( &acx_device ); | ||
| 16910 | +} | ||
| 16911 | + | ||
| 16912 | +module_init( hx4700_wlan_init ); | ||
| 16913 | +module_exit( hx4700_wlan_exit ); | ||
| 16914 | + | ||
| 16915 | +MODULE_AUTHOR( "Todd Blumer <todd@sdgsystems.com>" ); | ||
| 16916 | +MODULE_DESCRIPTION( "WLAN driver for iPAQ hx4700" ); | ||
| 16917 | +MODULE_LICENSE( "GPL" ); | ||
| 16918 | + | ||
| 16919 | Index: linux-2.6.23/drivers/net/wireless/acx/ioctl.c | ||
| 16920 | =================================================================== | ||
| 16921 | --- /dev/null 1970-01-01 00:00:00.000000000 +0000 | ||
| 16922 | +++ linux-2.6.23/drivers/net/wireless/acx/ioctl.c 2008-01-20 21:13:40.000000000 +0000 | ||
| 16923 | @@ -0,0 +1,2748 @@ | ||
| 16924 | +/*********************************************************************** | ||
| 16925 | +** Copyright (C) 2003 ACX100 Open Source Project | ||
| 16926 | +** | ||
| 16927 | +** The contents of this file are subject to the Mozilla Public | ||
| 16928 | +** License Version 1.1 (the "License"); you may not use this file | ||
| 16929 | +** except in compliance with the License. You may obtain a copy of | ||
| 16930 | +** the License at http://www.mozilla.org/MPL/ | ||
| 16931 | +** | ||
| 16932 | +** Software distributed under the License is distributed on an "AS | ||
| 16933 | +** IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or | ||
| 16934 | +** implied. See the License for the specific language governing | ||
| 16935 | +** rights and limitations under the License. | ||
| 16936 | +** | ||
| 16937 | +** Alternatively, the contents of this file may be used under the | ||
| 16938 | +** terms of the GNU Public License version 2 (the "GPL"), in which | ||
| 16939 | +** case the provisions of the GPL are applicable instead of the | ||
| 16940 | +** above. If you wish to allow the use of your version of this file | ||
| 16941 | +** only under the terms of the GPL and not to allow others to use | ||
| 16942 | +** your version of this file under the MPL, indicate your decision | ||
| 16943 | +** by deleting the provisions above and replace them with the notice | ||
| 16944 | +** and other provisions required by the GPL. If you do not delete | ||
| 16945 | +** the provisions above, a recipient may use your version of this | ||
| 16946 | +** file under either the MPL or the GPL. | ||
| 16947 | +** --------------------------------------------------------------------- | ||
| 16948 | +** Inquiries regarding the ACX100 Open Source Project can be | ||
| 16949 | +** made directly to: | ||
| 16950 | +** | ||
| 16951 | +** acx100-users@lists.sf.net | ||
| 16952 | +** http://acx100.sf.net | ||
| 16953 | +** --------------------------------------------------------------------- | ||
| 16954 | +*/ | ||
| 16955 | + | ||
| 16956 | +#include <linux/version.h> | ||
| 16957 | +#if LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 18) | ||
| 16958 | +#include <linux/config.h> | ||
| 16959 | +#endif | ||
| 16960 | +#include <linux/kernel.h> | ||
| 16961 | +#include <linux/types.h> | ||
| 16962 | +#include <asm/io.h> | ||
| 16963 | +/* #include <asm/uaccess.h> */ /* required for 2.4.x kernels; verify_write() */ | ||
| 16964 | +#include <linux/if_arp.h> | ||
| 16965 | +#include <linux/wireless.h> | ||
| 16966 | +#include <net/iw_handler.h> | ||
| 16967 | + | ||
| 16968 | +#include "acx.h" | ||
| 16969 | + | ||
| 16970 | + | ||
| 16971 | +/*********************************************************************** | ||
| 16972 | +*/ | ||
| 16973 | + | ||
| 16974 | +/* channel frequencies | ||
| 16975 | + * TODO: Currently, every other 802.11 driver keeps its own copy of this. In | ||
| 16976 | + * the long run this should be integrated into ieee802_11.h or wireless.h or | ||
| 16977 | + * whatever IEEE802.11x framework evolves */ | ||
| 16978 | +static const u16 acx_channel_freq[] = { | ||
| 16979 | + 2412, 2417, 2422, 2427, 2432, 2437, 2442, | ||
| 16980 | + 2447, 2452, 2457, 2462, 2467, 2472, 2484, | ||
| 16981 | +}; | ||
| 16982 | + | ||
| 16983 | + | ||
| 16984 | +/*********************************************************************** | ||
| 16985 | +** acx_ioctl_commit | ||
| 16986 | +*/ | ||
| 16987 | +static int | ||
| 16988 | +acx_ioctl_commit(struct net_device *ndev, | ||
| 16989 | + struct iw_request_info *info, | ||
| 16990 | + union iwreq_data *wrqu, | ||
| 16991 | + char *extra) | ||
| 16992 | +{ | ||
| 16993 | + acx_device_t *adev = ndev2adev(ndev); | ||
| 16994 | + | ||
| 16995 | + FN_ENTER; | ||
| 16996 | + | ||
| 16997 | + acx_sem_lock(adev); | ||
| 16998 | + if (ACX_STATE_IFACE_UP & adev->dev_state_mask) | ||
| 16999 | + acx_s_update_card_settings(adev); | ||
| 17000 | + acx_sem_unlock(adev); | ||
| 17001 | + | ||
| 17002 | + FN_EXIT0; | ||
| 17003 | + return OK; | ||
| 17004 | +} | ||
| 17005 | + | ||
| 17006 | + | ||
| 17007 | +/*********************************************************************** | ||
| 17008 | +*/ | ||
| 17009 | +static int | ||
| 17010 | +acx_ioctl_get_name( | ||
| 17011 | + struct net_device *ndev, | ||
| 17012 | + struct iw_request_info *info, | ||
| 17013 | + union iwreq_data *wrqu, | ||
| 17014 | + char *extra) | ||
| 17015 | +{ | ||
| 17016 | + acx_device_t *adev = ndev2adev(ndev); | ||
| 17017 | + static const char * const names[] = { "IEEE 802.11b+/g+", "IEEE 802.11b+" }; | ||
| 17018 | + | ||
| 17019 | + strcpy(wrqu->name, names[IS_ACX111(adev) ? 0 : 1]); | ||
| 17020 | + | ||
| 17021 | + return OK; | ||
| 17022 | +} | ||
| 17023 | + | ||
| 17024 | + | ||
| 17025 | +/*********************************************************************** | ||
| 17026 | +** acx_ioctl_set_freq | ||
| 17027 | +*/ | ||
| 17028 | +static int | ||
| 17029 | +acx_ioctl_set_freq( | ||
| 17030 | + struct net_device *ndev, | ||
| 17031 | + struct iw_request_info *info, | ||
| 17032 | + union iwreq_data *wrqu, | ||
| 17033 | + char *extra) | ||
| 17034 | +{ | ||
| 17035 | + acx_device_t *adev = ndev2adev(ndev); | ||
| 17036 | + int channel = -1; | ||
| 17037 | + unsigned int mult = 1; | ||
| 17038 | + int result; | ||
| 17039 | + | ||
| 17040 | + FN_ENTER; | ||
| 17041 | + | ||
| 17042 | + if (wrqu->freq.e == 0 && wrqu->freq.m <= 1000) { | ||
| 17043 | + /* Setting by channel number */ | ||
| 17044 | + channel = wrqu->freq.m; | ||
| 17045 | + } else { | ||
| 17046 | + /* If setting by frequency, convert to a channel */ | ||
| 17047 | + int i; | ||
| 17048 | + | ||
| 17049 | + for (i = 0; i < (6 - wrqu->freq.e); i++) | ||
| 17050 | + mult *= 10; | ||
| 17051 | + | ||
| 17052 | + for (i = 1; i <= 14; i++) | ||
| 17053 | + if (wrqu->freq.m == acx_channel_freq[i - 1] * mult) | ||
| 17054 | + channel = i; | ||
| 17055 | + } | ||
| 17056 | + | ||
| 17057 | + if (channel > 14) { | ||
| 17058 | + result = -EINVAL; | ||
| 17059 | + goto end; | ||
| 17060 | + } | ||
| 17061 | + | ||
| 17062 | + acx_sem_lock(adev); | ||
| 17063 | + | ||
| 17064 | + adev->channel = channel; | ||
| 17065 | + /* hmm, the following code part is strange, but this is how | ||
| 17066 | + * it was being done before... */ | ||
| 17067 | + log(L_IOCTL, "Changing to channel %d\n", channel); | ||
| 17068 | + SET_BIT(adev->set_mask, GETSET_CHANNEL); | ||
| 17069 | + | ||
| 17070 | + result = -EINPROGRESS; /* need to call commit handler */ | ||
| 17071 | + | ||
| 17072 | + acx_sem_unlock(adev); | ||
| 17073 | +end: | ||
| 17074 | + FN_EXIT1(result); | ||
| 17075 | + return result; | ||
| 17076 | +} | ||
| 17077 | + | ||
| 17078 | + | ||
| 17079 | +/*********************************************************************** | ||
| 17080 | +*/ | ||
| 17081 | +static inline int | ||
| 17082 | +acx_ioctl_get_freq( | ||
| 17083 | + struct net_device *ndev, | ||
| 17084 | + struct iw_request_info *info, | ||
| 17085 | + union iwreq_data *wrqu, | ||
| 17086 | + char *extra) | ||
| 17087 | +{ | ||
| 17088 | + acx_device_t *adev = ndev2adev(ndev); | ||
| 17089 | + wrqu->freq.e = 0; | ||
| 17090 | + wrqu->freq.m = adev->channel; | ||
| 17091 | + return OK; | ||
| 17092 | +} | ||
| 17093 | + | ||
| 17094 | + | ||
| 17095 | +/*********************************************************************** | ||
| 17096 | +** acx_ioctl_set_mode | ||
| 17097 | +*/ | ||
| 17098 | +static int | ||
| 17099 | +acx_ioctl_set_mode( | ||
| 17100 | + struct net_device *ndev, | ||
| 17101 | + struct iw_request_info *info, | ||
| 17102 | + union iwreq_data *wrqu, | ||
| 17103 | + char *extra) | ||
| 17104 | +{ | ||
| 17105 | + acx_device_t *adev = ndev2adev(ndev); | ||
| 17106 | + int result; | ||
| 17107 | + | ||
| 17108 | + FN_ENTER; | ||
| 17109 | + | ||
| 17110 | + acx_sem_lock(adev); | ||
| 17111 | + | ||
| 17112 | + switch (wrqu->mode) { | ||
| 17113 | + case IW_MODE_AUTO: | ||
| 17114 | + adev->mode = ACX_MODE_OFF; | ||
| 17115 | + break; | ||
| 17116 | + case IW_MODE_MONITOR: | ||
| 17117 | + adev->mode = ACX_MODE_MONITOR; | ||
| 17118 | + break; | ||
| 17119 | + case IW_MODE_ADHOC: | ||
| 17120 | + adev->mode = ACX_MODE_0_ADHOC; | ||
| 17121 | + break; | ||
| 17122 | + case IW_MODE_INFRA: | ||
| 17123 | + adev->mode = ACX_MODE_2_STA; | ||
| 17124 | + break; | ||
| 17125 | + case IW_MODE_MASTER: | ||
| 17126 | + printk("acx: master mode (HostAP) is very, very " | ||
| 17127 | + "experimental! It might work partially, but " | ||
| 17128 | + "better get prepared for nasty surprises " | ||
| 17129 | + "at any time\n"); | ||
| 17130 | + adev->mode = ACX_MODE_3_AP; | ||
| 17131 | + break; | ||
| 17132 | + case IW_MODE_REPEAT: | ||
| 17133 | + case IW_MODE_SECOND: | ||
| 17134 | + default: | ||
| 17135 | + result = -EOPNOTSUPP; | ||
| 17136 | + goto end_unlock; | ||
| 17137 | + } | ||
| 17138 | + | ||
| 17139 | + log(L_ASSOC, "new adev->mode=%d\n", adev->mode); | ||
| 17140 | + SET_BIT(adev->set_mask, GETSET_MODE); | ||
| 17141 | + result = -EINPROGRESS; | ||
| 17142 | + | ||
| 17143 | +end_unlock: | ||
| 17144 | + acx_sem_unlock(adev); | ||
| 17145 | + | ||
| 17146 | + FN_EXIT1(result); | ||
| 17147 | + return result; | ||
| 17148 | +} | ||
| 17149 | + | ||
| 17150 | + | ||
| 17151 | +/*********************************************************************** | ||
| 17152 | +*/ | ||
| 17153 | +static int | ||
| 17154 | +acx_ioctl_get_mode( | ||
| 17155 | + struct net_device *ndev, | ||
| 17156 | + struct iw_request_info *info, | ||
| 17157 | + union iwreq_data *wrqu, | ||
| 17158 | + char *extra) | ||
| 17159 | +{ | ||
| 17160 | + acx_device_t *adev = ndev2adev(ndev); | ||
| 17161 | + int result = 0; | ||
| 17162 | + | ||
| 17163 | + switch (adev->mode) { | ||
| 17164 | + case ACX_MODE_OFF: | ||
| 17165 | + wrqu->mode = IW_MODE_AUTO; break; | ||
| 17166 | + case ACX_MODE_MONITOR: | ||
| 17167 | + wrqu->mode = IW_MODE_MONITOR; break; | ||
| 17168 | + case ACX_MODE_0_ADHOC: | ||
| 17169 | + wrqu->mode = IW_MODE_ADHOC; break; | ||
| 17170 | + case ACX_MODE_2_STA: | ||
| 17171 | + wrqu->mode = IW_MODE_INFRA; break; | ||
| 17172 | + case ACX_MODE_3_AP: | ||
| 17173 | + wrqu->mode = IW_MODE_MASTER; break; | ||
| 17174 | + default: | ||
| 17175 | + result = -EOPNOTSUPP; | ||
| 17176 | + } | ||
| 17177 | + return result; | ||
| 17178 | +} | ||
| 17179 | + | ||
| 17180 | + | ||
| 17181 | +/*********************************************************************** | ||
| 17182 | +*/ | ||
| 17183 | +static int | ||
| 17184 | +acx_ioctl_set_sens( | ||
| 17185 | + struct net_device *ndev, | ||
| 17186 | + struct iw_request_info *info, | ||
| 17187 | + union iwreq_data *wrqu, | ||
| 17188 | + char *extra) | ||
| 17189 | +{ | ||
| 17190 | + struct iw_param *vwrq = &wrqu->sens; | ||
| 17191 | + acx_device_t *adev = ndev2adev(ndev); | ||
| 17192 | + | ||
| 17193 | + acx_sem_lock(adev); | ||
| 17194 | + | ||
| 17195 | + adev->sensitivity = (1 == vwrq->disabled) ? 0 : vwrq->value; | ||
| 17196 | + SET_BIT(adev->set_mask, GETSET_SENSITIVITY); | ||
| 17197 | + | ||
| 17198 | + acx_sem_unlock(adev); | ||
| 17199 | + | ||
| 17200 | + return -EINPROGRESS; | ||
| 17201 | +} | ||
| 17202 | + | ||
| 17203 | + | ||
| 17204 | +/*********************************************************************** | ||
| 17205 | +*/ | ||
| 17206 | +static int | ||
| 17207 | +acx_ioctl_get_sens( | ||
| 17208 | + struct net_device *ndev, | ||
| 17209 | + struct iw_request_info *info, | ||
| 17210 | + union iwreq_data *wrqu, | ||
| 17211 | + char *extra) | ||
| 17212 | +{ | ||
| 17213 | + struct iw_param *vwrq = &wrqu->sens; | ||
| 17214 | + acx_device_t *adev = ndev2adev(ndev); | ||
| 17215 | + | ||
| 17216 | + if (IS_USB(adev)) | ||
| 17217 | + /* setting the PHY reg via fw cmd doesn't work yet */ | ||
| 17218 | + return -EOPNOTSUPP; | ||
| 17219 | + | ||
| 17220 | + /* acx_sem_lock(adev); */ | ||
| 17221 | + | ||
| 17222 | + vwrq->value = adev->sensitivity; | ||
| 17223 | + vwrq->disabled = (vwrq->value == 0); | ||
| 17224 | + vwrq->fixed = 1; | ||
| 17225 | + | ||
| 17226 | + /* acx_sem_unlock(adev); */ | ||
| 17227 | + | ||
| 17228 | + return OK; | ||
| 17229 | +} | ||
| 17230 | + | ||
| 17231 | + | ||
| 17232 | +/*********************************************************************** | ||
| 17233 | +** acx_ioctl_set_ap | ||
| 17234 | +** | ||
| 17235 | +** Sets the MAC address of the AP to associate with | ||
| 17236 | +*/ | ||
| 17237 | +static int | ||
| 17238 | +acx_ioctl_set_ap( | ||
| 17239 | + struct net_device *ndev, | ||
| 17240 | + struct iw_request_info *info, | ||
| 17241 | + union iwreq_data *wrqu, | ||
| 17242 | + char *extra) | ||
| 17243 | +{ | ||
| 17244 | + struct sockaddr *awrq = &wrqu->ap_addr; | ||
| 17245 | + acx_device_t *adev = ndev2adev(ndev); | ||
| 17246 | + int result = 0; | ||
| 17247 | + const u8 *ap; | ||
| 17248 | + | ||
| 17249 | + FN_ENTER; | ||
| 17250 | + if (NULL == awrq) { | ||
| 17251 | + result = -EFAULT; | ||
| 17252 | + goto end; | ||
| 17253 | + } | ||
| 17254 | + if (ARPHRD_ETHER != awrq->sa_family) { | ||
| 17255 | + result = -EINVAL; | ||
| 17256 | + goto end; | ||
| 17257 | + } | ||
| 17258 | + | ||
| 17259 | + ap = awrq->sa_data; | ||
| 17260 | + acxlog_mac(L_IOCTL, "set AP=", ap, "\n"); | ||
| 17261 | + | ||
| 17262 | + MAC_COPY(adev->ap, ap); | ||
| 17263 | + | ||
| 17264 | + /* We want to start rescan in managed or ad-hoc mode, | ||
| 17265 | + ** otherwise just set adev->ap. | ||
| 17266 | + ** "iwconfig <if> ap <mac> mode managed": we must be able | ||
| 17267 | + ** to set ap _first_ and _then_ set mode */ | ||
| 17268 | + switch (adev->mode) { | ||
| 17269 | + case ACX_MODE_0_ADHOC: | ||
| 17270 | + case ACX_MODE_2_STA: | ||
| 17271 | + /* FIXME: if there is a convention on what zero AP means, | ||
| 17272 | + ** please add a comment about that. I don't know of any --vda */ | ||
| 17273 | + if (mac_is_zero(ap)) { | ||
| 17274 | + /* "off" == 00:00:00:00:00:00 */ | ||
| 17275 | + MAC_BCAST(adev->ap); | ||
| 17276 | + log(L_IOCTL, "Not reassociating\n"); | ||
| 17277 | + } else { | ||
| 17278 | + log(L_IOCTL, "Forcing reassociation\n"); | ||
| 17279 | + SET_BIT(adev->set_mask, GETSET_RESCAN); | ||
| 17280 | + } | ||
| 17281 | + break; | ||
| 17282 | + } | ||
| 17283 | + result = -EINPROGRESS; | ||
| 17284 | +end: | ||
| 17285 | + FN_EXIT1(result); | ||
| 17286 | + return result; | ||
| 17287 | +} | ||
| 17288 | + | ||
| 17289 | + | ||
| 17290 | +/*********************************************************************** | ||
| 17291 | +*/ | ||
| 17292 | +static int | ||
| 17293 | +acx_ioctl_get_ap( | ||
| 17294 | + struct net_device *ndev, | ||
| 17295 | + struct iw_request_info *info, | ||
| 17296 | + union iwreq_data *wrqu, | ||
| 17297 | + char *extra) | ||
| 17298 | +{ | ||
| 17299 | + struct sockaddr *awrq = &wrqu->ap_addr; | ||
| 17300 | + acx_device_t *adev = ndev2adev(ndev); | ||
| 17301 | + | ||
| 17302 | + if (ACX_STATUS_4_ASSOCIATED == adev->status) { | ||
| 17303 | + /* as seen in Aironet driver, airo.c */ | ||
| 17304 | + MAC_COPY(awrq->sa_data, adev->bssid); | ||
| 17305 | + } else { | ||
| 17306 | + MAC_ZERO(awrq->sa_data); | ||
| 17307 | + } | ||
| 17308 | + awrq->sa_family = ARPHRD_ETHER; | ||
| 17309 | + return OK; | ||
| 17310 | +} | ||
| 17311 | + | ||
| 17312 | + | ||
| 17313 | +/*********************************************************************** | ||
| 17314 | +** acx_ioctl_get_aplist | ||
| 17315 | +** | ||
| 17316 | +** Deprecated in favor of iwscan. | ||
| 17317 | +** We simply return the list of currently available stations in range, | ||
| 17318 | +** don't do a new scan. | ||
| 17319 | +*/ | ||
| 17320 | +static int | ||
| 17321 | +acx_ioctl_get_aplist( | ||
| 17322 | + struct net_device *ndev, | ||
| 17323 | + struct iw_request_info *info, | ||
| 17324 | + union iwreq_data *wrqu, | ||
| 17325 | + char *extra) | ||
| 17326 | +{ | ||
| 17327 | + struct iw_point *dwrq = &wrqu->data; | ||
| 17328 | + acx_device_t *adev = ndev2adev(ndev); | ||
| 17329 | + struct sockaddr *address = (struct sockaddr *) extra; | ||
| 17330 | + struct iw_quality qual[IW_MAX_AP]; | ||
| 17331 | + int i, cur; | ||
| 17332 | + int result = OK; | ||
| 17333 | + | ||
| 17334 | + FN_ENTER; | ||
| 17335 | + | ||
| 17336 | + /* we have AP list only in STA mode */ | ||
| 17337 | + if (ACX_MODE_2_STA != adev->mode) { | ||
| 17338 | + result = -EOPNOTSUPP; | ||
| 17339 | + goto end; | ||
| 17340 | + } | ||
| 17341 | + | ||
| 17342 | + cur = 0; | ||
| 17343 | + for (i = 0; i < VEC_SIZE(adev->sta_list); i++) { | ||
| 17344 | + struct client *bss = &adev->sta_list[i]; | ||
| 17345 | + if (!bss->used) continue; | ||
| 17346 | + MAC_COPY(address[cur].sa_data, bss->bssid); | ||
| 17347 | + address[cur].sa_family = ARPHRD_ETHER; | ||
| 17348 | + qual[cur].level = bss->sir; | ||
| 17349 | + qual[cur].noise = bss->snr; | ||
| 17350 | +#ifndef OLD_QUALITY | ||
| 17351 | + qual[cur].qual = acx_signal_determine_quality(qual[cur].level, | ||
| 17352 | + qual[cur].noise); | ||
| 17353 | +#else | ||
| 17354 | + qual[cur].qual = (qual[cur].noise <= 100) ? | ||
| 17355 | + 100 - qual[cur].noise : 0; | ||
| 17356 | +#endif | ||
| 17357 | + /* no scan: level/noise/qual not updated: */ | ||
| 17358 | + qual[cur].updated = 0; | ||
| 17359 | + cur++; | ||
| 17360 | + } | ||
| 17361 | + if (cur) { | ||
| 17362 | + dwrq->flags = 1; | ||
| 17363 | + memcpy(extra + sizeof(struct sockaddr)*cur, &qual, | ||
| 17364 | + sizeof(struct iw_quality)*cur); | ||
| 17365 | + } | ||
| 17366 | + dwrq->length = cur; | ||
| 17367 | +end: | ||
| 17368 | + FN_EXIT1(result); | ||
| 17369 | + return result; | ||
| 17370 | +} | ||
| 17371 | + | ||
| 17372 | + | ||
| 17373 | +/*********************************************************************** | ||
| 17374 | +*/ | ||
| 17375 | +static int | ||
| 17376 | +acx_ioctl_set_scan( | ||
| 17377 | + struct net_device *ndev, | ||
| 17378 | + struct iw_request_info *info, | ||
| 17379 | + union iwreq_data *wrqu, | ||
| 17380 | + char *extra) | ||
| 17381 | +{ | ||
| 17382 | + acx_device_t *adev = ndev2adev(ndev); | ||
| 17383 | + int result; | ||
| 17384 | + | ||
| 17385 | + FN_ENTER; | ||
| 17386 | + | ||
| 17387 | + acx_sem_lock(adev); | ||
| 17388 | + | ||
| 17389 | + /* don't start scan if device is not up yet */ | ||
| 17390 | + if (!(adev->dev_state_mask & ACX_STATE_IFACE_UP)) { | ||
| 17391 | + result = -EAGAIN; | ||
| 17392 | + goto end_unlock; | ||
| 17393 | + } | ||
| 17394 | + | ||
| 17395 | + /* This is NOT a rescan for new AP! | ||
| 17396 | + ** Do not use SET_BIT(GETSET_RESCAN); */ | ||
| 17397 | + acx_s_cmd_start_scan(adev); | ||
| 17398 | + result = OK; | ||
| 17399 | + | ||
| 17400 | +end_unlock: | ||
| 17401 | + acx_sem_unlock(adev); | ||
| 17402 | +/* end: */ | ||
| 17403 | + FN_EXIT1(result); | ||
| 17404 | + return result; | ||
| 17405 | +} | ||
| 17406 | + | ||
| 17407 | + | ||
| 17408 | +/*********************************************************************** | ||
| 17409 | +** acx_s_scan_add_station | ||
| 17410 | +*/ | ||
| 17411 | +/* helper. not sure whether it's really a _s_leeping fn */ | ||
| 17412 | +static char* | ||
| 17413 | +acx_s_scan_add_station( | ||
| 17414 | + acx_device_t *adev, | ||
| 17415 | + char *ptr, | ||
| 17416 | + char *end_buf, | ||
| 17417 | + struct client *bss) | ||
| 17418 | +{ | ||
| 17419 | + struct iw_event iwe; | ||
| 17420 | + char *ptr_rate; | ||
| 17421 | + | ||
| 17422 | + FN_ENTER; | ||
| 17423 | + | ||
| 17424 | + /* MAC address has to be added first */ | ||
| 17425 | + iwe.cmd = SIOCGIWAP; | ||
| 17426 | + iwe.u.ap_addr.sa_family = ARPHRD_ETHER; | ||
| 17427 | + MAC_COPY(iwe.u.ap_addr.sa_data, bss->bssid); | ||
| 17428 | + acxlog_mac(L_IOCTL, "scan, station address: ", bss->bssid, "\n"); | ||
| 17429 | + ptr = iwe_stream_add_event(ptr, end_buf, &iwe, IW_EV_ADDR_LEN); | ||
| 17430 | + | ||
| 17431 | + /* Add ESSID */ | ||
| 17432 | + iwe.cmd = SIOCGIWESSID; | ||
| 17433 | + iwe.u.data.length = bss->essid_len; | ||
| 17434 | + iwe.u.data.flags = 1; | ||
| 17435 | + log(L_IOCTL, "scan, essid: %s\n", bss->essid); | ||
| 17436 | + ptr = iwe_stream_add_point(ptr, end_buf, &iwe, bss->essid); | ||
| 17437 | + | ||
| 17438 | + /* Add mode */ | ||
| 17439 | + iwe.cmd = SIOCGIWMODE; | ||
| 17440 | + if (bss->cap_info & (WF_MGMT_CAP_ESS | WF_MGMT_CAP_IBSS)) { | ||
| 17441 | + if (bss->cap_info & WF_MGMT_CAP_ESS) | ||
| 17442 | + iwe.u.mode = IW_MODE_MASTER; | ||
| 17443 | + else | ||
| 17444 | + iwe.u.mode = IW_MODE_ADHOC; | ||
| 17445 | + log(L_IOCTL, "scan, mode: %d\n", iwe.u.mode); | ||
| 17446 | + ptr = iwe_stream_add_event(ptr, end_buf, &iwe, IW_EV_UINT_LEN); | ||
| 17447 | + } | ||
| 17448 | + | ||
| 17449 | + /* Add frequency */ | ||
| 17450 | + iwe.cmd = SIOCGIWFREQ; | ||
| 17451 | + iwe.u.freq.m = acx_channel_freq[bss->channel - 1] * 100000; | ||
| 17452 | + iwe.u.freq.e = 1; | ||
| 17453 | + log(L_IOCTL, "scan, frequency: %d\n", iwe.u.freq.m); | ||
| 17454 | + ptr = iwe_stream_add_event(ptr, end_buf, &iwe, IW_EV_FREQ_LEN); | ||
| 17455 | + | ||
| 17456 | + /* Add link quality */ | ||
| 17457 | + iwe.cmd = IWEVQUAL; | ||
| 17458 | + /* FIXME: these values should be expressed in dBm, but we don't know | ||
| 17459 | + * how to calibrate it yet */ | ||
| 17460 | + iwe.u.qual.level = bss->sir; | ||
| 17461 | + iwe.u.qual.noise = bss->snr; | ||
| 17462 | +#ifndef OLD_QUALITY | ||
| 17463 | + iwe.u.qual.qual = acx_signal_determine_quality(iwe.u.qual.level, | ||
| 17464 | + iwe.u.qual.noise); | ||
| 17465 | +#else | ||
| 17466 | + iwe.u.qual.qual = (iwe.u.qual.noise <= 100) ? | ||
| 17467 | + 100 - iwe.u.qual.noise : 0; | ||
| 17468 | +#endif | ||
| 17469 | + iwe.u.qual.updated = 7; | ||
| 17470 | + log(L_IOCTL, "scan, link quality: %d/%d/%d\n", | ||
| 17471 | + iwe.u.qual.level, iwe.u.qual.noise, iwe.u.qual.qual); | ||
| 17472 | + ptr = iwe_stream_add_event(ptr, end_buf, &iwe, IW_EV_QUAL_LEN); | ||
| 17473 | + | ||
| 17474 | + /* Add encryption */ | ||
| 17475 | + iwe.cmd = SIOCGIWENCODE; | ||
| 17476 | + if (bss->cap_info & WF_MGMT_CAP_PRIVACY) | ||
| 17477 | + iwe.u.data.flags = IW_ENCODE_ENABLED | IW_ENCODE_NOKEY; | ||
| 17478 | + else | ||
| 17479 | + iwe.u.data.flags = IW_ENCODE_DISABLED; | ||
| 17480 | + iwe.u.data.length = 0; | ||
| 17481 | + log(L_IOCTL, "scan, encryption flags: %X\n", iwe.u.data.flags); | ||
| 17482 | + ptr = iwe_stream_add_point(ptr, end_buf, &iwe, bss->essid); | ||
| 17483 | + | ||
| 17484 | + /* add rates */ | ||
| 17485 | + iwe.cmd = SIOCGIWRATE; | ||
| 17486 | + iwe.u.bitrate.fixed = iwe.u.bitrate.disabled = 0; | ||
| 17487 | + ptr_rate = ptr + IW_EV_LCP_LEN; | ||
| 17488 | + | ||
| 17489 | + { | ||
| 17490 | + u16 rate = bss->rate_cap; | ||
| 17491 | + const u8* p = acx_bitpos2ratebyte; | ||
| 17492 | + while (rate) { | ||
| 17493 | + if (rate & 1) { | ||
| 17494 | + iwe.u.bitrate.value = *p * 500000; /* units of 500kb/s */ | ||
| 17495 | + log(L_IOCTL, "scan, rate: %d\n", iwe.u.bitrate.value); | ||
| 17496 | + ptr_rate = iwe_stream_add_value(ptr, ptr_rate, end_buf, | ||
| 17497 | + &iwe, IW_EV_PARAM_LEN); | ||
| 17498 | + } | ||
| 17499 | + rate >>= 1; | ||
| 17500 | + p++; | ||
| 17501 | + }} | ||
| 17502 | + | ||
| 17503 | + if ((ptr_rate - ptr) > (ptrdiff_t)IW_EV_LCP_LEN) | ||
| 17504 | + ptr = ptr_rate; | ||
| 17505 | + | ||
| 17506 | + /* drop remaining station data items for now */ | ||
| 17507 | + | ||
| 17508 | + FN_EXIT0; | ||
| 17509 | + return ptr; | ||
| 17510 | +} | ||
| 17511 | + | ||
| 17512 | + | ||
| 17513 | +/*********************************************************************** | ||
| 17514 | + * acx_ioctl_get_scan | ||
| 17515 | + */ | ||
| 17516 | +static int | ||
| 17517 | +acx_ioctl_get_scan( | ||
| 17518 | + struct net_device *ndev, | ||
| 17519 | + struct iw_request_info *info, | ||
| 17520 | + union iwreq_data *wrqu, | ||
| 17521 | + char *extra) | ||
| 17522 | +{ | ||
| 17523 | + struct iw_point *dwrq = &wrqu->data; | ||
| 17524 | + acx_device_t *adev = ndev2adev(ndev); | ||
| 17525 | + char *ptr = extra; | ||
| 17526 | + int i; | ||
| 17527 | + int result = OK; | ||
| 17528 | + | ||
| 17529 | + FN_ENTER; | ||
| 17530 | + | ||
| 17531 | + acx_sem_lock(adev); | ||
| 17532 | + | ||
| 17533 | + /* no scan available if device is not up yet */ | ||
| 17534 | + if (!(adev->dev_state_mask & ACX_STATE_IFACE_UP)) { | ||
| 17535 | + log(L_IOCTL, "iface not up yet\n"); | ||
| 17536 | + result = -EAGAIN; | ||
| 17537 | + goto end_unlock; | ||
| 17538 | + } | ||
| 17539 | + | ||
| 17540 | +#ifdef ENODATA_TO_BE_USED_AFTER_SCAN_ERROR_ONLY | ||
| 17541 | + if (adev->bss_table_count == 0) { | ||
| 17542 | + /* no stations found */ | ||
| 17543 | + result = -ENODATA; | ||
| 17544 | + goto end_unlock; | ||
| 17545 | + } | ||
| 17546 | +#endif | ||
| 17547 | + | ||
| 17548 | + for (i = 0; i < VEC_SIZE(adev->sta_list); i++) { | ||
| 17549 | + struct client *bss = &adev->sta_list[i]; | ||
| 17550 | + if (!bss->used) continue; | ||
| 17551 | + ptr = acx_s_scan_add_station(adev, ptr, | ||
| 17552 | + extra + IW_SCAN_MAX_DATA, bss); | ||
| 17553 | + } | ||
| 17554 | + dwrq->length = ptr - extra; | ||
| 17555 | + dwrq->flags = 0; | ||
| 17556 | + | ||
| 17557 | +end_unlock: | ||
| 17558 | + acx_sem_unlock(adev); | ||
| 17559 | +/* end: */ | ||
| 17560 | + FN_EXIT1(result); | ||
| 17561 | + return result; | ||
| 17562 | +} | ||
| 17563 | + | ||
| 17564 | + | ||
| 17565 | +/*********************************************************************** | ||
| 17566 | +** acx_ioctl_set_essid | ||
| 17567 | +*/ | ||
| 17568 | +static int | ||
| 17569 | +acx_ioctl_set_essid( | ||
| 17570 | + struct net_device *ndev, | ||
| 17571 | + struct iw_request_info *info, | ||
| 17572 | + union iwreq_data *wrqu, | ||
| 17573 | + char *extra) | ||
| 17574 | +{ | ||
| 17575 | + struct iw_point *dwrq = &wrqu->essid; | ||
| 17576 | + acx_device_t *adev = ndev2adev(ndev); | ||
| 17577 | + int len = dwrq->length; | ||
| 17578 | + int result; | ||
| 17579 | + | ||
| 17580 | + FN_ENTER; | ||
| 17581 | + | ||
| 17582 | + if (len < 0) { | ||
| 17583 | + result = -EINVAL; | ||
| 17584 | + goto end; | ||
| 17585 | + } | ||
| 17586 | + | ||
| 17587 | + log(L_IOCTL, "set ESSID '%*s', length %d, flags 0x%04X\n", | ||
| 17588 | + len, extra, len, dwrq->flags); | ||
| 17589 | + | ||
| 17590 | +#if WIRELESS_EXT >= 21 | ||
| 17591 | + /* WE 21 gives real ESSID strlen, not +1 (trailing zero): | ||
| 17592 | + * see LKML "[patch] drivers/net/wireless: correct reported ssid lengths" */ | ||
| 17593 | + len += 1; | ||
| 17594 | +#endif | ||
| 17595 | + | ||
| 17596 | + acx_sem_lock(adev); | ||
| 17597 | + | ||
| 17598 | + /* ESSID disabled? */ | ||
| 17599 | + if (0 == dwrq->flags) { | ||
| 17600 | + adev->essid_active = 0; | ||
| 17601 | + | ||
| 17602 | + } else { | ||
| 17603 | + if (len > IW_ESSID_MAX_SIZE) { | ||
| 17604 | + result = -E2BIG; | ||
| 17605 | + goto end_unlock; | ||
| 17606 | + } | ||
| 17607 | + | ||
| 17608 | + if (len >= sizeof(adev->essid)) | ||
| 17609 | + len = sizeof(adev->essid) - 1; | ||
| 17610 | + memcpy(adev->essid, extra, len); | ||
| 17611 | + adev->essid[len] = '\0'; | ||
| 17612 | + /* Paranoia: just in case there is a '\0'... */ | ||
| 17613 | + adev->essid_len = strlen(adev->essid); | ||
| 17614 | + adev->essid_active = 1; | ||
| 17615 | + } | ||
| 17616 | + | ||
| 17617 | + SET_BIT(adev->set_mask, GETSET_RESCAN); | ||
| 17618 | + | ||
| 17619 | + result = -EINPROGRESS; | ||
| 17620 | + | ||
| 17621 | +end_unlock: | ||
| 17622 | + acx_sem_unlock(adev); | ||
| 17623 | +end: | ||
| 17624 | + FN_EXIT1(result); | ||
| 17625 | + return result; | ||
| 17626 | +} | ||
| 17627 | + | ||
| 17628 | + | ||
| 17629 | +/*********************************************************************** | ||
| 17630 | +*/ | ||
| 17631 | +static int | ||
| 17632 | +acx_ioctl_get_essid( | ||
| 17633 | + struct net_device *ndev, | ||
| 17634 | + struct iw_request_info *info, | ||
| 17635 | + union iwreq_data *wrqu, | ||
| 17636 | + char *extra) | ||
| 17637 | +{ | ||
| 17638 | + struct iw_point *dwrq = &wrqu->essid; | ||
| 17639 | + acx_device_t *adev = ndev2adev(ndev); | ||
| 17640 | + | ||
| 17641 | + dwrq->flags = adev->essid_active; | ||
| 17642 | + if (adev->essid_active) { | ||
| 17643 | + memcpy(extra, adev->essid, adev->essid_len); | ||
| 17644 | + extra[adev->essid_len] = '\0'; | ||
| 17645 | + dwrq->length = adev->essid_len + 1; | ||
| 17646 | + dwrq->flags = 1; | ||
| 17647 | + } | ||
| 17648 | + return OK; | ||
| 17649 | +} | ||
| 17650 | + | ||
| 17651 | + | ||
| 17652 | +/*********************************************************************** | ||
| 17653 | +** acx_l_update_client_rates | ||
| 17654 | +*/ | ||
| 17655 | +static void | ||
| 17656 | +acx_l_update_client_rates(acx_device_t *adev, u16 rate) | ||
| 17657 | +{ | ||
| 17658 | + int i; | ||
| 17659 | + for (i = 0; i < VEC_SIZE(adev->sta_list); i++) { | ||
| 17660 | + client_t *clt = &adev->sta_list[i]; | ||
| 17661 | + if (!clt->used) continue; | ||
| 17662 | + clt->rate_cfg = (clt->rate_cap & rate); | ||
| 17663 | + if (!clt->rate_cfg) { | ||
| 17664 | + /* no compatible rates left: kick client */ | ||
| 17665 | + acxlog_mac(L_ASSOC, "client ",clt->address," kicked: " | ||
| 17666 | + "rates are not compatible anymore\n"); | ||
| 17667 | + acx_l_sta_list_del(adev, clt); | ||
| 17668 | + continue; | ||
| 17669 | + } | ||
| 17670 | + clt->rate_cur &= clt->rate_cfg; | ||
| 17671 | + if (!clt->rate_cur) { | ||
| 17672 | + /* current rate become invalid, choose a valid one */ | ||
| 17673 | + clt->rate_cur = 1 << lowest_bit(clt->rate_cfg); | ||
| 17674 | + } | ||
| 17675 | + if (IS_ACX100(adev)) | ||
| 17676 | + clt->rate_100 = acx_bitpos2rate100[highest_bit(clt->rate_cur)]; | ||
| 17677 | + clt->fallback_count = clt->stepup_count = 0; | ||
| 17678 | + clt->ignore_count = 16; | ||
| 17679 | + } | ||
| 17680 | + switch (adev->mode) { | ||
| 17681 | + case ACX_MODE_2_STA: | ||
| 17682 | + if (adev->ap_client && !adev->ap_client->used) { | ||
| 17683 | + /* Owwww... we kicked our AP!! :) */ | ||
| 17684 | + SET_BIT(adev->set_mask, GETSET_RESCAN); | ||
| 17685 | + } | ||
| 17686 | + } | ||
| 17687 | +} | ||
| 17688 | + | ||
| 17689 | + | ||
| 17690 | +/*********************************************************************** | ||
| 17691 | +*/ | ||
| 17692 | +/* maps bits from acx111 rate to rate in Mbits */ | ||
| 17693 | +static const unsigned int | ||
| 17694 | +acx111_rate_tbl[] = { | ||
| 17695 | + 1000000, /* 0 */ | ||
| 17696 | + 2000000, /* 1 */ | ||
| 17697 | + 5500000, /* 2 */ | ||
| 17698 | + 6000000, /* 3 */ | ||
| 17699 | + 9000000, /* 4 */ | ||
| 17700 | + 11000000, /* 5 */ | ||
| 17701 | + 12000000, /* 6 */ | ||
| 17702 | + 18000000, /* 7 */ | ||
| 17703 | + 22000000, /* 8 */ | ||
| 17704 | + 24000000, /* 9 */ | ||
| 17705 | + 36000000, /* 10 */ | ||
| 17706 | + 48000000, /* 11 */ | ||
| 17707 | + 54000000, /* 12 */ | ||
| 17708 | + 500000, /* 13, should not happen */ | ||
| 17709 | + 500000, /* 14, should not happen */ | ||
| 17710 | + 500000, /* 15, should not happen */ | ||
| 17711 | +}; | ||
| 17712 | + | ||
| 17713 | +/*********************************************************************** | ||
| 17714 | + * acx_ioctl_set_rate | ||
| 17715 | + */ | ||
| 17716 | +static int | ||
| 17717 | +acx_ioctl_set_rate( | ||
| 17718 | + struct net_device *ndev, | ||
| 17719 | + struct iw_request_info *info, | ||
| 17720 | + union iwreq_data *wrqu, | ||
| 17721 | + char *extra) | ||
| 17722 | +{ | ||
| 17723 | + struct iw_param *vwrq = &wrqu->param; | ||
| 17724 | + acx_device_t *adev = ndev2adev(ndev); | ||
| 17725 | + u16 txrate_cfg = 1; | ||
| 17726 | + unsigned long flags; | ||
| 17727 | + int autorate; | ||
| 17728 | + int result = -EINVAL; | ||
| 17729 | + | ||
| 17730 | + FN_ENTER; | ||
| 17731 | + log(L_IOCTL, "rate %d fixed 0x%X disabled 0x%X flags 0x%X\n", | ||
| 17732 | + vwrq->value, vwrq->fixed, vwrq->disabled, vwrq->flags); | ||
| 17733 | + | ||
| 17734 | + if ((0 == vwrq->fixed) || (1 == vwrq->fixed)) { | ||
| 17735 | + int i = VEC_SIZE(acx111_rate_tbl)-1; | ||
| 17736 | + if (vwrq->value == -1) | ||
| 17737 | + /* "iwconfig rate auto" --> choose highest */ | ||
| 17738 | + vwrq->value = IS_ACX100(adev) ? 22000000 : 54000000; | ||
| 17739 | + while (i >= 0) { | ||
| 17740 | + if (vwrq->value == acx111_rate_tbl[i]) { | ||
| 17741 | + txrate_cfg <<= i; | ||
| 17742 | + i = 0; | ||
| 17743 | + break; | ||
| 17744 | + } | ||
| 17745 | + i--; | ||
| 17746 | + } | ||
| 17747 | + if (i == -1) { /* no matching rate */ | ||
| 17748 | + result = -EINVAL; | ||
| 17749 | + goto end; | ||
| 17750 | + } | ||
| 17751 | + } else { /* rate N, N<1000 (driver specific): we don't use this */ | ||
| 17752 | + result = -EOPNOTSUPP; | ||
| 17753 | + goto end; | ||
| 17754 | + } | ||
| 17755 | + /* now: only one bit is set in txrate_cfg, corresponding to | ||
| 17756 | + ** indicated rate */ | ||
| 17757 | + | ||
| 17758 | + autorate = (vwrq->fixed == 0) && (RATE111_1 != txrate_cfg); | ||
| 17759 | + if (autorate) { | ||
| 17760 | + /* convert 00100000 -> 00111111 */ | ||
| 17761 | + txrate_cfg = (txrate_cfg<<1)-1; | ||
| 17762 | + } | ||
| 17763 | + | ||
| 17764 | + if (IS_ACX100(adev)) { | ||
| 17765 | + txrate_cfg &= RATE111_ACX100_COMPAT; | ||
| 17766 | + if (!txrate_cfg) { | ||
| 17767 | + result = -ENOTSUPP; /* rate is not supported by acx100 */ | ||
| 17768 | + goto end; | ||
| 17769 | + } | ||
| 17770 | + } | ||
| 17771 | + | ||
| 17772 | + acx_sem_lock(adev); | ||
| 17773 | + acx_lock(adev, flags); | ||
| 17774 | + | ||
| 17775 | + adev->rate_auto = autorate; | ||
| 17776 | + adev->rate_oper = txrate_cfg; | ||
| 17777 | + adev->rate_basic = txrate_cfg; | ||
| 17778 | + /* only do that in auto mode, non-auto will be able to use | ||
| 17779 | + * one specific Tx rate only anyway */ | ||
| 17780 | + if (autorate) { | ||
| 17781 | + /* only use 802.11b base rates, for standard 802.11b H/W | ||
| 17782 | + * compatibility */ | ||
| 17783 | + adev->rate_basic &= RATE111_80211B_COMPAT; | ||
| 17784 | + } | ||
| 17785 | + adev->rate_bcast = 1 << lowest_bit(txrate_cfg); | ||
| 17786 | + if (IS_ACX100(adev)) | ||
| 17787 | + adev->rate_bcast100 = acx_rate111to100(adev->rate_bcast); | ||
| 17788 | + acx_l_update_ratevector(adev); | ||
| 17789 | + acx_l_update_client_rates(adev, txrate_cfg); | ||
| 17790 | + | ||
| 17791 | + /* Do/don't do tx rate fallback; beacon contents and rate */ | ||
| 17792 | + SET_BIT(adev->set_mask, SET_RATE_FALLBACK|SET_TEMPLATES); | ||
| 17793 | + result = -EINPROGRESS; | ||
| 17794 | + | ||
| 17795 | + acx_unlock(adev, flags); | ||
| 17796 | + acx_sem_unlock(adev); | ||
| 17797 | +end: | ||
| 17798 | + FN_EXIT1(result); | ||
| 17799 | + return result; | ||
| 17800 | +} | ||
| 17801 | + | ||
| 17802 | + | ||
| 17803 | +/*********************************************************************** | ||
| 17804 | +** acx_ioctl_get_rate | ||
| 17805 | +*/ | ||
| 17806 | +static int | ||
| 17807 | +acx_ioctl_get_rate( | ||
| 17808 | + struct net_device *ndev, | ||
| 17809 | + struct iw_request_info *info, | ||
| 17810 | + union iwreq_data *wrqu, | ||
| 17811 | + char *extra) | ||
| 17812 | +{ | ||
| 17813 | + struct iw_param *vwrq = &wrqu->param; | ||
| 17814 | + acx_device_t *adev = ndev2adev(ndev); | ||
| 17815 | + unsigned long flags; | ||
| 17816 | + u16 rate; | ||
| 17817 | + | ||
| 17818 | + acx_lock(adev, flags); | ||
| 17819 | + rate = adev->rate_oper; | ||
| 17820 | + if (adev->ap_client) | ||
| 17821 | + rate = adev->ap_client->rate_cur; | ||
| 17822 | + vwrq->value = acx111_rate_tbl[highest_bit(rate)]; | ||
| 17823 | + vwrq->fixed = !adev->rate_auto; | ||
| 17824 | + vwrq->disabled = 0; | ||
| 17825 | + acx_unlock(adev, flags); | ||
| 17826 | + | ||
| 17827 | + return OK; | ||
| 17828 | +} | ||
| 17829 | + | ||
| 17830 | +static int | ||
| 17831 | +acx_ioctl_set_rts( | ||
| 17832 | + struct net_device *ndev, | ||
| 17833 | + struct iw_request_info *info, | ||
| 17834 | + union iwreq_data *wrqu, | ||
| 17835 | + char *extra) | ||
| 17836 | +{ | ||
| 17837 | + struct iw_param *vwrq = &wrqu->rts; | ||
| 17838 | + acx_device_t *adev = ndev2adev(ndev); | ||
| 17839 | + int val = vwrq->value; | ||
| 17840 | + | ||
| 17841 | + if (vwrq->disabled) | ||
| 17842 | + val = 2312; | ||
| 17843 | + if ((val < 0) || (val > 2312)) | ||
| 17844 | + return -EINVAL; | ||
| 17845 | + | ||
| 17846 | + adev->rts_threshold = val; | ||
| 17847 | + return OK; | ||
| 17848 | +} | ||
| 17849 | + | ||
| 17850 | +static inline int | ||
| 17851 | +acx_ioctl_get_rts( | ||
| 17852 | + struct net_device *ndev, | ||
| 17853 | + struct iw_request_info *info, | ||
| 17854 | + union iwreq_data *wrqu, | ||
| 17855 | + char *extra) | ||
| 17856 | +{ | ||
| 17857 | + struct iw_param *vwrq = &wrqu->rts; | ||
| 17858 | + acx_device_t *adev = ndev2adev(ndev); | ||
| 17859 | + | ||
| 17860 | + vwrq->value = adev->rts_threshold; | ||
| 17861 | + vwrq->disabled = (vwrq->value >= 2312); | ||
| 17862 | + vwrq->fixed = 1; | ||
| 17863 | + return OK; | ||
| 17864 | +} | ||
| 17865 | + | ||
| 17866 | + | ||
| 17867 | +#if ACX_FRAGMENTATION | ||
| 17868 | +static int | ||
| 17869 | +acx_ioctl_set_frag( | ||
| 17870 | + struct net_device *ndev, | ||
| 17871 | + struct iw_request_info *info, | ||
| 17872 | + struct iw_param *vwrq, | ||
| 17873 | + char *extra) | ||
| 17874 | +{ | ||
| 17875 | + acx_device_t *adev = ndev2adev(ndev); | ||
| 17876 | + int val = vwrq->value; | ||
| 17877 | + | ||
| 17878 | + if (vwrq->disabled) | ||
| 17879 | + val = 32767; | ||
| 17880 | + else | ||
| 17881 | + if ((val < 256) || (val > 2347)) | ||
| 17882 | + return -EINVAL; | ||
| 17883 | + | ||
| 17884 | + adev->frag_threshold = val; | ||
| 17885 | + return OK; | ||
| 17886 | +} | ||
| 17887 | + | ||
| 17888 | +static inline int | ||
| 17889 | +acx_ioctl_get_frag( | ||
| 17890 | + struct net_device *ndev, | ||
| 17891 | + struct iw_request_info *info, | ||
| 17892 | + union iwreq_data *wrqu, | ||
| 17893 | + char *extra) | ||
| 17894 | +{ | ||
| 17895 | + struct iw_param *vwrq = &wrqu->frag; | ||
| 17896 | + acx_device_t *adev = ndev2adev(ndev); | ||
| 17897 | + | ||
| 17898 | + vwrq->value = adev->frag_threshold; | ||
| 17899 | + vwrq->disabled = (vwrq->value >= 2347); | ||
| 17900 | + vwrq->fixed = 1; | ||
| 17901 | + return OK; | ||
| 17902 | +} | ||
| 17903 | +#endif | ||
| 17904 | + | ||
| 17905 | + | ||
| 17906 | +/*********************************************************************** | ||
| 17907 | +** acx_ioctl_set_encode | ||
| 17908 | +*/ | ||
| 17909 | +static int | ||
| 17910 | +acx_ioctl_set_encode( | ||
| 17911 | + struct net_device *ndev, | ||
| 17912 | + struct iw_request_info *info, | ||
| 17913 | + union iwreq_data *wrqu, | ||
| 17914 | + char *extra) | ||
| 17915 | +{ | ||
| 17916 | + struct iw_point *dwrq = &wrqu->encoding; | ||
| 17917 | + acx_device_t *adev = ndev2adev(ndev); | ||
| 17918 | + int index; | ||
| 17919 | + int result; | ||
| 17920 | + | ||
| 17921 | + FN_ENTER; | ||
| 17922 | + | ||
| 17923 | + log(L_IOCTL, "set encoding flags=0x%04X, size=%d, key: %s\n", | ||
| 17924 | + dwrq->flags, dwrq->length, extra ? "set" : "No key"); | ||
| 17925 | + | ||
| 17926 | + acx_sem_lock(adev); | ||
| 17927 | + | ||
| 17928 | + index = (dwrq->flags & IW_ENCODE_INDEX) - 1; | ||
| 17929 | + | ||
| 17930 | + if (dwrq->length > 0) { | ||
| 17931 | + /* if index is 0 or invalid, use default key */ | ||
| 17932 | + if ((index < 0) || (index > 3)) | ||
| 17933 | + index = (int)adev->wep_current_index; | ||
| 17934 | + | ||
| 17935 | + if (0 == (dwrq->flags & IW_ENCODE_NOKEY)) { | ||
| 17936 | + if (dwrq->length > 29) | ||
| 17937 | + dwrq->length = 29; /* restrict it */ | ||
| 17938 | + | ||
| 17939 | + if (dwrq->length > 13) { | ||
| 17940 | + /* 29*8 == 232, WEP256 */ | ||
| 17941 | + adev->wep_keys[index].size = 29; | ||
| 17942 | + } else if (dwrq->length > 5) { | ||
| 17943 | + /* 13*8 == 104bit, WEP128 */ | ||
| 17944 | + adev->wep_keys[index].size = 13; | ||
| 17945 | + } else if (dwrq->length > 0) { | ||
| 17946 | + /* 5*8 == 40bit, WEP64 */ | ||
| 17947 | + adev->wep_keys[index].size = 5; | ||
| 17948 | + } else { | ||
| 17949 | + /* disable key */ | ||
| 17950 | + adev->wep_keys[index].size = 0; | ||
| 17951 | + } | ||
| 17952 | + | ||
| 17953 | + memset(adev->wep_keys[index].key, 0, | ||
| 17954 | + sizeof(adev->wep_keys[index].key)); | ||
| 17955 | + memcpy(adev->wep_keys[index].key, extra, dwrq->length); | ||
| 17956 | + } | ||
| 17957 | + } else { | ||
| 17958 | + /* set transmit key */ | ||
| 17959 | + if ((index >= 0) && (index <= 3)) | ||
| 17960 | + adev->wep_current_index = index; | ||
| 17961 | + else if (0 == (dwrq->flags & IW_ENCODE_MODE)) { | ||
| 17962 | + /* complain if we were not just setting | ||
| 17963 | + * the key mode */ | ||
| 17964 | + result = -EINVAL; | ||
| 17965 | + goto end_unlock; | ||
| 17966 | + } | ||
| 17967 | + } | ||
| 17968 | + | ||
| 17969 | + adev->wep_enabled = !(dwrq->flags & IW_ENCODE_DISABLED); | ||
| 17970 | + | ||
| 17971 | + if (dwrq->flags & IW_ENCODE_OPEN) { | ||
| 17972 | + adev->auth_alg = WLAN_AUTH_ALG_OPENSYSTEM; | ||
| 17973 | + adev->wep_restricted = 0; | ||
| 17974 | + | ||
| 17975 | + } else if (dwrq->flags & IW_ENCODE_RESTRICTED) { | ||
| 17976 | + adev->auth_alg = WLAN_AUTH_ALG_SHAREDKEY; | ||
| 17977 | + adev->wep_restricted = 1; | ||
| 17978 | + } | ||
| 17979 | + | ||
| 17980 | + /* set flag to make sure the card WEP settings get updated */ | ||
| 17981 | + SET_BIT(adev->set_mask, GETSET_WEP); | ||
| 17982 | + | ||
| 17983 | + log(L_IOCTL, "len=%d, key at 0x%p, flags=0x%X\n", | ||
| 17984 | + dwrq->length, extra, dwrq->flags); | ||
| 17985 | + | ||
| 17986 | + for (index = 0; index <= 3; index++) { | ||
| 17987 | + if (adev->wep_keys[index].size) { | ||
| 17988 | + log(L_IOCTL, "index=%d, size=%d, key at 0x%p\n", | ||
| 17989 | + adev->wep_keys[index].index, | ||
| 17990 | + (int) adev->wep_keys[index].size, | ||
| 17991 | + adev->wep_keys[index].key); | ||
| 17992 | + } | ||
| 17993 | + } | ||
| 17994 | + result = -EINPROGRESS; | ||
| 17995 | + | ||
| 17996 | +end_unlock: | ||
| 17997 | + acx_sem_unlock(adev); | ||
| 17998 | + | ||
| 17999 | + FN_EXIT1(result); | ||
| 18000 | + return result; | ||
| 18001 | +} | ||
| 18002 | + | ||
| 18003 | + | ||
| 18004 | +/*********************************************************************** | ||
| 18005 | +** acx_ioctl_get_encode | ||
| 18006 | +*/ | ||
| 18007 | +static int | ||
| 18008 | +acx_ioctl_get_encode( | ||
| 18009 | + struct net_device *ndev, | ||
| 18010 | + struct iw_request_info *info, | ||
| 18011 | + union iwreq_data *wrqu, | ||
| 18012 | + char *extra) | ||
| 18013 | +{ | ||
| 18014 | + struct iw_point *dwrq = &wrqu->encoding; | ||
| 18015 | + acx_device_t *adev = ndev2adev(ndev); | ||
| 18016 | + int index = (dwrq->flags & IW_ENCODE_INDEX) - 1; | ||
| 18017 | + | ||
| 18018 | + FN_ENTER; | ||
| 18019 | + | ||
| 18020 | + if (adev->wep_enabled == 0) { | ||
| 18021 | + dwrq->flags = IW_ENCODE_DISABLED; | ||
| 18022 | + } else { | ||
| 18023 | + if ((index < 0) || (index > 3)) | ||
| 18024 | + index = (int)adev->wep_current_index; | ||
| 18025 | + | ||
| 18026 | + dwrq->flags = (adev->wep_restricted == 1) ? | ||
| 18027 | + IW_ENCODE_RESTRICTED : IW_ENCODE_OPEN; | ||
| 18028 | + dwrq->length = adev->wep_keys[index].size; | ||
| 18029 | + | ||
| 18030 | + memcpy(extra, adev->wep_keys[index].key, | ||
| 18031 | + adev->wep_keys[index].size); | ||
| 18032 | + } | ||
| 18033 | + | ||
| 18034 | + /* set the current index */ | ||
| 18035 | + SET_BIT(dwrq->flags, index + 1); | ||
| 18036 | + | ||
| 18037 | + log(L_IOCTL, "len=%d, key=%p, flags=0x%X\n", | ||
| 18038 | + dwrq->length, dwrq->pointer, | ||
| 18039 | + dwrq->flags); | ||
| 18040 | + | ||
| 18041 | + FN_EXIT1(OK); | ||
| 18042 | + return OK; | ||
| 18043 | +} | ||
| 18044 | + | ||
| 18045 | + | ||
| 18046 | +/*********************************************************************** | ||
| 18047 | +*/ | ||
| 18048 | +static int | ||
| 18049 | +acx_ioctl_set_power( | ||
| 18050 | + struct net_device *ndev, | ||
| 18051 | + struct iw_request_info *info, | ||
| 18052 | + union iwreq_data *wrqu, | ||
| 18053 | + char *extra) | ||
| 18054 | +{ | ||
| 18055 | + struct iw_param *vwrq = &wrqu->power; | ||
| 18056 | + acx_device_t *adev = ndev2adev(ndev); | ||
| 18057 | + int result = -EINPROGRESS; | ||
| 18058 | + | ||
| 18059 | + FN_ENTER; | ||
| 18060 | + | ||
| 18061 | + log(L_IOCTL, "set 802.11 powersave flags=0x%04X\n", vwrq->flags); | ||
| 18062 | + | ||
| 18063 | + acx_sem_lock(adev); | ||
| 18064 | + | ||
| 18065 | + if (vwrq->disabled) { | ||
| 18066 | + CLEAR_BIT(adev->ps_wakeup_cfg, PS_CFG_ENABLE); | ||
| 18067 | + SET_BIT(adev->set_mask, GETSET_POWER_80211); | ||
| 18068 | + goto end; | ||
| 18069 | + } | ||
| 18070 | + if ((vwrq->flags & IW_POWER_TYPE) == IW_POWER_TIMEOUT) { | ||
| 18071 | + u16 ps_timeout = (vwrq->value * 1024) / 1000; | ||
| 18072 | + | ||
| 18073 | + if (ps_timeout > 255) | ||
| 18074 | + ps_timeout = 255; | ||
| 18075 | + log(L_IOCTL, "setting PS timeout value to %d time units " | ||
| 18076 | + "due to %dus\n", ps_timeout, vwrq->value); | ||
| 18077 | + adev->ps_hangover_period = ps_timeout; | ||
| 18078 | + } else if ((vwrq->flags & IW_POWER_TYPE) == IW_POWER_PERIOD) { | ||
| 18079 | + u16 ps_periods = vwrq->value / 1000000; | ||
| 18080 | + | ||
| 18081 | + if (ps_periods > 255) | ||
| 18082 | + ps_periods = 255; | ||
| 18083 | + log(L_IOCTL, "setting PS period value to %d periods " | ||
| 18084 | + "due to %dus\n", ps_periods, vwrq->value); | ||
| 18085 | + adev->ps_listen_interval = ps_periods; | ||
| 18086 | + CLEAR_BIT(adev->ps_wakeup_cfg, PS_CFG_WAKEUP_MODE_MASK); | ||
| 18087 | + SET_BIT(adev->ps_wakeup_cfg, PS_CFG_WAKEUP_EACH_ITVL); | ||
| 18088 | + } | ||
| 18089 | + | ||
| 18090 | + switch (vwrq->flags & IW_POWER_MODE) { | ||
| 18091 | + /* FIXME: are we doing the right thing here? */ | ||
| 18092 | + case IW_POWER_UNICAST_R: | ||
| 18093 | + CLEAR_BIT(adev->ps_options, PS_OPT_STILL_RCV_BCASTS); | ||
| 18094 | + break; | ||
| 18095 | + case IW_POWER_MULTICAST_R: | ||
| 18096 | + SET_BIT(adev->ps_options, PS_OPT_STILL_RCV_BCASTS); | ||
| 18097 | + break; | ||
| 18098 | + case IW_POWER_ALL_R: | ||
| 18099 | + SET_BIT(adev->ps_options, PS_OPT_STILL_RCV_BCASTS); | ||
| 18100 | + break; | ||
| 18101 | + case IW_POWER_ON: | ||
| 18102 | + break; | ||
| 18103 | + default: | ||
| 18104 | + log(L_IOCTL, "unknown PS mode\n"); | ||
| 18105 | + result = -EINVAL; | ||
| 18106 | + goto end; | ||
| 18107 | + } | ||
| 18108 | + | ||
| 18109 | + SET_BIT(adev->ps_wakeup_cfg, PS_CFG_ENABLE); | ||
| 18110 | + SET_BIT(adev->set_mask, GETSET_POWER_80211); | ||
| 18111 | +end: | ||
| 18112 | + acx_sem_unlock(adev); | ||
| 18113 | + | ||
| 18114 | + FN_EXIT1(result); | ||
| 18115 | + return result; | ||
| 18116 | +} | ||
| 18117 | + | ||
| 18118 | + | ||
| 18119 | +/*********************************************************************** | ||
| 18120 | +*/ | ||
| 18121 | +static int | ||
| 18122 | +acx_ioctl_get_power( | ||
| 18123 | + struct net_device *ndev, | ||
| 18124 | + struct iw_request_info *info, | ||
| 18125 | + union iwreq_data *wrqu, | ||
| 18126 | + char *extra) | ||
| 18127 | +{ | ||
| 18128 | + struct iw_param *vwrq = &wrqu->power; | ||
| 18129 | + acx_device_t *adev = ndev2adev(ndev); | ||
| 18130 | + | ||
| 18131 | + FN_ENTER; | ||
| 18132 | + | ||
| 18133 | + log(L_IOCTL, "Get 802.11 Power Save flags = 0x%04X\n", vwrq->flags); | ||
| 18134 | + vwrq->disabled = ((adev->ps_wakeup_cfg & PS_CFG_ENABLE) == 0); | ||
| 18135 | + if (vwrq->disabled) | ||
| 18136 | + goto end; | ||
| 18137 | + | ||
| 18138 | + if ((vwrq->flags & IW_POWER_TYPE) == IW_POWER_TIMEOUT) { | ||
| 18139 | + vwrq->value = adev->ps_hangover_period * 1000 / 1024; | ||
| 18140 | + vwrq->flags = IW_POWER_TIMEOUT; | ||
| 18141 | + } else { | ||
| 18142 | + vwrq->value = adev->ps_listen_interval * 1000000; | ||
| 18143 | + vwrq->flags = IW_POWER_PERIOD|IW_POWER_RELATIVE; | ||
| 18144 | + } | ||
| 18145 | + if (adev->ps_options & PS_OPT_STILL_RCV_BCASTS) | ||
| 18146 | + SET_BIT(vwrq->flags, IW_POWER_ALL_R); | ||
| 18147 | + else | ||
| 18148 | + SET_BIT(vwrq->flags, IW_POWER_UNICAST_R); | ||
| 18149 | +end: | ||
| 18150 | + FN_EXIT1(OK); | ||
| 18151 | + return OK; | ||
| 18152 | +} | ||
| 18153 | + | ||
| 18154 | + | ||
| 18155 | +/*********************************************************************** | ||
| 18156 | +** acx_ioctl_get_txpow | ||
| 18157 | +*/ | ||
| 18158 | +static inline int | ||
| 18159 | +acx_ioctl_get_txpow( | ||
| 18160 | + struct net_device *ndev, | ||
| 18161 | + struct iw_request_info *info, | ||
| 18162 | + union iwreq_data *wrqu, | ||
| 18163 | + char *extra) | ||
| 18164 | +{ | ||
| 18165 | + struct iw_param *vwrq = &wrqu->power; | ||
| 18166 | + acx_device_t *adev = ndev2adev(ndev); | ||
| 18167 | + | ||
| 18168 | + FN_ENTER; | ||
| 18169 | + | ||
| 18170 | + vwrq->flags = IW_TXPOW_DBM; | ||
| 18171 | + vwrq->disabled = 0; | ||
| 18172 | + vwrq->fixed = 1; | ||
| 18173 | + vwrq->value = adev->tx_level_dbm; | ||
| 18174 | + | ||
| 18175 | + log(L_IOCTL, "get txpower:%d dBm\n", adev->tx_level_dbm); | ||
| 18176 | + | ||
| 18177 | + FN_EXIT1(OK); | ||
| 18178 | + return OK; | ||
| 18179 | +} | ||
| 18180 | + | ||
| 18181 | + | ||
| 18182 | +/*********************************************************************** | ||
| 18183 | +** acx_ioctl_set_txpow | ||
| 18184 | +*/ | ||
| 18185 | +static int | ||
| 18186 | +acx_ioctl_set_txpow( | ||
| 18187 | + struct net_device *ndev, | ||
| 18188 | + struct iw_request_info *info, | ||
| 18189 | + union iwreq_data *wrqu, | ||
| 18190 | + char *extra) | ||
| 18191 | +{ | ||
| 18192 | + struct iw_param *vwrq = &wrqu->power; | ||
| 18193 | + acx_device_t *adev = ndev2adev(ndev); | ||
| 18194 | + int result; | ||
| 18195 | + | ||
| 18196 | + FN_ENTER; | ||
| 18197 | + | ||
| 18198 | + log(L_IOCTL, "set txpower:%d, disabled:%d, flags:0x%04X\n", | ||
| 18199 | + vwrq->value, vwrq->disabled, vwrq->flags); | ||
| 18200 | + | ||
| 18201 | + acx_sem_lock(adev); | ||
| 18202 | + | ||
| 18203 | + if (vwrq->disabled != adev->tx_disabled) { | ||
| 18204 | + SET_BIT(adev->set_mask, GETSET_TX); | ||
| 18205 | + } | ||
| 18206 | + | ||
| 18207 | + adev->tx_disabled = vwrq->disabled; | ||
| 18208 | + if (vwrq->value == -1) { | ||
| 18209 | + if (vwrq->disabled) { | ||
| 18210 | + adev->tx_level_dbm = 0; | ||
| 18211 | + log(L_IOCTL, "disable radio tx\n"); | ||
| 18212 | + } else { | ||
| 18213 | + /* adev->tx_level_auto = 1; */ | ||
| 18214 | + log(L_IOCTL, "set tx power auto (NIY)\n"); | ||
| 18215 | + } | ||
| 18216 | + } else { | ||
| 18217 | + adev->tx_level_dbm = vwrq->value <= 20 ? vwrq->value : 20; | ||
| 18218 | + /* adev->tx_level_auto = 0; */ | ||
| 18219 | + log(L_IOCTL, "set txpower=%d dBm\n", adev->tx_level_dbm); | ||
| 18220 | + } | ||
| 18221 | + SET_BIT(adev->set_mask, GETSET_TXPOWER); | ||
| 18222 | + | ||
| 18223 | + result = -EINPROGRESS; | ||
| 18224 | + | ||
| 18225 | + acx_sem_unlock(adev); | ||
| 18226 | + | ||
| 18227 | + FN_EXIT1(result); | ||
| 18228 | + return result; | ||
| 18229 | +} | ||
| 18230 | + | ||
| 18231 | + | ||
| 18232 | +/*********************************************************************** | ||
| 18233 | +** acx_ioctl_get_range | ||
| 18234 | +*/ | ||
| 18235 | +static int | ||
| 18236 | +acx_ioctl_get_range( | ||
| 18237 | + struct net_device *ndev, | ||
| 18238 | + struct iw_request_info *info, | ||
| 18239 | + union iwreq_data *wrqu, | ||
| 18240 | + char *extra) | ||
| 18241 | +{ | ||
| 18242 | + struct iw_point *dwrq = &wrqu->data; | ||
| 18243 | + struct iw_range *range = (struct iw_range *)extra; | ||
| 18244 | + acx_device_t *adev = ndev2adev(ndev); | ||
| 18245 | + int i,n; | ||
| 18246 | + | ||
| 18247 | + FN_ENTER; | ||
| 18248 | + | ||
| 18249 | + if (!dwrq->pointer) | ||
| 18250 | + goto end; | ||
| 18251 | + | ||
| 18252 | + dwrq->length = sizeof(struct iw_range); | ||
| 18253 | + memset(range, 0, sizeof(struct iw_range)); | ||
| 18254 | + n = 0; | ||
| 18255 | + for (i = 1; i <= 14; i++) { | ||
| 18256 | + if (adev->reg_dom_chanmask & (1 << (i - 1))) { | ||
| 18257 | + range->freq[n].i = i; | ||
| 18258 | + range->freq[n].m = acx_channel_freq[i - 1] * 100000; | ||
| 18259 | + range->freq[n].e = 1; /* units are MHz */ | ||
| 18260 | + n++; | ||
| 18261 | + } | ||
| 18262 | + } | ||
| 18263 | + range->num_channels = n; | ||
| 18264 | + range->num_frequency = n; | ||
| 18265 | + | ||
| 18266 | + range->min_rts = 0; | ||
| 18267 | + range->max_rts = 2312; | ||
| 18268 | + | ||
| 18269 | +#if ACX_FRAGMENTATION | ||
| 18270 | + range->min_frag = 256; | ||
| 18271 | + range->max_frag = 2312; | ||
| 18272 | +#endif | ||
| 18273 | + | ||
| 18274 | + range->encoding_size[0] = 5; | ||
| 18275 | + range->encoding_size[1] = 13; | ||
| 18276 | + range->encoding_size[2] = 29; | ||
| 18277 | + range->num_encoding_sizes = 3; | ||
| 18278 | + range->max_encoding_tokens = 4; | ||
| 18279 | + | ||
| 18280 | + range->min_pmp = 0; | ||
| 18281 | + range->max_pmp = 5000000; | ||
| 18282 | + range->min_pmt = 0; | ||
| 18283 | + range->max_pmt = 65535 * 1000; | ||
| 18284 | + range->pmp_flags = IW_POWER_PERIOD; | ||
| 18285 | + range->pmt_flags = IW_POWER_TIMEOUT; | ||
| 18286 | + range->pm_capa = IW_POWER_PERIOD | IW_POWER_TIMEOUT | IW_POWER_ALL_R; | ||
| 18287 | + | ||
| 18288 | + if (IS_ACX100(adev)) { /* ACX100 has direct radio programming - arbitrary levels, so offer a lot */ | ||
| 18289 | + for (i = 0; i <= IW_MAX_TXPOWER - 1; i++) | ||
| 18290 | + range->txpower[i] = 20 * i / (IW_MAX_TXPOWER - 1); | ||
| 18291 | + range->num_txpower = IW_MAX_TXPOWER; | ||
| 18292 | + range->txpower_capa = IW_TXPOW_DBM; | ||
| 18293 | + } | ||
| 18294 | + else { | ||
| 18295 | + int count = min(IW_MAX_TXPOWER, (int)adev->cfgopt_power_levels.len); | ||
| 18296 | + for (i = 0; i <= count; i++) | ||
| 18297 | + range->txpower[i] = adev->cfgopt_power_levels.list[i]; | ||
| 18298 | + range->num_txpower = count; | ||
| 18299 | + /* this list is given in mW */ | ||
| 18300 | + range->txpower_capa = IW_TXPOW_MWATT; | ||
| 18301 | + } | ||
| 18302 | + | ||
| 18303 | + range->we_version_compiled = WIRELESS_EXT; | ||
| 18304 | + range->we_version_source = 0x9; | ||
| 18305 | + | ||
| 18306 | + range->retry_capa = IW_RETRY_LIMIT; | ||
| 18307 | + range->retry_flags = IW_RETRY_LIMIT; | ||
| 18308 | + range->min_retry = 1; | ||
| 18309 | + range->max_retry = 255; | ||
| 18310 | + | ||
| 18311 | + range->r_time_flags = IW_RETRY_LIFETIME; | ||
| 18312 | + range->min_r_time = 0; | ||
| 18313 | + /* FIXME: lifetime ranges and orders of magnitude are strange?? */ | ||
| 18314 | + range->max_r_time = 65535; | ||
| 18315 | + | ||
| 18316 | + if (IS_USB(adev)) | ||
| 18317 | + range->sensitivity = 0; | ||
| 18318 | + else if (IS_ACX111(adev)) | ||
| 18319 | + range->sensitivity = 3; | ||
| 18320 | + else | ||
| 18321 | + range->sensitivity = 255; | ||
| 18322 | + | ||
| 18323 | + for (i=0; i < adev->rate_supported_len; i++) { | ||
| 18324 | + range->bitrate[i] = (adev->rate_supported[i] & ~0x80) * 500000; | ||
| 18325 | + /* never happens, but keep it, to be safe: */ | ||
| 18326 | + if (range->bitrate[i] == 0) | ||
| 18327 | + break; | ||
| 18328 | + } | ||
| 18329 | + range->num_bitrates = i; | ||
| 18330 | + | ||
| 18331 | + range->max_qual.qual = 100; | ||
| 18332 | + range->max_qual.level = 100; | ||
| 18333 | + range->max_qual.noise = 100; | ||
| 18334 | + /* TODO: better values */ | ||
| 18335 | + range->avg_qual.qual = 90; | ||
| 18336 | + range->avg_qual.level = 80; | ||
| 18337 | + range->avg_qual.noise = 2; | ||
| 18338 | + | ||
| 18339 | +end: | ||
| 18340 | + FN_EXIT1(OK); | ||
| 18341 | + return OK; | ||
| 18342 | +} | ||
| 18343 | + | ||
| 18344 | + | ||
| 18345 | +/*********************************************************************** | ||
| 18346 | +** Private functions | ||
| 18347 | +*/ | ||
| 18348 | + | ||
| 18349 | +/*********************************************************************** | ||
| 18350 | +** acx_ioctl_get_nick | ||
| 18351 | +*/ | ||
| 18352 | +static inline int | ||
| 18353 | +acx_ioctl_get_nick( | ||
| 18354 | + struct net_device *ndev, | ||
| 18355 | + struct iw_request_info *info, | ||
| 18356 | + union iwreq_data *wrqu, | ||
| 18357 | + char *extra) | ||
| 18358 | +{ | ||
| 18359 | + struct iw_point *dwrq = &wrqu->data; | ||
| 18360 | + acx_device_t *adev = ndev2adev(ndev); | ||
| 18361 | + | ||
| 18362 | + strcpy(extra, adev->nick); | ||
| 18363 | + dwrq->length = strlen(extra) + 1; | ||
| 18364 | + | ||
| 18365 | + return OK; | ||
| 18366 | +} | ||
| 18367 | + | ||
| 18368 | + | ||
| 18369 | +/*********************************************************************** | ||
| 18370 | +** acx_ioctl_set_nick | ||
| 18371 | +*/ | ||
| 18372 | +static int | ||
| 18373 | +acx_ioctl_set_nick( | ||
| 18374 | + struct net_device *ndev, | ||
| 18375 | + struct iw_request_info *info, | ||
| 18376 | + union iwreq_data *wrqu, | ||
| 18377 | + char *extra) | ||
| 18378 | +{ | ||
| 18379 | + struct iw_point *dwrq = &wrqu->data; | ||
| 18380 | + acx_device_t *adev = ndev2adev(ndev); | ||
| 18381 | + int result; | ||
| 18382 | + | ||
| 18383 | + FN_ENTER; | ||
| 18384 | + | ||
| 18385 | + acx_sem_lock(adev); | ||
| 18386 | + | ||
| 18387 | + if (dwrq->length > IW_ESSID_MAX_SIZE + 1) { | ||
| 18388 | + result = -E2BIG; | ||
| 18389 | + goto end_unlock; | ||
| 18390 | + } | ||
| 18391 | + | ||
| 18392 | + /* extra includes trailing \0, so it's ok */ | ||
| 18393 | + strcpy(adev->nick, extra); | ||
| 18394 | + result = OK; | ||
| 18395 | + | ||
| 18396 | +end_unlock: | ||
| 18397 | + acx_sem_unlock(adev); | ||
| 18398 | + | ||
| 18399 | + FN_EXIT1(result); | ||
| 18400 | + return result; | ||
| 18401 | +} | ||
| 18402 | + | ||
| 18403 | + | ||
| 18404 | +/*********************************************************************** | ||
| 18405 | +** acx_ioctl_get_retry | ||
| 18406 | +*/ | ||
| 18407 | +static int | ||
| 18408 | +acx_ioctl_get_retry( | ||
| 18409 | + struct net_device *ndev, | ||
| 18410 | + struct iw_request_info *info, | ||
| 18411 | + union iwreq_data *wrqu, | ||
| 18412 | + char *extra) | ||
| 18413 | +{ | ||
| 18414 | + struct iw_param *vwrq = &wrqu->retry; | ||
| 18415 | + acx_device_t *adev = ndev2adev(ndev); | ||
| 18416 | + unsigned int type = vwrq->flags & IW_RETRY_TYPE; | ||
| 18417 | + unsigned int modifier = vwrq->flags & IW_RETRY_MODIFIER; | ||
| 18418 | + int result; | ||
| 18419 | + | ||
| 18420 | + FN_ENTER; | ||
| 18421 | + | ||
| 18422 | + acx_sem_lock(adev); | ||
| 18423 | + | ||
| 18424 | + /* return the short retry number by default */ | ||
| 18425 | + if (type == IW_RETRY_LIFETIME) { | ||
| 18426 | + vwrq->flags = IW_RETRY_LIFETIME; | ||
| 18427 | + vwrq->value = adev->msdu_lifetime; | ||
| 18428 | + } else if (modifier == IW_RETRY_MAX) { | ||
| 18429 | + vwrq->flags = IW_RETRY_LIMIT | IW_RETRY_MAX; | ||
| 18430 | + vwrq->value = adev->long_retry; | ||
| 18431 | + } else { | ||
| 18432 | + vwrq->flags = IW_RETRY_LIMIT; | ||
| 18433 | + if (adev->long_retry != adev->short_retry) | ||
| 18434 | + SET_BIT(vwrq->flags, IW_RETRY_MIN); | ||
| 18435 | + vwrq->value = adev->short_retry; | ||
| 18436 | + } | ||
| 18437 | + | ||
| 18438 | + /* can't be disabled */ | ||
| 18439 | + vwrq->disabled = (u8)0; | ||
| 18440 | + result = OK; | ||
| 18441 | + | ||
| 18442 | + acx_sem_unlock(adev); | ||
| 18443 | + | ||
| 18444 | + FN_EXIT1(result); | ||
| 18445 | + return result; | ||
| 18446 | +} | ||
| 18447 | + | ||
| 18448 | + | ||
| 18449 | +/*********************************************************************** | ||
| 18450 | +** acx_ioctl_set_retry | ||
| 18451 | +*/ | ||
| 18452 | +static int | ||
| 18453 | +acx_ioctl_set_retry( | ||
| 18454 | + struct net_device *ndev, | ||
| 18455 | + struct iw_request_info *info, | ||
| 18456 | + union iwreq_data *wrqu, | ||
| 18457 | + char *extra) | ||
| 18458 | +{ | ||
| 18459 | + struct iw_param *vwrq = &wrqu->retry; | ||
| 18460 | + acx_device_t *adev = ndev2adev(ndev); | ||
| 18461 | + int result; | ||
| 18462 | + | ||
| 18463 | + FN_ENTER; | ||
| 18464 | + | ||
| 18465 | + if (!vwrq) { | ||
| 18466 | + result = -EFAULT; | ||
| 18467 | + goto end; | ||
| 18468 | + } | ||
| 18469 | + if (vwrq->disabled) { | ||
| 18470 | + result = -EINVAL; | ||
| 18471 | + goto end; | ||
| 18472 | + } | ||
| 18473 | + | ||
| 18474 | + acx_sem_lock(adev); | ||
| 18475 | + | ||
| 18476 | + result = -EINVAL; | ||
| 18477 | + if (IW_RETRY_LIMIT == (vwrq->flags & IW_RETRY_TYPE)) { | ||
| 18478 | + printk("old retry limits: short %d long %d\n", | ||
| 18479 | + adev->short_retry, adev->long_retry); | ||
| 18480 | + if (vwrq->flags & IW_RETRY_MAX) { | ||
| 18481 | + adev->long_retry = vwrq->value; | ||
| 18482 | + } else if (vwrq->flags & IW_RETRY_MIN) { | ||
| 18483 | + adev->short_retry = vwrq->value; | ||
| 18484 | + } else { | ||
| 18485 | + /* no modifier: set both */ | ||
| 18486 | + adev->long_retry = vwrq->value; | ||
| 18487 | + adev->short_retry = vwrq->value; | ||
| 18488 | + } | ||
| 18489 | + printk("new retry limits: short %d long %d\n", | ||
| 18490 | + adev->short_retry, adev->long_retry); | ||
| 18491 | + SET_BIT(adev->set_mask, GETSET_RETRY); | ||
| 18492 | + result = -EINPROGRESS; | ||
| 18493 | + } | ||
| 18494 | + else if (vwrq->flags & IW_RETRY_LIFETIME) { | ||
| 18495 | + adev->msdu_lifetime = vwrq->value; | ||
| 18496 | + printk("new MSDU lifetime: %d\n", adev->msdu_lifetime); | ||
| 18497 | + SET_BIT(adev->set_mask, SET_MSDU_LIFETIME); | ||
| 18498 | + result = -EINPROGRESS; | ||
| 18499 | + } | ||
| 18500 | + | ||
| 18501 | + acx_sem_unlock(adev); | ||
| 18502 | +end: | ||
| 18503 | + FN_EXIT1(result); | ||
| 18504 | + return result; | ||
| 18505 | +} | ||
| 18506 | + | ||
| 18507 | + | ||
| 18508 | +/************************ private ioctls ******************************/ | ||
| 18509 | + | ||
| 18510 | + | ||
| 18511 | +/*********************************************************************** | ||
| 18512 | +** acx_ioctl_set_debug | ||
| 18513 | +*/ | ||
| 18514 | +#if ACX_DEBUG | ||
| 18515 | +static int | ||
| 18516 | +acx_ioctl_set_debug( | ||
| 18517 | + struct net_device *ndev, | ||
| 18518 | + struct iw_request_info *info, | ||
| 18519 | + union iwreq_data *wrqu, | ||
| 18520 | + char *extra) | ||
| 18521 | +{ | ||
| 18522 | + unsigned int debug_new = *((unsigned int *)extra); | ||
| 18523 | + int result = -EINVAL; | ||
| 18524 | + | ||
| 18525 | + log(L_ANY, "setting debug from %04X to %04X\n", acx_debug, debug_new); | ||
| 18526 | + acx_debug = debug_new; | ||
| 18527 | + | ||
| 18528 | + result = OK; | ||
| 18529 | + return result; | ||
| 18530 | + | ||
| 18531 | +} | ||
| 18532 | +#endif | ||
| 18533 | + | ||
| 18534 | + | ||
| 18535 | +/*********************************************************************** | ||
| 18536 | +** acx_ioctl_list_reg_domain | ||
| 18537 | +*/ | ||
| 18538 | +static int | ||
| 18539 | +acx_ioctl_list_reg_domain( | ||
| 18540 | + struct net_device *ndev, | ||
| 18541 | + struct iw_request_info *info, | ||
| 18542 | + union iwreq_data *wrqu, | ||
| 18543 | + char *extra) | ||
| 18544 | +{ | ||
| 18545 | + int i = 1; | ||
| 18546 | + const char * const *entry = acx_reg_domain_strings; | ||
| 18547 | + | ||
| 18548 | + printk("dom# chan# domain/country\n"); | ||
| 18549 | + while (*entry) | ||
| 18550 | + printk("%4d %s\n", i++, *entry++); | ||
| 18551 | + return OK; | ||
| 18552 | +} | ||
| 18553 | + | ||
| 18554 | + | ||
| 18555 | +/*********************************************************************** | ||
| 18556 | +** acx_ioctl_set_reg_domain | ||
| 18557 | +*/ | ||
| 18558 | +static int | ||
| 18559 | +acx_ioctl_set_reg_domain( | ||
| 18560 | + struct net_device *ndev, | ||
| 18561 | + struct iw_request_info *info, | ||
| 18562 | + union iwreq_data *wrqu, | ||
| 18563 | + char *extra) | ||
| 18564 | +{ | ||
| 18565 | + acx_device_t *adev = ndev2adev(ndev); | ||
| 18566 | + int result; | ||
| 18567 | + | ||
| 18568 | + FN_ENTER; | ||
| 18569 | + | ||
| 18570 | + if ((*extra < 1) || ((size_t)*extra > acx_reg_domain_ids_len)) { | ||
| 18571 | + result = -EINVAL; | ||
| 18572 | + goto end; | ||
| 18573 | + } | ||
| 18574 | + | ||
| 18575 | + acx_sem_lock(adev); | ||
| 18576 | + | ||
| 18577 | + adev->reg_dom_id = acx_reg_domain_ids[*extra - 1]; | ||
| 18578 | + SET_BIT(adev->set_mask, GETSET_REG_DOMAIN); | ||
| 18579 | + | ||
| 18580 | + result = -EINPROGRESS; | ||
| 18581 | + | ||
| 18582 | + acx_sem_unlock(adev); | ||
| 18583 | +end: | ||
| 18584 | + FN_EXIT1(result); | ||
| 18585 | + return result; | ||
| 18586 | +} | ||
| 18587 | + | ||
| 18588 | + | ||
| 18589 | +/*********************************************************************** | ||
| 18590 | +** acx_ioctl_get_reg_domain | ||
| 18591 | +*/ | ||
| 18592 | +static int | ||
| 18593 | +acx_ioctl_get_reg_domain( | ||
| 18594 | + struct net_device *ndev, | ||
| 18595 | + struct iw_request_info *info, | ||
| 18596 | + union iwreq_data *wrqu, | ||
| 18597 | + char *extra) | ||
| 18598 | +{ | ||
| 18599 | + acx_device_t *adev = ndev2adev(ndev); | ||
| 18600 | + int dom,i; | ||
| 18601 | + | ||
| 18602 | + /* no locking */ | ||
| 18603 | + dom = adev->reg_dom_id; | ||
| 18604 | + | ||
| 18605 | + for (i = 1; i <= acx_reg_domain_ids_len; i++) { | ||
| 18606 | + if (acx_reg_domain_ids[i-1] == dom) { | ||
| 18607 | + log(L_IOCTL, "regulatory domain is currently set " | ||
| 18608 | + "to %d (0x%X): %s\n", i, dom, | ||
| 18609 | + acx_reg_domain_strings[i-1]); | ||
| 18610 | + *extra = i; | ||
| 18611 | + break; | ||
| 18612 | + } | ||
| 18613 | + } | ||
| 18614 | + | ||
| 18615 | + return OK; | ||
| 18616 | +} | ||
| 18617 | + | ||
| 18618 | + | ||
| 18619 | +/*********************************************************************** | ||
| 18620 | +** acx_ioctl_set_short_preamble | ||
| 18621 | +*/ | ||
| 18622 | +static const char * const | ||
| 18623 | +preamble_modes[] = { | ||
| 18624 | + "off", | ||
| 18625 | + "on", | ||
| 18626 | + "auto (peer capability dependent)", | ||
| 18627 | + "unknown mode, error" | ||
| 18628 | +}; | ||
| 18629 | + | ||
| 18630 | +static int | ||
| 18631 | +acx_ioctl_set_short_preamble( | ||
| 18632 | + struct net_device *ndev, | ||
| 18633 | + struct iw_request_info *info, | ||
| 18634 | + union iwreq_data *wrqu, | ||
| 18635 | + char *extra) | ||
| 18636 | +{ | ||
| 18637 | + acx_device_t *adev = ndev2adev(ndev); | ||
| 18638 | + int i; | ||
| 18639 | + int result; | ||
| 18640 | + | ||
| 18641 | + FN_ENTER; | ||
| 18642 | + | ||
| 18643 | + if ((unsigned char)*extra > 2) { | ||
| 18644 | + result = -EINVAL; | ||
| 18645 | + goto end; | ||
| 18646 | + } | ||
| 18647 | + | ||
| 18648 | + acx_sem_lock(adev); | ||
| 18649 | + | ||
| 18650 | + adev->preamble_mode = (u8)*extra; | ||
| 18651 | + switch (adev->preamble_mode) { | ||
| 18652 | + case 0: /* long */ | ||
| 18653 | + adev->preamble_cur = 0; | ||
| 18654 | + break; | ||
| 18655 | + case 1: | ||
| 18656 | + /* short, kick incapable peers */ | ||
| 18657 | + adev->preamble_cur = 1; | ||
| 18658 | + for (i = 0; i < VEC_SIZE(adev->sta_list); i++) { | ||
| 18659 | + client_t *clt = &adev->sta_list[i]; | ||
| 18660 | + if (!clt->used) continue; | ||
| 18661 | + if (!(clt->cap_info & WF_MGMT_CAP_SHORT)) { | ||
| 18662 | + clt->used = CLIENT_EMPTY_SLOT_0; | ||
| 18663 | + } | ||
| 18664 | + } | ||
| 18665 | + switch (adev->mode) { | ||
| 18666 | + case ACX_MODE_2_STA: | ||
| 18667 | + if (adev->ap_client && !adev->ap_client->used) { | ||
| 18668 | + /* We kicked our AP :) */ | ||
| 18669 | + SET_BIT(adev->set_mask, GETSET_RESCAN); | ||
| 18670 | + } | ||
| 18671 | + } | ||
| 18672 | + break; | ||
| 18673 | + case 2: /* auto. short only if all peers are short-capable */ | ||
| 18674 | + adev->preamble_cur = 1; | ||
| 18675 | + for (i = 0; i < VEC_SIZE(adev->sta_list); i++) { | ||
| 18676 | + client_t *clt = &adev->sta_list[i]; | ||
| 18677 | + if (!clt->used) continue; | ||
| 18678 | + if (!(clt->cap_info & WF_MGMT_CAP_SHORT)) { | ||
| 18679 | + adev->preamble_cur = 0; | ||
| 18680 | + break; | ||
| 18681 | + } | ||
| 18682 | + } | ||
| 18683 | + break; | ||
| 18684 | + } | ||
| 18685 | + printk("new short preamble setting: configured %s, active %s\n", | ||
| 18686 | + preamble_modes[adev->preamble_mode], | ||
| 18687 | + preamble_modes[adev->preamble_cur]); | ||
| 18688 | + result = OK; | ||
| 18689 | + | ||
| 18690 | + acx_sem_unlock(adev); | ||
| 18691 | +end: | ||
| 18692 | + FN_EXIT1(result); | ||
| 18693 | + return result; | ||
| 18694 | +} | ||
| 18695 | + | ||
| 18696 | + | ||
| 18697 | +/*********************************************************************** | ||
| 18698 | +** acx_ioctl_get_short_preamble | ||
| 18699 | +*/ | ||
| 18700 | +static int | ||
| 18701 | +acx_ioctl_get_short_preamble( | ||
| 18702 | + struct net_device *ndev, | ||
| 18703 | + struct iw_request_info *info, | ||
| 18704 | + union iwreq_data *wrqu, | ||
| 18705 | + char *extra) | ||
| 18706 | +{ | ||
| 18707 | + acx_device_t *adev = ndev2adev(ndev); | ||
| 18708 | + | ||
| 18709 | + acx_sem_lock(adev); | ||
| 18710 | + | ||
| 18711 | + printk("current short preamble setting: configured %s, active %s\n", | ||
| 18712 | + preamble_modes[adev->preamble_mode], | ||
| 18713 | + preamble_modes[adev->preamble_cur]); | ||
| 18714 | + | ||
| 18715 | + *extra = (char)adev->preamble_mode; | ||
| 18716 | + | ||
| 18717 | + acx_sem_unlock(adev); | ||
| 18718 | + | ||
| 18719 | + return OK; | ||
| 18720 | +} | ||
| 18721 | + | ||
| 18722 | + | ||
| 18723 | +/*********************************************************************** | ||
| 18724 | +** acx_ioctl_set_antenna | ||
| 18725 | +** | ||
| 18726 | +** TX and RX antenna can be set separately but this function good | ||
| 18727 | +** for testing 0-4 bits | ||
| 18728 | +*/ | ||
| 18729 | +static int | ||
| 18730 | +acx_ioctl_set_antenna( | ||
| 18731 | + struct net_device *ndev, | ||
| 18732 | + struct iw_request_info *info, | ||
| 18733 | + union iwreq_data *wrqu, | ||
| 18734 | + char *extra) | ||
| 18735 | +{ | ||
| 18736 | + acx_device_t *adev = ndev2adev(ndev); | ||
| 18737 | + | ||
| 18738 | + acx_sem_lock(adev); | ||
| 18739 | + | ||
| 18740 | + printk("old antenna value: 0x%02X (COMBINED bit mask)\n" | ||
| 18741 | + "Rx antenna selection:\n" | ||
| 18742 | + "0x00 ant. 1\n" | ||
| 18743 | + "0x40 ant. 2\n" | ||
| 18744 | + "0x80 full diversity\n" | ||
| 18745 | + "0xc0 partial diversity\n" | ||
| 18746 | + "0x0f dwell time mask (in units of us)\n" | ||
| 18747 | + "Tx antenna selection:\n" | ||
| 18748 | + "0x00 ant. 2\n" /* yep, those ARE reversed! */ | ||
| 18749 | + "0x20 ant. 1\n" | ||
| 18750 | + "new antenna value: 0x%02X\n", | ||
| 18751 | + adev->antenna, (u8)*extra); | ||
| 18752 | + | ||
| 18753 | + adev->antenna = (u8)*extra; | ||
| 18754 | + SET_BIT(adev->set_mask, GETSET_ANTENNA); | ||
| 18755 | + | ||
| 18756 | + acx_sem_unlock(adev); | ||
| 18757 | + | ||
| 18758 | + return -EINPROGRESS; | ||
| 18759 | +} | ||
| 18760 | + | ||
| 18761 | + | ||
| 18762 | +/*********************************************************************** | ||
| 18763 | +** acx_ioctl_get_antenna | ||
| 18764 | +*/ | ||
| 18765 | +static int | ||
| 18766 | +acx_ioctl_get_antenna( | ||
| 18767 | + struct net_device *ndev, | ||
| 18768 | + struct iw_request_info *info, | ||
| 18769 | + union iwreq_data *wrqu, | ||
| 18770 | + char *extra) | ||
| 18771 | +{ | ||
| 18772 | + acx_device_t *adev = ndev2adev(ndev); | ||
| 18773 | + | ||
| 18774 | + /* no locking. it's pointless to lock a single load */ | ||
| 18775 | + printk("current antenna value: 0x%02X (COMBINED bit mask)\n" | ||
| 18776 | + "Rx antenna selection:\n" | ||
| 18777 | + "0x00 ant. 1\n" | ||
| 18778 | + "0x40 ant. 2\n" | ||
| 18779 | + "0x80 full diversity\n" | ||
| 18780 | + "0xc0 partial diversity\n" | ||
| 18781 | + "Tx antenna selection:\n" | ||
| 18782 | + "0x00 ant. 2\n" /* yep, those ARE reversed! */ | ||
| 18783 | + "0x20 ant. 1\n", adev->antenna); | ||
| 18784 | + | ||
| 18785 | + return 0; | ||
| 18786 | +} | ||
| 18787 | + | ||
| 18788 | + | ||
| 18789 | +/*********************************************************************** | ||
| 18790 | +** acx_ioctl_set_rx_antenna | ||
| 18791 | +** | ||
| 18792 | +** 0 = antenna1; 1 = antenna2; 2 = full diversity; 3 = partial diversity | ||
| 18793 | +** Could anybody test which antenna is the external one? | ||
| 18794 | +*/ | ||
| 18795 | +static int | ||
| 18796 | +acx_ioctl_set_rx_antenna( | ||
| 18797 | + struct net_device *ndev, | ||
| 18798 | + struct iw_request_info *info, | ||
| 18799 | + union iwreq_data *wrqu, | ||
| 18800 | + char *extra) | ||
| 18801 | +{ | ||
| 18802 | + acx_device_t *adev = ndev2adev(ndev); | ||
| 18803 | + int result; | ||
| 18804 | + | ||
| 18805 | + FN_ENTER; | ||
| 18806 | + | ||
| 18807 | + if (*extra > 3) { | ||
| 18808 | + result = -EINVAL; | ||
| 18809 | + goto end; | ||
| 18810 | + } | ||
| 18811 | + | ||
| 18812 | + printk("old antenna value: 0x%02X\n", adev->antenna); | ||
| 18813 | + | ||
| 18814 | + acx_sem_lock(adev); | ||
| 18815 | + | ||
| 18816 | + adev->antenna &= 0x3f; | ||
| 18817 | + SET_BIT(adev->antenna, (*extra << 6)); | ||
| 18818 | + SET_BIT(adev->set_mask, GETSET_ANTENNA); | ||
| 18819 | + printk("new antenna value: 0x%02X\n", adev->antenna); | ||
| 18820 | + result = -EINPROGRESS; | ||
| 18821 | + | ||
| 18822 | + acx_sem_unlock(adev); | ||
| 18823 | +end: | ||
| 18824 | + FN_EXIT1(result); | ||
| 18825 | + return result; | ||
| 18826 | +} | ||
| 18827 | + | ||
| 18828 | + | ||
| 18829 | +/*********************************************************************** | ||
| 18830 | +** acx_ioctl_set_tx_antenna | ||
| 18831 | +** | ||
| 18832 | +** Arguments: 0 == antenna2; 1 == antenna1; | ||
| 18833 | +** Could anybody test which antenna is the external one? | ||
| 18834 | +*/ | ||
| 18835 | +static int | ||
| 18836 | +acx_ioctl_set_tx_antenna( | ||
| 18837 | + struct net_device *ndev, | ||
| 18838 | + struct iw_request_info *info, | ||
| 18839 | + union iwreq_data *wrqu, | ||
| 18840 | + char *extra) | ||
| 18841 | +{ | ||
| 18842 | + acx_device_t *adev = ndev2adev(ndev); | ||
| 18843 | + int result; | ||
| 18844 | + | ||
| 18845 | + FN_ENTER; | ||
| 18846 | + | ||
| 18847 | + if (*extra > 1) { | ||
| 18848 | + result = -EINVAL; | ||
| 18849 | + goto end; | ||
| 18850 | + } | ||
| 18851 | + | ||
| 18852 | + printk("old antenna value: 0x%02X\n", adev->antenna); | ||
| 18853 | + | ||
| 18854 | + acx_sem_lock(adev); | ||
| 18855 | + | ||
| 18856 | + adev->antenna &= ~0x30; | ||
| 18857 | + SET_BIT(adev->antenna, ((*extra & 0x01) << 5)); | ||
| 18858 | + SET_BIT(adev->set_mask, GETSET_ANTENNA); | ||
| 18859 | + printk("new antenna value: 0x%02X\n", adev->antenna); | ||
| 18860 | + result = -EINPROGRESS; | ||
| 18861 | + | ||
| 18862 | + acx_sem_unlock(adev); | ||
| 18863 | +end: | ||
| 18864 | + FN_EXIT1(result); | ||
| 18865 | + return result; | ||
| 18866 | +} | ||
| 18867 | + | ||
| 18868 | + | ||
| 18869 | +/*********************************************************************** | ||
| 18870 | +** acx_ioctl_wlansniff | ||
| 18871 | +** | ||
| 18872 | +** can we just remove this in favor of monitor mode? --vda | ||
| 18873 | +*/ | ||
| 18874 | +static int | ||
| 18875 | +acx_ioctl_wlansniff( | ||
| 18876 | + struct net_device *ndev, | ||
| 18877 | + struct iw_request_info *info, | ||
| 18878 | + union iwreq_data *wrqu, | ||
| 18879 | + char *extra) | ||
| 18880 | +{ | ||
| 18881 | + acx_device_t *adev = ndev2adev(ndev); | ||
| 18882 | + unsigned int *params = (unsigned int*)extra; | ||
| 18883 | + unsigned int enable = (unsigned int)(params[0] > 0); | ||
| 18884 | + int result; | ||
| 18885 | + | ||
| 18886 | + FN_ENTER; | ||
| 18887 | + | ||
| 18888 | + acx_sem_lock(adev); | ||
| 18889 | + | ||
| 18890 | + /* not using printk() here, since it distorts kismet display | ||
| 18891 | + * when printk messages activated */ | ||
| 18892 | + log(L_IOCTL, "setting monitor to: 0x%02X\n", params[0]); | ||
| 18893 | + | ||
| 18894 | + switch (params[0]) { | ||
| 18895 | + case 0: | ||
| 18896 | + /* no monitor mode. hmm, should we simply ignore it | ||
| 18897 | + * or go back to enabling adev->netdev->type ARPHRD_ETHER? */ | ||
| 18898 | + break; | ||
| 18899 | + case 1: | ||
| 18900 | + adev->monitor_type = ARPHRD_IEEE80211_PRISM; | ||
| 18901 | + break; | ||
| 18902 | + case 2: | ||
| 18903 | + adev->monitor_type = ARPHRD_IEEE80211; | ||
| 18904 | + break; | ||
| 18905 | + } | ||
| 18906 | + | ||
| 18907 | + if (params[0]) { | ||
| 18908 | + adev->mode = ACX_MODE_MONITOR; | ||
| 18909 | + SET_BIT(adev->set_mask, GETSET_MODE); | ||
| 18910 | + } | ||
| 18911 | + | ||
| 18912 | + if (enable) { | ||
| 18913 | + adev->channel = params[1]; | ||
| 18914 | + SET_BIT(adev->set_mask, GETSET_RX); | ||
| 18915 | + } | ||
| 18916 | + result = -EINPROGRESS; | ||
| 18917 | + | ||
| 18918 | + acx_sem_unlock(adev); | ||
| 18919 | + | ||
| 18920 | + FN_EXIT1(result); | ||
| 18921 | + return result; | ||
| 18922 | +} | ||
| 18923 | + | ||
| 18924 | + | ||
| 18925 | +/*********************************************************************** | ||
| 18926 | +** acx_ioctl_unknown11 | ||
| 18927 | +** FIXME: looks like some sort of "iwpriv kick_sta MAC" but it's broken | ||
| 18928 | +*/ | ||
| 18929 | +static int | ||
| 18930 | +acx_ioctl_unknown11( | ||
| 18931 | + struct net_device *ndev, | ||
| 18932 | + struct iw_request_info *info, | ||
| 18933 | + union iwreq_data *wrqu, | ||
| 18934 | + char *extra) | ||
| 18935 | +{ | ||
| 18936 | +#ifdef BROKEN | ||
| 18937 | + struct iw_param *vwrq = &wrqu->param; | ||
| 18938 | + acx_device_t *adev = ndev2adev(ndev); | ||
| 18939 | + unsigned long flags; | ||
| 18940 | + client_t client; | ||
| 18941 | + int result; | ||
| 18942 | + | ||
| 18943 | + acx_sem_lock(adev); | ||
| 18944 | + acx_lock(adev, flags); | ||
| 18945 | + | ||
| 18946 | + acx_l_transmit_disassoc(adev, &client); | ||
| 18947 | + result = OK; | ||
| 18948 | + | ||
| 18949 | + acx_unlock(adev, flags); | ||
| 18950 | + acx_sem_unlock(adev); | ||
| 18951 | + | ||
| 18952 | + return result; | ||
| 18953 | +#endif | ||
| 18954 | + return -EINVAL; | ||
| 18955 | +} | ||
| 18956 | + | ||
| 18957 | + | ||
| 18958 | +/*********************************************************************** | ||
| 18959 | +** debug helper function to be able to debug various issues relatively easily | ||
| 18960 | +*/ | ||
| 18961 | +static int | ||
| 18962 | +acx_ioctl_dbg_set_masks( | ||
| 18963 | + struct net_device *ndev, | ||
| 18964 | + struct iw_request_info *info, | ||
| 18965 | + union iwreq_data *wrqu, | ||
| 18966 | + char *extra) | ||
| 18967 | +{ | ||
| 18968 | + acx_device_t *adev = ndev2adev(ndev); | ||
| 18969 | + const unsigned int *params = (unsigned int*)extra; | ||
| 18970 | + int result; | ||
| 18971 | + | ||
| 18972 | + acx_sem_lock(adev); | ||
| 18973 | + | ||
| 18974 | + log(L_IOCTL, "setting flags in settings mask: " | ||
| 18975 | + "get_mask %08X set_mask %08X\n" | ||
| 18976 | + "before: get_mask %08X set_mask %08X\n", | ||
| 18977 | + params[0], params[1], | ||
| 18978 | + adev->get_mask, adev->set_mask); | ||
| 18979 | + SET_BIT(adev->get_mask, params[0]); | ||
| 18980 | + SET_BIT(adev->set_mask, params[1]); | ||
| 18981 | + log(L_IOCTL, "after: get_mask %08X set_mask %08X\n", | ||
| 18982 | + adev->get_mask, adev->set_mask); | ||
| 18983 | + result = -EINPROGRESS; /* immediately call commit handler */ | ||
| 18984 | + | ||
| 18985 | + acx_sem_unlock(adev); | ||
| 18986 | + | ||
| 18987 | + return result; | ||
| 18988 | +} | ||
| 18989 | + | ||
| 18990 | + | ||
| 18991 | +/*********************************************************************** | ||
| 18992 | +* acx_ioctl_set_rates | ||
| 18993 | +* | ||
| 18994 | +* This ioctl takes string parameter. Examples: | ||
| 18995 | +* iwpriv wlan0 SetRates "1,2" | ||
| 18996 | +* use 1 and 2 Mbit rates, both are in basic rate set | ||
| 18997 | +* iwpriv wlan0 SetRates "1,2 5,11" | ||
| 18998 | +* use 1,2,5.5,11 Mbit rates. 1 and 2 are basic | ||
| 18999 | +* iwpriv wlan0 SetRates "1,2 5c,11c" | ||
| 19000 | +* same ('c' means 'CCK modulation' and it is a default for 5 and 11) | ||
| 19001 | +* iwpriv wlan0 SetRates "1,2 5p,11p" | ||
| 19002 | +* use 1,2,5.5,11 Mbit, 1,2 are basic. 5 and 11 are using PBCC | ||
| 19003 | +* iwpriv wlan0 SetRates "1,2,5,11 22p" | ||
| 19004 | +* use 1,2,5.5,11,22 Mbit. 1,2,5.5 and 11 are basic. 22 is using PBCC | ||
| 19005 | +* (this is the maximum acx100 can do (modulo x4 mode)) | ||
| 19006 | +* iwpriv wlan0 SetRates "1,2,5,11 22" | ||
| 19007 | +* same. 802.11 defines only PBCC modulation | ||
| 19008 | +* for 22 and 33 Mbit rates, so there is no ambiguity | ||
| 19009 | +* iwpriv wlan0 SetRates "1,2,5,11 6o,9o,12o,18o,24o,36o,48o,54o" | ||
| 19010 | +* 1,2,5.5 and 11 are basic. 11g OFDM rates are enabled but | ||
| 19011 | +* they are not in basic rate set. 22 Mbit is disabled. | ||
| 19012 | +* iwpriv wlan0 SetRates "1,2,5,11 6,9,12,18,24,36,48,54" | ||
| 19013 | +* same. OFDM is default for 11g rates except 22 and 33 Mbit, | ||
| 19014 | +* thus 'o' is optional | ||
| 19015 | +* iwpriv wlan0 SetRates "1,2,5,11 6d,9d,12d,18d,24d,36d,48d,54d" | ||
| 19016 | +* 1,2,5.5 and 11 are basic. 11g CCK-OFDM rates are enabled | ||
| 19017 | +* (acx111 does not support CCK-OFDM, driver will reject this cmd) | ||
| 19018 | +* iwpriv wlan0 SetRates "6,9,12 18,24,36,48,54" | ||
| 19019 | +* 6,9,12 are basic, rest of 11g rates is enabled. Using OFDM | ||
| 19020 | +*/ | ||
| 19021 | +#include "setrate.c" | ||
| 19022 | + | ||
| 19023 | +/* disallow: 33Mbit (unsupported by hw) */ | ||
| 19024 | +/* disallow: CCKOFDM (unsupported by hw) */ | ||
| 19025 | +static int | ||
| 19026 | +acx111_supported(int mbit, int modulation, void *opaque) | ||
| 19027 | +{ | ||
| 19028 | + if (mbit==33) return -ENOTSUPP; | ||
| 19029 | + if (modulation==DOT11_MOD_CCKOFDM) return -ENOTSUPP; | ||
| 19030 | + return OK; | ||
| 19031 | +} | ||
| 19032 | + | ||
| 19033 | +static const u16 | ||
| 19034 | +acx111mask[] = { | ||
| 19035 | + [DOT11_RATE_1 ] = RATE111_1 , | ||
| 19036 | + [DOT11_RATE_2 ] = RATE111_2 , | ||
| 19037 | + [DOT11_RATE_5 ] = RATE111_5 , | ||
| 19038 | + [DOT11_RATE_11] = RATE111_11, | ||
| 19039 | + [DOT11_RATE_22] = RATE111_22, | ||
| 19040 | + /* [DOT11_RATE_33] = */ | ||
| 19041 | + [DOT11_RATE_6 ] = RATE111_6 , | ||
| 19042 | + [DOT11_RATE_9 ] = RATE111_9 , | ||
| 19043 | + [DOT11_RATE_12] = RATE111_12, | ||
| 19044 | + [DOT11_RATE_18] = RATE111_18, | ||
| 19045 | + [DOT11_RATE_24] = RATE111_24, | ||
| 19046 | + [DOT11_RATE_36] = RATE111_36, | ||
| 19047 | + [DOT11_RATE_48] = RATE111_48, | ||
| 19048 | + [DOT11_RATE_54] = RATE111_54, | ||
| 19049 | +}; | ||
| 19050 | + | ||
| 19051 | +static u32 | ||
| 19052 | +acx111_gen_mask(int mbit, int modulation, void *opaque) | ||
| 19053 | +{ | ||
| 19054 | + /* lower 16 bits show selected 1, 2, CCK and OFDM rates */ | ||
| 19055 | + /* upper 16 bits show selected PBCC rates */ | ||
| 19056 | + u32 m = acx111mask[rate_mbit2enum(mbit)]; | ||
| 19057 | + if (modulation==DOT11_MOD_PBCC) | ||
| 19058 | + return m<<16; | ||
| 19059 | + return m; | ||
| 19060 | +} | ||
| 19061 | + | ||
| 19062 | +static int | ||
| 19063 | +verify_rate(u32 rate, int chip_type) | ||
| 19064 | +{ | ||
| 19065 | + /* never happens. be paranoid */ | ||
| 19066 | + if (!rate) return -EINVAL; | ||
| 19067 | + | ||
| 19068 | + /* disallow: mixing PBCC and CCK at 5 and 11Mbit | ||
| 19069 | + ** (can be supported, but needs complicated handling in tx code) */ | ||
| 19070 | + if (( rate & ((RATE111_11+RATE111_5)<<16) ) | ||
| 19071 | + && ( rate & (RATE111_11+RATE111_5) ) | ||
| 19072 | + ) { | ||
| 19073 | + return -ENOTSUPP; | ||
| 19074 | + } | ||
| 19075 | + if (CHIPTYPE_ACX100 == chip_type) { | ||
| 19076 | + if ( rate & ~(RATE111_ACX100_COMPAT+(RATE111_ACX100_COMPAT<<16)) ) | ||
| 19077 | + return -ENOTSUPP; | ||
| 19078 | + } | ||
| 19079 | + return 0; | ||
| 19080 | +} | ||
| 19081 | + | ||
| 19082 | +static int | ||
| 19083 | +acx_ioctl_set_rates(struct net_device *ndev, | ||
| 19084 | + struct iw_request_info *info, | ||
| 19085 | + union iwreq_data *wrqu, | ||
| 19086 | + char *extra) | ||
| 19087 | +{ | ||
| 19088 | + acx_device_t *adev = ndev2adev(ndev); | ||
| 19089 | + unsigned long flags; | ||
| 19090 | + int result; | ||
| 19091 | + u32 brate = 0, orate = 0; /* basic, operational rate set */ | ||
| 19092 | + | ||
| 19093 | + FN_ENTER; | ||
| 19094 | + | ||
| 19095 | + log(L_IOCTL, "set_rates %s\n", extra); | ||
| 19096 | + result = fill_ratemasks(extra, &brate, &orate, | ||
| 19097 | + acx111_supported, acx111_gen_mask, 0); | ||
| 19098 | + if (result) goto end; | ||
| 19099 | + SET_BIT(orate, brate); | ||
| 19100 | + log(L_IOCTL, "brate %08X orate %08X\n", brate, orate); | ||
| 19101 | + | ||
| 19102 | + result = verify_rate(brate, adev->chip_type); | ||
| 19103 | + if (result) goto end; | ||
| 19104 | + result = verify_rate(orate, adev->chip_type); | ||
| 19105 | + if (result) goto end; | ||
| 19106 | + | ||
| 19107 | + acx_sem_lock(adev); | ||
| 19108 | + acx_lock(adev, flags); | ||
| 19109 | + | ||
| 19110 | + adev->rate_basic = brate; | ||
| 19111 | + adev->rate_oper = orate; | ||
| 19112 | + /* TODO: ideally, we shall monitor highest basic rate | ||
| 19113 | + ** which was successfully sent to every peer | ||
| 19114 | + ** (say, last we checked, everybody could hear 5.5 Mbits) | ||
| 19115 | + ** and use that for bcasts when we want to reach all peers. | ||
| 19116 | + ** For beacons, we probably shall use lowest basic rate | ||
| 19117 | + ** because we want to reach all *potential* new peers too */ | ||
| 19118 | + adev->rate_bcast = 1 << lowest_bit(brate); | ||
| 19119 | + if (IS_ACX100(adev)) | ||
| 19120 | + adev->rate_bcast100 = acx_rate111to100(adev->rate_bcast); | ||
| 19121 | + adev->rate_auto = !has_only_one_bit(orate); | ||
| 19122 | + acx_l_update_client_rates(adev, orate); | ||
| 19123 | + /* TODO: get rid of ratevector, build it only when needed */ | ||
| 19124 | + acx_l_update_ratevector(adev); | ||
| 19125 | + | ||
| 19126 | + /* Do/don't do tx rate fallback; beacon contents and rate */ | ||
| 19127 | + SET_BIT(adev->set_mask, SET_RATE_FALLBACK|SET_TEMPLATES); | ||
| 19128 | + result = -EINPROGRESS; | ||
| 19129 | + | ||
| 19130 | + acx_unlock(adev, flags); | ||
| 19131 | + acx_sem_unlock(adev); | ||
| 19132 | +end: | ||
| 19133 | + FN_EXIT1(result); | ||
| 19134 | + return result; | ||
| 19135 | +} | ||
| 19136 | + | ||
| 19137 | + | ||
| 19138 | +/*********************************************************************** | ||
| 19139 | +** acx_ioctl_get_phy_chan_busy_percentage | ||
| 19140 | +*/ | ||
| 19141 | +static int | ||
| 19142 | +acx_ioctl_get_phy_chan_busy_percentage( | ||
| 19143 | + struct net_device *ndev, | ||
| 19144 | + struct iw_request_info *info, | ||
| 19145 | + union iwreq_data *wrqu, | ||
| 19146 | + char *extra) | ||
| 19147 | +{ | ||
| 19148 | + acx_device_t *adev = ndev2adev(ndev); | ||
| 19149 | + struct { | ||
| 19150 | + u16 type; | ||
| 19151 | + u16 len; | ||
| 19152 | + u32 busytime; | ||
| 19153 | + u32 totaltime; | ||
| 19154 | + } ACX_PACKED usage; | ||
| 19155 | + int result; | ||
| 19156 | + | ||
| 19157 | + acx_sem_lock(adev); | ||
| 19158 | + | ||
| 19159 | + if (OK != acx_s_interrogate(adev, &usage, ACX1xx_IE_MEDIUM_USAGE)) { | ||
| 19160 | + result = NOT_OK; | ||
| 19161 | + goto end_unlock; | ||
| 19162 | + } | ||
| 19163 | + | ||
| 19164 | + usage.busytime = le32_to_cpu(usage.busytime); | ||
| 19165 | + usage.totaltime = le32_to_cpu(usage.totaltime); | ||
| 19166 | + | ||
| 19167 | + /* yes, this is supposed to be "Medium" (singular of media), | ||
| 19168 | + not "average"! OK, reword the message to make it obvious... */ | ||
| 19169 | + printk("%s: busy percentage of medium (since last invocation): %d%% " | ||
| 19170 | + "(%u of %u microseconds)\n", | ||
| 19171 | + ndev->name, | ||
| 19172 | + usage.busytime / ((usage.totaltime / 100) + 1), | ||
| 19173 | + usage.busytime, usage.totaltime); | ||
| 19174 | + | ||
| 19175 | + result = OK; | ||
| 19176 | + | ||
| 19177 | +end_unlock: | ||
| 19178 | + acx_sem_unlock(adev); | ||
| 19179 | + | ||
| 19180 | + return result; | ||
| 19181 | +} | ||
| 19182 | + | ||
| 19183 | + | ||
| 19184 | +/*********************************************************************** | ||
| 19185 | +** acx_ioctl_set_ed_threshold | ||
| 19186 | +*/ | ||
| 19187 | +static inline int | ||
| 19188 | +acx_ioctl_set_ed_threshold( | ||
| 19189 | + struct net_device *ndev, | ||
| 19190 | + struct iw_request_info *info, | ||
| 19191 | + union iwreq_data *wrqu, | ||
| 19192 | + char *extra) | ||
| 19193 | +{ | ||
| 19194 | + acx_device_t *adev = ndev2adev(ndev); | ||
| 19195 | + | ||
| 19196 | + acx_sem_lock(adev); | ||
| 19197 | + | ||
| 19198 | + printk("old ED threshold value: %d\n", adev->ed_threshold); | ||
| 19199 | + adev->ed_threshold = (unsigned char)*extra; | ||
| 19200 | + printk("new ED threshold value: %d\n", (unsigned char)*extra); | ||
| 19201 | + SET_BIT(adev->set_mask, GETSET_ED_THRESH); | ||
| 19202 | + | ||
| 19203 | + acx_sem_unlock(adev); | ||
| 19204 | + | ||
| 19205 | + return -EINPROGRESS; | ||
| 19206 | +} | ||
| 19207 | + | ||
| 19208 | + | ||
| 19209 | +/*********************************************************************** | ||
| 19210 | +** acx_ioctl_set_cca | ||
| 19211 | +*/ | ||
| 19212 | +static inline int | ||
| 19213 | +acx_ioctl_set_cca( | ||
| 19214 | + struct net_device *ndev, | ||
| 19215 | + struct iw_request_info *info, | ||
| 19216 | + union iwreq_data *wrqu, | ||
| 19217 | + char *extra) | ||
| 19218 | +{ | ||
| 19219 | + acx_device_t *adev = ndev2adev(ndev); | ||
| 19220 | + int result; | ||
| 19221 | + | ||
| 19222 | + acx_sem_lock(adev); | ||
| 19223 | + | ||
| 19224 | + printk("old CCA value: 0x%02X\n", adev->cca); | ||
| 19225 | + adev->cca = (unsigned char)*extra; | ||
| 19226 | + printk("new CCA value: 0x%02X\n", (unsigned char)*extra); | ||
| 19227 | + SET_BIT(adev->set_mask, GETSET_CCA); | ||
| 19228 | + result = -EINPROGRESS; | ||
| 19229 | + | ||
| 19230 | + acx_sem_unlock(adev); | ||
| 19231 | + | ||
| 19232 | + return result; | ||
| 19233 | +} | ||
| 19234 | + | ||
| 19235 | + | ||
| 19236 | +/*********************************************************************** | ||
| 19237 | +*/ | ||
| 19238 | +static const char * const | ||
| 19239 | +scan_modes[] = { "active", "passive", "background" }; | ||
| 19240 | + | ||
| 19241 | +static void | ||
| 19242 | +acx_print_scan_params(acx_device_t *adev, const char* head) | ||
| 19243 | +{ | ||
| 19244 | + printk("%s: %smode %d (%s), min chan time %dTU, " | ||
| 19245 | + "max chan time %dTU, max scan rate byte: %d\n", | ||
| 19246 | + adev->ndev->name, head, | ||
| 19247 | + adev->scan_mode, scan_modes[adev->scan_mode], | ||
| 19248 | + adev->scan_probe_delay, adev->scan_duration, adev->scan_rate); | ||
| 19249 | +} | ||
| 19250 | + | ||
| 19251 | +static int | ||
| 19252 | +acx_ioctl_set_scan_params( | ||
| 19253 | + struct net_device *ndev, | ||
| 19254 | + struct iw_request_info *info, | ||
| 19255 | + union iwreq_data *wrqu, | ||
| 19256 | + char *extra) | ||
| 19257 | +{ | ||
| 19258 | + acx_device_t *adev = ndev2adev(ndev); | ||
| 19259 | + int result; | ||
| 19260 | + const int *params = (int *)extra; | ||
| 19261 | + | ||
| 19262 | + acx_sem_lock(adev); | ||
| 19263 | + | ||
| 19264 | + acx_print_scan_params(adev, "old scan parameters: "); | ||
| 19265 | + if ((params[0] != -1) && (params[0] >= 0) && (params[0] <= 2)) | ||
| 19266 | + adev->scan_mode = params[0]; | ||
| 19267 | + if (params[1] != -1) | ||
| 19268 | + adev->scan_probe_delay = params[1]; | ||
| 19269 | + if (params[2] != -1) | ||
| 19270 | + adev->scan_duration = params[2]; | ||
| 19271 | + if ((params[3] != -1) && (params[3] <= 255)) | ||
| 19272 | + adev->scan_rate = params[3]; | ||
| 19273 | + acx_print_scan_params(adev, "new scan parameters: "); | ||
| 19274 | + SET_BIT(adev->set_mask, GETSET_RESCAN); | ||
| 19275 | + result = -EINPROGRESS; | ||
| 19276 | + | ||
| 19277 | + acx_sem_unlock(adev); | ||
| 19278 | + | ||
| 19279 | + return result; | ||
| 19280 | +} | ||
| 19281 | + | ||
| 19282 | +static int | ||
| 19283 | +acx_ioctl_get_scan_params( | ||
| 19284 | + struct net_device *ndev, | ||
| 19285 | + struct iw_request_info *info, | ||
| 19286 | + union iwreq_data *wrqu, | ||
| 19287 | + char *extra) | ||
| 19288 | +{ | ||
| 19289 | + acx_device_t *adev = ndev2adev(ndev); | ||
| 19290 | + int result; | ||
| 19291 | + int *params = (int *)extra; | ||
| 19292 | + | ||
| 19293 | + acx_sem_lock(adev); | ||
| 19294 | + | ||
| 19295 | + acx_print_scan_params(adev, "current scan parameters: "); | ||
| 19296 | + params[0] = adev->scan_mode; | ||
| 19297 | + params[1] = adev->scan_probe_delay; | ||
| 19298 | + params[2] = adev->scan_duration; | ||
| 19299 | + params[3] = adev->scan_rate; | ||
| 19300 | + result = OK; | ||
| 19301 | + | ||
| 19302 | + acx_sem_unlock(adev); | ||
| 19303 | + | ||
| 19304 | + return result; | ||
| 19305 | +} | ||
| 19306 | + | ||
| 19307 | + | ||
| 19308 | +/*********************************************************************** | ||
| 19309 | +*/ | ||
| 19310 | +static int | ||
| 19311 | +acx100_ioctl_set_led_power( | ||
| 19312 | + struct net_device *ndev, | ||
| 19313 | + struct iw_request_info *info, | ||
| 19314 | + union iwreq_data *wrqu, | ||
| 19315 | + char *extra) | ||
| 19316 | +{ | ||
| 19317 | + static const char * const led_modes[] = { "off", "on", "LinkQuality" }; | ||
| 19318 | + | ||
| 19319 | + acx_device_t *adev = ndev2adev(ndev); | ||
| 19320 | + int result; | ||
| 19321 | + | ||
| 19322 | + acx_sem_lock(adev); | ||
| 19323 | + | ||
| 19324 | + printk("%s: power LED status: old %d (%s), ", | ||
| 19325 | + ndev->name, | ||
| 19326 | + adev->led_power, | ||
| 19327 | + led_modes[adev->led_power]); | ||
| 19328 | + adev->led_power = extra[0]; | ||
| 19329 | + if (adev->led_power > 2) adev->led_power = 2; | ||
| 19330 | + printk("new %d (%s)\n", | ||
| 19331 | + adev->led_power, | ||
| 19332 | + led_modes[adev->led_power]); | ||
| 19333 | + | ||
| 19334 | + if (adev->led_power == 2) { | ||
| 19335 | + printk("%s: max link quality setting: old %d, ", | ||
| 19336 | + ndev->name, adev->brange_max_quality); | ||
| 19337 | + if (extra[1]) | ||
| 19338 | + adev->brange_max_quality = extra[1]; | ||
| 19339 | + printk("new %d\n", adev->brange_max_quality); | ||
| 19340 | + } | ||
| 19341 | + | ||
| 19342 | + SET_BIT(adev->set_mask, GETSET_LED_POWER); | ||
| 19343 | + | ||
| 19344 | + result = -EINPROGRESS; | ||
| 19345 | + | ||
| 19346 | + acx_sem_unlock(adev); | ||
| 19347 | + | ||
| 19348 | + return result; | ||
| 19349 | +} | ||
| 19350 | + | ||
| 19351 | + | ||
| 19352 | +/*********************************************************************** | ||
| 19353 | +*/ | ||
| 19354 | +static inline int | ||
| 19355 | +acx100_ioctl_get_led_power( | ||
| 19356 | + struct net_device *ndev, | ||
| 19357 | + struct iw_request_info *info, | ||
| 19358 | + union iwreq_data *wrqu, | ||
| 19359 | + char *extra) | ||
| 19360 | +{ | ||
| 19361 | + acx_device_t *adev = ndev2adev(ndev); | ||
| 19362 | + | ||
| 19363 | + acx_sem_lock(adev); | ||
| 19364 | + | ||
| 19365 | + extra[0] = adev->led_power; | ||
| 19366 | + if (adev->led_power == 2) | ||
| 19367 | + extra[1] = adev->brange_max_quality; | ||
| 19368 | + else | ||
| 19369 | + extra[1] = -1; | ||
| 19370 | + | ||
| 19371 | + acx_sem_unlock(adev); | ||
| 19372 | + | ||
| 19373 | + return OK; | ||
| 19374 | +} | ||
| 19375 | + | ||
| 19376 | + | ||
| 19377 | +/*********************************************************************** | ||
| 19378 | +*/ | ||
| 19379 | +static int | ||
| 19380 | +acx111_ioctl_info( | ||
| 19381 | + struct net_device *ndev, | ||
| 19382 | + struct iw_request_info *info, | ||
| 19383 | + union iwreq_data *wrqu, | ||
| 19384 | + char *extra) | ||
| 19385 | +{ | ||
| 19386 | + struct iw_param *vwrq = &wrqu->param; | ||
| 19387 | + if (!IS_PCI(ndev2adev(ndev))) | ||
| 19388 | + return OK; | ||
| 19389 | + return acx111pci_ioctl_info(ndev, info, vwrq, extra); | ||
| 19390 | +} | ||
| 19391 | + | ||
| 19392 | + | ||
| 19393 | +/*********************************************************************** | ||
| 19394 | +*/ | ||
| 19395 | +static int | ||
| 19396 | +acx100_ioctl_set_phy_amp_bias( | ||
| 19397 | + struct net_device *ndev, | ||
| 19398 | + struct iw_request_info *info, | ||
| 19399 | + union iwreq_data *wrqu, | ||
| 19400 | + char *extra) | ||
| 19401 | +{ | ||
| 19402 | + struct iw_param *vwrq = &wrqu->param; | ||
| 19403 | + if (IS_USB(ndev2adev(ndev))) { | ||
| 19404 | + printk("acx: set_phy_amp_bias() is not supported on USB\n"); | ||
| 19405 | + return OK; | ||
| 19406 | + } | ||
| 19407 | +#ifdef ACX_MEM | ||
| 19408 | + return acx100mem_ioctl_set_phy_amp_bias(ndev, info, vwrq, extra); | ||
| 19409 | +#else | ||
| 19410 | + return acx100pci_ioctl_set_phy_amp_bias(ndev, info, vwrq, extra); | ||
| 19411 | +#endif | ||
| 19412 | +} | ||
| 19413 | + | ||
| 19414 | + | ||
| 19415 | +/*********************************************************************** | ||
| 19416 | +*/ | ||
| 19417 | +static const iw_handler acx_ioctl_handler[] = | ||
| 19418 | +{ | ||
| 19419 | + acx_ioctl_commit, /* SIOCSIWCOMMIT */ | ||
| 19420 | + acx_ioctl_get_name, /* SIOCGIWNAME */ | ||
| 19421 | + NULL, /* SIOCSIWNWID */ | ||
| 19422 | + NULL, /* SIOCGIWNWID */ | ||
| 19423 | + acx_ioctl_set_freq, /* SIOCSIWFREQ */ | ||
| 19424 | + acx_ioctl_get_freq, /* SIOCGIWFREQ */ | ||
| 19425 | + acx_ioctl_set_mode, /* SIOCSIWMODE */ | ||
| 19426 | + acx_ioctl_get_mode, /* SIOCGIWMODE */ | ||
| 19427 | + acx_ioctl_set_sens, /* SIOCSIWSENS */ | ||
| 19428 | + acx_ioctl_get_sens, /* SIOCGIWSENS */ | ||
| 19429 | + NULL, /* SIOCSIWRANGE */ | ||
| 19430 | + acx_ioctl_get_range, /* SIOCGIWRANGE */ | ||
| 19431 | + NULL, /* SIOCSIWPRIV */ | ||
| 19432 | + NULL, /* SIOCGIWPRIV */ | ||
| 19433 | + NULL, /* SIOCSIWSTATS */ | ||
| 19434 | + NULL, /* SIOCGIWSTATS */ | ||
| 19435 | +#if IW_HANDLER_VERSION > 4 | ||
| 19436 | + iw_handler_set_spy, /* SIOCSIWSPY */ | ||
| 19437 | + iw_handler_get_spy, /* SIOCGIWSPY */ | ||
| 19438 | + iw_handler_set_thrspy, /* SIOCSIWTHRSPY */ | ||
| 19439 | + iw_handler_get_thrspy, /* SIOCGIWTHRSPY */ | ||
| 19440 | +#else /* IW_HANDLER_VERSION > 4 */ | ||
| 19441 | +#ifdef WIRELESS_SPY | ||
| 19442 | + NULL /* acx_ioctl_set_spy FIXME */, /* SIOCSIWSPY */ | ||
| 19443 | + NULL /* acx_ioctl_get_spy */, /* SIOCGIWSPY */ | ||
| 19444 | +#else /* WSPY */ | ||
| 19445 | + NULL, /* SIOCSIWSPY */ | ||
| 19446 | + NULL, /* SIOCGIWSPY */ | ||
| 19447 | +#endif /* WSPY */ | ||
| 19448 | + NULL, /* [nothing] */ | ||
| 19449 | + NULL, /* [nothing] */ | ||
| 19450 | +#endif /* IW_HANDLER_VERSION > 4 */ | ||
| 19451 | + acx_ioctl_set_ap, /* SIOCSIWAP */ | ||
| 19452 | + acx_ioctl_get_ap, /* SIOCGIWAP */ | ||
| 19453 | + NULL, /* [nothing] */ | ||
| 19454 | + acx_ioctl_get_aplist, /* SIOCGIWAPLIST */ | ||
| 19455 | + acx_ioctl_set_scan, /* SIOCSIWSCAN */ | ||
| 19456 | + acx_ioctl_get_scan, /* SIOCGIWSCAN */ | ||
| 19457 | + acx_ioctl_set_essid, /* SIOCSIWESSID */ | ||
| 19458 | + acx_ioctl_get_essid, /* SIOCGIWESSID */ | ||
| 19459 | + acx_ioctl_set_nick, /* SIOCSIWNICKN */ | ||
| 19460 | + acx_ioctl_get_nick, /* SIOCGIWNICKN */ | ||
| 19461 | + NULL, /* [nothing] */ | ||
| 19462 | + NULL, /* [nothing] */ | ||
| 19463 | + acx_ioctl_set_rate, /* SIOCSIWRATE */ | ||
| 19464 | + acx_ioctl_get_rate, /* SIOCGIWRATE */ | ||
| 19465 | + acx_ioctl_set_rts, /* SIOCSIWRTS */ | ||
| 19466 | + acx_ioctl_get_rts, /* SIOCGIWRTS */ | ||
| 19467 | +#if ACX_FRAGMENTATION | ||
| 19468 | + acx_ioctl_set_frag, /* SIOCSIWFRAG */ | ||
| 19469 | + acx_ioctl_get_frag, /* SIOCGIWFRAG */ | ||
| 19470 | +#else | ||
| 19471 | + NULL, /* SIOCSIWFRAG */ | ||
| 19472 | + NULL, /* SIOCGIWFRAG */ | ||
| 19473 | +#endif | ||
| 19474 | + acx_ioctl_set_txpow, /* SIOCSIWTXPOW */ | ||
| 19475 | + acx_ioctl_get_txpow, /* SIOCGIWTXPOW */ | ||
| 19476 | + acx_ioctl_set_retry, /* SIOCSIWRETRY */ | ||
| 19477 | + acx_ioctl_get_retry, /* SIOCGIWRETRY */ | ||
| 19478 | + acx_ioctl_set_encode, /* SIOCSIWENCODE */ | ||
| 19479 | + acx_ioctl_get_encode, /* SIOCGIWENCODE */ | ||
| 19480 | + acx_ioctl_set_power, /* SIOCSIWPOWER */ | ||
| 19481 | + acx_ioctl_get_power, /* SIOCGIWPOWER */ | ||
| 19482 | +}; | ||
| 19483 | + | ||
| 19484 | + | ||
| 19485 | +/*********************************************************************** | ||
| 19486 | +*/ | ||
| 19487 | + | ||
| 19488 | +/* if you plan to reorder something, make sure to reorder all other places | ||
| 19489 | + * accordingly! */ | ||
| 19490 | +/* SET/GET convention: SETs must have even position, GETs odd */ | ||
| 19491 | +#define ACX100_IOCTL SIOCIWFIRSTPRIV | ||
| 19492 | +enum { | ||
| 19493 | + ACX100_IOCTL_DEBUG = ACX100_IOCTL, | ||
| 19494 | + ACX100_IOCTL_GET__________UNUSED1, | ||
| 19495 | + ACX100_IOCTL_SET_PLED, | ||
| 19496 | + ACX100_IOCTL_GET_PLED, | ||
| 19497 | + ACX100_IOCTL_SET_RATES, | ||
| 19498 | + ACX100_IOCTL_LIST_DOM, | ||
| 19499 | + ACX100_IOCTL_SET_DOM, | ||
| 19500 | + ACX100_IOCTL_GET_DOM, | ||
| 19501 | + ACX100_IOCTL_SET_SCAN_PARAMS, | ||
| 19502 | + ACX100_IOCTL_GET_SCAN_PARAMS, | ||
| 19503 | + ACX100_IOCTL_SET_PREAMB, | ||
| 19504 | + ACX100_IOCTL_GET_PREAMB, | ||
| 19505 | + ACX100_IOCTL_SET_ANT, | ||
| 19506 | + ACX100_IOCTL_GET_ANT, | ||
| 19507 | + ACX100_IOCTL_RX_ANT, | ||
| 19508 | + ACX100_IOCTL_TX_ANT, | ||
| 19509 | + ACX100_IOCTL_SET_PHY_AMP_BIAS, | ||
| 19510 | + ACX100_IOCTL_GET_PHY_CHAN_BUSY, | ||
| 19511 | + ACX100_IOCTL_SET_ED, | ||
| 19512 | + ACX100_IOCTL_GET__________UNUSED3, | ||
| 19513 | + ACX100_IOCTL_SET_CCA, | ||
| 19514 | + ACX100_IOCTL_GET__________UNUSED4, | ||
| 19515 | + ACX100_IOCTL_MONITOR, | ||
| 19516 | + ACX100_IOCTL_TEST, | ||
| 19517 | + ACX100_IOCTL_DBG_SET_MASKS, | ||
| 19518 | + ACX111_IOCTL_INFO, | ||
| 19519 | + ACX100_IOCTL_DBG_SET_IO, | ||
| 19520 | + ACX100_IOCTL_DBG_GET_IO | ||
| 19521 | +}; | ||
| 19522 | + | ||
| 19523 | + | ||
| 19524 | +static const iw_handler acx_ioctl_private_handler[] = | ||
| 19525 | +{ | ||
| 19526 | +#if ACX_DEBUG | ||
| 19527 | +[ACX100_IOCTL_DEBUG - ACX100_IOCTL] = acx_ioctl_set_debug, | ||
| 19528 | +#endif | ||
| 19529 | +[ACX100_IOCTL_SET_PLED - ACX100_IOCTL] = acx100_ioctl_set_led_power, | ||
| 19530 | +[ACX100_IOCTL_GET_PLED - ACX100_IOCTL] = acx100_ioctl_get_led_power, | ||
| 19531 | +[ACX100_IOCTL_SET_RATES - ACX100_IOCTL] = acx_ioctl_set_rates, | ||
| 19532 | +[ACX100_IOCTL_LIST_DOM - ACX100_IOCTL] = acx_ioctl_list_reg_domain, | ||
| 19533 | +[ACX100_IOCTL_SET_DOM - ACX100_IOCTL] = acx_ioctl_set_reg_domain, | ||
| 19534 | +[ACX100_IOCTL_GET_DOM - ACX100_IOCTL] = acx_ioctl_get_reg_domain, | ||
| 19535 | +[ACX100_IOCTL_SET_SCAN_PARAMS - ACX100_IOCTL] = acx_ioctl_set_scan_params, | ||
| 19536 | +[ACX100_IOCTL_GET_SCAN_PARAMS - ACX100_IOCTL] = acx_ioctl_get_scan_params, | ||
| 19537 | +[ACX100_IOCTL_SET_PREAMB - ACX100_IOCTL] = acx_ioctl_set_short_preamble, | ||
| 19538 | +[ACX100_IOCTL_GET_PREAMB - ACX100_IOCTL] = acx_ioctl_get_short_preamble, | ||
| 19539 | +[ACX100_IOCTL_SET_ANT - ACX100_IOCTL] = acx_ioctl_set_antenna, | ||
| 19540 | +[ACX100_IOCTL_GET_ANT - ACX100_IOCTL] = acx_ioctl_get_antenna, | ||
| 19541 | +[ACX100_IOCTL_RX_ANT - ACX100_IOCTL] = acx_ioctl_set_rx_antenna, | ||
| 19542 | +[ACX100_IOCTL_TX_ANT - ACX100_IOCTL] = acx_ioctl_set_tx_antenna, | ||
| 19543 | +[ACX100_IOCTL_SET_PHY_AMP_BIAS - ACX100_IOCTL] = acx100_ioctl_set_phy_amp_bias, | ||
| 19544 | +[ACX100_IOCTL_GET_PHY_CHAN_BUSY - ACX100_IOCTL] = acx_ioctl_get_phy_chan_busy_percentage, | ||
| 19545 | +[ACX100_IOCTL_SET_ED - ACX100_IOCTL] = acx_ioctl_set_ed_threshold, | ||
| 19546 | +[ACX100_IOCTL_SET_CCA - ACX100_IOCTL] = acx_ioctl_set_cca, | ||
| 19547 | +[ACX100_IOCTL_MONITOR - ACX100_IOCTL] = acx_ioctl_wlansniff, | ||
| 19548 | +[ACX100_IOCTL_TEST - ACX100_IOCTL] = acx_ioctl_unknown11, | ||
| 19549 | +[ACX100_IOCTL_DBG_SET_MASKS - ACX100_IOCTL] = acx_ioctl_dbg_set_masks, | ||
| 19550 | +[ACX111_IOCTL_INFO - ACX100_IOCTL] = acx111_ioctl_info, | ||
| 19551 | +}; | ||
| 19552 | + | ||
| 19553 | + | ||
| 19554 | +static const struct iw_priv_args acx_ioctl_private_args[] = { | ||
| 19555 | +#if ACX_DEBUG | ||
| 19556 | +{ cmd : ACX100_IOCTL_DEBUG, | ||
| 19557 | + set_args : IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, | ||
| 19558 | + get_args : 0, | ||
| 19559 | + name : "SetDebug" }, | ||
| 19560 | +#endif | ||
| 19561 | +{ cmd : ACX100_IOCTL_SET_PLED, | ||
| 19562 | + set_args : IW_PRIV_TYPE_BYTE | 2, | ||
| 19563 | + get_args : 0, | ||
| 19564 | + name : "SetLEDPower" }, | ||
| 19565 | +{ cmd : ACX100_IOCTL_GET_PLED, | ||
| 19566 | + set_args : 0, | ||
| 19567 | + get_args : IW_PRIV_TYPE_BYTE | IW_PRIV_SIZE_FIXED | 2, | ||
| 19568 | + name : "GetLEDPower" }, | ||
| 19569 | +{ cmd : ACX100_IOCTL_SET_RATES, | ||
| 19570 | + set_args : IW_PRIV_TYPE_CHAR | 256, | ||
| 19571 | + get_args : 0, | ||
| 19572 | + name : "SetRates" }, | ||
| 19573 | +{ cmd : ACX100_IOCTL_LIST_DOM, | ||
| 19574 | + set_args : 0, | ||
| 19575 | + get_args : 0, | ||
| 19576 | + name : "ListRegDomain" }, | ||
| 19577 | +{ cmd : ACX100_IOCTL_SET_DOM, | ||
| 19578 | + set_args : IW_PRIV_TYPE_BYTE | IW_PRIV_SIZE_FIXED | 1, | ||
| 19579 | + get_args : 0, | ||
| 19580 | + name : "SetRegDomain" }, | ||
| 19581 | +{ cmd : ACX100_IOCTL_GET_DOM, | ||
| 19582 | + set_args : 0, | ||
| 19583 | + get_args : IW_PRIV_TYPE_BYTE | IW_PRIV_SIZE_FIXED | 1, | ||
| 19584 | + name : "GetRegDomain" }, | ||
| 19585 | +{ cmd : ACX100_IOCTL_SET_SCAN_PARAMS, | ||
| 19586 | + set_args : IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 4, | ||
| 19587 | + get_args : 0, | ||
| 19588 | + name : "SetScanParams" }, | ||
| 19589 | +{ cmd : ACX100_IOCTL_GET_SCAN_PARAMS, | ||
| 19590 | + set_args : 0, | ||
| 19591 | + get_args : IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 4, | ||
| 19592 | + name : "GetScanParams" }, | ||
| 19593 | +{ cmd : ACX100_IOCTL_SET_PREAMB, | ||
| 19594 | + set_args : IW_PRIV_TYPE_BYTE | IW_PRIV_SIZE_FIXED | 1, | ||
| 19595 | + get_args : 0, | ||
| 19596 | + name : "SetSPreamble" }, | ||
| 19597 | +{ cmd : ACX100_IOCTL_GET_PREAMB, | ||
| 19598 | + set_args : 0, | ||
| 19599 | + get_args : IW_PRIV_TYPE_BYTE | IW_PRIV_SIZE_FIXED | 1, | ||
| 19600 | + name : "GetSPreamble" }, | ||
| 19601 | +{ cmd : ACX100_IOCTL_SET_ANT, | ||
| 19602 | + set_args : IW_PRIV_TYPE_BYTE | IW_PRIV_SIZE_FIXED | 1, | ||
| 19603 | + get_args : 0, | ||
| 19604 | + name : "SetAntenna" }, | ||
| 19605 | +{ cmd : ACX100_IOCTL_GET_ANT, | ||
| 19606 | + set_args : 0, | ||
| 19607 | + get_args : 0, | ||
| 19608 | + name : "GetAntenna" }, | ||
| 19609 | +{ cmd : ACX100_IOCTL_RX_ANT, | ||
| 19610 | + set_args : IW_PRIV_TYPE_BYTE | IW_PRIV_SIZE_FIXED | 1, | ||
| 19611 | + get_args : 0, | ||
| 19612 | + name : "SetRxAnt" }, | ||
| 19613 | +{ cmd : ACX100_IOCTL_TX_ANT, | ||
| 19614 | + set_args : IW_PRIV_TYPE_BYTE | IW_PRIV_SIZE_FIXED | 1, | ||
| 19615 | + get_args : 0, | ||
| 19616 | + name : "SetTxAnt" }, | ||
| 19617 | +{ cmd : ACX100_IOCTL_SET_PHY_AMP_BIAS, | ||
| 19618 | + set_args : IW_PRIV_TYPE_BYTE | IW_PRIV_SIZE_FIXED | 1, | ||
| 19619 | + get_args : 0, | ||
| 19620 | + name : "SetPhyAmpBias"}, | ||
| 19621 | +{ cmd : ACX100_IOCTL_GET_PHY_CHAN_BUSY, | ||
| 19622 | + set_args : 0, | ||
| 19623 | + get_args : 0, | ||
| 19624 | + name : "GetPhyChanBusy" }, | ||
| 19625 | +{ cmd : ACX100_IOCTL_SET_ED, | ||
| 19626 | + set_args : IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, | ||
| 19627 | + get_args : 0, | ||
| 19628 | + name : "SetED" }, | ||
| 19629 | +{ cmd : ACX100_IOCTL_SET_CCA, | ||
| 19630 | + set_args : IW_PRIV_TYPE_BYTE | IW_PRIV_SIZE_FIXED | 1, | ||
| 19631 | + get_args : 0, | ||
| 19632 | + name : "SetCCA" }, | ||
| 19633 | +{ cmd : ACX100_IOCTL_MONITOR, | ||
| 19634 | + set_args : IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 2, | ||
| 19635 | + get_args : 0, | ||
| 19636 | + name : "monitor" }, | ||
| 19637 | +{ cmd : ACX100_IOCTL_TEST, | ||
| 19638 | + set_args : 0, | ||
| 19639 | + get_args : 0, | ||
| 19640 | + name : "Test" }, | ||
| 19641 | +{ cmd : ACX100_IOCTL_DBG_SET_MASKS, | ||
| 19642 | + set_args : IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 2, | ||
| 19643 | + get_args : 0, | ||
| 19644 | + name : "DbgSetMasks" }, | ||
| 19645 | +{ cmd : ACX111_IOCTL_INFO, | ||
| 19646 | + set_args : 0, | ||
| 19647 | + get_args : 0, | ||
| 19648 | + name : "GetAcx111Info" }, | ||
| 19649 | +{ cmd : ACX100_IOCTL_DBG_SET_IO, | ||
| 19650 | + set_args : IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 4, | ||
| 19651 | + get_args : 0, | ||
| 19652 | + name : "DbgSetIO" }, | ||
| 19653 | +{ cmd : ACX100_IOCTL_DBG_GET_IO, | ||
| 19654 | + set_args : IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 3, | ||
| 19655 | + get_args : 0, | ||
| 19656 | + name : "DbgGetIO" }, | ||
| 19657 | +}; | ||
| 19658 | + | ||
| 19659 | + | ||
| 19660 | +const struct iw_handler_def acx_ioctl_handler_def = | ||
| 19661 | +{ | ||
| 19662 | + .num_standard = VEC_SIZE(acx_ioctl_handler), | ||
| 19663 | + .num_private = VEC_SIZE(acx_ioctl_private_handler), | ||
| 19664 | + .num_private_args = VEC_SIZE(acx_ioctl_private_args), | ||
| 19665 | + .standard = (iw_handler *) acx_ioctl_handler, | ||
| 19666 | + .private = (iw_handler *) acx_ioctl_private_handler, | ||
| 19667 | + .private_args = (struct iw_priv_args *) acx_ioctl_private_args, | ||
| 19668 | +#if IW_HANDLER_VERSION > 5 | ||
| 19669 | + .get_wireless_stats = acx_e_get_wireless_stats | ||
| 19670 | +#endif /* IW > 5 */ | ||
| 19671 | +}; | ||
| 19672 | Index: linux-2.6.23/drivers/net/wireless/acx/Kconfig | ||
| 19673 | =================================================================== | ||
| 19674 | --- /dev/null 1970-01-01 00:00:00.000000000 +0000 | ||
| 19675 | +++ linux-2.6.23/drivers/net/wireless/acx/Kconfig 2008-01-20 21:13:40.000000000 +0000 | ||
| 19676 | @@ -0,0 +1,113 @@ | ||
| 19677 | +config ACX | ||
| 19678 | + tristate "TI acx100/acx111 802.11b/g wireless chipsets" | ||
| 19679 | + depends on NET_RADIO && EXPERIMENTAL | ||
| 19680 | + select FW_LOADER | ||
| 19681 | + ---help--- | ||
| 19682 | + A driver for 802.11b/g wireless cards based on | ||
| 19683 | + Texas Instruments acx100 and acx111 chipsets. | ||
| 19684 | + | ||
| 19685 | + This driver supports Host AP mode that allows | ||
| 19686 | + your computer to act as an IEEE 802.11 access point. | ||
| 19687 | + This driver is new and experimental. | ||
| 19688 | + | ||
| 19689 | + Texas Instruments did not take part in development of this driver | ||
| 19690 | + in any way, shape or form. | ||
| 19691 | + | ||
| 19692 | + The driver can be compiled as a module and will be named "acx". | ||
| 19693 | + | ||
| 19694 | +config ACX_PCI | ||
| 19695 | + bool "TI acx100/acx111 802.11b/g PCI" | ||
| 19696 | + depends on ACX && PCI | ||
| 19697 | + ---help--- | ||
| 19698 | + Include PCI and CardBus support in acx. | ||
| 19699 | + | ||
| 19700 | + acx chipsets need their firmware loaded at startup. | ||
| 19701 | + You will need to provide a firmware image via hotplug. | ||
| 19702 | + | ||
| 19703 | + Firmware may be in a form of single image 40-100kb in size | ||
| 19704 | + (a 'combined' firmware) or two images - main image | ||
| 19705 | + (again 40-100kb) and radio image (~10kb or less). | ||
| 19706 | + | ||
| 19707 | + Firmware images are requested from hotplug using following names: | ||
| 19708 | + | ||
| 19709 | + tiacx100 - main firmware image for acx100 chipset | ||
| 19710 | + tiacx100rNN - radio acx100 firmware for radio type NN | ||
| 19711 | + tiacx100cNN - combined acx100 firmware for radio type NN | ||
| 19712 | + tiacx111 - main acx111 firmware | ||
| 19713 | + tiacx111rNN - radio acx111 firmware for radio type NN | ||
| 19714 | + tiacx111cNN - combined acx111 firmware for radio type NN | ||
| 19715 | + | ||
| 19716 | + Driver will attempt to load combined image first. | ||
| 19717 | + If no such image is found, it will try to load main image | ||
| 19718 | + and radio image instead. | ||
| 19719 | + | ||
| 19720 | + Firmware files are not covered by GPL and are not distributed | ||
| 19721 | + with this driver for legal reasons. | ||
| 19722 | + | ||
| 19723 | +config ACX_USB | ||
| 19724 | + bool "TI acx100/acx111 802.11b/g USB" | ||
| 19725 | + depends on ACX && (USB=y || USB=ACX) | ||
| 19726 | + ---help--- | ||
| 19727 | + Include USB support in acx. | ||
| 19728 | + | ||
| 19729 | + There is only one currently known device in this category, | ||
| 19730 | + D-Link DWL-120+, but newer devices seem to be on the horizon. | ||
| 19731 | + | ||
| 19732 | + acx chipsets need their firmware loaded at startup. | ||
| 19733 | + You will need to provide a firmware image via hotplug. | ||
| 19734 | + | ||
| 19735 | + Firmware for USB device is requested from hotplug | ||
| 19736 | + by the 'tiacx100usb' name. | ||
| 19737 | + | ||
| 19738 | + Firmware files are not covered by GPL and are not distributed | ||
| 19739 | + with this driver for legal reasons. | ||
| 19740 | + | ||
| 19741 | +config ACX_MEM | ||
| 19742 | + bool "TI acx100/acx111 802.11b/g memory mapped slave 16 interface" | ||
| 19743 | + depends on ACX | ||
| 19744 | + ---help--- | ||
| 19745 | + acx chipsets need their firmware loaded at startup. | ||
| 19746 | + You will need to provide a firmware image via hotplug. | ||
| 19747 | + | ||
| 19748 | + Firmware for USB device is requested from hotplug | ||
| 19749 | + by the 'tiacx100usb' name. | ||
| 19750 | + | ||
| 19751 | + Firmware files are not covered by GPL and are not distributed | ||
| 19752 | + with this driver for legal reasons. | ||
| 19753 | + | ||
| 19754 | +config ACX_CS | ||
| 19755 | + bool "TI acx100/acx111 802.11b/g cardbus interface" | ||
| 19756 | + depends on ACX | ||
| 19757 | + ---help--- | ||
| 19758 | + acx chipsets need their firmware loaded at startup. | ||
| 19759 | + You will need to provide a firmware image via hotplug. | ||
| 19760 | + | ||
| 19761 | + This driver is based on memory mapped driver. | ||
| 19762 | + | ||
| 19763 | + Firmware files are not covered by GPL and are not distributed | ||
| 19764 | + with this driver for legal reasons. | ||
| 19765 | + | ||
| 19766 | +config ACX_HX4700 | ||
| 19767 | + tristate "ACX support for the iPAQ hx4700 using ACX_MEM" | ||
| 19768 | + depends on HX4700_CORE && ACX_MEM | ||
| 19769 | + ---help--- | ||
| 19770 | + Include memory interface support in acx for the iPAQ hx4700. | ||
| 19771 | + | ||
| 19772 | +config ACX_HTCUNIVERSAL | ||
| 19773 | + tristate "ACX support for the HTC Universal using ACX_MEM" | ||
| 19774 | + depends on HTCUNIVERSAL_CORE && HTC_ASIC3 && ACX_MEM | ||
| 19775 | + ---help--- | ||
| 19776 | + Include memory interface support in acx for the HTC Universal. | ||
| 19777 | + | ||
| 19778 | +config ACX_HTCSABLE | ||
| 19779 | + tristate "ACX support for the HTC Sable (IPAQ hw6915) using ACX_MEM" | ||
| 19780 | + depends on MACH_HW6900 && HTC_ASIC3 && ACX_MEM | ||
| 19781 | + ---help--- | ||
| 19782 | + Include memory interface support in acx for the HTC Sable (IPAQ hw6915). | ||
| 19783 | + | ||
| 19784 | +config ACX_RX3000 | ||
| 19785 | + tristate "ACX support for the iPAQ RX3000 using ACX_MEM" | ||
| 19786 | + depends on MACH_RX3715 && ACX_MEM && LEDS_ASIC3 | ||
| 19787 | + ---help--- | ||
| 19788 | + Include memory interface support in acx for the IPAQ RX3000. | ||
| 19789 | + | ||
| 19790 | Index: linux-2.6.23/drivers/net/wireless/acx/Makefile | ||
| 19791 | =================================================================== | ||
| 19792 | --- /dev/null 1970-01-01 00:00:00.000000000 +0000 | ||
| 19793 | +++ linux-2.6.23/drivers/net/wireless/acx/Makefile 2008-01-20 21:13:40.000000000 +0000 | ||
| 19794 | @@ -0,0 +1,21 @@ | ||
| 19795 | +#obj-m += acx.o | ||
| 19796 | + | ||
| 19797 | +#acx-obj-y += pci.o | ||
| 19798 | +#acx-obj-y += usb.o | ||
| 19799 | + | ||
| 19800 | +#acx-objs := wlan.o conv.o ioctl.o common.o $(acx-obj-y) | ||
| 19801 | + | ||
| 19802 | +# Use this if you have proper Kconfig integration: | ||
| 19803 | + | ||
| 19804 | +obj-$(CONFIG_ACX) += acx.o | ||
| 19805 | +obj-$(CONFIG_ACX_HX4700) += hx4700_acx.o | ||
| 19806 | +obj-$(CONFIG_ACX_HTCUNIVERSAL) += htcuniversal_acx.o | ||
| 19807 | +obj-$(CONFIG_ACX_HTCSABLE) += htcsable_acx.o | ||
| 19808 | +obj-$(CONFIG_ACX_RX3000) += rx3000_acx.o | ||
| 19809 | +# | ||
| 19810 | +acx-obj-$(CONFIG_ACX_PCI) += pci.o | ||
| 19811 | +acx-obj-$(CONFIG_ACX_USB) += usb.o | ||
| 19812 | +acx-obj-$(CONFIG_ACX_MEM) += mem.o | ||
| 19813 | +acx-obj-$(CONFIG_ACX_CS) += cs.o | ||
| 19814 | +# | ||
| 19815 | +acx-objs := wlan.o conv.o ioctl.o common.o $(acx-obj-y) | ||
| 19816 | Index: linux-2.6.23/drivers/net/wireless/acx/mem.c | ||
| 19817 | =================================================================== | ||
| 19818 | --- /dev/null 1970-01-01 00:00:00.000000000 +0000 | ||
| 19819 | +++ linux-2.6.23/drivers/net/wireless/acx/mem.c 2008-01-20 21:13:40.000000000 +0000 | ||
| 19820 | @@ -0,0 +1,5363 @@ | ||
| 19821 | +/*********************************************************************** | ||
| 19822 | +** Copyright (C) 2003 ACX100 Open Source Project | ||
| 19823 | +** | ||
| 19824 | +** The contents of this file are subject to the Mozilla Public | ||
| 19825 | +** License Version 1.1 (the "License"); you may not use this file | ||
| 19826 | +** except in compliance with the License. You may obtain a copy of | ||
| 19827 | +** the License at http://www.mozilla.org/MPL/ | ||
| 19828 | +** | ||
| 19829 | +** Software distributed under the License is distributed on an "AS | ||
| 19830 | +** IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or | ||
| 19831 | +** implied. See the License for the specific language governing | ||
| 19832 | +** rights and limitations under the License. | ||
| 19833 | +** | ||
| 19834 | +** Alternatively, the contents of this file may be used under the | ||
| 19835 | +** terms of the GNU Public License version 2 (the "GPL"), in which | ||
| 19836 | +** case the provisions of the GPL are applicable instead of the | ||
| 19837 | +** above. If you wish to allow the use of your version of this file | ||
| 19838 | +** only under the terms of the GPL and not to allow others to use | ||
| 19839 | +** your version of this file under the MPL, indicate your decision | ||
| 19840 | +** by deleting the provisions above and replace them with the notice | ||
| 19841 | +** and other provisions required by the GPL. If you do not delete | ||
| 19842 | +** the provisions above, a recipient may use your version of this | ||
| 19843 | +** file under either the MPL or the GPL. | ||
| 19844 | +** --------------------------------------------------------------------- | ||
| 19845 | +** Inquiries regarding the ACX100 Open Source Project can be | ||
| 19846 | +** made directly to: | ||
| 19847 | +** | ||
| 19848 | +** acx100-users@lists.sf.net | ||
| 19849 | +** http://acx100.sf.net | ||
| 19850 | +** --------------------------------------------------------------------- | ||
| 19851 | +** | ||
| 19852 | +** Slave memory interface support: | ||
| 19853 | +** | ||
| 19854 | +** Todd Blumer - SDG Systems | ||
| 19855 | +** Bill Reese - HP | ||
| 19856 | +** Eric McCorkle - Shadowsun | ||
| 19857 | +*/ | ||
| 19858 | +#define ACX_MEM 1 | ||
| 19859 | + | ||
| 19860 | +/* | ||
| 19861 | + * non-zero makes it dump the ACX memory to the console then | ||
| 19862 | + * panic when you cat /proc/driver/acx_wlan0_diag | ||
| 19863 | + */ | ||
| 19864 | +#define DUMP_MEM_DEFINED 1 | ||
| 19865 | + | ||
| 19866 | +#define DUMP_MEM_DURING_DIAG 0 | ||
| 19867 | +#define DUMP_IF_SLOW 0 | ||
| 19868 | + | ||
| 19869 | +#define PATCH_AROUND_BAD_SPOTS 1 | ||
| 19870 | +#define HX4700_FIRMWARE_CHECKSUM 0x0036862e | ||
| 19871 | +#define HX4700_ALTERNATE_FIRMWARE_CHECKSUM 0x00368a75 | ||
| 19872 | + | ||
| 19873 | +#include <linux/version.h> | ||
| 19874 | +#if LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 18) | ||
| 19875 | +#include <linux/config.h> | ||
| 19876 | +#endif | ||
| 19877 | + | ||
| 19878 | +/* Linux 2.6.18+ uses <linux/utsrelease.h> */ | ||
| 19879 | +#ifndef UTS_RELEASE | ||
| 19880 | +#include <linux/utsrelease.h> | ||
| 19881 | +#endif | ||
| 19882 | + | ||
| 19883 | +#include <linux/compiler.h> /* required for Lx 2.6.8 ?? */ | ||
| 19884 | +#include <linux/kernel.h> | ||
| 19885 | +#include <linux/module.h> | ||
| 19886 | +#include <linux/moduleparam.h> | ||
| 19887 | +#include <linux/sched.h> | ||
| 19888 | +#include <linux/types.h> | ||
| 19889 | +#include <linux/skbuff.h> | ||
| 19890 | +#include <linux/slab.h> | ||
| 19891 | +#include <linux/if_arp.h> | ||
| 19892 | +#include <linux/irq.h> | ||
| 19893 | +#include <linux/rtnetlink.h> | ||
| 19894 | +#include <linux/wireless.h> | ||
| 19895 | +#include <net/iw_handler.h> | ||
| 19896 | +#include <linux/netdevice.h> | ||
| 19897 | +#include <linux/ioport.h> | ||
| 19898 | +#include <linux/pci.h> | ||
| 19899 | +#include <linux/platform_device.h> | ||
| 19900 | +#include <linux/pm.h> | ||
| 19901 | +#include <linux/vmalloc.h> | ||
| 19902 | +#include <linux/delay.h> | ||
| 19903 | +#include <linux/workqueue.h> | ||
| 19904 | +#include <linux/inetdevice.h> | ||
| 19905 | + | ||
| 19906 | +#include "acx.h" | ||
| 19907 | +#include "acx_hw.h" | ||
| 19908 | + | ||
| 19909 | +/*********************************************************************** | ||
| 19910 | +*/ | ||
| 19911 | + | ||
| 19912 | +#define CARD_EEPROM_ID_SIZE 6 | ||
| 19913 | + | ||
| 19914 | +#include <asm/io.h> | ||
| 19915 | + | ||
| 19916 | +#define REG_ACX_VENDOR_ID 0x900 | ||
| 19917 | +/* | ||
| 19918 | + * This is the vendor id on the HX4700, anyway | ||
| 19919 | + */ | ||
| 19920 | +#define ACX_VENDOR_ID 0x8400104c | ||
| 19921 | + | ||
| 19922 | +typedef enum { | ||
| 19923 | + ACX_SOFT_RESET = 0, | ||
| 19924 | + | ||
| 19925 | + ACX_SLV_REG_ADDR, | ||
| 19926 | + ACX_SLV_REG_DATA, | ||
| 19927 | + ACX_SLV_REG_ADATA, | ||
| 19928 | + | ||
| 19929 | + ACX_SLV_MEM_CP, | ||
| 19930 | + ACX_SLV_MEM_ADDR, | ||
| 19931 | + ACX_SLV_MEM_DATA, | ||
| 19932 | + ACX_SLV_MEM_CTL, | ||
| 19933 | +} acxreg_t; | ||
| 19934 | + | ||
| 19935 | +/*********************************************************************** | ||
| 19936 | +*/ | ||
| 19937 | +static void acxmem_i_tx_timeout(struct net_device *ndev); | ||
| 19938 | +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 19) | ||
| 19939 | +static irqreturn_t acxmem_i_interrupt(int irq, void *dev_id); | ||
| 19940 | +#else | ||
| 19941 | +static irqreturn_t acxmem_i_interrupt(int irq, void *dev_id, struct pt_regs *regs); | ||
| 19942 | +#endif | ||
| 19943 | +static void acxmem_i_set_multicast_list(struct net_device *ndev); | ||
| 19944 | + | ||
| 19945 | +static int acxmem_e_open(struct net_device *ndev); | ||
| 19946 | +static int acxmem_e_close(struct net_device *ndev); | ||
| 19947 | +static void acxmem_s_up(struct net_device *ndev); | ||
| 19948 | +static void acxmem_s_down(struct net_device *ndev); | ||
| 19949 | + | ||
| 19950 | +static void dump_acxmem (acx_device_t *adev, u32 start, int length); | ||
| 19951 | +static int acxmem_complete_hw_reset (acx_device_t *adev); | ||
| 19952 | +static void acxmem_s_delete_dma_regions(acx_device_t *adev); | ||
| 19953 | + | ||
| 19954 | +static struct platform_device *resume_pdev; | ||
| 19955 | + | ||
| 19956 | +static int | ||
| 19957 | +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 11) | ||
| 19958 | +acxmem_e_suspend(struct platform_device *pdev, pm_message_t state); | ||
| 19959 | +#else | ||
| 19960 | +acxmem_e_suspend(struct device *pdev, u32 state); | ||
| 19961 | +#endif | ||
| 19962 | +static void | ||
| 19963 | +fw_resumer(struct work_struct *notused); | ||
| 19964 | +//fw_resumer( void *data ); | ||
| 19965 | + | ||
| 19966 | +static int acx_netdev_event(struct notifier_block *this, unsigned long event, void *ptr) | ||
| 19967 | +{ | ||
| 19968 | + struct net_device *ndev = ptr; | ||
| 19969 | + acx_device_t *adev = ndev2adev(ndev); | ||
| 19970 | + | ||
| 19971 | + /* | ||
| 19972 | + * Upper level ioctl() handlers send a NETDEV_CHANGEADDR if the MAC address changes. | ||
| 19973 | + */ | ||
| 19974 | + | ||
| 19975 | + if (NETDEV_CHANGEADDR == event) { | ||
| 19976 | + /* | ||
| 19977 | + * the upper layers put the new MAC address in ndev->dev_addr; we just copy | ||
| 19978 | + * it over and update the ACX with it. | ||
| 19979 | + */ | ||
| 19980 | + MAC_COPY(adev->dev_addr, adev->ndev->dev_addr); | ||
| 19981 | + adev->set_mask |= GETSET_STATION_ID; | ||
| 19982 | + acx_s_update_card_settings (adev); | ||
| 19983 | + } | ||
| 19984 | + | ||
| 19985 | + return 0; | ||
| 19986 | +} | ||
| 19987 | + | ||
| 19988 | +static struct notifier_block acx_netdev_notifier = { | ||
| 19989 | + .notifier_call = acx_netdev_event, | ||
| 19990 | +}; | ||
| 19991 | + | ||
| 19992 | +/*********************************************************************** | ||
| 19993 | +** Register access | ||
| 19994 | +*/ | ||
| 19995 | + | ||
| 19996 | +/* Pick one */ | ||
| 19997 | +/* #define INLINE_IO static */ | ||
| 19998 | +#define INLINE_IO static inline | ||
| 19999 | + | ||
| 20000 | +INLINE_IO u32 | ||
| 20001 | +read_id_register (acx_device_t *adev) | ||
| 20002 | +{ | ||
| 20003 | + writel (0x24, &adev->iobase[ACX_SLV_REG_ADDR]); | ||
| 20004 | + return readl (&adev->iobase[ACX_SLV_REG_DATA]); | ||
| 20005 | +} | ||
| 20006 | + | ||
| 20007 | +INLINE_IO u32 | ||
| 20008 | +read_reg32(acx_device_t *adev, unsigned int offset) | ||
| 20009 | +{ | ||
| 20010 | + u32 val; | ||
| 20011 | + u32 addr; | ||
| 20012 | + | ||
| 20013 | + if (offset > IO_ACX_ECPU_CTRL) | ||
| 20014 | + addr = offset; | ||
| 20015 | + else | ||
| 20016 | + addr = adev->io[offset]; | ||
| 20017 | + | ||
| 20018 | + if (addr < 0x20) { | ||
| 20019 | + return readl(((u8*)adev->iobase) + addr); | ||
| 20020 | + } | ||
| 20021 | + | ||
| 20022 | + writel( addr, &adev->iobase[ACX_SLV_REG_ADDR] ); | ||
| 20023 | + val = readl( &adev->iobase[ACX_SLV_REG_DATA] ); | ||
| 20024 | + | ||
| 20025 | + return val; | ||
| 20026 | +} | ||
| 20027 | + | ||
| 20028 | +INLINE_IO u16 | ||
| 20029 | +read_reg16(acx_device_t *adev, unsigned int offset) | ||
| 20030 | +{ | ||
| 20031 | + u16 lo; | ||
| 20032 | + u32 addr; | ||
| 20033 | + | ||
| 20034 | + if (offset > IO_ACX_ECPU_CTRL) | ||
| 20035 | + addr = offset; | ||
| 20036 | + else | ||
| 20037 | + addr = adev->io[offset]; | ||
| 20038 | + | ||
| 20039 | + if (addr < 0x20) { | ||
| 20040 | + return readw(((u8 *) adev->iobase) + addr); | ||
| 20041 | + } | ||
| 20042 | + | ||
| 20043 | + writel( addr, &adev->iobase[ACX_SLV_REG_ADDR] ); | ||
| 20044 | + lo = readw( (u16 *)&adev->iobase[ACX_SLV_REG_DATA] ); | ||
| 20045 | + | ||
| 20046 | + return lo; | ||
| 20047 | +} | ||
| 20048 | + | ||
| 20049 | +INLINE_IO u8 | ||
| 20050 | +read_reg8(acx_device_t *adev, unsigned int offset) | ||
| 20051 | +{ | ||
| 20052 | + u8 lo; | ||
| 20053 | + u32 addr; | ||
| 20054 | + | ||
| 20055 | + if (offset > IO_ACX_ECPU_CTRL) | ||
| 20056 | + addr = offset; | ||
| 20057 | + else | ||
| 20058 | + addr = adev->io[offset]; | ||
| 20059 | + | ||
| 20060 | + if (addr < 0x20) | ||
| 20061 | + return readb(((u8 *)adev->iobase) + addr); | ||
| 20062 | + | ||
| 20063 | + writel( addr, &adev->iobase[ACX_SLV_REG_ADDR] ); | ||
| 20064 | + lo = readw( (u8 *)&adev->iobase[ACX_SLV_REG_DATA] ); | ||
| 20065 | + | ||
| 20066 | + return (u8)lo; | ||
| 20067 | +} | ||
| 20068 | + | ||
| 20069 | +INLINE_IO void | ||
| 20070 | +write_reg32(acx_device_t *adev, unsigned int offset, u32 val) | ||
| 20071 | +{ | ||
| 20072 | + u32 addr; | ||
| 20073 | + | ||
| 20074 | + if (offset > IO_ACX_ECPU_CTRL) | ||
| 20075 | + addr = offset; | ||
| 20076 | + else | ||
| 20077 | + addr = adev->io[offset]; | ||
| 20078 | + | ||
| 20079 | + if (addr < 0x20) { | ||
| 20080 | + writel(val, ((u8*)adev->iobase) + addr); | ||
| 20081 | + return; | ||
| 20082 | + } | ||
| 20083 | + | ||
| 20084 | + writel( addr, &adev->iobase[ACX_SLV_REG_ADDR] ); | ||
| 20085 | + writel( val, &adev->iobase[ACX_SLV_REG_DATA] ); | ||
| 20086 | +} | ||
| 20087 | + | ||
| 20088 | +INLINE_IO void | ||
| 20089 | +write_reg16(acx_device_t *adev, unsigned int offset, u16 val) | ||
| 20090 | +{ | ||
| 20091 | + u32 addr; | ||
| 20092 | + | ||
| 20093 | + if (offset > IO_ACX_ECPU_CTRL) | ||
| 20094 | + addr = offset; | ||
| 20095 | + else | ||
| 20096 | + addr = adev->io[offset]; | ||
| 20097 | + | ||
| 20098 | + if (addr < 0x20) { | ||
| 20099 | + writew(val, ((u8 *)adev->iobase) + addr); | ||
| 20100 | + return; | ||
| 20101 | + } | ||
| 20102 | + writel( addr, &adev->iobase[ACX_SLV_REG_ADDR] ); | ||
| 20103 | + writew( val, (u16 *) &adev->iobase[ACX_SLV_REG_DATA] ); | ||
| 20104 | +} | ||
| 20105 | + | ||
| 20106 | +INLINE_IO void | ||
| 20107 | +write_reg8(acx_device_t *adev, unsigned int offset, u8 val) | ||
| 20108 | +{ | ||
| 20109 | + u32 addr; | ||
| 20110 | + | ||
| 20111 | + if (offset > IO_ACX_ECPU_CTRL) | ||
| 20112 | + addr = offset; | ||
| 20113 | + else | ||
| 20114 | + addr = adev->io[offset]; | ||
| 20115 | + | ||
| 20116 | + if (addr < 0x20) { | ||
| 20117 | + writeb(val, ((u8 *) adev->iobase) + addr); | ||
| 20118 | + return; | ||
| 20119 | + } | ||
| 20120 | + writel( addr, &adev->iobase[ACX_SLV_REG_ADDR] ); | ||
| 20121 | + writeb( val, (u8 *)&adev->iobase[ACX_SLV_REG_DATA] ); | ||
| 20122 | +} | ||
| 20123 | + | ||
| 20124 | +/* Handle PCI posting properly: | ||
| 20125 | + * Make sure that writes reach the adapter in case they require to be executed | ||
| 20126 | + * *before* the next write, by reading a random (and safely accessible) register. | ||
| 20127 | + * This call has to be made if there is no read following (which would flush the data | ||
| 20128 | + * to the adapter), yet the written data has to reach the adapter immediately. */ | ||
| 20129 | +INLINE_IO void | ||
| 20130 | +write_flush(acx_device_t *adev) | ||
| 20131 | +{ | ||
| 20132 | + /* readb(adev->iobase + adev->io[IO_ACX_INFO_MAILBOX_OFFS]); */ | ||
| 20133 | + /* faster version (accesses the first register, IO_ACX_SOFT_RESET, | ||
| 20134 | + * which should also be safe): */ | ||
| 20135 | + (void) readl(adev->iobase); | ||
| 20136 | +} | ||
| 20137 | + | ||
| 20138 | +INLINE_IO void | ||
| 20139 | +set_regbits (acx_device_t *adev, unsigned int offset, u32 bits) { | ||
| 20140 | + u32 tmp; | ||
| 20141 | + | ||
| 20142 | + tmp = read_reg32 (adev, offset); | ||
| 20143 | + tmp = tmp | bits; | ||
| 20144 | + write_reg32 (adev, offset, tmp); | ||
| 20145 | + write_flush (adev); | ||
| 20146 | +} | ||
| 20147 | + | ||
| 20148 | +INLINE_IO void | ||
| 20149 | +clear_regbits (acx_device_t *adev, unsigned int offset, u32 bits) { | ||
| 20150 | + u32 tmp; | ||
| 20151 | + | ||
| 20152 | + tmp = read_reg32 (adev, offset); | ||
| 20153 | + tmp = tmp & ~bits; | ||
| 20154 | + write_reg32 (adev, offset, tmp); | ||
| 20155 | + write_flush (adev); | ||
| 20156 | +} | ||
| 20157 | + | ||
| 20158 | +/* | ||
| 20159 | + * Copy from PXA memory to the ACX memory. This assumes both the PXA and ACX | ||
| 20160 | + * addresses are 32 bit aligned. Count is in bytes. | ||
| 20161 | + */ | ||
| 20162 | +INLINE_IO void | ||
| 20163 | +write_slavemem32 (acx_device_t *adev, u32 slave_address, u32 val) | ||
| 20164 | +{ | ||
| 20165 | + write_reg32 (adev, IO_ACX_SLV_MEM_CTL, 0x0); | ||
| 20166 | + write_reg32 (adev, IO_ACX_SLV_MEM_ADDR, slave_address); | ||
| 20167 | + udelay (10); | ||
| 20168 | + write_reg32 (adev, IO_ACX_SLV_MEM_DATA, val); | ||
| 20169 | +} | ||
| 20170 | + | ||
| 20171 | +INLINE_IO u32 | ||
| 20172 | +read_slavemem32 (acx_device_t *adev, u32 slave_address) | ||
| 20173 | +{ | ||
| 20174 | + u32 val; | ||
| 20175 | + | ||
| 20176 | + write_reg32 (adev, IO_ACX_SLV_MEM_CTL, 0x0); | ||
| 20177 | + write_reg32 (adev, IO_ACX_SLV_MEM_ADDR, slave_address); | ||
| 20178 | + udelay (10); | ||
| 20179 | + val = read_reg32 (adev, IO_ACX_SLV_MEM_DATA); | ||
| 20180 | + | ||
| 20181 | + return val; | ||
| 20182 | +} | ||
| 20183 | + | ||
| 20184 | +INLINE_IO void | ||
| 20185 | +write_slavemem8 (acx_device_t *adev, u32 slave_address, u8 val) | ||
| 20186 | +{ | ||
| 20187 | + u32 data; | ||
| 20188 | + u32 base; | ||
| 20189 | + int offset; | ||
| 20190 | + | ||
| 20191 | + /* | ||
| 20192 | + * Get the word containing the target address and the byte offset in that word. | ||
| 20193 | + */ | ||
| 20194 | + base = slave_address & ~3; | ||
| 20195 | + offset = (slave_address & 3) * 8; | ||
| 20196 | + | ||
| 20197 | + data = read_slavemem32 (adev, base); | ||
| 20198 | + data &= ~(0xff << offset); | ||
| 20199 | + data |= val << offset; | ||
| 20200 | + write_slavemem32 (adev, base, data); | ||
| 20201 | +} | ||
| 20202 | + | ||
| 20203 | +INLINE_IO u8 | ||
| 20204 | +read_slavemem8 (acx_device_t *adev, u32 slave_address) | ||
| 20205 | +{ | ||
| 20206 | + u8 val; | ||
| 20207 | + u32 base; | ||
| 20208 | + u32 data; | ||
| 20209 | + int offset; | ||
| 20210 | + | ||
| 20211 | + base = slave_address & ~3; | ||
| 20212 | + offset = (slave_address & 3) * 8; | ||
| 20213 | + | ||
| 20214 | + data = read_slavemem32 (adev, base); | ||
| 20215 | + | ||
| 20216 | + val = (data >> offset) & 0xff; | ||
| 20217 | + | ||
| 20218 | + return val; | ||
| 20219 | +} | ||
| 20220 | + | ||
| 20221 | +/* | ||
| 20222 | + * doesn't split across word boundaries | ||
| 20223 | + */ | ||
| 20224 | +INLINE_IO void | ||
| 20225 | +write_slavemem16 (acx_device_t *adev, u32 slave_address, u16 val) | ||
| 20226 | +{ | ||
| 20227 | + u32 data; | ||
| 20228 | + u32 base; | ||
| 20229 | + int offset; | ||
| 20230 | + | ||
| 20231 | + /* | ||
| 20232 | + * Get the word containing the target address and the byte offset in that word. | ||
| 20233 | + */ | ||
| 20234 | + base = slave_address & ~3; | ||
| 20235 | + offset = (slave_address & 3) * 8; | ||
| 20236 | + | ||
| 20237 | + data = read_slavemem32 (adev, base); | ||
| 20238 | + data &= ~(0xffff << offset); | ||
| 20239 | + data |= val << offset; | ||
| 20240 | + write_slavemem32 (adev, base, data); | ||
| 20241 | +} | ||
| 20242 | + | ||
| 20243 | +/* | ||
| 20244 | + * doesn't split across word boundaries | ||
| 20245 | + */ | ||
| 20246 | +INLINE_IO u16 | ||
| 20247 | +read_slavemem16 (acx_device_t *adev, u32 slave_address) | ||
| 20248 | +{ | ||
| 20249 | + u16 val; | ||
| 20250 | + u32 base; | ||
| 20251 | + u32 data; | ||
| 20252 | + int offset; | ||
| 20253 | + | ||
| 20254 | + base = slave_address & ~3; | ||
| 20255 | + offset = (slave_address & 3) * 8; | ||
| 20256 | + | ||
| 20257 | + data = read_slavemem32 (adev, base); | ||
| 20258 | + | ||
| 20259 | + val = (data >> offset) & 0xffff; | ||
| 20260 | + | ||
| 20261 | + return val; | ||
| 20262 | +} | ||
| 20263 | + | ||
| 20264 | +/* | ||
| 20265 | + * Copy from slave memory | ||
| 20266 | + * | ||
| 20267 | + * TODO - rewrite using address autoincrement, handle partial words | ||
| 20268 | + */ | ||
| 20269 | +void | ||
| 20270 | +copy_from_slavemem (acx_device_t *adev, u8 *destination, u32 source, int count) { | ||
| 20271 | + u32 tmp = 0; | ||
| 20272 | + u8 *ptmp = (u8 *) &tmp; | ||
| 20273 | + | ||
| 20274 | + /* | ||
| 20275 | + * Right now I'm making the assumption that the destination is aligned, but | ||
| 20276 | + * I'd better check. | ||
| 20277 | + */ | ||
| 20278 | + if ((u32) destination & 3) { | ||
| 20279 | + printk ("acx copy_from_slavemem: warning! destination not word-aligned!\n"); | ||
| 20280 | + } | ||
| 20281 | + | ||
| 20282 | + while (count >= 4) { | ||
| 20283 | + write_reg32 (adev, IO_ACX_SLV_MEM_ADDR, source); | ||
| 20284 | + udelay (10); | ||
| 20285 | + *((u32 *) destination) = read_reg32 (adev, IO_ACX_SLV_MEM_DATA); | ||
| 20286 | + count -= 4; | ||
| 20287 | + source += 4; | ||
| 20288 | + destination += 4; | ||
| 20289 | + } | ||
| 20290 | + | ||
| 20291 | + /* | ||
| 20292 | + * If the word reads above didn't satisfy the count, read one more word | ||
| 20293 | + * and transfer a byte at a time until the request is satisfied. | ||
| 20294 | + */ | ||
| 20295 | + if (count) { | ||
| 20296 | + write_reg32 (adev, IO_ACX_SLV_MEM_ADDR, source); | ||
| 20297 | + udelay (10); | ||
| 20298 | + tmp = read_reg32 (adev, IO_ACX_SLV_MEM_DATA); | ||
| 20299 | + while (count--) { | ||
| 20300 | + *destination++ = *ptmp++; | ||
| 20301 | + } | ||
| 20302 | + } | ||
| 20303 | +} | ||
| 20304 | + | ||
| 20305 | +/* | ||
| 20306 | + * Copy to slave memory | ||
| 20307 | + * | ||
| 20308 | + * TODO - rewrite using autoincrement, handle partial words | ||
| 20309 | + */ | ||
| 20310 | +void | ||
| 20311 | +copy_to_slavemem (acx_device_t *adev, u32 destination, u8 *source, int count) | ||
| 20312 | +{ | ||
| 20313 | + u32 tmp = 0; | ||
| 20314 | + u8* ptmp = (u8 *) &tmp; | ||
| 20315 | + static u8 src[512]; /* make static to avoid huge stack objects */ | ||
| 20316 | + | ||
| 20317 | + /* | ||
| 20318 | + * For now, make sure the source is word-aligned by copying it to a word-aligned | ||
| 20319 | + * buffer. Someday rewrite to avoid the extra copy. | ||
| 20320 | + */ | ||
| 20321 | + if (count > sizeof (src)) { | ||
| 20322 | + printk ("acx copy_to_slavemem: Warning! buffer overflow!\n"); | ||
| 20323 | + count = sizeof (src); | ||
| 20324 | + } | ||
| 20325 | + memcpy (src, source, count); | ||
| 20326 | + source = src; | ||
| 20327 | + | ||
| 20328 | + while (count >= 4) { | ||
| 20329 | + write_reg32 (adev, IO_ACX_SLV_MEM_ADDR, destination); | ||
| 20330 | + udelay (10); | ||
| 20331 | + write_reg32 (adev, IO_ACX_SLV_MEM_DATA, *((u32 *) source)); | ||
| 20332 | + count -= 4; | ||
| 20333 | + source += 4; | ||
| 20334 | + destination += 4; | ||
| 20335 | + } | ||
| 20336 | + | ||
| 20337 | + /* | ||
| 20338 | + * If there are leftovers read the next word from the acx and merge in | ||
| 20339 | + * what they want to write. | ||
| 20340 | + */ | ||
| 20341 | + if (count) { | ||
| 20342 | + write_reg32 (adev, IO_ACX_SLV_MEM_ADDR, destination); | ||
| 20343 | + udelay (10); | ||
| 20344 | + tmp = read_reg32 (adev, IO_ACX_SLV_MEM_DATA); | ||
| 20345 | + while (count--) { | ||
| 20346 | + *ptmp++ = *source++; | ||
| 20347 | + } | ||
| 20348 | + /* | ||
| 20349 | + * reset address in case we're currently in auto-increment mode | ||
| 20350 | + */ | ||
| 20351 | + write_reg32 (adev, IO_ACX_SLV_MEM_ADDR, destination); | ||
| 20352 | + udelay (10); | ||
| 20353 | + write_reg32 (adev, IO_ACX_SLV_MEM_DATA, tmp); | ||
| 20354 | + udelay (10); | ||
| 20355 | + } | ||
| 20356 | + | ||
| 20357 | +} | ||
| 20358 | + | ||
| 20359 | +/* | ||
| 20360 | + * Block copy to slave buffers using memory block chain mode. Copies to the ACX | ||
| 20361 | + * transmit buffer structure with minimal intervention on our part. | ||
| 20362 | + * Interrupts should be disabled when calling this. | ||
| 20363 | + */ | ||
| 20364 | +void | ||
| 20365 | +chaincopy_to_slavemem (acx_device_t *adev, u32 destination, u8 *source, int count) | ||
| 20366 | +{ | ||
| 20367 | + u32 val; | ||
| 20368 | + u32 *data = (u32 *) source; | ||
| 20369 | + static u8 aligned_source[WLAN_A4FR_MAXLEN_WEP_FCS]; | ||
| 20370 | + | ||
| 20371 | + /* | ||
| 20372 | + * Warn if the pointers don't look right. Destination must fit in [23:5] with | ||
| 20373 | + * zero elsewhere and source should be 32 bit aligned. | ||
| 20374 | + * This should never happen since we're in control of both, but I want to know about | ||
| 20375 | + * it if it does. | ||
| 20376 | + */ | ||
| 20377 | + if ((destination & 0x00ffffe0) != destination) { | ||
| 20378 | + printk ("acx chaincopy: destination block 0x%04x not aligned!\n", destination); | ||
| 20379 | + } | ||
| 20380 | + if (count > sizeof aligned_source) { | ||
| 20381 | + printk( KERN_ERR "chaincopy_to_slavemem overflow!\n" ); | ||
| 20382 | + count = sizeof aligned_source; | ||
| 20383 | + } | ||
| 20384 | + if ((u32) source & 3) { | ||
| 20385 | + memcpy (aligned_source, source, count); | ||
| 20386 | + data = (u32 *) aligned_source; | ||
| 20387 | + } | ||
| 20388 | + | ||
| 20389 | + /* | ||
| 20390 | + * SLV_MEM_CTL[17:16] = memory block chain mode with auto-increment | ||
| 20391 | + * SLV_MEM_CTL[5:2] = offset to data portion = 1 word | ||
| 20392 | + */ | ||
| 20393 | + val = 2 << 16 | 1 << 2; | ||
| 20394 | + writel (val, &adev->iobase[ACX_SLV_MEM_CTL]); | ||
| 20395 | + | ||
| 20396 | + /* | ||
| 20397 | + * SLV_MEM_CP[23:5] = start of 1st block | ||
| 20398 | + * SLV_MEM_CP[3:2] = offset to memblkptr = 0 | ||
| 20399 | + */ | ||
| 20400 | + val = destination & 0x00ffffe0; | ||
| 20401 | + writel (val, &adev->iobase[ACX_SLV_MEM_CP]); | ||
| 20402 | + | ||
| 20403 | + /* | ||
| 20404 | + * SLV_MEM_ADDR[23:2] = SLV_MEM_CTL[5:2] + SLV_MEM_CP[23:5] | ||
| 20405 | + */ | ||
| 20406 | + val = (destination & 0x00ffffe0) + (1<<2); | ||
| 20407 | + writel (val, &adev->iobase[ACX_SLV_MEM_ADDR]); | ||
| 20408 | + | ||
| 20409 | + /* | ||
| 20410 | + * Write the data to the slave data register, rounding up to the end | ||
| 20411 | + * of the word containing the last byte (hence the > 0) | ||
| 20412 | + */ | ||
| 20413 | + while (count > 0) { | ||
| 20414 | + writel (*data++, &adev->iobase[ACX_SLV_MEM_DATA]); | ||
| 20415 | + count -= 4; | ||
| 20416 | + } | ||
| 20417 | +} | ||
| 20418 | + | ||
| 20419 | + | ||
| 20420 | +/* | ||
| 20421 | + * Block copy from slave buffers using memory block chain mode. Copies from the ACX | ||
| 20422 | + * receive buffer structures with minimal intervention on our part. | ||
| 20423 | + * Interrupts should be disabled when calling this. | ||
| 20424 | + */ | ||
| 20425 | +void | ||
| 20426 | +chaincopy_from_slavemem (acx_device_t *adev, u8 *destination, u32 source, int count) | ||
| 20427 | +{ | ||
| 20428 | + u32 val; | ||
| 20429 | + u32 *data = (u32 *) destination; | ||
| 20430 | + static u8 aligned_destination[WLAN_A4FR_MAXLEN_WEP_FCS]; | ||
| 20431 | + int saved_count = count; | ||
| 20432 | + | ||
| 20433 | + /* | ||
| 20434 | + * Warn if the pointers don't look right. Destination must fit in [23:5] with | ||
| 20435 | + * zero elsewhere and source should be 32 bit aligned. | ||
| 20436 | + * Turns out the network stack sends unaligned things, so fix them before | ||
| 20437 | + * copying to the ACX. | ||
| 20438 | + */ | ||
| 20439 | + if ((source & 0x00ffffe0) != source) { | ||
| 20440 | + printk ("acx chaincopy: source block 0x%04x not aligned!\n", source); | ||
| 20441 | + dump_acxmem (adev, 0, 0x10000); | ||
| 20442 | + } | ||
| 20443 | + if ((u32) destination & 3) { | ||
| 20444 | + //printk ("acx chaincopy: data destination not word aligned!\n"); | ||
| 20445 | + data = (u32 *) aligned_destination; | ||
| 20446 | + if (count > sizeof aligned_destination) { | ||
| 20447 | + printk( KERN_ERR "chaincopy_from_slavemem overflow!\n" ); | ||
| 20448 | + count = sizeof aligned_destination; | ||
| 20449 | + } | ||
| 20450 | + } | ||
| 20451 | + | ||
| 20452 | + /* | ||
| 20453 | + * SLV_MEM_CTL[17:16] = memory block chain mode with auto-increment | ||
| 20454 | + * SLV_MEM_CTL[5:2] = offset to data portion = 1 word | ||
| 20455 | + */ | ||
| 20456 | + val = (2 << 16) | (1 << 2); | ||
| 20457 | + writel (val, &adev->iobase[ACX_SLV_MEM_CTL]); | ||
| 20458 | + | ||
| 20459 | + /* | ||
| 20460 | + * SLV_MEM_CP[23:5] = start of 1st block | ||
| 20461 | + * SLV_MEM_CP[3:2] = offset to memblkptr = 0 | ||
| 20462 | + */ | ||
| 20463 | + val = source & 0x00ffffe0; | ||
| 20464 | + writel (val, &adev->iobase[ACX_SLV_MEM_CP]); | ||
| 20465 | + | ||
| 20466 | + /* | ||
| 20467 | + * SLV_MEM_ADDR[23:2] = SLV_MEM_CTL[5:2] + SLV_MEM_CP[23:5] | ||
| 20468 | + */ | ||
| 20469 | + val = (source & 0x00ffffe0) + (1<<2); | ||
| 20470 | + writel (val, &adev->iobase[ACX_SLV_MEM_ADDR]); | ||
| 20471 | + | ||
| 20472 | + /* | ||
| 20473 | + * Read the data from the slave data register, rounding up to the end | ||
| 20474 | + * of the word containing the last byte (hence the > 0) | ||
| 20475 | + */ | ||
| 20476 | + while (count > 0) { | ||
| 20477 | + *data++ = readl (&adev->iobase[ACX_SLV_MEM_DATA]); | ||
| 20478 | + count -= 4; | ||
| 20479 | + } | ||
| 20480 | + | ||
| 20481 | + /* | ||
| 20482 | + * If the destination wasn't aligned, we would have saved it in | ||
| 20483 | + * the aligned buffer, so copy it where it should go. | ||
| 20484 | + */ | ||
| 20485 | + if ((u32) destination & 3) { | ||
| 20486 | + memcpy (destination, aligned_destination, saved_count); | ||
| 20487 | + } | ||
| 20488 | +} | ||
| 20489 | + | ||
| 20490 | +char | ||
| 20491 | +printable (char c) | ||
| 20492 | +{ | ||
| 20493 | + return ((c >= 20) && (c < 127)) ? c : '.'; | ||
| 20494 | +} | ||
| 20495 | + | ||
| 20496 | +#if DUMP_MEM_DEFINED > 0 | ||
| 20497 | +static void | ||
| 20498 | +dump_acxmem (acx_device_t *adev, u32 start, int length) | ||
| 20499 | +{ | ||
| 20500 | + int i; | ||
| 20501 | + u8 buf[16]; | ||
| 20502 | + | ||
| 20503 | + while (length > 0) { | ||
| 20504 | + printk ("%04x ", start); | ||
| 20505 | + copy_from_slavemem (adev, buf, start, 16); | ||
| 20506 | + for (i = 0; (i < 16) && (i < length); i++) { | ||
| 20507 | + printk ("%02x ", buf[i]); | ||
| 20508 | + } | ||
| 20509 | + for (i = 0; (i < 16) && (i < length); i++) { | ||
| 20510 | + printk ("%c", printable (buf[i])); | ||
| 20511 | + } | ||
| 20512 | + printk ("\n"); | ||
| 20513 | + start += 16; | ||
| 20514 | + length -= 16; | ||
| 20515 | + } | ||
| 20516 | +} | ||
| 20517 | +#endif | ||
| 20518 | + | ||
| 20519 | +static void | ||
| 20520 | +enable_acx_irq(acx_device_t *adev); | ||
| 20521 | +static void | ||
| 20522 | +disable_acx_irq(acx_device_t *adev); | ||
| 20523 | + | ||
| 20524 | +/* | ||
| 20525 | + * Return an acx pointer to the next transmit data block. | ||
| 20526 | + */ | ||
| 20527 | +u32 | ||
| 20528 | +allocate_acx_txbuf_space (acx_device_t *adev, int count) { | ||
| 20529 | + u32 block, next, last_block; | ||
| 20530 | + int blocks_needed; | ||
| 20531 | + unsigned long flags; | ||
| 20532 | + | ||
| 20533 | + spin_lock_irqsave(&adev->txbuf_lock, flags); | ||
| 20534 | + /* | ||
| 20535 | + * Take 4 off the memory block size to account for the reserved word at the start of | ||
| 20536 | + * the block. | ||
| 20537 | + */ | ||
| 20538 | + blocks_needed = count / (adev->memblocksize - 4); | ||
| 20539 | + if (count % (adev->memblocksize - 4)) | ||
| 20540 | + blocks_needed++; | ||
| 20541 | + | ||
| 20542 | + if (blocks_needed <= adev->acx_txbuf_blocks_free) { | ||
| 20543 | + /* | ||
| 20544 | + * Take blocks at the head of the free list. | ||
| 20545 | + */ | ||
| 20546 | + last_block = block = adev->acx_txbuf_free; | ||
| 20547 | + | ||
| 20548 | + /* | ||
| 20549 | + * Follow block pointers through the requested number of blocks both to | ||
| 20550 | + * find the new head of the free list and to set the flags for the blocks | ||
| 20551 | + * appropriately. | ||
| 20552 | + */ | ||
| 20553 | + while (blocks_needed--) { | ||
| 20554 | + /* | ||
| 20555 | + * Keep track of the last block of the allocation | ||
| 20556 | + */ | ||
| 20557 | + last_block = adev->acx_txbuf_free; | ||
| 20558 | + | ||
| 20559 | + /* | ||
| 20560 | + * Make sure the end control flag is not set. | ||
| 20561 | + */ | ||
| 20562 | + next = read_slavemem32 (adev, adev->acx_txbuf_free) & 0x7ffff; | ||
| 20563 | + write_slavemem32 (adev, adev->acx_txbuf_free, next); | ||
| 20564 | + | ||
| 20565 | + /* | ||
| 20566 | + * Update the new head of the free list | ||
| 20567 | + */ | ||
| 20568 | + adev->acx_txbuf_free = next << 5; | ||
| 20569 | + adev->acx_txbuf_blocks_free--; | ||
| 20570 | + | ||
| 20571 | + } | ||
| 20572 | + | ||
| 20573 | + /* | ||
| 20574 | + * Flag the last block both by clearing out the next pointer | ||
| 20575 | + * and marking the control field. | ||
| 20576 | + */ | ||
| 20577 | + write_slavemem32 (adev, last_block, 0x02000000); | ||
| 20578 | + | ||
| 20579 | + /* | ||
| 20580 | + * If we're out of buffers make sure the free list pointer is NULL | ||
| 20581 | + */ | ||
| 20582 | + if (!adev->acx_txbuf_blocks_free) { | ||
| 20583 | + adev->acx_txbuf_free = 0; | ||
| 20584 | + } | ||
| 20585 | + } | ||
| 20586 | + else { | ||
| 20587 | + block = 0; | ||
| 20588 | + } | ||
| 20589 | + spin_unlock_irqrestore (&adev->txbuf_lock, flags); | ||
| 20590 | + return block; | ||
| 20591 | +} | ||
| 20592 | + | ||
| 20593 | +/* | ||
| 20594 | + * Return buffer space back to the pool by following the next pointers until we find | ||
| 20595 | + * the block marked as the end. Point the last block to the head of the free list, | ||
| 20596 | + * then update the head of the free list to point to the newly freed memory. | ||
| 20597 | + * This routine gets called in interrupt context, so it shouldn't block to protect | ||
| 20598 | + * the integrity of the linked list. The ISR already holds the lock. | ||
| 20599 | + */ | ||
| 20600 | +void | ||
| 20601 | +reclaim_acx_txbuf_space (acx_device_t *adev, u32 blockptr) { | ||
| 20602 | + u32 cur, last, next; | ||
| 20603 | + unsigned long flags; | ||
| 20604 | + | ||
| 20605 | + spin_lock_irqsave (&adev->txbuf_lock, flags); | ||
| 20606 | + if ((blockptr >= adev->acx_txbuf_start) && | ||
| 20607 | + (blockptr <= adev->acx_txbuf_start + | ||
| 20608 | + (adev->acx_txbuf_numblocks - 1) * adev->memblocksize)) { | ||
| 20609 | + cur = blockptr; | ||
| 20610 | + do { | ||
| 20611 | + last = cur; | ||
| 20612 | + next = read_slavemem32 (adev, cur); | ||
| 20613 | + | ||
| 20614 | + /* | ||
| 20615 | + * Advance to the next block in this allocation | ||
| 20616 | + */ | ||
| 20617 | + cur = (next & 0x7ffff) << 5; | ||
| 20618 | + | ||
| 20619 | + /* | ||
| 20620 | + * This block now counts as free. | ||
| 20621 | + */ | ||
| 20622 | + adev->acx_txbuf_blocks_free++; | ||
| 20623 | + } while (!(next & 0x02000000)); | ||
| 20624 | + | ||
| 20625 | + /* | ||
| 20626 | + * last now points to the last block of that allocation. Update the pointer | ||
| 20627 | + * in that block to point to the free list and reset the free list to the | ||
| 20628 | + * first block of the free call. If there were no free blocks, make sure | ||
| 20629 | + * the new end of the list marks itself as truly the end. | ||
| 20630 | + */ | ||
| 20631 | + if (adev->acx_txbuf_free) { | ||
| 20632 | + write_slavemem32 (adev, last, adev->acx_txbuf_free >> 5); | ||
| 20633 | + } | ||
| 20634 | + else { | ||
| 20635 | + write_slavemem32 (adev, last, 0x02000000); | ||
| 20636 | + } | ||
| 20637 | + adev->acx_txbuf_free = blockptr; | ||
| 20638 | + } | ||
| 20639 | + spin_unlock_irqrestore(&adev->txbuf_lock, flags); | ||
| 20640 | +} | ||
| 20641 | + | ||
| 20642 | +/* | ||
| 20643 | + * Initialize the pieces managing the transmit buffer pool on the ACX. The transmit | ||
| 20644 | + * buffer is a circular queue with one 32 bit word reserved at the beginning of each | ||
| 20645 | + * block. The upper 13 bits are a control field, of which only 0x02000000 has any | ||
| 20646 | + * meaning. The lower 19 bits are the address of the next block divided by 32. | ||
| 20647 | + */ | ||
| 20648 | +void | ||
| 20649 | +init_acx_txbuf (acx_device_t *adev) { | ||
| 20650 | + | ||
| 20651 | + /* | ||
| 20652 | + * acx100_s_init_memory_pools set up txbuf_start and txbuf_numblocks for us. | ||
| 20653 | + * All we need to do is reset the rest of the bookeeping. | ||
| 20654 | + */ | ||
| 20655 | + | ||
| 20656 | + adev->acx_txbuf_free = adev->acx_txbuf_start; | ||
| 20657 | + adev->acx_txbuf_blocks_free = adev->acx_txbuf_numblocks; | ||
| 20658 | + | ||
| 20659 | + /* | ||
| 20660 | + * Initialization leaves the last transmit pool block without a pointer back to | ||
| 20661 | + * the head of the list, but marked as the end of the list. That's how we want | ||
| 20662 | + * to see it, too, so leave it alone. This is only ever called after a firmware | ||
| 20663 | + * reset, so the ACX memory is in the state we want. | ||
| 20664 | + */ | ||
| 20665 | + | ||
| 20666 | +} | ||
| 20667 | + | ||
| 20668 | +INLINE_IO int | ||
| 20669 | +adev_present(acx_device_t *adev) | ||
| 20670 | +{ | ||
| 20671 | + /* fast version (accesses the first register, IO_ACX_SOFT_RESET, | ||
| 20672 | + * which should be safe): */ | ||
| 20673 | + return readl(adev->iobase) != 0xffffffff; | ||
| 20674 | +} | ||
| 20675 | + | ||
| 20676 | +/*********************************************************************** | ||
| 20677 | +*/ | ||
| 20678 | +static inline txdesc_t* | ||
| 20679 | +get_txdesc(acx_device_t *adev, int index) | ||
| 20680 | +{ | ||
| 20681 | + return (txdesc_t*) (((u8*)adev->txdesc_start) + index * adev->txdesc_size); | ||
| 20682 | +} | ||
| 20683 | + | ||
| 20684 | +static inline txdesc_t* | ||
| 20685 | +advance_txdesc(acx_device_t *adev, txdesc_t* txdesc, int inc) | ||
| 20686 | +{ | ||
| 20687 | + return (txdesc_t*) (((u8*)txdesc) + inc * adev->txdesc_size); | ||
| 20688 | +} | ||
| 20689 | + | ||
| 20690 | +static txhostdesc_t* | ||
| 20691 | +get_txhostdesc(acx_device_t *adev, txdesc_t* txdesc) | ||
| 20692 | +{ | ||
| 20693 | + int index = (u8*)txdesc - (u8*)adev->txdesc_start; | ||
| 20694 | + if (unlikely(ACX_DEBUG && (index % adev->txdesc_size))) { | ||
| 20695 | + printk("bad txdesc ptr %p\n", txdesc); | ||
| 20696 | + return NULL; | ||
| 20697 | + } | ||
| 20698 | + index /= adev->txdesc_size; | ||
| 20699 | + if (unlikely(ACX_DEBUG && (index >= TX_CNT))) { | ||
| 20700 | + printk("bad txdesc ptr %p\n", txdesc); | ||
| 20701 | + return NULL; | ||
| 20702 | + } | ||
| 20703 | + return &adev->txhostdesc_start[index*2]; | ||
| 20704 | +} | ||
| 20705 | + | ||
| 20706 | +static inline client_t* | ||
| 20707 | +get_txc(acx_device_t *adev, txdesc_t* txdesc) | ||
| 20708 | +{ | ||
| 20709 | + int index = (u8*)txdesc - (u8*)adev->txdesc_start; | ||
| 20710 | + if (unlikely(ACX_DEBUG && (index % adev->txdesc_size))) { | ||
| 20711 | + printk("bad txdesc ptr %p\n", txdesc); | ||
| 20712 | + return NULL; | ||
| 20713 | + } | ||
| 20714 | + index /= adev->txdesc_size; | ||
| 20715 | + if (unlikely(ACX_DEBUG && (index >= TX_CNT))) { | ||
| 20716 | + printk("bad txdesc ptr %p\n", txdesc); | ||
| 20717 | + return NULL; | ||
| 20718 | + } | ||
| 20719 | + return adev->txc[index]; | ||
| 20720 | +} | ||
| 20721 | + | ||
| 20722 | +static inline u16 | ||
| 20723 | +get_txr(acx_device_t *adev, txdesc_t* txdesc) | ||
| 20724 | +{ | ||
| 20725 | + int index = (u8*)txdesc - (u8*)adev->txdesc_start; | ||
| 20726 | + index /= adev->txdesc_size; | ||
| 20727 | + return adev->txr[index]; | ||
| 20728 | +} | ||
| 20729 | + | ||
| 20730 | +static inline void | ||
| 20731 | +put_txcr(acx_device_t *adev, txdesc_t* txdesc, client_t* c, u16 r111) | ||
| 20732 | +{ | ||
| 20733 | + int index = (u8*)txdesc - (u8*)adev->txdesc_start; | ||
| 20734 | + if (unlikely(ACX_DEBUG && (index % adev->txdesc_size))) { | ||
| 20735 | + printk("bad txdesc ptr %p\n", txdesc); | ||
| 20736 | + return; | ||
| 20737 | + } | ||
| 20738 | + index /= adev->txdesc_size; | ||
| 20739 | + if (unlikely(ACX_DEBUG && (index >= TX_CNT))) { | ||
| 20740 | + printk("bad txdesc ptr %p\n", txdesc); | ||
| 20741 | + return; | ||
| 20742 | + } | ||
| 20743 | + adev->txc[index] = c; | ||
| 20744 | + adev->txr[index] = r111; | ||
| 20745 | +} | ||
| 20746 | + | ||
| 20747 | + | ||
| 20748 | +/*********************************************************************** | ||
| 20749 | +** EEPROM and PHY read/write helpers | ||
| 20750 | +*/ | ||
| 20751 | +/*********************************************************************** | ||
| 20752 | +** acxmem_read_eeprom_byte | ||
| 20753 | +** | ||
| 20754 | +** Function called to read an octet in the EEPROM. | ||
| 20755 | +** | ||
| 20756 | +** This function is used by acxmem_e_probe to check if the | ||
| 20757 | +** connected card is a legal one or not. | ||
| 20758 | +** | ||
| 20759 | +** Arguments: | ||
| 20760 | +** adev ptr to acx_device structure | ||
| 20761 | +** addr address to read in the EEPROM | ||
| 20762 | +** charbuf ptr to a char. This is where the read octet | ||
| 20763 | +** will be stored | ||
| 20764 | +*/ | ||
| 20765 | +int | ||
| 20766 | +acxmem_read_eeprom_byte(acx_device_t *adev, u32 addr, u8 *charbuf) | ||
| 20767 | +{ | ||
| 20768 | + int result; | ||
| 20769 | + int count; | ||
| 20770 | + | ||
| 20771 | + write_reg32(adev, IO_ACX_EEPROM_CFG, 0); | ||
| 20772 | + write_reg32(adev, IO_ACX_EEPROM_ADDR, addr); | ||
| 20773 | + write_flush(adev); | ||
| 20774 | + write_reg32(adev, IO_ACX_EEPROM_CTL, 2); | ||
| 20775 | + | ||
| 20776 | + count = 0xffff; | ||
| 20777 | + while (read_reg16(adev, IO_ACX_EEPROM_CTL)) { | ||
| 20778 | + /* scheduling away instead of CPU burning loop | ||
| 20779 | + * doesn't seem to work here at all: | ||
| 20780 | + * awful delay, sometimes also failure. | ||
| 20781 | + * Doesn't matter anyway (only small delay). */ | ||
| 20782 | + if (unlikely(!--count)) { | ||
| 20783 | + printk("%s: timeout waiting for EEPROM read\n", | ||
| 20784 | + adev->ndev->name); | ||
| 20785 | + result = NOT_OK; | ||
| 20786 | + goto fail; | ||
| 20787 | + } | ||
| 20788 | + cpu_relax(); | ||
| 20789 | + } | ||
| 20790 | + | ||
| 20791 | + *charbuf = read_reg8(adev, IO_ACX_EEPROM_DATA); | ||
| 20792 | + log(L_DEBUG, "EEPROM at 0x%04X = 0x%02X\n", addr, *charbuf); | ||
| 20793 | + result = OK; | ||
| 20794 | + | ||
| 20795 | +fail: | ||
| 20796 | + return result; | ||
| 20797 | +} | ||
| 20798 | + | ||
| 20799 | + | ||
| 20800 | +/*********************************************************************** | ||
| 20801 | +** We don't lock hw accesses here since we never r/w eeprom in IRQ | ||
| 20802 | +** Note: this function sleeps only because of GFP_KERNEL alloc | ||
| 20803 | +*/ | ||
| 20804 | +#ifdef UNUSED | ||
| 20805 | +int | ||
| 20806 | +acxmem_s_write_eeprom(acx_device_t *adev, u32 addr, u32 len, const u8 *charbuf) | ||
| 20807 | +{ | ||
| 20808 | + u8 *data_verify = NULL; | ||
| 20809 | + unsigned long flags; | ||
| 20810 | + int count, i; | ||
| 20811 | + int result = NOT_OK; | ||
| 20812 | + u16 gpio_orig; | ||
| 20813 | + | ||
| 20814 | + printk("acx: WARNING! I would write to EEPROM now. " | ||
| 20815 | + "Since I really DON'T want to unless you know " | ||
| 20816 | + "what you're doing (THIS CODE WILL PROBABLY " | ||
| 20817 | + "NOT WORK YET!), I will abort that now. And " | ||
| 20818 | + "definitely make sure to make a " | ||
| 20819 | + "/proc/driver/acx_wlan0_eeprom backup copy first!!! " | ||
| 20820 | + "(the EEPROM content includes the PCI config header!! " | ||
| 20821 | + "If you kill important stuff, then you WILL " | ||
| 20822 | + "get in trouble and people DID get in trouble already)\n"); | ||
| 20823 | + return OK; | ||
| 20824 | + | ||
| 20825 | + FN_ENTER; | ||
| 20826 | + | ||
| 20827 | + data_verify = kmalloc(len, GFP_KERNEL); | ||
| 20828 | + if (!data_verify) { | ||
| 20829 | + goto end; | ||
| 20830 | + } | ||
| 20831 | + | ||
| 20832 | + /* first we need to enable the OE (EEPROM Output Enable) GPIO line | ||
| 20833 | + * to be able to write to the EEPROM. | ||
| 20834 | + * NOTE: an EEPROM writing success has been reported, | ||
| 20835 | + * but you probably have to modify GPIO_OUT, too, | ||
| 20836 | + * and you probably need to activate a different GPIO | ||
| 20837 | + * line instead! */ | ||
| 20838 | + gpio_orig = read_reg16(adev, IO_ACX_GPIO_OE); | ||
| 20839 | + write_reg16(adev, IO_ACX_GPIO_OE, gpio_orig & ~1); | ||
| 20840 | + write_flush(adev); | ||
| 20841 | + | ||
| 20842 | + /* ok, now start writing the data out */ | ||
| 20843 | + for (i = 0; i < len; i++) { | ||
| 20844 | + write_reg32(adev, IO_ACX_EEPROM_CFG, 0); | ||
| 20845 | + write_reg32(adev, IO_ACX_EEPROM_ADDR, addr + i); | ||
| 20846 | + write_reg32(adev, IO_ACX_EEPROM_DATA, *(charbuf + i)); | ||
| 20847 | + write_flush(adev); | ||
| 20848 | + write_reg32(adev, IO_ACX_EEPROM_CTL, 1); | ||
| 20849 | + | ||
| 20850 | + count = 0xffff; | ||
| 20851 | + while (read_reg16(adev, IO_ACX_EEPROM_CTL)) { | ||
| 20852 | + if (unlikely(!--count)) { | ||
| 20853 | + printk("WARNING, DANGER!!! " | ||
| 20854 | + "Timeout waiting for EEPROM write\n"); | ||
| 20855 | + goto end; | ||
| 20856 | + } | ||
| 20857 | + cpu_relax(); | ||
| 20858 | + } | ||
| 20859 | + } | ||
| 20860 | + | ||
| 20861 | + /* disable EEPROM writing */ | ||
| 20862 | + write_reg16(adev, IO_ACX_GPIO_OE, gpio_orig); | ||
| 20863 | + write_flush(adev); | ||
| 20864 | + | ||
| 20865 | + /* now start a verification run */ | ||
| 20866 | + for (i = 0; i < len; i++) { | ||
| 20867 | + write_reg32(adev, IO_ACX_EEPROM_CFG, 0); | ||
| 20868 | + write_reg32(adev, IO_ACX_EEPROM_ADDR, addr + i); | ||
| 20869 | + write_flush(adev); | ||
| 20870 | + write_reg32(adev, IO_ACX_EEPROM_CTL, 2); | ||
| 20871 | + | ||
| 20872 | + count = 0xffff; | ||
| 20873 | + while (read_reg16(adev, IO_ACX_EEPROM_CTL)) { | ||
| 20874 | + if (unlikely(!--count)) { | ||
| 20875 | + printk("timeout waiting for EEPROM read\n"); | ||
| 20876 | + goto end; | ||
| 20877 | + } | ||
| 20878 | + cpu_relax(); | ||
| 20879 | + } | ||
| 20880 | + | ||
| 20881 | + data_verify[i] = read_reg16(adev, IO_ACX_EEPROM_DATA); | ||
| 20882 | + } | ||
| 20883 | + | ||
| 20884 | + if (0 == memcmp(charbuf, data_verify, len)) | ||
| 20885 | + result = OK; /* read data matches, success */ | ||
| 20886 | + | ||
| 20887 | +end: | ||
| 20888 | + kfree(data_verify); | ||
| 20889 | + FN_EXIT1(result); | ||
| 20890 | + return result; | ||
| 20891 | +} | ||
| 20892 | +#endif /* UNUSED */ | ||
| 20893 | + | ||
| 20894 | + | ||
| 20895 | +/*********************************************************************** | ||
| 20896 | +** acxmem_s_read_phy_reg | ||
| 20897 | +** | ||
| 20898 | +** Messing with rx/tx disabling and enabling here | ||
| 20899 | +** (write_reg32(adev, IO_ACX_ENABLE, 0b000000xx)) kills traffic | ||
| 20900 | +*/ | ||
| 20901 | +int | ||
| 20902 | +acxmem_s_read_phy_reg(acx_device_t *adev, u32 reg, u8 *charbuf) | ||
| 20903 | +{ | ||
| 20904 | + int result = NOT_OK; | ||
| 20905 | + int count; | ||
| 20906 | + | ||
| 20907 | + FN_ENTER; | ||
| 20908 | + | ||
| 20909 | + write_reg32(adev, IO_ACX_PHY_ADDR, reg); | ||
| 20910 | + write_flush(adev); | ||
| 20911 | + write_reg32(adev, IO_ACX_PHY_CTL, 2); | ||
| 20912 | + | ||
| 20913 | + count = 0xffff; | ||
| 20914 | + while (read_reg32(adev, IO_ACX_PHY_CTL)) { | ||
| 20915 | + /* scheduling away instead of CPU burning loop | ||
| 20916 | + * doesn't seem to work here at all: | ||
| 20917 | + * awful delay, sometimes also failure. | ||
| 20918 | + * Doesn't matter anyway (only small delay). */ | ||
| 20919 | + if (unlikely(!--count)) { | ||
| 20920 | + printk("%s: timeout waiting for phy read\n", | ||
| 20921 | + adev->ndev->name); | ||
| 20922 | + *charbuf = 0; | ||
| 20923 | + goto fail; | ||
| 20924 | + } | ||
| 20925 | + cpu_relax(); | ||
| 20926 | + } | ||
| 20927 | + | ||
| 20928 | + log(L_DEBUG, "count was %u\n", count); | ||
| 20929 | + *charbuf = read_reg8(adev, IO_ACX_PHY_DATA); | ||
| 20930 | + | ||
| 20931 | + log(L_DEBUG, "radio PHY at 0x%04X = 0x%02X\n", *charbuf, reg); | ||
| 20932 | + result = OK; | ||
| 20933 | + goto fail; /* silence compiler warning */ | ||
| 20934 | +fail: | ||
| 20935 | + FN_EXIT1(result); | ||
| 20936 | + return result; | ||
| 20937 | +} | ||
| 20938 | + | ||
| 20939 | + | ||
| 20940 | +/*********************************************************************** | ||
| 20941 | +*/ | ||
| 20942 | +int | ||
| 20943 | +acxmem_s_write_phy_reg(acx_device_t *adev, u32 reg, u8 value) | ||
| 20944 | +{ | ||
| 20945 | + int count; | ||
| 20946 | + FN_ENTER; | ||
| 20947 | + | ||
| 20948 | + /* mprusko said that 32bit accesses result in distorted sensitivity | ||
| 20949 | + * on his card. Unconfirmed, looks like it's not true (most likely since we | ||
| 20950 | + * now properly flush writes). */ | ||
| 20951 | + write_reg32(adev, IO_ACX_PHY_DATA, value); | ||
| 20952 | + write_reg32(adev, IO_ACX_PHY_ADDR, reg); | ||
| 20953 | + write_flush(adev); | ||
| 20954 | + write_reg32(adev, IO_ACX_PHY_CTL, 1); | ||
| 20955 | + write_flush(adev); | ||
| 20956 | + | ||
| 20957 | + count = 0xffff; | ||
| 20958 | + while (read_reg32(adev, IO_ACX_PHY_CTL)) { | ||
| 20959 | + /* scheduling away instead of CPU burning loop | ||
| 20960 | + * doesn't seem to work here at all: | ||
| 20961 | + * awful delay, sometimes also failure. | ||
| 20962 | + * Doesn't matter anyway (only small delay). */ | ||
| 20963 | + if (unlikely(!--count)) { | ||
| 20964 | + printk("%s: timeout waiting for phy read\n", | ||
| 20965 | + adev->ndev->name); | ||
| 20966 | + goto fail; | ||
| 20967 | + } | ||
| 20968 | + cpu_relax(); | ||
| 20969 | + } | ||
| 20970 | + | ||
| 20971 | + log(L_DEBUG, "radio PHY write 0x%02X at 0x%04X\n", value, reg); | ||
| 20972 | + fail: | ||
| 20973 | + FN_EXIT1(OK); | ||
| 20974 | + return OK; | ||
| 20975 | +} | ||
| 20976 | + | ||
| 20977 | + | ||
| 20978 | +#define NO_AUTO_INCREMENT 1 | ||
| 20979 | + | ||
| 20980 | +/*********************************************************************** | ||
| 20981 | +** acxmem_s_write_fw | ||
| 20982 | +** | ||
| 20983 | +** Write the firmware image into the card. | ||
| 20984 | +** | ||
| 20985 | +** Arguments: | ||
| 20986 | +** adev wlan device structure | ||
| 20987 | +** fw_image firmware image. | ||
| 20988 | +** | ||
| 20989 | +** Returns: | ||
| 20990 | +** 1 firmware image corrupted | ||
| 20991 | +** 0 success | ||
| 20992 | +*/ | ||
| 20993 | +static int | ||
| 20994 | +acxmem_s_write_fw(acx_device_t *adev, const firmware_image_t *fw_image, u32 offset) | ||
| 20995 | +{ | ||
| 20996 | + int len, size, checkMismatch = -1; | ||
| 20997 | + u32 sum, v32, tmp, id; | ||
| 20998 | + /* we skip the first four bytes which contain the control sum */ | ||
| 20999 | + const u8 *p = (u8*)fw_image + 4; | ||
| 21000 | + | ||
| 21001 | + /* start the image checksum by adding the image size value */ | ||
| 21002 | + sum = p[0]+p[1]+p[2]+p[3]; | ||
| 21003 | + p += 4; | ||
| 21004 | + | ||
| 21005 | +#ifdef NOPE | ||
| 21006 | +#if NO_AUTO_INCREMENT | ||
| 21007 | + write_reg32(adev, IO_ACX_SLV_MEM_CTL, 0); /* use basic mode */ | ||
| 21008 | +#else | ||
| 21009 | + write_reg32(adev, IO_ACX_SLV_MEM_CTL, 1); /* use autoincrement mode */ | ||
| 21010 | + write_reg32(adev, IO_ACX_SLV_MEM_ADDR, offset); /* configure start address */ | ||
| 21011 | + write_flush(adev); | ||
| 21012 | +#endif | ||
| 21013 | +#endif | ||
| 21014 | + len = 0; | ||
| 21015 | + size = le32_to_cpu(fw_image->size) & (~3); | ||
| 21016 | + | ||
| 21017 | + while (likely(len < size)) { | ||
| 21018 | + v32 = be32_to_cpu(*(u32*)p); | ||
| 21019 | + sum += p[0]+p[1]+p[2]+p[3]; | ||
| 21020 | + p += 4; | ||
| 21021 | + len += 4; | ||
| 21022 | + | ||
| 21023 | +#ifdef NOPE | ||
| 21024 | +#if NO_AUTO_INCREMENT | ||
| 21025 | + write_reg32(adev, IO_ACX_SLV_MEM_ADDR, offset + len - 4); | ||
| 21026 | + write_flush(adev); | ||
| 21027 | +#endif | ||
| 21028 | + write_reg32(adev, IO_ACX_SLV_MEM_DATA, v32); | ||
| 21029 | + write_flush(adev); | ||
| 21030 | +#endif | ||
| 21031 | + write_slavemem32 (adev, offset + len - 4, v32); | ||
| 21032 | + | ||
| 21033 | + id = read_id_register (adev); | ||
| 21034 | + | ||
| 21035 | + /* | ||
| 21036 | + * check the data written | ||
| 21037 | + */ | ||
| 21038 | + tmp = read_slavemem32 (adev, offset + len - 4); | ||
| 21039 | + if (checkMismatch && (tmp != v32)) { | ||
| 21040 | + printk ("first data mismatch at 0x%08x good 0x%08x bad 0x%08x id 0x%08x\n", | ||
| 21041 | + offset + len - 4, v32, tmp, id); | ||
| 21042 | + checkMismatch = 0; | ||
| 21043 | + } | ||
| 21044 | + } | ||
| 21045 | + log(L_DEBUG, "firmware written, size:%d sum1:%x sum2:%x\n", | ||
| 21046 | + size, sum, le32_to_cpu(fw_image->chksum)); | ||
| 21047 | + | ||
| 21048 | + /* compare our checksum with the stored image checksum */ | ||
| 21049 | + return (sum != le32_to_cpu(fw_image->chksum)); | ||
| 21050 | +} | ||
| 21051 | + | ||
| 21052 | + | ||
| 21053 | +/*********************************************************************** | ||
| 21054 | +** acxmem_s_validate_fw | ||
| 21055 | +** | ||
| 21056 | +** Compare the firmware image given with | ||
| 21057 | +** the firmware image written into the card. | ||
| 21058 | +** | ||
| 21059 | +** Arguments: | ||
| 21060 | +** adev wlan device structure | ||
| 21061 | +** fw_image firmware image. | ||
| 21062 | +** | ||
| 21063 | +** Returns: | ||
| 21064 | +** NOT_OK firmware image corrupted or not correctly written | ||
| 21065 | +** OK success | ||
| 21066 | +*/ | ||
| 21067 | +static int | ||
| 21068 | +acxmem_s_validate_fw(acx_device_t *adev, const firmware_image_t *fw_image, | ||
| 21069 | + u32 offset) | ||
| 21070 | +{ | ||
| 21071 | + u32 sum, v32, w32; | ||
| 21072 | + int len, size; | ||
| 21073 | + int result = OK; | ||
| 21074 | + /* we skip the first four bytes which contain the control sum */ | ||
| 21075 | + const u8 *p = (u8*)fw_image + 4; | ||
| 21076 | + | ||
| 21077 | + /* start the image checksum by adding the image size value */ | ||
| 21078 | + sum = p[0]+p[1]+p[2]+p[3]; | ||
| 21079 | + p += 4; | ||
| 21080 | + | ||
| 21081 | + write_reg32(adev, IO_ACX_SLV_END_CTL, 0); | ||
| 21082 | + | ||
| 21083 | +#if NO_AUTO_INCREMENT | ||
| 21084 | + write_reg32(adev, IO_ACX_SLV_MEM_CTL, 0); /* use basic mode */ | ||
| 21085 | +#else | ||
| 21086 | + write_reg32(adev, IO_ACX_SLV_MEM_CTL, 1); /* use autoincrement mode */ | ||
| 21087 | + write_reg32(adev, IO_ACX_SLV_MEM_ADDR, offset); /* configure start address */ | ||
| 21088 | +#endif | ||
| 21089 | + | ||
| 21090 | + len = 0; | ||
| 21091 | + size = le32_to_cpu(fw_image->size) & (~3); | ||
| 21092 | + | ||
| 21093 | + while (likely(len < size)) { | ||
| 21094 | + v32 = be32_to_cpu(*(u32*)p); | ||
| 21095 | + p += 4; | ||
| 21096 | + len += 4; | ||
| 21097 | + | ||
| 21098 | +#ifdef NOPE | ||
| 21099 | +#if NO_AUTO_INCREMENT | ||
| 21100 | + write_reg32(adev, IO_ACX_SLV_MEM_ADDR, offset + len - 4); | ||
| 21101 | +#endif | ||
| 21102 | + udelay(10); | ||
| 21103 | + w32 = read_reg32(adev, IO_ACX_SLV_MEM_DATA); | ||
| 21104 | +#endif | ||
| 21105 | + w32 = read_slavemem32 (adev, offset + len - 4); | ||
| 21106 | + | ||
| 21107 | + if (unlikely(w32 != v32)) { | ||
| 21108 | + printk("acx: FATAL: firmware upload: " | ||
| 21109 | + "data parts at offset %d don't match\n(0x%08X vs. 0x%08X)!\n" | ||
| 21110 | + "I/O timing issues or defective memory, with DWL-xx0+? " | ||
| 21111 | + "ACX_IO_WIDTH=16 may help. Please report\n", | ||
| 21112 | + len, v32, w32); | ||
| 21113 | + result = NOT_OK; | ||
| 21114 | + break; | ||
| 21115 | + } | ||
| 21116 | + | ||
| 21117 | + sum += (u8)w32 + (u8)(w32>>8) + (u8)(w32>>16) + (u8)(w32>>24); | ||
| 21118 | + } | ||
| 21119 | + | ||
| 21120 | + /* sum control verification */ | ||
| 21121 | + if (result != NOT_OK) { | ||
| 21122 | + if (sum != le32_to_cpu(fw_image->chksum)) { | ||
| 21123 | + printk("acx: FATAL: firmware upload: " | ||
| 21124 | + "checksums don't match!\n"); | ||
| 21125 | + result = NOT_OK; | ||
| 21126 | + } | ||
| 21127 | + } | ||
| 21128 | + | ||
| 21129 | + return result; | ||
| 21130 | +} | ||
| 21131 | + | ||
| 21132 | + | ||
| 21133 | +/*********************************************************************** | ||
| 21134 | +** acxmem_s_upload_fw | ||
| 21135 | +** | ||
| 21136 | +** Called from acx_reset_dev | ||
| 21137 | +*/ | ||
| 21138 | +static int | ||
| 21139 | +acxmem_s_upload_fw(acx_device_t *adev) | ||
| 21140 | +{ | ||
| 21141 | + firmware_image_t *fw_image = NULL; | ||
| 21142 | + int res = NOT_OK; | ||
| 21143 | + int try; | ||
| 21144 | + u32 file_size; | ||
| 21145 | + char *filename = "WLANGEN.BIN"; | ||
| 21146 | +#ifdef PATCH_AROUND_BAD_SPOTS | ||
| 21147 | + u32 offset; | ||
| 21148 | + int i; | ||
| 21149 | + /* | ||
| 21150 | + * arm-linux-objdump -d patch.bin, or | ||
| 21151 | + * od -Ax -t x4 patch.bin after finding the bounds | ||
| 21152 | + * of the .text section with arm-linux-objdump -s patch.bin | ||
| 21153 | + */ | ||
| 21154 | + u32 patch[] = { | ||
| 21155 | + 0xe584c030, 0xe59fc008, | ||
| 21156 | + 0xe92d1000, 0xe59fc004, 0xe8bd8000, 0x0000080c, | ||
| 21157 | + 0x0000aa68, 0x605a2200, 0x2c0a689c, 0x2414d80a, | ||
| 21158 | + 0x2f00689f, 0x1c27d007, 0x06241e7c, 0x2f000e24, | ||
| 21159 | + 0xe000d1f6, 0x602e6018, 0x23036468, 0x480203db, | ||
| 21160 | + 0x60ca6003, 0xbdf0750a, 0xffff0808 | ||
| 21161 | + }; | ||
| 21162 | +#endif | ||
| 21163 | + | ||
| 21164 | + FN_ENTER; | ||
| 21165 | + /* No combined image; tell common we need the radio firmware, too */ | ||
| 21166 | + adev->need_radio_fw = 1; | ||
| 21167 | + | ||
| 21168 | + fw_image = acx_s_read_fw(adev->dev, filename, &file_size); | ||
| 21169 | + if (!fw_image) { | ||
| 21170 | + FN_EXIT1(NOT_OK); | ||
| 21171 | + return NOT_OK; | ||
| 21172 | + } | ||
| 21173 | + | ||
| 21174 | + for (try = 1; try <= 5; try++) { | ||
| 21175 | + res = acxmem_s_write_fw(adev, fw_image, 0); | ||
| 21176 | + log(L_DEBUG|L_INIT, "acx_write_fw (main): %d\n", res); | ||
| 21177 | + if (OK == res) { | ||
| 21178 | + res = acxmem_s_validate_fw(adev, fw_image, 0); | ||
| 21179 | + log(L_DEBUG|L_INIT, "acx_validate_fw " | ||
| 21180 | + "(main): %d\n", res); | ||
| 21181 | + } | ||
| 21182 | + | ||
| 21183 | + if (OK == res) { | ||
| 21184 | + SET_BIT(adev->dev_state_mask, ACX_STATE_FW_LOADED); | ||
| 21185 | + break; | ||
| 21186 | + } | ||
| 21187 | + printk("acx: firmware upload attempt #%d FAILED, " | ||
| 21188 | + "retrying...\n", try); | ||
| 21189 | + acx_s_msleep(1000); /* better wait for a while... */ | ||
| 21190 | + } | ||
| 21191 | + | ||
| 21192 | +#ifdef PATCH_AROUND_BAD_SPOTS | ||
| 21193 | + /* | ||
| 21194 | + * Only want to do this if the firmware is exactly what we expect for an | ||
| 21195 | + * iPaq 4700; otherwise, bad things would ensue. | ||
| 21196 | + */ | ||
| 21197 | + if ((HX4700_FIRMWARE_CHECKSUM == fw_image->chksum) || | ||
| 21198 | + (HX4700_ALTERNATE_FIRMWARE_CHECKSUM == fw_image->chksum)) { | ||
| 21199 | + /* | ||
| 21200 | + * Put the patch after the main firmware image. 0x950c contains | ||
| 21201 | + * the ACX's idea of the end of the firmware. Use that location to | ||
| 21202 | + * load ours (which depends on that location being 0xab58) then | ||
| 21203 | + * update that location to point to after ours. | ||
| 21204 | + */ | ||
| 21205 | + | ||
| 21206 | + offset = read_slavemem32 (adev, 0x950c); | ||
| 21207 | + | ||
| 21208 | + log (L_DEBUG, "acx: patching in at 0x%04x\n", offset); | ||
| 21209 | + | ||
| 21210 | + for (i = 0; i < sizeof(patch) / sizeof(patch[0]); i++) { | ||
| 21211 | + write_slavemem32 (adev, offset, patch[i]); | ||
| 21212 | + offset += sizeof(u32); | ||
| 21213 | + } | ||
| 21214 | + | ||
| 21215 | + /* | ||
| 21216 | + * Patch the instruction at 0x0804 to branch to our ARM patch at 0xab58 | ||
| 21217 | + */ | ||
| 21218 | + write_slavemem32 (adev, 0x0804, 0xea000000 + (0xab58-0x0804-8)/4); | ||
| 21219 | + | ||
| 21220 | + /* | ||
| 21221 | + * Patch the instructions at 0x1f40 to branch to our Thumb patch at 0xab74 | ||
| 21222 | + * | ||
| 21223 | + * 4a00 ldr r2, [pc, #0] | ||
| 21224 | + * 4710 bx r2 | ||
| 21225 | + * .data 0xab74+1 | ||
| 21226 | + */ | ||
| 21227 | + write_slavemem32 (adev, 0x1f40, 0x47104a00); | ||
| 21228 | + write_slavemem32 (adev, 0x1f44, 0x0000ab74+1); | ||
| 21229 | + | ||
| 21230 | + /* | ||
| 21231 | + * Bump the end of the firmware up to beyond our patch. | ||
| 21232 | + */ | ||
| 21233 | + write_slavemem32 (adev, 0x950c, offset); | ||
| 21234 | + | ||
| 21235 | + } | ||
| 21236 | +#endif | ||
| 21237 | + | ||
| 21238 | + vfree(fw_image); | ||
| 21239 | + | ||
| 21240 | + FN_EXIT1(res); | ||
| 21241 | + return res; | ||
| 21242 | +} | ||
| 21243 | + | ||
| 21244 | + | ||
| 21245 | +/*********************************************************************** | ||
| 21246 | +** acxmem_s_upload_radio | ||
| 21247 | +** | ||
| 21248 | +** Uploads the appropriate radio module firmware into the card. | ||
| 21249 | +*/ | ||
| 21250 | +int | ||
| 21251 | +acxmem_s_upload_radio(acx_device_t *adev) | ||
| 21252 | +{ | ||
| 21253 | + acx_ie_memmap_t mm; | ||
| 21254 | + firmware_image_t *radio_image; | ||
| 21255 | + acx_cmd_radioinit_t radioinit; | ||
| 21256 | + int res = NOT_OK; | ||
| 21257 | + int try; | ||
| 21258 | + u32 offset; | ||
| 21259 | + u32 size; | ||
| 21260 | + char filename[sizeof("RADIONN.BIN")]; | ||
| 21261 | + | ||
| 21262 | + if (!adev->need_radio_fw) return OK; | ||
| 21263 | + | ||
| 21264 | + FN_ENTER; | ||
| 21265 | + | ||
| 21266 | + acx_s_interrogate(adev, &mm, ACX1xx_IE_MEMORY_MAP); | ||
| 21267 | + offset = le32_to_cpu(mm.CodeEnd); | ||
| 21268 | + | ||
| 21269 | + snprintf(filename, sizeof(filename), "RADIO%02x.BIN", | ||
| 21270 | + adev->radio_type); | ||
| 21271 | + radio_image = acx_s_read_fw(adev->dev, filename, &size); | ||
| 21272 | + if (!radio_image) { | ||
| 21273 | + printk("acx: can't load radio module '%s'\n", filename); | ||
| 21274 | + goto fail; | ||
| 21275 | + } | ||
| 21276 | + | ||
| 21277 | + acx_s_issue_cmd(adev, ACX1xx_CMD_SLEEP, NULL, 0); | ||
| 21278 | + | ||
| 21279 | + for (try = 1; try <= 5; try++) { | ||
| 21280 | + res = acxmem_s_write_fw(adev, radio_image, offset); | ||
| 21281 | + log(L_DEBUG|L_INIT, "acx_write_fw (radio): %d\n", res); | ||
| 21282 | + if (OK == res) { | ||
| 21283 | + res = acxmem_s_validate_fw(adev, radio_image, offset); | ||
| 21284 | + log(L_DEBUG|L_INIT, "acx_validate_fw (radio): %d\n", res); | ||
| 21285 | + } | ||
| 21286 | + | ||
| 21287 | + if (OK == res) | ||
| 21288 | + break; | ||
| 21289 | + printk("acx: radio firmware upload attempt #%d FAILED, " | ||
| 21290 | + "retrying...\n", try); | ||
| 21291 | + acx_s_msleep(1000); /* better wait for a while... */ | ||
| 21292 | + } | ||
| 21293 | + | ||
| 21294 | + acx_s_issue_cmd(adev, ACX1xx_CMD_WAKE, NULL, 0); | ||
| 21295 | + radioinit.offset = cpu_to_le32(offset); | ||
| 21296 | + | ||
| 21297 | + /* no endian conversion needed, remains in card CPU area: */ | ||
| 21298 | + radioinit.len = radio_image->size; | ||
| 21299 | + | ||
| 21300 | + vfree(radio_image); | ||
| 21301 | + | ||
| 21302 | + if (OK != res) | ||
| 21303 | + goto fail; | ||
| 21304 | + | ||
| 21305 | + /* will take a moment so let's have a big timeout */ | ||
| 21306 | + acx_s_issue_cmd_timeo(adev, ACX1xx_CMD_RADIOINIT, | ||
| 21307 | + &radioinit, sizeof(radioinit), CMD_TIMEOUT_MS(1000)); | ||
| 21308 | + | ||
| 21309 | + res = acx_s_interrogate(adev, &mm, ACX1xx_IE_MEMORY_MAP); | ||
| 21310 | + | ||
| 21311 | +fail: | ||
| 21312 | + FN_EXIT1(res); | ||
| 21313 | + return res; | ||
| 21314 | +} | ||
| 21315 | + | ||
| 21316 | +/*********************************************************************** | ||
| 21317 | +** acxmem_l_reset_mac | ||
| 21318 | +** | ||
| 21319 | +** MAC will be reset | ||
| 21320 | +** Call context: reset_dev | ||
| 21321 | +*/ | ||
| 21322 | +static void | ||
| 21323 | +acxmem_l_reset_mac(acx_device_t *adev) | ||
| 21324 | +{ | ||
| 21325 | + int count; | ||
| 21326 | + FN_ENTER; | ||
| 21327 | + | ||
| 21328 | + /* halt eCPU */ | ||
| 21329 | + set_regbits (adev, IO_ACX_ECPU_CTRL, 0x1); | ||
| 21330 | + | ||
| 21331 | + /* now do soft reset of eCPU, set bit */ | ||
| 21332 | + set_regbits (adev, IO_ACX_SOFT_RESET, 0x1); | ||
| 21333 | + log(L_DEBUG, "%s: enable soft reset...\n", __func__); | ||
| 21334 | + | ||
| 21335 | + /* Windows driver sleeps here for a while with this sequence */ | ||
| 21336 | + for (count = 0; count < 200; count++) { | ||
| 21337 | + udelay (50); | ||
| 21338 | + } | ||
| 21339 | + | ||
| 21340 | + /* now clear bit again: deassert eCPU reset */ | ||
| 21341 | + log(L_DEBUG, "%s: disable soft reset and go to init mode...\n", __func__); | ||
| 21342 | + clear_regbits (adev, IO_ACX_SOFT_RESET, 0x1); | ||
| 21343 | + | ||
| 21344 | + /* now start a burst read from initial EEPROM */ | ||
| 21345 | + set_regbits (adev, IO_ACX_EE_START, 0x1); | ||
| 21346 | + | ||
| 21347 | + /* | ||
| 21348 | + * Windows driver sleeps here for a while with this sequence | ||
| 21349 | + */ | ||
| 21350 | + for (count = 0; count < 200; count++) { | ||
| 21351 | + udelay (50); | ||
| 21352 | + } | ||
| 21353 | + | ||
| 21354 | + /* Windows driver writes 0x10000 to register 0x808 here */ | ||
| 21355 | + | ||
| 21356 | + write_reg32 (adev, 0x808, 0x10000); | ||
| 21357 | + | ||
| 21358 | + FN_EXIT0; | ||
| 21359 | +} | ||
| 21360 | + | ||
| 21361 | + | ||
| 21362 | +/*********************************************************************** | ||
| 21363 | +** acxmem_s_verify_init | ||
| 21364 | +*/ | ||
| 21365 | +static int | ||
| 21366 | +acxmem_s_verify_init(acx_device_t *adev) | ||
| 21367 | +{ | ||
| 21368 | + int result = NOT_OK; | ||
| 21369 | + unsigned long timeout; | ||
| 21370 | + | ||
| 21371 | + FN_ENTER; | ||
| 21372 | + | ||
| 21373 | + timeout = jiffies + 2*HZ; | ||
| 21374 | + for (;;) { | ||
| 21375 | + u32 irqstat = read_reg32(adev, IO_ACX_IRQ_STATUS_NON_DES); | ||
| 21376 | + if ((irqstat != 0xFFFFFFFF) && (irqstat & HOST_INT_FCS_THRESHOLD)) { | ||
| 21377 | + result = OK; | ||
| 21378 | + write_reg32(adev, IO_ACX_IRQ_ACK, HOST_INT_FCS_THRESHOLD); | ||
| 21379 | + break; | ||
| 21380 | + } | ||
| 21381 | + if (time_after(jiffies, timeout)) | ||
| 21382 | + break; | ||
| 21383 | + /* Init may take up to ~0.5 sec total */ | ||
| 21384 | + acx_s_msleep(50); | ||
| 21385 | + } | ||
| 21386 | + | ||
| 21387 | + FN_EXIT1(result); | ||
| 21388 | + return result; | ||
| 21389 | +} | ||
| 21390 | + | ||
| 21391 | + | ||
| 21392 | +/*********************************************************************** | ||
| 21393 | +** A few low-level helpers | ||
| 21394 | +** | ||
| 21395 | +** Note: these functions are not protected by lock | ||
| 21396 | +** and thus are never allowed to be called from IRQ. | ||
| 21397 | +** Also they must not race with fw upload which uses same hw regs | ||
| 21398 | +*/ | ||
| 21399 | + | ||
| 21400 | +/*********************************************************************** | ||
| 21401 | +** acxmem_write_cmd_type_status | ||
| 21402 | +*/ | ||
| 21403 | + | ||
| 21404 | +static inline void | ||
| 21405 | +acxmem_write_cmd_type_status(acx_device_t *adev, u16 type, u16 status) | ||
| 21406 | +{ | ||
| 21407 | + write_slavemem32 (adev, (u32) adev->cmd_area, type | (status << 16)); | ||
| 21408 | + write_flush(adev); | ||
| 21409 | +} | ||
| 21410 | + | ||
| 21411 | + | ||
| 21412 | +/*********************************************************************** | ||
| 21413 | +** acxmem_read_cmd_type_status | ||
| 21414 | +*/ | ||
| 21415 | +static u32 | ||
| 21416 | +acxmem_read_cmd_type_status(acx_device_t *adev) | ||
| 21417 | +{ | ||
| 21418 | + u32 cmd_type, cmd_status; | ||
| 21419 | + | ||
| 21420 | + cmd_type = read_slavemem32 (adev, (u32) adev->cmd_area); | ||
| 21421 | + | ||
| 21422 | + cmd_status = (cmd_type >> 16); | ||
| 21423 | + cmd_type = (u16)cmd_type; | ||
| 21424 | + | ||
| 21425 | + log(L_CTL, "cmd_type:%04X cmd_status:%04X [%s]\n", | ||
| 21426 | + cmd_type, cmd_status, | ||
| 21427 | + acx_cmd_status_str(cmd_status)); | ||
| 21428 | + | ||
| 21429 | + return cmd_status; | ||
| 21430 | +} | ||
| 21431 | + | ||
| 21432 | + | ||
| 21433 | +/*********************************************************************** | ||
| 21434 | +** acxmem_s_reset_dev | ||
| 21435 | +** | ||
| 21436 | +** Arguments: | ||
| 21437 | +** netdevice that contains the adev variable | ||
| 21438 | +** Returns: | ||
| 21439 | +** NOT_OK on fail | ||
| 21440 | +** OK on success | ||
| 21441 | +** Side effects: | ||
| 21442 | +** device is hard reset | ||
| 21443 | +** Call context: | ||
| 21444 | +** acxmem_e_probe | ||
| 21445 | +** Comment: | ||
| 21446 | +** This resets the device using low level hardware calls | ||
| 21447 | +** as well as uploads and verifies the firmware to the card | ||
| 21448 | +*/ | ||
| 21449 | + | ||
| 21450 | +static inline void | ||
| 21451 | +init_mboxes(acx_device_t *adev) | ||
| 21452 | +{ | ||
| 21453 | + u32 cmd_offs, info_offs; | ||
| 21454 | + | ||
| 21455 | + cmd_offs = read_reg32(adev, IO_ACX_CMD_MAILBOX_OFFS); | ||
| 21456 | + info_offs = read_reg32(adev, IO_ACX_INFO_MAILBOX_OFFS); | ||
| 21457 | + adev->cmd_area = (u8*) cmd_offs; | ||
| 21458 | + adev->info_area = (u8*) info_offs; | ||
| 21459 | + /* | ||
| 21460 | + log(L_DEBUG, "iobase2=%p\n" | ||
| 21461 | + */ | ||
| 21462 | + log( L_DEBUG, "cmd_mbox_offset=%X cmd_area=%p\n" | ||
| 21463 | + "info_mbox_offset=%X info_area=%p\n", | ||
| 21464 | + cmd_offs, adev->cmd_area, | ||
| 21465 | + info_offs, adev->info_area); | ||
| 21466 | +} | ||
| 21467 | + | ||
| 21468 | + | ||
| 21469 | +static inline void | ||
| 21470 | +read_eeprom_area(acx_device_t *adev) | ||
| 21471 | +{ | ||
| 21472 | +#if ACX_DEBUG > 1 | ||
| 21473 | + int offs; | ||
| 21474 | + u8 tmp; | ||
| 21475 | + | ||
| 21476 | + for (offs = 0x8c; offs < 0xb9; offs++) | ||
| 21477 | + acxmem_read_eeprom_byte(adev, offs, &tmp); | ||
| 21478 | +#endif | ||
| 21479 | +} | ||
| 21480 | + | ||
| 21481 | +static int | ||
| 21482 | +acxmem_s_reset_dev(acx_device_t *adev) | ||
| 21483 | +{ | ||
| 21484 | + const char* msg = ""; | ||
| 21485 | + unsigned long flags; | ||
| 21486 | + int result = NOT_OK; | ||
| 21487 | + u16 hardware_info; | ||
| 21488 | + u16 ecpu_ctrl; | ||
| 21489 | + int count; | ||
| 21490 | + u32 tmp; | ||
| 21491 | + | ||
| 21492 | + FN_ENTER; | ||
| 21493 | + /* | ||
| 21494 | + write_reg32 (adev, IO_ACX_SLV_MEM_CP, 0); | ||
| 21495 | + */ | ||
| 21496 | + /* reset the device to make sure the eCPU is stopped | ||
| 21497 | + * to upload the firmware correctly */ | ||
| 21498 | + | ||
| 21499 | + acx_lock(adev, flags); | ||
| 21500 | + | ||
| 21501 | + /* Windows driver does some funny things here */ | ||
| 21502 | + /* | ||
| 21503 | + * clear bit 0x200 in register 0x2A0 | ||
| 21504 | + */ | ||
| 21505 | + clear_regbits (adev, 0x2A0, 0x200); | ||
| 21506 | + | ||
| 21507 | + /* | ||
| 21508 | + * Set bit 0x200 in ACX_GPIO_OUT | ||
| 21509 | + */ | ||
| 21510 | + set_regbits (adev, IO_ACX_GPIO_OUT, 0x200); | ||
| 21511 | + | ||
| 21512 | + /* | ||
| 21513 | + * read register 0x900 until its value is 0x8400104C, sleeping | ||
| 21514 | + * in between reads if it's not immediate | ||
| 21515 | + */ | ||
| 21516 | + tmp = read_reg32 (adev, REG_ACX_VENDOR_ID); | ||
| 21517 | + count = 500; | ||
| 21518 | + while (count-- && (tmp != ACX_VENDOR_ID)) { | ||
| 21519 | + mdelay (10); | ||
| 21520 | + tmp = read_reg32 (adev, REG_ACX_VENDOR_ID); | ||
| 21521 | + } | ||
| 21522 | + | ||
| 21523 | + /* end what Windows driver does */ | ||
| 21524 | + | ||
| 21525 | + acxmem_l_reset_mac(adev); | ||
| 21526 | + | ||
| 21527 | + ecpu_ctrl = read_reg32(adev, IO_ACX_ECPU_CTRL) & 1; | ||
| 21528 | + if (!ecpu_ctrl) { | ||
| 21529 | + msg = "eCPU is already running. "; | ||
| 21530 | + goto end_unlock; | ||
| 21531 | + } | ||
| 21532 | + | ||
| 21533 | +#ifdef WE_DONT_NEED_THAT_DO_WE | ||
| 21534 | + if (read_reg16(adev, IO_ACX_SOR_CFG) & 2) { | ||
| 21535 | + /* eCPU most likely means "embedded CPU" */ | ||
| 21536 | + msg = "eCPU did not start after boot from flash. "; | ||
| 21537 | + goto end_unlock; | ||
| 21538 | + } | ||
| 21539 | + | ||
| 21540 | + /* check sense on reset flags */ | ||
| 21541 | + if (read_reg16(adev, IO_ACX_SOR_CFG) & 0x10) { | ||
| 21542 | + printk("%s: eCPU did not start after boot (SOR), " | ||
| 21543 | + "is this fatal?\n", adev->ndev->name); | ||
| 21544 | + } | ||
| 21545 | +#endif | ||
| 21546 | + /* scan, if any, is stopped now, setting corresponding IRQ bit */ | ||
| 21547 | + adev->irq_status |= HOST_INT_SCAN_COMPLETE; | ||
| 21548 | + | ||
| 21549 | + acx_unlock(adev, flags); | ||
| 21550 | + | ||
| 21551 | + /* need to know radio type before fw load */ | ||
| 21552 | + /* Need to wait for arrival of this information in a loop, | ||
| 21553 | + * most probably since eCPU runs some init code from EEPROM | ||
| 21554 | + * (started burst read in reset_mac()) which also | ||
| 21555 | + * sets the radio type ID */ | ||
| 21556 | + | ||
| 21557 | + count = 0xffff; | ||
| 21558 | + do { | ||
| 21559 | + hardware_info = read_reg16(adev, IO_ACX_EEPROM_INFORMATION); | ||
| 21560 | + if (!--count) { | ||
| 21561 | + msg = "eCPU didn't indicate radio type"; | ||
| 21562 | + goto end_fail; | ||
| 21563 | + } | ||
| 21564 | + cpu_relax(); | ||
| 21565 | + } while (!(hardware_info & 0xff00)); /* radio type still zero? */ | ||
| 21566 | + printk("ACX radio type 0x%02x\n", (hardware_info >> 8) & 0xff); | ||
| 21567 | + /* printk("DEBUG: count %d\n", count); */ | ||
| 21568 | + adev->form_factor = hardware_info & 0xff; | ||
| 21569 | + adev->radio_type = hardware_info >> 8; | ||
| 21570 | + | ||
| 21571 | + /* load the firmware */ | ||
| 21572 | + if (OK != acxmem_s_upload_fw(adev)) | ||
| 21573 | + goto end_fail; | ||
| 21574 | + | ||
| 21575 | + /* acx_s_msleep(10); this one really shouldn't be required */ | ||
| 21576 | + | ||
| 21577 | + /* now start eCPU by clearing bit */ | ||
| 21578 | + clear_regbits (adev, IO_ACX_ECPU_CTRL, 0x1); | ||
| 21579 | + log(L_DEBUG, "booted eCPU up and waiting for completion...\n"); | ||
| 21580 | + | ||
| 21581 | + /* Windows driver clears bit 0x200 in register 0x2A0 here */ | ||
| 21582 | + clear_regbits (adev, 0x2A0, 0x200); | ||
| 21583 | + | ||
| 21584 | + /* Windows driver sets bit 0x200 in ACX_GPIO_OUT here */ | ||
| 21585 | + set_regbits (adev, IO_ACX_GPIO_OUT, 0x200); | ||
| 21586 | + /* wait for eCPU bootup */ | ||
| 21587 | + if (OK != acxmem_s_verify_init(adev)) { | ||
| 21588 | + msg = "timeout waiting for eCPU. "; | ||
| 21589 | + goto end_fail; | ||
| 21590 | + } | ||
| 21591 | + log(L_DEBUG, "eCPU has woken up, card is ready to be configured\n"); | ||
| 21592 | + init_mboxes(adev); | ||
| 21593 | + acxmem_write_cmd_type_status(adev, ACX1xx_CMD_RESET, 0); | ||
| 21594 | + | ||
| 21595 | + /* test that EEPROM is readable */ | ||
| 21596 | + read_eeprom_area(adev); | ||
| 21597 | + | ||
| 21598 | + result = OK; | ||
| 21599 | + goto end; | ||
| 21600 | + | ||
| 21601 | +/* Finish error message. Indicate which function failed */ | ||
| 21602 | +end_unlock: | ||
| 21603 | + acx_unlock(adev, flags); | ||
| 21604 | +end_fail: | ||
| 21605 | + printk("acx: %sreset_dev() FAILED\n", msg); | ||
| 21606 | +end: | ||
| 21607 | + FN_EXIT1(result); | ||
| 21608 | + return result; | ||
| 21609 | +} | ||
| 21610 | + | ||
| 21611 | + | ||
| 21612 | +/*********************************************************************** | ||
| 21613 | +** acxmem_s_issue_cmd_timeo | ||
| 21614 | +** | ||
| 21615 | +** Sends command to fw, extract result | ||
| 21616 | +** | ||
| 21617 | +** NB: we do _not_ take lock inside, so be sure to not touch anything | ||
| 21618 | +** which may interfere with IRQ handler operation | ||
| 21619 | +** | ||
| 21620 | +** TODO: busy wait is a bit silly, so: | ||
| 21621 | +** 1) stop doing many iters - go to sleep after first | ||
| 21622 | +** 2) go to waitqueue based approach: wait, not poll! | ||
| 21623 | +*/ | ||
| 21624 | +#undef FUNC | ||
| 21625 | +#define FUNC "issue_cmd" | ||
| 21626 | + | ||
| 21627 | +#if !ACX_DEBUG | ||
| 21628 | +int | ||
| 21629 | +acxmem_s_issue_cmd_timeo( | ||
| 21630 | + acx_device_t *adev, | ||
| 21631 | + unsigned int cmd, | ||
| 21632 | + void *buffer, | ||
| 21633 | + unsigned buflen, | ||
| 21634 | + unsigned cmd_timeout) | ||
| 21635 | +{ | ||
| 21636 | +#else | ||
| 21637 | +int | ||
| 21638 | +acxmem_s_issue_cmd_timeo_debug( | ||
| 21639 | + acx_device_t *adev, | ||
| 21640 | + unsigned cmd, | ||
| 21641 | + void *buffer, | ||
| 21642 | + unsigned buflen, | ||
| 21643 | + unsigned cmd_timeout, | ||
| 21644 | + const char* cmdstr) | ||
| 21645 | +{ | ||
| 21646 | + unsigned long start = jiffies; | ||
| 21647 | +#endif | ||
| 21648 | + const char *devname; | ||
| 21649 | + unsigned counter; | ||
| 21650 | + u16 irqtype; | ||
| 21651 | + int i, j; | ||
| 21652 | + u8 *p; | ||
| 21653 | + u16 cmd_status; | ||
| 21654 | + unsigned long timeout; | ||
| 21655 | + | ||
| 21656 | + FN_ENTER; | ||
| 21657 | + | ||
| 21658 | + devname = adev->ndev->name; | ||
| 21659 | + if (!devname || !devname[0] || devname[4]=='%') | ||
| 21660 | + devname = "acx"; | ||
| 21661 | + | ||
| 21662 | + log(L_CTL, FUNC"(cmd:%s,buflen:%u,timeout:%ums,type:0x%04X)\n", | ||
| 21663 | + cmdstr, buflen, cmd_timeout, | ||
| 21664 | + buffer ? le16_to_cpu(((acx_ie_generic_t *)buffer)->type) : -1); | ||
| 21665 | + | ||
| 21666 | + if (!(adev->dev_state_mask & ACX_STATE_FW_LOADED)) { | ||
| 21667 | + printk("%s: "FUNC"(): firmware is not loaded yet, " | ||
| 21668 | + "cannot execute commands!\n", devname); | ||
| 21669 | + goto bad; | ||
| 21670 | + } | ||
| 21671 | + | ||
| 21672 | + if ((acx_debug & L_DEBUG) && (cmd != ACX1xx_CMD_INTERROGATE)) { | ||
| 21673 | + printk("input buffer (len=%u):\n", buflen); | ||
| 21674 | + acx_dump_bytes(buffer, buflen); | ||
| 21675 | + } | ||
| 21676 | + | ||
| 21677 | + /* wait for firmware to become idle for our command submission */ | ||
| 21678 | + timeout = HZ/5; | ||
| 21679 | + counter = (timeout * 1000 / HZ) - 1; /* in ms */ | ||
| 21680 | + timeout += jiffies; | ||
| 21681 | + do { | ||
| 21682 | + cmd_status = acxmem_read_cmd_type_status(adev); | ||
| 21683 | + /* Test for IDLE state */ | ||
| 21684 | + if (!cmd_status) | ||
| 21685 | + break; | ||
| 21686 | + if (counter % 8 == 0) { | ||
| 21687 | + if (time_after(jiffies, timeout)) { | ||
| 21688 | + counter = 0; | ||
| 21689 | + break; | ||
| 21690 | + } | ||
| 21691 | + /* we waited 8 iterations, no luck. Sleep 8 ms */ | ||
| 21692 | + acx_s_msleep(8); | ||
| 21693 | + } | ||
| 21694 | + } while (likely(--counter)); | ||
| 21695 | + | ||
| 21696 | + if (!counter) { | ||
| 21697 | + /* the card doesn't get idle, we're in trouble */ | ||
| 21698 | + printk("%s: "FUNC"(): cmd_status is not IDLE: 0x%04X!=0\n", | ||
| 21699 | + devname, cmd_status); | ||
| 21700 | +#if DUMP_IF_SLOW > 0 | ||
| 21701 | + dump_acxmem (adev, 0, 0x10000); | ||
| 21702 | + panic ("not idle"); | ||
| 21703 | +#endif | ||
| 21704 | + goto bad; | ||
| 21705 | + } else if (counter < 190) { /* if waited >10ms... */ | ||
| 21706 | + log(L_CTL|L_DEBUG, FUNC"(): waited for IDLE %dms. " | ||
| 21707 | + "Please report\n", 199 - counter); | ||
| 21708 | + } | ||
| 21709 | + | ||
| 21710 | + /* now write the parameters of the command if needed */ | ||
| 21711 | + if (buffer && buflen) { | ||
| 21712 | + /* if it's an INTERROGATE command, just pass the length | ||
| 21713 | + * of parameters to read, as data */ | ||
| 21714 | +#if CMD_DISCOVERY | ||
| 21715 | + if (cmd == ACX1xx_CMD_INTERROGATE) | ||
| 21716 | + memset_io(adev->cmd_area + 4, 0xAA, buflen); | ||
| 21717 | +#endif | ||
| 21718 | + /* | ||
| 21719 | + * slave memory version | ||
| 21720 | + */ | ||
| 21721 | + copy_to_slavemem (adev, (u32) (adev->cmd_area + 4), buffer, | ||
| 21722 | + (cmd == ACX1xx_CMD_INTERROGATE) ? 4 : buflen); | ||
| 21723 | + } | ||
| 21724 | + /* now write the actual command type */ | ||
| 21725 | + acxmem_write_cmd_type_status(adev, cmd, 0); | ||
| 21726 | + | ||
| 21727 | + /* clear CMD_COMPLETE bit. can be set only by IRQ handler: */ | ||
| 21728 | + adev->irq_status &= ~HOST_INT_CMD_COMPLETE; | ||
| 21729 | + | ||
| 21730 | + /* execute command */ | ||
| 21731 | + write_reg16(adev, IO_ACX_INT_TRIG, INT_TRIG_CMD); | ||
| 21732 | + write_flush(adev); | ||
| 21733 | + | ||
| 21734 | + /* wait for firmware to process command */ | ||
| 21735 | + | ||
| 21736 | + /* Ensure nonzero and not too large timeout. | ||
| 21737 | + ** Also converts e.g. 100->99, 200->199 | ||
| 21738 | + ** which is nice but not essential */ | ||
| 21739 | + cmd_timeout = (cmd_timeout-1) | 1; | ||
| 21740 | + if (unlikely(cmd_timeout > 1199)) | ||
| 21741 | + cmd_timeout = 1199; | ||
| 21742 | + | ||
| 21743 | + /* we schedule away sometimes (timeout can be large) */ | ||
| 21744 | + counter = cmd_timeout; | ||
| 21745 | + timeout = jiffies + cmd_timeout * HZ / 1000; | ||
| 21746 | + do { | ||
| 21747 | + if (!adev->irqs_active) { /* IRQ disabled: poll */ | ||
| 21748 | + irqtype = read_reg16(adev, IO_ACX_IRQ_STATUS_NON_DES); | ||
| 21749 | + if (irqtype & HOST_INT_CMD_COMPLETE) { | ||
| 21750 | + write_reg16(adev, IO_ACX_IRQ_ACK, | ||
| 21751 | + HOST_INT_CMD_COMPLETE); | ||
| 21752 | + break; | ||
| 21753 | + } | ||
| 21754 | + } else { /* Wait when IRQ will set the bit */ | ||
| 21755 | + irqtype = adev->irq_status; | ||
| 21756 | + if (irqtype & HOST_INT_CMD_COMPLETE) | ||
| 21757 | + break; | ||
| 21758 | + } | ||
| 21759 | + | ||
| 21760 | + if (counter % 8 == 0) { | ||
| 21761 | + if (time_after(jiffies, timeout)) { | ||
| 21762 | + counter = 0; | ||
| 21763 | + break; | ||
| 21764 | + } | ||
| 21765 | + /* we waited 8 iterations, no luck. Sleep 8 ms */ | ||
| 21766 | + acx_s_msleep(8); | ||
| 21767 | + } | ||
| 21768 | + } while (likely(--counter)); | ||
| 21769 | + | ||
| 21770 | + /* save state for debugging */ | ||
| 21771 | + cmd_status = acxmem_read_cmd_type_status(adev); | ||
| 21772 | + | ||
| 21773 | + /* put the card in IDLE state */ | ||
| 21774 | + acxmem_write_cmd_type_status(adev, ACX1xx_CMD_RESET, 0); | ||
| 21775 | + | ||
| 21776 | + if (!counter) { /* timed out! */ | ||
| 21777 | + printk("%s: "FUNC"(): timed out %s for CMD_COMPLETE. " | ||
| 21778 | + "irq bits:0x%04X irq_status:0x%04X timeout:%dms " | ||
| 21779 | + "cmd_status:%d (%s)\n", | ||
| 21780 | + devname, (adev->irqs_active) ? "waiting" : "polling", | ||
| 21781 | + irqtype, adev->irq_status, cmd_timeout, | ||
| 21782 | + cmd_status, acx_cmd_status_str(cmd_status)); | ||
| 21783 | + printk("%s: "FUNC"(): device irq status 0x%04x\n", | ||
| 21784 | + devname, read_reg16(adev, IO_ACX_IRQ_STATUS_NON_DES)); | ||
| 21785 | + printk("%s: "FUNC"(): IO_ACX_IRQ_MASK 0x%04x IO_ACX_FEMR 0x%04x\n", | ||
| 21786 | + devname, | ||
| 21787 | + read_reg16 (adev, IO_ACX_IRQ_MASK), | ||
| 21788 | + read_reg16 (adev, IO_ACX_FEMR)); | ||
| 21789 | + if (read_reg16 (adev, IO_ACX_IRQ_MASK) == 0xffff) { | ||
| 21790 | + printk ("acxmem: firmware probably hosed - reloading\n"); | ||
| 21791 | +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 11) | ||
| 21792 | + { | ||
| 21793 | + pm_message_t state; | ||
| 21794 | + acxmem_e_suspend (resume_pdev, state); | ||
| 21795 | + } | ||
| 21796 | +#else | ||
| 21797 | + acxmem_e_suspend (adev->dev, 0); | ||
| 21798 | +#endif | ||
| 21799 | + { | ||
| 21800 | + struct work_struct *notused; | ||
| 21801 | + fw_resumer (notused); | ||
| 21802 | + } | ||
| 21803 | + } | ||
| 21804 | + | ||
| 21805 | + goto bad; | ||
| 21806 | + } else if (cmd_timeout - counter > 30) { /* if waited >30ms... */ | ||
| 21807 | + log(L_CTL|L_DEBUG, FUNC"(): %s for CMD_COMPLETE %dms. " | ||
| 21808 | + "count:%d. Please report\n", | ||
| 21809 | + (adev->irqs_active) ? "waited" : "polled", | ||
| 21810 | + cmd_timeout - counter, counter); | ||
| 21811 | + } | ||
| 21812 | + | ||
| 21813 | + if (1 != cmd_status) { /* it is not a 'Success' */ | ||
| 21814 | + printk("%s: "FUNC"(): cmd_status is not SUCCESS: %d (%s). " | ||
| 21815 | + "Took %dms of %d\n", | ||
| 21816 | + devname, cmd_status, acx_cmd_status_str(cmd_status), | ||
| 21817 | + cmd_timeout - counter, cmd_timeout); | ||
| 21818 | + /* zero out result buffer | ||
| 21819 | + * WARNING: this will trash stack in case of illegally large input | ||
| 21820 | + * length! */ | ||
| 21821 | + if (buflen > 388) { | ||
| 21822 | + /* | ||
| 21823 | + * 388 is maximum command length | ||
| 21824 | + */ | ||
| 21825 | + printk ("invalid length 0x%08x\n", buflen); | ||
| 21826 | + buflen = 388; | ||
| 21827 | + } | ||
| 21828 | + p = (u8 *) buffer; | ||
| 21829 | + for (i = 0; i < buflen; i+= 16) { | ||
| 21830 | + printk ("%04x:", i); | ||
| 21831 | + for (j = 0; (j < 16) && (i+j < buflen); j++) { | ||
| 21832 | + printk (" %02x", *p++); | ||
| 21833 | + } | ||
| 21834 | + printk ("\n"); | ||
| 21835 | + } | ||
| 21836 | + | ||
| 21837 | + if (buffer && buflen) | ||
| 21838 | + memset(buffer, 0, buflen); | ||
| 21839 | + goto bad; | ||
| 21840 | + } | ||
| 21841 | + | ||
| 21842 | + /* read in result parameters if needed */ | ||
| 21843 | + if (buffer && buflen && (cmd == ACX1xx_CMD_INTERROGATE)) { | ||
| 21844 | + copy_from_slavemem (adev, buffer, (u32) (adev->cmd_area + 4), buflen); | ||
| 21845 | + if (acx_debug & L_DEBUG) { | ||
| 21846 | + printk("output buffer (len=%u): ", buflen); | ||
| 21847 | + acx_dump_bytes(buffer, buflen); | ||
| 21848 | + } | ||
| 21849 | + } | ||
| 21850 | + | ||
| 21851 | +/* ok: */ | ||
| 21852 | + log(L_CTL, FUNC"(%s): took %ld jiffies to complete\n", | ||
| 21853 | + cmdstr, jiffies - start); | ||
| 21854 | + FN_EXIT1(OK); | ||
| 21855 | + return OK; | ||
| 21856 | + | ||
| 21857 | +bad: | ||
| 21858 | + /* Give enough info so that callers can avoid | ||
| 21859 | + ** printing their own diagnostic messages */ | ||
| 21860 | +#if ACX_DEBUG | ||
| 21861 | + printk("%s: "FUNC"(cmd:%s) FAILED\n", devname, cmdstr); | ||
| 21862 | +#else | ||
| 21863 | + printk("%s: "FUNC"(cmd:0x%04X) FAILED\n", devname, cmd); | ||
| 21864 | +#endif | ||
| 21865 | + dump_stack(); | ||
| 21866 | + FN_EXIT1(NOT_OK); | ||
| 21867 | + return NOT_OK; | ||
| 21868 | +} | ||
| 21869 | + | ||
| 21870 | + | ||
| 21871 | +/*********************************************************************** | ||
| 21872 | +*/ | ||
| 21873 | +#if defined(NONESSENTIAL_FEATURES) | ||
| 21874 | +typedef struct device_id { | ||
| 21875 | + unsigned char id[6]; | ||
| 21876 | + char *descr; | ||
| 21877 | + char *type; | ||
| 21878 | +} device_id_t; | ||
| 21879 | + | ||
| 21880 | +static const device_id_t | ||
| 21881 | +device_ids[] = | ||
| 21882 | +{ | ||
| 21883 | + { | ||
| 21884 | + {'G', 'l', 'o', 'b', 'a', 'l'}, | ||
| 21885 | + NULL, | ||
| 21886 | + NULL, | ||
| 21887 | + }, | ||
| 21888 | + { | ||
| 21889 | + {0xff, 0xff, 0xff, 0xff, 0xff, 0xff}, | ||
| 21890 | + "uninitialized", | ||
| 21891 | + "SpeedStream SS1021 or Gigafast WF721-AEX" | ||
| 21892 | + }, | ||
| 21893 | + { | ||
| 21894 | + {0x80, 0x81, 0x82, 0x83, 0x84, 0x85}, | ||
| 21895 | + "non-standard", | ||
| 21896 | + "DrayTek Vigor 520" | ||
| 21897 | + }, | ||
| 21898 | + { | ||
| 21899 | + {'?', '?', '?', '?', '?', '?'}, | ||
| 21900 | + "non-standard", | ||
| 21901 | + "Level One WPC-0200" | ||
| 21902 | + }, | ||
| 21903 | + { | ||
| 21904 | + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, | ||
| 21905 | + "empty", | ||
| 21906 | + "DWL-650+ variant" | ||
| 21907 | + } | ||
| 21908 | +}; | ||
| 21909 | + | ||
| 21910 | +static void | ||
| 21911 | +acx_show_card_eeprom_id(acx_device_t *adev) | ||
| 21912 | +{ | ||
| 21913 | + unsigned char buffer[CARD_EEPROM_ID_SIZE]; | ||
| 21914 | + int i; | ||
| 21915 | + | ||
| 21916 | + memset(&buffer, 0, CARD_EEPROM_ID_SIZE); | ||
| 21917 | + /* use direct EEPROM access */ | ||
| 21918 | + for (i = 0; i < CARD_EEPROM_ID_SIZE; i++) { | ||
| 21919 | + if (OK != acxmem_read_eeprom_byte(adev, | ||
| 21920 | + ACX100_EEPROM_ID_OFFSET + i, | ||
| 21921 | + &buffer[i])) { | ||
| 21922 | + printk("acx: reading EEPROM FAILED\n"); | ||
| 21923 | + break; | ||
| 21924 | + } | ||
| 21925 | + } | ||
| 21926 | + | ||
| 21927 | + for (i = 0; i < VEC_SIZE(device_ids); i++) { | ||
| 21928 | + if (!memcmp(&buffer, device_ids[i].id, CARD_EEPROM_ID_SIZE)) { | ||
| 21929 | + if (device_ids[i].descr) { | ||
| 21930 | + printk("acx: EEPROM card ID string check " | ||
| 21931 | + "found %s card ID: is this %s?\n", | ||
| 21932 | + device_ids[i].descr, device_ids[i].type); | ||
| 21933 | + } | ||
| 21934 | + break; | ||
| 21935 | + } | ||
| 21936 | + } | ||
| 21937 | + if (i == VEC_SIZE(device_ids)) { | ||
| 21938 | + printk("acx: EEPROM card ID string check found " | ||
| 21939 | + "unknown card: expected 'Global', got '%.*s\'. " | ||
| 21940 | + "Please report\n", CARD_EEPROM_ID_SIZE, buffer); | ||
| 21941 | + } | ||
| 21942 | +} | ||
| 21943 | +#endif /* NONESSENTIAL_FEATURES */ | ||
| 21944 | + | ||
| 21945 | +/*********************************************************************** | ||
| 21946 | +** acxmem_free_desc_queues | ||
| 21947 | +** | ||
| 21948 | +** Releases the queues that have been allocated, the | ||
| 21949 | +** others have been initialised to NULL so this | ||
| 21950 | +** function can be used if only part of the queues were allocated. | ||
| 21951 | +*/ | ||
| 21952 | + | ||
| 21953 | +void | ||
| 21954 | +acxmem_free_desc_queues(acx_device_t *adev) | ||
| 21955 | +{ | ||
| 21956 | +#define ACX_FREE_QUEUE(size, ptr, phyaddr) \ | ||
| 21957 | + if (ptr) { \ | ||
| 21958 | + kfree(ptr); \ | ||
| 21959 | + ptr = NULL; \ | ||
| 21960 | + size = 0; \ | ||
| 21961 | + } | ||
| 21962 | + | ||
| 21963 | + FN_ENTER; | ||
| 21964 | + | ||
| 21965 | + ACX_FREE_QUEUE(adev->txhostdesc_area_size, adev->txhostdesc_start, adev->txhostdesc_startphy); | ||
| 21966 | + ACX_FREE_QUEUE(adev->txbuf_area_size, adev->txbuf_start, adev->txbuf_startphy); | ||
| 21967 | + | ||
| 21968 | + adev->txdesc_start = NULL; | ||
| 21969 | + | ||
| 21970 | + ACX_FREE_QUEUE(adev->rxhostdesc_area_size, adev->rxhostdesc_start, adev->rxhostdesc_startphy); | ||
| 21971 | + ACX_FREE_QUEUE(adev->rxbuf_area_size, adev->rxbuf_start, adev->rxbuf_startphy); | ||
| 21972 | + | ||
| 21973 | + adev->rxdesc_start = NULL; | ||
| 21974 | + | ||
| 21975 | + FN_EXIT0; | ||
| 21976 | +} | ||
| 21977 | + | ||
| 21978 | + | ||
| 21979 | +/*********************************************************************** | ||
| 21980 | +** acxmem_s_delete_dma_regions | ||
| 21981 | +*/ | ||
| 21982 | +static void | ||
| 21983 | +acxmem_s_delete_dma_regions(acx_device_t *adev) | ||
| 21984 | +{ | ||
| 21985 | + unsigned long flags; | ||
| 21986 | + | ||
| 21987 | + FN_ENTER; | ||
| 21988 | + /* disable radio Tx/Rx. Shouldn't we use the firmware commands | ||
| 21989 | + * here instead? Or are we that much down the road that it's no | ||
| 21990 | + * longer possible here? */ | ||
| 21991 | + /* | ||
| 21992 | + * slave memory interface really doesn't like this. | ||
| 21993 | + */ | ||
| 21994 | + /* | ||
| 21995 | + write_reg16(adev, IO_ACX_ENABLE, 0); | ||
| 21996 | + */ | ||
| 21997 | + | ||
| 21998 | + acx_s_msleep(100); | ||
| 21999 | + | ||
| 22000 | + acx_lock(adev, flags); | ||
| 22001 | + acxmem_free_desc_queues(adev); | ||
| 22002 | + acx_unlock(adev, flags); | ||
| 22003 | + | ||
| 22004 | + FN_EXIT0; | ||
| 22005 | +} | ||
| 22006 | + | ||
| 22007 | + | ||
| 22008 | +/*********************************************************************** | ||
| 22009 | +** acxmem_e_probe | ||
| 22010 | +** | ||
| 22011 | +** Probe routine called when a PCI device w/ matching ID is found. | ||
| 22012 | +** Here's the sequence: | ||
| 22013 | +** - Allocate the PCI resources. | ||
| 22014 | +** - Read the PCMCIA attribute memory to make sure we have a WLAN card | ||
| 22015 | +** - Reset the MAC | ||
| 22016 | +** - Initialize the dev and wlan data | ||
| 22017 | +** - Initialize the MAC | ||
| 22018 | +** | ||
| 22019 | +** pdev - ptr to pci device structure containing info about pci configuration | ||
| 22020 | +** id - ptr to the device id entry that matched this device | ||
| 22021 | +*/ | ||
| 22022 | +static const u16 | ||
| 22023 | +IO_ACX100[] = | ||
| 22024 | +{ | ||
| 22025 | + 0x0000, /* IO_ACX_SOFT_RESET */ | ||
| 22026 | + | ||
| 22027 | + 0x0014, /* IO_ACX_SLV_MEM_ADDR */ | ||
| 22028 | + 0x0018, /* IO_ACX_SLV_MEM_DATA */ | ||
| 22029 | + 0x001c, /* IO_ACX_SLV_MEM_CTL */ | ||
| 22030 | + 0x0020, /* IO_ACX_SLV_END_CTL */ | ||
| 22031 | + | ||
| 22032 | + 0x0034, /* IO_ACX_FEMR */ | ||
| 22033 | + | ||
| 22034 | + 0x007c, /* IO_ACX_INT_TRIG */ | ||
| 22035 | + 0x0098, /* IO_ACX_IRQ_MASK */ | ||
| 22036 | + 0x00a4, /* IO_ACX_IRQ_STATUS_NON_DES */ | ||
| 22037 | + 0x00a8, /* IO_ACX_IRQ_STATUS_CLEAR */ | ||
| 22038 | + 0x00ac, /* IO_ACX_IRQ_ACK */ | ||
| 22039 | + 0x00b0, /* IO_ACX_HINT_TRIG */ | ||
| 22040 | + | ||
| 22041 | + 0x0104, /* IO_ACX_ENABLE */ | ||
| 22042 | + | ||
| 22043 | + 0x0250, /* IO_ACX_EEPROM_CTL */ | ||
| 22044 | + 0x0254, /* IO_ACX_EEPROM_ADDR */ | ||
| 22045 | + 0x0258, /* IO_ACX_EEPROM_DATA */ | ||
| 22046 | + 0x025c, /* IO_ACX_EEPROM_CFG */ | ||
| 22047 | + | ||
| 22048 | + 0x0268, /* IO_ACX_PHY_ADDR */ | ||
| 22049 | + 0x026c, /* IO_ACX_PHY_DATA */ | ||
| 22050 | + 0x0270, /* IO_ACX_PHY_CTL */ | ||
| 22051 | + | ||
| 22052 | + 0x0290, /* IO_ACX_GPIO_OE */ | ||
| 22053 | + | ||
| 22054 | + 0x0298, /* IO_ACX_GPIO_OUT */ | ||
| 22055 | + | ||
| 22056 | + 0x02a4, /* IO_ACX_CMD_MAILBOX_OFFS */ | ||
| 22057 | + 0x02a8, /* IO_ACX_INFO_MAILBOX_OFFS */ | ||
| 22058 | + 0x02ac, /* IO_ACX_EEPROM_INFORMATION */ | ||
| 22059 | + | ||
| 22060 | + 0x02d0, /* IO_ACX_EE_START */ | ||
| 22061 | + 0x02d4, /* IO_ACX_SOR_CFG */ | ||
| 22062 | + 0x02d8 /* IO_ACX_ECPU_CTRL */ | ||
| 22063 | +}; | ||
| 22064 | + | ||
| 22065 | +static const u16 | ||
| 22066 | +IO_ACX111[] = | ||
| 22067 | +{ | ||
| 22068 | + 0x0000, /* IO_ACX_SOFT_RESET */ | ||
| 22069 | + | ||
| 22070 | + 0x0014, /* IO_ACX_SLV_MEM_ADDR */ | ||
| 22071 | + 0x0018, /* IO_ACX_SLV_MEM_DATA */ | ||
| 22072 | + 0x001c, /* IO_ACX_SLV_MEM_CTL */ | ||
| 22073 | + 0x0020, /* IO_ACX_SLV_MEM_CP */ | ||
| 22074 | + | ||
| 22075 | + 0x0034, /* IO_ACX_FEMR */ | ||
| 22076 | + | ||
| 22077 | + 0x00b4, /* IO_ACX_INT_TRIG */ | ||
| 22078 | + 0x00d4, /* IO_ACX_IRQ_MASK */ | ||
| 22079 | + /* we do mean NON_DES (0xf0), not NON_DES_MASK which is at 0xe0: */ | ||
| 22080 | + 0x00f0, /* IO_ACX_IRQ_STATUS_NON_DES */ | ||
| 22081 | + 0x00e4, /* IO_ACX_IRQ_STATUS_CLEAR */ | ||
| 22082 | + 0x00e8, /* IO_ACX_IRQ_ACK */ | ||
| 22083 | + 0x00ec, /* IO_ACX_HINT_TRIG */ | ||
| 22084 | + | ||
| 22085 | + 0x01d0, /* IO_ACX_ENABLE */ | ||
| 22086 | + | ||
| 22087 | + 0x0338, /* IO_ACX_EEPROM_CTL */ | ||
| 22088 | + 0x033c, /* IO_ACX_EEPROM_ADDR */ | ||
| 22089 | + 0x0340, /* IO_ACX_EEPROM_DATA */ | ||
| 22090 | + 0x0344, /* IO_ACX_EEPROM_CFG */ | ||
| 22091 | + | ||
| 22092 | + 0x0350, /* IO_ACX_PHY_ADDR */ | ||
| 22093 | + 0x0354, /* IO_ACX_PHY_DATA */ | ||
| 22094 | + 0x0358, /* IO_ACX_PHY_CTL */ | ||
| 22095 | + | ||
| 22096 | + 0x0374, /* IO_ACX_GPIO_OE */ | ||
| 22097 | + | ||
| 22098 | + 0x037c, /* IO_ACX_GPIO_OUT */ | ||
| 22099 | + | ||
| 22100 | + 0x0388, /* IO_ACX_CMD_MAILBOX_OFFS */ | ||
| 22101 | + 0x038c, /* IO_ACX_INFO_MAILBOX_OFFS */ | ||
| 22102 | + 0x0390, /* IO_ACX_EEPROM_INFORMATION */ | ||
| 22103 | + | ||
| 22104 | + 0x0100, /* IO_ACX_EE_START */ | ||
| 22105 | + 0x0104, /* IO_ACX_SOR_CFG */ | ||
| 22106 | + 0x0108, /* IO_ACX_ECPU_CTRL */ | ||
| 22107 | +}; | ||
| 22108 | + | ||
| 22109 | +static void | ||
| 22110 | +dummy_netdev_init(struct net_device *ndev) {} | ||
| 22111 | + | ||
| 22112 | +/* | ||
| 22113 | + * Most of the acx specific pieces of hardware reset. | ||
| 22114 | + */ | ||
| 22115 | +static int | ||
| 22116 | +acxmem_complete_hw_reset (acx_device_t *adev) | ||
| 22117 | +{ | ||
| 22118 | + acx111_ie_configoption_t co; | ||
| 22119 | + | ||
| 22120 | + /* NB: read_reg() reads may return bogus data before reset_dev(), | ||
| 22121 | + * since the firmware which directly controls large parts of the I/O | ||
| 22122 | + * registers isn't initialized yet. | ||
| 22123 | + * acx100 seems to be more affected than acx111 */ | ||
| 22124 | + if (OK != acxmem_s_reset_dev (adev)) | ||
| 22125 | + return -1; | ||
| 22126 | + | ||
| 22127 | + if (IS_ACX100(adev)) { | ||
| 22128 | + /* ACX100: configopt struct in cmd mailbox - directly after reset */ | ||
| 22129 | + copy_from_slavemem (adev, (u8*) &co, (u32) adev->cmd_area, sizeof (co)); | ||
| 22130 | + } | ||
| 22131 | + | ||
| 22132 | + if (OK != acx_s_init_mac(adev)) | ||
| 22133 | + return -3; | ||
| 22134 | + | ||
| 22135 | + if (IS_ACX111(adev)) { | ||
| 22136 | + /* ACX111: configopt struct needs to be queried after full init */ | ||
| 22137 | + acx_s_interrogate(adev, &co, ACX111_IE_CONFIG_OPTIONS); | ||
| 22138 | + } | ||
| 22139 | + | ||
| 22140 | + /* | ||
| 22141 | + * Set up transmit buffer administration | ||
| 22142 | + */ | ||
| 22143 | + init_acx_txbuf (adev); | ||
| 22144 | + | ||
| 22145 | + /* | ||
| 22146 | + * Windows driver writes 0x01000000 to register 0x288, RADIO_CTL, if the form factor | ||
| 22147 | + * is 3. It also write protects the EEPROM by writing 1<<9 to GPIO_OUT | ||
| 22148 | + */ | ||
| 22149 | + if (adev->form_factor == 3) { | ||
| 22150 | + set_regbits (adev, 0x288, 0x01000000); | ||
| 22151 | + set_regbits (adev, 0x298, 1<<9); | ||
| 22152 | + } | ||
| 22153 | + | ||
| 22154 | +/* TODO: merge them into one function, they are called just once and are the same for pci & usb */ | ||
| 22155 | + if (OK != acxmem_read_eeprom_byte(adev, 0x05, &adev->eeprom_version)) | ||
| 22156 | + return -2; | ||
| 22157 | + | ||
| 22158 | + acx_s_parse_configoption(adev, &co); | ||
| 22159 | + acx_s_get_firmware_version(adev); /* needs to be after acx_s_init_mac() */ | ||
| 22160 | + acx_display_hardware_details(adev); | ||
| 22161 | + | ||
| 22162 | + return 0; | ||
| 22163 | +} | ||
| 22164 | + | ||
| 22165 | +static int __devinit | ||
| 22166 | +acxmem_e_probe(struct platform_device *pdev) | ||
| 22167 | +{ | ||
| 22168 | + struct acx_hardware_data *hwdata = pdev->dev.platform_data; | ||
| 22169 | + acx_device_t *adev = NULL; | ||
| 22170 | + struct net_device *ndev = NULL; | ||
| 22171 | + const char *chip_name; | ||
| 22172 | + int result = -EIO; | ||
| 22173 | + int err; | ||
| 22174 | + int i; | ||
| 22175 | + unsigned long addr_size=0; | ||
| 22176 | + u8 chip_type; | ||
| 22177 | + | ||
| 22178 | + FN_ENTER; | ||
| 22179 | + (void) hwdata->start_hw(); | ||
| 22180 | + | ||
| 22181 | + /* FIXME: prism54 calls pci_set_mwi() here, | ||
| 22182 | + * should we do/support the same? */ | ||
| 22183 | + | ||
| 22184 | + /* chiptype is u8 but id->driver_data is ulong | ||
| 22185 | + ** Works for now (possible values are 1 and 2) */ | ||
| 22186 | + chip_type = CHIPTYPE_ACX100; | ||
| 22187 | + /* acx100 and acx111 have different PCI memory regions */ | ||
| 22188 | + if (chip_type == CHIPTYPE_ACX100) { | ||
| 22189 | + chip_name = "ACX100"; | ||
| 22190 | + } else if (chip_type == CHIPTYPE_ACX111) { | ||
| 22191 | + chip_name = "ACX111"; | ||
| 22192 | + } else { | ||
| 22193 | + printk("acx: unknown chip type 0x%04X\n", chip_type); | ||
| 22194 | + goto fail_unknown_chiptype; | ||
| 22195 | + } | ||
| 22196 | + | ||
| 22197 | + printk("acx: found %s-based wireless network card\n", chip_name); | ||
| 22198 | + log(L_ANY, "initial debug setting is 0x%04X\n", acx_debug); | ||
| 22199 | + | ||
| 22200 | + ndev = alloc_netdev(sizeof(*adev), "wlan%d", dummy_netdev_init); | ||
| 22201 | + /* (NB: memsets to 0 entire area) */ | ||
| 22202 | + if (!ndev) { | ||
| 22203 | + printk("acx: no memory for netdevice struct\n"); | ||
| 22204 | + goto fail_alloc_netdev; | ||
| 22205 | + } | ||
| 22206 | + | ||
| 22207 | + platform_set_drvdata (pdev, ndev); | ||
| 22208 | + | ||
| 22209 | + ether_setup(ndev); | ||
| 22210 | + | ||
| 22211 | + /* | ||
| 22212 | + * use platform_data resources that were provided | ||
| 22213 | + */ | ||
| 22214 | + ndev->irq = 0; | ||
| 22215 | + for (i=0; i<pdev->num_resources; i++) { | ||
| 22216 | + if (pdev->resource[i].flags == IORESOURCE_IRQ) { | ||
| 22217 | + ndev->irq = pdev->resource[i].start; | ||
| 22218 | + } | ||
| 22219 | + else if (pdev->resource[i].flags == IORESOURCE_MEM) { | ||
| 22220 | + ndev->base_addr = pdev->resource[i].start; | ||
| 22221 | + addr_size = pdev->resource[i].end - pdev->resource[i].start; | ||
| 22222 | + } | ||
| 22223 | + } | ||
| 22224 | + if (addr_size == 0 || ndev->irq == 0) | ||
| 22225 | + goto fail_hw_params; | ||
| 22226 | + ndev->open = &acxmem_e_open; | ||
| 22227 | + ndev->stop = &acxmem_e_close; | ||
| 22228 | + pdev->dev.release = &acxmem_e_release; | ||
| 22229 | + ndev->hard_start_xmit = &acx_i_start_xmit; | ||
| 22230 | + ndev->get_stats = &acx_e_get_stats; | ||
| 22231 | +#if IW_HANDLER_VERSION <= 5 | ||
| 22232 | + ndev->get_wireless_stats = &acx_e_get_wireless_stats; | ||
| 22233 | +#endif | ||
| 22234 | + ndev->wireless_handlers = (struct iw_handler_def *)&acx_ioctl_handler_def; | ||
| 22235 | + ndev->set_multicast_list = &acxmem_i_set_multicast_list; | ||
| 22236 | + ndev->tx_timeout = &acxmem_i_tx_timeout; | ||
| 22237 | + ndev->change_mtu = &acx_e_change_mtu; | ||
| 22238 | + ndev->watchdog_timeo = 4 * HZ; | ||
| 22239 | + | ||
| 22240 | + adev = ndev2adev(ndev); | ||
| 22241 | + spin_lock_init(&adev->lock); /* initial state: unlocked */ | ||
| 22242 | + spin_lock_init(&adev->txbuf_lock); | ||
| 22243 | + /* We do not start with downed sem: we want PARANOID_LOCKING to work */ | ||
| 22244 | + sema_init(&adev->sem, 1); /* initial state: 1 (upped) */ | ||
| 22245 | + /* since nobody can see new netdev yet, we can as well | ||
| 22246 | + ** just _presume_ that we're under sem (instead of actually taking it): */ | ||
| 22247 | + /* acx_sem_lock(adev); */ | ||
| 22248 | + adev->dev = &pdev->dev; | ||
| 22249 | + adev->ndev = ndev; | ||
| 22250 | + adev->dev_type = DEVTYPE_MEM; | ||
| 22251 | + adev->chip_type = chip_type; | ||
| 22252 | + adev->chip_name = chip_name; | ||
| 22253 | + adev->io = (CHIPTYPE_ACX100 == chip_type) ? IO_ACX100 : IO_ACX111; | ||
| 22254 | + adev->membase = (volatile u32 *) ndev->base_addr; | ||
| 22255 | + adev->iobase = (volatile u32 *) ioremap_nocache (ndev->base_addr, addr_size); | ||
| 22256 | + /* to find crashes due to weird driver access | ||
| 22257 | + * to unconfigured interface (ifup) */ | ||
| 22258 | + adev->mgmt_timer.function = (void (*)(unsigned long))0x0000dead; | ||
| 22259 | + | ||
| 22260 | +#if defined(NONESSENTIAL_FEATURES) | ||
| 22261 | + acx_show_card_eeprom_id(adev); | ||
| 22262 | +#endif /* NONESSENTIAL_FEATURES */ | ||
| 22263 | + | ||
| 22264 | +#ifdef SET_MODULE_OWNER | ||
| 22265 | + SET_MODULE_OWNER(ndev); | ||
| 22266 | +#endif | ||
| 22267 | + SET_NETDEV_DEV(ndev, &pdev->dev); | ||
| 22268 | + | ||
| 22269 | + log(L_IRQ|L_INIT, "using IRQ %d\n", ndev->irq); | ||
| 22270 | + | ||
| 22271 | + /* ok, pci setup is finished, now start initializing the card */ | ||
| 22272 | + | ||
| 22273 | + if (OK != acxmem_complete_hw_reset (adev)) | ||
| 22274 | + goto fail_reset; | ||
| 22275 | + | ||
| 22276 | + /* | ||
| 22277 | + * Set up default things for most of the card settings. | ||
| 22278 | + */ | ||
| 22279 | + acx_s_set_defaults(adev); | ||
| 22280 | + | ||
| 22281 | + /* Register the card, AFTER everything else has been set up, | ||
| 22282 | + * since otherwise an ioctl could step on our feet due to | ||
| 22283 | + * firmware operations happening in parallel or uninitialized data */ | ||
| 22284 | + err = register_netdev(ndev); | ||
| 22285 | + if (OK != err) { | ||
| 22286 | + printk("acx: register_netdev() FAILED: %d\n", err); | ||
| 22287 | + goto fail_register_netdev; | ||
| 22288 | + } | ||
| 22289 | + | ||
| 22290 | + acx_proc_register_entries(ndev); | ||
| 22291 | + | ||
| 22292 | + /* Now we have our device, so make sure the kernel doesn't try | ||
| 22293 | + * to send packets even though we're not associated to a network yet */ | ||
| 22294 | + acx_stop_queue(ndev, "on probe"); | ||
| 22295 | + acx_carrier_off(ndev, "on probe"); | ||
| 22296 | + | ||
| 22297 | + /* | ||
| 22298 | + * Set up a default monitor type so that poor combinations of initialization | ||
| 22299 | + * sequences in monitor mode don't end up destroying the hardware type. | ||
| 22300 | + */ | ||
| 22301 | + adev->monitor_type = ARPHRD_ETHER; | ||
| 22302 | + | ||
| 22303 | + /* | ||
| 22304 | + * Register to receive inetaddr notifier changes. This will allow us to | ||
| 22305 | + * catch if the user changes the MAC address of the interface. | ||
| 22306 | + */ | ||
| 22307 | + register_netdevice_notifier(&acx_netdev_notifier); | ||
| 22308 | + | ||
| 22309 | + /* after register_netdev() userspace may start working with dev | ||
| 22310 | + * (in particular, on other CPUs), we only need to up the sem */ | ||
| 22311 | + /* acx_sem_unlock(adev); */ | ||
| 22312 | + | ||
| 22313 | + printk("acx "ACX_RELEASE": net device %s, driver compiled " | ||
| 22314 | + "against wireless extensions %d and Linux %s\n", | ||
| 22315 | + ndev->name, WIRELESS_EXT, UTS_RELEASE); | ||
| 22316 | + | ||
| 22317 | +#if CMD_DISCOVERY | ||
| 22318 | + great_inquisitor(adev); | ||
| 22319 | +#endif | ||
| 22320 | + | ||
| 22321 | + result = OK; | ||
| 22322 | + goto done; | ||
| 22323 | + | ||
| 22324 | + /* error paths: undo everything in reverse order... */ | ||
| 22325 | + | ||
| 22326 | +fail_register_netdev: | ||
| 22327 | + | ||
| 22328 | + acxmem_s_delete_dma_regions(adev); | ||
| 22329 | + | ||
| 22330 | +fail_reset: | ||
| 22331 | +fail_hw_params: | ||
| 22332 | + free_netdev(ndev); | ||
| 22333 | +fail_alloc_netdev: | ||
| 22334 | +fail_unknown_chiptype: | ||
| 22335 | + | ||
| 22336 | + | ||
| 22337 | +done: | ||
| 22338 | + FN_EXIT1(result); | ||
| 22339 | + return result; | ||
| 22340 | +} | ||
| 22341 | + | ||
| 22342 | + | ||
| 22343 | +/*********************************************************************** | ||
| 22344 | +** acxmem_e_remove | ||
| 22345 | +** | ||
| 22346 | +** Shut device down (if not hot unplugged) | ||
| 22347 | +** and deallocate PCI resources for the acx chip. | ||
| 22348 | +** | ||
| 22349 | +** pdev - ptr to PCI device structure containing info about pci configuration | ||
| 22350 | +*/ | ||
| 22351 | +static int __devexit | ||
| 22352 | +acxmem_e_remove(struct platform_device *pdev) | ||
| 22353 | +{ | ||
| 22354 | + struct acx_hardware_data *hwdata = pdev->dev.platform_data; | ||
| 22355 | + struct net_device *ndev; | ||
| 22356 | + acx_device_t *adev; | ||
| 22357 | + unsigned long flags; | ||
| 22358 | + | ||
| 22359 | + FN_ENTER; | ||
| 22360 | + | ||
| 22361 | + ndev = (struct net_device*) platform_get_drvdata(pdev); | ||
| 22362 | + if (!ndev) { | ||
| 22363 | + log(L_DEBUG, "%s: card is unused. Skipping any release code\n", | ||
| 22364 | + __func__); | ||
| 22365 | + goto end; | ||
| 22366 | + } | ||
| 22367 | + | ||
| 22368 | + adev = ndev2adev(ndev); | ||
| 22369 | + | ||
| 22370 | + /* If device wasn't hot unplugged... */ | ||
| 22371 | + if (adev_present(adev)) { | ||
| 22372 | + | ||
| 22373 | + acx_sem_lock(adev); | ||
| 22374 | + | ||
| 22375 | + /* disable both Tx and Rx to shut radio down properly */ | ||
| 22376 | + acx_s_issue_cmd(adev, ACX1xx_CMD_DISABLE_TX, NULL, 0); | ||
| 22377 | + acx_s_issue_cmd(adev, ACX1xx_CMD_DISABLE_RX, NULL, 0); | ||
| 22378 | + | ||
| 22379 | +#ifdef REDUNDANT | ||
| 22380 | + /* put the eCPU to sleep to save power | ||
| 22381 | + * Halting is not possible currently, | ||
| 22382 | + * since not supported by all firmware versions */ | ||
| 22383 | + acx_s_issue_cmd(adev, ACX100_CMD_SLEEP, NULL, 0); | ||
| 22384 | +#endif | ||
| 22385 | + acx_lock(adev, flags); | ||
| 22386 | + | ||
| 22387 | + /* disable power LED to save power :-) */ | ||
| 22388 | + log(L_INIT, "switching off power LED to save power\n"); | ||
| 22389 | + acxmem_l_power_led(adev, 0); | ||
| 22390 | + | ||
| 22391 | + /* stop our eCPU */ | ||
| 22392 | + if (IS_ACX111(adev)) { | ||
| 22393 | + /* FIXME: does this actually keep halting the eCPU? | ||
| 22394 | + * I don't think so... | ||
| 22395 | + */ | ||
| 22396 | + acxmem_l_reset_mac(adev); | ||
| 22397 | + } else { | ||
| 22398 | + u16 temp; | ||
| 22399 | + | ||
| 22400 | + /* halt eCPU */ | ||
| 22401 | + temp = read_reg16(adev, IO_ACX_ECPU_CTRL) | 0x1; | ||
| 22402 | + write_reg16(adev, IO_ACX_ECPU_CTRL, temp); | ||
| 22403 | + write_flush(adev); | ||
| 22404 | + } | ||
| 22405 | + | ||
| 22406 | + acx_unlock(adev, flags); | ||
| 22407 | + | ||
| 22408 | + acx_sem_unlock(adev); | ||
| 22409 | + } | ||
| 22410 | + | ||
| 22411 | + | ||
| 22412 | + /* | ||
| 22413 | + * Unregister the notifier chain | ||
| 22414 | + */ | ||
| 22415 | + unregister_netdevice_notifier(&acx_netdev_notifier); | ||
| 22416 | + | ||
| 22417 | + /* unregister the device to not let the kernel | ||
| 22418 | + * (e.g. ioctls) access a half-deconfigured device | ||
| 22419 | + * NB: this will cause acxmem_e_close() to be called, | ||
| 22420 | + * thus we shouldn't call it under sem! */ | ||
| 22421 | + log(L_INIT, "removing device %s\n", ndev->name); | ||
| 22422 | + unregister_netdev(ndev); | ||
| 22423 | + | ||
| 22424 | + /* unregister_netdev ensures that no references to us left. | ||
| 22425 | + * For paranoid reasons we continue to follow the rules */ | ||
| 22426 | + acx_sem_lock(adev); | ||
| 22427 | + | ||
| 22428 | + if (adev->dev_state_mask & ACX_STATE_IFACE_UP) { | ||
| 22429 | + acxmem_s_down(ndev); | ||
| 22430 | + CLEAR_BIT(adev->dev_state_mask, ACX_STATE_IFACE_UP); | ||
| 22431 | + } | ||
| 22432 | + | ||
| 22433 | + acx_proc_unregister_entries(ndev); | ||
| 22434 | + | ||
| 22435 | + acxmem_s_delete_dma_regions(adev); | ||
| 22436 | + | ||
| 22437 | + /* finally, clean up PCI bus state */ | ||
| 22438 | + if (adev->iobase) iounmap((void *)adev->iobase); | ||
| 22439 | + | ||
| 22440 | + acx_sem_unlock(adev); | ||
| 22441 | + | ||
| 22442 | + /* Free netdev (quite late, | ||
| 22443 | + * since otherwise we might get caught off-guard | ||
| 22444 | + * by a netdev timeout handler execution | ||
| 22445 | + * expecting to see a working dev...) */ | ||
| 22446 | + free_netdev(ndev); | ||
| 22447 | + | ||
| 22448 | + (void) hwdata->stop_hw(); | ||
| 22449 | + | ||
| 22450 | + printk ("e_remove done\n"); | ||
| 22451 | +end: | ||
| 22452 | + FN_EXIT0; | ||
| 22453 | + | ||
| 22454 | + return 0; | ||
| 22455 | +} | ||
| 22456 | + | ||
| 22457 | + | ||
| 22458 | +/*********************************************************************** | ||
| 22459 | +** TODO: PM code needs to be fixed / debugged / tested. | ||
| 22460 | +*/ | ||
| 22461 | +#ifdef CONFIG_PM | ||
| 22462 | +static int | ||
| 22463 | +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 11) | ||
| 22464 | +acxmem_e_suspend(struct platform_device *pdev, pm_message_t state) | ||
| 22465 | +#else | ||
| 22466 | +acxmem_e_suspend(struct device *pdev, u32 state) | ||
| 22467 | +#endif | ||
| 22468 | +{ | ||
| 22469 | + struct net_device *ndev = platform_get_drvdata(pdev); | ||
| 22470 | + acx_device_t *adev; | ||
| 22471 | + struct acx_hardware_data *hwdata; | ||
| 22472 | + | ||
| 22473 | + FN_ENTER; | ||
| 22474 | + printk("acx: suspend handler is experimental!\n"); | ||
| 22475 | + printk("sus: dev %p\n", ndev); | ||
| 22476 | + | ||
| 22477 | + if (!netif_running(ndev)) | ||
| 22478 | + goto end; | ||
| 22479 | + | ||
| 22480 | + adev = ndev2adev(ndev); | ||
| 22481 | + printk("sus: adev %p\n", adev); | ||
| 22482 | + | ||
| 22483 | + hwdata = adev->dev->platform_data; | ||
| 22484 | + | ||
| 22485 | + acx_sem_lock(adev); | ||
| 22486 | + | ||
| 22487 | + netif_device_detach(ndev); /* this one cannot sleep */ | ||
| 22488 | + acxmem_s_down(ndev); | ||
| 22489 | + /* down() does not set it to 0xffff, but here we really want that */ | ||
| 22490 | + write_reg16(adev, IO_ACX_IRQ_MASK, 0xffff); | ||
| 22491 | + write_reg16(adev, IO_ACX_FEMR, 0x0); | ||
| 22492 | + acxmem_s_delete_dma_regions(adev); | ||
| 22493 | + | ||
| 22494 | + /* | ||
| 22495 | + * Turn the ACX chip off. | ||
| 22496 | + */ | ||
| 22497 | + hwdata->stop_hw(); | ||
| 22498 | + | ||
| 22499 | + acx_sem_unlock(adev); | ||
| 22500 | +end: | ||
| 22501 | + FN_EXIT0; | ||
| 22502 | + return OK; | ||
| 22503 | +} | ||
| 22504 | + | ||
| 22505 | + | ||
| 22506 | + | ||
| 22507 | +static void | ||
| 22508 | +fw_resumer(struct work_struct *notused) | ||
| 22509 | +{ | ||
| 22510 | + struct platform_device *pdev = resume_pdev; | ||
| 22511 | + struct net_device *ndev = platform_get_drvdata(pdev); | ||
| 22512 | + acx_device_t *adev; | ||
| 22513 | + struct acx_hardware_data *hwdata; | ||
| 22514 | + | ||
| 22515 | + printk("acx: resume handler is experimental!\n"); | ||
| 22516 | + printk("rsm: got dev %p\n", ndev); | ||
| 22517 | + | ||
| 22518 | + if (!netif_running(ndev)) | ||
| 22519 | + return; | ||
| 22520 | + | ||
| 22521 | + adev = ndev2adev(ndev); | ||
| 22522 | + printk("rsm: got adev %p\n", adev); | ||
| 22523 | + | ||
| 22524 | + acx_sem_lock(adev); | ||
| 22525 | + | ||
| 22526 | + hwdata = adev->dev->platform_data; | ||
| 22527 | + | ||
| 22528 | + /* | ||
| 22529 | + * Turn on the ACX. | ||
| 22530 | + */ | ||
| 22531 | + hwdata->start_hw(); | ||
| 22532 | + | ||
| 22533 | + acxmem_complete_hw_reset (adev); | ||
| 22534 | + | ||
| 22535 | + /* | ||
| 22536 | + * done by acx_s_set_defaults for initial startup | ||
| 22537 | + */ | ||
| 22538 | + acxmem_set_interrupt_mask(adev); | ||
| 22539 | + | ||
| 22540 | + printk ("rsm: bringing up interface\n"); | ||
| 22541 | + SET_BIT (adev->set_mask, GETSET_ALL); | ||
| 22542 | + acxmem_s_up(ndev); | ||
| 22543 | + printk("rsm: acx up done\n"); | ||
| 22544 | + | ||
| 22545 | + /* now even reload all card parameters as they were before suspend, | ||
| 22546 | + * and possibly be back in the network again already :-) | ||
| 22547 | + */ | ||
| 22548 | + /* - most settings updated in acxmem_s_up() | ||
| 22549 | + if (ACX_STATE_IFACE_UP & adev->dev_state_mask) { | ||
| 22550 | + adev->set_mask = GETSET_ALL; | ||
| 22551 | + acx_s_update_card_settings(adev); | ||
| 22552 | + printk("rsm: settings updated\n"); | ||
| 22553 | + } | ||
| 22554 | + */ | ||
| 22555 | + netif_device_attach(ndev); | ||
| 22556 | + printk("rsm: device attached\n"); | ||
| 22557 | + | ||
| 22558 | + acx_sem_unlock(adev); | ||
| 22559 | +} | ||
| 22560 | + | ||
| 22561 | +DECLARE_WORK( fw_resume_work, fw_resumer ); | ||
| 22562 | + | ||
| 22563 | +static int | ||
| 22564 | +acxmem_e_resume(struct platform_device *pdev) | ||
| 22565 | +{ | ||
| 22566 | + FN_ENTER; | ||
| 22567 | + | ||
| 22568 | + resume_pdev = pdev; | ||
| 22569 | + schedule_work( &fw_resume_work ); | ||
| 22570 | + | ||
| 22571 | + FN_EXIT0; | ||
| 22572 | + return OK; | ||
| 22573 | +} | ||
| 22574 | +#endif /* CONFIG_PM */ | ||
| 22575 | + | ||
| 22576 | + | ||
| 22577 | +/*********************************************************************** | ||
| 22578 | +** acxmem_s_up | ||
| 22579 | +** | ||
| 22580 | +** This function is called by acxmem_e_open (when ifconfig sets the device as up) | ||
| 22581 | +** | ||
| 22582 | +** Side effects: | ||
| 22583 | +** - Enables on-card interrupt requests | ||
| 22584 | +** - calls acx_s_start | ||
| 22585 | +*/ | ||
| 22586 | + | ||
| 22587 | +static void | ||
| 22588 | +enable_acx_irq(acx_device_t *adev) | ||
| 22589 | +{ | ||
| 22590 | + FN_ENTER; | ||
| 22591 | + write_reg16(adev, IO_ACX_IRQ_MASK, adev->irq_mask); | ||
| 22592 | + write_reg16(adev, IO_ACX_FEMR, 0x8000); | ||
| 22593 | + adev->irqs_active = 1; | ||
| 22594 | + FN_EXIT0; | ||
| 22595 | +} | ||
| 22596 | + | ||
| 22597 | +static void | ||
| 22598 | +acxmem_s_up(struct net_device *ndev) | ||
| 22599 | +{ | ||
| 22600 | + acx_device_t *adev = ndev2adev(ndev); | ||
| 22601 | + unsigned long flags; | ||
| 22602 | + | ||
| 22603 | + FN_ENTER; | ||
| 22604 | + | ||
| 22605 | + acx_lock(adev, flags); | ||
| 22606 | + enable_acx_irq(adev); | ||
| 22607 | + acx_unlock(adev, flags); | ||
| 22608 | + | ||
| 22609 | + /* acx fw < 1.9.3.e has a hardware timer, and older drivers | ||
| 22610 | + ** used to use it. But we don't do that anymore, our OS | ||
| 22611 | + ** has reliable software timers */ | ||
| 22612 | + init_timer(&adev->mgmt_timer); | ||
| 22613 | + adev->mgmt_timer.function = acx_i_timer; | ||
| 22614 | + adev->mgmt_timer.data = (unsigned long)adev; | ||
| 22615 | + | ||
| 22616 | + /* Need to set ACX_STATE_IFACE_UP first, or else | ||
| 22617 | + ** timer won't be started by acx_set_status() */ | ||
| 22618 | + SET_BIT(adev->dev_state_mask, ACX_STATE_IFACE_UP); | ||
| 22619 | + switch (adev->mode) { | ||
| 22620 | + case ACX_MODE_0_ADHOC: | ||
| 22621 | + case ACX_MODE_2_STA: | ||
| 22622 | + /* actual scan cmd will happen in start() */ | ||
| 22623 | + acx_set_status(adev, ACX_STATUS_1_SCANNING); break; | ||
| 22624 | + case ACX_MODE_3_AP: | ||
| 22625 | + case ACX_MODE_MONITOR: | ||
| 22626 | + acx_set_status(adev, ACX_STATUS_4_ASSOCIATED); break; | ||
| 22627 | + } | ||
| 22628 | + | ||
| 22629 | + acx_s_start(adev); | ||
| 22630 | + | ||
| 22631 | + FN_EXIT0; | ||
| 22632 | +} | ||
| 22633 | + | ||
| 22634 | + | ||
| 22635 | +/*********************************************************************** | ||
| 22636 | +** acxmem_s_down | ||
| 22637 | +** | ||
| 22638 | +** This disables the netdevice | ||
| 22639 | +** | ||
| 22640 | +** Side effects: | ||
| 22641 | +** - disables on-card interrupt request | ||
| 22642 | +*/ | ||
| 22643 | + | ||
| 22644 | +static void | ||
| 22645 | +disable_acx_irq(acx_device_t *adev) | ||
| 22646 | +{ | ||
| 22647 | + FN_ENTER; | ||
| 22648 | + | ||
| 22649 | + /* I guess mask is not 0xffff because acx100 won't signal | ||
| 22650 | + ** cmd completion then (needed for ifup). | ||
| 22651 | + ** Someone with acx100 please confirm */ | ||
| 22652 | + write_reg16(adev, IO_ACX_IRQ_MASK, adev->irq_mask_off); | ||
| 22653 | + write_reg16(adev, IO_ACX_FEMR, 0x0); | ||
| 22654 | + adev->irqs_active = 0; | ||
| 22655 | + FN_EXIT0; | ||
| 22656 | +} | ||
| 22657 | + | ||
| 22658 | +static void | ||
| 22659 | +acxmem_s_down(struct net_device *ndev) | ||
| 22660 | +{ | ||
| 22661 | + acx_device_t *adev = ndev2adev(ndev); | ||
| 22662 | + unsigned long flags; | ||
| 22663 | + | ||
| 22664 | + FN_ENTER; | ||
| 22665 | + | ||
| 22666 | + /* Disable IRQs first, so that IRQs cannot race with us */ | ||
| 22667 | + /* then wait until interrupts have finished executing on other CPUs */ | ||
| 22668 | + acx_lock(adev, flags); | ||
| 22669 | + disable_acx_irq(adev); | ||
| 22670 | + synchronize_irq(adev->pdev->irq); | ||
| 22671 | + acx_unlock(adev, flags); | ||
| 22672 | + | ||
| 22673 | + /* we really don't want to have an asynchronous tasklet disturb us | ||
| 22674 | + ** after something vital for its job has been shut down, so | ||
| 22675 | + ** end all remaining work now. | ||
| 22676 | + ** | ||
| 22677 | + ** NB: carrier_off (done by set_status below) would lead to | ||
| 22678 | + ** not yet fully understood deadlock in FLUSH_SCHEDULED_WORK(). | ||
| 22679 | + ** That's why we do FLUSH first. | ||
| 22680 | + ** | ||
| 22681 | + ** NB2: we have a bad locking bug here: FLUSH_SCHEDULED_WORK() | ||
| 22682 | + ** waits for acx_e_after_interrupt_task to complete if it is running | ||
| 22683 | + ** on another CPU, but acx_e_after_interrupt_task | ||
| 22684 | + ** will sleep on sem forever, because it is taken by us! | ||
| 22685 | + ** Work around that by temporary sem unlock. | ||
| 22686 | + ** This will fail miserably if we'll be hit by concurrent | ||
| 22687 | + ** iwconfig or something in between. TODO! */ | ||
| 22688 | + acx_sem_unlock(adev); | ||
| 22689 | + FLUSH_SCHEDULED_WORK(); | ||
| 22690 | + acx_sem_lock(adev); | ||
| 22691 | + | ||
| 22692 | + /* This is possible: | ||
| 22693 | + ** FLUSH_SCHEDULED_WORK -> acx_e_after_interrupt_task -> | ||
| 22694 | + ** -> set_status(ASSOCIATED) -> wake_queue() | ||
| 22695 | + ** That's why we stop queue _after_ FLUSH_SCHEDULED_WORK | ||
| 22696 | + ** lock/unlock is just paranoia, maybe not needed */ | ||
| 22697 | + acx_lock(adev, flags); | ||
| 22698 | + acx_stop_queue(ndev, "on ifdown"); | ||
| 22699 | + acx_set_status(adev, ACX_STATUS_0_STOPPED); | ||
| 22700 | + acx_unlock(adev, flags); | ||
| 22701 | + | ||
| 22702 | + /* kernel/timer.c says it's illegal to del_timer_sync() | ||
| 22703 | + ** a timer which restarts itself. We guarantee this cannot | ||
| 22704 | + ** ever happen because acx_i_timer() never does this if | ||
| 22705 | + ** status is ACX_STATUS_0_STOPPED */ | ||
| 22706 | + del_timer_sync(&adev->mgmt_timer); | ||
| 22707 | + | ||
| 22708 | + FN_EXIT0; | ||
| 22709 | +} | ||
| 22710 | + | ||
| 22711 | + | ||
| 22712 | +/*********************************************************************** | ||
| 22713 | +** acxmem_e_open | ||
| 22714 | +** | ||
| 22715 | +** Called as a result of SIOCSIFFLAGS ioctl changing the flags bit IFF_UP | ||
| 22716 | +** from clear to set. In other words: ifconfig up. | ||
| 22717 | +** | ||
| 22718 | +** Returns: | ||
| 22719 | +** 0 success | ||
| 22720 | +** >0 f/w reported error | ||
| 22721 | +** <0 driver reported error | ||
| 22722 | +*/ | ||
| 22723 | +static int | ||
| 22724 | +acxmem_e_open(struct net_device *ndev) | ||
| 22725 | +{ | ||
| 22726 | + acx_device_t *adev = ndev2adev(ndev); | ||
| 22727 | + int result = OK; | ||
| 22728 | + | ||
| 22729 | + FN_ENTER; | ||
| 22730 | + | ||
| 22731 | + acx_sem_lock(adev); | ||
| 22732 | + | ||
| 22733 | + acx_init_task_scheduler(adev); | ||
| 22734 | + | ||
| 22735 | +/* TODO: pci_set_power_state(pdev, PCI_D0); ? */ | ||
| 22736 | + | ||
| 22737 | + /* request shared IRQ handler */ | ||
| 22738 | + if (request_irq(ndev->irq, acxmem_i_interrupt, SA_INTERRUPT, ndev->name, ndev)) { | ||
| 22739 | + printk("%s: request_irq FAILED\n", ndev->name); | ||
| 22740 | + result = -EAGAIN; | ||
| 22741 | + goto done; | ||
| 22742 | + } | ||
| 22743 | + set_irq_type (ndev->irq, IRQT_FALLING); | ||
| 22744 | + log(L_DEBUG|L_IRQ, "request_irq %d successful\n", ndev->irq); | ||
| 22745 | + | ||
| 22746 | + /* ifup device */ | ||
| 22747 | + acxmem_s_up(ndev); | ||
| 22748 | + | ||
| 22749 | + /* We don't currently have to do anything else. | ||
| 22750 | + * The setup of the MAC should be subsequently completed via | ||
| 22751 | + * the mlme commands. | ||
| 22752 | + * Higher layers know we're ready from dev->start==1 and | ||
| 22753 | + * dev->tbusy==0. Our rx path knows to pass up received/ | ||
| 22754 | + * frames because of dev->flags&IFF_UP is true. | ||
| 22755 | + */ | ||
| 22756 | +done: | ||
| 22757 | + acx_sem_unlock(adev); | ||
| 22758 | + | ||
| 22759 | + FN_EXIT1(result); | ||
| 22760 | + return result; | ||
| 22761 | +} | ||
| 22762 | + | ||
| 22763 | + | ||
| 22764 | +/*********************************************************************** | ||
| 22765 | +** acxmem_e_close | ||
| 22766 | +** | ||
| 22767 | +** Called as a result of SIOCSIIFFLAGS ioctl changing the flags bit IFF_UP | ||
| 22768 | +** from set to clear. I.e. called by "ifconfig DEV down" | ||
| 22769 | +** | ||
| 22770 | +** Returns: | ||
| 22771 | +** 0 success | ||
| 22772 | +** >0 f/w reported error | ||
| 22773 | +** <0 driver reported error | ||
| 22774 | +*/ | ||
| 22775 | +static int | ||
| 22776 | +acxmem_e_close(struct net_device *ndev) | ||
| 22777 | +{ | ||
| 22778 | + acx_device_t *adev = ndev2adev(ndev); | ||
| 22779 | + | ||
| 22780 | + FN_ENTER; | ||
| 22781 | + | ||
| 22782 | + acx_sem_lock(adev); | ||
| 22783 | + | ||
| 22784 | + /* ifdown device */ | ||
| 22785 | + CLEAR_BIT(adev->dev_state_mask, ACX_STATE_IFACE_UP); | ||
| 22786 | + if (netif_device_present(ndev)) { | ||
| 22787 | + acxmem_s_down(ndev); | ||
| 22788 | + } | ||
| 22789 | + | ||
| 22790 | + /* disable all IRQs, release shared IRQ handler */ | ||
| 22791 | + write_reg16(adev, IO_ACX_IRQ_MASK, 0xffff); | ||
| 22792 | + write_reg16(adev, IO_ACX_FEMR, 0x0); | ||
| 22793 | + free_irq(ndev->irq, ndev); | ||
| 22794 | + | ||
| 22795 | +/* TODO: pci_set_power_state(pdev, PCI_D3hot); ? */ | ||
| 22796 | + | ||
| 22797 | + /* We currently don't have to do anything else. | ||
| 22798 | + * Higher layers know we're not ready from dev->start==0 and | ||
| 22799 | + * dev->tbusy==1. Our rx path knows to not pass up received | ||
| 22800 | + * frames because of dev->flags&IFF_UP is false. | ||
| 22801 | + */ | ||
| 22802 | + acx_sem_unlock(adev); | ||
| 22803 | + | ||
| 22804 | + log(L_INIT, "closed device\n"); | ||
| 22805 | + FN_EXIT0; | ||
| 22806 | + return OK; | ||
| 22807 | +} | ||
| 22808 | + | ||
| 22809 | + | ||
| 22810 | +/*********************************************************************** | ||
| 22811 | +** acxmem_i_tx_timeout | ||
| 22812 | +** | ||
| 22813 | +** Called from network core. Must not sleep! | ||
| 22814 | +*/ | ||
| 22815 | +static void | ||
| 22816 | +acxmem_i_tx_timeout(struct net_device *ndev) | ||
| 22817 | +{ | ||
| 22818 | + acx_device_t *adev = ndev2adev(ndev); | ||
| 22819 | + unsigned long flags; | ||
| 22820 | + unsigned int tx_num_cleaned; | ||
| 22821 | + | ||
| 22822 | + FN_ENTER; | ||
| 22823 | + | ||
| 22824 | + acx_lock(adev, flags); | ||
| 22825 | + | ||
| 22826 | + /* clean processed tx descs, they may have been completely full */ | ||
| 22827 | + tx_num_cleaned = acxmem_l_clean_txdesc(adev); | ||
| 22828 | + | ||
| 22829 | + /* nothing cleaned, yet (almost) no free buffers available? | ||
| 22830 | + * --> clean all tx descs, no matter which status!! | ||
| 22831 | + * Note that I strongly suspect that doing emergency cleaning | ||
| 22832 | + * may confuse the firmware. This is a last ditch effort to get | ||
| 22833 | + * ANYTHING to work again... | ||
| 22834 | + * | ||
| 22835 | + * TODO: it's best to simply reset & reinit hw from scratch... | ||
| 22836 | + */ | ||
| 22837 | + if ((adev->tx_free <= TX_EMERG_CLEAN) && (tx_num_cleaned == 0)) { | ||
| 22838 | + printk("%s: FAILED to free any of the many full tx buffers. " | ||
| 22839 | + "Switching to emergency freeing. " | ||
| 22840 | + "Please report!\n", ndev->name); | ||
| 22841 | + acxmem_l_clean_txdesc_emergency(adev); | ||
| 22842 | + } | ||
| 22843 | + | ||
| 22844 | + if (acx_queue_stopped(ndev) && (ACX_STATUS_4_ASSOCIATED == adev->status)) | ||
| 22845 | + acx_wake_queue(ndev, "after tx timeout"); | ||
| 22846 | + | ||
| 22847 | + /* stall may have happened due to radio drift, so recalib radio */ | ||
| 22848 | + acx_schedule_task(adev, ACX_AFTER_IRQ_CMD_RADIO_RECALIB); | ||
| 22849 | + | ||
| 22850 | + /* do unimportant work last */ | ||
| 22851 | + printk("%s: tx timeout!\n", ndev->name); | ||
| 22852 | + adev->stats.tx_errors++; | ||
| 22853 | + | ||
| 22854 | + acx_unlock(adev, flags); | ||
| 22855 | + | ||
| 22856 | + FN_EXIT0; | ||
| 22857 | +} | ||
| 22858 | + | ||
| 22859 | + | ||
| 22860 | +/*********************************************************************** | ||
| 22861 | +** acxmem_i_set_multicast_list | ||
| 22862 | +** FIXME: most likely needs refinement | ||
| 22863 | +*/ | ||
| 22864 | +static void | ||
| 22865 | +acxmem_i_set_multicast_list(struct net_device *ndev) | ||
| 22866 | +{ | ||
| 22867 | + acx_device_t *adev = ndev2adev(ndev); | ||
| 22868 | + unsigned long flags; | ||
| 22869 | + | ||
| 22870 | + FN_ENTER; | ||
| 22871 | + | ||
| 22872 | + acx_lock(adev, flags); | ||
| 22873 | + | ||
| 22874 | + /* firmwares don't have allmulti capability, | ||
| 22875 | + * so just use promiscuous mode instead in this case. */ | ||
| 22876 | + if (ndev->flags & (IFF_PROMISC|IFF_ALLMULTI)) { | ||
| 22877 | + SET_BIT(adev->rx_config_1, RX_CFG1_RCV_PROMISCUOUS); | ||
| 22878 | + CLEAR_BIT(adev->rx_config_1, RX_CFG1_FILTER_ALL_MULTI); | ||
| 22879 | + SET_BIT(adev->set_mask, SET_RXCONFIG); | ||
| 22880 | + /* let kernel know in case *we* needed to set promiscuous */ | ||
| 22881 | + ndev->flags |= (IFF_PROMISC|IFF_ALLMULTI); | ||
| 22882 | + } else { | ||
| 22883 | + CLEAR_BIT(adev->rx_config_1, RX_CFG1_RCV_PROMISCUOUS); | ||
| 22884 | + SET_BIT(adev->rx_config_1, RX_CFG1_FILTER_ALL_MULTI); | ||
| 22885 | + SET_BIT(adev->set_mask, SET_RXCONFIG); | ||
| 22886 | + ndev->flags &= ~(IFF_PROMISC|IFF_ALLMULTI); | ||
| 22887 | + } | ||
| 22888 | + | ||
| 22889 | + /* cannot update card settings directly here, atomic context */ | ||
| 22890 | + acx_schedule_task(adev, ACX_AFTER_IRQ_UPDATE_CARD_CFG); | ||
| 22891 | + | ||
| 22892 | + acx_unlock(adev, flags); | ||
| 22893 | + | ||
| 22894 | + FN_EXIT0; | ||
| 22895 | +} | ||
| 22896 | + | ||
| 22897 | + | ||
| 22898 | +/*************************************************************** | ||
| 22899 | +** acxmem_l_process_rxdesc | ||
| 22900 | +** | ||
| 22901 | +** Called directly and only from the IRQ handler | ||
| 22902 | +*/ | ||
| 22903 | + | ||
| 22904 | +#if !ACX_DEBUG | ||
| 22905 | +static inline void log_rxbuffer(const acx_device_t *adev) {} | ||
| 22906 | +#else | ||
| 22907 | +static void | ||
| 22908 | +log_rxbuffer(const acx_device_t *adev) | ||
| 22909 | +{ | ||
| 22910 | + register const struct rxhostdesc *rxhostdesc; | ||
| 22911 | + int i; | ||
| 22912 | + /* no FN_ENTER here, we don't want that */ | ||
| 22913 | + | ||
| 22914 | + rxhostdesc = adev->rxhostdesc_start; | ||
| 22915 | + if (unlikely(!rxhostdesc)) return; | ||
| 22916 | + for (i = 0; i < RX_CNT; i++) { | ||
| 22917 | + if ((rxhostdesc->Ctl_16 & cpu_to_le16(DESC_CTL_HOSTOWN)) | ||
| 22918 | + && (rxhostdesc->Status & cpu_to_le32(DESC_STATUS_FULL))) | ||
| 22919 | + printk("rx: buf %d full\n", i); | ||
| 22920 | + rxhostdesc++; | ||
| 22921 | + } | ||
| 22922 | +} | ||
| 22923 | +#endif | ||
| 22924 | + | ||
| 22925 | +static void | ||
| 22926 | +acxmem_l_process_rxdesc(acx_device_t *adev) | ||
| 22927 | +{ | ||
| 22928 | + register rxhostdesc_t *hostdesc; | ||
| 22929 | + register rxdesc_t *rxdesc; | ||
| 22930 | + unsigned count, tail; | ||
| 22931 | + u32 addr; | ||
| 22932 | + u8 Ctl_8; | ||
| 22933 | + | ||
| 22934 | + FN_ENTER; | ||
| 22935 | + | ||
| 22936 | + if (unlikely(acx_debug & L_BUFR)) | ||
| 22937 | + log_rxbuffer(adev); | ||
| 22938 | + | ||
| 22939 | + /* First, have a loop to determine the first descriptor that's | ||
| 22940 | + * full, just in case there's a mismatch between our current | ||
| 22941 | + * rx_tail and the full descriptor we're supposed to handle. */ | ||
| 22942 | + tail = adev->rx_tail; | ||
| 22943 | + count = RX_CNT; | ||
| 22944 | + while (1) { | ||
| 22945 | + hostdesc = &adev->rxhostdesc_start[tail]; | ||
| 22946 | + rxdesc = &adev->rxdesc_start[tail]; | ||
| 22947 | + /* advance tail regardless of outcome of the below test */ | ||
| 22948 | + tail = (tail + 1) % RX_CNT; | ||
| 22949 | + | ||
| 22950 | + /* | ||
| 22951 | + * Unlike the PCI interface, where the ACX can write directly to | ||
| 22952 | + * the host descriptors, on the slave memory interface we have to | ||
| 22953 | + * pull these. All we really need to do is check the Ctl_8 field | ||
| 22954 | + * in the rx descriptor on the ACX, which should be 0x11000000 if | ||
| 22955 | + * we should process it. | ||
| 22956 | + */ | ||
| 22957 | + Ctl_8 = hostdesc->Ctl_16 = read_slavemem8 (adev, (u32) &(rxdesc->Ctl_8)); | ||
| 22958 | + if ((Ctl_8 & DESC_CTL_HOSTOWN) && | ||
| 22959 | + (Ctl_8 & DESC_CTL_ACXDONE)) | ||
| 22960 | + break; /* found it! */ | ||
| 22961 | + | ||
| 22962 | + if (unlikely(!--count)) /* hmm, no luck: all descs empty, bail out */ | ||
| 22963 | + goto end; | ||
| 22964 | + } | ||
| 22965 | + | ||
| 22966 | + /* now process descriptors, starting with the first we figured out */ | ||
| 22967 | + while (1) { | ||
| 22968 | + log(L_BUFR, "rx: tail=%u Ctl_8=%02X\n", tail, Ctl_8); | ||
| 22969 | + /* | ||
| 22970 | + * If the ACX has CTL_RECLAIM set on this descriptor there | ||
| 22971 | + * is no buffer associated; it just wants us to tell it to | ||
| 22972 | + * reclaim the memory. | ||
| 22973 | + */ | ||
| 22974 | + if (!(Ctl_8 & DESC_CTL_RECLAIM)) { | ||
| 22975 | + | ||
| 22976 | + /* | ||
| 22977 | + * slave interface - pull data now | ||
| 22978 | + */ | ||
| 22979 | + hostdesc->length = read_slavemem16 (adev, (u32) &(rxdesc->total_length)); | ||
| 22980 | + | ||
| 22981 | + /* | ||
| 22982 | + * hostdesc->data is an rxbuffer_t, which includes header information, | ||
| 22983 | + * but the length in the data packet doesn't. The header information | ||
| 22984 | + * takes up an additional 12 bytes, so add that to the length we copy. | ||
| 22985 | + */ | ||
| 22986 | + addr = read_slavemem32 (adev, (u32) &(rxdesc->ACXMemPtr)); | ||
| 22987 | + if (addr) { | ||
| 22988 | + /* | ||
| 22989 | + * How can &(rxdesc->ACXMemPtr) above ever be zero? Looks like we | ||
| 22990 | + * get that now and then - try to trap it for debug. | ||
| 22991 | + */ | ||
| 22992 | + if (addr & 0xffff0000) { | ||
| 22993 | + printk("rxdesc 0x%08x\n", (u32) rxdesc); | ||
| 22994 | + dump_acxmem (adev, 0, 0x10000); | ||
| 22995 | + panic ("Bad access!"); | ||
| 22996 | + } | ||
| 22997 | + chaincopy_from_slavemem (adev, (u8 *) hostdesc->data, addr, | ||
| 22998 | + hostdesc->length + | ||
| 22999 | + (u32) &((rxbuffer_t *)0)->hdr_a3); | ||
| 23000 | + acx_l_process_rxbuf(adev, hostdesc->data); | ||
| 23001 | + } | ||
| 23002 | + } | ||
| 23003 | + else { | ||
| 23004 | + printk ("rx reclaim only!\n"); | ||
| 23005 | + } | ||
| 23006 | + | ||
| 23007 | + hostdesc->Status = 0; | ||
| 23008 | + | ||
| 23009 | + /* | ||
| 23010 | + * Let the ACX know we're done. | ||
| 23011 | + */ | ||
| 23012 | + CLEAR_BIT (Ctl_8, DESC_CTL_HOSTOWN); | ||
| 23013 | + SET_BIT (Ctl_8, DESC_CTL_HOSTDONE); | ||
| 23014 | + SET_BIT (Ctl_8, DESC_CTL_RECLAIM); | ||
| 23015 | + write_slavemem8 (adev, (u32) &rxdesc->Ctl_8, Ctl_8); | ||
| 23016 | + | ||
| 23017 | + /* | ||
| 23018 | + * Now tell the ACX we've finished with the receive buffer so | ||
| 23019 | + * it can finish the reclaim. | ||
| 23020 | + */ | ||
| 23021 | + write_reg16 (adev, IO_ACX_INT_TRIG, INT_TRIG_RXPRC); | ||
| 23022 | + | ||
| 23023 | + /* ok, descriptor is handled, now check the next descriptor */ | ||
| 23024 | + hostdesc = &adev->rxhostdesc_start[tail]; | ||
| 23025 | + rxdesc = &adev->rxdesc_start[tail]; | ||
| 23026 | + | ||
| 23027 | + Ctl_8 = hostdesc->Ctl_16 = read_slavemem8 (adev, (u32) &(rxdesc->Ctl_8)); | ||
| 23028 | + | ||
| 23029 | + /* if next descriptor is empty, then bail out */ | ||
| 23030 | + if (!(Ctl_8 & DESC_CTL_HOSTOWN) || !(Ctl_8 & DESC_CTL_ACXDONE)) | ||
| 23031 | + break; | ||
| 23032 | + | ||
| 23033 | + tail = (tail + 1) % RX_CNT; | ||
| 23034 | + } | ||
| 23035 | +end: | ||
| 23036 | + adev->rx_tail = tail; | ||
| 23037 | + FN_EXIT0; | ||
| 23038 | +} | ||
| 23039 | + | ||
| 23040 | + | ||
| 23041 | +/*********************************************************************** | ||
| 23042 | +** acxmem_i_interrupt | ||
| 23043 | +** | ||
| 23044 | +** IRQ handler (atomic context, must not sleep, blah, blah) | ||
| 23045 | +*/ | ||
| 23046 | + | ||
| 23047 | +/* scan is complete. all frames now on the receive queue are valid */ | ||
| 23048 | +#define INFO_SCAN_COMPLETE 0x0001 | ||
| 23049 | +#define INFO_WEP_KEY_NOT_FOUND 0x0002 | ||
| 23050 | +/* hw has been reset as the result of a watchdog timer timeout */ | ||
| 23051 | +#define INFO_WATCH_DOG_RESET 0x0003 | ||
| 23052 | +/* failed to send out NULL frame from PS mode notification to AP */ | ||
| 23053 | +/* recommended action: try entering 802.11 PS mode again */ | ||
| 23054 | +#define INFO_PS_FAIL 0x0004 | ||
| 23055 | +/* encryption/decryption process on a packet failed */ | ||
| 23056 | +#define INFO_IV_ICV_FAILURE 0x0005 | ||
| 23057 | + | ||
| 23058 | +/* Info mailbox format: | ||
| 23059 | +2 bytes: type | ||
| 23060 | +2 bytes: status | ||
| 23061 | +more bytes may follow | ||
| 23062 | + rumors say about status: | ||
| 23063 | + 0x0000 info available (set by hw) | ||
| 23064 | + 0x0001 information received (must be set by host) | ||
| 23065 | + 0x1000 info available, mailbox overflowed (messages lost) (set by hw) | ||
| 23066 | + but in practice we've seen: | ||
| 23067 | + 0x9000 when we did not set status to 0x0001 on prev message | ||
| 23068 | + 0x1001 when we did set it | ||
| 23069 | + 0x0000 was never seen | ||
| 23070 | + conclusion: this is really a bitfield: | ||
| 23071 | + 0x1000 is 'info available' bit | ||
| 23072 | + 'mailbox overflowed' bit is 0x8000, not 0x1000 | ||
| 23073 | + value of 0x0000 probably means that there are no messages at all | ||
| 23074 | + P.S. I dunno how in hell hw is supposed to notice that messages are lost - | ||
| 23075 | + it does NOT clear bit 0x0001, and this bit will probably stay forever set | ||
| 23076 | + after we set it once. Let's hope this will be fixed in firmware someday | ||
| 23077 | +*/ | ||
| 23078 | + | ||
| 23079 | +static void | ||
| 23080 | +handle_info_irq(acx_device_t *adev) | ||
| 23081 | +{ | ||
| 23082 | +#if ACX_DEBUG | ||
| 23083 | + static const char * const info_type_msg[] = { | ||
| 23084 | + "(unknown)", | ||
| 23085 | + "scan complete", | ||
| 23086 | + "WEP key not found", | ||
| 23087 | + "internal watchdog reset was done", | ||
| 23088 | + "failed to send powersave (NULL frame) notification to AP", | ||
| 23089 | + "encrypt/decrypt on a packet has failed", | ||
| 23090 | + "TKIP tx keys disabled", | ||
| 23091 | + "TKIP rx keys disabled", | ||
| 23092 | + "TKIP rx: key ID not found", | ||
| 23093 | + "???", | ||
| 23094 | + "???", | ||
| 23095 | + "???", | ||
| 23096 | + "???", | ||
| 23097 | + "???", | ||
| 23098 | + "???", | ||
| 23099 | + "???", | ||
| 23100 | + "TKIP IV value exceeds thresh" | ||
| 23101 | + }; | ||
| 23102 | +#endif | ||
| 23103 | + u32 info_type, info_status; | ||
| 23104 | + | ||
| 23105 | + info_type = read_slavemem32 (adev, (u32) adev->info_area); | ||
| 23106 | + | ||
| 23107 | + info_status = (info_type >> 16); | ||
| 23108 | + info_type = (u16)info_type; | ||
| 23109 | + | ||
| 23110 | + /* inform fw that we have read this info message */ | ||
| 23111 | + write_slavemem32(adev, (u32) adev->info_area, info_type | 0x00010000); | ||
| 23112 | + write_reg16(adev, IO_ACX_INT_TRIG, INT_TRIG_INFOACK); | ||
| 23113 | + write_flush(adev); | ||
| 23114 | + | ||
| 23115 | + log(L_CTL, "info_type:%04X info_status:%04X\n", | ||
| 23116 | + info_type, info_status); | ||
| 23117 | + | ||
| 23118 | + log(L_IRQ, "got Info IRQ: status %04X type %04X: %s\n", | ||
| 23119 | + info_status, info_type, | ||
| 23120 | + info_type_msg[(info_type >= VEC_SIZE(info_type_msg)) ? | ||
| 23121 | + 0 : info_type] | ||
| 23122 | + ); | ||
| 23123 | +} | ||
| 23124 | + | ||
| 23125 | + | ||
| 23126 | +static void | ||
| 23127 | +log_unusual_irq(u16 irqtype) { | ||
| 23128 | + /* | ||
| 23129 | + if (!printk_ratelimit()) | ||
| 23130 | + return; | ||
| 23131 | + */ | ||
| 23132 | + | ||
| 23133 | + printk("acx: got"); | ||
| 23134 | + if (irqtype & HOST_INT_TX_XFER) { | ||
| 23135 | + printk(" Tx_Xfer"); | ||
| 23136 | + } | ||
| 23137 | + if (irqtype & HOST_INT_RX_COMPLETE) { | ||
| 23138 | + printk(" Rx_Complete"); | ||
| 23139 | + } | ||
| 23140 | + if (irqtype & HOST_INT_DTIM) { | ||
| 23141 | + printk(" DTIM"); | ||
| 23142 | + } | ||
| 23143 | + if (irqtype & HOST_INT_BEACON) { | ||
| 23144 | + printk(" Beacon"); | ||
| 23145 | + } | ||
| 23146 | + if (irqtype & HOST_INT_TIMER) { | ||
| 23147 | + log(L_IRQ, " Timer"); | ||
| 23148 | + } | ||
| 23149 | + if (irqtype & HOST_INT_KEY_NOT_FOUND) { | ||
| 23150 | + printk(" Key_Not_Found"); | ||
| 23151 | + } | ||
| 23152 | + if (irqtype & HOST_INT_IV_ICV_FAILURE) { | ||
| 23153 | + printk(" IV_ICV_Failure (crypto)"); | ||
| 23154 | + } | ||
| 23155 | + /* HOST_INT_CMD_COMPLETE */ | ||
| 23156 | + /* HOST_INT_INFO */ | ||
| 23157 | + if (irqtype & HOST_INT_OVERFLOW) { | ||
| 23158 | + printk(" Overflow"); | ||
| 23159 | + } | ||
| 23160 | + if (irqtype & HOST_INT_PROCESS_ERROR) { | ||
| 23161 | + printk(" Process_Error"); | ||
| 23162 | + } | ||
| 23163 | + /* HOST_INT_SCAN_COMPLETE */ | ||
| 23164 | + if (irqtype & HOST_INT_FCS_THRESHOLD) { | ||
| 23165 | + printk(" FCS_Threshold"); | ||
| 23166 | + } | ||
| 23167 | + if (irqtype & HOST_INT_UNKNOWN) { | ||
| 23168 | + printk(" Unknown"); | ||
| 23169 | + } | ||
| 23170 | + printk(" IRQ(s)\n"); | ||
| 23171 | +} | ||
| 23172 | + | ||
| 23173 | + | ||
| 23174 | +static void | ||
| 23175 | +update_link_quality_led(acx_device_t *adev) | ||
| 23176 | +{ | ||
| 23177 | + int qual; | ||
| 23178 | + | ||
| 23179 | + qual = acx_signal_determine_quality(adev->wstats.qual.level, adev->wstats.qual.noise); | ||
| 23180 | + if (qual > adev->brange_max_quality) | ||
| 23181 | + qual = adev->brange_max_quality; | ||
| 23182 | + | ||
| 23183 | + if (time_after(jiffies, adev->brange_time_last_state_change + | ||
| 23184 | + (HZ/2 - HZ/2 * (unsigned long)qual / adev->brange_max_quality ) )) { | ||
| 23185 | + acxmem_l_power_led(adev, (adev->brange_last_state == 0)); | ||
| 23186 | + adev->brange_last_state ^= 1; /* toggle */ | ||
| 23187 | + adev->brange_time_last_state_change = jiffies; | ||
| 23188 | + } | ||
| 23189 | +} | ||
| 23190 | + | ||
| 23191 | + | ||
| 23192 | +#define MAX_IRQLOOPS_PER_JIFFY (20000/HZ) /* a la orinoco.c */ | ||
| 23193 | + | ||
| 23194 | +static irqreturn_t | ||
| 23195 | +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 19) | ||
| 23196 | +acxmem_i_interrupt(int irq, void *dev_id) | ||
| 23197 | +#else | ||
| 23198 | +acxmwm_i_interrupt(int irq, void *dev_id, struct pt_regs *regs) | ||
| 23199 | +#endif | ||
| 23200 | +{ | ||
| 23201 | + acx_device_t *adev; | ||
| 23202 | + unsigned long flags; | ||
| 23203 | + unsigned int irqcount = MAX_IRQLOOPS_PER_JIFFY; | ||
| 23204 | + register u16 irqtype; | ||
| 23205 | + u16 unmasked; | ||
| 23206 | + | ||
| 23207 | + adev = ndev2adev((struct net_device*)dev_id); | ||
| 23208 | + | ||
| 23209 | + /* LOCKING: can just spin_lock() since IRQs are disabled anyway. | ||
| 23210 | + * I am paranoid */ | ||
| 23211 | + acx_lock(adev, flags); | ||
| 23212 | + | ||
| 23213 | + unmasked = read_reg16(adev, IO_ACX_IRQ_STATUS_CLEAR); | ||
| 23214 | + if (unlikely(0xffff == unmasked)) { | ||
| 23215 | + /* 0xffff value hints at missing hardware, | ||
| 23216 | + * so don't do anything. | ||
| 23217 | + * Not very clean, but other drivers do the same... */ | ||
| 23218 | + log(L_IRQ, "IRQ type:FFFF - device removed? IRQ_NONE\n"); | ||
| 23219 | + goto none; | ||
| 23220 | + } | ||
| 23221 | + | ||
| 23222 | + /* We will check only "interesting" IRQ types */ | ||
| 23223 | + irqtype = unmasked & ~adev->irq_mask; | ||
| 23224 | + if (!irqtype) { | ||
| 23225 | + /* We are on a shared IRQ line and it wasn't our IRQ */ | ||
| 23226 | + log(L_IRQ, "IRQ type:%04X, mask:%04X - all are masked, IRQ_NONE\n", | ||
| 23227 | + unmasked, adev->irq_mask); | ||
| 23228 | + goto none; | ||
| 23229 | + } | ||
| 23230 | + | ||
| 23231 | + /* Done here because IRQ_NONEs taking three lines of log | ||
| 23232 | + ** drive me crazy */ | ||
| 23233 | + FN_ENTER; | ||
| 23234 | + | ||
| 23235 | +#define IRQ_ITERATE 1 | ||
| 23236 | +#if IRQ_ITERATE | ||
| 23237 | +if (jiffies != adev->irq_last_jiffies) { | ||
| 23238 | + adev->irq_loops_this_jiffy = 0; | ||
| 23239 | + adev->irq_last_jiffies = jiffies; | ||
| 23240 | +} | ||
| 23241 | + | ||
| 23242 | +/* safety condition; we'll normally abort loop below | ||
| 23243 | + * in case no IRQ type occurred */ | ||
| 23244 | +while (likely(--irqcount)) { | ||
| 23245 | +#endif | ||
| 23246 | + /* ACK all IRQs ASAP */ | ||
| 23247 | + write_reg16(adev, IO_ACX_IRQ_ACK, 0xffff); | ||
| 23248 | + | ||
| 23249 | + log(L_IRQ, "IRQ type:%04X, mask:%04X, type & ~mask:%04X\n", | ||
| 23250 | + unmasked, adev->irq_mask, irqtype); | ||
| 23251 | + | ||
| 23252 | + /* Handle most important IRQ types first */ | ||
| 23253 | + if (irqtype & HOST_INT_RX_DATA) { | ||
| 23254 | + log(L_IRQ, "got Rx_Data IRQ\n"); | ||
| 23255 | + acxmem_l_process_rxdesc(adev); | ||
| 23256 | + } | ||
| 23257 | + if (irqtype & HOST_INT_TX_COMPLETE) { | ||
| 23258 | + log(L_IRQ, "got Tx_Complete IRQ\n"); | ||
| 23259 | + /* don't clean up on each Tx complete, wait a bit | ||
| 23260 | + * unless we're going towards full, in which case | ||
| 23261 | + * we do it immediately, too (otherwise we might lockup | ||
| 23262 | + * with a full Tx buffer if we go into | ||
| 23263 | + * acxmem_l_clean_txdesc() at a time when we won't wakeup | ||
| 23264 | + * the net queue in there for some reason...) */ | ||
| 23265 | + if (adev->tx_free <= TX_START_CLEAN) { | ||
| 23266 | +#if TX_CLEANUP_IN_SOFTIRQ | ||
| 23267 | + acx_schedule_task(adev, ACX_AFTER_IRQ_TX_CLEANUP); | ||
| 23268 | +#else | ||
| 23269 | + acxmem_l_clean_txdesc(adev); | ||
| 23270 | +#endif | ||
| 23271 | + } | ||
| 23272 | + } | ||
| 23273 | + | ||
| 23274 | + /* Less frequent ones */ | ||
| 23275 | + if (irqtype & (0 | ||
| 23276 | + | HOST_INT_CMD_COMPLETE | ||
| 23277 | + | HOST_INT_INFO | ||
| 23278 | + | HOST_INT_SCAN_COMPLETE | ||
| 23279 | + )) { | ||
| 23280 | + if (irqtype & HOST_INT_CMD_COMPLETE) { | ||
| 23281 | + log(L_IRQ, "got Command_Complete IRQ\n"); | ||
| 23282 | + /* save the state for the running issue_cmd() */ | ||
| 23283 | + SET_BIT(adev->irq_status, HOST_INT_CMD_COMPLETE); | ||
| 23284 | + } | ||
| 23285 | + if (irqtype & HOST_INT_INFO) { | ||
| 23286 | + handle_info_irq(adev); | ||
| 23287 | + } | ||
| 23288 | + if (irqtype & HOST_INT_SCAN_COMPLETE) { | ||
| 23289 | + log(L_IRQ, "got Scan_Complete IRQ\n"); | ||
| 23290 | + /* need to do that in process context */ | ||
| 23291 | + acx_schedule_task(adev, ACX_AFTER_IRQ_COMPLETE_SCAN); | ||
| 23292 | + /* remember that fw is not scanning anymore */ | ||
| 23293 | + SET_BIT(adev->irq_status, HOST_INT_SCAN_COMPLETE); | ||
| 23294 | + } | ||
| 23295 | + } | ||
| 23296 | + | ||
| 23297 | + /* These we just log, but either they happen rarely | ||
| 23298 | + * or we keep them masked out */ | ||
| 23299 | + if (irqtype & (0 | ||
| 23300 | + /* | HOST_INT_RX_DATA */ | ||
| 23301 | + /* | HOST_INT_TX_COMPLETE */ | ||
| 23302 | + | HOST_INT_TX_XFER | ||
| 23303 | + | HOST_INT_RX_COMPLETE | ||
| 23304 | + | HOST_INT_DTIM | ||
| 23305 | + | HOST_INT_BEACON | ||
| 23306 | + | HOST_INT_TIMER | ||
| 23307 | + | HOST_INT_KEY_NOT_FOUND | ||
| 23308 | + | HOST_INT_IV_ICV_FAILURE | ||
| 23309 | + /* | HOST_INT_CMD_COMPLETE */ | ||
| 23310 | + /* | HOST_INT_INFO */ | ||
| 23311 | + | HOST_INT_OVERFLOW | ||
| 23312 | + | HOST_INT_PROCESS_ERROR | ||
| 23313 | + /* | HOST_INT_SCAN_COMPLETE */ | ||
| 23314 | + | HOST_INT_FCS_THRESHOLD | ||
| 23315 | + | HOST_INT_UNKNOWN | ||
| 23316 | + )) { | ||
| 23317 | + log_unusual_irq(irqtype); | ||
| 23318 | + } | ||
| 23319 | + | ||
| 23320 | +#if IRQ_ITERATE | ||
| 23321 | + unmasked = read_reg16(adev, IO_ACX_IRQ_STATUS_CLEAR); | ||
| 23322 | + irqtype = unmasked & ~adev->irq_mask; | ||
| 23323 | + /* Bail out if no new IRQ bits or if all are masked out */ | ||
| 23324 | + if (!irqtype) | ||
| 23325 | + break; | ||
| 23326 | + | ||
| 23327 | + if (unlikely(++adev->irq_loops_this_jiffy > MAX_IRQLOOPS_PER_JIFFY)) { | ||
| 23328 | + printk(KERN_ERR "acx: too many interrupts per jiffy!\n"); | ||
| 23329 | + /* Looks like card floods us with IRQs! Try to stop that */ | ||
| 23330 | + write_reg16(adev, IO_ACX_IRQ_MASK, 0xffff); | ||
| 23331 | + /* This will short-circuit all future attempts to handle IRQ. | ||
| 23332 | + * We cant do much more... */ | ||
| 23333 | + adev->irq_mask = 0; | ||
| 23334 | + break; | ||
| 23335 | + } | ||
| 23336 | +} | ||
| 23337 | +#endif | ||
| 23338 | + /* Routine to perform blink with range */ | ||
| 23339 | + if (unlikely(adev->led_power == 2)) | ||
| 23340 | + update_link_quality_led(adev); | ||
| 23341 | + | ||
| 23342 | +/* handled: */ | ||
| 23343 | + /* write_flush(adev); - not needed, last op was read anyway */ | ||
| 23344 | + acx_unlock(adev, flags); | ||
| 23345 | + FN_EXIT0; | ||
| 23346 | + return IRQ_HANDLED; | ||
| 23347 | + | ||
| 23348 | +none: | ||
| 23349 | + acx_unlock(adev, flags); | ||
| 23350 | + return IRQ_NONE; | ||
| 23351 | +} | ||
| 23352 | + | ||
| 23353 | + | ||
| 23354 | +/*********************************************************************** | ||
| 23355 | +** acxmem_l_power_led | ||
| 23356 | +*/ | ||
| 23357 | +void | ||
| 23358 | +acxmem_l_power_led(acx_device_t *adev, int enable) | ||
| 23359 | +{ | ||
| 23360 | + u16 gpio_pled = IS_ACX111(adev) ? 0x0040 : 0x0800; | ||
| 23361 | + | ||
| 23362 | + /* A hack. Not moving message rate limiting to adev->xxx | ||
| 23363 | + * (it's only a debug message after all) */ | ||
| 23364 | + static int rate_limit = 0; | ||
| 23365 | + | ||
| 23366 | + if (rate_limit++ < 3) | ||
| 23367 | + log(L_IOCTL, "Please report in case toggling the power " | ||
| 23368 | + "LED doesn't work for your card!\n"); | ||
| 23369 | + if (enable) | ||
| 23370 | + write_reg16(adev, IO_ACX_GPIO_OUT, | ||
| 23371 | + read_reg16(adev, IO_ACX_GPIO_OUT) & ~gpio_pled); | ||
| 23372 | + else | ||
| 23373 | + write_reg16(adev, IO_ACX_GPIO_OUT, | ||
| 23374 | + read_reg16(adev, IO_ACX_GPIO_OUT) | gpio_pled); | ||
| 23375 | +} | ||
| 23376 | + | ||
| 23377 | + | ||
| 23378 | +/*********************************************************************** | ||
| 23379 | +** Ioctls | ||
| 23380 | +*/ | ||
| 23381 | + | ||
| 23382 | +/*********************************************************************** | ||
| 23383 | +*/ | ||
| 23384 | +int | ||
| 23385 | +acx111pci_ioctl_info( | ||
| 23386 | + struct net_device *ndev, | ||
| 23387 | + struct iw_request_info *info, | ||
| 23388 | + struct iw_param *vwrq, | ||
| 23389 | + char *extra) | ||
| 23390 | +{ | ||
| 23391 | +#if ACX_DEBUG > 1 | ||
| 23392 | + acx_device_t *adev = ndev2adev(ndev); | ||
| 23393 | + rxdesc_t *rxdesc; | ||
| 23394 | + txdesc_t *txdesc; | ||
| 23395 | + rxhostdesc_t *rxhostdesc; | ||
| 23396 | + txhostdesc_t *txhostdesc; | ||
| 23397 | + struct acx111_ie_memoryconfig memconf; | ||
| 23398 | + struct acx111_ie_queueconfig queueconf; | ||
| 23399 | + unsigned long flags; | ||
| 23400 | + int i; | ||
| 23401 | + char memmap[0x34]; | ||
| 23402 | + char rxconfig[0x8]; | ||
| 23403 | + char fcserror[0x8]; | ||
| 23404 | + char ratefallback[0x5]; | ||
| 23405 | + | ||
| 23406 | + if ( !(acx_debug & (L_IOCTL|L_DEBUG)) ) | ||
| 23407 | + return OK; | ||
| 23408 | + /* using printk() since we checked debug flag already */ | ||
| 23409 | + | ||
| 23410 | + acx_sem_lock(adev); | ||
| 23411 | + | ||
| 23412 | + if (!IS_ACX111(adev)) { | ||
| 23413 | + printk("acx111-specific function called " | ||
| 23414 | + "with non-acx111 chip, aborting\n"); | ||
| 23415 | + goto end_ok; | ||
| 23416 | + } | ||
| 23417 | + | ||
| 23418 | + /* get Acx111 Memory Configuration */ | ||
| 23419 | + memset(&memconf, 0, sizeof(memconf)); | ||
| 23420 | + /* BTW, fails with 12 (Write only) error code. | ||
| 23421 | + ** Retained for easy testing of issue_cmd error handling :) */ | ||
| 23422 | + printk ("Interrogating queue config\n"); | ||
| 23423 | + acx_s_interrogate(adev, &memconf, ACX1xx_IE_QUEUE_CONFIG); | ||
| 23424 | + printk ("done with queue config\n"); | ||
| 23425 | + | ||
| 23426 | + /* get Acx111 Queue Configuration */ | ||
| 23427 | + memset(&queueconf, 0, sizeof(queueconf)); | ||
| 23428 | + printk ("Interrogating mem config options\n"); | ||
| 23429 | + acx_s_interrogate(adev, &queueconf, ACX1xx_IE_MEMORY_CONFIG_OPTIONS); | ||
| 23430 | + printk ("done with mem config options\n"); | ||
| 23431 | + | ||
| 23432 | + /* get Acx111 Memory Map */ | ||
| 23433 | + memset(memmap, 0, sizeof(memmap)); | ||
| 23434 | + printk ("Interrogating mem map\n"); | ||
| 23435 | + acx_s_interrogate(adev, &memmap, ACX1xx_IE_MEMORY_MAP); | ||
| 23436 | + printk ("done with mem map\n"); | ||
| 23437 | + | ||
| 23438 | + /* get Acx111 Rx Config */ | ||
| 23439 | + memset(rxconfig, 0, sizeof(rxconfig)); | ||
| 23440 | + printk ("Interrogating rxconfig\n"); | ||
| 23441 | + acx_s_interrogate(adev, &rxconfig, ACX1xx_IE_RXCONFIG); | ||
| 23442 | + printk ("done with queue rxconfig\n"); | ||
| 23443 | + | ||
| 23444 | + /* get Acx111 fcs error count */ | ||
| 23445 | + memset(fcserror, 0, sizeof(fcserror)); | ||
| 23446 | + printk ("Interrogating fcs err count\n"); | ||
| 23447 | + acx_s_interrogate(adev, &fcserror, ACX1xx_IE_FCS_ERROR_COUNT); | ||
| 23448 | + printk ("done with err count\n"); | ||
| 23449 | + | ||
| 23450 | + /* get Acx111 rate fallback */ | ||
| 23451 | + memset(ratefallback, 0, sizeof(ratefallback)); | ||
| 23452 | + printk ("Interrogating rate fallback\n"); | ||
| 23453 | + acx_s_interrogate(adev, &ratefallback, ACX1xx_IE_RATE_FALLBACK); | ||
| 23454 | + printk ("done with rate fallback\n"); | ||
| 23455 | + | ||
| 23456 | + /* force occurrence of a beacon interrupt */ | ||
| 23457 | + /* TODO: comment why is this necessary */ | ||
| 23458 | + write_reg16(adev, IO_ACX_HINT_TRIG, HOST_INT_BEACON); | ||
| 23459 | + | ||
| 23460 | + /* dump Acx111 Mem Configuration */ | ||
| 23461 | + printk("dump mem config:\n" | ||
| 23462 | + "data read: %d, struct size: %d\n" | ||
| 23463 | + "Number of stations: %1X\n" | ||
| 23464 | + "Memory block size: %1X\n" | ||
| 23465 | + "tx/rx memory block allocation: %1X\n" | ||
| 23466 | + "count rx: %X / tx: %X queues\n" | ||
| 23467 | + "options %1X\n" | ||
| 23468 | + "fragmentation %1X\n" | ||
| 23469 | + "Rx Queue 1 Count Descriptors: %X\n" | ||
| 23470 | + "Rx Queue 1 Host Memory Start: %X\n" | ||
| 23471 | + "Tx Queue 1 Count Descriptors: %X\n" | ||
| 23472 | + "Tx Queue 1 Attributes: %X\n", | ||
| 23473 | + memconf.len, (int) sizeof(memconf), | ||
| 23474 | + memconf.no_of_stations, | ||
| 23475 | + memconf.memory_block_size, | ||
| 23476 | + memconf.tx_rx_memory_block_allocation, | ||
| 23477 | + memconf.count_rx_queues, memconf.count_tx_queues, | ||
| 23478 | + memconf.options, | ||
| 23479 | + memconf.fragmentation, | ||
| 23480 | + memconf.rx_queue1_count_descs, | ||
| 23481 | + acx2cpu(memconf.rx_queue1_host_rx_start), | ||
| 23482 | + memconf.tx_queue1_count_descs, | ||
| 23483 | + memconf.tx_queue1_attributes); | ||
| 23484 | + | ||
| 23485 | + /* dump Acx111 Queue Configuration */ | ||
| 23486 | + printk("dump queue head:\n" | ||
| 23487 | + "data read: %d, struct size: %d\n" | ||
| 23488 | + "tx_memory_block_address (from card): %X\n" | ||
| 23489 | + "rx_memory_block_address (from card): %X\n" | ||
| 23490 | + "rx1_queue address (from card): %X\n" | ||
| 23491 | + "tx1_queue address (from card): %X\n" | ||
| 23492 | + "tx1_queue attributes (from card): %X\n", | ||
| 23493 | + queueconf.len, (int) sizeof(queueconf), | ||
| 23494 | + queueconf.tx_memory_block_address, | ||
| 23495 | + queueconf.rx_memory_block_address, | ||
| 23496 | + queueconf.rx1_queue_address, | ||
| 23497 | + queueconf.tx1_queue_address, | ||
| 23498 | + queueconf.tx1_attributes); | ||
| 23499 | + | ||
| 23500 | + /* dump Acx111 Mem Map */ | ||
| 23501 | + printk("dump mem map:\n" | ||
| 23502 | + "data read: %d, struct size: %d\n" | ||
| 23503 | + "Code start: %X\n" | ||
| 23504 | + "Code end: %X\n" | ||
| 23505 | + "WEP default key start: %X\n" | ||
| 23506 | + "WEP default key end: %X\n" | ||
| 23507 | + "STA table start: %X\n" | ||
| 23508 | + "STA table end: %X\n" | ||
| 23509 | + "Packet template start: %X\n" | ||
| 23510 | + "Packet template end: %X\n" | ||
| 23511 | + "Queue memory start: %X\n" | ||
| 23512 | + "Queue memory end: %X\n" | ||
| 23513 | + "Packet memory pool start: %X\n" | ||
| 23514 | + "Packet memory pool end: %X\n" | ||
| 23515 | + "iobase: %p\n" | ||
| 23516 | + "iobase2: %p\n", | ||
| 23517 | + *((u16 *)&memmap[0x02]), (int) sizeof(memmap), | ||
| 23518 | + *((u32 *)&memmap[0x04]), | ||
| 23519 | + *((u32 *)&memmap[0x08]), | ||
| 23520 | + *((u32 *)&memmap[0x0C]), | ||
| 23521 | + *((u32 *)&memmap[0x10]), | ||
| 23522 | + *((u32 *)&memmap[0x14]), | ||
| 23523 | + *((u32 *)&memmap[0x18]), | ||
| 23524 | + *((u32 *)&memmap[0x1C]), | ||
| 23525 | + *((u32 *)&memmap[0x20]), | ||
| 23526 | + *((u32 *)&memmap[0x24]), | ||
| 23527 | + *((u32 *)&memmap[0x28]), | ||
| 23528 | + *((u32 *)&memmap[0x2C]), | ||
| 23529 | + *((u32 *)&memmap[0x30]), | ||
| 23530 | + adev->iobase, | ||
| 23531 | + adev->iobase2); | ||
| 23532 | + | ||
| 23533 | + /* dump Acx111 Rx Config */ | ||
| 23534 | + printk("dump rx config:\n" | ||
| 23535 | + "data read: %d, struct size: %d\n" | ||
| 23536 | + "rx config: %X\n" | ||
| 23537 | + "rx filter config: %X\n", | ||
| 23538 | + *((u16 *)&rxconfig[0x02]), (int) sizeof(rxconfig), | ||
| 23539 | + *((u16 *)&rxconfig[0x04]), | ||
| 23540 | + *((u16 *)&rxconfig[0x06])); | ||
| 23541 | + | ||
| 23542 | + /* dump Acx111 fcs error */ | ||
| 23543 | + printk("dump fcserror:\n" | ||
| 23544 | + "data read: %d, struct size: %d\n" | ||
| 23545 | + "fcserrors: %X\n", | ||
| 23546 | + *((u16 *)&fcserror[0x02]), (int) sizeof(fcserror), | ||
| 23547 | + *((u32 *)&fcserror[0x04])); | ||
| 23548 | + | ||
| 23549 | + /* dump Acx111 rate fallback */ | ||
| 23550 | + printk("dump rate fallback:\n" | ||
| 23551 | + "data read: %d, struct size: %d\n" | ||
| 23552 | + "ratefallback: %X\n", | ||
| 23553 | + *((u16 *)&ratefallback[0x02]), (int) sizeof(ratefallback), | ||
| 23554 | + *((u8 *)&ratefallback[0x04])); | ||
| 23555 | + | ||
| 23556 | + /* protect against IRQ */ | ||
| 23557 | + acx_lock(adev, flags); | ||
| 23558 | + | ||
| 23559 | + /* dump acx111 internal rx descriptor ring buffer */ | ||
| 23560 | + rxdesc = adev->rxdesc_start; | ||
| 23561 | + | ||
| 23562 | + /* loop over complete receive pool */ | ||
| 23563 | + if (rxdesc) for (i = 0; i < RX_CNT; i++) { | ||
| 23564 | + printk("\ndump internal rxdesc %d:\n" | ||
| 23565 | + "mem pos %p\n" | ||
| 23566 | + "next 0x%X\n" | ||
| 23567 | + "acx mem pointer (dynamic) 0x%X\n" | ||
| 23568 | + "CTL (dynamic) 0x%X\n" | ||
| 23569 | + "Rate (dynamic) 0x%X\n" | ||
| 23570 | + "RxStatus (dynamic) 0x%X\n" | ||
| 23571 | + "Mod/Pre (dynamic) 0x%X\n", | ||
| 23572 | + i, | ||
| 23573 | + rxdesc, | ||
| 23574 | + acx2cpu(rxdesc->pNextDesc), | ||
| 23575 | + acx2cpu(rxdesc->ACXMemPtr), | ||
| 23576 | + rxdesc->Ctl_8, | ||
| 23577 | + rxdesc->rate, | ||
| 23578 | + rxdesc->error, | ||
| 23579 | + rxdesc->SNR); | ||
| 23580 | + rxdesc++; | ||
| 23581 | + } | ||
| 23582 | + | ||
| 23583 | + /* dump host rx descriptor ring buffer */ | ||
| 23584 | + | ||
| 23585 | + rxhostdesc = adev->rxhostdesc_start; | ||
| 23586 | + | ||
| 23587 | + /* loop over complete receive pool */ | ||
| 23588 | + if (rxhostdesc) for (i = 0; i < RX_CNT; i++) { | ||
| 23589 | + printk("\ndump host rxdesc %d:\n" | ||
| 23590 | + "mem pos %p\n" | ||
| 23591 | + "buffer mem pos 0x%X\n" | ||
| 23592 | + "buffer mem offset 0x%X\n" | ||
| 23593 | + "CTL 0x%X\n" | ||
| 23594 | + "Length 0x%X\n" | ||
| 23595 | + "next 0x%X\n" | ||
| 23596 | + "Status 0x%X\n", | ||
| 23597 | + i, | ||
| 23598 | + rxhostdesc, | ||
| 23599 | + acx2cpu(rxhostdesc->data_phy), | ||
| 23600 | + rxhostdesc->data_offset, | ||
| 23601 | + le16_to_cpu(rxhostdesc->Ctl_16), | ||
| 23602 | + le16_to_cpu(rxhostdesc->length), | ||
| 23603 | + acx2cpu(rxhostdesc->desc_phy_next), | ||
| 23604 | + rxhostdesc->Status); | ||
| 23605 | + rxhostdesc++; | ||
| 23606 | + } | ||
| 23607 | + | ||
| 23608 | + /* dump acx111 internal tx descriptor ring buffer */ | ||
| 23609 | + txdesc = adev->txdesc_start; | ||
| 23610 | + | ||
| 23611 | + /* loop over complete transmit pool */ | ||
| 23612 | + if (txdesc) for (i = 0; i < TX_CNT; i++) { | ||
| 23613 | + printk("\ndump internal txdesc %d:\n" | ||
| 23614 | + "size 0x%X\n" | ||
| 23615 | + "mem pos %p\n" | ||
| 23616 | + "next 0x%X\n" | ||
| 23617 | + "acx mem pointer (dynamic) 0x%X\n" | ||
| 23618 | + "host mem pointer (dynamic) 0x%X\n" | ||
| 23619 | + "length (dynamic) 0x%X\n" | ||
| 23620 | + "CTL (dynamic) 0x%X\n" | ||
| 23621 | + "CTL2 (dynamic) 0x%X\n" | ||
| 23622 | + "Status (dynamic) 0x%X\n" | ||
| 23623 | + "Rate (dynamic) 0x%X\n", | ||
| 23624 | + i, | ||
| 23625 | + (int) sizeof(struct txdesc), | ||
| 23626 | + txdesc, | ||
| 23627 | + acx2cpu(txdesc->pNextDesc), | ||
| 23628 | + acx2cpu(txdesc->AcxMemPtr), | ||
| 23629 | + acx2cpu(txdesc->HostMemPtr), | ||
| 23630 | + le16_to_cpu(txdesc->total_length), | ||
| 23631 | + txdesc->Ctl_8, | ||
| 23632 | + txdesc->Ctl2_8, txdesc->error, | ||
| 23633 | + txdesc->u.r1.rate); | ||
| 23634 | + txdesc = advance_txdesc(adev, txdesc, 1); | ||
| 23635 | + } | ||
| 23636 | + | ||
| 23637 | + /* dump host tx descriptor ring buffer */ | ||
| 23638 | + | ||
| 23639 | + txhostdesc = adev->txhostdesc_start; | ||
| 23640 | + | ||
| 23641 | + /* loop over complete host send pool */ | ||
| 23642 | + if (txhostdesc) for (i = 0; i < TX_CNT * 2; i++) { | ||
| 23643 | + printk("\ndump host txdesc %d:\n" | ||
| 23644 | + "mem pos %p\n" | ||
| 23645 | + "buffer mem pos 0x%X\n" | ||
| 23646 | + "buffer mem offset 0x%X\n" | ||
| 23647 | + "CTL 0x%X\n" | ||
| 23648 | + "Length 0x%X\n" | ||
| 23649 | + "next 0x%X\n" | ||
| 23650 | + "Status 0x%X\n", | ||
| 23651 | + i, | ||
| 23652 | + txhostdesc, | ||
| 23653 | + acx2cpu(txhostdesc->data_phy), | ||
| 23654 | + txhostdesc->data_offset, | ||
| 23655 | + le16_to_cpu(txhostdesc->Ctl_16), | ||
| 23656 | + le16_to_cpu(txhostdesc->length), | ||
| 23657 | + acx2cpu(txhostdesc->desc_phy_next), | ||
| 23658 | + le32_to_cpu(txhostdesc->Status)); | ||
| 23659 | + txhostdesc++; | ||
| 23660 | + } | ||
| 23661 | + | ||
| 23662 | + /* write_reg16(adev, 0xb4, 0x4); */ | ||
| 23663 | + | ||
| 23664 | + acx_unlock(adev, flags); | ||
| 23665 | +end_ok: | ||
| 23666 | + | ||
| 23667 | + acx_sem_unlock(adev); | ||
| 23668 | +#endif /* ACX_DEBUG */ | ||
| 23669 | + return OK; | ||
| 23670 | +} | ||
| 23671 | + | ||
| 23672 | + | ||
| 23673 | +/*********************************************************************** | ||
| 23674 | +*/ | ||
| 23675 | +int | ||
| 23676 | +acx100mem_ioctl_set_phy_amp_bias( | ||
| 23677 | + struct net_device *ndev, | ||
| 23678 | + struct iw_request_info *info, | ||
| 23679 | + struct iw_param *vwrq, | ||
| 23680 | + char *extra) | ||
| 23681 | +{ | ||
| 23682 | + acx_device_t *adev = ndev2adev(ndev); | ||
| 23683 | + unsigned long flags; | ||
| 23684 | + u16 gpio_old; | ||
| 23685 | + | ||
| 23686 | + if (!IS_ACX100(adev)) { | ||
| 23687 | + /* WARNING!!! | ||
| 23688 | + * Removing this check *might* damage | ||
| 23689 | + * hardware, since we're tweaking GPIOs here after all!!! | ||
| 23690 | + * You've been warned... | ||
| 23691 | + * WARNING!!! */ | ||
| 23692 | + printk("acx: sorry, setting bias level for non-acx100 " | ||
| 23693 | + "is not supported yet\n"); | ||
| 23694 | + return OK; | ||
| 23695 | + } | ||
| 23696 | + | ||
| 23697 | + if (*extra > 7) { | ||
| 23698 | + printk("acx: invalid bias parameter, range is 0-7\n"); | ||
| 23699 | + return -EINVAL; | ||
| 23700 | + } | ||
| 23701 | + | ||
| 23702 | + acx_sem_lock(adev); | ||
| 23703 | + | ||
| 23704 | + /* Need to lock accesses to [IO_ACX_GPIO_OUT]: | ||
| 23705 | + * IRQ handler uses it to update LED */ | ||
| 23706 | + acx_lock(adev, flags); | ||
| 23707 | + gpio_old = read_reg16(adev, IO_ACX_GPIO_OUT); | ||
| 23708 | + write_reg16(adev, IO_ACX_GPIO_OUT, (gpio_old & 0xf8ff) | ((u16)*extra << 8)); | ||
| 23709 | + acx_unlock(adev, flags); | ||
| 23710 | + | ||
| 23711 | + log(L_DEBUG, "gpio_old: 0x%04X\n", gpio_old); | ||
| 23712 | + printk("%s: PHY power amplifier bias: old:%d, new:%d\n", | ||
| 23713 | + ndev->name, | ||
| 23714 | + (gpio_old & 0x0700) >> 8, (unsigned char)*extra); | ||
| 23715 | + | ||
| 23716 | + acx_sem_unlock(adev); | ||
| 23717 | + | ||
| 23718 | + return OK; | ||
| 23719 | +} | ||
| 23720 | + | ||
| 23721 | +/*************************************************************** | ||
| 23722 | +** acxmem_l_alloc_tx | ||
| 23723 | +** Actually returns a txdesc_t* ptr | ||
| 23724 | +** | ||
| 23725 | +** FIXME: in case of fragments, should allocate multiple descrs | ||
| 23726 | +** after figuring out how many we need and whether we still have | ||
| 23727 | +** sufficiently many. | ||
| 23728 | +*/ | ||
| 23729 | +tx_t* | ||
| 23730 | +acxmem_l_alloc_tx(acx_device_t *adev) | ||
| 23731 | +{ | ||
| 23732 | + struct txdesc *txdesc; | ||
| 23733 | + unsigned head; | ||
| 23734 | + u8 ctl8; | ||
| 23735 | + static int txattempts = 0; | ||
| 23736 | + | ||
| 23737 | + FN_ENTER; | ||
| 23738 | + | ||
| 23739 | + if (unlikely(!adev->tx_free)) { | ||
| 23740 | + printk("acx: BUG: no free txdesc left\n"); | ||
| 23741 | + /* | ||
| 23742 | + * Probably the ACX ignored a transmit attempt and now there's a packet | ||
| 23743 | + * sitting in the queue we think should be transmitting but the ACX doesn't | ||
| 23744 | + * know about. | ||
| 23745 | + * On the first pass, send the ACX a TxProc interrupt to try moving | ||
| 23746 | + * things along, and if that doesn't work (ie, we get called again) completely | ||
| 23747 | + * flush the transmit queue. | ||
| 23748 | + */ | ||
| 23749 | + if (txattempts < 10) { | ||
| 23750 | + txattempts++; | ||
| 23751 | + printk ("acx: trying to wake up ACX\n"); | ||
| 23752 | + write_reg16(adev, IO_ACX_INT_TRIG, INT_TRIG_TXPRC); | ||
| 23753 | + write_flush(adev); } | ||
| 23754 | + else { | ||
| 23755 | + txattempts = 0; | ||
| 23756 | + printk ("acx: flushing transmit queue.\n"); | ||
| 23757 | + acxmem_l_clean_txdesc_emergency (adev); | ||
| 23758 | + } | ||
| 23759 | + txdesc = NULL; | ||
| 23760 | + goto end; | ||
| 23761 | + } | ||
| 23762 | + | ||
| 23763 | + /* | ||
| 23764 | + * Make a quick check to see if there is transmit buffer space on | ||
| 23765 | + * the ACX. This can't guarantee there is enough space for the packet | ||
| 23766 | + * since we don't yet know how big it is, but it will prevent at least some | ||
| 23767 | + * annoyances. | ||
| 23768 | + */ | ||
| 23769 | + if (!adev->acx_txbuf_blocks_free) { | ||
| 23770 | + txdesc = NULL; | ||
| 23771 | + goto end; | ||
| 23772 | + } | ||
| 23773 | + | ||
| 23774 | + head = adev->tx_head; | ||
| 23775 | + /* | ||
| 23776 | + * txdesc points to ACX memory | ||
| 23777 | + */ | ||
| 23778 | + txdesc = get_txdesc(adev, head); | ||
| 23779 | + ctl8 = read_slavemem8 (adev, (u32) &(txdesc->Ctl_8)); | ||
| 23780 | + | ||
| 23781 | + /* | ||
| 23782 | + * If we don't own the buffer (HOSTOWN) it is certainly not free; however, | ||
| 23783 | + * we may have previously thought we had enough memory to send | ||
| 23784 | + * a packet, allocated the buffer then gave up when we found not enough | ||
| 23785 | + * transmit buffer space on the ACX. In that case, HOSTOWN and | ||
| 23786 | + * ACXDONE will both be set. | ||
| 23787 | + */ | ||
| 23788 | + if (unlikely(DESC_CTL_HOSTOWN != (ctl8 & DESC_CTL_HOSTOWN))) { | ||
| 23789 | + /* whoops, descr at current index is not free, so probably | ||
| 23790 | + * ring buffer already full */ | ||
| 23791 | + printk("acx: BUG: tx_head:%d Ctl8:0x%02X - failed to find " | ||
| 23792 | + "free txdesc\n", head, ctl8); | ||
| 23793 | + txdesc = NULL; | ||
| 23794 | + goto end; | ||
| 23795 | + } | ||
| 23796 | + | ||
| 23797 | + /* Needed in case txdesc won't be eventually submitted for tx */ | ||
| 23798 | + write_slavemem8 (adev, (u32) &(txdesc->Ctl_8), DESC_CTL_ACXDONE_HOSTOWN); | ||
| 23799 | + | ||
| 23800 | + adev->tx_free--; | ||
| 23801 | + log(L_BUFT, "tx: got desc %u, %u remain\n", | ||
| 23802 | + head, adev->tx_free); | ||
| 23803 | + /* Keep a few free descs between head and tail of tx ring. | ||
| 23804 | + ** It is not absolutely needed, just feels safer */ | ||
| 23805 | + if (adev->tx_free < TX_STOP_QUEUE) { | ||
| 23806 | + log(L_BUF, "stop queue (%u tx desc left)\n", | ||
| 23807 | + adev->tx_free); | ||
| 23808 | + acx_stop_queue(adev->ndev, NULL); | ||
| 23809 | + } | ||
| 23810 | + | ||
| 23811 | + /* returning current descriptor, so advance to next free one */ | ||
| 23812 | + adev->tx_head = (head + 1) % TX_CNT; | ||
| 23813 | +end: | ||
| 23814 | + FN_EXIT0; | ||
| 23815 | + | ||
| 23816 | + return (tx_t*)txdesc; | ||
| 23817 | +} | ||
| 23818 | + | ||
| 23819 | + | ||
| 23820 | +/*************************************************************** | ||
| 23821 | +** acxmem_l_dealloc_tx | ||
| 23822 | +** Clears out a previously allocatedvoid acxmem_l_dealloc_tx(tx_t *tx_opaque); | ||
| 23823 | + transmit descriptor. The ACX | ||
| 23824 | +** can get confused if we skip transmit descriptors in the queue, | ||
| 23825 | +** so when we don't need a descriptor return it to its original | ||
| 23826 | +** state and move the queue head pointer back. | ||
| 23827 | +** | ||
| 23828 | +*/ | ||
| 23829 | +void | ||
| 23830 | +acxmem_l_dealloc_tx(acx_device_t *adev, tx_t *tx_opaque) | ||
| 23831 | +{ | ||
| 23832 | + /* | ||
| 23833 | + * txdesc is the address of the descriptor on the ACX. | ||
| 23834 | + */ | ||
| 23835 | + txdesc_t *txdesc = (txdesc_t*)tx_opaque; | ||
| 23836 | + txdesc_t tmptxdesc; | ||
| 23837 | + int index; | ||
| 23838 | + | ||
| 23839 | + memset (&tmptxdesc, 0, sizeof(tmptxdesc)); | ||
| 23840 | + tmptxdesc.Ctl_8 = DESC_CTL_HOSTOWN | DESC_CTL_FIRSTFRAG; | ||
| 23841 | + tmptxdesc.u.r1.rate = 0x0a; | ||
| 23842 | + | ||
| 23843 | + /* | ||
| 23844 | + * Clear out all of the transmit descriptor except for the next pointer | ||
| 23845 | + */ | ||
| 23846 | + copy_to_slavemem (adev, (u32) &(txdesc->HostMemPtr), | ||
| 23847 | + (u8 *) &(tmptxdesc.HostMemPtr), | ||
| 23848 | + sizeof (tmptxdesc) - sizeof(tmptxdesc.pNextDesc)); | ||
| 23849 | + | ||
| 23850 | + /* | ||
| 23851 | + * This is only called immediately after we've allocated, so we should | ||
| 23852 | + * be able to set the head back to this descriptor. | ||
| 23853 | + */ | ||
| 23854 | + index = ((u8*) txdesc - (u8*)adev->txdesc_start) / adev->txdesc_size; | ||
| 23855 | + printk ("acx_dealloc: moving head from %d to %d\n", adev->tx_head, index); | ||
| 23856 | + adev->tx_head = index; | ||
| 23857 | +} | ||
| 23858 | + | ||
| 23859 | + | ||
| 23860 | +/*********************************************************************** | ||
| 23861 | +*/ | ||
| 23862 | +void* | ||
| 23863 | +acxmem_l_get_txbuf(acx_device_t *adev, tx_t* tx_opaque) | ||
| 23864 | +{ | ||
| 23865 | + return get_txhostdesc(adev, (txdesc_t*)tx_opaque)->data; | ||
| 23866 | +} | ||
| 23867 | + | ||
| 23868 | + | ||
| 23869 | +/*********************************************************************** | ||
| 23870 | +** acxmem_l_tx_data | ||
| 23871 | +** | ||
| 23872 | +** Can be called from IRQ (rx -> (AP bridging or mgmt response) -> tx). | ||
| 23873 | +** Can be called from acx_i_start_xmit (data frames from net core). | ||
| 23874 | +** | ||
| 23875 | +** FIXME: in case of fragments, should loop over the number of | ||
| 23876 | +** pre-allocated tx descrs, properly setting up transfer data and | ||
| 23877 | +** CTL_xxx flags according to fragment number. | ||
| 23878 | +*/ | ||
| 23879 | +void | ||
| 23880 | +acxmem_update_queue_indicator (acx_device_t *adev, int txqueue) | ||
| 23881 | +{ | ||
| 23882 | +#ifdef USING_MORE_THAN_ONE_TRANSMIT_QUEUE | ||
| 23883 | + u32 indicator; | ||
| 23884 | + unsigned long flags; | ||
| 23885 | + int count; | ||
| 23886 | + | ||
| 23887 | + /* | ||
| 23888 | + * Can't handle an interrupt while we're fiddling with the ACX's lock, | ||
| 23889 | + * according to TI. The ACX is supposed to hold fw_lock for at most | ||
| 23890 | + * 500ns. | ||
| 23891 | + */ | ||
| 23892 | + local_irq_save (flags); | ||
| 23893 | + | ||
| 23894 | + /* | ||
| 23895 | + * Wait for ACX to release the lock (at most 500ns). | ||
| 23896 | + */ | ||
| 23897 | + count = 0; | ||
| 23898 | + while (read_slavemem16 (adev, (u32) &(adev->acx_queue_indicator->fw_lock)) | ||
| 23899 | + && (count++ < 50)) { | ||
| 23900 | + ndelay (10); | ||
| 23901 | + } | ||
| 23902 | + if (count < 50) { | ||
| 23903 | + | ||
| 23904 | + /* | ||
| 23905 | + * Take out the host lock - anything non-zero will work, so don't worry about | ||
| 23906 | + * be/le | ||
| 23907 | + */ | ||
| 23908 | + write_slavemem16 (adev, (u32) &(adev->acx_queue_indicator->host_lock), 1); | ||
| 23909 | + | ||
| 23910 | + /* | ||
| 23911 | + * Avoid a race condition | ||
| 23912 | + */ | ||
| 23913 | + count = 0; | ||
| 23914 | + while (read_slavemem16 (adev, (u32) &(adev->acx_queue_indicator->fw_lock)) | ||
| 23915 | + && (count++ < 50)) { | ||
| 23916 | + ndelay (10); | ||
| 23917 | + } | ||
| 23918 | + | ||
| 23919 | + if (count < 50) { | ||
| 23920 | + /* | ||
| 23921 | + * Mark the queue active | ||
| 23922 | + */ | ||
| 23923 | + indicator = read_slavemem32 (adev, (u32) &(adev->acx_queue_indicator->indicator)); | ||
| 23924 | + indicator |= cpu_to_le32 (1 << txqueue); | ||
| 23925 | + write_slavemem32 (adev, (u32) &(adev->acx_queue_indicator->indicator), indicator); | ||
| 23926 | + } | ||
| 23927 | + | ||
| 23928 | + /* | ||
| 23929 | + * Release the host lock | ||
| 23930 | + */ | ||
| 23931 | + write_slavemem16 (adev, (u32) &(adev->acx_queue_indicator->host_lock), 0); | ||
| 23932 | + | ||
| 23933 | + } | ||
| 23934 | + | ||
| 23935 | + /* | ||
| 23936 | + * Restore interrupts | ||
| 23937 | + */ | ||
| 23938 | + local_irq_restore (flags); | ||
| 23939 | +#endif | ||
| 23940 | +} | ||
| 23941 | + | ||
| 23942 | +void | ||
| 23943 | +acxmem_l_tx_data(acx_device_t *adev, tx_t* tx_opaque, int len) | ||
| 23944 | +{ | ||
| 23945 | + /* | ||
| 23946 | + * txdesc is the address on the ACX | ||
| 23947 | + */ | ||
| 23948 | + txdesc_t *txdesc = (txdesc_t*)tx_opaque; | ||
| 23949 | + txhostdesc_t *hostdesc1, *hostdesc2; | ||
| 23950 | + client_t *clt; | ||
| 23951 | + u16 rate_cur; | ||
| 23952 | + u8 Ctl_8, Ctl2_8; | ||
| 23953 | + u32 addr; | ||
| 23954 | + | ||
| 23955 | + FN_ENTER; | ||
| 23956 | + /* fw doesn't tx such packets anyhow */ | ||
| 23957 | + if (unlikely(len < WLAN_HDR_A3_LEN)) | ||
| 23958 | + goto end; | ||
| 23959 | + | ||
| 23960 | + hostdesc1 = get_txhostdesc(adev, txdesc); | ||
| 23961 | + /* modify flag status in separate variable to be able to write it back | ||
| 23962 | + * in one big swoop later (also in order to have less device memory | ||
| 23963 | + * accesses) */ | ||
| 23964 | + Ctl_8 = read_slavemem8 (adev, (u32) &(txdesc->Ctl_8)); | ||
| 23965 | + Ctl2_8 = 0; /* really need to init it to 0, not txdesc->Ctl2_8, it seems */ | ||
| 23966 | + | ||
| 23967 | + hostdesc2 = hostdesc1 + 1; | ||
| 23968 | + | ||
| 23969 | + /* DON'T simply set Ctl field to 0 here globally, | ||
| 23970 | + * it needs to maintain a consistent flag status (those are state flags!!), | ||
| 23971 | + * otherwise it may lead to severe disruption. Only set or reset particular | ||
| 23972 | + * flags at the exact moment this is needed... */ | ||
| 23973 | + | ||
| 23974 | + /* let chip do RTS/CTS handshaking before sending | ||
| 23975 | + * in case packet size exceeds threshold */ | ||
| 23976 | + if (len > adev->rts_threshold) | ||
| 23977 | + SET_BIT(Ctl2_8, DESC_CTL2_RTS); | ||
| 23978 | + else | ||
| 23979 | + CLEAR_BIT(Ctl2_8, DESC_CTL2_RTS); | ||
| 23980 | + | ||
| 23981 | + switch (adev->mode) { | ||
| 23982 | + case ACX_MODE_0_ADHOC: | ||
| 23983 | + case ACX_MODE_3_AP: | ||
| 23984 | + clt = acx_l_sta_list_get(adev, ((wlan_hdr_t*)hostdesc1->data)->a1); | ||
| 23985 | + break; | ||
| 23986 | + case ACX_MODE_2_STA: | ||
| 23987 | + clt = adev->ap_client; | ||
| 23988 | + break; | ||
| 23989 | +#if 0 | ||
| 23990 | +/* testing was done on acx111: */ | ||
| 23991 | + case ACX_MODE_MONITOR: | ||
| 23992 | + SET_BIT(Ctl2_8, 0 | ||
| 23993 | +/* sends CTS to self before packet */ | ||
| 23994 | + + DESC_CTL2_SEQ /* don't increase sequence field */ | ||
| 23995 | +/* not working (looks like good fcs is still added) */ | ||
| 23996 | + + DESC_CTL2_FCS /* don't add the FCS */ | ||
| 23997 | +/* not tested */ | ||
| 23998 | + + DESC_CTL2_MORE_FRAG | ||
| 23999 | +/* not tested */ | ||
| 24000 | + + DESC_CTL2_RETRY /* don't increase retry field */ | ||
| 24001 | +/* not tested */ | ||
| 24002 | + + DESC_CTL2_POWER /* don't increase power mgmt. field */ | ||
| 24003 | +/* no effect */ | ||
| 24004 | + + DESC_CTL2_WEP /* encrypt this frame */ | ||
| 24005 | +/* not tested */ | ||
| 24006 | + + DESC_CTL2_DUR /* don't increase duration field */ | ||
| 24007 | + ); | ||
| 24008 | + /* fallthrough */ | ||
| 24009 | +#endif | ||
| 24010 | + default: /* ACX_MODE_OFF, ACX_MODE_MONITOR */ | ||
| 24011 | + clt = NULL; | ||
| 24012 | + break; | ||
| 24013 | + } | ||
| 24014 | + | ||
| 24015 | + rate_cur = clt ? clt->rate_cur : adev->rate_bcast; | ||
| 24016 | + if (unlikely(!rate_cur)) { | ||
| 24017 | + printk("acx: driver bug! bad ratemask\n"); | ||
| 24018 | + goto end; | ||
| 24019 | + } | ||
| 24020 | + | ||
| 24021 | + /* used in tx cleanup routine for auto rate and accounting: */ | ||
| 24022 | + put_txcr(adev, txdesc, clt, rate_cur); | ||
| 24023 | + | ||
| 24024 | + write_slavemem16 (adev, (u32) &(txdesc->total_length), cpu_to_le16(len)); | ||
| 24025 | + hostdesc2->length = cpu_to_le16(len - WLAN_HDR_A3_LEN); | ||
| 24026 | + if (IS_ACX111(adev)) { | ||
| 24027 | + /* note that if !txdesc->do_auto, txrate->cur | ||
| 24028 | + ** has only one nonzero bit */ | ||
| 24029 | + txdesc->u.r2.rate111 = cpu_to_le16( | ||
| 24030 | + rate_cur | ||
| 24031 | + /* WARNING: I was never able to make it work with prism54 AP. | ||
| 24032 | + ** It was falling down to 1Mbit where shortpre is not applicable, | ||
| 24033 | + ** and not working at all at "5,11 basic rates only" setting. | ||
| 24034 | + ** I even didn't see tx packets in radio packet capture. | ||
| 24035 | + ** Disabled for now --vda */ | ||
| 24036 | + /*| ((clt->shortpre && clt->cur!=RATE111_1) ? RATE111_SHORTPRE : 0) */ | ||
| 24037 | + ); | ||
| 24038 | +#ifdef TODO_FIGURE_OUT_WHEN_TO_SET_THIS | ||
| 24039 | + /* should add this to rate111 above as necessary */ | ||
| 24040 | + | (clt->pbcc511 ? RATE111_PBCC511 : 0) | ||
| 24041 | +#endif | ||
| 24042 | + hostdesc1->length = cpu_to_le16(len); | ||
| 24043 | + } else { /* ACX100 */ | ||
| 24044 | + u8 rate_100 = clt ? clt->rate_100 : adev->rate_bcast100; | ||
| 24045 | + write_slavemem8 (adev, (u32) &(txdesc->u.r1.rate), rate_100); | ||
| 24046 | +#ifdef TODO_FIGURE_OUT_WHEN_TO_SET_THIS | ||
| 24047 | + if (clt->pbcc511) { | ||
| 24048 | + if (n == RATE100_5 || n == RATE100_11) | ||
| 24049 | + n |= RATE100_PBCC511; | ||
| 24050 | + } | ||
| 24051 | + | ||
| 24052 | + if (clt->shortpre && (clt->cur != RATE111_1)) | ||
| 24053 | + SET_BIT(Ctl_8, DESC_CTL_SHORT_PREAMBLE); /* set Short Preamble */ | ||
| 24054 | +#endif | ||
| 24055 | + /* set autodma and reclaim and 1st mpdu */ | ||
| 24056 | + SET_BIT(Ctl_8, DESC_CTL_FIRSTFRAG); | ||
| 24057 | + | ||
| 24058 | +#if ACX_FRAGMENTATION | ||
| 24059 | + /* SET_BIT(Ctl2_8, DESC_CTL2_MORE_FRAG); cannot set it unconditionally, needs to be set for all non-last fragments */ | ||
| 24060 | +#endif | ||
| 24061 | + hostdesc1->length = cpu_to_le16(WLAN_HDR_A3_LEN); | ||
| 24062 | + | ||
| 24063 | + /* | ||
| 24064 | + * Since we're not using autodma copy the packet data to the acx now. | ||
| 24065 | + * Even host descriptors point to the packet header, and the odd indexed | ||
| 24066 | + * descriptor following points to the packet data. | ||
| 24067 | + * | ||
| 24068 | + * The first step is to find free memory in the ACX transmit buffers. | ||
| 24069 | + * They don't necessarily map one to one with the transmit queue entries, | ||
| 24070 | + * so search through them starting just after the last one used. | ||
| 24071 | + */ | ||
| 24072 | + addr = allocate_acx_txbuf_space (adev, len); | ||
| 24073 | + if (addr) { | ||
| 24074 | + chaincopy_to_slavemem (adev, addr, hostdesc1->data, len); | ||
| 24075 | + } | ||
| 24076 | + else { | ||
| 24077 | + /* | ||
| 24078 | + * Bummer. We thought we might have enough room in the transmit | ||
| 24079 | + * buffers to send this packet, but it turns out we don't. alloc_tx | ||
| 24080 | + * has already marked this transmit descriptor as HOSTOWN and ACXDONE, | ||
| 24081 | + * which means the ACX will hang when it gets to this descriptor unless | ||
| 24082 | + * we do something about it. Having a bubble in the transmit queue just | ||
| 24083 | + * doesn't seem to work, so we have to reset this transmit queue entry's | ||
| 24084 | + * state to its original value and back up our head pointer to point | ||
| 24085 | + * back to this entry. | ||
| 24086 | + */ | ||
| 24087 | + hostdesc1->length = 0; | ||
| 24088 | + hostdesc2->length = 0; | ||
| 24089 | + write_slavemem16 (adev, (u32) &(txdesc->total_length), 0); | ||
| 24090 | + write_slavemem8 (adev, (u32) &(txdesc->Ctl_8), DESC_CTL_HOSTOWN | DESC_CTL_FIRSTFRAG); | ||
| 24091 | + adev->tx_head = ((u8*) txdesc - (u8*) adev->txdesc_start) / adev->txdesc_size; | ||
| 24092 | + goto end; | ||
| 24093 | + } | ||
| 24094 | + /* | ||
| 24095 | + * Tell the ACX where the packet is. | ||
| 24096 | + */ | ||
| 24097 | + write_slavemem32 (adev, (u32) &(txdesc->AcxMemPtr), addr); | ||
| 24098 | + | ||
| 24099 | + } | ||
| 24100 | + /* don't need to clean ack/rts statistics here, already | ||
| 24101 | + * done on descr cleanup */ | ||
| 24102 | + | ||
| 24103 | + /* clears HOSTOWN and ACXDONE bits, thus telling that the descriptors | ||
| 24104 | + * are now owned by the acx100; do this as LAST operation */ | ||
| 24105 | + CLEAR_BIT(Ctl_8, DESC_CTL_ACXDONE_HOSTOWN); | ||
| 24106 | + /* flush writes before we release hostdesc to the adapter here */ | ||
| 24107 | + //wmb(); | ||
| 24108 | + | ||
| 24109 | + /* write back modified flags */ | ||
| 24110 | + /* | ||
| 24111 | + * At this point Ctl_8 should just be FIRSTFRAG | ||
| 24112 | + */ | ||
| 24113 | + write_slavemem8 (adev, (u32) &(txdesc->Ctl2_8),Ctl2_8); | ||
| 24114 | + write_slavemem8 (adev, (u32) &(txdesc->Ctl_8), Ctl_8); | ||
| 24115 | + /* unused: txdesc->tx_time = cpu_to_le32(jiffies); */ | ||
| 24116 | + | ||
| 24117 | + /* | ||
| 24118 | + * Update the queue indicator to say there's data on the first queue. | ||
| 24119 | + */ | ||
| 24120 | + acxmem_update_queue_indicator (adev, 0); | ||
| 24121 | + | ||
| 24122 | + /* flush writes before we tell the adapter that it's its turn now */ | ||
| 24123 | + mmiowb(); | ||
| 24124 | + write_reg16(adev, IO_ACX_INT_TRIG, INT_TRIG_TXPRC); | ||
| 24125 | + write_flush(adev); | ||
| 24126 | + | ||
| 24127 | + /* log the packet content AFTER sending it, | ||
| 24128 | + * in order to not delay sending any further than absolutely needed | ||
| 24129 | + * Do separate logs for acx100/111 to have human-readable rates */ | ||
| 24130 | + if (unlikely(acx_debug & (L_XFER|L_DATA))) { | ||
| 24131 | + u16 fc = ((wlan_hdr_t*)hostdesc1->data)->fc; | ||
| 24132 | + if (IS_ACX111(adev)) | ||
| 24133 | + printk("tx: pkt (%s): len %d " | ||
| 24134 | + "rate %04X%s status %u\n", | ||
| 24135 | + acx_get_packet_type_string(le16_to_cpu(fc)), len, | ||
| 24136 | + le16_to_cpu(txdesc->u.r2.rate111), | ||
| 24137 | + (le16_to_cpu(txdesc->u.r2.rate111) & RATE111_SHORTPRE) ? "(SPr)" : "", | ||
| 24138 | + adev->status); | ||
| 24139 | + else | ||
| 24140 | + printk("tx: pkt (%s): len %d rate %03u%s status %u\n", | ||
| 24141 | + acx_get_packet_type_string(fc), len, | ||
| 24142 | + read_slavemem8 (adev, (u32) &(txdesc->u.r1.rate)), | ||
| 24143 | + (Ctl_8 & DESC_CTL_SHORT_PREAMBLE) ? "(SPr)" : "", | ||
| 24144 | + adev->status); | ||
| 24145 | + | ||
| 24146 | + if (acx_debug & L_DATA) { | ||
| 24147 | + printk("tx: 802.11 [%d]: ", len); | ||
| 24148 | + acx_dump_bytes(hostdesc1->data, len); | ||
| 24149 | + } | ||
| 24150 | + } | ||
| 24151 | +end: | ||
| 24152 | + FN_EXIT0; | ||
| 24153 | +} | ||
| 24154 | + | ||
| 24155 | + | ||
| 24156 | +/*********************************************************************** | ||
| 24157 | +** acxmem_l_clean_txdesc | ||
| 24158 | +** | ||
| 24159 | +** This function resets the txdescs' status when the ACX100 | ||
| 24160 | +** signals the TX done IRQ (txdescs have been processed), starting with | ||
| 24161 | +** the pool index of the descriptor which we would use next, | ||
| 24162 | +** in order to make sure that we can be as fast as possible | ||
| 24163 | +** in filling new txdescs. | ||
| 24164 | +** Everytime we get called we know where the next packet to be cleaned is. | ||
| 24165 | +*/ | ||
| 24166 | + | ||
| 24167 | +#if !ACX_DEBUG | ||
| 24168 | +static inline void log_txbuffer(const acx_device_t *adev) {} | ||
| 24169 | +#else | ||
| 24170 | +static void | ||
| 24171 | +log_txbuffer(acx_device_t *adev) | ||
| 24172 | +{ | ||
| 24173 | + txdesc_t *txdesc; | ||
| 24174 | + int i; | ||
| 24175 | + u8 Ctl_8; | ||
| 24176 | + | ||
| 24177 | + /* no FN_ENTER here, we don't want that */ | ||
| 24178 | + /* no locks here, since it's entirely non-critical code */ | ||
| 24179 | + txdesc = adev->txdesc_start; | ||
| 24180 | + if (unlikely(!txdesc)) return; | ||
| 24181 | + printk("tx: desc->Ctl8's:"); | ||
| 24182 | + for (i = 0; i < TX_CNT; i++) { | ||
| 24183 | + Ctl_8 = read_slavemem8 (adev, (u32) &(txdesc->Ctl_8)); | ||
| 24184 | + printk(" %02X", Ctl_8); | ||
| 24185 | + txdesc = advance_txdesc(adev, txdesc, 1); | ||
| 24186 | + } | ||
| 24187 | + printk("\n"); | ||
| 24188 | +} | ||
| 24189 | +#endif | ||
| 24190 | + | ||
| 24191 | + | ||
| 24192 | +static void | ||
| 24193 | +handle_tx_error(acx_device_t *adev, u8 error, unsigned int finger) | ||
| 24194 | +{ | ||
| 24195 | + const char *err = "unknown error"; | ||
| 24196 | + | ||
| 24197 | + /* hmm, should we handle this as a mask | ||
| 24198 | + * of *several* bits? | ||
| 24199 | + * For now I think only caring about | ||
| 24200 | + * individual bits is ok... */ | ||
| 24201 | + switch (error) { | ||
| 24202 | + case 0x01: | ||
| 24203 | + err = "no Tx due to error in other fragment"; | ||
| 24204 | + adev->wstats.discard.fragment++; | ||
| 24205 | + break; | ||
| 24206 | + case 0x02: | ||
| 24207 | + err = "Tx aborted"; | ||
| 24208 | + adev->stats.tx_aborted_errors++; | ||
| 24209 | + break; | ||
| 24210 | + case 0x04: | ||
| 24211 | + err = "Tx desc wrong parameters"; | ||
| 24212 | + adev->wstats.discard.misc++; | ||
| 24213 | + break; | ||
| 24214 | + case 0x08: | ||
| 24215 | + err = "WEP key not found"; | ||
| 24216 | + adev->wstats.discard.misc++; | ||
| 24217 | + break; | ||
| 24218 | + case 0x10: | ||
| 24219 | + err = "MSDU lifetime timeout? - try changing " | ||
| 24220 | + "'iwconfig retry lifetime XXX'"; | ||
| 24221 | + adev->wstats.discard.misc++; | ||
| 24222 | + break; | ||
| 24223 | + case 0x20: | ||
| 24224 | + err = "excessive Tx retries due to either distance " | ||
| 24225 | + "too high or unable to Tx or Tx frame error - " | ||
| 24226 | + "try changing 'iwconfig txpower XXX' or " | ||
| 24227 | + "'sens'itivity or 'retry'"; | ||
| 24228 | + adev->wstats.discard.retries++; | ||
| 24229 | + /* Tx error 0x20 also seems to occur on | ||
| 24230 | + * overheating, so I'm not sure whether we | ||
| 24231 | + * actually want to do aggressive radio recalibration, | ||
| 24232 | + * since people maybe won't notice then that their hardware | ||
| 24233 | + * is slowly getting cooked... | ||
| 24234 | + * Or is it still a safe long distance from utter | ||
| 24235 | + * radio non-functionality despite many radio recalibs | ||
| 24236 | + * to final destructive overheating of the hardware? | ||
| 24237 | + * In this case we really should do recalib here... | ||
| 24238 | + * I guess the only way to find out is to do a | ||
| 24239 | + * potentially fatal self-experiment :-\ | ||
| 24240 | + * Or maybe only recalib in case we're using Tx | ||
| 24241 | + * rate auto (on errors switching to lower speed | ||
| 24242 | + * --> less heat?) or 802.11 power save mode? | ||
| 24243 | + * | ||
| 24244 | + * ok, just do it. */ | ||
| 24245 | + if (++adev->retry_errors_msg_ratelimit % 4 == 0) { | ||
| 24246 | + if (adev->retry_errors_msg_ratelimit <= 20) { | ||
| 24247 | + printk("%s: several excessive Tx " | ||
| 24248 | + "retry errors occurred, attempting " | ||
| 24249 | + "to recalibrate radio. Radio " | ||
| 24250 | + "drift might be caused by increasing " | ||
| 24251 | + "card temperature, please check the card " | ||
| 24252 | + "before it's too late!\n", | ||
| 24253 | + adev->ndev->name); | ||
| 24254 | + if (adev->retry_errors_msg_ratelimit == 20) | ||
| 24255 | + printk("disabling above message\n"); | ||
| 24256 | + } | ||
| 24257 | + | ||
| 24258 | + acx_schedule_task(adev, ACX_AFTER_IRQ_CMD_RADIO_RECALIB); | ||
| 24259 | + } | ||
| 24260 | + break; | ||
| 24261 | + case 0x40: | ||
| 24262 | + err = "Tx buffer overflow"; | ||
| 24263 | + adev->stats.tx_fifo_errors++; | ||
| 24264 | + break; | ||
| 24265 | + case 0x80: | ||
| 24266 | + err = "DMA error"; | ||
| 24267 | + adev->wstats.discard.misc++; | ||
| 24268 | + break; | ||
| 24269 | + } | ||
| 24270 | + adev->stats.tx_errors++; | ||
| 24271 | + if (adev->stats.tx_errors <= 20) | ||
| 24272 | + printk("%s: tx error 0x%02X, buf %02u! (%s)\n", | ||
| 24273 | + adev->ndev->name, error, finger, err); | ||
| 24274 | + else | ||
| 24275 | + printk("%s: tx error 0x%02X, buf %02u!\n", | ||
| 24276 | + adev->ndev->name, error, finger); | ||
| 24277 | +} | ||
| 24278 | + | ||
| 24279 | + | ||
| 24280 | +unsigned int | ||
| 24281 | +acxmem_l_clean_txdesc(acx_device_t *adev) | ||
| 24282 | +{ | ||
| 24283 | + txdesc_t *txdesc; | ||
| 24284 | + unsigned finger; | ||
| 24285 | + int num_cleaned; | ||
| 24286 | + u16 r111; | ||
| 24287 | + u8 error, ack_failures, rts_failures, rts_ok, r100, Ctl_8; | ||
| 24288 | + u32 acxmem; | ||
| 24289 | + txdesc_t tmptxdesc; | ||
| 24290 | + | ||
| 24291 | + FN_ENTER; | ||
| 24292 | + | ||
| 24293 | + /* | ||
| 24294 | + * Set up a template descriptor for re-initialization. The only | ||
| 24295 | + * things that get set are Ctl_8 and the rate, and the rate defaults | ||
| 24296 | + * to 1Mbps. | ||
| 24297 | + */ | ||
| 24298 | + memset (&tmptxdesc, 0, sizeof (tmptxdesc)); | ||
| 24299 | + tmptxdesc.Ctl_8 = DESC_CTL_HOSTOWN | DESC_CTL_FIRSTFRAG; | ||
| 24300 | + tmptxdesc.u.r1.rate = 0x0a; | ||
| 24301 | + | ||
| 24302 | + if (unlikely(acx_debug & L_DEBUG)) | ||
| 24303 | + log_txbuffer(adev); | ||
| 24304 | + | ||
| 24305 | + log(L_BUFT, "tx: cleaning up bufs from %u\n", adev->tx_tail); | ||
| 24306 | + | ||
| 24307 | + /* We know first descr which is not free yet. We advance it as far | ||
| 24308 | + ** as we see correct bits set in following descs (if next desc | ||
| 24309 | + ** is NOT free, we shouldn't advance at all). We know that in | ||
| 24310 | + ** front of tx_tail may be "holes" with isolated free descs. | ||
| 24311 | + ** We will catch up when all intermediate descs will be freed also */ | ||
| 24312 | + | ||
| 24313 | + finger = adev->tx_tail; | ||
| 24314 | + num_cleaned = 0; | ||
| 24315 | + while (likely(finger != adev->tx_head)) { | ||
| 24316 | + txdesc = get_txdesc(adev, finger); | ||
| 24317 | + | ||
| 24318 | + /* If we allocated txdesc on tx path but then decided | ||
| 24319 | + ** to NOT use it, then it will be left as a free "bubble" | ||
| 24320 | + ** in the "allocated for tx" part of the ring. | ||
| 24321 | + ** We may meet it on the next ring pass here. */ | ||
| 24322 | + | ||
| 24323 | + /* stop if not marked as "tx finished" and "host owned" */ | ||
| 24324 | + Ctl_8 = read_slavemem8 (adev, (u32) &(txdesc->Ctl_8)); | ||
| 24325 | + if ((Ctl_8 & DESC_CTL_ACXDONE_HOSTOWN) | ||
| 24326 | + != DESC_CTL_ACXDONE_HOSTOWN) { | ||
| 24327 | + if (unlikely(!num_cleaned)) { /* maybe remove completely */ | ||
| 24328 | + log(L_BUFT, "clean_txdesc: tail isn't free. " | ||
| 24329 | + "tail:%d head:%d\n", | ||
| 24330 | + adev->tx_tail, adev->tx_head); | ||
| 24331 | + } | ||
| 24332 | + break; | ||
| 24333 | + } | ||
| 24334 | + | ||
| 24335 | + /* remember desc values... */ | ||
| 24336 | + error = read_slavemem8 (adev, (u32) &(txdesc->error)); | ||
| 24337 | + ack_failures = read_slavemem8 (adev, (u32) &(txdesc->ack_failures)); | ||
| 24338 | + rts_failures = read_slavemem8 (adev, (u32) &(txdesc->u.rts.rts_failures)); | ||
| 24339 | + rts_ok = read_slavemem8 (adev, (u32) &(txdesc->u.rts.rts_ok)); | ||
| 24340 | + r100 = read_slavemem8 (adev, (u32) &(txdesc->u.r1.rate)); | ||
| 24341 | + r111 = le16_to_cpu(read_slavemem16 (adev, (u32) &(txdesc->u.r2.rate111))); | ||
| 24342 | + | ||
| 24343 | + /* need to check for certain error conditions before we | ||
| 24344 | + * clean the descriptor: we still need valid descr data here */ | ||
| 24345 | + if (unlikely(0x30 & error)) { | ||
| 24346 | + /* only send IWEVTXDROP in case of retry or lifetime exceeded; | ||
| 24347 | + * all other errors mean we screwed up locally */ | ||
| 24348 | + union iwreq_data wrqu; | ||
| 24349 | + wlan_hdr_t *hdr; | ||
| 24350 | + txhostdesc_t *hostdesc; | ||
| 24351 | + | ||
| 24352 | + hostdesc = get_txhostdesc(adev, txdesc); | ||
| 24353 | + hdr = (wlan_hdr_t *)hostdesc->data; | ||
| 24354 | + MAC_COPY(wrqu.addr.sa_data, hdr->a1); | ||
| 24355 | + wireless_send_event(adev->ndev, IWEVTXDROP, &wrqu, NULL); | ||
| 24356 | + } | ||
| 24357 | + | ||
| 24358 | + /* | ||
| 24359 | + * Free up the transmit data buffers | ||
| 24360 | + */ | ||
| 24361 | + acxmem = read_slavemem32 (adev, (u32) &(txdesc->AcxMemPtr)); | ||
| 24362 | + if (acxmem) { | ||
| 24363 | + reclaim_acx_txbuf_space (adev, acxmem); | ||
| 24364 | + } | ||
| 24365 | + | ||
| 24366 | + /* ...and free the desc by clearing all the fields | ||
| 24367 | + except the next pointer */ | ||
| 24368 | + copy_to_slavemem (adev, | ||
| 24369 | + (u32) &(txdesc->HostMemPtr), | ||
| 24370 | + (u8 *) &(tmptxdesc.HostMemPtr), | ||
| 24371 | + sizeof (tmptxdesc) - sizeof(tmptxdesc.pNextDesc) | ||
| 24372 | + ); | ||
| 24373 | + | ||
| 24374 | + adev->tx_free++; | ||
| 24375 | + num_cleaned++; | ||
| 24376 | + | ||
| 24377 | + if ((adev->tx_free >= TX_START_QUEUE) | ||
| 24378 | + && (adev->status == ACX_STATUS_4_ASSOCIATED) | ||
| 24379 | + && (acx_queue_stopped(adev->ndev)) | ||
| 24380 | + ) { | ||
| 24381 | + log(L_BUF, "tx: wake queue (avail. Tx desc %u)\n", | ||
| 24382 | + adev->tx_free); | ||
| 24383 | + acx_wake_queue(adev->ndev, NULL); | ||
| 24384 | + } | ||
| 24385 | + | ||
| 24386 | + /* do error checking, rate handling and logging | ||
| 24387 | + * AFTER having done the work, it's faster */ | ||
| 24388 | + | ||
| 24389 | + /* do rate handling */ | ||
| 24390 | + if (adev->rate_auto) { | ||
| 24391 | + struct client *clt = get_txc(adev, txdesc); | ||
| 24392 | + if (clt) { | ||
| 24393 | + u16 cur = get_txr(adev, txdesc); | ||
| 24394 | + if (clt->rate_cur == cur) { | ||
| 24395 | + acx_l_handle_txrate_auto(adev, clt, | ||
| 24396 | + cur, /* intended rate */ | ||
| 24397 | + r100, r111, /* actually used rate */ | ||
| 24398 | + (error & 0x30), /* was there an error? */ | ||
| 24399 | + TX_CNT + TX_CLEAN_BACKLOG - adev->tx_free); | ||
| 24400 | + } | ||
| 24401 | + } | ||
| 24402 | + } | ||
| 24403 | + | ||
| 24404 | + if (unlikely(error)) | ||
| 24405 | + handle_tx_error(adev, error, finger); | ||
| 24406 | + | ||
| 24407 | + if (IS_ACX111(adev)) | ||
| 24408 | + log(L_BUFT, "tx: cleaned %u: !ACK=%u !RTS=%u RTS=%u r111=%04X\n", | ||
| 24409 | + finger, ack_failures, rts_failures, rts_ok, r111); | ||
| 24410 | + else | ||
| 24411 | + log(L_BUFT, "tx: cleaned %u: !ACK=%u !RTS=%u RTS=%u rate=%u\n", | ||
| 24412 | + finger, ack_failures, rts_failures, rts_ok, r100); | ||
| 24413 | + | ||
| 24414 | + /* update pointer for descr to be cleaned next */ | ||
| 24415 | + finger = (finger + 1) % TX_CNT; | ||
| 24416 | + } | ||
| 24417 | + | ||
| 24418 | + /* remember last position */ | ||
| 24419 | + adev->tx_tail = finger; | ||
| 24420 | +/* end: */ | ||
| 24421 | + FN_EXIT1(num_cleaned); | ||
| 24422 | + return num_cleaned; | ||
| 24423 | +} | ||
| 24424 | + | ||
| 24425 | +/* clean *all* Tx descriptors, and regardless of their previous state. | ||
| 24426 | + * Used for brute-force reset handling. */ | ||
| 24427 | +void | ||
| 24428 | +acxmem_l_clean_txdesc_emergency(acx_device_t *adev) | ||
| 24429 | +{ | ||
| 24430 | + txdesc_t *txdesc; | ||
| 24431 | + int i; | ||
| 24432 | + u32 acxmem; | ||
| 24433 | + | ||
| 24434 | + FN_ENTER; | ||
| 24435 | + | ||
| 24436 | + for (i = 0; i < TX_CNT; i++) { | ||
| 24437 | + txdesc = get_txdesc(adev, i); | ||
| 24438 | + | ||
| 24439 | + /* free it */ | ||
| 24440 | + write_slavemem8 (adev, (u32) &(txdesc->ack_failures), 0); | ||
| 24441 | + write_slavemem8 (adev, (u32) &(txdesc->u.rts.rts_failures), 0); | ||
| 24442 | + write_slavemem8 (adev, (u32) &(txdesc->u.rts.rts_ok), 0); | ||
| 24443 | + write_slavemem8 (adev, (u32) &(txdesc->error), 0); | ||
| 24444 | + write_slavemem8 (adev, (u32) &(txdesc->Ctl_8), DESC_CTL_HOSTOWN); | ||
| 24445 | + | ||
| 24446 | + /* | ||
| 24447 | + * Clean up the memory allocated on the ACX for this transmit descriptor. | ||
| 24448 | + */ | ||
| 24449 | + acxmem = read_slavemem32 (adev, (u32) &(txdesc->AcxMemPtr)); | ||
| 24450 | + if (acxmem) { | ||
| 24451 | + reclaim_acx_txbuf_space (adev, acxmem); | ||
| 24452 | + } | ||
| 24453 | + | ||
| 24454 | + write_slavemem32 (adev, (u32) &(txdesc->AcxMemPtr), 0); | ||
| 24455 | + } | ||
| 24456 | + | ||
| 24457 | + adev->tx_free = TX_CNT; | ||
| 24458 | + | ||
| 24459 | + FN_EXIT0; | ||
| 24460 | +} | ||
| 24461 | + | ||
| 24462 | + | ||
| 24463 | +/*********************************************************************** | ||
| 24464 | +** acxmem_s_create_tx_host_desc_queue | ||
| 24465 | +*/ | ||
| 24466 | + | ||
| 24467 | +static void* | ||
| 24468 | +allocate(acx_device_t *adev, size_t size, dma_addr_t *phy, const char *msg) | ||
| 24469 | +{ | ||
| 24470 | + void *ptr; | ||
| 24471 | + ptr = kmalloc (size, GFP_KERNEL); | ||
| 24472 | + /* | ||
| 24473 | + * The ACX can't use the physical address, so we'll have to fake it | ||
| 24474 | + * later and it might be handy to have the virtual address. | ||
| 24475 | + */ | ||
| 24476 | + *phy = (dma_addr_t) NULL; | ||
| 24477 | + | ||
| 24478 | + if (ptr) { | ||
| 24479 | + log(L_DEBUG, "%s sz=%d adr=0x%p phy=0x%08llx\n", | ||
| 24480 | + msg, (int)size, ptr, (unsigned long long)*phy); | ||
| 24481 | + memset(ptr, 0, size); | ||
| 24482 | + return ptr; | ||
| 24483 | + } | ||
| 24484 | + printk(KERN_ERR "acx: %s allocation FAILED (%d bytes)\n", | ||
| 24485 | + msg, (int)size); | ||
| 24486 | + return NULL; | ||
| 24487 | +} | ||
| 24488 | + | ||
| 24489 | + | ||
| 24490 | +/* | ||
| 24491 | + * In the generic slave memory access mode, most of the stuff in | ||
| 24492 | + * the txhostdesc_t is unused. It's only here because the rest of | ||
| 24493 | + * the ACX driver expects it to be since the PCI version uses indirect | ||
| 24494 | + * host memory organization with DMA. Since we're not using DMA the | ||
| 24495 | + * only use we have for the host descriptors is to store the packets | ||
| 24496 | + * on the way out. | ||
| 24497 | + */ | ||
| 24498 | +static int | ||
| 24499 | +acxmem_s_create_tx_host_desc_queue(acx_device_t *adev) | ||
| 24500 | +{ | ||
| 24501 | + txhostdesc_t *hostdesc; | ||
| 24502 | + u8 *txbuf; | ||
| 24503 | + int i; | ||
| 24504 | + | ||
| 24505 | + FN_ENTER; | ||
| 24506 | + | ||
| 24507 | + /* allocate TX buffer */ | ||
| 24508 | + adev->txbuf_area_size = TX_CNT * WLAN_A4FR_MAXLEN_WEP_FCS; | ||
| 24509 | + | ||
| 24510 | + adev->txbuf_start = allocate(adev, adev->txbuf_area_size, | ||
| 24511 | + &adev->txbuf_startphy, "txbuf_start"); | ||
| 24512 | + if (!adev->txbuf_start) | ||
| 24513 | + goto fail; | ||
| 24514 | + | ||
| 24515 | + /* allocate the TX host descriptor queue pool */ | ||
| 24516 | + adev->txhostdesc_area_size = TX_CNT * 2*sizeof(*hostdesc); | ||
| 24517 | + | ||
| 24518 | + adev->txhostdesc_start = allocate(adev, adev->txhostdesc_area_size, | ||
| 24519 | + &adev->txhostdesc_startphy, "txhostdesc_start"); | ||
| 24520 | + if (!adev->txhostdesc_start) | ||
| 24521 | + goto fail; | ||
| 24522 | + | ||
| 24523 | + /* check for proper alignment of TX host descriptor pool */ | ||
| 24524 | + if ((long) adev->txhostdesc_start & 3) { | ||
| 24525 | + printk("acx: driver bug: dma alloc returns unaligned address\n"); | ||
| 24526 | + goto fail; | ||
| 24527 | + } | ||
| 24528 | + | ||
| 24529 | + hostdesc = adev->txhostdesc_start; | ||
| 24530 | + txbuf = adev->txbuf_start; | ||
| 24531 | + | ||
| 24532 | +#if 0 | ||
| 24533 | +/* Each tx buffer is accessed by hardware via | ||
| 24534 | +** txdesc -> txhostdesc(s) -> txbuffer(s). | ||
| 24535 | +** We use only one txhostdesc per txdesc, but it looks like | ||
| 24536 | +** acx111 is buggy: it accesses second txhostdesc | ||
| 24537 | +** (via hostdesc.desc_phy_next field) even if | ||
| 24538 | +** txdesc->length == hostdesc->length and thus | ||
| 24539 | +** entire packet was placed into first txhostdesc. | ||
| 24540 | +** Due to this bug acx111 hangs unless second txhostdesc | ||
| 24541 | +** has le16_to_cpu(hostdesc.length) = 3 (or larger) | ||
| 24542 | +** Storing NULL into hostdesc.desc_phy_next | ||
| 24543 | +** doesn't seem to help. | ||
| 24544 | +** | ||
| 24545 | +** Update: although it worked on Xterasys XN-2522g | ||
| 24546 | +** with len=3 trick, WG311v2 is even more bogus, doesn't work. | ||
| 24547 | +** Keeping this code (#ifdef'ed out) for documentational purposes. | ||
| 24548 | +*/ | ||
| 24549 | + for (i = 0; i < TX_CNT*2; i++) { | ||
| 24550 | + hostdesc_phy += sizeof(*hostdesc); | ||
| 24551 | + if (!(i & 1)) { | ||
| 24552 | + hostdesc->data_phy = cpu2acx(txbuf_phy); | ||
| 24553 | + /* hostdesc->data_offset = ... */ | ||
| 24554 | + /* hostdesc->reserved = ... */ | ||
| 24555 | + hostdesc->Ctl_16 = cpu_to_le16(DESC_CTL_HOSTOWN); | ||
| 24556 | + /* hostdesc->length = ... */ | ||
| 24557 | + hostdesc->desc_phy_next = cpu2acx(hostdesc_phy); | ||
| 24558 | + hostdesc->pNext = ptr2acx(NULL); | ||
| 24559 | + /* hostdesc->Status = ... */ | ||
| 24560 | + /* below: non-hardware fields */ | ||
| 24561 | + hostdesc->data = txbuf; | ||
| 24562 | + | ||
| 24563 | + txbuf += WLAN_A4FR_MAXLEN_WEP_FCS; | ||
| 24564 | + txbuf_phy += WLAN_A4FR_MAXLEN_WEP_FCS; | ||
| 24565 | + } else { | ||
| 24566 | + /* hostdesc->data_phy = ... */ | ||
| 24567 | + /* hostdesc->data_offset = ... */ | ||
| 24568 | + /* hostdesc->reserved = ... */ | ||
| 24569 | + /* hostdesc->Ctl_16 = ... */ | ||
| 24570 | + hostdesc->length = cpu_to_le16(3); /* bug workaround */ | ||
| 24571 | + /* hostdesc->desc_phy_next = ... */ | ||
| 24572 | + /* hostdesc->pNext = ... */ | ||
| 24573 | + /* hostdesc->Status = ... */ | ||
| 24574 | + /* below: non-hardware fields */ | ||
| 24575 | + /* hostdesc->data = ... */ | ||
| 24576 | + } | ||
| 24577 | + hostdesc++; | ||
| 24578 | + } | ||
| 24579 | +#endif | ||
| 24580 | +/* We initialize two hostdescs so that they point to adjacent | ||
| 24581 | +** memory areas. Thus txbuf is really just a contiguous memory area */ | ||
| 24582 | + for (i = 0; i < TX_CNT*2; i++) { | ||
| 24583 | + /* ->data is a non-hardware field: */ | ||
| 24584 | + hostdesc->data = txbuf; | ||
| 24585 | + | ||
| 24586 | + if (!(i & 1)) { | ||
| 24587 | + txbuf += WLAN_HDR_A3_LEN; | ||
| 24588 | + } else { | ||
| 24589 | + txbuf += WLAN_A4FR_MAXLEN_WEP_FCS - WLAN_HDR_A3_LEN; | ||
| 24590 | + } | ||
| 24591 | + hostdesc++; | ||
| 24592 | + } | ||
| 24593 | + hostdesc--; | ||
| 24594 | + | ||
| 24595 | + FN_EXIT1(OK); | ||
| 24596 | + return OK; | ||
| 24597 | +fail: | ||
| 24598 | + printk("acx: create_tx_host_desc_queue FAILED\n"); | ||
| 24599 | + /* dealloc will be done by free function on error case */ | ||
| 24600 | + FN_EXIT1(NOT_OK); | ||
| 24601 | + return NOT_OK; | ||
| 24602 | +} | ||
| 24603 | + | ||
| 24604 | + | ||
| 24605 | +/*************************************************************** | ||
| 24606 | +** acxmem_s_create_rx_host_desc_queue | ||
| 24607 | +*/ | ||
| 24608 | +/* the whole size of a data buffer (header plus data body) | ||
| 24609 | + * plus 32 bytes safety offset at the end */ | ||
| 24610 | +#define RX_BUFFER_SIZE (sizeof(rxbuffer_t) + 32) | ||
| 24611 | + | ||
| 24612 | +static int | ||
| 24613 | +acxmem_s_create_rx_host_desc_queue(acx_device_t *adev) | ||
| 24614 | +{ | ||
| 24615 | + rxhostdesc_t *hostdesc; | ||
| 24616 | + rxbuffer_t *rxbuf; | ||
| 24617 | + int i; | ||
| 24618 | + | ||
| 24619 | + FN_ENTER; | ||
| 24620 | + | ||
| 24621 | + /* allocate the RX host descriptor queue pool */ | ||
| 24622 | + adev->rxhostdesc_area_size = RX_CNT * sizeof(*hostdesc); | ||
| 24623 | + | ||
| 24624 | + adev->rxhostdesc_start = allocate(adev, adev->rxhostdesc_area_size, | ||
| 24625 | + &adev->rxhostdesc_startphy, "rxhostdesc_start"); | ||
| 24626 | + if (!adev->rxhostdesc_start) | ||
| 24627 | + goto fail; | ||
| 24628 | + | ||
| 24629 | + /* check for proper alignment of RX host descriptor pool */ | ||
| 24630 | + if ((long) adev->rxhostdesc_start & 3) { | ||
| 24631 | + printk("acx: driver bug: dma alloc returns unaligned address\n"); | ||
| 24632 | + goto fail; | ||
| 24633 | + } | ||
| 24634 | + | ||
| 24635 | + /* allocate Rx buffer pool which will be used by the acx | ||
| 24636 | + * to store the whole content of the received frames in it */ | ||
| 24637 | + adev->rxbuf_area_size = RX_CNT * RX_BUFFER_SIZE; | ||
| 24638 | + | ||
| 24639 | + adev->rxbuf_start = allocate(adev, adev->rxbuf_area_size, | ||
| 24640 | + &adev->rxbuf_startphy, "rxbuf_start"); | ||
| 24641 | + if (!adev->rxbuf_start) | ||
| 24642 | + goto fail; | ||
| 24643 | + | ||
| 24644 | + rxbuf = adev->rxbuf_start; | ||
| 24645 | + hostdesc = adev->rxhostdesc_start; | ||
| 24646 | + | ||
| 24647 | + /* don't make any popular C programming pointer arithmetic mistakes | ||
| 24648 | + * here, otherwise I'll kill you... | ||
| 24649 | + * (and don't dare asking me why I'm warning you about that...) */ | ||
| 24650 | + for (i = 0; i < RX_CNT; i++) { | ||
| 24651 | + hostdesc->data = rxbuf; | ||
| 24652 | + hostdesc->length = cpu_to_le16(RX_BUFFER_SIZE); | ||
| 24653 | + rxbuf++; | ||
| 24654 | + hostdesc++; | ||
| 24655 | + } | ||
| 24656 | + hostdesc--; | ||
| 24657 | + FN_EXIT1(OK); | ||
| 24658 | + return OK; | ||
| 24659 | +fail: | ||
| 24660 | + printk("acx: create_rx_host_desc_queue FAILED\n"); | ||
| 24661 | + /* dealloc will be done by free function on error case */ | ||
| 24662 | + FN_EXIT1(NOT_OK); | ||
| 24663 | + return NOT_OK; | ||
| 24664 | +} | ||
| 24665 | + | ||
| 24666 | + | ||
| 24667 | +/*************************************************************** | ||
| 24668 | +** acxmem_s_create_hostdesc_queues | ||
| 24669 | +*/ | ||
| 24670 | +int | ||
| 24671 | +acxmem_s_create_hostdesc_queues(acx_device_t *adev) | ||
| 24672 | +{ | ||
| 24673 | + int result; | ||
| 24674 | + result = acxmem_s_create_tx_host_desc_queue(adev); | ||
| 24675 | + if (OK != result) return result; | ||
| 24676 | + result = acxmem_s_create_rx_host_desc_queue(adev); | ||
| 24677 | + return result; | ||
| 24678 | +} | ||
| 24679 | + | ||
| 24680 | + | ||
| 24681 | +/*************************************************************** | ||
| 24682 | +** acxmem_create_tx_desc_queue | ||
| 24683 | +*/ | ||
| 24684 | +static void | ||
| 24685 | +acxmem_create_tx_desc_queue(acx_device_t *adev, u32 tx_queue_start) | ||
| 24686 | +{ | ||
| 24687 | + txdesc_t *txdesc; | ||
| 24688 | + u32 clr; | ||
| 24689 | + int i; | ||
| 24690 | + | ||
| 24691 | + FN_ENTER; | ||
| 24692 | + | ||
| 24693 | + if (IS_ACX100(adev)) | ||
| 24694 | + adev->txdesc_size = sizeof(*txdesc); | ||
| 24695 | + else | ||
| 24696 | + /* the acx111 txdesc is 4 bytes larger */ | ||
| 24697 | + adev->txdesc_size = sizeof(*txdesc) + 4; | ||
| 24698 | + | ||
| 24699 | + /* | ||
| 24700 | + * This refers to an ACX address, not one of ours | ||
| 24701 | + */ | ||
| 24702 | + adev->txdesc_start = (txdesc_t *) tx_queue_start; | ||
| 24703 | + | ||
| 24704 | + log(L_DEBUG, "adev->txdesc_start=%p\n", | ||
| 24705 | + adev->txdesc_start); | ||
| 24706 | + | ||
| 24707 | + adev->tx_free = TX_CNT; | ||
| 24708 | + /* done by memset: adev->tx_head = 0; */ | ||
| 24709 | + /* done by memset: adev->tx_tail = 0; */ | ||
| 24710 | + txdesc = adev->txdesc_start; | ||
| 24711 | + | ||
| 24712 | + if (IS_ACX111(adev)) { | ||
| 24713 | + /* ACX111 has a preinitialized Tx buffer! */ | ||
| 24714 | + /* loop over whole send pool */ | ||
| 24715 | + /* FIXME: do we have to do the hostmemptr stuff here?? */ | ||
| 24716 | + for (i = 0; i < TX_CNT; i++) { | ||
| 24717 | + txdesc->Ctl_8 = DESC_CTL_HOSTOWN; | ||
| 24718 | + /* reserve two (hdr desc and payload desc) */ | ||
| 24719 | + txdesc = advance_txdesc(adev, txdesc, 1); | ||
| 24720 | + } | ||
| 24721 | + } else { | ||
| 24722 | + /* ACX100 Tx buffer needs to be initialized by us */ | ||
| 24723 | + /* clear whole send pool. sizeof is safe here (we are acx100) */ | ||
| 24724 | + | ||
| 24725 | + /* | ||
| 24726 | + * adev->txdesc_start refers to device memory, so we can't write | ||
| 24727 | + * directly to it. | ||
| 24728 | + */ | ||
| 24729 | + clr = (u32) adev->txdesc_start; | ||
| 24730 | + while (clr < (u32) adev->txdesc_start + (TX_CNT * sizeof(*txdesc))) { | ||
| 24731 | + write_slavemem32 (adev, clr, 0); | ||
| 24732 | + clr += 4; | ||
| 24733 | + } | ||
| 24734 | + | ||
| 24735 | + /* loop over whole send pool */ | ||
| 24736 | + for (i = 0; i < TX_CNT; i++) { | ||
| 24737 | + log(L_DEBUG, "configure card tx descriptor: 0x%p, " | ||
| 24738 | + "size: 0x%X\n", txdesc, adev->txdesc_size); | ||
| 24739 | + | ||
| 24740 | + /* initialise ctl */ | ||
| 24741 | + /* | ||
| 24742 | + * No auto DMA here | ||
| 24743 | + */ | ||
| 24744 | + write_slavemem8 (adev, (u32) &(txdesc->Ctl_8), | ||
| 24745 | + (u8) (DESC_CTL_HOSTOWN | DESC_CTL_FIRSTFRAG)); | ||
| 24746 | + /* done by memset(0): txdesc->Ctl2_8 = 0; */ | ||
| 24747 | + | ||
| 24748 | + /* point to next txdesc */ | ||
| 24749 | + write_slavemem32 (adev, (u32) &(txdesc->pNextDesc), | ||
| 24750 | + (u32) cpu_to_le32 ((u8 *) txdesc + adev->txdesc_size)); | ||
| 24751 | + | ||
| 24752 | + /* go to the next one */ | ||
| 24753 | + /* ++ is safe here (we are acx100) */ | ||
| 24754 | + txdesc++; | ||
| 24755 | + } | ||
| 24756 | + /* go back to the last one */ | ||
| 24757 | + txdesc--; | ||
| 24758 | + /* and point to the first making it a ring buffer */ | ||
| 24759 | + write_slavemem32 (adev, (u32) &(txdesc->pNextDesc), | ||
| 24760 | + (u32) cpu_to_le32 (tx_queue_start)); | ||
| 24761 | + } | ||
| 24762 | + FN_EXIT0; | ||
| 24763 | +} | ||
| 24764 | + | ||
| 24765 | + | ||
| 24766 | +/*************************************************************** | ||
| 24767 | +** acxmem_create_rx_desc_queue | ||
| 24768 | +*/ | ||
| 24769 | +static void | ||
| 24770 | +acxmem_create_rx_desc_queue(acx_device_t *adev, u32 rx_queue_start) | ||
| 24771 | +{ | ||
| 24772 | + rxdesc_t *rxdesc; | ||
| 24773 | + u32 mem_offs; | ||
| 24774 | + int i; | ||
| 24775 | + | ||
| 24776 | + FN_ENTER; | ||
| 24777 | + | ||
| 24778 | + /* done by memset: adev->rx_tail = 0; */ | ||
| 24779 | + | ||
| 24780 | + /* ACX111 doesn't need any further config: preconfigures itself. | ||
| 24781 | + * Simply print ring buffer for debugging */ | ||
| 24782 | + if (IS_ACX111(adev)) { | ||
| 24783 | + /* rxdesc_start already set here */ | ||
| 24784 | + | ||
| 24785 | + adev->rxdesc_start = (rxdesc_t *) rx_queue_start; | ||
| 24786 | + | ||
| 24787 | + rxdesc = adev->rxdesc_start; | ||
| 24788 | + for (i = 0; i < RX_CNT; i++) { | ||
| 24789 | + log(L_DEBUG, "rx descriptor %d @ 0x%p\n", i, rxdesc); | ||
| 24790 | + rxdesc = adev->rxdesc_start = (rxdesc_t *) | ||
| 24791 | + acx2cpu(rxdesc->pNextDesc); | ||
| 24792 | + } | ||
| 24793 | + } else { | ||
| 24794 | + /* we didn't pre-calculate rxdesc_start in case of ACX100 */ | ||
| 24795 | + /* rxdesc_start should be right AFTER Tx pool */ | ||
| 24796 | + adev->rxdesc_start = (rxdesc_t *) | ||
| 24797 | + ((u8 *) adev->txdesc_start + (TX_CNT * sizeof(txdesc_t))); | ||
| 24798 | + /* NB: sizeof(txdesc_t) above is valid because we know | ||
| 24799 | + ** we are in if (acx100) block. Beware of cut-n-pasting elsewhere! | ||
| 24800 | + ** acx111's txdesc is larger! */ | ||
| 24801 | + | ||
| 24802 | + mem_offs = (u32) adev->rxdesc_start; | ||
| 24803 | + while (mem_offs < (u32) adev->rxdesc_start + (RX_CNT * sizeof (*rxdesc))) { | ||
| 24804 | + write_slavemem32 (adev, mem_offs, 0); | ||
| 24805 | + mem_offs += 4; | ||
| 24806 | + } | ||
| 24807 | + | ||
| 24808 | + /* loop over whole receive pool */ | ||
| 24809 | + rxdesc = adev->rxdesc_start; | ||
| 24810 | + for (i = 0; i < RX_CNT; i++) { | ||
| 24811 | + log(L_DEBUG, "rx descriptor @ 0x%p\n", rxdesc); | ||
| 24812 | + /* point to next rxdesc */ | ||
| 24813 | + write_slavemem32 (adev, (u32) &(rxdesc->pNextDesc), | ||
| 24814 | + (u32) cpu_to_le32 ((u8 *) rxdesc + sizeof(*rxdesc))); | ||
| 24815 | + /* go to the next one */ | ||
| 24816 | + rxdesc++; | ||
| 24817 | + } | ||
| 24818 | + /* go to the last one */ | ||
| 24819 | + rxdesc--; | ||
| 24820 | + | ||
| 24821 | + /* and point to the first making it a ring buffer */ | ||
| 24822 | + write_slavemem32 (adev, (u32) &(rxdesc->pNextDesc), | ||
| 24823 | + (u32) cpu_to_le32 (rx_queue_start)); | ||
| 24824 | + } | ||
| 24825 | + FN_EXIT0; | ||
| 24826 | +} | ||
| 24827 | + | ||
| 24828 | + | ||
| 24829 | +/*************************************************************** | ||
| 24830 | +** acxmem_create_desc_queues | ||
| 24831 | +*/ | ||
| 24832 | +void | ||
| 24833 | +acxmem_create_desc_queues(acx_device_t *adev, u32 tx_queue_start, u32 rx_queue_start) | ||
| 24834 | +{ | ||
| 24835 | + u32 *p; | ||
| 24836 | + int i; | ||
| 24837 | + | ||
| 24838 | + acxmem_create_tx_desc_queue(adev, tx_queue_start); | ||
| 24839 | + acxmem_create_rx_desc_queue(adev, rx_queue_start); | ||
| 24840 | + p = (u32 *) adev->acx_queue_indicator; | ||
| 24841 | + for (i = 0; i < 4; i++) { | ||
| 24842 | + write_slavemem32 (adev, (u32) p, 0); | ||
| 24843 | + p++; | ||
| 24844 | + } | ||
| 24845 | +} | ||
| 24846 | + | ||
| 24847 | + | ||
| 24848 | +/*************************************************************** | ||
| 24849 | +** acxmem_s_proc_diag_output | ||
| 24850 | +*/ | ||
| 24851 | +char* | ||
| 24852 | +acxmem_s_proc_diag_output(char *p, acx_device_t *adev) | ||
| 24853 | +{ | ||
| 24854 | + const char *rtl, *thd, *ttl; | ||
| 24855 | + txdesc_t *txdesc; | ||
| 24856 | + u8 Ctl_8; | ||
| 24857 | + rxdesc_t *rxdesc; | ||
| 24858 | + int i; | ||
| 24859 | + u32 tmp; | ||
| 24860 | + txdesc_t txd; | ||
| 24861 | + u8 buf[0x200]; | ||
| 24862 | + int j, k; | ||
| 24863 | + | ||
| 24864 | + FN_ENTER; | ||
| 24865 | + | ||
| 24866 | +#if DUMP_MEM_DURING_DIAG > 0 | ||
| 24867 | + dump_acxmem (adev, 0, 0x10000); | ||
| 24868 | + panic ("dump finished"); | ||
| 24869 | +#endif | ||
| 24870 | + | ||
| 24871 | + p += sprintf(p, "** Rx buf **\n"); | ||
| 24872 | + rxdesc = adev->rxdesc_start; | ||
| 24873 | + if (rxdesc) for (i = 0; i < RX_CNT; i++) { | ||
| 24874 | + rtl = (i == adev->rx_tail) ? " [tail]" : ""; | ||
| 24875 | + Ctl_8 = read_slavemem8 (adev, (u32) &(rxdesc->Ctl_8)); | ||
| 24876 | + if (Ctl_8 & DESC_CTL_HOSTOWN) | ||
| 24877 | + p += sprintf(p, "%02u (%02x) FULL%s\n", i, Ctl_8, rtl); | ||
| 24878 | + else | ||
| 24879 | + p += sprintf(p, "%02u (%02x) empty%s\n", i, Ctl_8, rtl); | ||
| 24880 | + rxdesc++; | ||
| 24881 | + } | ||
| 24882 | + p += sprintf(p, "** Tx buf (free %d, Linux netqueue %s) **\n", adev->tx_free, | ||
| 24883 | + acx_queue_stopped(adev->ndev) ? "STOPPED" : "running"); | ||
| 24884 | + | ||
| 24885 | + p += sprintf(p, "** Tx buf %d blocks total, %d available, free list head %04x\n", | ||
| 24886 | + adev->acx_txbuf_numblocks, adev->acx_txbuf_blocks_free, adev->acx_txbuf_free); | ||
| 24887 | + txdesc = adev->txdesc_start; | ||
| 24888 | + if (txdesc) { | ||
| 24889 | + for (i = 0; i < TX_CNT; i++) { | ||
| 24890 | + thd = (i == adev->tx_head) ? " [head]" : ""; | ||
| 24891 | + ttl = (i == adev->tx_tail) ? " [tail]" : ""; | ||
| 24892 | + copy_from_slavemem (adev, (u8 *) &txd, (u32) txdesc, sizeof (txd)); | ||
| 24893 | + Ctl_8 = read_slavemem8 (adev, (u32) &(txdesc->Ctl_8)); | ||
| 24894 | + if (Ctl_8 & DESC_CTL_ACXDONE) | ||
| 24895 | + p += sprintf(p, "%02u ready to free (%02X)%s%s", i, Ctl_8, thd, ttl); | ||
| 24896 | + else if (Ctl_8 & DESC_CTL_HOSTOWN) | ||
| 24897 | + p += sprintf(p, "%02u available (%02X)%s%s", i, Ctl_8, thd, ttl); | ||
| 24898 | + else | ||
| 24899 | + p += sprintf(p, "%02u busy (%02X)%s%s", i, Ctl_8, thd, ttl); | ||
| 24900 | + tmp = read_slavemem32 (adev, (u32) &(txdesc->AcxMemPtr)); | ||
| 24901 | + if (tmp) { | ||
| 24902 | + p += sprintf (p, " %04x", tmp); | ||
| 24903 | + while ((tmp = read_slavemem32 (adev, (u32) tmp)) != 0x02000000) { | ||
| 24904 | + tmp <<= 5; | ||
| 24905 | + p += sprintf (p, " %04x", tmp); | ||
| 24906 | + } | ||
| 24907 | + } | ||
| 24908 | + p += sprintf (p, "\n"); | ||
| 24909 | + p += sprintf (p, " %04x: %04x %04x %04x %04x %04x %04x %04x %04x %04x %04x %02x %02x %02x %02x\n" | ||
| 24910 | + "%02x %02x %02x %02x %04x\n", | ||
| 24911 | + (u32) txdesc, | ||
| 24912 | + txd.pNextDesc.v, txd.HostMemPtr.v, txd.AcxMemPtr.v, txd.tx_time, | ||
| 24913 | + txd.total_length, txd.Reserved, | ||
| 24914 | + txd.dummy[0], txd.dummy[1], txd.dummy[2], txd.dummy[3], | ||
| 24915 | + txd.Ctl_8, txd.Ctl2_8, txd.error, txd.ack_failures, | ||
| 24916 | + txd.u.rts.rts_failures, txd.u.rts.rts_ok, txd.u.r1.rate, txd.u.r1.queue_ctrl, | ||
| 24917 | + txd.queue_info | ||
| 24918 | + ); | ||
| 24919 | + if (txd.AcxMemPtr.v) { | ||
| 24920 | + copy_from_slavemem (adev, buf, txd.AcxMemPtr.v, sizeof (buf)); | ||
| 24921 | + for (j = 0; (j < txd.total_length) && (j<(sizeof(buf)-4)); j+=16) { | ||
| 24922 | + p += sprintf (p, " "); | ||
| 24923 | + for (k = 0; (k < 16) && (j+k < txd.total_length); k++) { | ||
| 24924 | + p += sprintf (p, " %02x", buf[j+k+4]); | ||
| 24925 | + } | ||
| 24926 | + p += sprintf (p, "\n"); | ||
| 24927 | + } | ||
| 24928 | + } | ||
| 24929 | + txdesc = advance_txdesc(adev, txdesc, 1); | ||
| 24930 | + } | ||
| 24931 | + } | ||
| 24932 | + | ||
| 24933 | + p += sprintf(p, | ||
| 24934 | + "\n" | ||
| 24935 | + "** Generic slave data **\n" | ||
| 24936 | + "irq_mask 0x%04x irq_status 0x%04x irq on acx 0x%04x\n" | ||
| 24937 | + "txbuf_start 0x%p, txbuf_area_size %u\n" | ||
| 24938 | + "txdesc_size %u, txdesc_start 0x%p\n" | ||
| 24939 | + "txhostdesc_start 0x%p, txhostdesc_area_size %u\n" | ||
| 24940 | + "txbuf start 0x%04x, txbuf size %d\n" | ||
| 24941 | + "rxdesc_start 0x%p\n" | ||
| 24942 | + "rxhostdesc_start 0x%p, rxhostdesc_area_size %u\n" | ||
| 24943 | + "rxbuf_start 0x%p, rxbuf_area_size %u\n", | ||
| 24944 | + adev->irq_mask, adev->irq_status, read_reg32(adev, IO_ACX_IRQ_STATUS_NON_DES), | ||
| 24945 | + adev->txbuf_start, adev->txbuf_area_size, | ||
| 24946 | + adev->txdesc_size, adev->txdesc_start, | ||
| 24947 | + adev->txhostdesc_start, adev->txhostdesc_area_size, | ||
| 24948 | + adev->acx_txbuf_start, adev->acx_txbuf_numblocks * adev->memblocksize, | ||
| 24949 | + adev->rxdesc_start, | ||
| 24950 | + adev->rxhostdesc_start, adev->rxhostdesc_area_size, | ||
| 24951 | + adev->rxbuf_start, adev->rxbuf_area_size); | ||
| 24952 | + FN_EXIT0; | ||
| 24953 | + return p; | ||
| 24954 | +} | ||
| 24955 | + | ||
| 24956 | + | ||
| 24957 | +/*********************************************************************** | ||
| 24958 | +*/ | ||
| 24959 | +int | ||
| 24960 | +acxmem_proc_eeprom_output(char *buf, acx_device_t *adev) | ||
| 24961 | +{ | ||
| 24962 | + char *p = buf; | ||
| 24963 | + int i; | ||
| 24964 | + | ||
| 24965 | + FN_ENTER; | ||
| 24966 | + | ||
| 24967 | + for (i = 0; i < 0x400; i++) { | ||
| 24968 | + acxmem_read_eeprom_byte(adev, i, p++); | ||
| 24969 | + } | ||
| 24970 | + | ||
| 24971 | + FN_EXIT1(p - buf); | ||
| 24972 | + return p - buf; | ||
| 24973 | +} | ||
| 24974 | + | ||
| 24975 | + | ||
| 24976 | +/*********************************************************************** | ||
| 24977 | +*/ | ||
| 24978 | +void | ||
| 24979 | +acxmem_set_interrupt_mask(acx_device_t *adev) | ||
| 24980 | +{ | ||
| 24981 | + if (IS_ACX111(adev)) { | ||
| 24982 | + adev->irq_mask = (u16) ~(0 | ||
| 24983 | + | HOST_INT_RX_DATA | ||
| 24984 | + | HOST_INT_TX_COMPLETE | ||
| 24985 | + /* | HOST_INT_TX_XFER */ | ||
| 24986 | + /* | HOST_INT_RX_COMPLETE */ | ||
| 24987 | + /* | HOST_INT_DTIM */ | ||
| 24988 | + /* | HOST_INT_BEACON */ | ||
| 24989 | + /* | HOST_INT_TIMER */ | ||
| 24990 | + /* | HOST_INT_KEY_NOT_FOUND */ | ||
| 24991 | + | HOST_INT_IV_ICV_FAILURE | ||
| 24992 | + | HOST_INT_CMD_COMPLETE | ||
| 24993 | + | HOST_INT_INFO | ||
| 24994 | + | HOST_INT_OVERFLOW | ||
| 24995 | + /* | HOST_INT_PROCESS_ERROR */ | ||
| 24996 | + | HOST_INT_SCAN_COMPLETE | ||
| 24997 | + | HOST_INT_FCS_THRESHOLD | ||
| 24998 | + | HOST_INT_UNKNOWN | ||
| 24999 | + ); | ||
| 25000 | + /* Or else acx100 won't signal cmd completion, right? */ | ||
| 25001 | + adev->irq_mask_off = (u16)~( HOST_INT_CMD_COMPLETE ); /* 0xfdff */ | ||
| 25002 | + } else { | ||
| 25003 | + adev->irq_mask = (u16) ~(0 | ||
| 25004 | + | HOST_INT_RX_DATA | ||
| 25005 | + | HOST_INT_TX_COMPLETE | ||
| 25006 | + /* | HOST_INT_TX_XFER */ | ||
| 25007 | + /* | HOST_INT_RX_COMPLETE */ | ||
| 25008 | + /* | HOST_INT_DTIM */ | ||
| 25009 | + /* | HOST_INT_BEACON */ | ||
| 25010 | + /* | HOST_INT_TIMER */ | ||
| 25011 | + /* | HOST_INT_KEY_NOT_FOUND */ | ||
| 25012 | + /* | HOST_INT_IV_ICV_FAILURE */ | ||
| 25013 | + | HOST_INT_CMD_COMPLETE | ||
| 25014 | + | HOST_INT_INFO | ||
| 25015 | + /* | HOST_INT_OVERFLOW */ | ||
| 25016 | + /* | HOST_INT_PROCESS_ERROR */ | ||
| 25017 | + | HOST_INT_SCAN_COMPLETE | ||
| 25018 | + /* | HOST_INT_FCS_THRESHOLD */ | ||
| 25019 | + /* | HOST_INT_BEACON_MISSED */ | ||
| 25020 | + ); | ||
| 25021 | + adev->irq_mask_off = (u16)~( HOST_INT_UNKNOWN ); /* 0x7fff */ | ||
| 25022 | + } | ||
| 25023 | +} | ||
| 25024 | + | ||
| 25025 | + | ||
| 25026 | +/*********************************************************************** | ||
| 25027 | +*/ | ||
| 25028 | +int | ||
| 25029 | +acx100mem_s_set_tx_level(acx_device_t *adev, u8 level_dbm) | ||
| 25030 | +{ | ||
| 25031 | + struct acx111_ie_tx_level tx_level; | ||
| 25032 | + | ||
| 25033 | + /* since it can be assumed that at least the Maxim radio has a | ||
| 25034 | + * maximum power output of 20dBm and since it also can be | ||
| 25035 | + * assumed that these values drive the DAC responsible for | ||
| 25036 | + * setting the linear Tx level, I'd guess that these values | ||
| 25037 | + * should be the corresponding linear values for a dBm value, | ||
| 25038 | + * in other words: calculate the values from that formula: | ||
| 25039 | + * Y [dBm] = 10 * log (X [mW]) | ||
| 25040 | + * then scale the 0..63 value range onto the 1..100mW range (0..20 dBm) | ||
| 25041 | + * and you're done... | ||
| 25042 | + * Hopefully that's ok, but you never know if we're actually | ||
| 25043 | + * right... (especially since Windows XP doesn't seem to show | ||
| 25044 | + * actual Tx dBm values :-P) */ | ||
| 25045 | + | ||
| 25046 | + /* NOTE: on Maxim, value 30 IS 30mW, and value 10 IS 10mW - so the | ||
| 25047 | + * values are EXACTLY mW!!! Not sure about RFMD and others, | ||
| 25048 | + * though... */ | ||
| 25049 | + static const u8 dbm2val_maxim[21] = { | ||
| 25050 | + 63, 63, 63, 62, | ||
| 25051 | + 61, 61, 60, 60, | ||
| 25052 | + 59, 58, 57, 55, | ||
| 25053 | + 53, 50, 47, 43, | ||
| 25054 | + 38, 31, 23, 13, | ||
| 25055 | + 0 | ||
| 25056 | + }; | ||
| 25057 | + static const u8 dbm2val_rfmd[21] = { | ||
| 25058 | + 0, 0, 0, 1, | ||
| 25059 | + 2, 2, 3, 3, | ||
| 25060 | + 4, 5, 6, 8, | ||
| 25061 | + 10, 13, 16, 20, | ||
| 25062 | + 25, 32, 41, 50, | ||
| 25063 | + 63 | ||
| 25064 | + }; | ||
| 25065 | + const u8 *table; | ||
| 25066 | + | ||
| 25067 | + switch (adev->radio_type) { | ||
| 25068 | + case RADIO_MAXIM_0D: | ||
| 25069 | + table = &dbm2val_maxim[0]; | ||
| 25070 | + break; | ||
| 25071 | + case RADIO_RFMD_11: | ||
| 25072 | + case RADIO_RALINK_15: | ||
| 25073 | + table = &dbm2val_rfmd[0]; | ||
| 25074 | + break; | ||
| 25075 | + default: | ||
| 25076 | + printk("%s: unknown/unsupported radio type, " | ||
| 25077 | + "cannot modify tx power level yet!\n", | ||
| 25078 | + adev->ndev->name); | ||
| 25079 | + return NOT_OK; | ||
| 25080 | + } | ||
| 25081 | + /* | ||
| 25082 | + * The hx4700 EEPROM, at least, only supports 1 power setting. The configure | ||
| 25083 | + * routine matches the PA bias with the gain, so just use its default value. | ||
| 25084 | + * The values are: 0x2b for the gain and 0x03 for the PA bias. The firmware | ||
| 25085 | + * writes the gain level to the Tx gain control DAC and the PA bias to the Maxim | ||
| 25086 | + * radio's PA bias register. The firmware limits itself to 0 - 64 when writing to the | ||
| 25087 | + * gain control DAC. | ||
| 25088 | + * | ||
| 25089 | + * Physically between the ACX and the radio, higher Tx gain control DAC values result | ||
| 25090 | + * in less power output; 0 volts to the Maxim radio results in the highest output power | ||
| 25091 | + * level, which I'm assuming matches up with 0 in the Tx Gain DAC register. | ||
| 25092 | + * | ||
| 25093 | + * Although there is only the 1 power setting, one of the radio firmware functions adjusts | ||
| 25094 | + * the transmit power level up and down. That function is called by the ACX FIQ handler | ||
| 25095 | + * under certain conditions. | ||
| 25096 | + */ | ||
| 25097 | + tx_level.level = 1; | ||
| 25098 | + //return acx_s_configure(adev, &tx_level, ACX1xx_IE_DOT11_TX_POWER_LEVEL); | ||
| 25099 | + | ||
| 25100 | + printk("%s: changing radio power level to %u dBm (%u)\n", | ||
| 25101 | + adev->ndev->name, level_dbm, table[level_dbm]); | ||
| 25102 | + acxmem_s_write_phy_reg(adev, 0x11, table[level_dbm]); | ||
| 25103 | + | ||
| 25104 | + return 0; | ||
| 25105 | +} | ||
| 25106 | + | ||
| 25107 | + | ||
| 25108 | +static struct platform_driver | ||
| 25109 | +acxmem_drv_id = { | ||
| 25110 | + .driver = { | ||
| 25111 | + .name = "acx-mem", | ||
| 25112 | + }, | ||
| 25113 | + .probe = acxmem_e_probe, | ||
| 25114 | + .remove = __devexit_p(acxmem_e_remove), | ||
| 25115 | +#ifdef CONFIG_PM | ||
| 25116 | + .suspend = acxmem_e_suspend, | ||
| 25117 | + .resume = acxmem_e_resume | ||
| 25118 | +#endif /* CONFIG_PM */ | ||
| 25119 | +}; | ||
| 25120 | + | ||
| 25121 | + | ||
| 25122 | +/*********************************************************************** | ||
| 25123 | +** acxmem_e_init_module | ||
| 25124 | +** | ||
| 25125 | +** Module initialization routine, called once at module load time | ||
| 25126 | +*/ | ||
| 25127 | +int __init | ||
| 25128 | +acxmem_e_init_module(void) | ||
| 25129 | +{ | ||
| 25130 | + int res; | ||
| 25131 | + | ||
| 25132 | + FN_ENTER; | ||
| 25133 | + | ||
| 25134 | +#if (ACX_IO_WIDTH==32) | ||
| 25135 | + printk("acx: compiled to use 32bit I/O access. " | ||
| 25136 | + "I/O timing issues might occur, such as " | ||
| 25137 | + "non-working firmware upload. Report them\n"); | ||
| 25138 | +#else | ||
| 25139 | + printk("acx: compiled to use 16bit I/O access only " | ||
| 25140 | + "(compatibility mode)\n"); | ||
| 25141 | +#endif | ||
| 25142 | + | ||
| 25143 | +#ifdef __LITTLE_ENDIAN | ||
| 25144 | +#define ENDIANNESS_STRING "running on a little-endian CPU\n" | ||
| 25145 | +#else | ||
| 25146 | +#define ENDIANNESS_STRING "running on a BIG-ENDIAN CPU\n" | ||
| 25147 | +#endif | ||
| 25148 | + log(L_INIT, | ||
| 25149 | + ENDIANNESS_STRING | ||
| 25150 | + "PCI module " ACX_RELEASE " initialized, " | ||
| 25151 | + "waiting for cards to probe...\n" | ||
| 25152 | + ); | ||
| 25153 | + | ||
| 25154 | + res = platform_driver_register (&acxmem_drv_id); | ||
| 25155 | + FN_EXIT1(res); | ||
| 25156 | + return res; | ||
| 25157 | +} | ||
| 25158 | + | ||
| 25159 | + | ||
| 25160 | +/*********************************************************************** | ||
| 25161 | +** acxmem_e_cleanup_module | ||
| 25162 | +** | ||
| 25163 | +** Called at module unload time. This is our last chance to | ||
| 25164 | +** clean up after ourselves. | ||
| 25165 | +*/ | ||
| 25166 | +void __exit | ||
| 25167 | +acxmem_e_cleanup_module(void) | ||
| 25168 | +{ | ||
| 25169 | + FN_ENTER; | ||
| 25170 | + | ||
| 25171 | + printk ("cleanup_module\n"); | ||
| 25172 | + platform_driver_unregister( &acxmem_drv_id ); | ||
| 25173 | + | ||
| 25174 | + FN_EXIT0; | ||
| 25175 | +} | ||
| 25176 | + | ||
| 25177 | +void acxmem_e_release(struct device *dev) { | ||
| 25178 | +} | ||
| 25179 | + | ||
| 25180 | +MODULE_AUTHOR( "Todd Blumer <todd@sdgsystems.com>" ); | ||
| 25181 | +MODULE_DESCRIPTION( "ACX Slave Memory Driver" ); | ||
| 25182 | +MODULE_LICENSE( "GPL" ); | ||
| 25183 | + | ||
| 25184 | Index: linux-2.6.23/drivers/net/wireless/acx/pci.c | ||
| 25185 | =================================================================== | ||
| 25186 | --- /dev/null 1970-01-01 00:00:00.000000000 +0000 | ||
| 25187 | +++ linux-2.6.23/drivers/net/wireless/acx/pci.c 2008-01-20 21:13:40.000000000 +0000 | ||
| 25188 | @@ -0,0 +1,4234 @@ | ||
| 25189 | +/*********************************************************************** | ||
| 25190 | +** Copyright (C) 2003 ACX100 Open Source Project | ||
| 25191 | +** | ||
| 25192 | +** The contents of this file are subject to the Mozilla Public | ||
| 25193 | +** License Version 1.1 (the "License"); you may not use this file | ||
| 25194 | +** except in compliance with the License. You may obtain a copy of | ||
| 25195 | +** the License at http://www.mozilla.org/MPL/ | ||
| 25196 | +** | ||
| 25197 | +** Software distributed under the License is distributed on an "AS | ||
| 25198 | +** IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or | ||
| 25199 | +** implied. See the License for the specific language governing | ||
| 25200 | +** rights and limitations under the License. | ||
| 25201 | +** | ||
| 25202 | +** Alternatively, the contents of this file may be used under the | ||
| 25203 | +** terms of the GNU Public License version 2 (the "GPL"), in which | ||
| 25204 | +** case the provisions of the GPL are applicable instead of the | ||
| 25205 | +** above. If you wish to allow the use of your version of this file | ||
| 25206 | +** only under the terms of the GPL and not to allow others to use | ||
| 25207 | +** your version of this file under the MPL, indicate your decision | ||
| 25208 | +** by deleting the provisions above and replace them with the notice | ||
| 25209 | +** and other provisions required by the GPL. If you do not delete | ||
| 25210 | +** the provisions above, a recipient may use your version of this | ||
| 25211 | +** file under either the MPL or the GPL. | ||
| 25212 | +** --------------------------------------------------------------------- | ||
| 25213 | +** Inquiries regarding the ACX100 Open Source Project can be | ||
| 25214 | +** made directly to: | ||
| 25215 | +** | ||
| 25216 | +** acx100-users@lists.sf.net | ||
| 25217 | +** http://acx100.sf.net | ||
| 25218 | +** --------------------------------------------------------------------- | ||
| 25219 | +*/ | ||
| 25220 | +#define ACX_PCI 1 | ||
| 25221 | + | ||
| 25222 | +#include <linux/version.h> | ||
| 25223 | +#if LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 18) | ||
| 25224 | +#include <linux/config.h> | ||
| 25225 | +#endif | ||
| 25226 | + | ||
| 25227 | +/* Linux 2.6.18+ uses <linux/utsrelease.h> */ | ||
| 25228 | +#ifndef UTS_RELEASE | ||
| 25229 | +#include <linux/utsrelease.h> | ||
| 25230 | +#endif | ||
| 25231 | + | ||
| 25232 | +#include <linux/compiler.h> /* required for Lx 2.6.8 ?? */ | ||
| 25233 | +#include <linux/kernel.h> | ||
| 25234 | +#include <linux/module.h> | ||
| 25235 | +#include <linux/moduleparam.h> | ||
| 25236 | +#include <linux/sched.h> | ||
| 25237 | +#include <linux/types.h> | ||
| 25238 | +#include <linux/skbuff.h> | ||
| 25239 | +#include <linux/slab.h> | ||
| 25240 | +#include <linux/if_arp.h> | ||
| 25241 | +#include <linux/rtnetlink.h> | ||
| 25242 | +#include <linux/wireless.h> | ||
| 25243 | +#include <net/iw_handler.h> | ||
| 25244 | +#include <linux/netdevice.h> | ||
| 25245 | +#include <linux/ioport.h> | ||
| 25246 | +#include <linux/pci.h> | ||
| 25247 | +#include <linux/pm.h> | ||
| 25248 | +#include <linux/vmalloc.h> | ||
| 25249 | +#include <linux/dma-mapping.h> | ||
| 25250 | + | ||
| 25251 | +#include "acx.h" | ||
| 25252 | + | ||
| 25253 | + | ||
| 25254 | +/*********************************************************************** | ||
| 25255 | +*/ | ||
| 25256 | +#define PCI_TYPE (PCI_USES_MEM | PCI_ADDR0 | PCI_NO_ACPI_WAKE) | ||
| 25257 | +#define PCI_ACX100_REGION1 0x01 | ||
| 25258 | +#define PCI_ACX100_REGION1_SIZE 0x1000 /* Memory size - 4K bytes */ | ||
| 25259 | +#define PCI_ACX100_REGION2 0x02 | ||
| 25260 | +#define PCI_ACX100_REGION2_SIZE 0x10000 /* Memory size - 64K bytes */ | ||
| 25261 | + | ||
| 25262 | +#define PCI_ACX111_REGION1 0x00 | ||
| 25263 | +#define PCI_ACX111_REGION1_SIZE 0x2000 /* Memory size - 8K bytes */ | ||
| 25264 | +#define PCI_ACX111_REGION2 0x01 | ||
| 25265 | +#define PCI_ACX111_REGION2_SIZE 0x20000 /* Memory size - 128K bytes */ | ||
| 25266 | + | ||
| 25267 | +/* Texas Instruments Vendor ID */ | ||
| 25268 | +#define PCI_VENDOR_ID_TI 0x104c | ||
| 25269 | + | ||
| 25270 | +/* ACX100 22Mb/s WLAN controller */ | ||
| 25271 | +#define PCI_DEVICE_ID_TI_TNETW1100A 0x8400 | ||
| 25272 | +#define PCI_DEVICE_ID_TI_TNETW1100B 0x8401 | ||
| 25273 | + | ||
| 25274 | +/* ACX111 54Mb/s WLAN controller */ | ||
| 25275 | +#define PCI_DEVICE_ID_TI_TNETW1130 0x9066 | ||
| 25276 | + | ||
| 25277 | +/* PCI Class & Sub-Class code, Network-'Other controller' */ | ||
| 25278 | +#define PCI_CLASS_NETWORK_OTHERS 0x0280 | ||
| 25279 | + | ||
| 25280 | +#define CARD_EEPROM_ID_SIZE 6 | ||
| 25281 | + | ||
| 25282 | +#ifndef PCI_D0 | ||
| 25283 | +/* From include/linux/pci.h */ | ||
| 25284 | +#define PCI_D0 0 | ||
| 25285 | +#define PCI_D1 1 | ||
| 25286 | +#define PCI_D2 2 | ||
| 25287 | +#define PCI_D3hot 3 | ||
| 25288 | +#define PCI_D3cold 4 | ||
| 25289 | +#define PCI_UNKNOWN 5 | ||
| 25290 | +#define PCI_POWER_ERROR -1 | ||
| 25291 | +#endif | ||
| 25292 | + | ||
| 25293 | + | ||
| 25294 | +/*********************************************************************** | ||
| 25295 | +*/ | ||
| 25296 | +static void acxpci_i_tx_timeout(struct net_device *ndev); | ||
| 25297 | +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 19) | ||
| 25298 | +static irqreturn_t acxpci_i_interrupt(int irq, void *dev_id); | ||
| 25299 | +#else | ||
| 25300 | +static irqreturn_t acxpci_i_interrupt(int irq, void *dev_id, struct pt_regs *regs); | ||
| 25301 | +#endif | ||
| 25302 | +static void acxpci_i_set_multicast_list(struct net_device *ndev); | ||
| 25303 | + | ||
| 25304 | +static int acxpci_e_open(struct net_device *ndev); | ||
| 25305 | +static int acxpci_e_close(struct net_device *ndev); | ||
| 25306 | +static void acxpci_s_up(struct net_device *ndev); | ||
| 25307 | +static void acxpci_s_down(struct net_device *ndev); | ||
| 25308 | + | ||
| 25309 | + | ||
| 25310 | +/*********************************************************************** | ||
| 25311 | +** Register access | ||
| 25312 | +*/ | ||
| 25313 | + | ||
| 25314 | +/* Pick one */ | ||
| 25315 | +/* #define INLINE_IO static */ | ||
| 25316 | +#define INLINE_IO static inline | ||
| 25317 | + | ||
| 25318 | +INLINE_IO u32 | ||
| 25319 | +read_reg32(acx_device_t *adev, unsigned int offset) | ||
| 25320 | +{ | ||
| 25321 | +#if ACX_IO_WIDTH == 32 | ||
| 25322 | + return readl((u8 *)adev->iobase + adev->io[offset]); | ||
| 25323 | +#else | ||
| 25324 | + return readw((u8 *)adev->iobase + adev->io[offset]) | ||
| 25325 | + + (readw((u8 *)adev->iobase + adev->io[offset] + 2) << 16); | ||
| 25326 | +#endif | ||
| 25327 | +} | ||
| 25328 | + | ||
| 25329 | +INLINE_IO u16 | ||
| 25330 | +read_reg16(acx_device_t *adev, unsigned int offset) | ||
| 25331 | +{ | ||
| 25332 | + return readw((u8 *)adev->iobase + adev->io[offset]); | ||
| 25333 | +} | ||
| 25334 | + | ||
| 25335 | +INLINE_IO u8 | ||
| 25336 | +read_reg8(acx_device_t *adev, unsigned int offset) | ||
| 25337 | +{ | ||
| 25338 | + return readb((u8 *)adev->iobase + adev->io[offset]); | ||
| 25339 | +} | ||
| 25340 | + | ||
| 25341 | +INLINE_IO void | ||
| 25342 | +write_reg32(acx_device_t *adev, unsigned int offset, u32 val) | ||
| 25343 | +{ | ||
| 25344 | +#if ACX_IO_WIDTH == 32 | ||
| 25345 | + writel(val, (u8 *)adev->iobase + adev->io[offset]); | ||
| 25346 | +#else | ||
| 25347 | + writew(val & 0xffff, (u8 *)adev->iobase + adev->io[offset]); | ||
| 25348 | + writew(val >> 16, (u8 *)adev->iobase + adev->io[offset] + 2); | ||
| 25349 | +#endif | ||
| 25350 | +} | ||
| 25351 | + | ||
| 25352 | +INLINE_IO void | ||
| 25353 | +write_reg16(acx_device_t *adev, unsigned int offset, u16 val) | ||
| 25354 | +{ | ||
| 25355 | + writew(val, (u8 *)adev->iobase + adev->io[offset]); | ||
| 25356 | +} | ||
| 25357 | + | ||
| 25358 | +INLINE_IO void | ||
| 25359 | +write_reg8(acx_device_t *adev, unsigned int offset, u8 val) | ||
| 25360 | +{ | ||
| 25361 | + writeb(val, (u8 *)adev->iobase + adev->io[offset]); | ||
| 25362 | +} | ||
| 25363 | + | ||
| 25364 | +/* Handle PCI posting properly: | ||
| 25365 | + * Make sure that writes reach the adapter in case they require to be executed | ||
| 25366 | + * *before* the next write, by reading a random (and safely accessible) register. | ||
| 25367 | + * This call has to be made if there is no read following (which would flush the data | ||
| 25368 | + * to the adapter), yet the written data has to reach the adapter immediately. */ | ||
| 25369 | +INLINE_IO void | ||
| 25370 | +write_flush(acx_device_t *adev) | ||
| 25371 | +{ | ||
| 25372 | + /* readb(adev->iobase + adev->io[IO_ACX_INFO_MAILBOX_OFFS]); */ | ||
| 25373 | + /* faster version (accesses the first register, IO_ACX_SOFT_RESET, | ||
| 25374 | + * which should also be safe): */ | ||
| 25375 | + readb(adev->iobase); | ||
| 25376 | +} | ||
| 25377 | + | ||
| 25378 | +INLINE_IO int | ||
| 25379 | +adev_present(acx_device_t *adev) | ||
| 25380 | +{ | ||
| 25381 | + /* fast version (accesses the first register, IO_ACX_SOFT_RESET, | ||
| 25382 | + * which should be safe): */ | ||
| 25383 | + return readl(adev->iobase) != 0xffffffff; | ||
| 25384 | +} | ||
| 25385 | + | ||
| 25386 | + | ||
| 25387 | +/*********************************************************************** | ||
| 25388 | +*/ | ||
| 25389 | +static inline txdesc_t* | ||
| 25390 | +get_txdesc(acx_device_t *adev, int index) | ||
| 25391 | +{ | ||
| 25392 | + return (txdesc_t*) (((u8*)adev->txdesc_start) + index * adev->txdesc_size); | ||
| 25393 | +} | ||
| 25394 | + | ||
| 25395 | +static inline txdesc_t* | ||
| 25396 | +advance_txdesc(acx_device_t *adev, txdesc_t* txdesc, int inc) | ||
| 25397 | +{ | ||
| 25398 | + return (txdesc_t*) (((u8*)txdesc) + inc * adev->txdesc_size); | ||
| 25399 | +} | ||
| 25400 | + | ||
| 25401 | +static txhostdesc_t* | ||
| 25402 | +get_txhostdesc(acx_device_t *adev, txdesc_t* txdesc) | ||
| 25403 | +{ | ||
| 25404 | + int index = (u8*)txdesc - (u8*)adev->txdesc_start; | ||
| 25405 | + if (unlikely(ACX_DEBUG && (index % adev->txdesc_size))) { | ||
| 25406 | + printk("bad txdesc ptr %p\n", txdesc); | ||
| 25407 | + return NULL; | ||
| 25408 | + } | ||
| 25409 | + index /= adev->txdesc_size; | ||
| 25410 | + if (unlikely(ACX_DEBUG && (index >= TX_CNT))) { | ||
| 25411 | + printk("bad txdesc ptr %p\n", txdesc); | ||
| 25412 | + return NULL; | ||
| 25413 | + } | ||
| 25414 | + return &adev->txhostdesc_start[index*2]; | ||
| 25415 | +} | ||
| 25416 | + | ||
| 25417 | +static inline client_t* | ||
| 25418 | +get_txc(acx_device_t *adev, txdesc_t* txdesc) | ||
| 25419 | +{ | ||
| 25420 | + int index = (u8*)txdesc - (u8*)adev->txdesc_start; | ||
| 25421 | + if (unlikely(ACX_DEBUG && (index % adev->txdesc_size))) { | ||
| 25422 | + printk("bad txdesc ptr %p\n", txdesc); | ||
| 25423 | + return NULL; | ||
| 25424 | + } | ||
| 25425 | + index /= adev->txdesc_size; | ||
| 25426 | + if (unlikely(ACX_DEBUG && (index >= TX_CNT))) { | ||
| 25427 | + printk("bad txdesc ptr %p\n", txdesc); | ||
| 25428 | + return NULL; | ||
| 25429 | + } | ||
| 25430 | + return adev->txc[index]; | ||
| 25431 | +} | ||
| 25432 | + | ||
| 25433 | +static inline u16 | ||
| 25434 | +get_txr(acx_device_t *adev, txdesc_t* txdesc) | ||
| 25435 | +{ | ||
| 25436 | + int index = (u8*)txdesc - (u8*)adev->txdesc_start; | ||
| 25437 | + index /= adev->txdesc_size; | ||
| 25438 | + return adev->txr[index]; | ||
| 25439 | +} | ||
| 25440 | + | ||
| 25441 | +static inline void | ||
| 25442 | +put_txcr(acx_device_t *adev, txdesc_t* txdesc, client_t* c, u16 r111) | ||
| 25443 | +{ | ||
| 25444 | + int index = (u8*)txdesc - (u8*)adev->txdesc_start; | ||
| 25445 | + if (unlikely(ACX_DEBUG && (index % adev->txdesc_size))) { | ||
| 25446 | + printk("bad txdesc ptr %p\n", txdesc); | ||
| 25447 | + return; | ||
| 25448 | + } | ||
| 25449 | + index /= adev->txdesc_size; | ||
| 25450 | + if (unlikely(ACX_DEBUG && (index >= TX_CNT))) { | ||
| 25451 | + printk("bad txdesc ptr %p\n", txdesc); | ||
| 25452 | + return; | ||
| 25453 | + } | ||
| 25454 | + adev->txc[index] = c; | ||
| 25455 | + adev->txr[index] = r111; | ||
| 25456 | +} | ||
| 25457 | + | ||
| 25458 | + | ||
| 25459 | +/*********************************************************************** | ||
| 25460 | +** EEPROM and PHY read/write helpers | ||
| 25461 | +*/ | ||
| 25462 | +/*********************************************************************** | ||
| 25463 | +** acxpci_read_eeprom_byte | ||
| 25464 | +** | ||
| 25465 | +** Function called to read an octet in the EEPROM. | ||
| 25466 | +** | ||
| 25467 | +** This function is used by acxpci_e_probe to check if the | ||
| 25468 | +** connected card is a legal one or not. | ||
| 25469 | +** | ||
| 25470 | +** Arguments: | ||
| 25471 | +** adev ptr to acx_device structure | ||
| 25472 | +** addr address to read in the EEPROM | ||
| 25473 | +** charbuf ptr to a char. This is where the read octet | ||
| 25474 | +** will be stored | ||
| 25475 | +*/ | ||
| 25476 | +int | ||
| 25477 | +acxpci_read_eeprom_byte(acx_device_t *adev, u32 addr, u8 *charbuf) | ||
| 25478 | +{ | ||
| 25479 | + int result; | ||
| 25480 | + int count; | ||
| 25481 | + | ||
| 25482 | + write_reg32(adev, IO_ACX_EEPROM_CFG, 0); | ||
| 25483 | + write_reg32(adev, IO_ACX_EEPROM_ADDR, addr); | ||
| 25484 | + write_flush(adev); | ||
| 25485 | + write_reg32(adev, IO_ACX_EEPROM_CTL, 2); | ||
| 25486 | + | ||
| 25487 | + count = 0xffff; | ||
| 25488 | + while (read_reg16(adev, IO_ACX_EEPROM_CTL)) { | ||
| 25489 | + /* scheduling away instead of CPU burning loop | ||
| 25490 | + * doesn't seem to work here at all: | ||
| 25491 | + * awful delay, sometimes also failure. | ||
| 25492 | + * Doesn't matter anyway (only small delay). */ | ||
| 25493 | + if (unlikely(!--count)) { | ||
| 25494 | + printk("%s: timeout waiting for EEPROM read\n", | ||
| 25495 | + adev->ndev->name); | ||
| 25496 | + result = NOT_OK; | ||
| 25497 | + goto fail; | ||
| 25498 | + } | ||
| 25499 | + cpu_relax(); | ||
| 25500 | + } | ||
| 25501 | + | ||
| 25502 | + *charbuf = read_reg8(adev, IO_ACX_EEPROM_DATA); | ||
| 25503 | + log(L_DEBUG, "EEPROM at 0x%04X = 0x%02X\n", addr, *charbuf); | ||
| 25504 | + result = OK; | ||
| 25505 | + | ||
| 25506 | +fail: | ||
| 25507 | + return result; | ||
| 25508 | +} | ||
| 25509 | + | ||
| 25510 | + | ||
| 25511 | +/*********************************************************************** | ||
| 25512 | +** We don't lock hw accesses here since we never r/w eeprom in IRQ | ||
| 25513 | +** Note: this function sleeps only because of GFP_KERNEL alloc | ||
| 25514 | +*/ | ||
| 25515 | +#ifdef UNUSED | ||
| 25516 | +int | ||
| 25517 | +acxpci_s_write_eeprom(acx_device_t *adev, u32 addr, u32 len, const u8 *charbuf) | ||
| 25518 | +{ | ||
| 25519 | + u8 *data_verify = NULL; | ||
| 25520 | + unsigned long flags; | ||
| 25521 | + int count, i; | ||
| 25522 | + int result = NOT_OK; | ||
| 25523 | + u16 gpio_orig; | ||
| 25524 | + | ||
| 25525 | + printk("acx: WARNING! I would write to EEPROM now. " | ||
| 25526 | + "Since I really DON'T want to unless you know " | ||
| 25527 | + "what you're doing (THIS CODE WILL PROBABLY " | ||
| 25528 | + "NOT WORK YET!), I will abort that now. And " | ||
| 25529 | + "definitely make sure to make a " | ||
| 25530 | + "/proc/driver/acx_wlan0_eeprom backup copy first!!! " | ||
| 25531 | + "(the EEPROM content includes the PCI config header!! " | ||
| 25532 | + "If you kill important stuff, then you WILL " | ||
| 25533 | + "get in trouble and people DID get in trouble already)\n"); | ||
| 25534 | + return OK; | ||
| 25535 | + | ||
| 25536 | + FN_ENTER; | ||
| 25537 | + | ||
| 25538 | + data_verify = kmalloc(len, GFP_KERNEL); | ||
| 25539 | + if (!data_verify) { | ||
| 25540 | + goto end; | ||
| 25541 | + } | ||
| 25542 | + | ||
| 25543 | + /* first we need to enable the OE (EEPROM Output Enable) GPIO line | ||
| 25544 | + * to be able to write to the EEPROM. | ||
| 25545 | + * NOTE: an EEPROM writing success has been reported, | ||
| 25546 | + * but you probably have to modify GPIO_OUT, too, | ||
| 25547 | + * and you probably need to activate a different GPIO | ||
| 25548 | + * line instead! */ | ||
| 25549 | + gpio_orig = read_reg16(adev, IO_ACX_GPIO_OE); | ||
| 25550 | + write_reg16(adev, IO_ACX_GPIO_OE, gpio_orig & ~1); | ||
| 25551 | + write_flush(adev); | ||
| 25552 | + | ||
| 25553 | + /* ok, now start writing the data out */ | ||
| 25554 | + for (i = 0; i < len; i++) { | ||
| 25555 | + write_reg32(adev, IO_ACX_EEPROM_CFG, 0); | ||
| 25556 | + write_reg32(adev, IO_ACX_EEPROM_ADDR, addr + i); | ||
| 25557 | + write_reg32(adev, IO_ACX_EEPROM_DATA, *(charbuf + i)); | ||
| 25558 | + write_flush(adev); | ||
| 25559 | + write_reg32(adev, IO_ACX_EEPROM_CTL, 1); | ||
| 25560 | + | ||
| 25561 | + count = 0xffff; | ||
| 25562 | + while (read_reg16(adev, IO_ACX_EEPROM_CTL)) { | ||
| 25563 | + if (unlikely(!--count)) { | ||
| 25564 | + printk("WARNING, DANGER!!! " | ||
| 25565 | + "Timeout waiting for EEPROM write\n"); | ||
| 25566 | + goto end; | ||
| 25567 | + } | ||
| 25568 | + cpu_relax(); | ||
| 25569 | + } | ||
| 25570 | + } | ||
| 25571 | + | ||
| 25572 | + /* disable EEPROM writing */ | ||
| 25573 | + write_reg16(adev, IO_ACX_GPIO_OE, gpio_orig); | ||
| 25574 | + write_flush(adev); | ||
| 25575 | + | ||
| 25576 | + /* now start a verification run */ | ||
| 25577 | + for (i = 0; i < len; i++) { | ||
| 25578 | + write_reg32(adev, IO_ACX_EEPROM_CFG, 0); | ||
| 25579 | + write_reg32(adev, IO_ACX_EEPROM_ADDR, addr + i); | ||
| 25580 | + write_flush(adev); | ||
| 25581 | + write_reg32(adev, IO_ACX_EEPROM_CTL, 2); | ||
| 25582 | + | ||
| 25583 | + count = 0xffff; | ||
| 25584 | + while (read_reg16(adev, IO_ACX_EEPROM_CTL)) { | ||
| 25585 | + if (unlikely(!--count)) { | ||
| 25586 | + printk("timeout waiting for EEPROM read\n"); | ||
| 25587 | + goto end; | ||
| 25588 | + } | ||
| 25589 | + cpu_relax(); | ||
| 25590 | + } | ||
| 25591 | + | ||
| 25592 | + data_verify[i] = read_reg16(adev, IO_ACX_EEPROM_DATA); | ||
| 25593 | + } | ||
| 25594 | + | ||
| 25595 | + if (0 == memcmp(charbuf, data_verify, len)) | ||
| 25596 | + result = OK; /* read data matches, success */ | ||
| 25597 | + | ||
| 25598 | +end: | ||
| 25599 | + kfree(data_verify); | ||
| 25600 | + FN_EXIT1(result); | ||
| 25601 | + return result; | ||
| 25602 | +} | ||
| 25603 | +#endif /* UNUSED */ | ||
| 25604 | + | ||
| 25605 | + | ||
| 25606 | +/*********************************************************************** | ||
| 25607 | +** acxpci_s_read_phy_reg | ||
| 25608 | +** | ||
| 25609 | +** Messing with rx/tx disabling and enabling here | ||
| 25610 | +** (write_reg32(adev, IO_ACX_ENABLE, 0b000000xx)) kills traffic | ||
| 25611 | +*/ | ||
| 25612 | +int | ||
| 25613 | +acxpci_s_read_phy_reg(acx_device_t *adev, u32 reg, u8 *charbuf) | ||
| 25614 | +{ | ||
| 25615 | + int result = NOT_OK; | ||
| 25616 | + int count; | ||
| 25617 | + | ||
| 25618 | + FN_ENTER; | ||
| 25619 | + | ||
| 25620 | + write_reg32(adev, IO_ACX_PHY_ADDR, reg); | ||
| 25621 | + write_flush(adev); | ||
| 25622 | + write_reg32(adev, IO_ACX_PHY_CTL, 2); | ||
| 25623 | + | ||
| 25624 | + count = 0xffff; | ||
| 25625 | + while (read_reg32(adev, IO_ACX_PHY_CTL)) { | ||
| 25626 | + /* scheduling away instead of CPU burning loop | ||
| 25627 | + * doesn't seem to work here at all: | ||
| 25628 | + * awful delay, sometimes also failure. | ||
| 25629 | + * Doesn't matter anyway (only small delay). */ | ||
| 25630 | + if (unlikely(!--count)) { | ||
| 25631 | + printk("%s: timeout waiting for phy read\n", | ||
| 25632 | + adev->ndev->name); | ||
| 25633 | + *charbuf = 0; | ||
| 25634 | + goto fail; | ||
| 25635 | + } | ||
| 25636 | + cpu_relax(); | ||
| 25637 | + } | ||
| 25638 | + | ||
| 25639 | + log(L_DEBUG, "count was %u\n", count); | ||
| 25640 | + *charbuf = read_reg8(adev, IO_ACX_PHY_DATA); | ||
| 25641 | + | ||
| 25642 | + log(L_DEBUG, "radio PHY at 0x%04X = 0x%02X\n", *charbuf, reg); | ||
| 25643 | + result = OK; | ||
| 25644 | + goto fail; /* silence compiler warning */ | ||
| 25645 | +fail: | ||
| 25646 | + FN_EXIT1(result); | ||
| 25647 | + return result; | ||
| 25648 | +} | ||
| 25649 | + | ||
| 25650 | + | ||
| 25651 | +/*********************************************************************** | ||
| 25652 | +*/ | ||
| 25653 | +int | ||
| 25654 | +acxpci_s_write_phy_reg(acx_device_t *adev, u32 reg, u8 value) | ||
| 25655 | +{ | ||
| 25656 | + FN_ENTER; | ||
| 25657 | + | ||
| 25658 | + /* mprusko said that 32bit accesses result in distorted sensitivity | ||
| 25659 | + * on his card. Unconfirmed, looks like it's not true (most likely since we | ||
| 25660 | + * now properly flush writes). */ | ||
| 25661 | + write_reg32(adev, IO_ACX_PHY_DATA, value); | ||
| 25662 | + write_reg32(adev, IO_ACX_PHY_ADDR, reg); | ||
| 25663 | + write_flush(adev); | ||
| 25664 | + write_reg32(adev, IO_ACX_PHY_CTL, 1); | ||
| 25665 | + write_flush(adev); | ||
| 25666 | + log(L_DEBUG, "radio PHY write 0x%02X at 0x%04X\n", value, reg); | ||
| 25667 | + | ||
| 25668 | + FN_EXIT1(OK); | ||
| 25669 | + return OK; | ||
| 25670 | +} | ||
| 25671 | + | ||
| 25672 | + | ||
| 25673 | +#define NO_AUTO_INCREMENT 1 | ||
| 25674 | + | ||
| 25675 | +/*********************************************************************** | ||
| 25676 | +** acxpci_s_write_fw | ||
| 25677 | +** | ||
| 25678 | +** Write the firmware image into the card. | ||
| 25679 | +** | ||
| 25680 | +** Arguments: | ||
| 25681 | +** adev wlan device structure | ||
| 25682 | +** fw_image firmware image. | ||
| 25683 | +** | ||
| 25684 | +** Returns: | ||
| 25685 | +** 1 firmware image corrupted | ||
| 25686 | +** 0 success | ||
| 25687 | +*/ | ||
| 25688 | +static int | ||
| 25689 | +acxpci_s_write_fw(acx_device_t *adev, const firmware_image_t *fw_image, u32 offset) | ||
| 25690 | +{ | ||
| 25691 | + int len, size; | ||
| 25692 | + u32 sum, v32; | ||
| 25693 | + /* we skip the first four bytes which contain the control sum */ | ||
| 25694 | + const u8 *p = (u8*)fw_image + 4; | ||
| 25695 | + | ||
| 25696 | + /* start the image checksum by adding the image size value */ | ||
| 25697 | + sum = p[0]+p[1]+p[2]+p[3]; | ||
| 25698 | + p += 4; | ||
| 25699 | + | ||
| 25700 | + write_reg32(adev, IO_ACX_SLV_END_CTL, 0); | ||
| 25701 | + | ||
| 25702 | +#if NO_AUTO_INCREMENT | ||
| 25703 | + write_reg32(adev, IO_ACX_SLV_MEM_CTL, 0); /* use basic mode */ | ||
| 25704 | +#else | ||
| 25705 | + write_reg32(adev, IO_ACX_SLV_MEM_CTL, 1); /* use autoincrement mode */ | ||
| 25706 | + write_reg32(adev, IO_ACX_SLV_MEM_ADDR, offset); /* configure start address */ | ||
| 25707 | + write_flush(adev); | ||
| 25708 | +#endif | ||
| 25709 | + | ||
| 25710 | + len = 0; | ||
| 25711 | + size = le32_to_cpu(fw_image->size) & (~3); | ||
| 25712 | + | ||
| 25713 | + while (likely(len < size)) { | ||
| 25714 | + v32 = be32_to_cpu(*(u32*)p); | ||
| 25715 | + sum += p[0]+p[1]+p[2]+p[3]; | ||
| 25716 | + p += 4; | ||
| 25717 | + len += 4; | ||
| 25718 | + | ||
| 25719 | +#if NO_AUTO_INCREMENT | ||
| 25720 | + write_reg32(adev, IO_ACX_SLV_MEM_ADDR, offset + len - 4); | ||
| 25721 | + write_flush(adev); | ||
| 25722 | +#endif | ||
| 25723 | + write_reg32(adev, IO_ACX_SLV_MEM_DATA, v32); | ||
| 25724 | + } | ||
| 25725 | + | ||
| 25726 | + log(L_DEBUG, "firmware written, size:%d sum1:%x sum2:%x\n", | ||
| 25727 | + size, sum, le32_to_cpu(fw_image->chksum)); | ||
| 25728 | + | ||
| 25729 | + /* compare our checksum with the stored image checksum */ | ||
| 25730 | + return (sum != le32_to_cpu(fw_image->chksum)); | ||
| 25731 | +} | ||
| 25732 | + | ||
| 25733 | + | ||
| 25734 | +/*********************************************************************** | ||
| 25735 | +** acxpci_s_validate_fw | ||
| 25736 | +** | ||
| 25737 | +** Compare the firmware image given with | ||
| 25738 | +** the firmware image written into the card. | ||
| 25739 | +** | ||
| 25740 | +** Arguments: | ||
| 25741 | +** adev wlan device structure | ||
| 25742 | +** fw_image firmware image. | ||
| 25743 | +** | ||
| 25744 | +** Returns: | ||
| 25745 | +** NOT_OK firmware image corrupted or not correctly written | ||
| 25746 | +** OK success | ||
| 25747 | +*/ | ||
| 25748 | +static int | ||
| 25749 | +acxpci_s_validate_fw(acx_device_t *adev, const firmware_image_t *fw_image, | ||
| 25750 | + u32 offset) | ||
| 25751 | +{ | ||
| 25752 | + u32 sum, v32, w32; | ||
| 25753 | + int len, size; | ||
| 25754 | + int result = OK; | ||
| 25755 | + /* we skip the first four bytes which contain the control sum */ | ||
| 25756 | + const u8 *p = (u8*)fw_image + 4; | ||
| 25757 | + | ||
| 25758 | + /* start the image checksum by adding the image size value */ | ||
| 25759 | + sum = p[0]+p[1]+p[2]+p[3]; | ||
| 25760 | + p += 4; | ||
| 25761 | + | ||
| 25762 | + write_reg32(adev, IO_ACX_SLV_END_CTL, 0); | ||
| 25763 | + | ||
| 25764 | +#if NO_AUTO_INCREMENT | ||
| 25765 | + write_reg32(adev, IO_ACX_SLV_MEM_CTL, 0); /* use basic mode */ | ||
| 25766 | +#else | ||
| 25767 | + write_reg32(adev, IO_ACX_SLV_MEM_CTL, 1); /* use autoincrement mode */ | ||
| 25768 | + write_reg32(adev, IO_ACX_SLV_MEM_ADDR, offset); /* configure start address */ | ||
| 25769 | +#endif | ||
| 25770 | + | ||
| 25771 | + len = 0; | ||
| 25772 | + size = le32_to_cpu(fw_image->size) & (~3); | ||
| 25773 | + | ||
| 25774 | + while (likely(len < size)) { | ||
| 25775 | + v32 = be32_to_cpu(*(u32*)p); | ||
| 25776 | + p += 4; | ||
| 25777 | + len += 4; | ||
| 25778 | + | ||
| 25779 | +#if NO_AUTO_INCREMENT | ||
| 25780 | + write_reg32(adev, IO_ACX_SLV_MEM_ADDR, offset + len - 4); | ||
| 25781 | +#endif | ||
| 25782 | + w32 = read_reg32(adev, IO_ACX_SLV_MEM_DATA); | ||
| 25783 | + | ||
| 25784 | + if (unlikely(w32 != v32)) { | ||
| 25785 | + printk("acx: FATAL: firmware upload: " | ||
| 25786 | + "data parts at offset %d don't match (0x%08X vs. 0x%08X)! " | ||
| 25787 | + "I/O timing issues or defective memory, with DWL-xx0+? " | ||
| 25788 | + "ACX_IO_WIDTH=16 may help. Please report\n", | ||
| 25789 | + len, v32, w32); | ||
| 25790 | + result = NOT_OK; | ||
| 25791 | + break; | ||
| 25792 | + } | ||
| 25793 | + | ||
| 25794 | + sum += (u8)w32 + (u8)(w32>>8) + (u8)(w32>>16) + (u8)(w32>>24); | ||
| 25795 | + } | ||
| 25796 | + | ||
| 25797 | + /* sum control verification */ | ||
| 25798 | + if (result != NOT_OK) { | ||
| 25799 | + if (sum != le32_to_cpu(fw_image->chksum)) { | ||
| 25800 | + printk("acx: FATAL: firmware upload: " | ||
| 25801 | + "checksums don't match!\n"); | ||
| 25802 | + result = NOT_OK; | ||
| 25803 | + } | ||
| 25804 | + } | ||
| 25805 | + | ||
| 25806 | + return result; | ||
| 25807 | +} | ||
| 25808 | + | ||
| 25809 | + | ||
| 25810 | +/*********************************************************************** | ||
| 25811 | +** acxpci_s_upload_fw | ||
| 25812 | +** | ||
| 25813 | +** Called from acx_reset_dev | ||
| 25814 | +*/ | ||
| 25815 | +static int | ||
| 25816 | +acxpci_s_upload_fw(acx_device_t *adev) | ||
| 25817 | +{ | ||
| 25818 | + firmware_image_t *fw_image = NULL; | ||
| 25819 | + int res = NOT_OK; | ||
| 25820 | + int try; | ||
| 25821 | + u32 file_size; | ||
| 25822 | + char filename[sizeof("tiacx1NNcNN")]; | ||
| 25823 | + | ||
| 25824 | + FN_ENTER; | ||
| 25825 | + | ||
| 25826 | + /* print exact chipset and radio ID to make sure people really get a clue on which files exactly they are supposed to provide, | ||
| 25827 | + * since firmware loading is the biggest enduser PITA with these chipsets. | ||
| 25828 | + * Not printing radio ID in 0xHEX in order to not confuse them into wrong file naming */ | ||
| 25829 | + printk( "acx: need to load firmware for acx1%02d chipset with radio ID %02x, please provide via firmware hotplug:\n" | ||
| 25830 | + "acx: either one file only (<c>ombined firmware image file, radio-specific) or two files (radio-less base image file *plus* separate <r>adio-specific extension file)\n", | ||
| 25831 | + IS_ACX111(adev)*11, adev->radio_type); | ||
| 25832 | + | ||
| 25833 | + /* Try combined, then main image */ | ||
| 25834 | + adev->need_radio_fw = 0; | ||
| 25835 | + snprintf(filename, sizeof(filename), "tiacx1%02dc%02X", | ||
| 25836 | + IS_ACX111(adev)*11, adev->radio_type); | ||
| 25837 | + | ||
| 25838 | + fw_image = acx_s_read_fw(&adev->pdev->dev, filename, &file_size); | ||
| 25839 | + if (!fw_image) { | ||
| 25840 | + adev->need_radio_fw = 1; | ||
| 25841 | + filename[sizeof("tiacx1NN")-1] = '\0'; | ||
| 25842 | + fw_image = acx_s_read_fw(&adev->pdev->dev, filename, &file_size); | ||
| 25843 | + if (!fw_image) { | ||
| 25844 | + FN_EXIT1(NOT_OK); | ||
| 25845 | + return NOT_OK; | ||
| 25846 | + } | ||
| 25847 | + } | ||
| 25848 | + | ||
| 25849 | + for (try = 1; try <= 5; try++) { | ||
| 25850 | + res = acxpci_s_write_fw(adev, fw_image, 0); | ||
| 25851 | + log(L_DEBUG|L_INIT, "acx_write_fw (main/combined): %d\n", res); | ||
| 25852 | + if (OK == res) { | ||
| 25853 | + res = acxpci_s_validate_fw(adev, fw_image, 0); | ||
| 25854 | + log(L_DEBUG|L_INIT, "acx_validate_fw " | ||
| 25855 | + "(main/combined): %d\n", res); | ||
| 25856 | + } | ||
| 25857 | + | ||
| 25858 | + if (OK == res) { | ||
| 25859 | + SET_BIT(adev->dev_state_mask, ACX_STATE_FW_LOADED); | ||
| 25860 | + break; | ||
| 25861 | + } | ||
| 25862 | + printk("acx: firmware upload attempt #%d FAILED, " | ||
| 25863 | + "retrying...\n", try); | ||
| 25864 | + acx_s_msleep(1000); /* better wait for a while... */ | ||
| 25865 | + } | ||
| 25866 | + | ||
| 25867 | + vfree(fw_image); | ||
| 25868 | + | ||
| 25869 | + FN_EXIT1(res); | ||
| 25870 | + return res; | ||
| 25871 | +} | ||
| 25872 | + | ||
| 25873 | + | ||
| 25874 | +/*********************************************************************** | ||
| 25875 | +** acxpci_s_upload_radio | ||
| 25876 | +** | ||
| 25877 | +** Uploads the appropriate radio module firmware into the card. | ||
| 25878 | +*/ | ||
| 25879 | +int | ||
| 25880 | +acxpci_s_upload_radio(acx_device_t *adev) | ||
| 25881 | +{ | ||
| 25882 | + acx_ie_memmap_t mm; | ||
| 25883 | + firmware_image_t *radio_image; | ||
| 25884 | + acx_cmd_radioinit_t radioinit; | ||
| 25885 | + int res = NOT_OK; | ||
| 25886 | + int try; | ||
| 25887 | + u32 offset; | ||
| 25888 | + u32 size; | ||
| 25889 | + char filename[sizeof("tiacx1NNrNN")]; | ||
| 25890 | + | ||
| 25891 | + if (!adev->need_radio_fw) return OK; | ||
| 25892 | + | ||
| 25893 | + FN_ENTER; | ||
| 25894 | + | ||
| 25895 | + acx_s_interrogate(adev, &mm, ACX1xx_IE_MEMORY_MAP); | ||
| 25896 | + offset = le32_to_cpu(mm.CodeEnd); | ||
| 25897 | + | ||
| 25898 | + snprintf(filename, sizeof(filename), "tiacx1%02dr%02X", | ||
| 25899 | + IS_ACX111(adev)*11, | ||
| 25900 | + adev->radio_type); | ||
| 25901 | + radio_image = acx_s_read_fw(&adev->pdev->dev, filename, &size); | ||
| 25902 | + if (!radio_image) { | ||
| 25903 | + printk("acx: can't load radio module '%s'\n", filename); | ||
| 25904 | + goto fail; | ||
| 25905 | + } | ||
| 25906 | + | ||
| 25907 | + acx_s_issue_cmd(adev, ACX1xx_CMD_SLEEP, NULL, 0); | ||
| 25908 | + | ||
| 25909 | + for (try = 1; try <= 5; try++) { | ||
| 25910 | + res = acxpci_s_write_fw(adev, radio_image, offset); | ||
| 25911 | + log(L_DEBUG|L_INIT, "acx_write_fw (radio): %d\n", res); | ||
| 25912 | + if (OK == res) { | ||
| 25913 | + res = acxpci_s_validate_fw(adev, radio_image, offset); | ||
| 25914 | + log(L_DEBUG|L_INIT, "acx_validate_fw (radio): %d\n", res); | ||
| 25915 | + } | ||
| 25916 | + | ||
| 25917 | + if (OK == res) | ||
| 25918 | + break; | ||
| 25919 | + printk("acx: radio firmware upload attempt #%d FAILED, " | ||
| 25920 | + "retrying...\n", try); | ||
| 25921 | + acx_s_msleep(1000); /* better wait for a while... */ | ||
| 25922 | + } | ||
| 25923 | + | ||
| 25924 | + acx_s_issue_cmd(adev, ACX1xx_CMD_WAKE, NULL, 0); | ||
| 25925 | + radioinit.offset = cpu_to_le32(offset); | ||
| 25926 | + /* no endian conversion needed, remains in card CPU area: */ | ||
| 25927 | + radioinit.len = radio_image->size; | ||
| 25928 | + | ||
| 25929 | + vfree(radio_image); | ||
| 25930 | + | ||
| 25931 | + if (OK != res) | ||
| 25932 | + goto fail; | ||
| 25933 | + | ||
| 25934 | + /* will take a moment so let's have a big timeout */ | ||
| 25935 | + acx_s_issue_cmd_timeo(adev, ACX1xx_CMD_RADIOINIT, | ||
| 25936 | + &radioinit, sizeof(radioinit), CMD_TIMEOUT_MS(1000)); | ||
| 25937 | + | ||
| 25938 | + res = acx_s_interrogate(adev, &mm, ACX1xx_IE_MEMORY_MAP); | ||
| 25939 | +fail: | ||
| 25940 | + FN_EXIT1(res); | ||
| 25941 | + return res; | ||
| 25942 | +} | ||
| 25943 | + | ||
| 25944 | + | ||
| 25945 | +/*********************************************************************** | ||
| 25946 | +** acxpci_l_reset_mac | ||
| 25947 | +** | ||
| 25948 | +** MAC will be reset | ||
| 25949 | +** Call context: reset_dev | ||
| 25950 | +*/ | ||
| 25951 | +static void | ||
| 25952 | +acxpci_l_reset_mac(acx_device_t *adev) | ||
| 25953 | +{ | ||
| 25954 | + u16 temp; | ||
| 25955 | + | ||
| 25956 | + FN_ENTER; | ||
| 25957 | + | ||
| 25958 | + /* halt eCPU */ | ||
| 25959 | + temp = read_reg16(adev, IO_ACX_ECPU_CTRL) | 0x1; | ||
| 25960 | + write_reg16(adev, IO_ACX_ECPU_CTRL, temp); | ||
| 25961 | + | ||
| 25962 | + /* now do soft reset of eCPU, set bit */ | ||
| 25963 | + temp = read_reg16(adev, IO_ACX_SOFT_RESET) | 0x1; | ||
| 25964 | + log(L_DEBUG, "%s: enable soft reset...\n", __func__); | ||
| 25965 | + write_reg16(adev, IO_ACX_SOFT_RESET, temp); | ||
| 25966 | + write_flush(adev); | ||
| 25967 | + | ||
| 25968 | + /* now clear bit again: deassert eCPU reset */ | ||
| 25969 | + log(L_DEBUG, "%s: disable soft reset and go to init mode...\n", __func__); | ||
| 25970 | + write_reg16(adev, IO_ACX_SOFT_RESET, temp & ~0x1); | ||
| 25971 | + | ||
| 25972 | + /* now start a burst read from initial EEPROM */ | ||
| 25973 | + temp = read_reg16(adev, IO_ACX_EE_START) | 0x1; | ||
| 25974 | + write_reg16(adev, IO_ACX_EE_START, temp); | ||
| 25975 | + write_flush(adev); | ||
| 25976 | + | ||
| 25977 | + FN_EXIT0; | ||
| 25978 | +} | ||
| 25979 | + | ||
| 25980 | + | ||
| 25981 | +/*********************************************************************** | ||
| 25982 | +** acxpci_s_verify_init | ||
| 25983 | +*/ | ||
| 25984 | +static int | ||
| 25985 | +acxpci_s_verify_init(acx_device_t *adev) | ||
| 25986 | +{ | ||
| 25987 | + int result = NOT_OK; | ||
| 25988 | + unsigned long timeout; | ||
| 25989 | + | ||
| 25990 | + FN_ENTER; | ||
| 25991 | + | ||
| 25992 | + timeout = jiffies + 2*HZ; | ||
| 25993 | + for (;;) { | ||
| 25994 | + u16 irqstat = read_reg16(adev, IO_ACX_IRQ_STATUS_NON_DES); | ||
| 25995 | + if (irqstat & HOST_INT_FCS_THRESHOLD) { | ||
| 25996 | + result = OK; | ||
| 25997 | + write_reg16(adev, IO_ACX_IRQ_ACK, HOST_INT_FCS_THRESHOLD); | ||
| 25998 | + break; | ||
| 25999 | + } | ||
| 26000 | + if (time_after(jiffies, timeout)) | ||
| 26001 | + break; | ||
| 26002 | + /* Init may take up to ~0.5 sec total */ | ||
| 26003 | + acx_s_msleep(50); | ||
| 26004 | + } | ||
| 26005 | + | ||
| 26006 | + FN_EXIT1(result); | ||
| 26007 | + return result; | ||
| 26008 | +} | ||
| 26009 | + | ||
| 26010 | + | ||
| 26011 | +/*********************************************************************** | ||
| 26012 | +** A few low-level helpers | ||
| 26013 | +** | ||
| 26014 | +** Note: these functions are not protected by lock | ||
| 26015 | +** and thus are never allowed to be called from IRQ. | ||
| 26016 | +** Also they must not race with fw upload which uses same hw regs | ||
| 26017 | +*/ | ||
| 26018 | + | ||
| 26019 | +/*********************************************************************** | ||
| 26020 | +** acxpci_write_cmd_type_status | ||
| 26021 | +*/ | ||
| 26022 | + | ||
| 26023 | +static inline void | ||
| 26024 | +acxpci_write_cmd_type_status(acx_device_t *adev, u16 type, u16 status) | ||
| 26025 | +{ | ||
| 26026 | + writel(type | (status << 16), adev->cmd_area); | ||
| 26027 | + write_flush(adev); | ||
| 26028 | +} | ||
| 26029 | + | ||
| 26030 | + | ||
| 26031 | +/*********************************************************************** | ||
| 26032 | +** acxpci_read_cmd_type_status | ||
| 26033 | +*/ | ||
| 26034 | +static u32 | ||
| 26035 | +acxpci_read_cmd_type_status(acx_device_t *adev) | ||
| 26036 | +{ | ||
| 26037 | + u32 cmd_type, cmd_status; | ||
| 26038 | + | ||
| 26039 | + cmd_type = readl(adev->cmd_area); | ||
| 26040 | + cmd_status = (cmd_type >> 16); | ||
| 26041 | + cmd_type = (u16)cmd_type; | ||
| 26042 | + | ||
| 26043 | + log(L_CTL, "cmd_type:%04X cmd_status:%04X [%s]\n", | ||
| 26044 | + cmd_type, cmd_status, | ||
| 26045 | + acx_cmd_status_str(cmd_status)); | ||
| 26046 | + | ||
| 26047 | + return cmd_status; | ||
| 26048 | +} | ||
| 26049 | + | ||
| 26050 | + | ||
| 26051 | +/*********************************************************************** | ||
| 26052 | +** acxpci_s_reset_dev | ||
| 26053 | +** | ||
| 26054 | +** Arguments: | ||
| 26055 | +** netdevice that contains the adev variable | ||
| 26056 | +** Returns: | ||
| 26057 | +** NOT_OK on fail | ||
| 26058 | +** OK on success | ||
| 26059 | +** Side effects: | ||
| 26060 | +** device is hard reset | ||
| 26061 | +** Call context: | ||
| 26062 | +** acxpci_e_probe | ||
| 26063 | +** Comment: | ||
| 26064 | +** This resets the device using low level hardware calls | ||
| 26065 | +** as well as uploads and verifies the firmware to the card | ||
| 26066 | +*/ | ||
| 26067 | + | ||
| 26068 | +static inline void | ||
| 26069 | +init_mboxes(acx_device_t *adev) | ||
| 26070 | +{ | ||
| 26071 | + u32 cmd_offs, info_offs; | ||
| 26072 | + | ||
| 26073 | + cmd_offs = read_reg32(adev, IO_ACX_CMD_MAILBOX_OFFS); | ||
| 26074 | + info_offs = read_reg32(adev, IO_ACX_INFO_MAILBOX_OFFS); | ||
| 26075 | + adev->cmd_area = (u8 *)adev->iobase2 + cmd_offs; | ||
| 26076 | + adev->info_area = (u8 *)adev->iobase2 + info_offs; | ||
| 26077 | + log(L_DEBUG, "iobase2=%p\n" | ||
| 26078 | + "cmd_mbox_offset=%X cmd_area=%p\n" | ||
| 26079 | + "info_mbox_offset=%X info_area=%p\n", | ||
| 26080 | + adev->iobase2, | ||
| 26081 | + cmd_offs, adev->cmd_area, | ||
| 26082 | + info_offs, adev->info_area); | ||
| 26083 | +} | ||
| 26084 | + | ||
| 26085 | + | ||
| 26086 | +static inline void | ||
| 26087 | +read_eeprom_area(acx_device_t *adev) | ||
| 26088 | +{ | ||
| 26089 | +#if ACX_DEBUG > 1 | ||
| 26090 | + int offs; | ||
| 26091 | + u8 tmp; | ||
| 26092 | + | ||
| 26093 | + for (offs = 0x8c; offs < 0xb9; offs++) | ||
| 26094 | + acxpci_read_eeprom_byte(adev, offs, &tmp); | ||
| 26095 | +#endif | ||
| 26096 | +} | ||
| 26097 | + | ||
| 26098 | + | ||
| 26099 | +static int | ||
| 26100 | +acxpci_s_reset_dev(acx_device_t *adev) | ||
| 26101 | +{ | ||
| 26102 | + const char* msg = ""; | ||
| 26103 | + unsigned long flags; | ||
| 26104 | + int result = NOT_OK; | ||
| 26105 | + u16 hardware_info; | ||
| 26106 | + u16 ecpu_ctrl; | ||
| 26107 | + int count; | ||
| 26108 | + | ||
| 26109 | + FN_ENTER; | ||
| 26110 | + | ||
| 26111 | + /* reset the device to make sure the eCPU is stopped | ||
| 26112 | + * to upload the firmware correctly */ | ||
| 26113 | + | ||
| 26114 | + acx_lock(adev, flags); | ||
| 26115 | + | ||
| 26116 | + acxpci_l_reset_mac(adev); | ||
| 26117 | + | ||
| 26118 | + ecpu_ctrl = read_reg16(adev, IO_ACX_ECPU_CTRL) & 1; | ||
| 26119 | + if (!ecpu_ctrl) { | ||
| 26120 | + msg = "eCPU is already running. "; | ||
| 26121 | + goto end_unlock; | ||
| 26122 | + } | ||
| 26123 | + | ||
| 26124 | +#ifdef WE_DONT_NEED_THAT_DO_WE | ||
| 26125 | + if (read_reg16(adev, IO_ACX_SOR_CFG) & 2) { | ||
| 26126 | + /* eCPU most likely means "embedded CPU" */ | ||
| 26127 | + msg = "eCPU did not start after boot from flash. "; | ||
| 26128 | + goto end_unlock; | ||
| 26129 | + } | ||
| 26130 | + | ||
| 26131 | + /* check sense on reset flags */ | ||
| 26132 | + if (read_reg16(adev, IO_ACX_SOR_CFG) & 0x10) { | ||
| 26133 | + printk("%s: eCPU did not start after boot (SOR), " | ||
| 26134 | + "is this fatal?\n", adev->ndev->name); | ||
| 26135 | + } | ||
| 26136 | +#endif | ||
| 26137 | + /* scan, if any, is stopped now, setting corresponding IRQ bit */ | ||
| 26138 | + adev->irq_status |= HOST_INT_SCAN_COMPLETE; | ||
| 26139 | + | ||
| 26140 | + acx_unlock(adev, flags); | ||
| 26141 | + | ||
| 26142 | + /* need to know radio type before fw load */ | ||
| 26143 | + /* Need to wait for arrival of this information in a loop, | ||
| 26144 | + * most probably since eCPU runs some init code from EEPROM | ||
| 26145 | + * (started burst read in reset_mac()) which also | ||
| 26146 | + * sets the radio type ID */ | ||
| 26147 | + | ||
| 26148 | + count = 0xffff; | ||
| 26149 | + do { | ||
| 26150 | + hardware_info = read_reg16(adev, IO_ACX_EEPROM_INFORMATION); | ||
| 26151 | + if (!--count) { | ||
| 26152 | + msg = "eCPU didn't indicate radio type"; | ||
| 26153 | + goto end_fail; | ||
| 26154 | + } | ||
| 26155 | + cpu_relax(); | ||
| 26156 | + } while (!(hardware_info & 0xff00)); /* radio type still zero? */ | ||
| 26157 | + | ||
| 26158 | + /* printk("DEBUG: count %d\n", count); */ | ||
| 26159 | + adev->form_factor = hardware_info & 0xff; | ||
| 26160 | + adev->radio_type = hardware_info >> 8; | ||
| 26161 | + | ||
| 26162 | + /* load the firmware */ | ||
| 26163 | + if (OK != acxpci_s_upload_fw(adev)) | ||
| 26164 | + goto end_fail; | ||
| 26165 | + | ||
| 26166 | + /* acx_s_msleep(10); this one really shouldn't be required */ | ||
| 26167 | + | ||
| 26168 | + /* now start eCPU by clearing bit */ | ||
| 26169 | + write_reg16(adev, IO_ACX_ECPU_CTRL, ecpu_ctrl & ~0x1); | ||
| 26170 | + log(L_DEBUG, "booted eCPU up and waiting for completion...\n"); | ||
| 26171 | + | ||
| 26172 | + /* wait for eCPU bootup */ | ||
| 26173 | + if (OK != acxpci_s_verify_init(adev)) { | ||
| 26174 | + msg = "timeout waiting for eCPU. "; | ||
| 26175 | + goto end_fail; | ||
| 26176 | + } | ||
| 26177 | + log(L_DEBUG, "eCPU has woken up, card is ready to be configured\n"); | ||
| 26178 | + | ||
| 26179 | + init_mboxes(adev); | ||
| 26180 | + acxpci_write_cmd_type_status(adev, 0, 0); | ||
| 26181 | + | ||
| 26182 | + /* test that EEPROM is readable */ | ||
| 26183 | + read_eeprom_area(adev); | ||
| 26184 | + | ||
| 26185 | + result = OK; | ||
| 26186 | + goto end; | ||
| 26187 | + | ||
| 26188 | +/* Finish error message. Indicate which function failed */ | ||
| 26189 | +end_unlock: | ||
| 26190 | + acx_unlock(adev, flags); | ||
| 26191 | +end_fail: | ||
| 26192 | + printk("acx: %sreset_dev() FAILED\n", msg); | ||
| 26193 | +end: | ||
| 26194 | + FN_EXIT1(result); | ||
| 26195 | + return result; | ||
| 26196 | +} | ||
| 26197 | + | ||
| 26198 | + | ||
| 26199 | +/*********************************************************************** | ||
| 26200 | +** acxpci_s_issue_cmd_timeo | ||
| 26201 | +** | ||
| 26202 | +** Sends command to fw, extract result | ||
| 26203 | +** | ||
| 26204 | +** NB: we do _not_ take lock inside, so be sure to not touch anything | ||
| 26205 | +** which may interfere with IRQ handler operation | ||
| 26206 | +** | ||
| 26207 | +** TODO: busy wait is a bit silly, so: | ||
| 26208 | +** 1) stop doing many iters - go to sleep after first | ||
| 26209 | +** 2) go to waitqueue based approach: wait, not poll! | ||
| 26210 | +*/ | ||
| 26211 | +#undef FUNC | ||
| 26212 | +#define FUNC "issue_cmd" | ||
| 26213 | + | ||
| 26214 | +#if !ACX_DEBUG | ||
| 26215 | +int | ||
| 26216 | +acxpci_s_issue_cmd_timeo( | ||
| 26217 | + acx_device_t *adev, | ||
| 26218 | + unsigned int cmd, | ||
| 26219 | + void *buffer, | ||
| 26220 | + unsigned buflen, | ||
| 26221 | + unsigned cmd_timeout) | ||
| 26222 | +{ | ||
| 26223 | +#else | ||
| 26224 | +int | ||
| 26225 | +acxpci_s_issue_cmd_timeo_debug( | ||
| 26226 | + acx_device_t *adev, | ||
| 26227 | + unsigned cmd, | ||
| 26228 | + void *buffer, | ||
| 26229 | + unsigned buflen, | ||
| 26230 | + unsigned cmd_timeout, | ||
| 26231 | + const char* cmdstr) | ||
| 26232 | +{ | ||
| 26233 | + unsigned long start = jiffies; | ||
| 26234 | +#endif | ||
| 26235 | + const char *devname; | ||
| 26236 | + unsigned counter; | ||
| 26237 | + u16 irqtype; | ||
| 26238 | + u16 cmd_status; | ||
| 26239 | + unsigned long timeout; | ||
| 26240 | + | ||
| 26241 | + FN_ENTER; | ||
| 26242 | + | ||
| 26243 | + devname = adev->ndev->name; | ||
| 26244 | + if (!devname || !devname[0] || devname[4]=='%') | ||
| 26245 | + devname = "acx"; | ||
| 26246 | + | ||
| 26247 | + log(L_CTL, FUNC"(cmd:%s,buflen:%u,timeout:%ums,type:0x%04X)\n", | ||
| 26248 | + cmdstr, buflen, cmd_timeout, | ||
| 26249 | + buffer ? le16_to_cpu(((acx_ie_generic_t *)buffer)->type) : -1); | ||
| 26250 | + | ||
| 26251 | + if (!(adev->dev_state_mask & ACX_STATE_FW_LOADED)) { | ||
| 26252 | + printk("%s: "FUNC"(): firmware is not loaded yet, " | ||
| 26253 | + "cannot execute commands!\n", devname); | ||
| 26254 | + goto bad; | ||
| 26255 | + } | ||
| 26256 | + | ||
| 26257 | + if ((acx_debug & L_DEBUG) && (cmd != ACX1xx_CMD_INTERROGATE)) { | ||
| 26258 | + printk("input buffer (len=%u):\n", buflen); | ||
| 26259 | + acx_dump_bytes(buffer, buflen); | ||
| 26260 | + } | ||
| 26261 | + | ||
| 26262 | + /* wait for firmware to become idle for our command submission */ | ||
| 26263 | + timeout = HZ/5; | ||
| 26264 | + counter = (timeout * 1000 / HZ) - 1; /* in ms */ | ||
| 26265 | + timeout += jiffies; | ||
| 26266 | + do { | ||
| 26267 | + cmd_status = acxpci_read_cmd_type_status(adev); | ||
| 26268 | + /* Test for IDLE state */ | ||
| 26269 | + if (!cmd_status) | ||
| 26270 | + break; | ||
| 26271 | + if (counter % 8 == 0) { | ||
| 26272 | + if (time_after(jiffies, timeout)) { | ||
| 26273 | + counter = 0; | ||
| 26274 | + break; | ||
| 26275 | + } | ||
| 26276 | + /* we waited 8 iterations, no luck. Sleep 8 ms */ | ||
| 26277 | + acx_s_msleep(8); | ||
| 26278 | + } | ||
| 26279 | + } while (likely(--counter)); | ||
| 26280 | + | ||
| 26281 | + if (!counter) { | ||
| 26282 | + /* the card doesn't get idle, we're in trouble */ | ||
| 26283 | + printk("%s: "FUNC"(): cmd_status is not IDLE: 0x%04X!=0\n", | ||
| 26284 | + devname, cmd_status); | ||
| 26285 | + goto bad; | ||
| 26286 | + } else if (counter < 190) { /* if waited >10ms... */ | ||
| 26287 | + log(L_CTL|L_DEBUG, FUNC"(): waited for IDLE %dms. " | ||
| 26288 | + "Please report\n", 199 - counter); | ||
| 26289 | + } | ||
| 26290 | + | ||
| 26291 | + /* now write the parameters of the command if needed */ | ||
| 26292 | + if (buffer && buflen) { | ||
| 26293 | + /* if it's an INTERROGATE command, just pass the length | ||
| 26294 | + * of parameters to read, as data */ | ||
| 26295 | +#if CMD_DISCOVERY | ||
| 26296 | + if (cmd == ACX1xx_CMD_INTERROGATE) | ||
| 26297 | + memset_io(adev->cmd_area + 4, 0xAA, buflen); | ||
| 26298 | +#endif | ||
| 26299 | + /* adev->cmd_area points to PCI device's memory, not to RAM! */ | ||
| 26300 | + memcpy_toio(adev->cmd_area + 4, buffer, | ||
| 26301 | + (cmd == ACX1xx_CMD_INTERROGATE) ? 4 : buflen); | ||
| 26302 | + } | ||
| 26303 | + /* now write the actual command type */ | ||
| 26304 | + acxpci_write_cmd_type_status(adev, cmd, 0); | ||
| 26305 | + /* execute command */ | ||
| 26306 | + write_reg16(adev, IO_ACX_INT_TRIG, INT_TRIG_CMD); | ||
| 26307 | + write_flush(adev); | ||
| 26308 | + | ||
| 26309 | + /* wait for firmware to process command */ | ||
| 26310 | + | ||
| 26311 | + /* Ensure nonzero and not too large timeout. | ||
| 26312 | + ** Also converts e.g. 100->99, 200->199 | ||
| 26313 | + ** which is nice but not essential */ | ||
| 26314 | + cmd_timeout = (cmd_timeout-1) | 1; | ||
| 26315 | + if (unlikely(cmd_timeout > 1199)) | ||
| 26316 | + cmd_timeout = 1199; | ||
| 26317 | + /* clear CMD_COMPLETE bit. can be set only by IRQ handler: */ | ||
| 26318 | + adev->irq_status &= ~HOST_INT_CMD_COMPLETE; | ||
| 26319 | + | ||
| 26320 | + /* we schedule away sometimes (timeout can be large) */ | ||
| 26321 | + counter = cmd_timeout; | ||
| 26322 | + timeout = jiffies + cmd_timeout * HZ / 1000; | ||
| 26323 | + do { | ||
| 26324 | + if (!adev->irqs_active) { /* IRQ disabled: poll */ | ||
| 26325 | + irqtype = read_reg16(adev, IO_ACX_IRQ_STATUS_NON_DES); | ||
| 26326 | + if (irqtype & HOST_INT_CMD_COMPLETE) { | ||
| 26327 | + write_reg16(adev, IO_ACX_IRQ_ACK, | ||
| 26328 | + HOST_INT_CMD_COMPLETE); | ||
| 26329 | + break; | ||
| 26330 | + } | ||
| 26331 | + } else { /* Wait when IRQ will set the bit */ | ||
| 26332 | + irqtype = adev->irq_status; | ||
| 26333 | + if (irqtype & HOST_INT_CMD_COMPLETE) | ||
| 26334 | + break; | ||
| 26335 | + } | ||
| 26336 | + | ||
| 26337 | + if (counter % 8 == 0) { | ||
| 26338 | + if (time_after(jiffies, timeout)) { | ||
| 26339 | + counter = 0; | ||
| 26340 | + break; | ||
| 26341 | + } | ||
| 26342 | + /* we waited 8 iterations, no luck. Sleep 8 ms */ | ||
| 26343 | + acx_s_msleep(8); | ||
| 26344 | + } | ||
| 26345 | + } while (likely(--counter)); | ||
| 26346 | + | ||
| 26347 | + /* save state for debugging */ | ||
| 26348 | + cmd_status = acxpci_read_cmd_type_status(adev); | ||
| 26349 | + | ||
| 26350 | + /* put the card in IDLE state */ | ||
| 26351 | + acxpci_write_cmd_type_status(adev, 0, 0); | ||
| 26352 | + | ||
| 26353 | + if (!counter) { /* timed out! */ | ||
| 26354 | + printk("%s: "FUNC"(): timed out %s for CMD_COMPLETE. " | ||
| 26355 | + "irq bits:0x%04X irq_status:0x%04X timeout:%dms " | ||
| 26356 | + "cmd_status:%d (%s)\n", | ||
| 26357 | + devname, (adev->irqs_active) ? "waiting" : "polling", | ||
| 26358 | + irqtype, adev->irq_status, cmd_timeout, | ||
| 26359 | + cmd_status, acx_cmd_status_str(cmd_status)); | ||
| 26360 | + goto bad; | ||
| 26361 | + } else if (cmd_timeout - counter > 30) { /* if waited >30ms... */ | ||
| 26362 | + log(L_CTL|L_DEBUG, FUNC"(): %s for CMD_COMPLETE %dms. " | ||
| 26363 | + "count:%d. Please report\n", | ||
| 26364 | + (adev->irqs_active) ? "waited" : "polled", | ||
| 26365 | + cmd_timeout - counter, counter); | ||
| 26366 | + } | ||
| 26367 | + | ||
| 26368 | + if (1 != cmd_status) { /* it is not a 'Success' */ | ||
| 26369 | + printk("%s: "FUNC"(): cmd_status is not SUCCESS: %d (%s). " | ||
| 26370 | + "Took %dms of %d\n", | ||
| 26371 | + devname, cmd_status, acx_cmd_status_str(cmd_status), | ||
| 26372 | + cmd_timeout - counter, cmd_timeout); | ||
| 26373 | + /* zero out result buffer | ||
| 26374 | + * WARNING: this will trash stack in case of illegally large input | ||
| 26375 | + * length! */ | ||
| 26376 | + if (buffer && buflen) | ||
| 26377 | + memset(buffer, 0, buflen); | ||
| 26378 | + goto bad; | ||
| 26379 | + } | ||
| 26380 | + | ||
| 26381 | + /* read in result parameters if needed */ | ||
| 26382 | + if (buffer && buflen && (cmd == ACX1xx_CMD_INTERROGATE)) { | ||
| 26383 | + /* adev->cmd_area points to PCI device's memory, not to RAM! */ | ||
| 26384 | + memcpy_fromio(buffer, adev->cmd_area + 4, buflen); | ||
| 26385 | + if (acx_debug & L_DEBUG) { | ||
| 26386 | + printk("output buffer (len=%u): ", buflen); | ||
| 26387 | + acx_dump_bytes(buffer, buflen); | ||
| 26388 | + } | ||
| 26389 | + } | ||
| 26390 | +/* ok: */ | ||
| 26391 | + log(L_CTL, FUNC"(%s): took %ld jiffies to complete\n", | ||
| 26392 | + cmdstr, jiffies - start); | ||
| 26393 | + FN_EXIT1(OK); | ||
| 26394 | + return OK; | ||
| 26395 | + | ||
| 26396 | +bad: | ||
| 26397 | + /* Give enough info so that callers can avoid | ||
| 26398 | + ** printing their own diagnostic messages */ | ||
| 26399 | +#if ACX_DEBUG | ||
| 26400 | + printk("%s: "FUNC"(cmd:%s) FAILED\n", devname, cmdstr); | ||
| 26401 | +#else | ||
| 26402 | + printk("%s: "FUNC"(cmd:0x%04X) FAILED\n", devname, cmd); | ||
| 26403 | +#endif | ||
| 26404 | + dump_stack(); | ||
| 26405 | + FN_EXIT1(NOT_OK); | ||
| 26406 | + return NOT_OK; | ||
| 26407 | +} | ||
| 26408 | + | ||
| 26409 | + | ||
| 26410 | +/*********************************************************************** | ||
| 26411 | +*/ | ||
| 26412 | +#ifdef NONESSENTIAL_FEATURES | ||
| 26413 | +typedef struct device_id { | ||
| 26414 | + unsigned char id[6]; | ||
| 26415 | + char *descr; | ||
| 26416 | + char *type; | ||
| 26417 | +} device_id_t; | ||
| 26418 | + | ||
| 26419 | +static const device_id_t | ||
| 26420 | +device_ids[] = | ||
| 26421 | +{ | ||
| 26422 | + { | ||
| 26423 | + {'G', 'l', 'o', 'b', 'a', 'l'}, | ||
| 26424 | + NULL, | ||
| 26425 | + NULL, | ||
| 26426 | + }, | ||
| 26427 | + { | ||
| 26428 | + {0xff, 0xff, 0xff, 0xff, 0xff, 0xff}, | ||
| 26429 | + "uninitialized", | ||
| 26430 | + "SpeedStream SS1021 or Gigafast WF721-AEX" | ||
| 26431 | + }, | ||
| 26432 | + { | ||
| 26433 | + {0x80, 0x81, 0x82, 0x83, 0x84, 0x85}, | ||
| 26434 | + "non-standard", | ||
| 26435 | + "DrayTek Vigor 520" | ||
| 26436 | + }, | ||
| 26437 | + { | ||
| 26438 | + {'?', '?', '?', '?', '?', '?'}, | ||
| 26439 | + "non-standard", | ||
| 26440 | + "Level One WPC-0200" | ||
| 26441 | + }, | ||
| 26442 | + { | ||
| 26443 | + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, | ||
| 26444 | + "empty", | ||
| 26445 | + "DWL-650+ variant" | ||
| 26446 | + } | ||
| 26447 | +}; | ||
| 26448 | + | ||
| 26449 | +static void | ||
| 26450 | +acx_show_card_eeprom_id(acx_device_t *adev) | ||
| 26451 | +{ | ||
| 26452 | + unsigned char buffer[CARD_EEPROM_ID_SIZE]; | ||
| 26453 | + int i; | ||
| 26454 | + | ||
| 26455 | + memset(&buffer, 0, CARD_EEPROM_ID_SIZE); | ||
| 26456 | + /* use direct EEPROM access */ | ||
| 26457 | + for (i = 0; i < CARD_EEPROM_ID_SIZE; i++) { | ||
| 26458 | + if (OK != acxpci_read_eeprom_byte(adev, | ||
| 26459 | + ACX100_EEPROM_ID_OFFSET + i, | ||
| 26460 | + &buffer[i])) { | ||
| 26461 | + printk("acx: reading EEPROM FAILED\n"); | ||
| 26462 | + break; | ||
| 26463 | + } | ||
| 26464 | + } | ||
| 26465 | + | ||
| 26466 | + for (i = 0; i < VEC_SIZE(device_ids); i++) { | ||
| 26467 | + if (!memcmp(&buffer, device_ids[i].id, CARD_EEPROM_ID_SIZE)) { | ||
| 26468 | + if (device_ids[i].descr) { | ||
| 26469 | + printk("acx: EEPROM card ID string check " | ||
| 26470 | + "found %s card ID: is this %s?\n", | ||
| 26471 | + device_ids[i].descr, device_ids[i].type); | ||
| 26472 | + } | ||
| 26473 | + break; | ||
| 26474 | + } | ||
| 26475 | + } | ||
| 26476 | + if (i == VEC_SIZE(device_ids)) { | ||
| 26477 | + printk("acx: EEPROM card ID string check found " | ||
| 26478 | + "unknown card: expected 'Global', got '%.*s\'. " | ||
| 26479 | + "Please report\n", CARD_EEPROM_ID_SIZE, buffer); | ||
| 26480 | + } | ||
| 26481 | +} | ||
| 26482 | +#endif /* NONESSENTIAL_FEATURES */ | ||
| 26483 | + | ||
| 26484 | + | ||
| 26485 | +/*********************************************************************** | ||
| 26486 | +** acxpci_free_desc_queues | ||
| 26487 | +** | ||
| 26488 | +** Releases the queues that have been allocated, the | ||
| 26489 | +** others have been initialised to NULL so this | ||
| 26490 | +** function can be used if only part of the queues were allocated. | ||
| 26491 | +*/ | ||
| 26492 | + | ||
| 26493 | +static inline void | ||
| 26494 | +free_coherent(struct pci_dev *hwdev, size_t size, | ||
| 26495 | + void *vaddr, dma_addr_t dma_handle) | ||
| 26496 | +{ | ||
| 26497 | + dma_free_coherent(hwdev == NULL ? NULL : &hwdev->dev, | ||
| 26498 | + size, vaddr, dma_handle); | ||
| 26499 | +} | ||
| 26500 | + | ||
| 26501 | +void | ||
| 26502 | +acxpci_free_desc_queues(acx_device_t *adev) | ||
| 26503 | +{ | ||
| 26504 | +#define ACX_FREE_QUEUE(size, ptr, phyaddr) \ | ||
| 26505 | + if (ptr) { \ | ||
| 26506 | + free_coherent(0, size, ptr, phyaddr); \ | ||
| 26507 | + ptr = NULL; \ | ||
| 26508 | + size = 0; \ | ||
| 26509 | + } | ||
| 26510 | + | ||
| 26511 | + FN_ENTER; | ||
| 26512 | + | ||
| 26513 | + ACX_FREE_QUEUE(adev->txhostdesc_area_size, adev->txhostdesc_start, adev->txhostdesc_startphy); | ||
| 26514 | + ACX_FREE_QUEUE(adev->txbuf_area_size, adev->txbuf_start, adev->txbuf_startphy); | ||
| 26515 | + | ||
| 26516 | + adev->txdesc_start = NULL; | ||
| 26517 | + | ||
| 26518 | + ACX_FREE_QUEUE(adev->rxhostdesc_area_size, adev->rxhostdesc_start, adev->rxhostdesc_startphy); | ||
| 26519 | + ACX_FREE_QUEUE(adev->rxbuf_area_size, adev->rxbuf_start, adev->rxbuf_startphy); | ||
| 26520 | + | ||
| 26521 | + adev->rxdesc_start = NULL; | ||
| 26522 | + | ||
| 26523 | + FN_EXIT0; | ||
| 26524 | +} | ||
| 26525 | + | ||
| 26526 | + | ||
| 26527 | +/*********************************************************************** | ||
| 26528 | +** acxpci_s_delete_dma_regions | ||
| 26529 | +*/ | ||
| 26530 | +static void | ||
| 26531 | +acxpci_s_delete_dma_regions(acx_device_t *adev) | ||
| 26532 | +{ | ||
| 26533 | + unsigned long flags; | ||
| 26534 | + | ||
| 26535 | + FN_ENTER; | ||
| 26536 | + /* disable radio Tx/Rx. Shouldn't we use the firmware commands | ||
| 26537 | + * here instead? Or are we that much down the road that it's no | ||
| 26538 | + * longer possible here? */ | ||
| 26539 | + write_reg16(adev, IO_ACX_ENABLE, 0); | ||
| 26540 | + | ||
| 26541 | + acx_s_msleep(100); | ||
| 26542 | + | ||
| 26543 | + acx_lock(adev, flags); | ||
| 26544 | + acxpci_free_desc_queues(adev); | ||
| 26545 | + acx_unlock(adev, flags); | ||
| 26546 | + | ||
| 26547 | + FN_EXIT0; | ||
| 26548 | +} | ||
| 26549 | + | ||
| 26550 | + | ||
| 26551 | +/*********************************************************************** | ||
| 26552 | +** acxpci_e_probe | ||
| 26553 | +** | ||
| 26554 | +** Probe routine called when a PCI device w/ matching ID is found. | ||
| 26555 | +** Here's the sequence: | ||
| 26556 | +** - Allocate the PCI resources. | ||
| 26557 | +** - Read the PCMCIA attribute memory to make sure we have a WLAN card | ||
| 26558 | +** - Reset the MAC | ||
| 26559 | +** - Initialize the dev and wlan data | ||
| 26560 | +** - Initialize the MAC | ||
| 26561 | +** | ||
| 26562 | +** pdev - ptr to pci device structure containing info about pci configuration | ||
| 26563 | +** id - ptr to the device id entry that matched this device | ||
| 26564 | +*/ | ||
| 26565 | +static const u16 | ||
| 26566 | +IO_ACX100[] = | ||
| 26567 | +{ | ||
| 26568 | + 0x0000, /* IO_ACX_SOFT_RESET */ | ||
| 26569 | + | ||
| 26570 | + 0x0014, /* IO_ACX_SLV_MEM_ADDR */ | ||
| 26571 | + 0x0018, /* IO_ACX_SLV_MEM_DATA */ | ||
| 26572 | + 0x001c, /* IO_ACX_SLV_MEM_CTL */ | ||
| 26573 | + 0x0020, /* IO_ACX_SLV_END_CTL */ | ||
| 26574 | + | ||
| 26575 | + 0x0034, /* IO_ACX_FEMR */ | ||
| 26576 | + | ||
| 26577 | + 0x007c, /* IO_ACX_INT_TRIG */ | ||
| 26578 | + 0x0098, /* IO_ACX_IRQ_MASK */ | ||
| 26579 | + 0x00a4, /* IO_ACX_IRQ_STATUS_NON_DES */ | ||
| 26580 | + 0x00a8, /* IO_ACX_IRQ_STATUS_CLEAR */ | ||
| 26581 | + 0x00ac, /* IO_ACX_IRQ_ACK */ | ||
| 26582 | + 0x00b0, /* IO_ACX_HINT_TRIG */ | ||
| 26583 | + | ||
| 26584 | + 0x0104, /* IO_ACX_ENABLE */ | ||
| 26585 | + | ||
| 26586 | + 0x0250, /* IO_ACX_EEPROM_CTL */ | ||
| 26587 | + 0x0254, /* IO_ACX_EEPROM_ADDR */ | ||
| 26588 | + 0x0258, /* IO_ACX_EEPROM_DATA */ | ||
| 26589 | + 0x025c, /* IO_ACX_EEPROM_CFG */ | ||
| 26590 | + | ||
| 26591 | + 0x0268, /* IO_ACX_PHY_ADDR */ | ||
| 26592 | + 0x026c, /* IO_ACX_PHY_DATA */ | ||
| 26593 | + 0x0270, /* IO_ACX_PHY_CTL */ | ||
| 26594 | + | ||
| 26595 | + 0x0290, /* IO_ACX_GPIO_OE */ | ||
| 26596 | + | ||
| 26597 | + 0x0298, /* IO_ACX_GPIO_OUT */ | ||
| 26598 | + | ||
| 26599 | + 0x02a4, /* IO_ACX_CMD_MAILBOX_OFFS */ | ||
| 26600 | + 0x02a8, /* IO_ACX_INFO_MAILBOX_OFFS */ | ||
| 26601 | + 0x02ac, /* IO_ACX_EEPROM_INFORMATION */ | ||
| 26602 | + | ||
| 26603 | + 0x02d0, /* IO_ACX_EE_START */ | ||
| 26604 | + 0x02d4, /* IO_ACX_SOR_CFG */ | ||
| 26605 | + 0x02d8 /* IO_ACX_ECPU_CTRL */ | ||
| 26606 | +}; | ||
| 26607 | + | ||
| 26608 | +static const u16 | ||
| 26609 | +IO_ACX111[] = | ||
| 26610 | +{ | ||
| 26611 | + 0x0000, /* IO_ACX_SOFT_RESET */ | ||
| 26612 | + | ||
| 26613 | + 0x0014, /* IO_ACX_SLV_MEM_ADDR */ | ||
| 26614 | + 0x0018, /* IO_ACX_SLV_MEM_DATA */ | ||
| 26615 | + 0x001c, /* IO_ACX_SLV_MEM_CTL */ | ||
| 26616 | + 0x0020, /* IO_ACX_SLV_END_CTL */ | ||
| 26617 | + | ||
| 26618 | + 0x0034, /* IO_ACX_FEMR */ | ||
| 26619 | + | ||
| 26620 | + 0x00b4, /* IO_ACX_INT_TRIG */ | ||
| 26621 | + 0x00d4, /* IO_ACX_IRQ_MASK */ | ||
| 26622 | + /* we do mean NON_DES (0xf0), not NON_DES_MASK which is at 0xe0: */ | ||
| 26623 | + 0x00f0, /* IO_ACX_IRQ_STATUS_NON_DES */ | ||
| 26624 | + 0x00e4, /* IO_ACX_IRQ_STATUS_CLEAR */ | ||
| 26625 | + 0x00e8, /* IO_ACX_IRQ_ACK */ | ||
| 26626 | + 0x00ec, /* IO_ACX_HINT_TRIG */ | ||
| 26627 | + | ||
| 26628 | + 0x01d0, /* IO_ACX_ENABLE */ | ||
| 26629 | + | ||
| 26630 | + 0x0338, /* IO_ACX_EEPROM_CTL */ | ||
| 26631 | + 0x033c, /* IO_ACX_EEPROM_ADDR */ | ||
| 26632 | + 0x0340, /* IO_ACX_EEPROM_DATA */ | ||
| 26633 | + 0x0344, /* IO_ACX_EEPROM_CFG */ | ||
| 26634 | + | ||
| 26635 | + 0x0350, /* IO_ACX_PHY_ADDR */ | ||
| 26636 | + 0x0354, /* IO_ACX_PHY_DATA */ | ||
| 26637 | + 0x0358, /* IO_ACX_PHY_CTL */ | ||
| 26638 | + | ||
| 26639 | + 0x0374, /* IO_ACX_GPIO_OE */ | ||
| 26640 | + | ||
| 26641 | + 0x037c, /* IO_ACX_GPIO_OUT */ | ||
| 26642 | + | ||
| 26643 | + 0x0388, /* IO_ACX_CMD_MAILBOX_OFFS */ | ||
| 26644 | + 0x038c, /* IO_ACX_INFO_MAILBOX_OFFS */ | ||
| 26645 | + 0x0390, /* IO_ACX_EEPROM_INFORMATION */ | ||
| 26646 | + | ||
| 26647 | + 0x0100, /* IO_ACX_EE_START */ | ||
| 26648 | + 0x0104, /* IO_ACX_SOR_CFG */ | ||
| 26649 | + 0x0108, /* IO_ACX_ECPU_CTRL */ | ||
| 26650 | +}; | ||
| 26651 | + | ||
| 26652 | +static void | ||
| 26653 | +dummy_netdev_init(struct net_device *ndev) {} | ||
| 26654 | + | ||
| 26655 | +static int __devinit | ||
| 26656 | +acxpci_e_probe(struct pci_dev *pdev, const struct pci_device_id *id) | ||
| 26657 | +{ | ||
| 26658 | + acx111_ie_configoption_t co; | ||
| 26659 | + unsigned long mem_region1 = 0; | ||
| 26660 | + unsigned long mem_region2 = 0; | ||
| 26661 | + unsigned long mem_region1_size; | ||
| 26662 | + unsigned long mem_region2_size; | ||
| 26663 | + unsigned long phymem1; | ||
| 26664 | + unsigned long phymem2; | ||
| 26665 | + void *mem1 = NULL; | ||
| 26666 | + void *mem2 = NULL; | ||
| 26667 | + acx_device_t *adev = NULL; | ||
| 26668 | + struct net_device *ndev = NULL; | ||
| 26669 | + const char *chip_name; | ||
| 26670 | + int result = -EIO; | ||
| 26671 | + int err; | ||
| 26672 | + u8 chip_type; | ||
| 26673 | + | ||
| 26674 | + FN_ENTER; | ||
| 26675 | + | ||
| 26676 | + /* Enable the PCI device */ | ||
| 26677 | + if (pci_enable_device(pdev)) { | ||
| 26678 | + printk("acx: pci_enable_device() FAILED\n"); | ||
| 26679 | + result = -ENODEV; | ||
| 26680 | + goto fail_pci_enable_device; | ||
| 26681 | + } | ||
| 26682 | + | ||
| 26683 | + /* enable busmastering (required for CardBus) */ | ||
| 26684 | + pci_set_master(pdev); | ||
| 26685 | + | ||
| 26686 | + /* FIXME: prism54 calls pci_set_mwi() here, | ||
| 26687 | + * should we do/support the same? */ | ||
| 26688 | + | ||
| 26689 | + /* chiptype is u8 but id->driver_data is ulong | ||
| 26690 | + ** Works for now (possible values are 1 and 2) */ | ||
| 26691 | + chip_type = (u8)id->driver_data; | ||
| 26692 | + /* acx100 and acx111 have different PCI memory regions */ | ||
| 26693 | + if (chip_type == CHIPTYPE_ACX100) { | ||
| 26694 | + chip_name = "ACX100"; | ||
| 26695 | + mem_region1 = PCI_ACX100_REGION1; | ||
| 26696 | + mem_region1_size = PCI_ACX100_REGION1_SIZE; | ||
| 26697 | + | ||
| 26698 | + mem_region2 = PCI_ACX100_REGION2; | ||
| 26699 | + mem_region2_size = PCI_ACX100_REGION2_SIZE; | ||
| 26700 | + } else if (chip_type == CHIPTYPE_ACX111) { | ||
| 26701 | + chip_name = "ACX111"; | ||
| 26702 | + mem_region1 = PCI_ACX111_REGION1; | ||
| 26703 | + mem_region1_size = PCI_ACX111_REGION1_SIZE; | ||
| 26704 | + | ||
| 26705 | + mem_region2 = PCI_ACX111_REGION2; | ||
| 26706 | + mem_region2_size = PCI_ACX111_REGION2_SIZE; | ||
| 26707 | + } else { | ||
| 26708 | + printk("acx: unknown chip type 0x%04X\n", chip_type); | ||
| 26709 | + goto fail_unknown_chiptype; | ||
| 26710 | + } | ||
| 26711 | + | ||
| 26712 | + /* Figure out our resources */ | ||
| 26713 | + phymem1 = pci_resource_start(pdev, mem_region1); | ||
| 26714 | + phymem2 = pci_resource_start(pdev, mem_region2); | ||
| 26715 | + if (!request_mem_region(phymem1, pci_resource_len(pdev, mem_region1), "acx_1")) { | ||
| 26716 | + printk("acx: cannot reserve PCI memory region 1 (are you sure " | ||
| 26717 | + "you have CardBus support in kernel?)\n"); | ||
| 26718 | + goto fail_request_mem_region1; | ||
| 26719 | + } | ||
| 26720 | + if (!request_mem_region(phymem2, pci_resource_len(pdev, mem_region2), "acx_2")) { | ||
| 26721 | + printk("acx: cannot reserve PCI memory region 2\n"); | ||
| 26722 | + goto fail_request_mem_region2; | ||
| 26723 | + } | ||
| 26724 | + | ||
| 26725 | + /* this used to be ioremap(), but ioremap_nocache() | ||
| 26726 | + * is much less risky, right? (and slower?) | ||
| 26727 | + * FIXME: we may want to go back to cached variant if it's | ||
| 26728 | + * certain that our code really properly handles | ||
| 26729 | + * cached operation (memory barriers, volatile?, ...) | ||
| 26730 | + * (but always keep this comment here regardless!) | ||
| 26731 | + * Possibly make this a driver config setting? */ | ||
| 26732 | + | ||
| 26733 | + mem1 = ioremap_nocache(phymem1, mem_region1_size); | ||
| 26734 | + if (!mem1) { | ||
| 26735 | + printk("acx: ioremap() FAILED\n"); | ||
| 26736 | + goto fail_ioremap1; | ||
| 26737 | + } | ||
| 26738 | + mem2 = ioremap_nocache(phymem2, mem_region2_size); | ||
| 26739 | + if (!mem2) { | ||
| 26740 | + printk("acx: ioremap() #2 FAILED\n"); | ||
| 26741 | + goto fail_ioremap2; | ||
| 26742 | + } | ||
| 26743 | + | ||
| 26744 | + printk("acx: found %s-based wireless network card at %s, irq:%d, " | ||
| 26745 | + "phymem1:0x%lX, phymem2:0x%lX, mem1:0x%p, mem1_size:%ld, " | ||
| 26746 | + "mem2:0x%p, mem2_size:%ld\n", | ||
| 26747 | + chip_name, pci_name(pdev), pdev->irq, phymem1, phymem2, | ||
| 26748 | + mem1, mem_region1_size, | ||
| 26749 | + mem2, mem_region2_size); | ||
| 26750 | + log(L_ANY, "initial debug setting is 0x%04X\n", acx_debug); | ||
| 26751 | + | ||
| 26752 | + if (0 == pdev->irq) { | ||
| 26753 | + printk("acx: can't use IRQ 0\n"); | ||
| 26754 | + goto fail_irq; | ||
| 26755 | + } | ||
| 26756 | + | ||
| 26757 | + ndev = alloc_netdev(sizeof(*adev), "wlan%d", dummy_netdev_init); | ||
| 26758 | + /* (NB: memsets to 0 entire area) */ | ||
| 26759 | + if (!ndev) { | ||
| 26760 | + printk("acx: no memory for netdevice struct\n"); | ||
| 26761 | + goto fail_alloc_netdev; | ||
| 26762 | + } | ||
| 26763 | + | ||
| 26764 | + ether_setup(ndev); | ||
| 26765 | + ndev->open = &acxpci_e_open; | ||
| 26766 | + ndev->stop = &acxpci_e_close; | ||
| 26767 | + ndev->hard_start_xmit = &acx_i_start_xmit; | ||
| 26768 | + ndev->get_stats = &acx_e_get_stats; | ||
| 26769 | +#if IW_HANDLER_VERSION <= 5 | ||
| 26770 | + ndev->get_wireless_stats = &acx_e_get_wireless_stats; | ||
| 26771 | +#endif | ||
| 26772 | + ndev->wireless_handlers = (struct iw_handler_def *)&acx_ioctl_handler_def; | ||
| 26773 | + ndev->set_multicast_list = &acxpci_i_set_multicast_list; | ||
| 26774 | + ndev->tx_timeout = &acxpci_i_tx_timeout; | ||
| 26775 | + ndev->change_mtu = &acx_e_change_mtu; | ||
| 26776 | + ndev->watchdog_timeo = 4 * HZ; | ||
| 26777 | + ndev->irq = pdev->irq; | ||
| 26778 | + ndev->base_addr = pci_resource_start(pdev, 0); | ||
| 26779 | + | ||
| 26780 | + adev = ndev2adev(ndev); | ||
| 26781 | + spin_lock_init(&adev->lock); /* initial state: unlocked */ | ||
| 26782 | + /* We do not start with downed sem: we want PARANOID_LOCKING to work */ | ||
| 26783 | + sema_init(&adev->sem, 1); /* initial state: 1 (upped) */ | ||
| 26784 | + /* since nobody can see new netdev yet, we can as well | ||
| 26785 | + ** just _presume_ that we're under sem (instead of actually taking it): */ | ||
| 26786 | + /* acx_sem_lock(adev); */ | ||
| 26787 | + adev->pdev = pdev; | ||
| 26788 | + adev->ndev = ndev; | ||
| 26789 | + adev->dev_type = DEVTYPE_PCI; | ||
| 26790 | + adev->chip_type = chip_type; | ||
| 26791 | + adev->chip_name = chip_name; | ||
| 26792 | + adev->io = (CHIPTYPE_ACX100 == chip_type) ? IO_ACX100 : IO_ACX111; | ||
| 26793 | + adev->membase = phymem1; | ||
| 26794 | + adev->iobase = mem1; | ||
| 26795 | + adev->membase2 = phymem2; | ||
| 26796 | + adev->iobase2 = mem2; | ||
| 26797 | + /* to find crashes due to weird driver access | ||
| 26798 | + * to unconfigured interface (ifup) */ | ||
| 26799 | + adev->mgmt_timer.function = (void (*)(unsigned long))0x0000dead; | ||
| 26800 | + | ||
| 26801 | +#ifdef NONESSENTIAL_FEATURES | ||
| 26802 | + acx_show_card_eeprom_id(adev); | ||
| 26803 | +#endif /* NONESSENTIAL_FEATURES */ | ||
| 26804 | + | ||
| 26805 | +#ifdef SET_MODULE_OWNER | ||
| 26806 | + SET_MODULE_OWNER(ndev); | ||
| 26807 | +#endif | ||
| 26808 | + SET_NETDEV_DEV(ndev, &pdev->dev); | ||
| 26809 | + | ||
| 26810 | + log(L_IRQ|L_INIT, "using IRQ %d\n", pdev->irq); | ||
| 26811 | + | ||
| 26812 | + /* need to be able to restore PCI state after a suspend */ | ||
| 26813 | + pci_save_state(pdev); | ||
| 26814 | + pci_set_drvdata(pdev, ndev); | ||
| 26815 | + | ||
| 26816 | + /* ok, pci setup is finished, now start initializing the card */ | ||
| 26817 | + | ||
| 26818 | + /* NB: read_reg() reads may return bogus data before reset_dev(), | ||
| 26819 | + * since the firmware which directly controls large parts of the I/O | ||
| 26820 | + * registers isn't initialized yet. | ||
| 26821 | + * acx100 seems to be more affected than acx111 */ | ||
| 26822 | + if (OK != acxpci_s_reset_dev(adev)) | ||
| 26823 | + goto fail_reset; | ||
| 26824 | + | ||
| 26825 | + if (IS_ACX100(adev)) { | ||
| 26826 | + /* ACX100: configopt struct in cmd mailbox - directly after reset */ | ||
| 26827 | + memcpy_fromio(&co, adev->cmd_area, sizeof(co)); | ||
| 26828 | + } | ||
| 26829 | + | ||
| 26830 | + if (OK != acx_s_init_mac(adev)) | ||
| 26831 | + goto fail_init_mac; | ||
| 26832 | + | ||
| 26833 | + if (IS_ACX111(adev)) { | ||
| 26834 | + /* ACX111: configopt struct needs to be queried after full init */ | ||
| 26835 | + acx_s_interrogate(adev, &co, ACX111_IE_CONFIG_OPTIONS); | ||
| 26836 | + } | ||
| 26837 | + | ||
| 26838 | +/* TODO: merge them into one function, they are called just once and are the same for pci & usb */ | ||
| 26839 | + if (OK != acxpci_read_eeprom_byte(adev, 0x05, &adev->eeprom_version)) | ||
| 26840 | + goto fail_read_eeprom_version; | ||
| 26841 | + | ||
| 26842 | + acx_s_parse_configoption(adev, &co); | ||
| 26843 | + acx_s_set_defaults(adev); | ||
| 26844 | + acx_s_get_firmware_version(adev); /* needs to be after acx_s_init_mac() */ | ||
| 26845 | + acx_display_hardware_details(adev); | ||
| 26846 | + | ||
| 26847 | + /* Register the card, AFTER everything else has been set up, | ||
| 26848 | + * since otherwise an ioctl could step on our feet due to | ||
| 26849 | + * firmware operations happening in parallel or uninitialized data */ | ||
| 26850 | + err = register_netdev(ndev); | ||
| 26851 | + if (OK != err) { | ||
| 26852 | + printk("acx: register_netdev() FAILED: %d\n", err); | ||
| 26853 | + goto fail_register_netdev; | ||
| 26854 | + } | ||
| 26855 | + | ||
| 26856 | + acx_proc_register_entries(ndev); | ||
| 26857 | + | ||
| 26858 | + /* Now we have our device, so make sure the kernel doesn't try | ||
| 26859 | + * to send packets even though we're not associated to a network yet */ | ||
| 26860 | + acx_stop_queue(ndev, "on probe"); | ||
| 26861 | + acx_carrier_off(ndev, "on probe"); | ||
| 26862 | + | ||
| 26863 | + /* after register_netdev() userspace may start working with dev | ||
| 26864 | + * (in particular, on other CPUs), we only need to up the sem */ | ||
| 26865 | + /* acx_sem_unlock(adev); */ | ||
| 26866 | + | ||
| 26867 | + printk("acx "ACX_RELEASE": net device %s, driver compiled " | ||
| 26868 | + "against wireless extensions %d and Linux %s\n", | ||
| 26869 | + ndev->name, WIRELESS_EXT, UTS_RELEASE); | ||
| 26870 | + | ||
| 26871 | +#if CMD_DISCOVERY | ||
| 26872 | + great_inquisitor(adev); | ||
| 26873 | +#endif | ||
| 26874 | + | ||
| 26875 | + result = OK; | ||
| 26876 | + goto done; | ||
| 26877 | + | ||
| 26878 | + /* error paths: undo everything in reverse order... */ | ||
| 26879 | + | ||
| 26880 | +fail_register_netdev: | ||
| 26881 | + | ||
| 26882 | + acxpci_s_delete_dma_regions(adev); | ||
| 26883 | + pci_set_drvdata(pdev, NULL); | ||
| 26884 | + | ||
| 26885 | +fail_init_mac: | ||
| 26886 | +fail_read_eeprom_version: | ||
| 26887 | +fail_reset: | ||
| 26888 | + | ||
| 26889 | + free_netdev(ndev); | ||
| 26890 | +fail_alloc_netdev: | ||
| 26891 | +fail_irq: | ||
| 26892 | + | ||
| 26893 | + iounmap(mem2); | ||
| 26894 | +fail_ioremap2: | ||
| 26895 | + | ||
| 26896 | + iounmap(mem1); | ||
| 26897 | +fail_ioremap1: | ||
| 26898 | + | ||
| 26899 | + release_mem_region(pci_resource_start(pdev, mem_region2), | ||
| 26900 | + pci_resource_len(pdev, mem_region2)); | ||
| 26901 | +fail_request_mem_region2: | ||
| 26902 | + | ||
| 26903 | + release_mem_region(pci_resource_start(pdev, mem_region1), | ||
| 26904 | + pci_resource_len(pdev, mem_region1)); | ||
| 26905 | +fail_request_mem_region1: | ||
| 26906 | +fail_unknown_chiptype: | ||
| 26907 | + | ||
| 26908 | + pci_disable_device(pdev); | ||
| 26909 | +fail_pci_enable_device: | ||
| 26910 | + | ||
| 26911 | + pci_set_power_state(pdev, PCI_D3hot); | ||
| 26912 | + | ||
| 26913 | +done: | ||
| 26914 | + FN_EXIT1(result); | ||
| 26915 | + return result; | ||
| 26916 | +} | ||
| 26917 | + | ||
| 26918 | + | ||
| 26919 | +/*********************************************************************** | ||
| 26920 | +** acxpci_e_remove | ||
| 26921 | +** | ||
| 26922 | +** Shut device down (if not hot unplugged) | ||
| 26923 | +** and deallocate PCI resources for the acx chip. | ||
| 26924 | +** | ||
| 26925 | +** pdev - ptr to PCI device structure containing info about pci configuration | ||
| 26926 | +*/ | ||
| 26927 | +static void __devexit | ||
| 26928 | +acxpci_e_remove(struct pci_dev *pdev) | ||
| 26929 | +{ | ||
| 26930 | + struct net_device *ndev; | ||
| 26931 | + acx_device_t *adev; | ||
| 26932 | + unsigned long mem_region1, mem_region2; | ||
| 26933 | + unsigned long flags; | ||
| 26934 | + | ||
| 26935 | + FN_ENTER; | ||
| 26936 | + | ||
| 26937 | + ndev = (struct net_device*) pci_get_drvdata(pdev); | ||
| 26938 | + if (!ndev) { | ||
| 26939 | + log(L_DEBUG, "%s: card is unused. Skipping any release code\n", | ||
| 26940 | + __func__); | ||
| 26941 | + goto end; | ||
| 26942 | + } | ||
| 26943 | + | ||
| 26944 | + adev = ndev2adev(ndev); | ||
| 26945 | + | ||
| 26946 | + /* If device wasn't hot unplugged... */ | ||
| 26947 | + if (adev_present(adev)) { | ||
| 26948 | + | ||
| 26949 | + acx_sem_lock(adev); | ||
| 26950 | + | ||
| 26951 | + /* disable both Tx and Rx to shut radio down properly */ | ||
| 26952 | + acx_s_issue_cmd(adev, ACX1xx_CMD_DISABLE_TX, NULL, 0); | ||
| 26953 | + acx_s_issue_cmd(adev, ACX1xx_CMD_DISABLE_RX, NULL, 0); | ||
| 26954 | + | ||
| 26955 | +#ifdef REDUNDANT | ||
| 26956 | + /* put the eCPU to sleep to save power | ||
| 26957 | + * Halting is not possible currently, | ||
| 26958 | + * since not supported by all firmware versions */ | ||
| 26959 | + acx_s_issue_cmd(adev, ACX100_CMD_SLEEP, NULL, 0); | ||
| 26960 | +#endif | ||
| 26961 | + acx_lock(adev, flags); | ||
| 26962 | + /* disable power LED to save power :-) */ | ||
| 26963 | + log(L_INIT, "switching off power LED to save power\n"); | ||
| 26964 | + acxpci_l_power_led(adev, 0); | ||
| 26965 | + /* stop our eCPU */ | ||
| 26966 | + if (IS_ACX111(adev)) { | ||
| 26967 | + /* FIXME: does this actually keep halting the eCPU? | ||
| 26968 | + * I don't think so... | ||
| 26969 | + */ | ||
| 26970 | + acxpci_l_reset_mac(adev); | ||
| 26971 | + } else { | ||
| 26972 | + u16 temp; | ||
| 26973 | + /* halt eCPU */ | ||
| 26974 | + temp = read_reg16(adev, IO_ACX_ECPU_CTRL) | 0x1; | ||
| 26975 | + write_reg16(adev, IO_ACX_ECPU_CTRL, temp); | ||
| 26976 | + write_flush(adev); | ||
| 26977 | + } | ||
| 26978 | + acx_unlock(adev, flags); | ||
| 26979 | + | ||
| 26980 | + acx_sem_unlock(adev); | ||
| 26981 | + } | ||
| 26982 | + | ||
| 26983 | + /* unregister the device to not let the kernel | ||
| 26984 | + * (e.g. ioctls) access a half-deconfigured device | ||
| 26985 | + * NB: this will cause acxpci_e_close() to be called, | ||
| 26986 | + * thus we shouldn't call it under sem! */ | ||
| 26987 | + log(L_INIT, "removing device %s\n", ndev->name); | ||
| 26988 | + unregister_netdev(ndev); | ||
| 26989 | + | ||
| 26990 | + /* unregister_netdev ensures that no references to us left. | ||
| 26991 | + * For paranoid reasons we continue to follow the rules */ | ||
| 26992 | + acx_sem_lock(adev); | ||
| 26993 | + | ||
| 26994 | + if (adev->dev_state_mask & ACX_STATE_IFACE_UP) { | ||
| 26995 | + acxpci_s_down(ndev); | ||
| 26996 | + CLEAR_BIT(adev->dev_state_mask, ACX_STATE_IFACE_UP); | ||
| 26997 | + } | ||
| 26998 | + | ||
| 26999 | + acx_proc_unregister_entries(ndev); | ||
| 27000 | + | ||
| 27001 | + if (IS_ACX100(adev)) { | ||
| 27002 | + mem_region1 = PCI_ACX100_REGION1; | ||
| 27003 | + mem_region2 = PCI_ACX100_REGION2; | ||
| 27004 | + } else { | ||
| 27005 | + mem_region1 = PCI_ACX111_REGION1; | ||
| 27006 | + mem_region2 = PCI_ACX111_REGION2; | ||
| 27007 | + } | ||
| 27008 | + | ||
| 27009 | + /* finally, clean up PCI bus state */ | ||
| 27010 | + acxpci_s_delete_dma_regions(adev); | ||
| 27011 | + if (adev->iobase) iounmap(adev->iobase); | ||
| 27012 | + if (adev->iobase2) iounmap(adev->iobase2); | ||
| 27013 | + release_mem_region(pci_resource_start(pdev, mem_region1), | ||
| 27014 | + pci_resource_len(pdev, mem_region1)); | ||
| 27015 | + release_mem_region(pci_resource_start(pdev, mem_region2), | ||
| 27016 | + pci_resource_len(pdev, mem_region2)); | ||
| 27017 | + pci_disable_device(pdev); | ||
| 27018 | + | ||
| 27019 | + /* remove dev registration */ | ||
| 27020 | + pci_set_drvdata(pdev, NULL); | ||
| 27021 | + | ||
| 27022 | + acx_sem_unlock(adev); | ||
| 27023 | + | ||
| 27024 | + /* Free netdev (quite late, | ||
| 27025 | + * since otherwise we might get caught off-guard | ||
| 27026 | + * by a netdev timeout handler execution | ||
| 27027 | + * expecting to see a working dev...) */ | ||
| 27028 | + free_netdev(ndev); | ||
| 27029 | + | ||
| 27030 | + /* put device into ACPI D3 mode (shutdown) */ | ||
| 27031 | + pci_set_power_state(pdev, PCI_D3hot); | ||
| 27032 | + | ||
| 27033 | +end: | ||
| 27034 | + FN_EXIT0; | ||
| 27035 | +} | ||
| 27036 | + | ||
| 27037 | + | ||
| 27038 | +/*********************************************************************** | ||
| 27039 | +** TODO: PM code needs to be fixed / debugged / tested. | ||
| 27040 | +*/ | ||
| 27041 | +#ifdef CONFIG_PM | ||
| 27042 | +static int | ||
| 27043 | +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 11) | ||
| 27044 | +acxpci_e_suspend(struct pci_dev *pdev, pm_message_t state) | ||
| 27045 | +#else | ||
| 27046 | +acxpci_e_suspend(struct pci_dev *pdev, u32 state) | ||
| 27047 | +#endif | ||
| 27048 | +{ | ||
| 27049 | + struct net_device *ndev = pci_get_drvdata(pdev); | ||
| 27050 | + acx_device_t *adev; | ||
| 27051 | + | ||
| 27052 | + FN_ENTER; | ||
| 27053 | + printk("acx: suspend handler is experimental!\n"); | ||
| 27054 | + printk("sus: dev %p\n", ndev); | ||
| 27055 | + | ||
| 27056 | + if (!netif_running(ndev)) | ||
| 27057 | + goto end; | ||
| 27058 | + | ||
| 27059 | + adev = ndev2adev(ndev); | ||
| 27060 | + printk("sus: adev %p\n", adev); | ||
| 27061 | + | ||
| 27062 | + acx_sem_lock(adev); | ||
| 27063 | + | ||
| 27064 | + netif_device_detach(ndev); /* this one cannot sleep */ | ||
| 27065 | + acxpci_s_down(ndev); | ||
| 27066 | + /* down() does not set it to 0xffff, but here we really want that */ | ||
| 27067 | + write_reg16(adev, IO_ACX_IRQ_MASK, 0xffff); | ||
| 27068 | + write_reg16(adev, IO_ACX_FEMR, 0x0); | ||
| 27069 | + acxpci_s_delete_dma_regions(adev); | ||
| 27070 | + pci_save_state(pdev); | ||
| 27071 | + pci_set_power_state(pdev, PCI_D3hot); | ||
| 27072 | + | ||
| 27073 | + acx_sem_unlock(adev); | ||
| 27074 | +end: | ||
| 27075 | + FN_EXIT0; | ||
| 27076 | + return OK; | ||
| 27077 | +} | ||
| 27078 | + | ||
| 27079 | + | ||
| 27080 | +static int | ||
| 27081 | +acxpci_e_resume(struct pci_dev *pdev) | ||
| 27082 | +{ | ||
| 27083 | + struct net_device *ndev = pci_get_drvdata(pdev); | ||
| 27084 | + acx_device_t *adev; | ||
| 27085 | + | ||
| 27086 | + FN_ENTER; | ||
| 27087 | + | ||
| 27088 | + printk("acx: resume handler is experimental!\n"); | ||
| 27089 | + printk("rsm: got dev %p\n", ndev); | ||
| 27090 | + | ||
| 27091 | + if (!netif_running(ndev)) | ||
| 27092 | + goto end; | ||
| 27093 | + | ||
| 27094 | + adev = ndev2adev(ndev); | ||
| 27095 | + printk("rsm: got adev %p\n", adev); | ||
| 27096 | + | ||
| 27097 | + acx_sem_lock(adev); | ||
| 27098 | + | ||
| 27099 | + pci_set_power_state(pdev, PCI_D0); | ||
| 27100 | + printk("rsm: power state PCI_D0 set\n"); | ||
| 27101 | + pci_restore_state(pdev); | ||
| 27102 | + printk("rsm: PCI state restored\n"); | ||
| 27103 | + | ||
| 27104 | + if (OK != acxpci_s_reset_dev(adev)) | ||
| 27105 | + goto end_unlock; | ||
| 27106 | + printk("rsm: device reset done\n"); | ||
| 27107 | + if (OK != acx_s_init_mac(adev)) | ||
| 27108 | + goto end_unlock; | ||
| 27109 | + printk("rsm: init MAC done\n"); | ||
| 27110 | + | ||
| 27111 | + acxpci_s_up(ndev); | ||
| 27112 | + printk("rsm: acx up done\n"); | ||
| 27113 | + | ||
| 27114 | + /* now even reload all card parameters as they were before suspend, | ||
| 27115 | + * and possibly be back in the network again already :-) */ | ||
| 27116 | + if (ACX_STATE_IFACE_UP & adev->dev_state_mask) { | ||
| 27117 | + adev->set_mask = GETSET_ALL; | ||
| 27118 | + acx_s_update_card_settings(adev); | ||
| 27119 | + printk("rsm: settings updated\n"); | ||
| 27120 | + } | ||
| 27121 | + netif_device_attach(ndev); | ||
| 27122 | + printk("rsm: device attached\n"); | ||
| 27123 | + | ||
| 27124 | +end_unlock: | ||
| 27125 | + acx_sem_unlock(adev); | ||
| 27126 | +end: | ||
| 27127 | + /* we need to return OK here anyway, right? */ | ||
| 27128 | + FN_EXIT0; | ||
| 27129 | + return OK; | ||
| 27130 | +} | ||
| 27131 | +#endif /* CONFIG_PM */ | ||
| 27132 | + | ||
| 27133 | + | ||
| 27134 | +/*********************************************************************** | ||
| 27135 | +** acxpci_s_up | ||
| 27136 | +** | ||
| 27137 | +** This function is called by acxpci_e_open (when ifconfig sets the device as up) | ||
| 27138 | +** | ||
| 27139 | +** Side effects: | ||
| 27140 | +** - Enables on-card interrupt requests | ||
| 27141 | +** - calls acx_s_start | ||
| 27142 | +*/ | ||
| 27143 | + | ||
| 27144 | +static void | ||
| 27145 | +enable_acx_irq(acx_device_t *adev) | ||
| 27146 | +{ | ||
| 27147 | + FN_ENTER; | ||
| 27148 | + write_reg16(adev, IO_ACX_IRQ_MASK, adev->irq_mask); | ||
| 27149 | + write_reg16(adev, IO_ACX_FEMR, 0x8000); | ||
| 27150 | + adev->irqs_active = 1; | ||
| 27151 | + FN_EXIT0; | ||
| 27152 | +} | ||
| 27153 | + | ||
| 27154 | +static void | ||
| 27155 | +acxpci_s_up(struct net_device *ndev) | ||
| 27156 | +{ | ||
| 27157 | + acx_device_t *adev = ndev2adev(ndev); | ||
| 27158 | + unsigned long flags; | ||
| 27159 | + | ||
| 27160 | + FN_ENTER; | ||
| 27161 | + | ||
| 27162 | + acx_lock(adev, flags); | ||
| 27163 | + enable_acx_irq(adev); | ||
| 27164 | + acx_unlock(adev, flags); | ||
| 27165 | + | ||
| 27166 | + /* acx fw < 1.9.3.e has a hardware timer, and older drivers | ||
| 27167 | + ** used to use it. But we don't do that anymore, our OS | ||
| 27168 | + ** has reliable software timers */ | ||
| 27169 | + init_timer(&adev->mgmt_timer); | ||
| 27170 | + adev->mgmt_timer.function = acx_i_timer; | ||
| 27171 | + adev->mgmt_timer.data = (unsigned long)adev; | ||
| 27172 | + | ||
| 27173 | + /* Need to set ACX_STATE_IFACE_UP first, or else | ||
| 27174 | + ** timer won't be started by acx_set_status() */ | ||
| 27175 | + SET_BIT(adev->dev_state_mask, ACX_STATE_IFACE_UP); | ||
| 27176 | + switch (adev->mode) { | ||
| 27177 | + case ACX_MODE_0_ADHOC: | ||
| 27178 | + case ACX_MODE_2_STA: | ||
| 27179 | + /* actual scan cmd will happen in start() */ | ||
| 27180 | + acx_set_status(adev, ACX_STATUS_1_SCANNING); break; | ||
| 27181 | + case ACX_MODE_3_AP: | ||
| 27182 | + case ACX_MODE_MONITOR: | ||
| 27183 | + acx_set_status(adev, ACX_STATUS_4_ASSOCIATED); break; | ||
| 27184 | + } | ||
| 27185 | + | ||
| 27186 | + acx_s_start(adev); | ||
| 27187 | + | ||
| 27188 | + FN_EXIT0; | ||
| 27189 | +} | ||
| 27190 | + | ||
| 27191 | + | ||
| 27192 | +/*********************************************************************** | ||
| 27193 | +** acxpci_s_down | ||
| 27194 | +** | ||
| 27195 | +** NB: device may be already hot unplugged if called from acxpci_e_remove() | ||
| 27196 | +** | ||
| 27197 | +** Disables on-card interrupt request, stops softirq and timer, stops queue, | ||
| 27198 | +** sets status == STOPPED | ||
| 27199 | +*/ | ||
| 27200 | + | ||
| 27201 | +static void | ||
| 27202 | +disable_acx_irq(acx_device_t *adev) | ||
| 27203 | +{ | ||
| 27204 | + FN_ENTER; | ||
| 27205 | + | ||
| 27206 | + /* I guess mask is not 0xffff because acx100 won't signal | ||
| 27207 | + ** cmd completion then (needed for ifup). | ||
| 27208 | + ** Someone with acx100 please confirm */ | ||
| 27209 | + write_reg16(adev, IO_ACX_IRQ_MASK, adev->irq_mask_off); | ||
| 27210 | + write_reg16(adev, IO_ACX_FEMR, 0x0); | ||
| 27211 | + adev->irqs_active = 0; | ||
| 27212 | + FN_EXIT0; | ||
| 27213 | +} | ||
| 27214 | + | ||
| 27215 | +static void | ||
| 27216 | +acxpci_s_down(struct net_device *ndev) | ||
| 27217 | +{ | ||
| 27218 | + acx_device_t *adev = ndev2adev(ndev); | ||
| 27219 | + unsigned long flags; | ||
| 27220 | + | ||
| 27221 | + FN_ENTER; | ||
| 27222 | + | ||
| 27223 | + /* Disable IRQs first, so that IRQs cannot race with us */ | ||
| 27224 | + /* then wait until interrupts have finished executing on other CPUs */ | ||
| 27225 | + acx_lock(adev, flags); | ||
| 27226 | + disable_acx_irq(adev); | ||
| 27227 | + synchronize_irq(adev->pdev->irq); | ||
| 27228 | + acx_unlock(adev, flags); | ||
| 27229 | + | ||
| 27230 | + /* we really don't want to have an asynchronous tasklet disturb us | ||
| 27231 | + ** after something vital for its job has been shut down, so | ||
| 27232 | + ** end all remaining work now. | ||
| 27233 | + ** | ||
| 27234 | + ** NB: carrier_off (done by set_status below) would lead to | ||
| 27235 | + ** not yet fully understood deadlock in FLUSH_SCHEDULED_WORK(). | ||
| 27236 | + ** That's why we do FLUSH first. | ||
| 27237 | + ** | ||
| 27238 | + ** NB2: we have a bad locking bug here: FLUSH_SCHEDULED_WORK() | ||
| 27239 | + ** waits for acx_e_after_interrupt_task to complete if it is running | ||
| 27240 | + ** on another CPU, but acx_e_after_interrupt_task | ||
| 27241 | + ** will sleep on sem forever, because it is taken by us! | ||
| 27242 | + ** Work around that by temporary sem unlock. | ||
| 27243 | + ** This will fail miserably if we'll be hit by concurrent | ||
| 27244 | + ** iwconfig or something in between. TODO! */ | ||
| 27245 | + acx_sem_unlock(adev); | ||
| 27246 | + FLUSH_SCHEDULED_WORK(); | ||
| 27247 | + acx_sem_lock(adev); | ||
| 27248 | + | ||
| 27249 | + /* This is possible: | ||
| 27250 | + ** FLUSH_SCHEDULED_WORK -> acx_e_after_interrupt_task -> | ||
| 27251 | + ** -> set_status(ASSOCIATED) -> wake_queue() | ||
| 27252 | + ** That's why we stop queue _after_ FLUSH_SCHEDULED_WORK | ||
| 27253 | + ** lock/unlock is just paranoia, maybe not needed */ | ||
| 27254 | + acx_lock(adev, flags); | ||
| 27255 | + acx_stop_queue(ndev, "on ifdown"); | ||
| 27256 | + acx_set_status(adev, ACX_STATUS_0_STOPPED); | ||
| 27257 | + acx_unlock(adev, flags); | ||
| 27258 | + | ||
| 27259 | + /* kernel/timer.c says it's illegal to del_timer_sync() | ||
| 27260 | + ** a timer which restarts itself. We guarantee this cannot | ||
| 27261 | + ** ever happen because acx_i_timer() never does this if | ||
| 27262 | + ** status is ACX_STATUS_0_STOPPED */ | ||
| 27263 | + del_timer_sync(&adev->mgmt_timer); | ||
| 27264 | + | ||
| 27265 | + FN_EXIT0; | ||
| 27266 | +} | ||
| 27267 | + | ||
| 27268 | + | ||
| 27269 | +/*********************************************************************** | ||
| 27270 | +** acxpci_e_open | ||
| 27271 | +** | ||
| 27272 | +** Called as a result of SIOCSIFFLAGS ioctl changing the flags bit IFF_UP | ||
| 27273 | +** from clear to set. In other words: ifconfig up. | ||
| 27274 | +** | ||
| 27275 | +** Returns: | ||
| 27276 | +** 0 success | ||
| 27277 | +** >0 f/w reported error | ||
| 27278 | +** <0 driver reported error | ||
| 27279 | +*/ | ||
| 27280 | +static int | ||
| 27281 | +acxpci_e_open(struct net_device *ndev) | ||
| 27282 | +{ | ||
| 27283 | + acx_device_t *adev = ndev2adev(ndev); | ||
| 27284 | + int result = OK; | ||
| 27285 | + | ||
| 27286 | + FN_ENTER; | ||
| 27287 | + | ||
| 27288 | + acx_sem_lock(adev); | ||
| 27289 | + | ||
| 27290 | + acx_init_task_scheduler(adev); | ||
| 27291 | + | ||
| 27292 | +/* TODO: pci_set_power_state(pdev, PCI_D0); ? */ | ||
| 27293 | + | ||
| 27294 | + /* request shared IRQ handler */ | ||
| 27295 | + if (request_irq(ndev->irq, acxpci_i_interrupt, SA_SHIRQ, ndev->name, ndev)) { | ||
| 27296 | + printk("%s: request_irq FAILED\n", ndev->name); | ||
| 27297 | + result = -EAGAIN; | ||
| 27298 | + goto done; | ||
| 27299 | + } | ||
| 27300 | + log(L_DEBUG|L_IRQ, "request_irq %d successful\n", ndev->irq); | ||
| 27301 | + | ||
| 27302 | + /* ifup device */ | ||
| 27303 | + acxpci_s_up(ndev); | ||
| 27304 | + | ||
| 27305 | + /* We don't currently have to do anything else. | ||
| 27306 | + * The setup of the MAC should be subsequently completed via | ||
| 27307 | + * the mlme commands. | ||
| 27308 | + * Higher layers know we're ready from dev->start==1 and | ||
| 27309 | + * dev->tbusy==0. Our rx path knows to pass up received/ | ||
| 27310 | + * frames because of dev->flags&IFF_UP is true. | ||
| 27311 | + */ | ||
| 27312 | +done: | ||
| 27313 | + acx_sem_unlock(adev); | ||
| 27314 | + | ||
| 27315 | + FN_EXIT1(result); | ||
| 27316 | + return result; | ||
| 27317 | +} | ||
| 27318 | + | ||
| 27319 | + | ||
| 27320 | +/*********************************************************************** | ||
| 27321 | +** acxpci_e_close | ||
| 27322 | +** | ||
| 27323 | +** Called as a result of SIOCSIIFFLAGS ioctl changing the flags bit IFF_UP | ||
| 27324 | +** from set to clear. I.e. called by "ifconfig DEV down" | ||
| 27325 | +** | ||
| 27326 | +** Returns: | ||
| 27327 | +** 0 success | ||
| 27328 | +** >0 f/w reported error | ||
| 27329 | +** <0 driver reported error | ||
| 27330 | +*/ | ||
| 27331 | +static int | ||
| 27332 | +acxpci_e_close(struct net_device *ndev) | ||
| 27333 | +{ | ||
| 27334 | + acx_device_t *adev = ndev2adev(ndev); | ||
| 27335 | + | ||
| 27336 | + FN_ENTER; | ||
| 27337 | + | ||
| 27338 | + acx_sem_lock(adev); | ||
| 27339 | + | ||
| 27340 | + /* ifdown device */ | ||
| 27341 | + CLEAR_BIT(adev->dev_state_mask, ACX_STATE_IFACE_UP); | ||
| 27342 | + if (netif_device_present(ndev)) { | ||
| 27343 | + acxpci_s_down(ndev); | ||
| 27344 | + } | ||
| 27345 | + | ||
| 27346 | + /* disable all IRQs, release shared IRQ handler */ | ||
| 27347 | + write_reg16(adev, IO_ACX_IRQ_MASK, 0xffff); | ||
| 27348 | + write_reg16(adev, IO_ACX_FEMR, 0x0); | ||
| 27349 | + free_irq(ndev->irq, ndev); | ||
| 27350 | + | ||
| 27351 | +/* TODO: pci_set_power_state(pdev, PCI_D3hot); ? */ | ||
| 27352 | + | ||
| 27353 | + /* We currently don't have to do anything else. | ||
| 27354 | + * Higher layers know we're not ready from dev->start==0 and | ||
| 27355 | + * dev->tbusy==1. Our rx path knows to not pass up received | ||
| 27356 | + * frames because of dev->flags&IFF_UP is false. | ||
| 27357 | + */ | ||
| 27358 | + acx_sem_unlock(adev); | ||
| 27359 | + | ||
| 27360 | + log(L_INIT, "closed device\n"); | ||
| 27361 | + FN_EXIT0; | ||
| 27362 | + return OK; | ||
| 27363 | +} | ||
| 27364 | + | ||
| 27365 | + | ||
| 27366 | +/*********************************************************************** | ||
| 27367 | +** acxpci_i_tx_timeout | ||
| 27368 | +** | ||
| 27369 | +** Called from network core. Must not sleep! | ||
| 27370 | +*/ | ||
| 27371 | +static void | ||
| 27372 | +acxpci_i_tx_timeout(struct net_device *ndev) | ||
| 27373 | +{ | ||
| 27374 | + acx_device_t *adev = ndev2adev(ndev); | ||
| 27375 | + unsigned long flags; | ||
| 27376 | + unsigned int tx_num_cleaned; | ||
| 27377 | + | ||
| 27378 | + FN_ENTER; | ||
| 27379 | + | ||
| 27380 | + acx_lock(adev, flags); | ||
| 27381 | + | ||
| 27382 | + /* clean processed tx descs, they may have been completely full */ | ||
| 27383 | + tx_num_cleaned = acxpci_l_clean_txdesc(adev); | ||
| 27384 | + | ||
| 27385 | + /* nothing cleaned, yet (almost) no free buffers available? | ||
| 27386 | + * --> clean all tx descs, no matter which status!! | ||
| 27387 | + * Note that I strongly suspect that doing emergency cleaning | ||
| 27388 | + * may confuse the firmware. This is a last ditch effort to get | ||
| 27389 | + * ANYTHING to work again... | ||
| 27390 | + * | ||
| 27391 | + * TODO: it's best to simply reset & reinit hw from scratch... | ||
| 27392 | + */ | ||
| 27393 | + if ((adev->tx_free <= TX_EMERG_CLEAN) && (tx_num_cleaned == 0)) { | ||
| 27394 | + printk("%s: FAILED to free any of the many full tx buffers. " | ||
| 27395 | + "Switching to emergency freeing. " | ||
| 27396 | + "Please report!\n", ndev->name); | ||
| 27397 | + acxpci_l_clean_txdesc_emergency(adev); | ||
| 27398 | + } | ||
| 27399 | + | ||
| 27400 | + if (acx_queue_stopped(ndev) && (ACX_STATUS_4_ASSOCIATED == adev->status)) | ||
| 27401 | + acx_wake_queue(ndev, "after tx timeout"); | ||
| 27402 | + | ||
| 27403 | + /* stall may have happened due to radio drift, so recalib radio */ | ||
| 27404 | + acx_schedule_task(adev, ACX_AFTER_IRQ_CMD_RADIO_RECALIB); | ||
| 27405 | + | ||
| 27406 | + /* do unimportant work last */ | ||
| 27407 | + printk("%s: tx timeout!\n", ndev->name); | ||
| 27408 | + adev->stats.tx_errors++; | ||
| 27409 | + | ||
| 27410 | + acx_unlock(adev, flags); | ||
| 27411 | + | ||
| 27412 | + FN_EXIT0; | ||
| 27413 | +} | ||
| 27414 | + | ||
| 27415 | + | ||
| 27416 | +/*********************************************************************** | ||
| 27417 | +** acxpci_i_set_multicast_list | ||
| 27418 | +** FIXME: most likely needs refinement | ||
| 27419 | +*/ | ||
| 27420 | +static void | ||
| 27421 | +acxpci_i_set_multicast_list(struct net_device *ndev) | ||
| 27422 | +{ | ||
| 27423 | + acx_device_t *adev = ndev2adev(ndev); | ||
| 27424 | + unsigned long flags; | ||
| 27425 | + | ||
| 27426 | + FN_ENTER; | ||
| 27427 | + | ||
| 27428 | + acx_lock(adev, flags); | ||
| 27429 | + | ||
| 27430 | + /* firmwares don't have allmulti capability, | ||
| 27431 | + * so just use promiscuous mode instead in this case. */ | ||
| 27432 | + if (ndev->flags & (IFF_PROMISC|IFF_ALLMULTI)) { | ||
| 27433 | + SET_BIT(adev->rx_config_1, RX_CFG1_RCV_PROMISCUOUS); | ||
| 27434 | + CLEAR_BIT(adev->rx_config_1, RX_CFG1_FILTER_ALL_MULTI); | ||
| 27435 | + SET_BIT(adev->set_mask, SET_RXCONFIG); | ||
| 27436 | + /* let kernel know in case *we* needed to set promiscuous */ | ||
| 27437 | + ndev->flags |= (IFF_PROMISC|IFF_ALLMULTI); | ||
| 27438 | + } else { | ||
| 27439 | + CLEAR_BIT(adev->rx_config_1, RX_CFG1_RCV_PROMISCUOUS); | ||
| 27440 | + SET_BIT(adev->rx_config_1, RX_CFG1_FILTER_ALL_MULTI); | ||
| 27441 | + SET_BIT(adev->set_mask, SET_RXCONFIG); | ||
| 27442 | + ndev->flags &= ~(IFF_PROMISC|IFF_ALLMULTI); | ||
| 27443 | + } | ||
| 27444 | + | ||
| 27445 | + /* cannot update card settings directly here, atomic context */ | ||
| 27446 | + acx_schedule_task(adev, ACX_AFTER_IRQ_UPDATE_CARD_CFG); | ||
| 27447 | + | ||
| 27448 | + acx_unlock(adev, flags); | ||
| 27449 | + | ||
| 27450 | + FN_EXIT0; | ||
| 27451 | +} | ||
| 27452 | + | ||
| 27453 | + | ||
| 27454 | +/*************************************************************** | ||
| 27455 | +** acxpci_l_process_rxdesc | ||
| 27456 | +** | ||
| 27457 | +** Called directly and only from the IRQ handler | ||
| 27458 | +*/ | ||
| 27459 | + | ||
| 27460 | +#if !ACX_DEBUG | ||
| 27461 | +static inline void log_rxbuffer(const acx_device_t *adev) {} | ||
| 27462 | +#else | ||
| 27463 | +static void | ||
| 27464 | +log_rxbuffer(const acx_device_t *adev) | ||
| 27465 | +{ | ||
| 27466 | + register const struct rxhostdesc *rxhostdesc; | ||
| 27467 | + int i; | ||
| 27468 | + /* no FN_ENTER here, we don't want that */ | ||
| 27469 | + | ||
| 27470 | + rxhostdesc = adev->rxhostdesc_start; | ||
| 27471 | + if (unlikely(!rxhostdesc)) return; | ||
| 27472 | + for (i = 0; i < RX_CNT; i++) { | ||
| 27473 | + if ((rxhostdesc->Ctl_16 & cpu_to_le16(DESC_CTL_HOSTOWN)) | ||
| 27474 | + && (rxhostdesc->Status & cpu_to_le32(DESC_STATUS_FULL))) | ||
| 27475 | + printk("rx: buf %d full\n", i); | ||
| 27476 | + rxhostdesc++; | ||
| 27477 | + } | ||
| 27478 | +} | ||
| 27479 | +#endif | ||
| 27480 | + | ||
| 27481 | +static void | ||
| 27482 | +acxpci_l_process_rxdesc(acx_device_t *adev) | ||
| 27483 | +{ | ||
| 27484 | + register rxhostdesc_t *hostdesc; | ||
| 27485 | + unsigned count, tail; | ||
| 27486 | + | ||
| 27487 | + FN_ENTER; | ||
| 27488 | + | ||
| 27489 | + if (unlikely(acx_debug & L_BUFR)) | ||
| 27490 | + log_rxbuffer(adev); | ||
| 27491 | + | ||
| 27492 | + /* First, have a loop to determine the first descriptor that's | ||
| 27493 | + * full, just in case there's a mismatch between our current | ||
| 27494 | + * rx_tail and the full descriptor we're supposed to handle. */ | ||
| 27495 | + tail = adev->rx_tail; | ||
| 27496 | + count = RX_CNT; | ||
| 27497 | + while (1) { | ||
| 27498 | + hostdesc = &adev->rxhostdesc_start[tail]; | ||
| 27499 | + /* advance tail regardless of outcome of the below test */ | ||
| 27500 | + tail = (tail + 1) % RX_CNT; | ||
| 27501 | + | ||
| 27502 | + if ((hostdesc->Ctl_16 & cpu_to_le16(DESC_CTL_HOSTOWN)) | ||
| 27503 | + && (hostdesc->Status & cpu_to_le32(DESC_STATUS_FULL))) | ||
| 27504 | + break; /* found it! */ | ||
| 27505 | + | ||
| 27506 | + if (unlikely(!--count)) /* hmm, no luck: all descs empty, bail out */ | ||
| 27507 | + goto end; | ||
| 27508 | + } | ||
| 27509 | + | ||
| 27510 | + /* now process descriptors, starting with the first we figured out */ | ||
| 27511 | + while (1) { | ||
| 27512 | + log(L_BUFR, "rx: tail=%u Ctl_16=%04X Status=%08X\n", | ||
| 27513 | + tail, hostdesc->Ctl_16, hostdesc->Status); | ||
| 27514 | + | ||
| 27515 | + acx_l_process_rxbuf(adev, hostdesc->data); | ||
| 27516 | + | ||
| 27517 | + hostdesc->Status = 0; | ||
| 27518 | + /* flush all writes before adapter sees CTL_HOSTOWN change */ | ||
| 27519 | + wmb(); | ||
| 27520 | + /* Host no longer owns this, needs to be LAST */ | ||
| 27521 | + CLEAR_BIT(hostdesc->Ctl_16, cpu_to_le16(DESC_CTL_HOSTOWN)); | ||
| 27522 | + | ||
| 27523 | + /* ok, descriptor is handled, now check the next descriptor */ | ||
| 27524 | + hostdesc = &adev->rxhostdesc_start[tail]; | ||
| 27525 | + | ||
| 27526 | + /* if next descriptor is empty, then bail out */ | ||
| 27527 | + if (!(hostdesc->Ctl_16 & cpu_to_le16(DESC_CTL_HOSTOWN)) | ||
| 27528 | + || !(hostdesc->Status & cpu_to_le32(DESC_STATUS_FULL))) | ||
| 27529 | + break; | ||
| 27530 | + | ||
| 27531 | + tail = (tail + 1) % RX_CNT; | ||
| 27532 | + } | ||
| 27533 | +end: | ||
| 27534 | + adev->rx_tail = tail; | ||
| 27535 | + FN_EXIT0; | ||
| 27536 | +} | ||
| 27537 | + | ||
| 27538 | + | ||
| 27539 | +/*********************************************************************** | ||
| 27540 | +** acxpci_i_interrupt | ||
| 27541 | +** | ||
| 27542 | +** IRQ handler (atomic context, must not sleep, blah, blah) | ||
| 27543 | +*/ | ||
| 27544 | + | ||
| 27545 | +/* scan is complete. all frames now on the receive queue are valid */ | ||
| 27546 | +#define INFO_SCAN_COMPLETE 0x0001 | ||
| 27547 | +#define INFO_WEP_KEY_NOT_FOUND 0x0002 | ||
| 27548 | +/* hw has been reset as the result of a watchdog timer timeout */ | ||
| 27549 | +#define INFO_WATCH_DOG_RESET 0x0003 | ||
| 27550 | +/* failed to send out NULL frame from PS mode notification to AP */ | ||
| 27551 | +/* recommended action: try entering 802.11 PS mode again */ | ||
| 27552 | +#define INFO_PS_FAIL 0x0004 | ||
| 27553 | +/* encryption/decryption process on a packet failed */ | ||
| 27554 | +#define INFO_IV_ICV_FAILURE 0x0005 | ||
| 27555 | + | ||
| 27556 | +/* Info mailbox format: | ||
| 27557 | +2 bytes: type | ||
| 27558 | +2 bytes: status | ||
| 27559 | +more bytes may follow | ||
| 27560 | + rumors say about status: | ||
| 27561 | + 0x0000 info available (set by hw) | ||
| 27562 | + 0x0001 information received (must be set by host) | ||
| 27563 | + 0x1000 info available, mailbox overflowed (messages lost) (set by hw) | ||
| 27564 | + but in practice we've seen: | ||
| 27565 | + 0x9000 when we did not set status to 0x0001 on prev message | ||
| 27566 | + 0x1001 when we did set it | ||
| 27567 | + 0x0000 was never seen | ||
| 27568 | + conclusion: this is really a bitfield: | ||
| 27569 | + 0x1000 is 'info available' bit | ||
| 27570 | + 'mailbox overflowed' bit is 0x8000, not 0x1000 | ||
| 27571 | + value of 0x0000 probably means that there are no messages at all | ||
| 27572 | + P.S. I dunno how in hell hw is supposed to notice that messages are lost - | ||
| 27573 | + it does NOT clear bit 0x0001, and this bit will probably stay forever set | ||
| 27574 | + after we set it once. Let's hope this will be fixed in firmware someday | ||
| 27575 | +*/ | ||
| 27576 | + | ||
| 27577 | +static void | ||
| 27578 | +handle_info_irq(acx_device_t *adev) | ||
| 27579 | +{ | ||
| 27580 | +#if ACX_DEBUG | ||
| 27581 | + static const char * const info_type_msg[] = { | ||
| 27582 | + "(unknown)", | ||
| 27583 | + "scan complete", | ||
| 27584 | + "WEP key not found", | ||
| 27585 | + "internal watchdog reset was done", | ||
| 27586 | + "failed to send powersave (NULL frame) notification to AP", | ||
| 27587 | + "encrypt/decrypt on a packet has failed", | ||
| 27588 | + "TKIP tx keys disabled", | ||
| 27589 | + "TKIP rx keys disabled", | ||
| 27590 | + "TKIP rx: key ID not found", | ||
| 27591 | + "???", | ||
| 27592 | + "???", | ||
| 27593 | + "???", | ||
| 27594 | + "???", | ||
| 27595 | + "???", | ||
| 27596 | + "???", | ||
| 27597 | + "???", | ||
| 27598 | + "TKIP IV value exceeds thresh" | ||
| 27599 | + }; | ||
| 27600 | +#endif | ||
| 27601 | + u32 info_type, info_status; | ||
| 27602 | + | ||
| 27603 | + info_type = readl(adev->info_area); | ||
| 27604 | + info_status = (info_type >> 16); | ||
| 27605 | + info_type = (u16)info_type; | ||
| 27606 | + | ||
| 27607 | + /* inform fw that we have read this info message */ | ||
| 27608 | + writel(info_type | 0x00010000, adev->info_area); | ||
| 27609 | + write_reg16(adev, IO_ACX_INT_TRIG, INT_TRIG_INFOACK); | ||
| 27610 | + write_flush(adev); | ||
| 27611 | + | ||
| 27612 | + log(L_CTL, "info_type:%04X info_status:%04X\n", | ||
| 27613 | + info_type, info_status); | ||
| 27614 | + | ||
| 27615 | + log(L_IRQ, "got Info IRQ: status %04X type %04X: %s\n", | ||
| 27616 | + info_status, info_type, | ||
| 27617 | + info_type_msg[(info_type >= VEC_SIZE(info_type_msg)) ? | ||
| 27618 | + 0 : info_type] | ||
| 27619 | + ); | ||
| 27620 | +} | ||
| 27621 | + | ||
| 27622 | + | ||
| 27623 | +static void | ||
| 27624 | +log_unusual_irq(u16 irqtype) { | ||
| 27625 | + /* | ||
| 27626 | + if (!printk_ratelimit()) | ||
| 27627 | + return; | ||
| 27628 | + */ | ||
| 27629 | + | ||
| 27630 | + printk("acx: got"); | ||
| 27631 | + if (irqtype & HOST_INT_RX_DATA) { | ||
| 27632 | + printk(" Rx_Data"); | ||
| 27633 | + } | ||
| 27634 | + /* HOST_INT_TX_COMPLETE */ | ||
| 27635 | + if (irqtype & HOST_INT_TX_XFER) { | ||
| 27636 | + printk(" Tx_Xfer"); | ||
| 27637 | + } | ||
| 27638 | + /* HOST_INT_RX_COMPLETE */ | ||
| 27639 | + if (irqtype & HOST_INT_DTIM) { | ||
| 27640 | + printk(" DTIM"); | ||
| 27641 | + } | ||
| 27642 | + if (irqtype & HOST_INT_BEACON) { | ||
| 27643 | + printk(" Beacon"); | ||
| 27644 | + } | ||
| 27645 | + if (irqtype & HOST_INT_TIMER) { | ||
| 27646 | + log(L_IRQ, " Timer"); | ||
| 27647 | + } | ||
| 27648 | + if (irqtype & HOST_INT_KEY_NOT_FOUND) { | ||
| 27649 | + printk(" Key_Not_Found"); | ||
| 27650 | + } | ||
| 27651 | + if (irqtype & HOST_INT_IV_ICV_FAILURE) { | ||
| 27652 | + printk(" IV_ICV_Failure (crypto)"); | ||
| 27653 | + } | ||
| 27654 | + /* HOST_INT_CMD_COMPLETE */ | ||
| 27655 | + /* HOST_INT_INFO */ | ||
| 27656 | + if (irqtype & HOST_INT_OVERFLOW) { | ||
| 27657 | + printk(" Overflow"); | ||
| 27658 | + } | ||
| 27659 | + if (irqtype & HOST_INT_PROCESS_ERROR) { | ||
| 27660 | + printk(" Process_Error"); | ||
| 27661 | + } | ||
| 27662 | + /* HOST_INT_SCAN_COMPLETE */ | ||
| 27663 | + if (irqtype & HOST_INT_FCS_THRESHOLD) { | ||
| 27664 | + printk(" FCS_Threshold"); | ||
| 27665 | + } | ||
| 27666 | + if (irqtype & HOST_INT_UNKNOWN) { | ||
| 27667 | + printk(" Unknown"); | ||
| 27668 | + } | ||
| 27669 | + printk(" IRQ(s)\n"); | ||
| 27670 | +} | ||
| 27671 | + | ||
| 27672 | + | ||
| 27673 | +static void | ||
| 27674 | +update_link_quality_led(acx_device_t *adev) | ||
| 27675 | +{ | ||
| 27676 | + int qual; | ||
| 27677 | + | ||
| 27678 | + qual = acx_signal_determine_quality(adev->wstats.qual.level, adev->wstats.qual.noise); | ||
| 27679 | + if (qual > adev->brange_max_quality) | ||
| 27680 | + qual = adev->brange_max_quality; | ||
| 27681 | + | ||
| 27682 | + if (time_after(jiffies, adev->brange_time_last_state_change + | ||
| 27683 | + (HZ/2 - HZ/2 * (unsigned long)qual / adev->brange_max_quality ) )) { | ||
| 27684 | + acxpci_l_power_led(adev, (adev->brange_last_state == 0)); | ||
| 27685 | + adev->brange_last_state ^= 1; /* toggle */ | ||
| 27686 | + adev->brange_time_last_state_change = jiffies; | ||
| 27687 | + } | ||
| 27688 | +} | ||
| 27689 | + | ||
| 27690 | + | ||
| 27691 | +#define MAX_IRQLOOPS_PER_JIFFY (20000/HZ) /* a la orinoco.c */ | ||
| 27692 | + | ||
| 27693 | +static irqreturn_t | ||
| 27694 | +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 19) | ||
| 27695 | +acxpci_i_interrupt(int irq, void *dev_id) | ||
| 27696 | +#else | ||
| 27697 | +acxpci_i_interrupt(int irq, void *dev_id, struct pt_regs *regs) | ||
| 27698 | +#endif | ||
| 27699 | +{ | ||
| 27700 | + acx_device_t *adev; | ||
| 27701 | + unsigned long flags; | ||
| 27702 | + unsigned int irqcount = MAX_IRQLOOPS_PER_JIFFY; | ||
| 27703 | + register u16 irqtype; | ||
| 27704 | + u16 unmasked; | ||
| 27705 | + | ||
| 27706 | + adev = ndev2adev((struct net_device*)dev_id); | ||
| 27707 | + | ||
| 27708 | + /* LOCKING: can just spin_lock() since IRQs are disabled anyway. | ||
| 27709 | + * I am paranoid */ | ||
| 27710 | + acx_lock(adev, flags); | ||
| 27711 | + | ||
| 27712 | + unmasked = read_reg16(adev, IO_ACX_IRQ_STATUS_CLEAR); | ||
| 27713 | + if (unlikely(0xffff == unmasked)) { | ||
| 27714 | + /* 0xffff value hints at missing hardware, | ||
| 27715 | + * so don't do anything. | ||
| 27716 | + * Not very clean, but other drivers do the same... */ | ||
| 27717 | + log(L_IRQ, "IRQ type:FFFF - device removed? IRQ_NONE\n"); | ||
| 27718 | + goto none; | ||
| 27719 | + } | ||
| 27720 | + | ||
| 27721 | + /* We will check only "interesting" IRQ types */ | ||
| 27722 | + irqtype = unmasked & ~adev->irq_mask; | ||
| 27723 | + if (!irqtype) { | ||
| 27724 | + /* We are on a shared IRQ line and it wasn't our IRQ */ | ||
| 27725 | + log(L_IRQ, "IRQ type:%04X, mask:%04X - all are masked, IRQ_NONE\n", | ||
| 27726 | + unmasked, adev->irq_mask); | ||
| 27727 | + goto none; | ||
| 27728 | + } | ||
| 27729 | + | ||
| 27730 | + /* Done here because IRQ_NONEs taking three lines of log | ||
| 27731 | + ** drive me crazy */ | ||
| 27732 | + FN_ENTER; | ||
| 27733 | + | ||
| 27734 | +#define IRQ_ITERATE 1 | ||
| 27735 | +#if IRQ_ITERATE | ||
| 27736 | +if (jiffies != adev->irq_last_jiffies) { | ||
| 27737 | + adev->irq_loops_this_jiffy = 0; | ||
| 27738 | + adev->irq_last_jiffies = jiffies; | ||
| 27739 | +} | ||
| 27740 | + | ||
| 27741 | +/* safety condition; we'll normally abort loop below | ||
| 27742 | + * in case no IRQ type occurred */ | ||
| 27743 | +while (likely(--irqcount)) { | ||
| 27744 | +#endif | ||
| 27745 | + /* ACK all IRQs ASAP */ | ||
| 27746 | + write_reg16(adev, IO_ACX_IRQ_ACK, 0xffff); | ||
| 27747 | + | ||
| 27748 | + log(L_IRQ, "IRQ type:%04X, mask:%04X, type & ~mask:%04X\n", | ||
| 27749 | + unmasked, adev->irq_mask, irqtype); | ||
| 27750 | + | ||
| 27751 | + /* Handle most important IRQ types first */ | ||
| 27752 | + if (irqtype & HOST_INT_RX_COMPLETE) { | ||
| 27753 | + log(L_IRQ, "got Rx_Complete IRQ\n"); | ||
| 27754 | + acxpci_l_process_rxdesc(adev); | ||
| 27755 | + } | ||
| 27756 | + if (irqtype & HOST_INT_TX_COMPLETE) { | ||
| 27757 | + log(L_IRQ, "got Tx_Complete IRQ\n"); | ||
| 27758 | + /* don't clean up on each Tx complete, wait a bit | ||
| 27759 | + * unless we're going towards full, in which case | ||
| 27760 | + * we do it immediately, too (otherwise we might lockup | ||
| 27761 | + * with a full Tx buffer if we go into | ||
| 27762 | + * acxpci_l_clean_txdesc() at a time when we won't wakeup | ||
| 27763 | + * the net queue in there for some reason...) */ | ||
| 27764 | + if (adev->tx_free <= TX_START_CLEAN) { | ||
| 27765 | +#if TX_CLEANUP_IN_SOFTIRQ | ||
| 27766 | + acx_schedule_task(adev, ACX_AFTER_IRQ_TX_CLEANUP); | ||
| 27767 | +#else | ||
| 27768 | + acxpci_l_clean_txdesc(adev); | ||
| 27769 | +#endif | ||
| 27770 | + } | ||
| 27771 | + } | ||
| 27772 | + | ||
| 27773 | + /* Less frequent ones */ | ||
| 27774 | + if (irqtype & (0 | ||
| 27775 | + | HOST_INT_CMD_COMPLETE | ||
| 27776 | + | HOST_INT_INFO | ||
| 27777 | + | HOST_INT_SCAN_COMPLETE | ||
| 27778 | + )) { | ||
| 27779 | + if (irqtype & HOST_INT_CMD_COMPLETE) { | ||
| 27780 | + log(L_IRQ, "got Command_Complete IRQ\n"); | ||
| 27781 | + /* save the state for the running issue_cmd() */ | ||
| 27782 | + SET_BIT(adev->irq_status, HOST_INT_CMD_COMPLETE); | ||
| 27783 | + } | ||
| 27784 | + if (irqtype & HOST_INT_INFO) { | ||
| 27785 | + handle_info_irq(adev); | ||
| 27786 | + } | ||
| 27787 | + if (irqtype & HOST_INT_SCAN_COMPLETE) { | ||
| 27788 | + log(L_IRQ, "got Scan_Complete IRQ\n"); | ||
| 27789 | + /* need to do that in process context */ | ||
| 27790 | + acx_schedule_task(adev, ACX_AFTER_IRQ_COMPLETE_SCAN); | ||
| 27791 | + /* remember that fw is not scanning anymore */ | ||
| 27792 | + SET_BIT(adev->irq_status, HOST_INT_SCAN_COMPLETE); | ||
| 27793 | + } | ||
| 27794 | + } | ||
| 27795 | + | ||
| 27796 | + /* These we just log, but either they happen rarely | ||
| 27797 | + * or we keep them masked out */ | ||
| 27798 | + if (irqtype & (0 | ||
| 27799 | + | HOST_INT_RX_DATA | ||
| 27800 | + /* | HOST_INT_TX_COMPLETE */ | ||
| 27801 | + | HOST_INT_TX_XFER | ||
| 27802 | + /* | HOST_INT_RX_COMPLETE */ | ||
| 27803 | + | HOST_INT_DTIM | ||
| 27804 | + | HOST_INT_BEACON | ||
| 27805 | + | HOST_INT_TIMER | ||
| 27806 | + | HOST_INT_KEY_NOT_FOUND | ||
| 27807 | + | HOST_INT_IV_ICV_FAILURE | ||
| 27808 | + /* | HOST_INT_CMD_COMPLETE */ | ||
| 27809 | + /* | HOST_INT_INFO */ | ||
| 27810 | + | HOST_INT_OVERFLOW | ||
| 27811 | + | HOST_INT_PROCESS_ERROR | ||
| 27812 | + /* | HOST_INT_SCAN_COMPLETE */ | ||
| 27813 | + | HOST_INT_FCS_THRESHOLD | ||
| 27814 | + | HOST_INT_UNKNOWN | ||
| 27815 | + )) { | ||
| 27816 | + log_unusual_irq(irqtype); | ||
| 27817 | + } | ||
| 27818 | + | ||
| 27819 | +#if IRQ_ITERATE | ||
| 27820 | + unmasked = read_reg16(adev, IO_ACX_IRQ_STATUS_CLEAR); | ||
| 27821 | + irqtype = unmasked & ~adev->irq_mask; | ||
| 27822 | + /* Bail out if no new IRQ bits or if all are masked out */ | ||
| 27823 | + if (!irqtype) | ||
| 27824 | + break; | ||
| 27825 | + | ||
| 27826 | + if (unlikely(++adev->irq_loops_this_jiffy > MAX_IRQLOOPS_PER_JIFFY)) { | ||
| 27827 | + printk(KERN_ERR "acx: too many interrupts per jiffy!\n"); | ||
| 27828 | + /* Looks like card floods us with IRQs! Try to stop that */ | ||
| 27829 | + write_reg16(adev, IO_ACX_IRQ_MASK, 0xffff); | ||
| 27830 | + /* This will short-circuit all future attempts to handle IRQ. | ||
| 27831 | + * We cant do much more... */ | ||
| 27832 | + adev->irq_mask = 0; | ||
| 27833 | + break; | ||
| 27834 | + } | ||
| 27835 | +} | ||
| 27836 | +#endif | ||
| 27837 | + /* Routine to perform blink with range */ | ||
| 27838 | + if (unlikely(adev->led_power == 2)) | ||
| 27839 | + update_link_quality_led(adev); | ||
| 27840 | + | ||
| 27841 | +/* handled: */ | ||
| 27842 | + /* write_flush(adev); - not needed, last op was read anyway */ | ||
| 27843 | + acx_unlock(adev, flags); | ||
| 27844 | + FN_EXIT0; | ||
| 27845 | + return IRQ_HANDLED; | ||
| 27846 | + | ||
| 27847 | +none: | ||
| 27848 | + acx_unlock(adev, flags); | ||
| 27849 | + return IRQ_NONE; | ||
| 27850 | +} | ||
| 27851 | + | ||
| 27852 | + | ||
| 27853 | +/*********************************************************************** | ||
| 27854 | +** acxpci_l_power_led | ||
| 27855 | +*/ | ||
| 27856 | +void | ||
| 27857 | +acxpci_l_power_led(acx_device_t *adev, int enable) | ||
| 27858 | +{ | ||
| 27859 | + u16 gpio_pled = IS_ACX111(adev) ? 0x0040 : 0x0800; | ||
| 27860 | + | ||
| 27861 | + /* A hack. Not moving message rate limiting to adev->xxx | ||
| 27862 | + * (it's only a debug message after all) */ | ||
| 27863 | + static int rate_limit = 0; | ||
| 27864 | + | ||
| 27865 | + if (rate_limit++ < 3) | ||
| 27866 | + log(L_IOCTL, "Please report in case toggling the power " | ||
| 27867 | + "LED doesn't work for your card!\n"); | ||
| 27868 | + if (enable) | ||
| 27869 | + write_reg16(adev, IO_ACX_GPIO_OUT, | ||
| 27870 | + read_reg16(adev, IO_ACX_GPIO_OUT) & ~gpio_pled); | ||
| 27871 | + else | ||
| 27872 | + write_reg16(adev, IO_ACX_GPIO_OUT, | ||
| 27873 | + read_reg16(adev, IO_ACX_GPIO_OUT) | gpio_pled); | ||
| 27874 | +} | ||
| 27875 | + | ||
| 27876 | + | ||
| 27877 | +/*********************************************************************** | ||
| 27878 | +** Ioctls | ||
| 27879 | +*/ | ||
| 27880 | + | ||
| 27881 | +/*********************************************************************** | ||
| 27882 | +*/ | ||
| 27883 | +int | ||
| 27884 | +acx111pci_ioctl_info( | ||
| 27885 | + struct net_device *ndev, | ||
| 27886 | + struct iw_request_info *info, | ||
| 27887 | + struct iw_param *vwrq, | ||
| 27888 | + char *extra) | ||
| 27889 | +{ | ||
| 27890 | +#if ACX_DEBUG > 1 | ||
| 27891 | + acx_device_t *adev = ndev2adev(ndev); | ||
| 27892 | + rxdesc_t *rxdesc; | ||
| 27893 | + txdesc_t *txdesc; | ||
| 27894 | + rxhostdesc_t *rxhostdesc; | ||
| 27895 | + txhostdesc_t *txhostdesc; | ||
| 27896 | + struct acx111_ie_memoryconfig memconf; | ||
| 27897 | + struct acx111_ie_queueconfig queueconf; | ||
| 27898 | + unsigned long flags; | ||
| 27899 | + int i; | ||
| 27900 | + char memmap[0x34]; | ||
| 27901 | + char rxconfig[0x8]; | ||
| 27902 | + char fcserror[0x8]; | ||
| 27903 | + char ratefallback[0x5]; | ||
| 27904 | + | ||
| 27905 | + if ( !(acx_debug & (L_IOCTL|L_DEBUG)) ) | ||
| 27906 | + return OK; | ||
| 27907 | + /* using printk() since we checked debug flag already */ | ||
| 27908 | + | ||
| 27909 | + acx_sem_lock(adev); | ||
| 27910 | + | ||
| 27911 | + if (!IS_ACX111(adev)) { | ||
| 27912 | + printk("acx111-specific function called " | ||
| 27913 | + "with non-acx111 chip, aborting\n"); | ||
| 27914 | + goto end_ok; | ||
| 27915 | + } | ||
| 27916 | + | ||
| 27917 | + /* get Acx111 Memory Configuration */ | ||
| 27918 | + memset(&memconf, 0, sizeof(memconf)); | ||
| 27919 | + /* BTW, fails with 12 (Write only) error code. | ||
| 27920 | + ** Retained for easy testing of issue_cmd error handling :) */ | ||
| 27921 | + acx_s_interrogate(adev, &memconf, ACX1xx_IE_QUEUE_CONFIG); | ||
| 27922 | + | ||
| 27923 | + /* get Acx111 Queue Configuration */ | ||
| 27924 | + memset(&queueconf, 0, sizeof(queueconf)); | ||
| 27925 | + acx_s_interrogate(adev, &queueconf, ACX1xx_IE_MEMORY_CONFIG_OPTIONS); | ||
| 27926 | + | ||
| 27927 | + /* get Acx111 Memory Map */ | ||
| 27928 | + memset(memmap, 0, sizeof(memmap)); | ||
| 27929 | + acx_s_interrogate(adev, &memmap, ACX1xx_IE_MEMORY_MAP); | ||
| 27930 | + | ||
| 27931 | + /* get Acx111 Rx Config */ | ||
| 27932 | + memset(rxconfig, 0, sizeof(rxconfig)); | ||
| 27933 | + acx_s_interrogate(adev, &rxconfig, ACX1xx_IE_RXCONFIG); | ||
| 27934 | + | ||
| 27935 | + /* get Acx111 fcs error count */ | ||
| 27936 | + memset(fcserror, 0, sizeof(fcserror)); | ||
| 27937 | + acx_s_interrogate(adev, &fcserror, ACX1xx_IE_FCS_ERROR_COUNT); | ||
| 27938 | + | ||
| 27939 | + /* get Acx111 rate fallback */ | ||
| 27940 | + memset(ratefallback, 0, sizeof(ratefallback)); | ||
| 27941 | + acx_s_interrogate(adev, &ratefallback, ACX1xx_IE_RATE_FALLBACK); | ||
| 27942 | + | ||
| 27943 | + /* force occurrence of a beacon interrupt */ | ||
| 27944 | + /* TODO: comment why is this necessary */ | ||
| 27945 | + write_reg16(adev, IO_ACX_HINT_TRIG, HOST_INT_BEACON); | ||
| 27946 | + | ||
| 27947 | + /* dump Acx111 Mem Configuration */ | ||
| 27948 | + printk("dump mem config:\n" | ||
| 27949 | + "data read: %d, struct size: %d\n" | ||
| 27950 | + "Number of stations: %1X\n" | ||
| 27951 | + "Memory block size: %1X\n" | ||
| 27952 | + "tx/rx memory block allocation: %1X\n" | ||
| 27953 | + "count rx: %X / tx: %X queues\n" | ||
| 27954 | + "options %1X\n" | ||
| 27955 | + "fragmentation %1X\n" | ||
| 27956 | + "Rx Queue 1 Count Descriptors: %X\n" | ||
| 27957 | + "Rx Queue 1 Host Memory Start: %X\n" | ||
| 27958 | + "Tx Queue 1 Count Descriptors: %X\n" | ||
| 27959 | + "Tx Queue 1 Attributes: %X\n", | ||
| 27960 | + memconf.len, (int) sizeof(memconf), | ||
| 27961 | + memconf.no_of_stations, | ||
| 27962 | + memconf.memory_block_size, | ||
| 27963 | + memconf.tx_rx_memory_block_allocation, | ||
| 27964 | + memconf.count_rx_queues, memconf.count_tx_queues, | ||
| 27965 | + memconf.options, | ||
| 27966 | + memconf.fragmentation, | ||
| 27967 | + memconf.rx_queue1_count_descs, | ||
| 27968 | + acx2cpu(memconf.rx_queue1_host_rx_start), | ||
| 27969 | + memconf.tx_queue1_count_descs, | ||
| 27970 | + memconf.tx_queue1_attributes); | ||
| 27971 | + | ||
| 27972 | + /* dump Acx111 Queue Configuration */ | ||
| 27973 | + printk("dump queue head:\n" | ||
| 27974 | + "data read: %d, struct size: %d\n" | ||
| 27975 | + "tx_memory_block_address (from card): %X\n" | ||
| 27976 | + "rx_memory_block_address (from card): %X\n" | ||
| 27977 | + "rx1_queue address (from card): %X\n" | ||
| 27978 | + "tx1_queue address (from card): %X\n" | ||
| 27979 | + "tx1_queue attributes (from card): %X\n", | ||
| 27980 | + queueconf.len, (int) sizeof(queueconf), | ||
| 27981 | + queueconf.tx_memory_block_address, | ||
| 27982 | + queueconf.rx_memory_block_address, | ||
| 27983 | + queueconf.rx1_queue_address, | ||
| 27984 | + queueconf.tx1_queue_address, | ||
| 27985 | + queueconf.tx1_attributes); | ||
| 27986 | + | ||
| 27987 | + /* dump Acx111 Mem Map */ | ||
| 27988 | + printk("dump mem map:\n" | ||
| 27989 | + "data read: %d, struct size: %d\n" | ||
| 27990 | + "Code start: %X\n" | ||
| 27991 | + "Code end: %X\n" | ||
| 27992 | + "WEP default key start: %X\n" | ||
| 27993 | + "WEP default key end: %X\n" | ||
| 27994 | + "STA table start: %X\n" | ||
| 27995 | + "STA table end: %X\n" | ||
| 27996 | + "Packet template start: %X\n" | ||
| 27997 | + "Packet template end: %X\n" | ||
| 27998 | + "Queue memory start: %X\n" | ||
| 27999 | + "Queue memory end: %X\n" | ||
| 28000 | + "Packet memory pool start: %X\n" | ||
| 28001 | + "Packet memory pool end: %X\n" | ||
| 28002 | + "iobase: %p\n" | ||
| 28003 | + "iobase2: %p\n", | ||
| 28004 | + *((u16 *)&memmap[0x02]), (int) sizeof(memmap), | ||
| 28005 | + *((u32 *)&memmap[0x04]), | ||
| 28006 | + *((u32 *)&memmap[0x08]), | ||
| 28007 | + *((u32 *)&memmap[0x0C]), | ||
| 28008 | + *((u32 *)&memmap[0x10]), | ||
| 28009 | + *((u32 *)&memmap[0x14]), | ||
| 28010 | + *((u32 *)&memmap[0x18]), | ||
| 28011 | + *((u32 *)&memmap[0x1C]), | ||
| 28012 | + *((u32 *)&memmap[0x20]), | ||
| 28013 | + *((u32 *)&memmap[0x24]), | ||
| 28014 | + *((u32 *)&memmap[0x28]), | ||
| 28015 | + *((u32 *)&memmap[0x2C]), | ||
| 28016 | + *((u32 *)&memmap[0x30]), | ||
| 28017 | + adev->iobase, | ||
| 28018 | + adev->iobase2); | ||
| 28019 | + | ||
| 28020 | + /* dump Acx111 Rx Config */ | ||
| 28021 | + printk("dump rx config:\n" | ||
| 28022 | + "data read: %d, struct size: %d\n" | ||
| 28023 | + "rx config: %X\n" | ||
| 28024 | + "rx filter config: %X\n", | ||
| 28025 | + *((u16 *)&rxconfig[0x02]), (int) sizeof(rxconfig), | ||
| 28026 | + *((u16 *)&rxconfig[0x04]), | ||
| 28027 | + *((u16 *)&rxconfig[0x06])); | ||
| 28028 | + | ||
| 28029 | + /* dump Acx111 fcs error */ | ||
| 28030 | + printk("dump fcserror:\n" | ||
| 28031 | + "data read: %d, struct size: %d\n" | ||
| 28032 | + "fcserrors: %X\n", | ||
| 28033 | + *((u16 *)&fcserror[0x02]), (int) sizeof(fcserror), | ||
| 28034 | + *((u32 *)&fcserror[0x04])); | ||
| 28035 | + | ||
| 28036 | + /* dump Acx111 rate fallback */ | ||
| 28037 | + printk("dump rate fallback:\n" | ||
| 28038 | + "data read: %d, struct size: %d\n" | ||
| 28039 | + "ratefallback: %X\n", | ||
| 28040 | + *((u16 *)&ratefallback[0x02]), (int) sizeof(ratefallback), | ||
| 28041 | + *((u8 *)&ratefallback[0x04])); | ||
| 28042 | + | ||
| 28043 | + /* protect against IRQ */ | ||
| 28044 | + acx_lock(adev, flags); | ||
| 28045 | + | ||
| 28046 | + /* dump acx111 internal rx descriptor ring buffer */ | ||
| 28047 | + rxdesc = adev->rxdesc_start; | ||
| 28048 | + | ||
| 28049 | + /* loop over complete receive pool */ | ||
| 28050 | + if (rxdesc) for (i = 0; i < RX_CNT; i++) { | ||
| 28051 | + printk("\ndump internal rxdesc %d:\n" | ||
| 28052 | + "mem pos %p\n" | ||
| 28053 | + "next 0x%X\n" | ||
| 28054 | + "acx mem pointer (dynamic) 0x%X\n" | ||
| 28055 | + "CTL (dynamic) 0x%X\n" | ||
| 28056 | + "Rate (dynamic) 0x%X\n" | ||
| 28057 | + "RxStatus (dynamic) 0x%X\n" | ||
| 28058 | + "Mod/Pre (dynamic) 0x%X\n", | ||
| 28059 | + i, | ||
| 28060 | + rxdesc, | ||
| 28061 | + acx2cpu(rxdesc->pNextDesc), | ||
| 28062 | + acx2cpu(rxdesc->ACXMemPtr), | ||
| 28063 | + rxdesc->Ctl_8, | ||
| 28064 | + rxdesc->rate, | ||
| 28065 | + rxdesc->error, | ||
| 28066 | + rxdesc->SNR); | ||
| 28067 | + rxdesc++; | ||
| 28068 | + } | ||
| 28069 | + | ||
| 28070 | + /* dump host rx descriptor ring buffer */ | ||
| 28071 | + | ||
| 28072 | + rxhostdesc = adev->rxhostdesc_start; | ||
| 28073 | + | ||
| 28074 | + /* loop over complete receive pool */ | ||
| 28075 | + if (rxhostdesc) for (i = 0; i < RX_CNT; i++) { | ||
| 28076 | + printk("\ndump host rxdesc %d:\n" | ||
| 28077 | + "mem pos %p\n" | ||
| 28078 | + "buffer mem pos 0x%X\n" | ||
| 28079 | + "buffer mem offset 0x%X\n" | ||
| 28080 | + "CTL 0x%X\n" | ||
| 28081 | + "Length 0x%X\n" | ||
| 28082 | + "next 0x%X\n" | ||
| 28083 | + "Status 0x%X\n", | ||
| 28084 | + i, | ||
| 28085 | + rxhostdesc, | ||
| 28086 | + acx2cpu(rxhostdesc->data_phy), | ||
| 28087 | + rxhostdesc->data_offset, | ||
| 28088 | + le16_to_cpu(rxhostdesc->Ctl_16), | ||
| 28089 | + le16_to_cpu(rxhostdesc->length), | ||
| 28090 | + acx2cpu(rxhostdesc->desc_phy_next), | ||
| 28091 | + rxhostdesc->Status); | ||
| 28092 | + rxhostdesc++; | ||
| 28093 | + } | ||
| 28094 | + | ||
| 28095 | + /* dump acx111 internal tx descriptor ring buffer */ | ||
| 28096 | + txdesc = adev->txdesc_start; | ||
| 28097 | + | ||
| 28098 | + /* loop over complete transmit pool */ | ||
| 28099 | + if (txdesc) for (i = 0; i < TX_CNT; i++) { | ||
| 28100 | + printk("\ndump internal txdesc %d:\n" | ||
| 28101 | + "size 0x%X\n" | ||
| 28102 | + "mem pos %p\n" | ||
| 28103 | + "next 0x%X\n" | ||
| 28104 | + "acx mem pointer (dynamic) 0x%X\n" | ||
| 28105 | + "host mem pointer (dynamic) 0x%X\n" | ||
| 28106 | + "length (dynamic) 0x%X\n" | ||
| 28107 | + "CTL (dynamic) 0x%X\n" | ||
| 28108 | + "CTL2 (dynamic) 0x%X\n" | ||
| 28109 | + "Status (dynamic) 0x%X\n" | ||
| 28110 | + "Rate (dynamic) 0x%X\n", | ||
| 28111 | + i, | ||
| 28112 | + (int) sizeof(struct txdesc), | ||
| 28113 | + txdesc, | ||
| 28114 | + acx2cpu(txdesc->pNextDesc), | ||
| 28115 | + acx2cpu(txdesc->AcxMemPtr), | ||
| 28116 | + acx2cpu(txdesc->HostMemPtr), | ||
| 28117 | + le16_to_cpu(txdesc->total_length), | ||
| 28118 | + txdesc->Ctl_8, | ||
| 28119 | + txdesc->Ctl2_8, txdesc->error, | ||
| 28120 | + txdesc->u.r1.rate); | ||
| 28121 | + txdesc = advance_txdesc(adev, txdesc, 1); | ||
| 28122 | + } | ||
| 28123 | + | ||
| 28124 | + /* dump host tx descriptor ring buffer */ | ||
| 28125 | + | ||
| 28126 | + txhostdesc = adev->txhostdesc_start; | ||
| 28127 | + | ||
| 28128 | + /* loop over complete host send pool */ | ||
| 28129 | + if (txhostdesc) for (i = 0; i < TX_CNT * 2; i++) { | ||
| 28130 | + printk("\ndump host txdesc %d:\n" | ||
| 28131 | + "mem pos %p\n" | ||
| 28132 | + "buffer mem pos 0x%X\n" | ||
| 28133 | + "buffer mem offset 0x%X\n" | ||
| 28134 | + "CTL 0x%X\n" | ||
| 28135 | + "Length 0x%X\n" | ||
| 28136 | + "next 0x%X\n" | ||
| 28137 | + "Status 0x%X\n", | ||
| 28138 | + i, | ||
| 28139 | + txhostdesc, | ||
| 28140 | + acx2cpu(txhostdesc->data_phy), | ||
| 28141 | + txhostdesc->data_offset, | ||
| 28142 | + le16_to_cpu(txhostdesc->Ctl_16), | ||
| 28143 | + le16_to_cpu(txhostdesc->length), | ||
| 28144 | + acx2cpu(txhostdesc->desc_phy_next), | ||
| 28145 | + le32_to_cpu(txhostdesc->Status)); | ||
| 28146 | + txhostdesc++; | ||
| 28147 | + } | ||
| 28148 | + | ||
| 28149 | + /* write_reg16(adev, 0xb4, 0x4); */ | ||
| 28150 | + | ||
| 28151 | + acx_unlock(adev, flags); | ||
| 28152 | +end_ok: | ||
| 28153 | + | ||
| 28154 | + acx_sem_unlock(adev); | ||
| 28155 | +#endif /* ACX_DEBUG */ | ||
| 28156 | + return OK; | ||
| 28157 | +} | ||
| 28158 | + | ||
| 28159 | + | ||
| 28160 | +/*********************************************************************** | ||
| 28161 | +*/ | ||
| 28162 | +int | ||
| 28163 | +acx100pci_ioctl_set_phy_amp_bias( | ||
| 28164 | + struct net_device *ndev, | ||
| 28165 | + struct iw_request_info *info, | ||
| 28166 | + struct iw_param *vwrq, | ||
| 28167 | + char *extra) | ||
| 28168 | +{ | ||
| 28169 | + acx_device_t *adev = ndev2adev(ndev); | ||
| 28170 | + unsigned long flags; | ||
| 28171 | + u16 gpio_old; | ||
| 28172 | + | ||
| 28173 | + if (!IS_ACX100(adev)) { | ||
| 28174 | + /* WARNING!!! | ||
| 28175 | + * Removing this check *might* damage | ||
| 28176 | + * hardware, since we're tweaking GPIOs here after all!!! | ||
| 28177 | + * You've been warned... | ||
| 28178 | + * WARNING!!! */ | ||
| 28179 | + printk("acx: sorry, setting bias level for non-acx100 " | ||
| 28180 | + "is not supported yet\n"); | ||
| 28181 | + return OK; | ||
| 28182 | + } | ||
| 28183 | + | ||
| 28184 | + if (*extra > 7) { | ||
| 28185 | + printk("acx: invalid bias parameter, range is 0-7\n"); | ||
| 28186 | + return -EINVAL; | ||
| 28187 | + } | ||
| 28188 | + | ||
| 28189 | + acx_sem_lock(adev); | ||
| 28190 | + | ||
| 28191 | + /* Need to lock accesses to [IO_ACX_GPIO_OUT]: | ||
| 28192 | + * IRQ handler uses it to update LED */ | ||
| 28193 | + acx_lock(adev, flags); | ||
| 28194 | + gpio_old = read_reg16(adev, IO_ACX_GPIO_OUT); | ||
| 28195 | + write_reg16(adev, IO_ACX_GPIO_OUT, (gpio_old & 0xf8ff) | ((u16)*extra << 8)); | ||
| 28196 | + acx_unlock(adev, flags); | ||
| 28197 | + | ||
| 28198 | + log(L_DEBUG, "gpio_old: 0x%04X\n", gpio_old); | ||
| 28199 | + printk("%s: PHY power amplifier bias: old:%d, new:%d\n", | ||
| 28200 | + ndev->name, | ||
| 28201 | + (gpio_old & 0x0700) >> 8, (unsigned char)*extra); | ||
| 28202 | + | ||
| 28203 | + acx_sem_unlock(adev); | ||
| 28204 | + | ||
| 28205 | + return OK; | ||
| 28206 | +} | ||
| 28207 | + | ||
| 28208 | + | ||
| 28209 | +/*************************************************************** | ||
| 28210 | +** acxpci_l_alloc_tx | ||
| 28211 | +** Actually returns a txdesc_t* ptr | ||
| 28212 | +** | ||
| 28213 | +** FIXME: in case of fragments, should allocate multiple descrs | ||
| 28214 | +** after figuring out how many we need and whether we still have | ||
| 28215 | +** sufficiently many. | ||
| 28216 | +*/ | ||
| 28217 | +tx_t* | ||
| 28218 | +acxpci_l_alloc_tx(acx_device_t *adev) | ||
| 28219 | +{ | ||
| 28220 | + struct txdesc *txdesc; | ||
| 28221 | + unsigned head; | ||
| 28222 | + u8 ctl8; | ||
| 28223 | + | ||
| 28224 | + FN_ENTER; | ||
| 28225 | + | ||
| 28226 | + if (unlikely(!adev->tx_free)) { | ||
| 28227 | + printk("acx: BUG: no free txdesc left\n"); | ||
| 28228 | + txdesc = NULL; | ||
| 28229 | + goto end; | ||
| 28230 | + } | ||
| 28231 | + | ||
| 28232 | + head = adev->tx_head; | ||
| 28233 | + txdesc = get_txdesc(adev, head); | ||
| 28234 | + ctl8 = txdesc->Ctl_8; | ||
| 28235 | + | ||
| 28236 | + /* 2005-10-11: there were several bug reports on this happening | ||
| 28237 | + ** but now cause seems to be understood & fixed */ | ||
| 28238 | + if (unlikely(DESC_CTL_HOSTOWN != (ctl8 & DESC_CTL_ACXDONE_HOSTOWN))) { | ||
| 28239 | + /* whoops, descr at current index is not free, so probably | ||
| 28240 | + * ring buffer already full */ | ||
| 28241 | + printk("acx: BUG: tx_head:%d Ctl8:0x%02X - failed to find " | ||
| 28242 | + "free txdesc\n", head, ctl8); | ||
| 28243 | + txdesc = NULL; | ||
| 28244 | + goto end; | ||
| 28245 | + } | ||
| 28246 | + | ||
| 28247 | + /* Needed in case txdesc won't be eventually submitted for tx */ | ||
| 28248 | + txdesc->Ctl_8 = DESC_CTL_ACXDONE_HOSTOWN; | ||
| 28249 | + | ||
| 28250 | + adev->tx_free--; | ||
| 28251 | + log(L_BUFT, "tx: got desc %u, %u remain\n", | ||
| 28252 | + head, adev->tx_free); | ||
| 28253 | + /* Keep a few free descs between head and tail of tx ring. | ||
| 28254 | + ** It is not absolutely needed, just feels safer */ | ||
| 28255 | + if (adev->tx_free < TX_STOP_QUEUE) { | ||
| 28256 | + log(L_BUF, "stop queue (%u tx desc left)\n", | ||
| 28257 | + adev->tx_free); | ||
| 28258 | + acx_stop_queue(adev->ndev, NULL); | ||
| 28259 | + } | ||
| 28260 | + | ||
| 28261 | + /* returning current descriptor, so advance to next free one */ | ||
| 28262 | + adev->tx_head = (head + 1) % TX_CNT; | ||
| 28263 | +end: | ||
| 28264 | + FN_EXIT0; | ||
| 28265 | + | ||
| 28266 | + return (tx_t*)txdesc; | ||
| 28267 | +} | ||
| 28268 | + | ||
| 28269 | + | ||
| 28270 | +/*********************************************************************** | ||
| 28271 | +*/ | ||
| 28272 | +void* | ||
| 28273 | +acxpci_l_get_txbuf(acx_device_t *adev, tx_t* tx_opaque) | ||
| 28274 | +{ | ||
| 28275 | + return get_txhostdesc(adev, (txdesc_t*)tx_opaque)->data; | ||
| 28276 | +} | ||
| 28277 | + | ||
| 28278 | + | ||
| 28279 | +/*********************************************************************** | ||
| 28280 | +** acxpci_l_tx_data | ||
| 28281 | +** | ||
| 28282 | +** Can be called from IRQ (rx -> (AP bridging or mgmt response) -> tx). | ||
| 28283 | +** Can be called from acx_i_start_xmit (data frames from net core). | ||
| 28284 | +** | ||
| 28285 | +** FIXME: in case of fragments, should loop over the number of | ||
| 28286 | +** pre-allocated tx descrs, properly setting up transfer data and | ||
| 28287 | +** CTL_xxx flags according to fragment number. | ||
| 28288 | +*/ | ||
| 28289 | +void | ||
| 28290 | +acxpci_l_tx_data(acx_device_t *adev, tx_t* tx_opaque, int len) | ||
| 28291 | +{ | ||
| 28292 | + txdesc_t *txdesc = (txdesc_t*)tx_opaque; | ||
| 28293 | + txhostdesc_t *hostdesc1, *hostdesc2; | ||
| 28294 | + client_t *clt; | ||
| 28295 | + u16 rate_cur; | ||
| 28296 | + u8 Ctl_8, Ctl2_8; | ||
| 28297 | + | ||
| 28298 | + FN_ENTER; | ||
| 28299 | + | ||
| 28300 | + /* fw doesn't tx such packets anyhow */ | ||
| 28301 | + if (unlikely(len < WLAN_HDR_A3_LEN)) | ||
| 28302 | + goto end; | ||
| 28303 | + | ||
| 28304 | + hostdesc1 = get_txhostdesc(adev, txdesc); | ||
| 28305 | + /* modify flag status in separate variable to be able to write it back | ||
| 28306 | + * in one big swoop later (also in order to have less device memory | ||
| 28307 | + * accesses) */ | ||
| 28308 | + Ctl_8 = txdesc->Ctl_8; | ||
| 28309 | + Ctl2_8 = 0; /* really need to init it to 0, not txdesc->Ctl2_8, it seems */ | ||
| 28310 | + | ||
| 28311 | + hostdesc2 = hostdesc1 + 1; | ||
| 28312 | + | ||
| 28313 | + /* DON'T simply set Ctl field to 0 here globally, | ||
| 28314 | + * it needs to maintain a consistent flag status (those are state flags!!), | ||
| 28315 | + * otherwise it may lead to severe disruption. Only set or reset particular | ||
| 28316 | + * flags at the exact moment this is needed... */ | ||
| 28317 | + | ||
| 28318 | + /* let chip do RTS/CTS handshaking before sending | ||
| 28319 | + * in case packet size exceeds threshold */ | ||
| 28320 | + if (len > adev->rts_threshold) | ||
| 28321 | + SET_BIT(Ctl2_8, DESC_CTL2_RTS); | ||
| 28322 | + else | ||
| 28323 | + CLEAR_BIT(Ctl2_8, DESC_CTL2_RTS); | ||
| 28324 | + | ||
| 28325 | + switch (adev->mode) { | ||
| 28326 | + case ACX_MODE_0_ADHOC: | ||
| 28327 | + case ACX_MODE_3_AP: | ||
| 28328 | + clt = acx_l_sta_list_get(adev, ((wlan_hdr_t*)hostdesc1->data)->a1); | ||
| 28329 | + break; | ||
| 28330 | + case ACX_MODE_2_STA: | ||
| 28331 | + clt = adev->ap_client; | ||
| 28332 | + break; | ||
| 28333 | +#if 0 | ||
| 28334 | +/* testing was done on acx111: */ | ||
| 28335 | + case ACX_MODE_MONITOR: | ||
| 28336 | + SET_BIT(Ctl2_8, 0 | ||
| 28337 | +/* sends CTS to self before packet */ | ||
| 28338 | + + DESC_CTL2_SEQ /* don't increase sequence field */ | ||
| 28339 | +/* not working (looks like good fcs is still added) */ | ||
| 28340 | + + DESC_CTL2_FCS /* don't add the FCS */ | ||
| 28341 | +/* not tested */ | ||
| 28342 | + + DESC_CTL2_MORE_FRAG | ||
| 28343 | +/* not tested */ | ||
| 28344 | + + DESC_CTL2_RETRY /* don't increase retry field */ | ||
| 28345 | +/* not tested */ | ||
| 28346 | + + DESC_CTL2_POWER /* don't increase power mgmt. field */ | ||
| 28347 | +/* no effect */ | ||
| 28348 | + + DESC_CTL2_WEP /* encrypt this frame */ | ||
| 28349 | +/* not tested */ | ||
| 28350 | + + DESC_CTL2_DUR /* don't increase duration field */ | ||
| 28351 | + ); | ||
| 28352 | + /* fallthrough */ | ||
| 28353 | +#endif | ||
| 28354 | + default: /* ACX_MODE_OFF, ACX_MODE_MONITOR */ | ||
| 28355 | + clt = NULL; | ||
| 28356 | + break; | ||
| 28357 | + } | ||
| 28358 | + | ||
| 28359 | + rate_cur = clt ? clt->rate_cur : adev->rate_bcast; | ||
| 28360 | + if (unlikely(!rate_cur)) { | ||
| 28361 | + printk("acx: driver bug! bad ratemask\n"); | ||
| 28362 | + goto end; | ||
| 28363 | + } | ||
| 28364 | + | ||
| 28365 | + /* used in tx cleanup routine for auto rate and accounting: */ | ||
| 28366 | + put_txcr(adev, txdesc, clt, rate_cur); | ||
| 28367 | + | ||
| 28368 | + txdesc->total_length = cpu_to_le16(len); | ||
| 28369 | + hostdesc2->length = cpu_to_le16(len - WLAN_HDR_A3_LEN); | ||
| 28370 | + if (IS_ACX111(adev)) { | ||
| 28371 | + /* note that if !txdesc->do_auto, txrate->cur | ||
| 28372 | + ** has only one nonzero bit */ | ||
| 28373 | + txdesc->u.r2.rate111 = cpu_to_le16( | ||
| 28374 | + rate_cur | ||
| 28375 | + /* WARNING: I was never able to make it work with prism54 AP. | ||
| 28376 | + ** It was falling down to 1Mbit where shortpre is not applicable, | ||
| 28377 | + ** and not working at all at "5,11 basic rates only" setting. | ||
| 28378 | + ** I even didn't see tx packets in radio packet capture. | ||
| 28379 | + ** Disabled for now --vda */ | ||
| 28380 | + /*| ((clt->shortpre && clt->cur!=RATE111_1) ? RATE111_SHORTPRE : 0) */ | ||
| 28381 | + ); | ||
| 28382 | +#ifdef TODO_FIGURE_OUT_WHEN_TO_SET_THIS | ||
| 28383 | + /* should add this to rate111 above as necessary */ | ||
| 28384 | + | (clt->pbcc511 ? RATE111_PBCC511 : 0) | ||
| 28385 | +#endif | ||
| 28386 | + hostdesc1->length = cpu_to_le16(len); | ||
| 28387 | + } else { /* ACX100 */ | ||
| 28388 | + u8 rate_100 = clt ? clt->rate_100 : adev->rate_bcast100; | ||
| 28389 | + txdesc->u.r1.rate = rate_100; | ||
| 28390 | +#ifdef TODO_FIGURE_OUT_WHEN_TO_SET_THIS | ||
| 28391 | + if (clt->pbcc511) { | ||
| 28392 | + if (n == RATE100_5 || n == RATE100_11) | ||
| 28393 | + n |= RATE100_PBCC511; | ||
| 28394 | + } | ||
| 28395 | + | ||
| 28396 | + if (clt->shortpre && (clt->cur != RATE111_1)) | ||
| 28397 | + SET_BIT(Ctl_8, DESC_CTL_SHORT_PREAMBLE); /* set Short Preamble */ | ||
| 28398 | +#endif | ||
| 28399 | + /* set autodma and reclaim and 1st mpdu */ | ||
| 28400 | + SET_BIT(Ctl_8, DESC_CTL_AUTODMA | DESC_CTL_RECLAIM | DESC_CTL_FIRSTFRAG); | ||
| 28401 | +#if ACX_FRAGMENTATION | ||
| 28402 | + /* SET_BIT(Ctl2_8, DESC_CTL2_MORE_FRAG); cannot set it unconditionally, needs to be set for all non-last fragments */ | ||
| 28403 | +#endif | ||
| 28404 | + hostdesc1->length = cpu_to_le16(WLAN_HDR_A3_LEN); | ||
| 28405 | + } | ||
| 28406 | + /* don't need to clean ack/rts statistics here, already | ||
| 28407 | + * done on descr cleanup */ | ||
| 28408 | + | ||
| 28409 | + /* clears HOSTOWN and ACXDONE bits, thus telling that the descriptors | ||
| 28410 | + * are now owned by the acx100; do this as LAST operation */ | ||
| 28411 | + CLEAR_BIT(Ctl_8, DESC_CTL_ACXDONE_HOSTOWN); | ||
| 28412 | + /* flush writes before we release hostdesc to the adapter here */ | ||
| 28413 | + wmb(); | ||
| 28414 | + CLEAR_BIT(hostdesc1->Ctl_16, cpu_to_le16(DESC_CTL_HOSTOWN)); | ||
| 28415 | + CLEAR_BIT(hostdesc2->Ctl_16, cpu_to_le16(DESC_CTL_HOSTOWN)); | ||
| 28416 | + | ||
| 28417 | + /* write back modified flags */ | ||
| 28418 | + txdesc->Ctl2_8 = Ctl2_8; | ||
| 28419 | + txdesc->Ctl_8 = Ctl_8; | ||
| 28420 | + /* unused: txdesc->tx_time = cpu_to_le32(jiffies); */ | ||
| 28421 | + | ||
| 28422 | + /* flush writes before we tell the adapter that it's its turn now */ | ||
| 28423 | + mmiowb(); | ||
| 28424 | + write_reg16(adev, IO_ACX_INT_TRIG, INT_TRIG_TXPRC); | ||
| 28425 | + write_flush(adev); | ||
| 28426 | + | ||
| 28427 | + /* log the packet content AFTER sending it, | ||
| 28428 | + * in order to not delay sending any further than absolutely needed | ||
| 28429 | + * Do separate logs for acx100/111 to have human-readable rates */ | ||
| 28430 | + if (unlikely(acx_debug & (L_XFER|L_DATA))) { | ||
| 28431 | + u16 fc = ((wlan_hdr_t*)hostdesc1->data)->fc; | ||
| 28432 | + if (IS_ACX111(adev)) | ||
| 28433 | + printk("tx: pkt (%s): len %d " | ||
| 28434 | + "rate %04X%s status %u\n", | ||
| 28435 | + acx_get_packet_type_string(le16_to_cpu(fc)), len, | ||
| 28436 | + le16_to_cpu(txdesc->u.r2.rate111), | ||
| 28437 | + (le16_to_cpu(txdesc->u.r2.rate111) & RATE111_SHORTPRE) ? "(SPr)" : "", | ||
| 28438 | + adev->status); | ||
| 28439 | + else | ||
| 28440 | + printk("tx: pkt (%s): len %d rate %03u%s status %u\n", | ||
| 28441 | + acx_get_packet_type_string(fc), len, | ||
| 28442 | + txdesc->u.r1.rate, | ||
| 28443 | + (Ctl_8 & DESC_CTL_SHORT_PREAMBLE) ? "(SPr)" : "", | ||
| 28444 | + adev->status); | ||
| 28445 | + | ||
| 28446 | + if (acx_debug & L_DATA) { | ||
| 28447 | + printk("tx: 802.11 [%d]: ", len); | ||
| 28448 | + acx_dump_bytes(hostdesc1->data, len); | ||
| 28449 | + } | ||
| 28450 | + } | ||
| 28451 | +end: | ||
| 28452 | + FN_EXIT0; | ||
| 28453 | +} | ||
| 28454 | + | ||
| 28455 | + | ||
| 28456 | +/*********************************************************************** | ||
| 28457 | +** acxpci_l_clean_txdesc | ||
| 28458 | +** | ||
| 28459 | +** This function resets the txdescs' status when the ACX100 | ||
| 28460 | +** signals the TX done IRQ (txdescs have been processed), starting with | ||
| 28461 | +** the pool index of the descriptor which we would use next, | ||
| 28462 | +** in order to make sure that we can be as fast as possible | ||
| 28463 | +** in filling new txdescs. | ||
| 28464 | +** Everytime we get called we know where the next packet to be cleaned is. | ||
| 28465 | +*/ | ||
| 28466 | + | ||
| 28467 | +#if !ACX_DEBUG | ||
| 28468 | +static inline void log_txbuffer(const acx_device_t *adev) {} | ||
| 28469 | +#else | ||
| 28470 | +static void | ||
| 28471 | +log_txbuffer(acx_device_t *adev) | ||
| 28472 | +{ | ||
| 28473 | + txdesc_t *txdesc; | ||
| 28474 | + int i; | ||
| 28475 | + | ||
| 28476 | + /* no FN_ENTER here, we don't want that */ | ||
| 28477 | + /* no locks here, since it's entirely non-critical code */ | ||
| 28478 | + txdesc = adev->txdesc_start; | ||
| 28479 | + if (unlikely(!txdesc)) return; | ||
| 28480 | + printk("tx: desc->Ctl8's:"); | ||
| 28481 | + for (i = 0; i < TX_CNT; i++) { | ||
| 28482 | + printk(" %02X", txdesc->Ctl_8); | ||
| 28483 | + txdesc = advance_txdesc(adev, txdesc, 1); | ||
| 28484 | + } | ||
| 28485 | + printk("\n"); | ||
| 28486 | +} | ||
| 28487 | +#endif | ||
| 28488 | + | ||
| 28489 | + | ||
| 28490 | +static void | ||
| 28491 | +handle_tx_error(acx_device_t *adev, u8 error, unsigned int finger) | ||
| 28492 | +{ | ||
| 28493 | + const char *err = "unknown error"; | ||
| 28494 | + | ||
| 28495 | + /* hmm, should we handle this as a mask | ||
| 28496 | + * of *several* bits? | ||
| 28497 | + * For now I think only caring about | ||
| 28498 | + * individual bits is ok... */ | ||
| 28499 | + switch (error) { | ||
| 28500 | + case 0x01: | ||
| 28501 | + err = "no Tx due to error in other fragment"; | ||
| 28502 | + adev->wstats.discard.fragment++; | ||
| 28503 | + break; | ||
| 28504 | + case 0x02: | ||
| 28505 | + err = "Tx aborted"; | ||
| 28506 | + adev->stats.tx_aborted_errors++; | ||
| 28507 | + break; | ||
| 28508 | + case 0x04: | ||
| 28509 | + err = "Tx desc wrong parameters"; | ||
| 28510 | + adev->wstats.discard.misc++; | ||
| 28511 | + break; | ||
| 28512 | + case 0x08: | ||
| 28513 | + err = "WEP key not found"; | ||
| 28514 | + adev->wstats.discard.misc++; | ||
| 28515 | + break; | ||
| 28516 | + case 0x10: | ||
| 28517 | + err = "MSDU lifetime timeout? - try changing " | ||
| 28518 | + "'iwconfig retry lifetime XXX'"; | ||
| 28519 | + adev->wstats.discard.misc++; | ||
| 28520 | + break; | ||
| 28521 | + case 0x20: | ||
| 28522 | + err = "excessive Tx retries due to either distance " | ||
| 28523 | + "too high or unable to Tx or Tx frame error - " | ||
| 28524 | + "try changing 'iwconfig txpower XXX' or " | ||
| 28525 | + "'sens'itivity or 'retry'"; | ||
| 28526 | + adev->wstats.discard.retries++; | ||
| 28527 | + /* Tx error 0x20 also seems to occur on | ||
| 28528 | + * overheating, so I'm not sure whether we | ||
| 28529 | + * actually want to do aggressive radio recalibration, | ||
| 28530 | + * since people maybe won't notice then that their hardware | ||
| 28531 | + * is slowly getting cooked... | ||
| 28532 | + * Or is it still a safe long distance from utter | ||
| 28533 | + * radio non-functionality despite many radio recalibs | ||
| 28534 | + * to final destructive overheating of the hardware? | ||
| 28535 | + * In this case we really should do recalib here... | ||
| 28536 | + * I guess the only way to find out is to do a | ||
| 28537 | + * potentially fatal self-experiment :-\ | ||
| 28538 | + * Or maybe only recalib in case we're using Tx | ||
| 28539 | + * rate auto (on errors switching to lower speed | ||
| 28540 | + * --> less heat?) or 802.11 power save mode? | ||
| 28541 | + * | ||
| 28542 | + * ok, just do it. */ | ||
| 28543 | + if (++adev->retry_errors_msg_ratelimit % 4 == 0) { | ||
| 28544 | + if (adev->retry_errors_msg_ratelimit <= 20) { | ||
| 28545 | + printk("%s: several excessive Tx " | ||
| 28546 | + "retry errors occurred, attempting " | ||
| 28547 | + "to recalibrate radio. Radio " | ||
| 28548 | + "drift might be caused by increasing " | ||
| 28549 | + "card temperature, please check the card " | ||
| 28550 | + "before it's too late!\n", | ||
| 28551 | + adev->ndev->name); | ||
| 28552 | + if (adev->retry_errors_msg_ratelimit == 20) | ||
| 28553 | + printk("disabling above message\n"); | ||
| 28554 | + } | ||
| 28555 | + | ||
| 28556 | + acx_schedule_task(adev, ACX_AFTER_IRQ_CMD_RADIO_RECALIB); | ||
| 28557 | + } | ||
| 28558 | + break; | ||
| 28559 | + case 0x40: | ||
| 28560 | + err = "Tx buffer overflow"; | ||
| 28561 | + adev->stats.tx_fifo_errors++; | ||
| 28562 | + break; | ||
| 28563 | + case 0x80: | ||
| 28564 | + /* possibly ACPI C-state powersaving related!!! | ||
| 28565 | + * (DMA timeout due to excessively high wakeup | ||
| 28566 | + * latency after C-state activation!?) | ||
| 28567 | + * Disable C-State powersaving and try again, | ||
| 28568 | + * then PLEASE REPORT, I'm VERY interested in | ||
| 28569 | + * whether my theory is correct that this is | ||
| 28570 | + * actually the problem here. | ||
| 28571 | + * In that case, use new Linux idle wakeup latency | ||
| 28572 | + * requirements kernel API to prevent this issue. */ | ||
| 28573 | + err = "DMA error"; | ||
| 28574 | + adev->wstats.discard.misc++; | ||
| 28575 | + break; | ||
| 28576 | + } | ||
| 28577 | + adev->stats.tx_errors++; | ||
| 28578 | + if (adev->stats.tx_errors <= 20) | ||
| 28579 | + printk("%s: tx error 0x%02X, buf %02u! (%s)\n", | ||
| 28580 | + adev->ndev->name, error, finger, err); | ||
| 28581 | + else | ||
| 28582 | + printk("%s: tx error 0x%02X, buf %02u!\n", | ||
| 28583 | + adev->ndev->name, error, finger); | ||
| 28584 | +} | ||
| 28585 | + | ||
| 28586 | + | ||
| 28587 | +unsigned int | ||
| 28588 | +acxpci_l_clean_txdesc(acx_device_t *adev) | ||
| 28589 | +{ | ||
| 28590 | + txdesc_t *txdesc; | ||
| 28591 | + unsigned finger; | ||
| 28592 | + int num_cleaned; | ||
| 28593 | + u16 r111; | ||
| 28594 | + u8 error, ack_failures, rts_failures, rts_ok, r100; | ||
| 28595 | + | ||
| 28596 | + FN_ENTER; | ||
| 28597 | + | ||
| 28598 | + if (unlikely(acx_debug & L_DEBUG)) | ||
| 28599 | + log_txbuffer(adev); | ||
| 28600 | + | ||
| 28601 | + log(L_BUFT, "tx: cleaning up bufs from %u\n", adev->tx_tail); | ||
| 28602 | + | ||
| 28603 | + /* We know first descr which is not free yet. We advance it as far | ||
| 28604 | + ** as we see correct bits set in following descs (if next desc | ||
| 28605 | + ** is NOT free, we shouldn't advance at all). We know that in | ||
| 28606 | + ** front of tx_tail may be "holes" with isolated free descs. | ||
| 28607 | + ** We will catch up when all intermediate descs will be freed also */ | ||
| 28608 | + | ||
| 28609 | + finger = adev->tx_tail; | ||
| 28610 | + num_cleaned = 0; | ||
| 28611 | + while (likely(finger != adev->tx_head)) { | ||
| 28612 | + txdesc = get_txdesc(adev, finger); | ||
| 28613 | + | ||
| 28614 | + /* If we allocated txdesc on tx path but then decided | ||
| 28615 | + ** to NOT use it, then it will be left as a free "bubble" | ||
| 28616 | + ** in the "allocated for tx" part of the ring. | ||
| 28617 | + ** We may meet it on the next ring pass here. */ | ||
| 28618 | + | ||
| 28619 | + /* stop if not marked as "tx finished" and "host owned" */ | ||
| 28620 | + if ((txdesc->Ctl_8 & DESC_CTL_ACXDONE_HOSTOWN) | ||
| 28621 | + != DESC_CTL_ACXDONE_HOSTOWN) { | ||
| 28622 | + if (unlikely(!num_cleaned)) { /* maybe remove completely */ | ||
| 28623 | + log(L_BUFT, "clean_txdesc: tail isn't free. " | ||
| 28624 | + "tail:%d head:%d\n", | ||
| 28625 | + adev->tx_tail, adev->tx_head); | ||
| 28626 | + } | ||
| 28627 | + break; | ||
| 28628 | + } | ||
| 28629 | + | ||
| 28630 | + /* remember desc values... */ | ||
| 28631 | + error = txdesc->error; | ||
| 28632 | + ack_failures = txdesc->ack_failures; | ||
| 28633 | + rts_failures = txdesc->rts_failures; | ||
| 28634 | + rts_ok = txdesc->rts_ok; | ||
| 28635 | + r100 = txdesc->u.r1.rate; | ||
| 28636 | + r111 = le16_to_cpu(txdesc->u.r2.rate111); | ||
| 28637 | + | ||
| 28638 | + /* need to check for certain error conditions before we | ||
| 28639 | + * clean the descriptor: we still need valid descr data here */ | ||
| 28640 | + if (unlikely(0x30 & error)) { | ||
| 28641 | + /* only send IWEVTXDROP in case of retry or lifetime exceeded; | ||
| 28642 | + * all other errors mean we screwed up locally */ | ||
| 28643 | + union iwreq_data wrqu; | ||
| 28644 | + wlan_hdr_t *hdr; | ||
| 28645 | + txhostdesc_t *hostdesc; | ||
| 28646 | + | ||
| 28647 | + hostdesc = get_txhostdesc(adev, txdesc); | ||
| 28648 | + hdr = (wlan_hdr_t *)hostdesc->data; | ||
| 28649 | + MAC_COPY(wrqu.addr.sa_data, hdr->a1); | ||
| 28650 | + wireless_send_event(adev->ndev, IWEVTXDROP, &wrqu, NULL); | ||
| 28651 | + } | ||
| 28652 | + | ||
| 28653 | + /* ...and free the desc */ | ||
| 28654 | + txdesc->error = 0; | ||
| 28655 | + txdesc->ack_failures = 0; | ||
| 28656 | + txdesc->rts_failures = 0; | ||
| 28657 | + txdesc->rts_ok = 0; | ||
| 28658 | + /* signal host owning it LAST, since ACX already knows that this | ||
| 28659 | + ** descriptor is finished since it set Ctl_8 accordingly. */ | ||
| 28660 | + txdesc->Ctl_8 = DESC_CTL_HOSTOWN; | ||
| 28661 | + | ||
| 28662 | + adev->tx_free++; | ||
| 28663 | + num_cleaned++; | ||
| 28664 | + | ||
| 28665 | + if ((adev->tx_free >= TX_START_QUEUE) | ||
| 28666 | + && (adev->status == ACX_STATUS_4_ASSOCIATED) | ||
| 28667 | + && (acx_queue_stopped(adev->ndev)) | ||
| 28668 | + ) { | ||
| 28669 | + log(L_BUF, "tx: wake queue (avail. Tx desc %u)\n", | ||
| 28670 | + adev->tx_free); | ||
| 28671 | + acx_wake_queue(adev->ndev, NULL); | ||
| 28672 | + } | ||
| 28673 | + | ||
| 28674 | + /* do error checking, rate handling and logging | ||
| 28675 | + * AFTER having done the work, it's faster */ | ||
| 28676 | + | ||
| 28677 | + /* do rate handling */ | ||
| 28678 | + if (adev->rate_auto) { | ||
| 28679 | + struct client *clt = get_txc(adev, txdesc); | ||
| 28680 | + if (clt) { | ||
| 28681 | + u16 cur = get_txr(adev, txdesc); | ||
| 28682 | + if (clt->rate_cur == cur) { | ||
| 28683 | + acx_l_handle_txrate_auto(adev, clt, | ||
| 28684 | + cur, /* intended rate */ | ||
| 28685 | + r100, r111, /* actually used rate */ | ||
| 28686 | + (error & 0x30), /* was there an error? */ | ||
| 28687 | + TX_CNT + TX_CLEAN_BACKLOG - adev->tx_free); | ||
| 28688 | + } | ||
| 28689 | + } | ||
| 28690 | + } | ||
| 28691 | + | ||
| 28692 | + if (unlikely(error)) | ||
| 28693 | + handle_tx_error(adev, error, finger); | ||
| 28694 | + | ||
| 28695 | + if (IS_ACX111(adev)) | ||
| 28696 | + log(L_BUFT, "tx: cleaned %u: !ACK=%u !RTS=%u RTS=%u r111=%04X\n", | ||
| 28697 | + finger, ack_failures, rts_failures, rts_ok, r111); | ||
| 28698 | + else | ||
| 28699 | + log(L_BUFT, "tx: cleaned %u: !ACK=%u !RTS=%u RTS=%u rate=%u\n", | ||
| 28700 | + finger, ack_failures, rts_failures, rts_ok, r100); | ||
| 28701 | + | ||
| 28702 | + /* update pointer for descr to be cleaned next */ | ||
| 28703 | + finger = (finger + 1) % TX_CNT; | ||
| 28704 | + } | ||
| 28705 | + | ||
| 28706 | + /* remember last position */ | ||
| 28707 | + adev->tx_tail = finger; | ||
| 28708 | +/* end: */ | ||
| 28709 | + FN_EXIT1(num_cleaned); | ||
| 28710 | + return num_cleaned; | ||
| 28711 | +} | ||
| 28712 | + | ||
| 28713 | +/* clean *all* Tx descriptors, and regardless of their previous state. | ||
| 28714 | + * Used for brute-force reset handling. */ | ||
| 28715 | +void | ||
| 28716 | +acxpci_l_clean_txdesc_emergency(acx_device_t *adev) | ||
| 28717 | +{ | ||
| 28718 | + txdesc_t *txdesc; | ||
| 28719 | + int i; | ||
| 28720 | + | ||
| 28721 | + FN_ENTER; | ||
| 28722 | + | ||
| 28723 | + for (i = 0; i < TX_CNT; i++) { | ||
| 28724 | + txdesc = get_txdesc(adev, i); | ||
| 28725 | + | ||
| 28726 | + /* free it */ | ||
| 28727 | + txdesc->ack_failures = 0; | ||
| 28728 | + txdesc->rts_failures = 0; | ||
| 28729 | + txdesc->rts_ok = 0; | ||
| 28730 | + txdesc->error = 0; | ||
| 28731 | + txdesc->Ctl_8 = DESC_CTL_HOSTOWN; | ||
| 28732 | + } | ||
| 28733 | + | ||
| 28734 | + adev->tx_free = TX_CNT; | ||
| 28735 | + | ||
| 28736 | + FN_EXIT0; | ||
| 28737 | +} | ||
| 28738 | + | ||
| 28739 | + | ||
| 28740 | +/*********************************************************************** | ||
| 28741 | +** acxpci_s_create_tx_host_desc_queue | ||
| 28742 | +*/ | ||
| 28743 | + | ||
| 28744 | +static void* | ||
| 28745 | +allocate(acx_device_t *adev, size_t size, dma_addr_t *phy, const char *msg) | ||
| 28746 | +{ | ||
| 28747 | + void *ptr; | ||
| 28748 | + | ||
| 28749 | + ptr = dma_alloc_coherent(adev->pdev ? &adev->pdev->dev : NULL, | ||
| 28750 | + size, phy, GFP_KERNEL); | ||
| 28751 | + | ||
| 28752 | + if (ptr) { | ||
| 28753 | + log(L_DEBUG, "%s sz=%d adr=0x%p phy=0x%08llx\n", | ||
| 28754 | + msg, (int)size, ptr, (unsigned long long)*phy); | ||
| 28755 | + memset(ptr, 0, size); | ||
| 28756 | + return ptr; | ||
| 28757 | + } | ||
| 28758 | + printk(KERN_ERR "acx: %s allocation FAILED (%d bytes)\n", | ||
| 28759 | + msg, (int)size); | ||
| 28760 | + return NULL; | ||
| 28761 | +} | ||
| 28762 | + | ||
| 28763 | + | ||
| 28764 | +static int | ||
| 28765 | +acxpci_s_create_tx_host_desc_queue(acx_device_t *adev) | ||
| 28766 | +{ | ||
| 28767 | + txhostdesc_t *hostdesc; | ||
| 28768 | + u8 *txbuf; | ||
| 28769 | + dma_addr_t hostdesc_phy; | ||
| 28770 | + dma_addr_t txbuf_phy; | ||
| 28771 | + int i; | ||
| 28772 | + | ||
| 28773 | + FN_ENTER; | ||
| 28774 | + | ||
| 28775 | + /* allocate TX buffer */ | ||
| 28776 | + adev->txbuf_area_size = TX_CNT * WLAN_A4FR_MAXLEN_WEP_FCS; | ||
| 28777 | + adev->txbuf_start = allocate(adev, adev->txbuf_area_size, | ||
| 28778 | + &adev->txbuf_startphy, "txbuf_start"); | ||
| 28779 | + if (!adev->txbuf_start) | ||
| 28780 | + goto fail; | ||
| 28781 | + | ||
| 28782 | + /* allocate the TX host descriptor queue pool */ | ||
| 28783 | + adev->txhostdesc_area_size = TX_CNT * 2*sizeof(*hostdesc); | ||
| 28784 | + adev->txhostdesc_start = allocate(adev, adev->txhostdesc_area_size, | ||
| 28785 | + &adev->txhostdesc_startphy, "txhostdesc_start"); | ||
| 28786 | + if (!adev->txhostdesc_start) | ||
| 28787 | + goto fail; | ||
| 28788 | + /* check for proper alignment of TX host descriptor pool */ | ||
| 28789 | + if ((long) adev->txhostdesc_start & 3) { | ||
| 28790 | + printk("acx: driver bug: dma alloc returns unaligned address\n"); | ||
| 28791 | + goto fail; | ||
| 28792 | + } | ||
| 28793 | + | ||
| 28794 | + hostdesc = adev->txhostdesc_start; | ||
| 28795 | + hostdesc_phy = adev->txhostdesc_startphy; | ||
| 28796 | + txbuf = adev->txbuf_start; | ||
| 28797 | + txbuf_phy = adev->txbuf_startphy; | ||
| 28798 | + | ||
| 28799 | +#if 0 | ||
| 28800 | +/* Each tx buffer is accessed by hardware via | ||
| 28801 | +** txdesc -> txhostdesc(s) -> txbuffer(s). | ||
| 28802 | +** We use only one txhostdesc per txdesc, but it looks like | ||
| 28803 | +** acx111 is buggy: it accesses second txhostdesc | ||
| 28804 | +** (via hostdesc.desc_phy_next field) even if | ||
| 28805 | +** txdesc->length == hostdesc->length and thus | ||
| 28806 | +** entire packet was placed into first txhostdesc. | ||
| 28807 | +** Due to this bug acx111 hangs unless second txhostdesc | ||
| 28808 | +** has le16_to_cpu(hostdesc.length) = 3 (or larger) | ||
| 28809 | +** Storing NULL into hostdesc.desc_phy_next | ||
| 28810 | +** doesn't seem to help. | ||
| 28811 | +** | ||
| 28812 | +** Update: although it worked on Xterasys XN-2522g | ||
| 28813 | +** with len=3 trick, WG311v2 is even more bogus, doesn't work. | ||
| 28814 | +** Keeping this code (#ifdef'ed out) for documentational purposes. | ||
| 28815 | +*/ | ||
| 28816 | + for (i = 0; i < TX_CNT*2; i++) { | ||
| 28817 | + hostdesc_phy += sizeof(*hostdesc); | ||
| 28818 | + if (!(i & 1)) { | ||
| 28819 | + hostdesc->data_phy = cpu2acx(txbuf_phy); | ||
| 28820 | + /* hostdesc->data_offset = ... */ | ||
| 28821 | + /* hostdesc->reserved = ... */ | ||
| 28822 | + hostdesc->Ctl_16 = cpu_to_le16(DESC_CTL_HOSTOWN); | ||
| 28823 | + /* hostdesc->length = ... */ | ||
| 28824 | + hostdesc->desc_phy_next = cpu2acx(hostdesc_phy); | ||
| 28825 | + hostdesc->pNext = ptr2acx(NULL); | ||
| 28826 | + /* hostdesc->Status = ... */ | ||
| 28827 | + /* below: non-hardware fields */ | ||
| 28828 | + hostdesc->data = txbuf; | ||
| 28829 | + | ||
| 28830 | + txbuf += WLAN_A4FR_MAXLEN_WEP_FCS; | ||
| 28831 | + txbuf_phy += WLAN_A4FR_MAXLEN_WEP_FCS; | ||
| 28832 | + } else { | ||
| 28833 | + /* hostdesc->data_phy = ... */ | ||
| 28834 | + /* hostdesc->data_offset = ... */ | ||
| 28835 | + /* hostdesc->reserved = ... */ | ||
| 28836 | + /* hostdesc->Ctl_16 = ... */ | ||
| 28837 | + hostdesc->length = cpu_to_le16(3); /* bug workaround */ | ||
| 28838 | + /* hostdesc->desc_phy_next = ... */ | ||
| 28839 | + /* hostdesc->pNext = ... */ | ||
| 28840 | + /* hostdesc->Status = ... */ | ||
| 28841 | + /* below: non-hardware fields */ | ||
| 28842 | + /* hostdesc->data = ... */ | ||
| 28843 | + } | ||
| 28844 | + hostdesc++; | ||
| 28845 | + } | ||
| 28846 | +#endif | ||
| 28847 | +/* We initialize two hostdescs so that they point to adjacent | ||
| 28848 | +** memory areas. Thus txbuf is really just a contiguous memory area */ | ||
| 28849 | + for (i = 0; i < TX_CNT*2; i++) { | ||
| 28850 | + hostdesc_phy += sizeof(*hostdesc); | ||
| 28851 | + | ||
| 28852 | + hostdesc->data_phy = cpu2acx(txbuf_phy); | ||
| 28853 | + /* done by memset(0): hostdesc->data_offset = 0; */ | ||
| 28854 | + /* hostdesc->reserved = ... */ | ||
| 28855 | + hostdesc->Ctl_16 = cpu_to_le16(DESC_CTL_HOSTOWN); | ||
| 28856 | + /* hostdesc->length = ... */ | ||
| 28857 | + hostdesc->desc_phy_next = cpu2acx(hostdesc_phy); | ||
| 28858 | + /* done by memset(0): hostdesc->pNext = ptr2acx(NULL); */ | ||
| 28859 | + /* hostdesc->Status = ... */ | ||
| 28860 | + /* ->data is a non-hardware field: */ | ||
| 28861 | + hostdesc->data = txbuf; | ||
| 28862 | + | ||
| 28863 | + if (!(i & 1)) { | ||
| 28864 | + txbuf += WLAN_HDR_A3_LEN; | ||
| 28865 | + txbuf_phy += WLAN_HDR_A3_LEN; | ||
| 28866 | + } else { | ||
| 28867 | + txbuf += WLAN_A4FR_MAXLEN_WEP_FCS - WLAN_HDR_A3_LEN; | ||
| 28868 | + txbuf_phy += WLAN_A4FR_MAXLEN_WEP_FCS - WLAN_HDR_A3_LEN; | ||
| 28869 | + } | ||
| 28870 | + hostdesc++; | ||
| 28871 | + } | ||
| 28872 | + hostdesc--; | ||
| 28873 | + hostdesc->desc_phy_next = cpu2acx(adev->txhostdesc_startphy); | ||
| 28874 | + | ||
| 28875 | + FN_EXIT1(OK); | ||
| 28876 | + return OK; | ||
| 28877 | +fail: | ||
| 28878 | + printk("acx: create_tx_host_desc_queue FAILED\n"); | ||
| 28879 | + /* dealloc will be done by free function on error case */ | ||
| 28880 | + FN_EXIT1(NOT_OK); | ||
| 28881 | + return NOT_OK; | ||
| 28882 | +} | ||
| 28883 | + | ||
| 28884 | + | ||
| 28885 | +/*************************************************************** | ||
| 28886 | +** acxpci_s_create_rx_host_desc_queue | ||
| 28887 | +*/ | ||
| 28888 | +/* the whole size of a data buffer (header plus data body) | ||
| 28889 | + * plus 32 bytes safety offset at the end */ | ||
| 28890 | +#define RX_BUFFER_SIZE (sizeof(rxbuffer_t) + 32) | ||
| 28891 | + | ||
| 28892 | +static int | ||
| 28893 | +acxpci_s_create_rx_host_desc_queue(acx_device_t *adev) | ||
| 28894 | +{ | ||
| 28895 | + rxhostdesc_t *hostdesc; | ||
| 28896 | + rxbuffer_t *rxbuf; | ||
| 28897 | + dma_addr_t hostdesc_phy; | ||
| 28898 | + dma_addr_t rxbuf_phy; | ||
| 28899 | + int i; | ||
| 28900 | + | ||
| 28901 | + FN_ENTER; | ||
| 28902 | + | ||
| 28903 | + /* allocate the RX host descriptor queue pool */ | ||
| 28904 | + adev->rxhostdesc_area_size = RX_CNT * sizeof(*hostdesc); | ||
| 28905 | + adev->rxhostdesc_start = allocate(adev, adev->rxhostdesc_area_size, | ||
| 28906 | + &adev->rxhostdesc_startphy, "rxhostdesc_start"); | ||
| 28907 | + if (!adev->rxhostdesc_start) | ||
| 28908 | + goto fail; | ||
| 28909 | + /* check for proper alignment of RX host descriptor pool */ | ||
| 28910 | + if ((long) adev->rxhostdesc_start & 3) { | ||
| 28911 | + printk("acx: driver bug: dma alloc returns unaligned address\n"); | ||
| 28912 | + goto fail; | ||
| 28913 | + } | ||
| 28914 | + | ||
| 28915 | + /* allocate Rx buffer pool which will be used by the acx | ||
| 28916 | + * to store the whole content of the received frames in it */ | ||
| 28917 | + adev->rxbuf_area_size = RX_CNT * RX_BUFFER_SIZE; | ||
| 28918 | + adev->rxbuf_start = allocate(adev, adev->rxbuf_area_size, | ||
| 28919 | + &adev->rxbuf_startphy, "rxbuf_start"); | ||
| 28920 | + if (!adev->rxbuf_start) | ||
| 28921 | + goto fail; | ||
| 28922 | + | ||
| 28923 | + rxbuf = adev->rxbuf_start; | ||
| 28924 | + rxbuf_phy = adev->rxbuf_startphy; | ||
| 28925 | + hostdesc = adev->rxhostdesc_start; | ||
| 28926 | + hostdesc_phy = adev->rxhostdesc_startphy; | ||
| 28927 | + | ||
| 28928 | + /* don't make any popular C programming pointer arithmetic mistakes | ||
| 28929 | + * here, otherwise I'll kill you... | ||
| 28930 | + * (and don't dare asking me why I'm warning you about that...) */ | ||
| 28931 | + for (i = 0; i < RX_CNT; i++) { | ||
| 28932 | + hostdesc->data = rxbuf; | ||
| 28933 | + hostdesc->data_phy = cpu2acx(rxbuf_phy); | ||
| 28934 | + hostdesc->length = cpu_to_le16(RX_BUFFER_SIZE); | ||
| 28935 | + CLEAR_BIT(hostdesc->Ctl_16, cpu_to_le16(DESC_CTL_HOSTOWN)); | ||
| 28936 | + rxbuf++; | ||
| 28937 | + rxbuf_phy += sizeof(*rxbuf); | ||
| 28938 | + hostdesc_phy += sizeof(*hostdesc); | ||
| 28939 | + hostdesc->desc_phy_next = cpu2acx(hostdesc_phy); | ||
| 28940 | + hostdesc++; | ||
| 28941 | + } | ||
| 28942 | + hostdesc--; | ||
| 28943 | + hostdesc->desc_phy_next = cpu2acx(adev->rxhostdesc_startphy); | ||
| 28944 | + FN_EXIT1(OK); | ||
| 28945 | + return OK; | ||
| 28946 | +fail: | ||
| 28947 | + printk("acx: create_rx_host_desc_queue FAILED\n"); | ||
| 28948 | + /* dealloc will be done by free function on error case */ | ||
| 28949 | + FN_EXIT1(NOT_OK); | ||
| 28950 | + return NOT_OK; | ||
| 28951 | +} | ||
| 28952 | + | ||
| 28953 | + | ||
| 28954 | +/*************************************************************** | ||
| 28955 | +** acxpci_s_create_hostdesc_queues | ||
| 28956 | +*/ | ||
| 28957 | +int | ||
| 28958 | +acxpci_s_create_hostdesc_queues(acx_device_t *adev) | ||
| 28959 | +{ | ||
| 28960 | + int result; | ||
| 28961 | + result = acxpci_s_create_tx_host_desc_queue(adev); | ||
| 28962 | + if (OK != result) return result; | ||
| 28963 | + result = acxpci_s_create_rx_host_desc_queue(adev); | ||
| 28964 | + return result; | ||
| 28965 | +} | ||
| 28966 | + | ||
| 28967 | + | ||
| 28968 | +/*************************************************************** | ||
| 28969 | +** acxpci_create_tx_desc_queue | ||
| 28970 | +*/ | ||
| 28971 | +static void | ||
| 28972 | +acxpci_create_tx_desc_queue(acx_device_t *adev, u32 tx_queue_start) | ||
| 28973 | +{ | ||
| 28974 | + txdesc_t *txdesc; | ||
| 28975 | + txhostdesc_t *hostdesc; | ||
| 28976 | + dma_addr_t hostmemptr; | ||
| 28977 | + u32 mem_offs; | ||
| 28978 | + int i; | ||
| 28979 | + | ||
| 28980 | + FN_ENTER; | ||
| 28981 | + | ||
| 28982 | + if (IS_ACX100(adev)) | ||
| 28983 | + adev->txdesc_size = sizeof(*txdesc); | ||
| 28984 | + else | ||
| 28985 | + /* the acx111 txdesc is 4 bytes larger */ | ||
| 28986 | + adev->txdesc_size = sizeof(*txdesc) + 4; | ||
| 28987 | + | ||
| 28988 | + adev->txdesc_start = (txdesc_t *) (adev->iobase2 + tx_queue_start); | ||
| 28989 | + | ||
| 28990 | + log(L_DEBUG, "adev->iobase2=%p\n" | ||
| 28991 | + "tx_queue_start=%08X\n" | ||
| 28992 | + "adev->txdesc_start=%p\n", | ||
| 28993 | + adev->iobase2, | ||
| 28994 | + tx_queue_start, | ||
| 28995 | + adev->txdesc_start); | ||
| 28996 | + | ||
| 28997 | + adev->tx_free = TX_CNT; | ||
| 28998 | + /* done by memset: adev->tx_head = 0; */ | ||
| 28999 | + /* done by memset: adev->tx_tail = 0; */ | ||
| 29000 | + txdesc = adev->txdesc_start; | ||
| 29001 | + mem_offs = tx_queue_start; | ||
| 29002 | + hostmemptr = adev->txhostdesc_startphy; | ||
| 29003 | + hostdesc = adev->txhostdesc_start; | ||
| 29004 | + | ||
| 29005 | + if (IS_ACX111(adev)) { | ||
| 29006 | + /* ACX111 has a preinitialized Tx buffer! */ | ||
| 29007 | + /* loop over whole send pool */ | ||
| 29008 | + /* FIXME: do we have to do the hostmemptr stuff here?? */ | ||
| 29009 | + for (i = 0; i < TX_CNT; i++) { | ||
| 29010 | + txdesc->HostMemPtr = ptr2acx(hostmemptr); | ||
| 29011 | + txdesc->Ctl_8 = DESC_CTL_HOSTOWN; | ||
| 29012 | + /* reserve two (hdr desc and payload desc) */ | ||
| 29013 | + hostdesc += 2; | ||
| 29014 | + hostmemptr += 2 * sizeof(*hostdesc); | ||
| 29015 | + txdesc = advance_txdesc(adev, txdesc, 1); | ||
| 29016 | + } | ||
| 29017 | + } else { | ||
| 29018 | + /* ACX100 Tx buffer needs to be initialized by us */ | ||
| 29019 | + /* clear whole send pool. sizeof is safe here (we are acx100) */ | ||
| 29020 | + memset(adev->txdesc_start, 0, TX_CNT * sizeof(*txdesc)); | ||
| 29021 | + | ||
| 29022 | + /* loop over whole send pool */ | ||
| 29023 | + for (i = 0; i < TX_CNT; i++) { | ||
| 29024 | + log(L_DEBUG, "configure card tx descriptor: 0x%p, " | ||
| 29025 | + "size: 0x%X\n", txdesc, adev->txdesc_size); | ||
| 29026 | + | ||
| 29027 | + /* pointer to hostdesc memory */ | ||
| 29028 | + txdesc->HostMemPtr = ptr2acx(hostmemptr); | ||
| 29029 | + /* initialise ctl */ | ||
| 29030 | + txdesc->Ctl_8 = ( DESC_CTL_HOSTOWN | DESC_CTL_RECLAIM | ||
| 29031 | + | DESC_CTL_AUTODMA | DESC_CTL_FIRSTFRAG); | ||
| 29032 | + /* done by memset(0): txdesc->Ctl2_8 = 0; */ | ||
| 29033 | + /* point to next txdesc */ | ||
| 29034 | + txdesc->pNextDesc = cpu2acx(mem_offs + adev->txdesc_size); | ||
| 29035 | + /* reserve two (hdr desc and payload desc) */ | ||
| 29036 | + hostdesc += 2; | ||
| 29037 | + hostmemptr += 2 * sizeof(*hostdesc); | ||
| 29038 | + /* go to the next one */ | ||
| 29039 | + mem_offs += adev->txdesc_size; | ||
| 29040 | + /* ++ is safe here (we are acx100) */ | ||
| 29041 | + txdesc++; | ||
| 29042 | + } | ||
| 29043 | + /* go back to the last one */ | ||
| 29044 | + txdesc--; | ||
| 29045 | + /* and point to the first making it a ring buffer */ | ||
| 29046 | + txdesc->pNextDesc = cpu2acx(tx_queue_start); | ||
| 29047 | + } | ||
| 29048 | + FN_EXIT0; | ||
| 29049 | +} | ||
| 29050 | + | ||
| 29051 | + | ||
| 29052 | +/*************************************************************** | ||
| 29053 | +** acxpci_create_rx_desc_queue | ||
| 29054 | +*/ | ||
| 29055 | +static void | ||
| 29056 | +acxpci_create_rx_desc_queue(acx_device_t *adev, u32 rx_queue_start) | ||
| 29057 | +{ | ||
| 29058 | + rxdesc_t *rxdesc; | ||
| 29059 | + u32 mem_offs; | ||
| 29060 | + int i; | ||
| 29061 | + | ||
| 29062 | + FN_ENTER; | ||
| 29063 | + | ||
| 29064 | + /* done by memset: adev->rx_tail = 0; */ | ||
| 29065 | + | ||
| 29066 | + /* ACX111 doesn't need any further config: preconfigures itself. | ||
| 29067 | + * Simply print ring buffer for debugging */ | ||
| 29068 | + if (IS_ACX111(adev)) { | ||
| 29069 | + /* rxdesc_start already set here */ | ||
| 29070 | + | ||
| 29071 | + adev->rxdesc_start = (rxdesc_t *) ((u8 *)adev->iobase2 + rx_queue_start); | ||
| 29072 | + | ||
| 29073 | + rxdesc = adev->rxdesc_start; | ||
| 29074 | + for (i = 0; i < RX_CNT; i++) { | ||
| 29075 | + log(L_DEBUG, "rx descriptor %d @ 0x%p\n", i, rxdesc); | ||
| 29076 | + rxdesc = adev->rxdesc_start = (rxdesc_t *) | ||
| 29077 | + (adev->iobase2 + acx2cpu(rxdesc->pNextDesc)); | ||
| 29078 | + } | ||
| 29079 | + } else { | ||
| 29080 | + /* we didn't pre-calculate rxdesc_start in case of ACX100 */ | ||
| 29081 | + /* rxdesc_start should be right AFTER Tx pool */ | ||
| 29082 | + adev->rxdesc_start = (rxdesc_t *) | ||
| 29083 | + ((u8 *) adev->txdesc_start + (TX_CNT * sizeof(txdesc_t))); | ||
| 29084 | + /* NB: sizeof(txdesc_t) above is valid because we know | ||
| 29085 | + ** we are in if (acx100) block. Beware of cut-n-pasting elsewhere! | ||
| 29086 | + ** acx111's txdesc is larger! */ | ||
| 29087 | + | ||
| 29088 | + memset(adev->rxdesc_start, 0, RX_CNT * sizeof(*rxdesc)); | ||
| 29089 | + | ||
| 29090 | + /* loop over whole receive pool */ | ||
| 29091 | + rxdesc = adev->rxdesc_start; | ||
| 29092 | + mem_offs = rx_queue_start; | ||
| 29093 | + for (i = 0; i < RX_CNT; i++) { | ||
| 29094 | + log(L_DEBUG, "rx descriptor @ 0x%p\n", rxdesc); | ||
| 29095 | + rxdesc->Ctl_8 = DESC_CTL_RECLAIM | DESC_CTL_AUTODMA; | ||
| 29096 | + /* point to next rxdesc */ | ||
| 29097 | + rxdesc->pNextDesc = cpu2acx(mem_offs + sizeof(*rxdesc)); | ||
| 29098 | + /* go to the next one */ | ||
| 29099 | + mem_offs += sizeof(*rxdesc); | ||
| 29100 | + rxdesc++; | ||
| 29101 | + } | ||
| 29102 | + /* go to the last one */ | ||
| 29103 | + rxdesc--; | ||
| 29104 | + | ||
| 29105 | + /* and point to the first making it a ring buffer */ | ||
| 29106 | + rxdesc->pNextDesc = cpu2acx(rx_queue_start); | ||
| 29107 | + } | ||
| 29108 | + FN_EXIT0; | ||
| 29109 | +} | ||
| 29110 | + | ||
| 29111 | + | ||
| 29112 | +/*************************************************************** | ||
| 29113 | +** acxpci_create_desc_queues | ||
| 29114 | +*/ | ||
| 29115 | +void | ||
| 29116 | +acxpci_create_desc_queues(acx_device_t *adev, u32 tx_queue_start, u32 rx_queue_start) | ||
| 29117 | +{ | ||
| 29118 | + acxpci_create_tx_desc_queue(adev, tx_queue_start); | ||
| 29119 | + acxpci_create_rx_desc_queue(adev, rx_queue_start); | ||
| 29120 | +} | ||
| 29121 | + | ||
| 29122 | + | ||
| 29123 | +/*************************************************************** | ||
| 29124 | +** acxpci_s_proc_diag_output | ||
| 29125 | +*/ | ||
| 29126 | +char* | ||
| 29127 | +acxpci_s_proc_diag_output(char *p, acx_device_t *adev) | ||
| 29128 | +{ | ||
| 29129 | + const char *rtl, *thd, *ttl; | ||
| 29130 | + rxhostdesc_t *rxhostdesc; | ||
| 29131 | + txdesc_t *txdesc; | ||
| 29132 | + int i; | ||
| 29133 | + | ||
| 29134 | + FN_ENTER; | ||
| 29135 | + | ||
| 29136 | + p += sprintf(p, "** Rx buf **\n"); | ||
| 29137 | + rxhostdesc = adev->rxhostdesc_start; | ||
| 29138 | + if (rxhostdesc) for (i = 0; i < RX_CNT; i++) { | ||
| 29139 | + rtl = (i == adev->rx_tail) ? " [tail]" : ""; | ||
| 29140 | + if ((rxhostdesc->Ctl_16 & cpu_to_le16(DESC_CTL_HOSTOWN)) | ||
| 29141 | + && (rxhostdesc->Status & cpu_to_le32(DESC_STATUS_FULL)) ) | ||
| 29142 | + p += sprintf(p, "%02u FULL%s\n", i, rtl); | ||
| 29143 | + else | ||
| 29144 | + p += sprintf(p, "%02u empty%s\n", i, rtl); | ||
| 29145 | + rxhostdesc++; | ||
| 29146 | + } | ||
| 29147 | + p += sprintf(p, "** Tx buf (free %d, Linux netqueue %s) **\n", adev->tx_free, | ||
| 29148 | + acx_queue_stopped(adev->ndev) ? "STOPPED" : "running"); | ||
| 29149 | + txdesc = adev->txdesc_start; | ||
| 29150 | + if (txdesc) for (i = 0; i < TX_CNT; i++) { | ||
| 29151 | + thd = (i == adev->tx_head) ? " [head]" : ""; | ||
| 29152 | + ttl = (i == adev->tx_tail) ? " [tail]" : ""; | ||
| 29153 | + if (txdesc->Ctl_8 & DESC_CTL_ACXDONE) | ||
| 29154 | + p += sprintf(p, "%02u free (%02X)%s%s\n", i, txdesc->Ctl_8, thd, ttl); | ||
| 29155 | + else | ||
| 29156 | + p += sprintf(p, "%02u tx (%02X)%s%s\n", i, txdesc->Ctl_8, thd, ttl); | ||
| 29157 | + txdesc = advance_txdesc(adev, txdesc, 1); | ||
| 29158 | + } | ||
| 29159 | + p += sprintf(p, | ||
| 29160 | + "\n" | ||
| 29161 | + "** PCI data **\n" | ||
| 29162 | + "txbuf_start %p, txbuf_area_size %u, txbuf_startphy %08llx\n" | ||
| 29163 | + "txdesc_size %u, txdesc_start %p\n" | ||
| 29164 | + "txhostdesc_start %p, txhostdesc_area_size %u, txhostdesc_startphy %08llx\n" | ||
| 29165 | + "rxdesc_start %p\n" | ||
| 29166 | + "rxhostdesc_start %p, rxhostdesc_area_size %u, rxhostdesc_startphy %08llx\n" | ||
| 29167 | + "rxbuf_start %p, rxbuf_area_size %u, rxbuf_startphy %08llx\n", | ||
| 29168 | + adev->txbuf_start, adev->txbuf_area_size, | ||
| 29169 | + (unsigned long long)adev->txbuf_startphy, | ||
| 29170 | + adev->txdesc_size, adev->txdesc_start, | ||
| 29171 | + adev->txhostdesc_start, adev->txhostdesc_area_size, | ||
| 29172 | + (unsigned long long)adev->txhostdesc_startphy, | ||
| 29173 | + adev->rxdesc_start, | ||
| 29174 | + adev->rxhostdesc_start, adev->rxhostdesc_area_size, | ||
| 29175 | + (unsigned long long)adev->rxhostdesc_startphy, | ||
| 29176 | + adev->rxbuf_start, adev->rxbuf_area_size, | ||
| 29177 | + (unsigned long long)adev->rxbuf_startphy); | ||
| 29178 | + | ||
| 29179 | + FN_EXIT0; | ||
| 29180 | + return p; | ||
| 29181 | +} | ||
| 29182 | + | ||
| 29183 | + | ||
| 29184 | +/*********************************************************************** | ||
| 29185 | +*/ | ||
| 29186 | +int | ||
| 29187 | +acxpci_proc_eeprom_output(char *buf, acx_device_t *adev) | ||
| 29188 | +{ | ||
| 29189 | + char *p = buf; | ||
| 29190 | + int i; | ||
| 29191 | + | ||
| 29192 | + FN_ENTER; | ||
| 29193 | + | ||
| 29194 | + for (i = 0; i < 0x400; i++) { | ||
| 29195 | + acxpci_read_eeprom_byte(adev, i, p++); | ||
| 29196 | + } | ||
| 29197 | + | ||
| 29198 | + FN_EXIT1(p - buf); | ||
| 29199 | + return p - buf; | ||
| 29200 | +} | ||
| 29201 | + | ||
| 29202 | + | ||
| 29203 | +/*********************************************************************** | ||
| 29204 | +*/ | ||
| 29205 | +void | ||
| 29206 | +acxpci_set_interrupt_mask(acx_device_t *adev) | ||
| 29207 | +{ | ||
| 29208 | + if (IS_ACX111(adev)) { | ||
| 29209 | + adev->irq_mask = (u16) ~(0 | ||
| 29210 | + /* | HOST_INT_RX_DATA */ | ||
| 29211 | + | HOST_INT_TX_COMPLETE | ||
| 29212 | + /* | HOST_INT_TX_XFER */ | ||
| 29213 | + | HOST_INT_RX_COMPLETE | ||
| 29214 | + /* | HOST_INT_DTIM */ | ||
| 29215 | + /* | HOST_INT_BEACON */ | ||
| 29216 | + /* | HOST_INT_TIMER */ | ||
| 29217 | + /* | HOST_INT_KEY_NOT_FOUND */ | ||
| 29218 | + | HOST_INT_IV_ICV_FAILURE | ||
| 29219 | + | HOST_INT_CMD_COMPLETE | ||
| 29220 | + | HOST_INT_INFO | ||
| 29221 | + /* | HOST_INT_OVERFLOW */ | ||
| 29222 | + /* | HOST_INT_PROCESS_ERROR */ | ||
| 29223 | + | HOST_INT_SCAN_COMPLETE | ||
| 29224 | + | HOST_INT_FCS_THRESHOLD | ||
| 29225 | + /* | HOST_INT_UNKNOWN */ | ||
| 29226 | + ); | ||
| 29227 | + /* Or else acx100 won't signal cmd completion, right? */ | ||
| 29228 | + adev->irq_mask_off = (u16)~( HOST_INT_CMD_COMPLETE ); /* 0xfdff */ | ||
| 29229 | + } else { | ||
| 29230 | + adev->irq_mask = (u16) ~(0 | ||
| 29231 | + /* | HOST_INT_RX_DATA */ | ||
| 29232 | + | HOST_INT_TX_COMPLETE | ||
| 29233 | + /* | HOST_INT_TX_XFER */ | ||
| 29234 | + | HOST_INT_RX_COMPLETE | ||
| 29235 | + /* | HOST_INT_DTIM */ | ||
| 29236 | + /* | HOST_INT_BEACON */ | ||
| 29237 | + /* | HOST_INT_TIMER */ | ||
| 29238 | + /* | HOST_INT_KEY_NOT_FOUND */ | ||
| 29239 | + /* | HOST_INT_IV_ICV_FAILURE */ | ||
| 29240 | + | HOST_INT_CMD_COMPLETE | ||
| 29241 | + | HOST_INT_INFO | ||
| 29242 | + /* | HOST_INT_OVERFLOW */ | ||
| 29243 | + /* | HOST_INT_PROCESS_ERROR */ | ||
| 29244 | + | HOST_INT_SCAN_COMPLETE | ||
| 29245 | + /* | HOST_INT_FCS_THRESHOLD */ | ||
| 29246 | + /* | HOST_INT_UNKNOWN */ | ||
| 29247 | + ); | ||
| 29248 | + adev->irq_mask_off = (u16)~( HOST_INT_UNKNOWN ); /* 0x7fff */ | ||
| 29249 | + } | ||
| 29250 | +} | ||
| 29251 | + | ||
| 29252 | + | ||
| 29253 | +/*********************************************************************** | ||
| 29254 | +*/ | ||
| 29255 | +int | ||
| 29256 | +acx100pci_s_set_tx_level(acx_device_t *adev, u8 level_dbm) | ||
| 29257 | +{ | ||
| 29258 | + /* since it can be assumed that at least the Maxim radio has a | ||
| 29259 | + * maximum power output of 20dBm and since it also can be | ||
| 29260 | + * assumed that these values drive the DAC responsible for | ||
| 29261 | + * setting the linear Tx level, I'd guess that these values | ||
| 29262 | + * should be the corresponding linear values for a dBm value, | ||
| 29263 | + * in other words: calculate the values from that formula: | ||
| 29264 | + * Y [dBm] = 10 * log (X [mW]) | ||
| 29265 | + * then scale the 0..63 value range onto the 1..100mW range (0..20 dBm) | ||
| 29266 | + * and you're done... | ||
| 29267 | + * Hopefully that's ok, but you never know if we're actually | ||
| 29268 | + * right... (especially since Windows XP doesn't seem to show | ||
| 29269 | + * actual Tx dBm values :-P) */ | ||
| 29270 | + | ||
| 29271 | + /* NOTE: on Maxim, value 30 IS 30mW, and value 10 IS 10mW - so the | ||
| 29272 | + * values are EXACTLY mW!!! Not sure about RFMD and others, | ||
| 29273 | + * though... */ | ||
| 29274 | + static const u8 dbm2val_maxim[21] = { | ||
| 29275 | + 63, 63, 63, 62, | ||
| 29276 | + 61, 61, 60, 60, | ||
| 29277 | + 59, 58, 57, 55, | ||
| 29278 | + 53, 50, 47, 43, | ||
| 29279 | + 38, 31, 23, 13, | ||
| 29280 | + 0 | ||
| 29281 | + }; | ||
| 29282 | + static const u8 dbm2val_rfmd[21] = { | ||
| 29283 | + 0, 0, 0, 1, | ||
| 29284 | + 2, 2, 3, 3, | ||
| 29285 | + 4, 5, 6, 8, | ||
| 29286 | + 10, 13, 16, 20, | ||
| 29287 | + 25, 32, 41, 50, | ||
| 29288 | + 63 | ||
| 29289 | + }; | ||
| 29290 | + const u8 *table; | ||
| 29291 | + | ||
| 29292 | + switch (adev->radio_type) { | ||
| 29293 | + case RADIO_MAXIM_0D: | ||
| 29294 | + table = &dbm2val_maxim[0]; | ||
| 29295 | + break; | ||
| 29296 | + case RADIO_RFMD_11: | ||
| 29297 | + case RADIO_RALINK_15: | ||
| 29298 | + table = &dbm2val_rfmd[0]; | ||
| 29299 | + break; | ||
| 29300 | + default: | ||
| 29301 | + printk("%s: unknown/unsupported radio type, " | ||
| 29302 | + "cannot modify tx power level yet!\n", | ||
| 29303 | + adev->ndev->name); | ||
| 29304 | + return NOT_OK; | ||
| 29305 | + } | ||
| 29306 | + printk("%s: changing radio power level to %u dBm (%u)\n", | ||
| 29307 | + adev->ndev->name, level_dbm, table[level_dbm]); | ||
| 29308 | + acxpci_s_write_phy_reg(adev, 0x11, table[level_dbm]); | ||
| 29309 | + return OK; | ||
| 29310 | +} | ||
| 29311 | + | ||
| 29312 | + | ||
| 29313 | +/*********************************************************************** | ||
| 29314 | +** Data for init_module/cleanup_module | ||
| 29315 | +*/ | ||
| 29316 | +static const struct pci_device_id | ||
| 29317 | +acxpci_id_tbl[] __devinitdata = { | ||
| 29318 | + { | ||
| 29319 | + .vendor = PCI_VENDOR_ID_TI, | ||
| 29320 | + .device = PCI_DEVICE_ID_TI_TNETW1100A, | ||
| 29321 | + .subvendor = PCI_ANY_ID, | ||
| 29322 | + .subdevice = PCI_ANY_ID, | ||
| 29323 | + .driver_data = CHIPTYPE_ACX100, | ||
| 29324 | + }, | ||
| 29325 | + { | ||
| 29326 | + .vendor = PCI_VENDOR_ID_TI, | ||
| 29327 | + .device = PCI_DEVICE_ID_TI_TNETW1100B, | ||
| 29328 | + .subvendor = PCI_ANY_ID, | ||
| 29329 | + .subdevice = PCI_ANY_ID, | ||
| 29330 | + .driver_data = CHIPTYPE_ACX100, | ||
| 29331 | + }, | ||
| 29332 | + { | ||
| 29333 | + .vendor = PCI_VENDOR_ID_TI, | ||
| 29334 | + .device = PCI_DEVICE_ID_TI_TNETW1130, | ||
| 29335 | + .subvendor = PCI_ANY_ID, | ||
| 29336 | + .subdevice = PCI_ANY_ID, | ||
| 29337 | + .driver_data = CHIPTYPE_ACX111, | ||
| 29338 | + }, | ||
| 29339 | + { | ||
| 29340 | + .vendor = 0, | ||
| 29341 | + .device = 0, | ||
| 29342 | + .subvendor = 0, | ||
| 29343 | + .subdevice = 0, | ||
| 29344 | + .driver_data = 0, | ||
| 29345 | + } | ||
| 29346 | +}; | ||
| 29347 | + | ||
| 29348 | +MODULE_DEVICE_TABLE(pci, acxpci_id_tbl); | ||
| 29349 | + | ||
| 29350 | +/* FIXME: checks should be removed once driver is included in the kernel */ | ||
| 29351 | +#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 11) | ||
| 29352 | +/* pci_name() got introduced at start of 2.6.x, | ||
| 29353 | + * got mandatory (slot_name member removed) in 2.6.11-bk1 */ | ||
| 29354 | +#define pci_name(x) x->slot_name | ||
| 29355 | +#endif | ||
| 29356 | + | ||
| 29357 | +static struct pci_driver | ||
| 29358 | +acxpci_drv_id = { | ||
| 29359 | + .name = "acx_pci", | ||
| 29360 | + .id_table = acxpci_id_tbl, | ||
| 29361 | + .probe = acxpci_e_probe, | ||
| 29362 | + .remove = __devexit_p(acxpci_e_remove), | ||
| 29363 | +#ifdef CONFIG_PM | ||
| 29364 | + .suspend = acxpci_e_suspend, | ||
| 29365 | + .resume = acxpci_e_resume | ||
| 29366 | +#endif /* CONFIG_PM */ | ||
| 29367 | +}; | ||
| 29368 | + | ||
| 29369 | + | ||
| 29370 | +/*********************************************************************** | ||
| 29371 | +** acxpci_e_init_module | ||
| 29372 | +** | ||
| 29373 | +** Module initialization routine, called once at module load time | ||
| 29374 | +*/ | ||
| 29375 | +int __init | ||
| 29376 | +acxpci_e_init_module(void) | ||
| 29377 | +{ | ||
| 29378 | + int res; | ||
| 29379 | + | ||
| 29380 | + FN_ENTER; | ||
| 29381 | + | ||
| 29382 | +#if (ACX_IO_WIDTH==32) | ||
| 29383 | + printk("acx: compiled to use 32bit I/O access. " | ||
| 29384 | + "I/O timing issues might occur, such as " | ||
| 29385 | + "non-working firmware upload. Report them\n"); | ||
| 29386 | +#else | ||
| 29387 | + printk("acx: compiled to use 16bit I/O access only " | ||
| 29388 | + "(compatibility mode)\n"); | ||
| 29389 | +#endif | ||
| 29390 | + | ||
| 29391 | +#ifdef __LITTLE_ENDIAN | ||
| 29392 | +#define ENDIANNESS_STRING "running on a little-endian CPU\n" | ||
| 29393 | +#else | ||
| 29394 | +#define ENDIANNESS_STRING "running on a BIG-ENDIAN CPU\n" | ||
| 29395 | +#endif | ||
| 29396 | + log(L_INIT, | ||
| 29397 | + ENDIANNESS_STRING | ||
| 29398 | + "PCI module " ACX_RELEASE " initialized, " | ||
| 29399 | + "waiting for cards to probe...\n" | ||
| 29400 | + ); | ||
| 29401 | + | ||
| 29402 | + res = pci_register_driver(&acxpci_drv_id); | ||
| 29403 | + FN_EXIT1(res); | ||
| 29404 | + return res; | ||
| 29405 | +} | ||
| 29406 | + | ||
| 29407 | + | ||
| 29408 | +/*********************************************************************** | ||
| 29409 | +** acxpci_e_cleanup_module | ||
| 29410 | +** | ||
| 29411 | +** Called at module unload time. This is our last chance to | ||
| 29412 | +** clean up after ourselves. | ||
| 29413 | +*/ | ||
| 29414 | +void __exit | ||
| 29415 | +acxpci_e_cleanup_module(void) | ||
| 29416 | +{ | ||
| 29417 | + FN_ENTER; | ||
| 29418 | + | ||
| 29419 | + pci_unregister_driver(&acxpci_drv_id); | ||
| 29420 | + | ||
| 29421 | + FN_EXIT0; | ||
| 29422 | +} | ||
| 29423 | Index: linux-2.6.23/drivers/net/wireless/acx/rx3000_acx.c | ||
| 29424 | =================================================================== | ||
| 29425 | --- /dev/null 1970-01-01 00:00:00.000000000 +0000 | ||
| 29426 | +++ linux-2.6.23/drivers/net/wireless/acx/rx3000_acx.c 2008-01-20 21:13:40.000000000 +0000 | ||
| 29427 | @@ -0,0 +1,110 @@ | ||
| 29428 | +/* | ||
| 29429 | + * WLAN (TI TNETW1100B) support in the HP iPAQ RX3000 | ||
| 29430 | + * | ||
| 29431 | + * Copyright (c) 2006 SDG Systems, LLC | ||
| 29432 | + * Copyright (c) 2006 Roman Moravcik | ||
| 29433 | + * | ||
| 29434 | + * This file is subject to the terms and conditions of the GNU General Public | ||
| 29435 | + * License. See the file COPYING in the main directory of this archive for | ||
| 29436 | + * more details. | ||
| 29437 | + * | ||
| 29438 | + * Based on hx4700_acx.c | ||
| 29439 | + */ | ||
| 29440 | + | ||
| 29441 | + | ||
| 29442 | +#include <linux/kernel.h> | ||
| 29443 | +#include <linux/platform_device.h> | ||
| 29444 | +#include <linux/delay.h> | ||
| 29445 | +#include <linux/dpm.h> | ||
| 29446 | +#include <linux/leds.h> | ||
| 29447 | + | ||
| 29448 | +#include <asm/hardware.h> | ||
| 29449 | + | ||
| 29450 | +#include <asm/arch/regs-gpio.h> | ||
| 29451 | +#include <linux/mfd/asic3_base.h> | ||
| 29452 | +#include <asm/arch/rx3000.h> | ||
| 29453 | +#include <asm/arch/rx3000-asic3.h> | ||
| 29454 | +#include <asm/io.h> | ||
| 29455 | + | ||
| 29456 | +#include "acx_hw.h" | ||
| 29457 | + | ||
| 29458 | +extern struct platform_device s3c_device_asic3; | ||
| 29459 | + | ||
| 29460 | +static int rx3000_wlan_start(void) | ||
| 29461 | +{ | ||
| 29462 | + DPM_DEBUG("rx3000_acx: Turning on\n"); | ||
| 29463 | + asic3_set_gpio_out_b(&s3c_device_asic3.dev, ASIC3_GPB3, ASIC3_GPB3); | ||
| 29464 | + mdelay(20); | ||
| 29465 | + asic3_set_gpio_out_c(&s3c_device_asic3.dev, ASIC3_GPC13, ASIC3_GPC13); | ||
| 29466 | + mdelay(20); | ||
| 29467 | + asic3_set_gpio_out_c(&s3c_device_asic3.dev, ASIC3_GPC11, ASIC3_GPC11); | ||
| 29468 | + mdelay(100); | ||
| 29469 | + asic3_set_gpio_out_b(&s3c_device_asic3.dev, ASIC3_GPB3, ASIC3_GPB3); | ||
| 29470 | + mdelay(20); | ||
| 29471 | + s3c2410_gpio_cfgpin(S3C2410_GPA15, S3C2410_GPA15_nGCS4); | ||
| 29472 | + mdelay(100); | ||
| 29473 | + s3c2410_gpio_setpin(S3C2410_GPA11, 0); | ||
| 29474 | + mdelay(50); | ||
| 29475 | + s3c2410_gpio_setpin(S3C2410_GPA11, 1); | ||
| 29476 | + led_trigger_event_shared(rx3000_radio_trig, LED_FULL); | ||
| 29477 | + return 0; | ||
| 29478 | +} | ||
| 29479 | + | ||
| 29480 | +static int rx3000_wlan_stop(void) | ||
| 29481 | +{ | ||
| 29482 | + DPM_DEBUG("rx3000_acx: Turning off\n"); | ||
| 29483 | + s3c2410_gpio_setpin(S3C2410_GPA15, 1); | ||
| 29484 | + s3c2410_gpio_cfgpin(S3C2410_GPA15, S3C2410_GPA15_OUT); | ||
| 29485 | + asic3_set_gpio_out_b(&s3c_device_asic3.dev, ASIC3_GPB3, 0); | ||
| 29486 | + asic3_set_gpio_out_c(&s3c_device_asic3.dev, ASIC3_GPC13, 0); | ||
| 29487 | + asic3_set_gpio_out_c(&s3c_device_asic3.dev, ASIC3_GPC11, 0); | ||
| 29488 | + led_trigger_event_shared(rx3000_radio_trig, LED_OFF); | ||
| 29489 | + return 0; | ||
| 29490 | +} | ||
| 29491 | + | ||
| 29492 | +static struct resource acx_resources[] = { | ||
| 29493 | + [0] = { | ||
| 29494 | + .start = RX3000_PA_WLAN, | ||
| 29495 | + .end = RX3000_PA_WLAN + 0x20, | ||
| 29496 | + .flags = IORESOURCE_MEM, | ||
| 29497 | + }, | ||
| 29498 | + [1] = { | ||
| 29499 | + .start = IRQ_EINT16, | ||
| 29500 | + .end = IRQ_EINT16, | ||
| 29501 | + .flags = IORESOURCE_IRQ, | ||
| 29502 | + }, | ||
| 29503 | +}; | ||
| 29504 | + | ||
| 29505 | +static struct acx_hardware_data acx_data = { | ||
| 29506 | + .start_hw = rx3000_wlan_start, | ||
| 29507 | + .stop_hw = rx3000_wlan_stop, | ||
| 29508 | +}; | ||
| 29509 | + | ||
| 29510 | +static struct platform_device acx_device = { | ||
| 29511 | + .name = "acx-mem", | ||
| 29512 | + .dev = { | ||
| 29513 | + .platform_data = &acx_data, | ||
| 29514 | + }, | ||
| 29515 | + .num_resources = ARRAY_SIZE(acx_resources), | ||
| 29516 | + .resource = acx_resources, | ||
| 29517 | +}; | ||
| 29518 | + | ||
| 29519 | +static int __init rx3000_wlan_init(void) | ||
| 29520 | +{ | ||
| 29521 | + printk("rx3000_wlan_init: acx-mem platform_device_register\n"); | ||
| 29522 | + return platform_device_register(&acx_device); | ||
| 29523 | +} | ||
| 29524 | + | ||
| 29525 | + | ||
| 29526 | +static void __exit rx3000_wlan_exit(void) | ||
| 29527 | +{ | ||
| 29528 | + platform_device_unregister(&acx_device); | ||
| 29529 | +} | ||
| 29530 | + | ||
| 29531 | +module_init(rx3000_wlan_init); | ||
| 29532 | +module_exit(rx3000_wlan_exit); | ||
| 29533 | + | ||
| 29534 | +MODULE_AUTHOR("Todd Blumer <todd@sdgsystems.com>, Roman Moravcik <roman.moravcik@gmail.com>"); | ||
| 29535 | +MODULE_DESCRIPTION("WLAN driver for HP iPAQ RX3000"); | ||
| 29536 | +MODULE_LICENSE("GPL"); | ||
| 29537 | + | ||
| 29538 | Index: linux-2.6.23/drivers/net/wireless/acx/setrate.c | ||
| 29539 | =================================================================== | ||
| 29540 | --- /dev/null 1970-01-01 00:00:00.000000000 +0000 | ||
| 29541 | +++ linux-2.6.23/drivers/net/wireless/acx/setrate.c 2008-01-20 21:13:40.000000000 +0000 | ||
| 29542 | @@ -0,0 +1,213 @@ | ||
| 29543 | +/* TODO: stop #including, move into wireless.c | ||
| 29544 | + * until then, keep in sync copies in prism54/ and acx/ dirs | ||
| 29545 | + * code+data size: less than 1k */ | ||
| 29546 | + | ||
| 29547 | +enum { | ||
| 29548 | + DOT11_RATE_1, | ||
| 29549 | + DOT11_RATE_2, | ||
| 29550 | + DOT11_RATE_5, | ||
| 29551 | + DOT11_RATE_11, | ||
| 29552 | + DOT11_RATE_22, | ||
| 29553 | + DOT11_RATE_33, | ||
| 29554 | + DOT11_RATE_6, | ||
| 29555 | + DOT11_RATE_9, | ||
| 29556 | + DOT11_RATE_12, | ||
| 29557 | + DOT11_RATE_18, | ||
| 29558 | + DOT11_RATE_24, | ||
| 29559 | + DOT11_RATE_36, | ||
| 29560 | + DOT11_RATE_48, | ||
| 29561 | + DOT11_RATE_54 | ||
| 29562 | +}; | ||
| 29563 | +enum { | ||
| 29564 | + DOT11_MOD_DBPSK, | ||
| 29565 | + DOT11_MOD_DQPSK, | ||
| 29566 | + DOT11_MOD_CCK, | ||
| 29567 | + DOT11_MOD_OFDM, | ||
| 29568 | + DOT11_MOD_CCKOFDM, | ||
| 29569 | + DOT11_MOD_PBCC | ||
| 29570 | +}; | ||
| 29571 | +static const u8 ratelist[] = { 1,2,5,11,22,33,6,9,12,18,24,36,48,54 }; | ||
| 29572 | +static const u8 dot11ratebyte[] = { 1*2,2*2,11,11*2,22*2,33*2,6*2,9*2,12*2,18*2,24*2,36*2,48*2,54*2 }; | ||
| 29573 | +static const u8 default_modulation[] = { | ||
| 29574 | + DOT11_MOD_DBPSK, | ||
| 29575 | + DOT11_MOD_DQPSK, | ||
| 29576 | + DOT11_MOD_CCK, | ||
| 29577 | + DOT11_MOD_CCK, | ||
| 29578 | + DOT11_MOD_PBCC, | ||
| 29579 | + DOT11_MOD_PBCC, | ||
| 29580 | + DOT11_MOD_OFDM, | ||
| 29581 | + DOT11_MOD_OFDM, | ||
| 29582 | + DOT11_MOD_OFDM, | ||
| 29583 | + DOT11_MOD_OFDM, | ||
| 29584 | + DOT11_MOD_OFDM, | ||
| 29585 | + DOT11_MOD_OFDM, | ||
| 29586 | + DOT11_MOD_OFDM, | ||
| 29587 | + DOT11_MOD_OFDM | ||
| 29588 | +}; | ||
| 29589 | + | ||
| 29590 | +static /* TODO: remove 'static' when moved to wireless.c */ | ||
| 29591 | +int | ||
| 29592 | +rate_mbit2enum(int n) { | ||
| 29593 | + int i=0; | ||
| 29594 | + while(i<sizeof(ratelist)) { | ||
| 29595 | + if(n==ratelist[i]) return i; | ||
| 29596 | + i++; | ||
| 29597 | + } | ||
| 29598 | + return -EINVAL; | ||
| 29599 | +} | ||
| 29600 | + | ||
| 29601 | +static int | ||
| 29602 | +get_modulation(int r_enum, char suffix) { | ||
| 29603 | + if(suffix==',' || suffix==' ' || suffix=='\0') { | ||
| 29604 | + /* could shorten default_mod by 8 bytes: | ||
| 29605 | + if(r_enum>=DOT11_RATE_6) return DOT11_MOD_OFDM; */ | ||
| 29606 | + return default_modulation[r_enum]; | ||
| 29607 | + } | ||
| 29608 | + if(suffix=='c') { | ||
| 29609 | + if(r_enum<DOT11_RATE_5 || r_enum>DOT11_RATE_11) return -EINVAL; | ||
| 29610 | + return DOT11_MOD_CCK; | ||
| 29611 | + } | ||
| 29612 | + if(suffix=='p') { | ||
| 29613 | + if(r_enum<DOT11_RATE_5 || r_enum>DOT11_RATE_33) return -EINVAL; | ||
| 29614 | + return DOT11_MOD_PBCC; | ||
| 29615 | + } | ||
| 29616 | + if(suffix=='o') { | ||
| 29617 | + if(r_enum<DOT11_RATE_6) return -EINVAL; | ||
| 29618 | + return DOT11_MOD_OFDM; | ||
| 29619 | + } | ||
| 29620 | + if(suffix=='d') { | ||
| 29621 | + if(r_enum<DOT11_RATE_6) return -EINVAL; | ||
| 29622 | + return DOT11_MOD_CCKOFDM; | ||
| 29623 | + } | ||
| 29624 | + return -EINVAL; | ||
| 29625 | +} | ||
| 29626 | + | ||
| 29627 | +#ifdef UNUSED | ||
| 29628 | +static int | ||
| 29629 | +fill_ratevector(const char **pstr, u8 *vector, int size, | ||
| 29630 | + int (*supported)(int mbit, int mod, void *opaque), void *opaque, int or_mask) | ||
| 29631 | +{ | ||
| 29632 | + unsigned long rate_mbit; | ||
| 29633 | + int rate_enum,mod; | ||
| 29634 | + const char *str = *pstr; | ||
| 29635 | + char c; | ||
| 29636 | + | ||
| 29637 | + do { | ||
| 29638 | + rate_mbit = simple_strtoul(str, (char**)&str, 10); | ||
| 29639 | + if(rate_mbit>INT_MAX) return -EINVAL; | ||
| 29640 | + | ||
| 29641 | + rate_enum = rate_mbit2enum(rate_mbit); | ||
| 29642 | + if(rate_enum<0) return rate_enum; | ||
| 29643 | + | ||
| 29644 | + c = *str; | ||
| 29645 | + mod = get_modulation(rate_enum, c); | ||
| 29646 | + if(mod<0) return mod; | ||
| 29647 | + | ||
| 29648 | + if(c>='a' && c<='z') c = *++str; | ||
| 29649 | + if(c!=',' && c!=' ' && c!='\0') return -EINVAL; | ||
| 29650 | + | ||
| 29651 | + if(supported) { | ||
| 29652 | + int r = supported(rate_mbit, mod, opaque); | ||
| 29653 | + if(r) return r; | ||
| 29654 | + } | ||
| 29655 | + | ||
| 29656 | + *vector++ = dot11ratebyte[rate_enum] | or_mask; | ||
| 29657 | + | ||
| 29658 | + size--; | ||
| 29659 | + str++; | ||
| 29660 | + } while(size>0 && c==','); | ||
| 29661 | + | ||
| 29662 | + if(size<1) return -E2BIG; | ||
| 29663 | + *vector=0; /* TODO: sort, remove dups? */ | ||
| 29664 | + | ||
| 29665 | + *pstr = str-1; | ||
| 29666 | + return 0; | ||
| 29667 | +} | ||
| 29668 | + | ||
| 29669 | +static /* TODO: remove 'static' when moved to wireless.c */ | ||
| 29670 | +int | ||
| 29671 | +fill_ratevectors(const char *str, u8 *brate, u8 *orate, int size, | ||
| 29672 | + int (*supported)(int mbit, int mod, void *opaque), void *opaque) | ||
| 29673 | +{ | ||
| 29674 | + int r; | ||
| 29675 | + | ||
| 29676 | + r = fill_ratevector(&str, brate, size, supported, opaque, 0x80); | ||
| 29677 | + if(r) return r; | ||
| 29678 | + | ||
| 29679 | + orate[0] = 0; | ||
| 29680 | + if(*str==' ') { | ||
| 29681 | + str++; | ||
| 29682 | + r = fill_ratevector(&str, orate, size, supported, opaque, 0); | ||
| 29683 | + if(r) return r; | ||
| 29684 | + /* TODO: sanitize, e.g. remove/error on rates already in basic rate set? */ | ||
| 29685 | + } | ||
| 29686 | + if(*str) | ||
| 29687 | + return -EINVAL; | ||
| 29688 | + | ||
| 29689 | + return 0; | ||
| 29690 | +} | ||
| 29691 | +#endif | ||
| 29692 | + | ||
| 29693 | +/* TODO: use u64 masks? */ | ||
| 29694 | + | ||
| 29695 | +static int | ||
| 29696 | +fill_ratemask(const char **pstr, u32* mask, | ||
| 29697 | + int (*supported)(int mbit, int mod,void *opaque), | ||
| 29698 | + u32 (*gen_mask)(int mbit, int mod,void *opaque), | ||
| 29699 | + void *opaque) | ||
| 29700 | +{ | ||
| 29701 | + unsigned long rate_mbit; | ||
| 29702 | + int rate_enum,mod; | ||
| 29703 | + u32 m = 0; | ||
| 29704 | + const char *str = *pstr; | ||
| 29705 | + char c; | ||
| 29706 | + | ||
| 29707 | + do { | ||
| 29708 | + rate_mbit = simple_strtoul(str, (char**)&str, 10); | ||
| 29709 | + if(rate_mbit>INT_MAX) return -EINVAL; | ||
| 29710 | + | ||
| 29711 | + rate_enum = rate_mbit2enum(rate_mbit); | ||
| 29712 | + if(rate_enum<0) return rate_enum; | ||
| 29713 | + | ||
| 29714 | + c = *str; | ||
| 29715 | + mod = get_modulation(rate_enum, c); | ||
| 29716 | + if(mod<0) return mod; | ||
| 29717 | + | ||
| 29718 | + if(c>='a' && c<='z') c = *++str; | ||
| 29719 | + if(c!=',' && c!=' ' && c!='\0') return -EINVAL; | ||
| 29720 | + | ||
| 29721 | + if(supported) { | ||
| 29722 | + int r = supported(rate_mbit, mod, opaque); | ||
| 29723 | + if(r) return r; | ||
| 29724 | + } | ||
| 29725 | + | ||
| 29726 | + m |= gen_mask(rate_mbit, mod, opaque); | ||
| 29727 | + str++; | ||
| 29728 | + } while(c==','); | ||
| 29729 | + | ||
| 29730 | + *pstr = str-1; | ||
| 29731 | + *mask |= m; | ||
| 29732 | + return 0; | ||
| 29733 | +} | ||
| 29734 | + | ||
| 29735 | +static /* TODO: remove 'static' when moved to wireless.c */ | ||
| 29736 | +int | ||
| 29737 | +fill_ratemasks(const char *str, u32 *bmask, u32 *omask, | ||
| 29738 | + int (*supported)(int mbit, int mod,void *opaque), | ||
| 29739 | + u32 (*gen_mask)(int mbit, int mod,void *opaque), | ||
| 29740 | + void *opaque) | ||
| 29741 | +{ | ||
| 29742 | + int r; | ||
| 29743 | + | ||
| 29744 | + r = fill_ratemask(&str, bmask, supported, gen_mask, opaque); | ||
| 29745 | + if(r) return r; | ||
| 29746 | + | ||
| 29747 | + if(*str==' ') { | ||
| 29748 | + str++; | ||
| 29749 | + r = fill_ratemask(&str, omask, supported, gen_mask, opaque); | ||
| 29750 | + if(r) return r; | ||
| 29751 | + } | ||
| 29752 | + if(*str) | ||
| 29753 | + return -EINVAL; | ||
| 29754 | + return 0; | ||
| 29755 | +} | ||
| 29756 | Index: linux-2.6.23/drivers/net/wireless/acx/usb.c | ||
| 29757 | =================================================================== | ||
| 29758 | --- /dev/null 1970-01-01 00:00:00.000000000 +0000 | ||
| 29759 | +++ linux-2.6.23/drivers/net/wireless/acx/usb.c 2008-01-20 21:13:40.000000000 +0000 | ||
| 29760 | @@ -0,0 +1,1922 @@ | ||
| 29761 | +/*********************************************************************** | ||
| 29762 | +** Copyright (C) 2003 ACX100 Open Source Project | ||
| 29763 | +** | ||
| 29764 | +** The contents of this file are subject to the Mozilla Public | ||
| 29765 | +** License Version 1.1 (the "License"); you may not use this file | ||
| 29766 | +** except in compliance with the License. You may obtain a copy of | ||
| 29767 | +** the License at http://www.mozilla.org/MPL/ | ||
| 29768 | +** | ||
| 29769 | +** Software distributed under the License is distributed on an "AS | ||
| 29770 | +** IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or | ||
| 29771 | +** implied. See the License for the specific language governing | ||
| 29772 | +** rights and limitations under the License. | ||
| 29773 | +** | ||
| 29774 | +** Alternatively, the contents of this file may be used under the | ||
| 29775 | +** terms of the GNU Public License version 2 (the "GPL"), in which | ||
| 29776 | +** case the provisions of the GPL are applicable instead of the | ||
| 29777 | +** above. If you wish to allow the use of your version of this file | ||
| 29778 | +** only under the terms of the GPL and not to allow others to use | ||
| 29779 | +** your version of this file under the MPL, indicate your decision | ||
| 29780 | +** by deleting the provisions above and replace them with the notice | ||
| 29781 | +** and other provisions required by the GPL. If you do not delete | ||
| 29782 | +** the provisions above, a recipient may use your version of this | ||
| 29783 | +** file under either the MPL or the GPL. | ||
| 29784 | +** --------------------------------------------------------------------- | ||
| 29785 | +** Inquiries regarding the ACX100 Open Source Project can be | ||
| 29786 | +** made directly to: | ||
| 29787 | +** | ||
| 29788 | +** acx100-users@lists.sf.net | ||
| 29789 | +** http://acx100.sf.net | ||
| 29790 | +** --------------------------------------------------------------------- | ||
| 29791 | +*/ | ||
| 29792 | + | ||
| 29793 | +/*********************************************************************** | ||
| 29794 | +** USB support for TI ACX100 based devices. Many parts are taken from | ||
| 29795 | +** the PCI driver. | ||
| 29796 | +** | ||
| 29797 | +** Authors: | ||
| 29798 | +** Martin Wawro <martin.wawro AT uni-dortmund.de> | ||
| 29799 | +** Andreas Mohr <andi AT lisas.de> | ||
| 29800 | +** | ||
| 29801 | +** LOCKING | ||
| 29802 | +** callback functions called by USB core are running in interrupt context | ||
| 29803 | +** and thus have names with _i_. | ||
| 29804 | +*/ | ||
| 29805 | +#define ACX_USB 1 | ||
| 29806 | + | ||
| 29807 | +#include <linux/version.h> | ||
| 29808 | +#if LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 18) | ||
| 29809 | +#include <linux/config.h> | ||
| 29810 | +#endif | ||
| 29811 | +#include <linux/types.h> | ||
| 29812 | +#include <linux/module.h> | ||
| 29813 | +#include <linux/moduleparam.h> | ||
| 29814 | +#include <linux/kernel.h> | ||
| 29815 | +#include <linux/usb.h> | ||
| 29816 | +#include <linux/netdevice.h> | ||
| 29817 | +#include <linux/rtnetlink.h> | ||
| 29818 | +#include <linux/etherdevice.h> | ||
| 29819 | +#include <linux/wireless.h> | ||
| 29820 | +#include <net/iw_handler.h> | ||
| 29821 | +#include <linux/vmalloc.h> | ||
| 29822 | + | ||
| 29823 | +#include "acx.h" | ||
| 29824 | + | ||
| 29825 | + | ||
| 29826 | +/*********************************************************************** | ||
| 29827 | +*/ | ||
| 29828 | +/* number of endpoints of an interface */ | ||
| 29829 | +#define NUM_EP(intf) (intf)->altsetting[0].desc.bNumEndpoints | ||
| 29830 | +#define EP(intf, nr) (intf)->altsetting[0].endpoint[(nr)].desc | ||
| 29831 | +#define GET_DEV(udev) usb_get_dev((udev)) | ||
| 29832 | +#define PUT_DEV(udev) usb_put_dev((udev)) | ||
| 29833 | +#define SET_NETDEV_OWNER(ndev, owner) /* not needed anymore ??? */ | ||
| 29834 | + | ||
| 29835 | +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,14) | ||
| 29836 | +/* removed in 2.6.14. We will use fake value for now */ | ||
| 29837 | +#define URB_ASYNC_UNLINK 0 | ||
| 29838 | +#endif | ||
| 29839 | + | ||
| 29840 | + | ||
| 29841 | +/*********************************************************************** | ||
| 29842 | +*/ | ||
| 29843 | +/* ACX100 (TNETW1100) USB device: D-Link DWL-120+ */ | ||
| 29844 | +#define ACX100_VENDOR_ID 0x2001 | ||
| 29845 | +#define ACX100_PRODUCT_ID_UNBOOTED 0x3B01 | ||
| 29846 | +#define ACX100_PRODUCT_ID_BOOTED 0x3B00 | ||
| 29847 | + | ||
| 29848 | +/* TNETW1450 USB devices */ | ||
| 29849 | +#define VENDOR_ID_DLINK 0x07b8 /* D-Link Corp. */ | ||
| 29850 | +#define PRODUCT_ID_WUG2400 0xb21a /* AboCom WUG2400 or SafeCom SWLUT-54125 */ | ||
| 29851 | +#define VENDOR_ID_AVM_GMBH 0x057c | ||
| 29852 | +#define PRODUCT_ID_AVM_WLAN_USB 0x5601 | ||
| 29853 | +#define PRODUCT_ID_AVM_WLAN_USB_si 0x6201 /* "self install" named Version: driver kills kernel on inbound scans from fritz box ??? */ | ||
| 29854 | +#define VENDOR_ID_ZCOM 0x0cde | ||
| 29855 | +#define PRODUCT_ID_ZCOM_XG750 0x0017 /* not tested yet */ | ||
| 29856 | +#define VENDOR_ID_TI 0x0451 | ||
| 29857 | +#define PRODUCT_ID_TI_UNKNOWN 0x60c5 /* not tested yet */ | ||
| 29858 | + | ||
| 29859 | +#define ACX_USB_CTRL_TIMEOUT 5500 /* steps in ms */ | ||
| 29860 | + | ||
| 29861 | +/* Buffer size for fw upload, same for both ACX100 USB and TNETW1450 */ | ||
| 29862 | +#define USB_RWMEM_MAXLEN 2048 | ||
| 29863 | + | ||
| 29864 | +/* The number of bulk URBs to use */ | ||
| 29865 | +#define ACX_TX_URB_CNT 8 | ||
| 29866 | +#define ACX_RX_URB_CNT 2 | ||
| 29867 | + | ||
| 29868 | +/* Should be sent to the bulkout endpoint */ | ||
| 29869 | +#define ACX_USB_REQ_UPLOAD_FW 0x10 | ||
| 29870 | +#define ACX_USB_REQ_ACK_CS 0x11 | ||
| 29871 | +#define ACX_USB_REQ_CMD 0x12 | ||
| 29872 | + | ||
| 29873 | +/*********************************************************************** | ||
| 29874 | +** Prototypes | ||
| 29875 | +*/ | ||
| 29876 | +static int acxusb_e_probe(struct usb_interface *, const struct usb_device_id *); | ||
| 29877 | +static void acxusb_e_disconnect(struct usb_interface *); | ||
| 29878 | +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 19) | ||
| 29879 | +static void acxusb_i_complete_tx(struct urb *); | ||
| 29880 | +static void acxusb_i_complete_rx(struct urb *); | ||
| 29881 | +#else | ||
| 29882 | +static void acxusb_i_complete_tx(struct urb *, struct pt_regs *); | ||
| 29883 | +static void acxusb_i_complete_rx(struct urb *, struct pt_regs *); | ||
| 29884 | +#endif | ||
| 29885 | +static int acxusb_e_open(struct net_device *); | ||
| 29886 | +static int acxusb_e_close(struct net_device *); | ||
| 29887 | +static void acxusb_i_set_rx_mode(struct net_device *); | ||
| 29888 | +static int acxusb_boot(struct usb_device *, int is_tnetw1450, int *radio_type); | ||
| 29889 | + | ||
| 29890 | +static void acxusb_l_poll_rx(acx_device_t *adev, usb_rx_t* rx); | ||
| 29891 | + | ||
| 29892 | +static void acxusb_i_tx_timeout(struct net_device *); | ||
| 29893 | + | ||
| 29894 | +/* static void dump_device(struct usb_device *); */ | ||
| 29895 | +/* static void dump_device_descriptor(struct usb_device_descriptor *); */ | ||
| 29896 | +/* static void dump_config_descriptor(struct usb_config_descriptor *); */ | ||
| 29897 | + | ||
| 29898 | +/*********************************************************************** | ||
| 29899 | +** Module Data | ||
| 29900 | +*/ | ||
| 29901 | +#define TXBUFSIZE sizeof(usb_txbuffer_t) | ||
| 29902 | +/* | ||
| 29903 | + * Now, this is just plain lying, but the device insists in giving us | ||
| 29904 | + * huge packets. We supply extra space after rxbuffer. Need to understand | ||
| 29905 | + * it better... | ||
| 29906 | + */ | ||
| 29907 | +#define RXBUFSIZE (sizeof(rxbuffer_t) + \ | ||
| 29908 | + (sizeof(usb_rx_t) - sizeof(struct usb_rx_plain))) | ||
| 29909 | + | ||
| 29910 | +static const struct usb_device_id | ||
| 29911 | +acxusb_ids[] = { | ||
| 29912 | + { USB_DEVICE(ACX100_VENDOR_ID, ACX100_PRODUCT_ID_BOOTED) }, | ||
| 29913 | + { USB_DEVICE(ACX100_VENDOR_ID, ACX100_PRODUCT_ID_UNBOOTED) }, | ||
| 29914 | + { USB_DEVICE(VENDOR_ID_DLINK, PRODUCT_ID_WUG2400) }, | ||
| 29915 | + { USB_DEVICE(VENDOR_ID_AVM_GMBH, PRODUCT_ID_AVM_WLAN_USB) }, | ||
| 29916 | + { USB_DEVICE(VENDOR_ID_AVM_GMBH, PRODUCT_ID_AVM_WLAN_USB_si) }, | ||
| 29917 | + { USB_DEVICE(VENDOR_ID_ZCOM, PRODUCT_ID_ZCOM_XG750) }, | ||
| 29918 | + { USB_DEVICE(VENDOR_ID_TI, PRODUCT_ID_TI_UNKNOWN) }, | ||
| 29919 | + {} | ||
| 29920 | +}; | ||
| 29921 | + | ||
| 29922 | +MODULE_DEVICE_TABLE(usb, acxusb_ids); | ||
| 29923 | + | ||
| 29924 | +/* USB driver data structure as required by the kernel's USB core */ | ||
| 29925 | +static struct usb_driver | ||
| 29926 | +acxusb_driver = { | ||
| 29927 | + .name = "acx_usb", | ||
| 29928 | + .probe = acxusb_e_probe, | ||
| 29929 | + .disconnect = acxusb_e_disconnect, | ||
| 29930 | + .id_table = acxusb_ids | ||
| 29931 | +}; | ||
| 29932 | + | ||
| 29933 | + | ||
| 29934 | +/*********************************************************************** | ||
| 29935 | +** USB helper | ||
| 29936 | +** | ||
| 29937 | +** ldd3 ch13 says: | ||
| 29938 | +** When the function is usb_kill_urb, the urb lifecycle is stopped. This | ||
| 29939 | +** function is usually used when the device is disconnected from the system, | ||
| 29940 | +** in the disconnect callback. For some drivers, the usb_unlink_urb function | ||
| 29941 | +** should be used to tell the USB core to stop an urb. This function does not | ||
| 29942 | +** wait for the urb to be fully stopped before returning to the caller. | ||
| 29943 | +** This is useful for stoppingthe urb while in an interrupt handler or when | ||
| 29944 | +** a spinlock is held, as waiting for a urb to fully stop requires the ability | ||
| 29945 | +** for the USB core to put the calling process to sleep. This function requires | ||
| 29946 | +** that the URB_ASYNC_UNLINK flag value be set in the urb that is being asked | ||
| 29947 | +** to be stopped in order to work properly. | ||
| 29948 | +** | ||
| 29949 | +** (URB_ASYNC_UNLINK is obsolete, usb_unlink_urb will always be | ||
| 29950 | +** asynchronous while usb_kill_urb is synchronous and should be called | ||
| 29951 | +** directly (drivers/usb/core/urb.c)) | ||
| 29952 | +** | ||
| 29953 | +** In light of this, timeout is just for paranoid reasons... | ||
| 29954 | +* | ||
| 29955 | +* Actually, it's useful for debugging. If we reach timeout, we're doing | ||
| 29956 | +* something wrong with the urbs. | ||
| 29957 | +*/ | ||
| 29958 | +static void | ||
| 29959 | +acxusb_unlink_urb(struct urb* urb) | ||
| 29960 | +{ | ||
| 29961 | + if (!urb) | ||
| 29962 | + return; | ||
| 29963 | + | ||
| 29964 | + if (urb->status == -EINPROGRESS) { | ||
| 29965 | + int timeout = 10; | ||
| 29966 | + | ||
| 29967 | + usb_unlink_urb(urb); | ||
| 29968 | + while (--timeout && urb->status == -EINPROGRESS) { | ||
| 29969 | + mdelay(1); | ||
| 29970 | + } | ||
| 29971 | + if (!timeout) { | ||
| 29972 | + printk("acx_usb: urb unlink timeout!\n"); | ||
| 29973 | + } | ||
| 29974 | + } | ||
| 29975 | +} | ||
| 29976 | + | ||
| 29977 | + | ||
| 29978 | +/*********************************************************************** | ||
| 29979 | +** EEPROM and PHY read/write helpers | ||
| 29980 | +*/ | ||
| 29981 | +/*********************************************************************** | ||
| 29982 | +** acxusb_s_read_phy_reg | ||
| 29983 | +*/ | ||
| 29984 | +int | ||
| 29985 | +acxusb_s_read_phy_reg(acx_device_t *adev, u32 reg, u8 *charbuf) | ||
| 29986 | +{ | ||
| 29987 | + /* mem_read_write_t mem; */ | ||
| 29988 | + | ||
| 29989 | + FN_ENTER; | ||
| 29990 | + | ||
| 29991 | + printk("%s doesn't seem to work yet, disabled.\n", __func__); | ||
| 29992 | + | ||
| 29993 | + /* | ||
| 29994 | + mem.addr = cpu_to_le16(reg); | ||
| 29995 | + mem.type = cpu_to_le16(0x82); | ||
| 29996 | + mem.len = cpu_to_le32(4); | ||
| 29997 | + acx_s_issue_cmd(adev, ACX1xx_CMD_MEM_READ, &mem, sizeof(mem)); | ||
| 29998 | + *charbuf = mem.data; | ||
| 29999 | + log(L_DEBUG, "read radio PHY[0x%04X]=0x%02X\n", reg, *charbuf); | ||
| 30000 | + */ | ||
| 30001 | + | ||
| 30002 | + FN_EXIT1(OK); | ||
| 30003 | + return OK; | ||
| 30004 | +} | ||
| 30005 | + | ||
| 30006 | + | ||
| 30007 | +/*********************************************************************** | ||
| 30008 | +*/ | ||
| 30009 | +int | ||
| 30010 | +acxusb_s_write_phy_reg(acx_device_t *adev, u32 reg, u8 value) | ||
| 30011 | +{ | ||
| 30012 | + mem_read_write_t mem; | ||
| 30013 | + | ||
| 30014 | + FN_ENTER; | ||
| 30015 | + | ||
| 30016 | + mem.addr = cpu_to_le16(reg); | ||
| 30017 | + mem.type = cpu_to_le16(0x82); | ||
| 30018 | + mem.len = cpu_to_le32(4); | ||
| 30019 | + mem.data = value; | ||
| 30020 | + acx_s_issue_cmd(adev, ACX1xx_CMD_MEM_WRITE, &mem, sizeof(mem)); | ||
| 30021 | + log(L_DEBUG, "write radio PHY[0x%04X]=0x%02X\n", reg, value); | ||
| 30022 | + | ||
| 30023 | + FN_EXIT1(OK); | ||
| 30024 | + return OK; | ||
| 30025 | +} | ||
| 30026 | + | ||
| 30027 | + | ||
| 30028 | +/*********************************************************************** | ||
| 30029 | +** acxusb_s_issue_cmd_timeo | ||
| 30030 | +** Excecutes a command in the command mailbox | ||
| 30031 | +** | ||
| 30032 | +** buffer = a pointer to the data. | ||
| 30033 | +** The data must not include 4 byte command header | ||
| 30034 | +*/ | ||
| 30035 | + | ||
| 30036 | +/* TODO: ideally we shall always know how much we need | ||
| 30037 | +** and this shall be 0 */ | ||
| 30038 | +#define BOGUS_SAFETY_PADDING 0x40 | ||
| 30039 | + | ||
| 30040 | +#undef FUNC | ||
| 30041 | +#define FUNC "issue_cmd" | ||
| 30042 | + | ||
| 30043 | +#if !ACX_DEBUG | ||
| 30044 | +int | ||
| 30045 | +acxusb_s_issue_cmd_timeo( | ||
| 30046 | + acx_device_t *adev, | ||
| 30047 | + unsigned cmd, | ||
| 30048 | + void *buffer, | ||
| 30049 | + unsigned buflen, | ||
| 30050 | + unsigned timeout) | ||
| 30051 | +{ | ||
| 30052 | +#else | ||
| 30053 | +int | ||
| 30054 | +acxusb_s_issue_cmd_timeo_debug( | ||
| 30055 | + acx_device_t *adev, | ||
| 30056 | + unsigned cmd, | ||
| 30057 | + void *buffer, | ||
| 30058 | + unsigned buflen, | ||
| 30059 | + unsigned timeout, | ||
| 30060 | + const char* cmdstr) | ||
| 30061 | +{ | ||
| 30062 | +#endif | ||
| 30063 | + /* USB ignores timeout param */ | ||
| 30064 | + | ||
| 30065 | + struct usb_device *usbdev; | ||
| 30066 | + struct { | ||
| 30067 | + u16 cmd; | ||
| 30068 | + u16 status; | ||
| 30069 | + u8 data[1]; | ||
| 30070 | + } ACX_PACKED *loc; | ||
| 30071 | + const char *devname; | ||
| 30072 | + int acklen, blocklen, inpipe, outpipe; | ||
| 30073 | + int cmd_status; | ||
| 30074 | + int result; | ||
| 30075 | + | ||
| 30076 | + FN_ENTER; | ||
| 30077 | + | ||
| 30078 | + devname = adev->ndev->name; | ||
| 30079 | + /* no "wlan%%d: ..." please */ | ||
| 30080 | + if (!devname || !devname[0] || devname[4]=='%') | ||
| 30081 | + devname = "acx"; | ||
| 30082 | + | ||
| 30083 | + log(L_CTL, FUNC"(cmd:%s,buflen:%u,type:0x%04X)\n", | ||
| 30084 | + cmdstr, buflen, | ||
| 30085 | + buffer ? le16_to_cpu(((acx_ie_generic_t *)buffer)->type) : -1); | ||
| 30086 | + | ||
| 30087 | + loc = kmalloc(buflen + 4 + BOGUS_SAFETY_PADDING, GFP_KERNEL); | ||
| 30088 | + if (!loc) { | ||
| 30089 | + printk("%s: "FUNC"(): no memory for data buffer\n", devname); | ||
| 30090 | + goto bad; | ||
| 30091 | + } | ||
| 30092 | + | ||
| 30093 | + /* get context from acx_device */ | ||
| 30094 | + usbdev = adev->usbdev; | ||
| 30095 | + | ||
| 30096 | + /* check which kind of command was issued */ | ||
| 30097 | + loc->cmd = cpu_to_le16(cmd); | ||
| 30098 | + loc->status = 0; | ||
| 30099 | + | ||
| 30100 | +/* NB: buflen == frmlen + 4 | ||
| 30101 | +** | ||
| 30102 | +** Interrogate: write 8 bytes: (cmd,status,rid,frmlen), then | ||
| 30103 | +** read (cmd,status,rid,frmlen,data[frmlen]) back | ||
| 30104 | +** | ||
| 30105 | +** Configure: write (cmd,status,rid,frmlen,data[frmlen]) | ||
| 30106 | +** | ||
| 30107 | +** Possibly bogus special handling of ACX1xx_IE_SCAN_STATUS removed | ||
| 30108 | +*/ | ||
| 30109 | + | ||
| 30110 | + /* now write the parameters of the command if needed */ | ||
| 30111 | + acklen = buflen + 4 + BOGUS_SAFETY_PADDING; | ||
| 30112 | + blocklen = buflen; | ||
| 30113 | + if (buffer && buflen) { | ||
| 30114 | + /* if it's an INTERROGATE command, just pass the length | ||
| 30115 | + * of parameters to read, as data */ | ||
| 30116 | + if (cmd == ACX1xx_CMD_INTERROGATE) { | ||
| 30117 | + blocklen = 4; | ||
| 30118 | + acklen = buflen + 4; | ||
| 30119 | + } | ||
| 30120 | + memcpy(loc->data, buffer, blocklen); | ||
| 30121 | + } | ||
| 30122 | + blocklen += 4; /* account for cmd,status */ | ||
| 30123 | + | ||
| 30124 | + /* obtain the I/O pipes */ | ||
| 30125 | + outpipe = usb_sndctrlpipe(usbdev, 0); | ||
| 30126 | + inpipe = usb_rcvctrlpipe(usbdev, 0); | ||
| 30127 | + log(L_CTL, "ctrl inpipe=0x%X outpipe=0x%X\n", inpipe, outpipe); | ||
| 30128 | + log(L_CTL, "sending USB control msg (out) (blocklen=%d)\n", blocklen); | ||
| 30129 | + if (acx_debug & L_DATA) | ||
| 30130 | + acx_dump_bytes(loc, blocklen); | ||
| 30131 | + | ||
| 30132 | + result = usb_control_msg(usbdev, outpipe, | ||
| 30133 | + ACX_USB_REQ_CMD, /* request */ | ||
| 30134 | + USB_TYPE_VENDOR|USB_DIR_OUT, /* requesttype */ | ||
| 30135 | + 0, /* value */ | ||
| 30136 | + 0, /* index */ | ||
| 30137 | + loc, /* dataptr */ | ||
| 30138 | + blocklen, /* size */ | ||
| 30139 | + ACX_USB_CTRL_TIMEOUT /* timeout in ms */ | ||
| 30140 | + ); | ||
| 30141 | + | ||
| 30142 | + if (result == -ENODEV) { | ||
| 30143 | + log(L_CTL, "no device present (unplug?)\n"); | ||
| 30144 | + goto good; | ||
| 30145 | + } | ||
| 30146 | + | ||
| 30147 | + log(L_CTL, "wrote %d bytes\n", result); | ||
| 30148 | + if (result < 0) { | ||
| 30149 | + goto bad; | ||
| 30150 | + } | ||
| 30151 | + | ||
| 30152 | + /* check for device acknowledge */ | ||
| 30153 | + log(L_CTL, "sending USB control msg (in) (acklen=%d)\n", acklen); | ||
| 30154 | + loc->status = 0; /* delete old status flag -> set to IDLE */ | ||
| 30155 | + /* shall we zero out the rest? */ | ||
| 30156 | + result = usb_control_msg(usbdev, inpipe, | ||
| 30157 | + ACX_USB_REQ_CMD, /* request */ | ||
| 30158 | + USB_TYPE_VENDOR|USB_DIR_IN, /* requesttype */ | ||
| 30159 | + 0, /* value */ | ||
| 30160 | + 0, /* index */ | ||
| 30161 | + loc, /* dataptr */ | ||
| 30162 | + acklen, /* size */ | ||
| 30163 | + ACX_USB_CTRL_TIMEOUT /* timeout in ms */ | ||
| 30164 | + ); | ||
| 30165 | + if (result < 0) { | ||
| 30166 | + printk("%s: "FUNC"(): USB read error %d\n", devname, result); | ||
| 30167 | + goto bad; | ||
| 30168 | + } | ||
| 30169 | + if (acx_debug & L_CTL) { | ||
| 30170 | + printk("read %d bytes: ", result); | ||
| 30171 | + acx_dump_bytes(loc, result); | ||
| 30172 | + } | ||
| 30173 | + | ||
| 30174 | +/* | ||
| 30175 | + check for result==buflen+4? Was seen: | ||
| 30176 | + | ||
| 30177 | +interrogate(type:ACX100_IE_DOT11_ED_THRESHOLD,len:4) | ||
| 30178 | +issue_cmd(cmd:ACX1xx_CMD_INTERROGATE,buflen:8,type:4111) | ||
| 30179 | +ctrl inpipe=0x80000280 outpipe=0x80000200 | ||
| 30180 | +sending USB control msg (out) (blocklen=8) | ||
| 30181 | +01 00 00 00 0F 10 04 00 | ||
| 30182 | +wrote 8 bytes | ||
| 30183 | +sending USB control msg (in) (acklen=12) sizeof(loc->data | ||
| 30184 | +read 4 bytes <==== MUST BE 12!! | ||
| 30185 | +*/ | ||
| 30186 | + | ||
| 30187 | + cmd_status = le16_to_cpu(loc->status); | ||
| 30188 | + if (cmd_status != 1) { | ||
| 30189 | + printk("%s: "FUNC"(): cmd_status is not SUCCESS: %d (%s)\n", | ||
| 30190 | + devname, cmd_status, acx_cmd_status_str(cmd_status)); | ||
| 30191 | + /* TODO: goto bad; ? */ | ||
| 30192 | + } | ||
| 30193 | + if ((cmd == ACX1xx_CMD_INTERROGATE) && buffer && buflen) { | ||
| 30194 | + memcpy(buffer, loc->data, buflen); | ||
| 30195 | + log(L_CTL, "response frame: cmd=0x%04X status=%d\n", | ||
| 30196 | + le16_to_cpu(loc->cmd), | ||
| 30197 | + cmd_status); | ||
| 30198 | + } | ||
| 30199 | +good: | ||
| 30200 | + kfree(loc); | ||
| 30201 | + FN_EXIT1(OK); | ||
| 30202 | + return OK; | ||
| 30203 | +bad: | ||
| 30204 | + /* Give enough info so that callers can avoid | ||
| 30205 | + ** printing their own diagnostic messages */ | ||
| 30206 | +#if ACX_DEBUG | ||
| 30207 | + printk("%s: "FUNC"(cmd:%s) FAILED\n", devname, cmdstr); | ||
| 30208 | +#else | ||
| 30209 | + printk("%s: "FUNC"(cmd:0x%04X) FAILED\n", devname, cmd); | ||
| 30210 | +#endif | ||
| 30211 | + dump_stack(); | ||
| 30212 | + kfree(loc); | ||
| 30213 | + FN_EXIT1(NOT_OK); | ||
| 30214 | + return NOT_OK; | ||
| 30215 | +} | ||
| 30216 | + | ||
| 30217 | + | ||
| 30218 | +/*********************************************************************** | ||
| 30219 | +** acxusb_boot() | ||
| 30220 | +** Inputs: | ||
| 30221 | +** usbdev -> Pointer to kernel's usb_device structure | ||
| 30222 | +** | ||
| 30223 | +** Returns: | ||
| 30224 | +** (int) Errorcode or 0 on success | ||
| 30225 | +** | ||
| 30226 | +** This function triggers the loading of the firmware image from harddisk | ||
| 30227 | +** and then uploads the firmware to the USB device. After uploading the | ||
| 30228 | +** firmware and transmitting the checksum, the device resets and appears | ||
| 30229 | +** as a new device on the USB bus (the device we can finally deal with) | ||
| 30230 | +*/ | ||
| 30231 | +static inline int | ||
| 30232 | +acxusb_fw_needs_padding(firmware_image_t *fw_image, unsigned int usb_maxlen) | ||
| 30233 | +{ | ||
| 30234 | + unsigned int num_xfers = ((fw_image->size - 1) / usb_maxlen) + 1; | ||
| 30235 | + | ||
| 30236 | + return ((num_xfers % 2) == 0); | ||
| 30237 | +} | ||
| 30238 | + | ||
| 30239 | +static int | ||
| 30240 | +acxusb_boot(struct usb_device *usbdev, int is_tnetw1450, int *radio_type) | ||
| 30241 | +{ | ||
| 30242 | + char filename[sizeof("tiacx1NNusbcRR")]; | ||
| 30243 | + | ||
| 30244 | + firmware_image_t *fw_image = NULL; | ||
| 30245 | + char *usbbuf; | ||
| 30246 | + unsigned int offset; | ||
| 30247 | + unsigned int blk_len, inpipe, outpipe; | ||
| 30248 | + u32 num_processed; | ||
| 30249 | + u32 img_checksum, sum; | ||
| 30250 | + u32 file_size; | ||
| 30251 | + int result = -EIO; | ||
| 30252 | + int i; | ||
| 30253 | + | ||
| 30254 | + FN_ENTER; | ||
| 30255 | + | ||
| 30256 | + /* dump_device(usbdev); */ | ||
| 30257 | + | ||
| 30258 | + usbbuf = kmalloc(USB_RWMEM_MAXLEN, GFP_KERNEL); | ||
| 30259 | + if (!usbbuf) { | ||
| 30260 | + printk(KERN_ERR "acx: no memory for USB transfer buffer (%d bytes)\n", USB_RWMEM_MAXLEN); | ||
| 30261 | + result = -ENOMEM; | ||
| 30262 | + goto end; | ||
| 30263 | + } | ||
| 30264 | + if (is_tnetw1450) { | ||
| 30265 | + /* Obtain the I/O pipes */ | ||
| 30266 | + outpipe = usb_sndbulkpipe(usbdev, 1); | ||
| 30267 | + inpipe = usb_rcvbulkpipe(usbdev, 2); | ||
| 30268 | + | ||
| 30269 | + printk(KERN_DEBUG "wait for device ready\n"); | ||
| 30270 | + for (i = 0; i <= 2; i++) { | ||
| 30271 | + result = usb_bulk_msg(usbdev, inpipe, | ||
| 30272 | + usbbuf, | ||
| 30273 | + USB_RWMEM_MAXLEN, | ||
| 30274 | + &num_processed, | ||
| 30275 | + 2000 | ||
| 30276 | + ); | ||
| 30277 | + | ||
| 30278 | + if ((*(u32 *)&usbbuf[4] == 0x40000001) | ||
| 30279 | + && (*(u16 *)&usbbuf[2] == 0x1) | ||
| 30280 | + && ((*(u16 *)usbbuf & 0x3fff) == 0) | ||
| 30281 | + && ((*(u16 *)usbbuf & 0xc000) == 0xc000)) | ||
| 30282 | + break; | ||
| 30283 | + msleep(10); | ||
| 30284 | + } | ||
| 30285 | + if (i == 2) | ||
| 30286 | + goto fw_end; | ||
| 30287 | + | ||
| 30288 | + *radio_type = usbbuf[8]; | ||
| 30289 | + } else { | ||
| 30290 | + /* Obtain the I/O pipes */ | ||
| 30291 | + outpipe = usb_sndctrlpipe(usbdev, 0); | ||
| 30292 | + inpipe = usb_rcvctrlpipe(usbdev, 0); | ||
| 30293 | + | ||
| 30294 | + /* FIXME: shouldn't be hardcoded */ | ||
| 30295 | + *radio_type = RADIO_MAXIM_0D; | ||
| 30296 | + } | ||
| 30297 | + | ||
| 30298 | + snprintf(filename, sizeof(filename), "tiacx1%02dusbc%02X", | ||
| 30299 | + is_tnetw1450 * 11, *radio_type); | ||
| 30300 | + | ||
| 30301 | + fw_image = acx_s_read_fw(&usbdev->dev, filename, &file_size); | ||
| 30302 | + if (!fw_image) { | ||
| 30303 | + result = -EIO; | ||
| 30304 | + goto end; | ||
| 30305 | + } | ||
| 30306 | + log(L_INIT, "firmware size: %d bytes\n", file_size); | ||
| 30307 | + | ||
| 30308 | + img_checksum = le32_to_cpu(fw_image->chksum); | ||
| 30309 | + | ||
| 30310 | + if (is_tnetw1450) { | ||
| 30311 | + u8 cmdbuf[20]; | ||
| 30312 | + const u8 *p; | ||
| 30313 | + u8 need_padding; | ||
| 30314 | + u32 tmplen, val; | ||
| 30315 | + | ||
| 30316 | + memset(cmdbuf, 0, 16); | ||
| 30317 | + | ||
| 30318 | + need_padding = acxusb_fw_needs_padding(fw_image, USB_RWMEM_MAXLEN); | ||
| 30319 | + tmplen = need_padding ? file_size-4 : file_size-8; | ||
| 30320 | + *(u16 *)&cmdbuf[0] = 0xc000; | ||
| 30321 | + *(u16 *)&cmdbuf[2] = 0x000b; | ||
| 30322 | + *(u32 *)&cmdbuf[4] = tmplen; | ||
| 30323 | + *(u32 *)&cmdbuf[8] = file_size-8; | ||
| 30324 | + *(u32 *)&cmdbuf[12] = img_checksum; | ||
| 30325 | + | ||
| 30326 | + result = usb_bulk_msg(usbdev, outpipe, cmdbuf, 16, &num_processed, HZ); | ||
| 30327 | + if (result < 0) | ||
| 30328 | + goto fw_end; | ||
| 30329 | + | ||
| 30330 | + p = (const u8 *)&fw_image->size; | ||
| 30331 | + | ||
| 30332 | + /* first calculate checksum for image size part */ | ||
| 30333 | + sum = p[0]+p[1]+p[2]+p[3]; | ||
| 30334 | + p += 4; | ||
| 30335 | + | ||
| 30336 | + /* now continue checksum for firmware data part */ | ||
| 30337 | + tmplen = le32_to_cpu(fw_image->size); | ||
| 30338 | + for (i = 0; i < tmplen /* image size */; i++) { | ||
| 30339 | + sum += *p++; | ||
| 30340 | + } | ||
| 30341 | + | ||
| 30342 | + if (sum != le32_to_cpu(fw_image->chksum)) { | ||
| 30343 | + printk("acx: FATAL: firmware upload: " | ||
| 30344 | + "checksums don't match! " | ||
| 30345 | + "(0x%08x vs. 0x%08x)\n", | ||
| 30346 | + sum, fw_image->chksum); | ||
| 30347 | + goto fw_end; | ||
| 30348 | + } | ||
| 30349 | + | ||
| 30350 | + offset = 8; | ||
| 30351 | + while (offset < file_size) { | ||
| 30352 | + blk_len = file_size - offset; | ||
| 30353 | + if (blk_len > USB_RWMEM_MAXLEN) { | ||
| 30354 | + blk_len = USB_RWMEM_MAXLEN; | ||
| 30355 | + } | ||
| 30356 | + | ||
| 30357 | + log(L_INIT, "uploading firmware (%d bytes, offset=%d)\n", | ||
| 30358 | + blk_len, offset); | ||
| 30359 | + memcpy(usbbuf, ((u8 *)fw_image) + offset, blk_len); | ||
| 30360 | + | ||
| 30361 | + p = usbbuf; | ||
| 30362 | + for (i = 0; i < blk_len; i += 4) { | ||
| 30363 | + *(u32 *)p = be32_to_cpu(*(u32 *)p); | ||
| 30364 | + p += 4; | ||
| 30365 | + } | ||
| 30366 | + | ||
| 30367 | + result = usb_bulk_msg(usbdev, outpipe, usbbuf, blk_len, &num_processed, HZ); | ||
| 30368 | + if ((result < 0) || (num_processed != blk_len)) | ||
| 30369 | + goto fw_end; | ||
| 30370 | + offset += blk_len; | ||
| 30371 | + } | ||
| 30372 | + if (need_padding) { | ||
| 30373 | + printk(KERN_DEBUG "send padding\n"); | ||
| 30374 | + memset(usbbuf, 0, 4); | ||
| 30375 | + result = usb_bulk_msg(usbdev, outpipe, usbbuf, 4, &num_processed, HZ); | ||
| 30376 | + if ((result < 0) || (num_processed != 4)) | ||
| 30377 | + goto fw_end; | ||
| 30378 | + } | ||
| 30379 | + printk(KERN_DEBUG "read firmware upload result\n"); | ||
| 30380 | + memset(cmdbuf, 0, 20); /* additional memset */ | ||
| 30381 | + result = usb_bulk_msg(usbdev, inpipe, cmdbuf, 20, &num_processed, 2000); | ||
| 30382 | + if (result < 0) | ||
| 30383 | + goto fw_end; | ||
| 30384 | + if (*(u32 *)&cmdbuf[4] == 0x40000003) | ||
| 30385 | + goto fw_end; | ||
| 30386 | + if (*(u32 *)&cmdbuf[4]) | ||
| 30387 | + goto fw_end; | ||
| 30388 | + if (*(u16 *)&cmdbuf[16] != 1) | ||
| 30389 | + goto fw_end; | ||
| 30390 | + | ||
| 30391 | + val = *(u32 *)&cmdbuf[0]; | ||
| 30392 | + if ((val & 0x3fff) | ||
| 30393 | + || ((val & 0xc000) != 0xc000)) | ||
| 30394 | + goto fw_end; | ||
| 30395 | + | ||
| 30396 | + val = *(u32 *)&cmdbuf[8]; | ||
| 30397 | + if (val & 2) { | ||
| 30398 | + result = usb_bulk_msg(usbdev, inpipe, cmdbuf, 20, &num_processed, 2000); | ||
| 30399 | + if (result < 0) | ||
| 30400 | + goto fw_end; | ||
| 30401 | + val = *(u32 *)&cmdbuf[8]; | ||
| 30402 | + } | ||
| 30403 | + /* yup, no "else" here! */ | ||
| 30404 | + if (val & 1) { | ||
| 30405 | + memset(usbbuf, 0, 4); | ||
| 30406 | + result = usb_bulk_msg(usbdev, outpipe, usbbuf, 4, &num_processed, HZ); | ||
| 30407 | + if ((result < 0) || (!num_processed)) | ||
| 30408 | + goto fw_end; | ||
| 30409 | + } | ||
| 30410 | + | ||
| 30411 | + printk("TNETW1450 firmware upload successful!\n"); | ||
| 30412 | + result = 0; | ||
| 30413 | + goto end; | ||
| 30414 | +fw_end: | ||
| 30415 | + result = -EIO; | ||
| 30416 | + goto end; | ||
| 30417 | + } else { | ||
| 30418 | + /* ACX100 USB */ | ||
| 30419 | + | ||
| 30420 | + /* now upload the firmware, slice the data into blocks */ | ||
| 30421 | + offset = 8; | ||
| 30422 | + while (offset < file_size) { | ||
| 30423 | + blk_len = file_size - offset; | ||
| 30424 | + if (blk_len > USB_RWMEM_MAXLEN) { | ||
| 30425 | + blk_len = USB_RWMEM_MAXLEN; | ||
| 30426 | + } | ||
| 30427 | + log(L_INIT, "uploading firmware (%d bytes, offset=%d)\n", | ||
| 30428 | + blk_len, offset); | ||
| 30429 | + memcpy(usbbuf, ((u8 *)fw_image) + offset, blk_len); | ||
| 30430 | + result = usb_control_msg(usbdev, outpipe, | ||
| 30431 | + ACX_USB_REQ_UPLOAD_FW, | ||
| 30432 | + USB_TYPE_VENDOR|USB_DIR_OUT, | ||
| 30433 | + (file_size - 8) & 0xffff, /* value */ | ||
| 30434 | + (file_size - 8) >> 16, /* index */ | ||
| 30435 | + usbbuf, /* dataptr */ | ||
| 30436 | + blk_len, /* size */ | ||
| 30437 | + 3000 /* timeout in ms */ | ||
| 30438 | + ); | ||
| 30439 | + offset += blk_len; | ||
| 30440 | + if (result < 0) { | ||
| 30441 | + printk(KERN_ERR "acx: error %d during upload " | ||
| 30442 | + "of firmware, aborting\n", result); | ||
| 30443 | + goto end; | ||
| 30444 | + } | ||
| 30445 | + } | ||
| 30446 | + | ||
| 30447 | + /* finally, send the checksum and reboot the device */ | ||
| 30448 | + /* does this trigger the reboot? */ | ||
| 30449 | + result = usb_control_msg(usbdev, outpipe, | ||
| 30450 | + ACX_USB_REQ_UPLOAD_FW, | ||
| 30451 | + USB_TYPE_VENDOR|USB_DIR_OUT, | ||
| 30452 | + img_checksum & 0xffff, /* value */ | ||
| 30453 | + img_checksum >> 16, /* index */ | ||
| 30454 | + NULL, /* dataptr */ | ||
| 30455 | + 0, /* size */ | ||
| 30456 | + 3000 /* timeout in ms */ | ||
| 30457 | + ); | ||
| 30458 | + if (result < 0) { | ||
| 30459 | + printk(KERN_ERR "acx: error %d during tx of checksum, " | ||
| 30460 | + "aborting\n", result); | ||
| 30461 | + goto end; | ||
| 30462 | + } | ||
| 30463 | + result = usb_control_msg(usbdev, inpipe, | ||
| 30464 | + ACX_USB_REQ_ACK_CS, | ||
| 30465 | + USB_TYPE_VENDOR|USB_DIR_IN, | ||
| 30466 | + img_checksum & 0xffff, /* value */ | ||
| 30467 | + img_checksum >> 16, /* index */ | ||
| 30468 | + usbbuf, /* dataptr */ | ||
| 30469 | + 8, /* size */ | ||
| 30470 | + 3000 /* timeout in ms */ | ||
| 30471 | + ); | ||
| 30472 | + if (result < 0) { | ||
| 30473 | + printk(KERN_ERR "acx: error %d during ACK of checksum, " | ||
| 30474 | + "aborting\n", result); | ||
| 30475 | + goto end; | ||
| 30476 | + } | ||
| 30477 | + if (*usbbuf != 0x10) { | ||
| 30478 | + printk(KERN_ERR "acx: invalid checksum?\n"); | ||
| 30479 | + result = -EINVAL; | ||
| 30480 | + goto end; | ||
| 30481 | + } | ||
| 30482 | + result = 0; | ||
| 30483 | + } | ||
| 30484 | + | ||
| 30485 | +end: | ||
| 30486 | + vfree(fw_image); | ||
| 30487 | + kfree(usbbuf); | ||
| 30488 | + | ||
| 30489 | + FN_EXIT1(result); | ||
| 30490 | + return result; | ||
| 30491 | +} | ||
| 30492 | + | ||
| 30493 | + | ||
| 30494 | +/* FIXME: maybe merge it with usual eeprom reading, into common code? */ | ||
| 30495 | +static void | ||
| 30496 | +acxusb_s_read_eeprom_version(acx_device_t *adev) | ||
| 30497 | +{ | ||
| 30498 | + u8 eeprom_ver[0x8]; | ||
| 30499 | + | ||
| 30500 | + memset(eeprom_ver, 0, sizeof(eeprom_ver)); | ||
| 30501 | + acx_s_interrogate(adev, &eeprom_ver, ACX1FF_IE_EEPROM_VER); | ||
| 30502 | + | ||
| 30503 | + /* FIXME: which one of those values to take? */ | ||
| 30504 | + adev->eeprom_version = eeprom_ver[5]; | ||
| 30505 | +} | ||
| 30506 | + | ||
| 30507 | + | ||
| 30508 | +/* | ||
| 30509 | + * temporary helper function to at least fill important cfgopt members with | ||
| 30510 | + * useful replacement values until we figure out how one manages to fetch | ||
| 30511 | + * the configoption struct in the USB device case... | ||
| 30512 | + */ | ||
| 30513 | +static int | ||
| 30514 | +acxusb_s_fill_configoption(acx_device_t *adev) | ||
| 30515 | +{ | ||
| 30516 | + adev->cfgopt_probe_delay = 200; | ||
| 30517 | + adev->cfgopt_dot11CCAModes = 4; | ||
| 30518 | + adev->cfgopt_dot11Diversity = 1; | ||
| 30519 | + adev->cfgopt_dot11ShortPreambleOption = 1; | ||
| 30520 | + adev->cfgopt_dot11PBCCOption = 1; | ||
| 30521 | + adev->cfgopt_dot11ChannelAgility = 0; | ||
| 30522 | + adev->cfgopt_dot11PhyType = 5; | ||
| 30523 | + adev->cfgopt_dot11TempType = 1; | ||
| 30524 | + return OK; | ||
| 30525 | +} | ||
| 30526 | + | ||
| 30527 | + | ||
| 30528 | +/*********************************************************************** | ||
| 30529 | +** acxusb_e_probe() | ||
| 30530 | +** | ||
| 30531 | +** This function is invoked by the kernel's USB core whenever a new device is | ||
| 30532 | +** attached to the system or the module is loaded. It is presented a usb_device | ||
| 30533 | +** structure from which information regarding the device is obtained and evaluated. | ||
| 30534 | +** In case this driver is able to handle one of the offered devices, it returns | ||
| 30535 | +** a non-null pointer to a driver context and thereby claims the device. | ||
| 30536 | +*/ | ||
| 30537 | + | ||
| 30538 | +static void | ||
| 30539 | +dummy_netdev_init(struct net_device *ndev) {} | ||
| 30540 | + | ||
| 30541 | +static int | ||
| 30542 | +acxusb_e_probe(struct usb_interface *intf, const struct usb_device_id *devID) | ||
| 30543 | +{ | ||
| 30544 | + struct usb_device *usbdev = interface_to_usbdev(intf); | ||
| 30545 | + acx_device_t *adev = NULL; | ||
| 30546 | + struct net_device *ndev = NULL; | ||
| 30547 | + struct usb_config_descriptor *config; | ||
| 30548 | + struct usb_endpoint_descriptor *epdesc; | ||
| 30549 | +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 11) | ||
| 30550 | + struct usb_host_endpoint *ep; | ||
| 30551 | +#endif | ||
| 30552 | + struct usb_interface_descriptor *ifdesc; | ||
| 30553 | + const char* msg; | ||
| 30554 | + int numconfigs, numfaces, numep; | ||
| 30555 | + int result = OK; | ||
| 30556 | + int i; | ||
| 30557 | + int radio_type; | ||
| 30558 | + /* this one needs to be more precise in case there appears a TNETW1450 from the same vendor */ | ||
| 30559 | + int is_tnetw1450 = (usbdev->descriptor.idVendor != ACX100_VENDOR_ID); | ||
| 30560 | + | ||
| 30561 | + FN_ENTER; | ||
| 30562 | + | ||
| 30563 | + if (is_tnetw1450) { | ||
| 30564 | + /* Boot the device (i.e. upload the firmware) */ | ||
| 30565 | + acxusb_boot(usbdev, is_tnetw1450, &radio_type); | ||
| 30566 | + | ||
| 30567 | + /* TNETW1450-based cards will continue right away with | ||
| 30568 | + * the same USB ID after booting */ | ||
| 30569 | + } else { | ||
| 30570 | + /* First check if this is the "unbooted" hardware */ | ||
| 30571 | + if (usbdev->descriptor.idProduct == ACX100_PRODUCT_ID_UNBOOTED) { | ||
| 30572 | + | ||
| 30573 | + /* Boot the device (i.e. upload the firmware) */ | ||
| 30574 | + acxusb_boot(usbdev, is_tnetw1450, &radio_type); | ||
| 30575 | + | ||
| 30576 | + /* DWL-120+ will first boot the firmware, | ||
| 30577 | + * then later have a *separate* probe() run | ||
| 30578 | + * since its USB ID will have changed after | ||
| 30579 | + * firmware boot! | ||
| 30580 | + * Since the first probe() run has no | ||
| 30581 | + * other purpose than booting the firmware, | ||
| 30582 | + * simply return immediately. | ||
| 30583 | + */ | ||
| 30584 | + log(L_INIT, "finished booting, returning from probe()\n"); | ||
| 30585 | + result = OK; /* success */ | ||
| 30586 | + goto end; | ||
| 30587 | + } | ||
| 30588 | + else | ||
| 30589 | + /* device not unbooted, but invalid USB ID!? */ | ||
| 30590 | + if (usbdev->descriptor.idProduct != ACX100_PRODUCT_ID_BOOTED) | ||
| 30591 | + goto end_nodev; | ||
| 30592 | + } | ||
| 30593 | + | ||
| 30594 | +/* Ok, so it's our device and it has already booted */ | ||
| 30595 | + | ||
| 30596 | + /* Allocate memory for a network device */ | ||
| 30597 | + | ||
| 30598 | + ndev = alloc_netdev(sizeof(*adev), "wlan%d", dummy_netdev_init); | ||
| 30599 | + /* (NB: memsets to 0 entire area) */ | ||
| 30600 | + if (!ndev) { | ||
| 30601 | + msg = "acx: no memory for netdev\n"; | ||
| 30602 | + goto end_nomem; | ||
| 30603 | + } | ||
| 30604 | + | ||
| 30605 | + /* Register the callbacks for the network device functions */ | ||
| 30606 | + | ||
| 30607 | + ether_setup(ndev); | ||
| 30608 | + ndev->open = &acxusb_e_open; | ||
| 30609 | + ndev->stop = &acxusb_e_close; | ||
| 30610 | + ndev->hard_start_xmit = (void *)&acx_i_start_xmit; | ||
| 30611 | + ndev->get_stats = (void *)&acx_e_get_stats; | ||
| 30612 | +#if IW_HANDLER_VERSION <= 5 | ||
| 30613 | + ndev->get_wireless_stats = (void *)&acx_e_get_wireless_stats; | ||
| 30614 | +#endif | ||
| 30615 | + ndev->wireless_handlers = (struct iw_handler_def *)&acx_ioctl_handler_def; | ||
| 30616 | + ndev->set_multicast_list = (void *)&acxusb_i_set_rx_mode; | ||
| 30617 | +#ifdef HAVE_TX_TIMEOUT | ||
| 30618 | + ndev->tx_timeout = &acxusb_i_tx_timeout; | ||
| 30619 | + ndev->watchdog_timeo = 4 * HZ; | ||
| 30620 | +#endif | ||
| 30621 | + ndev->change_mtu = &acx_e_change_mtu; | ||
| 30622 | + SET_MODULE_OWNER(ndev); | ||
| 30623 | + | ||
| 30624 | + /* Setup private driver context */ | ||
| 30625 | + | ||
| 30626 | + adev = ndev2adev(ndev); | ||
| 30627 | + adev->ndev = ndev; | ||
| 30628 | + | ||
| 30629 | + adev->dev_type = DEVTYPE_USB; | ||
| 30630 | + adev->radio_type = radio_type; | ||
| 30631 | + if (is_tnetw1450) { | ||
| 30632 | + /* well, actually it's a TNETW1450, but since it | ||
| 30633 | + * seems to be sufficiently similar to TNETW1130, | ||
| 30634 | + * I don't want to change large amounts of code now */ | ||
| 30635 | + adev->chip_type = CHIPTYPE_ACX111; | ||
| 30636 | + } else { | ||
| 30637 | + adev->chip_type = CHIPTYPE_ACX100; | ||
| 30638 | + } | ||
| 30639 | + | ||
| 30640 | + adev->usbdev = usbdev; | ||
| 30641 | + spin_lock_init(&adev->lock); /* initial state: unlocked */ | ||
| 30642 | + sema_init(&adev->sem, 1); /* initial state: 1 (upped) */ | ||
| 30643 | + | ||
| 30644 | + /* Check that this is really the hardware we know about. | ||
| 30645 | + ** If not sure, at least notify the user that he | ||
| 30646 | + ** may be in trouble... | ||
| 30647 | + */ | ||
| 30648 | + numconfigs = (int)usbdev->descriptor.bNumConfigurations; | ||
| 30649 | + if (numconfigs != 1) | ||
| 30650 | + printk("acx: number of configurations is %d, " | ||
| 30651 | + "this driver only knows how to handle 1, " | ||
| 30652 | + "be prepared for surprises\n", numconfigs); | ||
| 30653 | + | ||
| 30654 | + config = &usbdev->config->desc; | ||
| 30655 | + numfaces = config->bNumInterfaces; | ||
| 30656 | + if (numfaces != 1) | ||
| 30657 | + printk("acx: number of interfaces is %d, " | ||
| 30658 | + "this driver only knows how to handle 1, " | ||
| 30659 | + "be prepared for surprises\n", numfaces); | ||
| 30660 | + | ||
| 30661 | + ifdesc = &intf->altsetting->desc; | ||
| 30662 | + numep = ifdesc->bNumEndpoints; | ||
| 30663 | + log(L_DEBUG, "# of endpoints: %d\n", numep); | ||
| 30664 | + | ||
| 30665 | + if (is_tnetw1450) { | ||
| 30666 | + adev->bulkoutep = 1; | ||
| 30667 | + adev->bulkinep = 2; | ||
| 30668 | + } else { | ||
| 30669 | + /* obtain information about the endpoint | ||
| 30670 | + ** addresses, begin with some default values | ||
| 30671 | + */ | ||
| 30672 | + adev->bulkoutep = 1; | ||
| 30673 | + adev->bulkinep = 1; | ||
| 30674 | + for (i = 0; i < numep; i++) { | ||
| 30675 | +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 11) | ||
| 30676 | + ep = usbdev->ep_in[i]; | ||
| 30677 | + if (!ep) | ||
| 30678 | + continue; | ||
| 30679 | + epdesc = &ep->desc; | ||
| 30680 | +#else | ||
| 30681 | + epdesc = usb_epnum_to_ep_desc(usbdev, i); | ||
| 30682 | + if (!epdesc) | ||
| 30683 | + continue; | ||
| 30684 | +#endif | ||
| 30685 | + if (epdesc->bmAttributes & USB_ENDPOINT_XFER_BULK) { | ||
| 30686 | + if (epdesc->bEndpointAddress & 0x80) | ||
| 30687 | + adev->bulkinep = epdesc->bEndpointAddress & 0xF; | ||
| 30688 | + else | ||
| 30689 | + adev->bulkoutep = epdesc->bEndpointAddress & 0xF; | ||
| 30690 | + } | ||
| 30691 | + } | ||
| 30692 | + } | ||
| 30693 | + log(L_DEBUG, "bulkout ep: 0x%X\n", adev->bulkoutep); | ||
| 30694 | + log(L_DEBUG, "bulkin ep: 0x%X\n", adev->bulkinep); | ||
| 30695 | + | ||
| 30696 | + /* already done by memset: adev->rxtruncsize = 0; */ | ||
| 30697 | + log(L_DEBUG, "TXBUFSIZE=%d RXBUFSIZE=%d\n", | ||
| 30698 | + (int) TXBUFSIZE, (int) RXBUFSIZE); | ||
| 30699 | + | ||
| 30700 | + /* Allocate the RX/TX containers. */ | ||
| 30701 | + adev->usb_tx = kmalloc(sizeof(usb_tx_t) * ACX_TX_URB_CNT, GFP_KERNEL); | ||
| 30702 | + if (!adev->usb_tx) { | ||
| 30703 | + msg = "acx: no memory for tx container"; | ||
| 30704 | + goto end_nomem; | ||
| 30705 | + } | ||
| 30706 | + adev->usb_rx = kmalloc(sizeof(usb_rx_t) * ACX_RX_URB_CNT, GFP_KERNEL); | ||
| 30707 | + if (!adev->usb_rx) { | ||
| 30708 | + msg = "acx: no memory for rx container"; | ||
| 30709 | + goto end_nomem; | ||
| 30710 | + } | ||
| 30711 | + | ||
| 30712 | + /* Setup URBs for bulk-in/out messages */ | ||
| 30713 | + for (i = 0; i < ACX_RX_URB_CNT; i++) { | ||
| 30714 | + adev->usb_rx[i].urb = usb_alloc_urb(0, GFP_KERNEL); | ||
| 30715 | + if (!adev->usb_rx[i].urb) { | ||
| 30716 | + msg = "acx: no memory for input URB\n"; | ||
| 30717 | + goto end_nomem; | ||
| 30718 | + } | ||
| 30719 | + adev->usb_rx[i].urb->status = 0; | ||
| 30720 | + adev->usb_rx[i].adev = adev; | ||
| 30721 | + adev->usb_rx[i].busy = 0; | ||
| 30722 | + } | ||
| 30723 | + | ||
| 30724 | + for (i = 0; i< ACX_TX_URB_CNT; i++) { | ||
| 30725 | + adev->usb_tx[i].urb = usb_alloc_urb(0, GFP_KERNEL); | ||
| 30726 | + if (!adev->usb_tx[i].urb) { | ||
| 30727 | + msg = "acx: no memory for output URB\n"; | ||
| 30728 | + goto end_nomem; | ||
| 30729 | + } | ||
| 30730 | + adev->usb_tx[i].urb->status = 0; | ||
| 30731 | + adev->usb_tx[i].adev = adev; | ||
| 30732 | + adev->usb_tx[i].busy = 0; | ||
| 30733 | + } | ||
| 30734 | + adev->tx_free = ACX_TX_URB_CNT; | ||
| 30735 | + | ||
| 30736 | + usb_set_intfdata(intf, adev); | ||
| 30737 | + SET_NETDEV_DEV(ndev, &intf->dev); | ||
| 30738 | + | ||
| 30739 | + /* TODO: move all of fw cmds to open()? But then we won't know our MAC addr | ||
| 30740 | + until ifup (it's available via reading ACX1xx_IE_DOT11_STATION_ID)... */ | ||
| 30741 | + | ||
| 30742 | + /* put acx out of sleep mode and initialize it */ | ||
| 30743 | + acx_s_issue_cmd(adev, ACX1xx_CMD_WAKE, NULL, 0); | ||
| 30744 | + | ||
| 30745 | + result = acx_s_init_mac(adev); | ||
| 30746 | + if (result) | ||
| 30747 | + goto end; | ||
| 30748 | + | ||
| 30749 | + /* TODO: see similar code in pci.c */ | ||
| 30750 | + acxusb_s_read_eeprom_version(adev); | ||
| 30751 | + acxusb_s_fill_configoption(adev); | ||
| 30752 | + acx_s_set_defaults(adev); | ||
| 30753 | + acx_s_get_firmware_version(adev); | ||
| 30754 | + acx_display_hardware_details(adev); | ||
| 30755 | + | ||
| 30756 | + /* Register the network device */ | ||
| 30757 | + log(L_INIT, "registering network device\n"); | ||
| 30758 | + result = register_netdev(ndev); | ||
| 30759 | + if (result) { | ||
| 30760 | + msg = "acx: failed to register USB network device " | ||
| 30761 | + "(error %d)\n"; | ||
| 30762 | + goto end_nomem; | ||
| 30763 | + } | ||
| 30764 | + | ||
| 30765 | + acx_proc_register_entries(ndev); | ||
| 30766 | + | ||
| 30767 | + acx_stop_queue(ndev, "on probe"); | ||
| 30768 | + acx_carrier_off(ndev, "on probe"); | ||
| 30769 | + | ||
| 30770 | + printk("acx: USB module " ACX_RELEASE " loaded successfully\n"); | ||
| 30771 | + | ||
| 30772 | +#if CMD_DISCOVERY | ||
| 30773 | + great_inquisitor(adev); | ||
| 30774 | +#endif | ||
| 30775 | + | ||
| 30776 | + /* Everything went OK, we are happy now */ | ||
| 30777 | + result = OK; | ||
| 30778 | + goto end; | ||
| 30779 | + | ||
| 30780 | +end_nomem: | ||
| 30781 | + printk(msg, result); | ||
| 30782 | + | ||
| 30783 | + if (ndev) { | ||
| 30784 | + if (adev->usb_rx) { | ||
| 30785 | + for (i = 0; i < ACX_RX_URB_CNT; i++) | ||
| 30786 | + usb_free_urb(adev->usb_rx[i].urb); | ||
| 30787 | + kfree(adev->usb_rx); | ||
| 30788 | + } | ||
| 30789 | + if (adev->usb_tx) { | ||
| 30790 | + for (i = 0; i < ACX_TX_URB_CNT; i++) | ||
| 30791 | + usb_free_urb(adev->usb_tx[i].urb); | ||
| 30792 | + kfree(adev->usb_tx); | ||
| 30793 | + } | ||
| 30794 | + free_netdev(ndev); | ||
| 30795 | + } | ||
| 30796 | + | ||
| 30797 | + result = -ENOMEM; | ||
| 30798 | + goto end; | ||
| 30799 | + | ||
| 30800 | +end_nodev: | ||
| 30801 | + /* no device we could handle, return error. */ | ||
| 30802 | + result = -EIO; | ||
| 30803 | + | ||
| 30804 | +end: | ||
| 30805 | + FN_EXIT1(result); | ||
| 30806 | + return result; | ||
| 30807 | +} | ||
| 30808 | + | ||
| 30809 | + | ||
| 30810 | +/*********************************************************************** | ||
| 30811 | +** acxusb_e_disconnect() | ||
| 30812 | +** | ||
| 30813 | +** This function is invoked whenever the user pulls the plug from the USB | ||
| 30814 | +** device or the module is removed from the kernel. In these cases, the | ||
| 30815 | +** network devices have to be taken down and all allocated memory has | ||
| 30816 | +** to be freed. | ||
| 30817 | +*/ | ||
| 30818 | +static void | ||
| 30819 | +acxusb_e_disconnect(struct usb_interface *intf) | ||
| 30820 | +{ | ||
| 30821 | + acx_device_t *adev = usb_get_intfdata(intf); | ||
| 30822 | + unsigned long flags; | ||
| 30823 | + int i; | ||
| 30824 | + | ||
| 30825 | + FN_ENTER; | ||
| 30826 | + | ||
| 30827 | + /* No WLAN device... no sense */ | ||
| 30828 | + if (!adev) | ||
| 30829 | + goto end; | ||
| 30830 | + | ||
| 30831 | + /* Unregister network device | ||
| 30832 | + * | ||
| 30833 | + * If the interface is up, unregister_netdev() will take | ||
| 30834 | + * care of calling our close() function, which takes | ||
| 30835 | + * care of unlinking the urbs, sending the device to | ||
| 30836 | + * sleep, etc... | ||
| 30837 | + * This can't be called with sem or lock held because | ||
| 30838 | + * _close() will try to grab it as well if it's called, | ||
| 30839 | + * deadlocking the machine. | ||
| 30840 | + */ | ||
| 30841 | + unregister_netdev(adev->ndev); | ||
| 30842 | + | ||
| 30843 | + acx_sem_lock(adev); | ||
| 30844 | + acx_lock(adev, flags); | ||
| 30845 | + /* This device exists no more */ | ||
| 30846 | + usb_set_intfdata(intf, NULL); | ||
| 30847 | + acx_proc_unregister_entries(adev->ndev); | ||
| 30848 | + | ||
| 30849 | + /* | ||
| 30850 | + * Here we only free them. _close() took care of | ||
| 30851 | + * unlinking them. | ||
| 30852 | + */ | ||
| 30853 | + for (i = 0; i < ACX_RX_URB_CNT; ++i) { | ||
| 30854 | + usb_free_urb(adev->usb_rx[i].urb); | ||
| 30855 | + } | ||
| 30856 | + for (i = 0; i< ACX_TX_URB_CNT; ++i) { | ||
| 30857 | + usb_free_urb(adev->usb_tx[i].urb); | ||
| 30858 | + } | ||
| 30859 | + | ||
| 30860 | + /* Freeing containers */ | ||
| 30861 | + kfree(adev->usb_rx); | ||
| 30862 | + kfree(adev->usb_tx); | ||
| 30863 | + | ||
| 30864 | + acx_unlock(adev, flags); | ||
| 30865 | + acx_sem_unlock(adev); | ||
| 30866 | + | ||
| 30867 | + free_netdev(adev->ndev); | ||
| 30868 | +end: | ||
| 30869 | + FN_EXIT0; | ||
| 30870 | +} | ||
| 30871 | + | ||
| 30872 | + | ||
| 30873 | +/*********************************************************************** | ||
| 30874 | +** acxusb_e_open() | ||
| 30875 | +** This function is called when the user sets up the network interface. | ||
| 30876 | +** It initializes a management timer, sets up the USB card and starts | ||
| 30877 | +** the network tx queue and USB receive. | ||
| 30878 | +*/ | ||
| 30879 | +static int | ||
| 30880 | +acxusb_e_open(struct net_device *ndev) | ||
| 30881 | +{ | ||
| 30882 | + acx_device_t *adev = ndev2adev(ndev); | ||
| 30883 | + unsigned long flags; | ||
| 30884 | + int i; | ||
| 30885 | + | ||
| 30886 | + FN_ENTER; | ||
| 30887 | + | ||
| 30888 | + acx_sem_lock(adev); | ||
| 30889 | + | ||
| 30890 | + /* put the ACX100 out of sleep mode */ | ||
| 30891 | + acx_s_issue_cmd(adev, ACX1xx_CMD_WAKE, NULL, 0); | ||
| 30892 | + | ||
| 30893 | + acx_init_task_scheduler(adev); | ||
| 30894 | + | ||
| 30895 | + init_timer(&adev->mgmt_timer); | ||
| 30896 | + adev->mgmt_timer.function = acx_i_timer; | ||
| 30897 | + adev->mgmt_timer.data = (unsigned long)adev; | ||
| 30898 | + | ||
| 30899 | + /* acx_s_start needs it */ | ||
| 30900 | + SET_BIT(adev->dev_state_mask, ACX_STATE_IFACE_UP); | ||
| 30901 | + acx_s_start(adev); | ||
| 30902 | + | ||
| 30903 | + /* don't acx_start_queue() here, we need to associate first */ | ||
| 30904 | + | ||
| 30905 | + acx_lock(adev, flags); | ||
| 30906 | + for (i = 0; i < ACX_RX_URB_CNT; i++) { | ||
| 30907 | + adev->usb_rx[i].urb->status = 0; | ||
| 30908 | + } | ||
| 30909 | + | ||
| 30910 | + acxusb_l_poll_rx(adev, &adev->usb_rx[0]); | ||
| 30911 | + | ||
| 30912 | + acx_unlock(adev, flags); | ||
| 30913 | + | ||
| 30914 | + acx_sem_unlock(adev); | ||
| 30915 | + | ||
| 30916 | + FN_EXIT0; | ||
| 30917 | + return 0; | ||
| 30918 | +} | ||
| 30919 | + | ||
| 30920 | + | ||
| 30921 | +/*********************************************************************** | ||
| 30922 | +** acxusb_e_close() | ||
| 30923 | +** | ||
| 30924 | +** This function stops the network functionality of the interface (invoked | ||
| 30925 | +** when the user calls ifconfig <wlan> down). The tx queue is halted and | ||
| 30926 | +** the device is marked as down. In case there were any pending USB bulk | ||
| 30927 | +** transfers, these are unlinked (asynchronously). The module in-use count | ||
| 30928 | +** is also decreased in this function. | ||
| 30929 | +*/ | ||
| 30930 | +static int | ||
| 30931 | +acxusb_e_close(struct net_device *ndev) | ||
| 30932 | +{ | ||
| 30933 | + acx_device_t *adev = ndev2adev(ndev); | ||
| 30934 | + unsigned long flags; | ||
| 30935 | + int i; | ||
| 30936 | + | ||
| 30937 | + FN_ENTER; | ||
| 30938 | + | ||
| 30939 | +#ifdef WE_STILL_DONT_CARE_ABOUT_IT | ||
| 30940 | + /* Transmit a disassociate frame */ | ||
| 30941 | + lock | ||
| 30942 | + acx_l_transmit_disassoc(adev, &client); | ||
| 30943 | + unlock | ||
| 30944 | +#endif | ||
| 30945 | + | ||
| 30946 | + acx_sem_lock(adev); | ||
| 30947 | + | ||
| 30948 | + CLEAR_BIT(adev->dev_state_mask, ACX_STATE_IFACE_UP); | ||
| 30949 | + | ||
| 30950 | +/* Code below is remarkably similar to acxpci_s_down(). Maybe we can merge them? */ | ||
| 30951 | + | ||
| 30952 | + /* Make sure we don't get any more rx requests */ | ||
| 30953 | + acx_s_issue_cmd(adev, ACX1xx_CMD_DISABLE_RX, NULL, 0); | ||
| 30954 | + acx_s_issue_cmd(adev, ACX1xx_CMD_DISABLE_TX, NULL, 0); | ||
| 30955 | + | ||
| 30956 | + /* | ||
| 30957 | + * We must do FLUSH *without* holding sem to avoid a deadlock. | ||
| 30958 | + * See pci.c:acxpci_s_down() for deails. | ||
| 30959 | + */ | ||
| 30960 | + acx_sem_unlock(adev); | ||
| 30961 | + FLUSH_SCHEDULED_WORK(); | ||
| 30962 | + acx_sem_lock(adev); | ||
| 30963 | + | ||
| 30964 | + /* Power down the device */ | ||
| 30965 | + acx_s_issue_cmd(adev, ACX1xx_CMD_SLEEP, NULL, 0); | ||
| 30966 | + | ||
| 30967 | + /* Stop the transmit queue, mark the device as DOWN */ | ||
| 30968 | + acx_lock(adev, flags); | ||
| 30969 | + acx_stop_queue(ndev, "on ifdown"); | ||
| 30970 | + acx_set_status(adev, ACX_STATUS_0_STOPPED); | ||
| 30971 | + /* stop pending rx/tx urb transfers */ | ||
| 30972 | + for (i = 0; i < ACX_TX_URB_CNT; i++) { | ||
| 30973 | + acxusb_unlink_urb(adev->usb_tx[i].urb); | ||
| 30974 | + adev->usb_tx[i].busy = 0; | ||
| 30975 | + } | ||
| 30976 | + for (i = 0; i < ACX_RX_URB_CNT; i++) { | ||
| 30977 | + acxusb_unlink_urb(adev->usb_rx[i].urb); | ||
| 30978 | + adev->usb_rx[i].busy = 0; | ||
| 30979 | + } | ||
| 30980 | + adev->tx_free = ACX_TX_URB_CNT; | ||
| 30981 | + acx_unlock(adev, flags); | ||
| 30982 | + | ||
| 30983 | + /* Must do this outside of lock */ | ||
| 30984 | + del_timer_sync(&adev->mgmt_timer); | ||
| 30985 | + | ||
| 30986 | + acx_sem_unlock(adev); | ||
| 30987 | + | ||
| 30988 | + FN_EXIT0; | ||
| 30989 | + return 0; | ||
| 30990 | +} | ||
| 30991 | + | ||
| 30992 | + | ||
| 30993 | +/*********************************************************************** | ||
| 30994 | +** acxusb_l_poll_rx | ||
| 30995 | +** This function (re)initiates a bulk-in USB transfer on a given urb | ||
| 30996 | +*/ | ||
| 30997 | +static void | ||
| 30998 | +acxusb_l_poll_rx(acx_device_t *adev, usb_rx_t* rx) | ||
| 30999 | +{ | ||
| 31000 | + struct usb_device *usbdev; | ||
| 31001 | + struct urb *rxurb; | ||
| 31002 | + int errcode, rxnum; | ||
| 31003 | + unsigned int inpipe; | ||
| 31004 | + | ||
| 31005 | + FN_ENTER; | ||
| 31006 | + | ||
| 31007 | + rxurb = rx->urb; | ||
| 31008 | + usbdev = adev->usbdev; | ||
| 31009 | + | ||
| 31010 | + rxnum = rx - adev->usb_rx; | ||
| 31011 | + | ||
| 31012 | + inpipe = usb_rcvbulkpipe(usbdev, adev->bulkinep); | ||
| 31013 | + if (unlikely(rxurb->status == -EINPROGRESS)) { | ||
| 31014 | + printk(KERN_ERR "acx: error, rx triggered while rx urb in progress\n"); | ||
| 31015 | + /* FIXME: this is nasty, receive is being cancelled by this code | ||
| 31016 | + * on the other hand, this should not happen anyway... | ||
| 31017 | + */ | ||
| 31018 | + usb_unlink_urb(rxurb); | ||
| 31019 | + } else | ||
| 31020 | + if (unlikely(rxurb->status == -ECONNRESET)) { | ||
| 31021 | + log(L_USBRXTX, "acx_usb: _poll_rx: connection reset\n"); | ||
| 31022 | + goto end; | ||
| 31023 | + } | ||
| 31024 | + rxurb->actual_length = 0; | ||
| 31025 | + usb_fill_bulk_urb(rxurb, usbdev, inpipe, | ||
| 31026 | + &rx->bulkin, /* dataptr */ | ||
| 31027 | + RXBUFSIZE, /* size */ | ||
| 31028 | + acxusb_i_complete_rx, /* handler */ | ||
| 31029 | + rx /* handler param */ | ||
| 31030 | + ); | ||
| 31031 | + rxurb->transfer_flags = URB_ASYNC_UNLINK; | ||
| 31032 | + | ||
| 31033 | + /* ATOMIC: we may be called from complete_rx() usb callback */ | ||
| 31034 | + errcode = usb_submit_urb(rxurb, GFP_ATOMIC); | ||
| 31035 | + /* FIXME: evaluate the error code! */ | ||
| 31036 | + log(L_USBRXTX, "SUBMIT RX (%d) inpipe=0x%X size=%d errcode=%d\n", | ||
| 31037 | + rxnum, inpipe, (int) RXBUFSIZE, errcode); | ||
| 31038 | +end: | ||
| 31039 | + FN_EXIT0; | ||
| 31040 | +} | ||
| 31041 | + | ||
| 31042 | + | ||
| 31043 | +/*********************************************************************** | ||
| 31044 | +** acxusb_i_complete_rx() | ||
| 31045 | +** Inputs: | ||
| 31046 | +** urb -> pointer to USB request block | ||
| 31047 | +** regs -> pointer to register-buffer for syscalls (see asm/ptrace.h) | ||
| 31048 | +** | ||
| 31049 | +** This function is invoked by USB subsystem whenever a bulk receive | ||
| 31050 | +** request returns. | ||
| 31051 | +** The received data is then committed to the network stack and the next | ||
| 31052 | +** USB receive is triggered. | ||
| 31053 | +*/ | ||
| 31054 | +static void | ||
| 31055 | +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 19) | ||
| 31056 | +acxusb_i_complete_rx(struct urb *urb) | ||
| 31057 | +#else | ||
| 31058 | +acxusb_i_complete_rx(struct urb *urb, struct pt_regs *regs) | ||
| 31059 | +#endif | ||
| 31060 | +{ | ||
| 31061 | + acx_device_t *adev; | ||
| 31062 | + rxbuffer_t *ptr; | ||
| 31063 | + rxbuffer_t *inbuf; | ||
| 31064 | + usb_rx_t *rx; | ||
| 31065 | + unsigned long flags; | ||
| 31066 | + int size, remsize, packetsize, rxnum; | ||
| 31067 | + | ||
| 31068 | + FN_ENTER; | ||
| 31069 | + | ||
| 31070 | + BUG_ON(!urb->context); | ||
| 31071 | + | ||
| 31072 | + rx = (usb_rx_t *)urb->context; | ||
| 31073 | + adev = rx->adev; | ||
| 31074 | + | ||
| 31075 | + acx_lock(adev, flags); | ||
| 31076 | + | ||
| 31077 | + /* | ||
| 31078 | + * Happens on disconnect or close. Don't play with the urb. | ||
| 31079 | + * Don't resubmit it. It will get unlinked by close() | ||
| 31080 | + */ | ||
| 31081 | + if (unlikely(!(adev->dev_state_mask & ACX_STATE_IFACE_UP))) { | ||
| 31082 | + log(L_USBRXTX, "rx: device is down, not doing anything\n"); | ||
| 31083 | + goto end_unlock; | ||
| 31084 | + } | ||
| 31085 | + | ||
| 31086 | + inbuf = &rx->bulkin; | ||
| 31087 | + size = urb->actual_length; | ||
| 31088 | + remsize = size; | ||
| 31089 | + rxnum = rx - adev->usb_rx; | ||
| 31090 | + | ||
| 31091 | + log(L_USBRXTX, "RETURN RX (%d) status=%d size=%d\n", | ||
| 31092 | + rxnum, urb->status, size); | ||
| 31093 | + | ||
| 31094 | + /* Send the URB that's waiting. */ | ||
| 31095 | + log(L_USBRXTX, "rxnum=%d, sending=%d\n", rxnum, rxnum^1); | ||
| 31096 | + acxusb_l_poll_rx(adev, &adev->usb_rx[rxnum^1]); | ||
| 31097 | + | ||
| 31098 | + if (unlikely(size > sizeof(rxbuffer_t))) | ||
| 31099 | + printk("acx_usb: rx too large: %d, please report\n", size); | ||
| 31100 | + | ||
| 31101 | + /* check if the transfer was aborted */ | ||
| 31102 | + switch (urb->status) { | ||
| 31103 | + case 0: /* No error */ | ||
| 31104 | + break; | ||
| 31105 | + case -EOVERFLOW: | ||
| 31106 | + printk(KERN_ERR "acx: rx data overrun\n"); | ||
| 31107 | + adev->rxtruncsize = 0; /* Not valid anymore. */ | ||
| 31108 | + goto end_unlock; | ||
| 31109 | + case -ECONNRESET: | ||
| 31110 | + adev->rxtruncsize = 0; | ||
| 31111 | + goto end_unlock; | ||
| 31112 | + case -ESHUTDOWN: /* rmmod */ | ||
| 31113 | + adev->rxtruncsize = 0; | ||
| 31114 | + goto end_unlock; | ||
| 31115 | + default: | ||
| 31116 | + adev->rxtruncsize = 0; | ||
| 31117 | + adev->stats.rx_errors++; | ||
| 31118 | + printk("acx: rx error (urb status=%d)\n", urb->status); | ||
| 31119 | + goto end_unlock; | ||
| 31120 | + } | ||
| 31121 | + | ||
| 31122 | + if (unlikely(!size)) | ||
| 31123 | + printk("acx: warning, encountered zerolength rx packet\n"); | ||
| 31124 | + | ||
| 31125 | + if (urb->transfer_buffer != inbuf) | ||
| 31126 | + goto end_unlock; | ||
| 31127 | + | ||
| 31128 | + /* check if previous frame was truncated | ||
| 31129 | + ** FIXME: this code can only handle truncation | ||
| 31130 | + ** of consecutive packets! | ||
| 31131 | + */ | ||
| 31132 | + ptr = inbuf; | ||
| 31133 | + if (adev->rxtruncsize) { | ||
| 31134 | + int tail_size; | ||
| 31135 | + | ||
| 31136 | + ptr = &adev->rxtruncbuf; | ||
| 31137 | + packetsize = RXBUF_BYTES_USED(ptr); | ||
| 31138 | + if (acx_debug & L_USBRXTX) { | ||
| 31139 | + printk("handling truncated frame (truncsize=%d size=%d " | ||
| 31140 | + "packetsize(from trunc)=%d)\n", | ||
| 31141 | + adev->rxtruncsize, size, packetsize); | ||
| 31142 | + acx_dump_bytes(ptr, RXBUF_HDRSIZE); | ||
| 31143 | + acx_dump_bytes(inbuf, RXBUF_HDRSIZE); | ||
| 31144 | + } | ||
| 31145 | + | ||
| 31146 | + /* bytes needed for rxtruncbuf completion: */ | ||
| 31147 | + tail_size = packetsize - adev->rxtruncsize; | ||
| 31148 | + | ||
| 31149 | + if (size < tail_size) { | ||
| 31150 | + /* there is not enough data to complete this packet, | ||
| 31151 | + ** simply append the stuff to the truncation buffer | ||
| 31152 | + */ | ||
| 31153 | + memcpy(((char *)ptr) + adev->rxtruncsize, inbuf, size); | ||
| 31154 | + adev->rxtruncsize += size; | ||
| 31155 | + remsize = 0; | ||
| 31156 | + } else { | ||
| 31157 | + /* ok, this data completes the previously | ||
| 31158 | + ** truncated packet. copy it into a descriptor | ||
| 31159 | + ** and give it to the rest of the stack */ | ||
| 31160 | + | ||
| 31161 | + /* append tail to previously truncated part | ||
| 31162 | + ** NB: adev->rxtruncbuf (pointed to by ptr) can't | ||
| 31163 | + ** overflow because this is already checked before | ||
| 31164 | + ** truncation buffer was filled. See below, | ||
| 31165 | + ** "if (packetsize > sizeof(rxbuffer_t))..." code */ | ||
| 31166 | + memcpy(((char *)ptr) + adev->rxtruncsize, inbuf, tail_size); | ||
| 31167 | + | ||
| 31168 | + if (acx_debug & L_USBRXTX) { | ||
| 31169 | + printk("full trailing packet + 12 bytes:\n"); | ||
| 31170 | + acx_dump_bytes(inbuf, tail_size + RXBUF_HDRSIZE); | ||
| 31171 | + } | ||
| 31172 | + acx_l_process_rxbuf(adev, ptr); | ||
| 31173 | + adev->rxtruncsize = 0; | ||
| 31174 | + ptr = (rxbuffer_t *) (((char *)inbuf) + tail_size); | ||
| 31175 | + remsize -= tail_size; | ||
| 31176 | + } | ||
| 31177 | + log(L_USBRXTX, "post-merge size=%d remsize=%d\n", | ||
| 31178 | + size, remsize); | ||
| 31179 | + } | ||
| 31180 | + | ||
| 31181 | + /* size = USB data block size | ||
| 31182 | + ** remsize = unprocessed USB bytes left | ||
| 31183 | + ** ptr = current pos in USB data block | ||
| 31184 | + */ | ||
| 31185 | + while (remsize) { | ||
| 31186 | + if (remsize < RXBUF_HDRSIZE) { | ||
| 31187 | + printk("acx: truncated rx header (%d bytes)!\n", | ||
| 31188 | + remsize); | ||
| 31189 | + if (ACX_DEBUG) | ||
| 31190 | + acx_dump_bytes(ptr, remsize); | ||
| 31191 | + break; | ||
| 31192 | + } | ||
| 31193 | + | ||
| 31194 | + packetsize = RXBUF_BYTES_USED(ptr); | ||
| 31195 | + log(L_USBRXTX, "packet with packetsize=%d\n", packetsize); | ||
| 31196 | + | ||
| 31197 | + if (RXBUF_IS_TXSTAT(ptr)) { | ||
| 31198 | + /* do rate handling */ | ||
| 31199 | + usb_txstatus_t *stat = (void*)ptr; | ||
| 31200 | + u16 client_no = (u16)stat->hostdata; | ||
| 31201 | + | ||
| 31202 | + log(L_USBRXTX, "tx: stat: mac_cnt_rcvd:%04X " | ||
| 31203 | + "queue_index:%02X mac_status:%02X hostdata:%08X " | ||
| 31204 | + "rate:%u ack_failures:%02X rts_failures:%02X " | ||
| 31205 | + "rts_ok:%02X\n", | ||
| 31206 | + stat->mac_cnt_rcvd, | ||
| 31207 | + stat->queue_index, stat->mac_status, stat->hostdata, | ||
| 31208 | + stat->rate, stat->ack_failures, stat->rts_failures, | ||
| 31209 | + stat->rts_ok); | ||
| 31210 | + | ||
| 31211 | + if (adev->rate_auto && client_no < VEC_SIZE(adev->sta_list)) { | ||
| 31212 | + client_t *clt = &adev->sta_list[client_no]; | ||
| 31213 | + u16 cur = stat->hostdata >> 16; | ||
| 31214 | + | ||
| 31215 | + if (clt && clt->rate_cur == cur) { | ||
| 31216 | + acx_l_handle_txrate_auto(adev, clt, | ||
| 31217 | + cur, /* intended rate */ | ||
| 31218 | + stat->rate, 0, /* actually used rate */ | ||
| 31219 | + stat->mac_status, /* error? */ | ||
| 31220 | + ACX_TX_URB_CNT - adev->tx_free); | ||
| 31221 | + } | ||
| 31222 | + } | ||
| 31223 | + goto next; | ||
| 31224 | + } | ||
| 31225 | + | ||
| 31226 | + if (packetsize > sizeof(rxbuffer_t)) { | ||
| 31227 | + printk("acx: packet exceeds max wlan " | ||
| 31228 | + "frame size (%d > %d). size=%d\n", | ||
| 31229 | + packetsize, (int) sizeof(rxbuffer_t), size); | ||
| 31230 | + if (ACX_DEBUG) | ||
| 31231 | + acx_dump_bytes(ptr, 16); | ||
| 31232 | + /* FIXME: put some real error-handling in here! */ | ||
| 31233 | + break; | ||
| 31234 | + } | ||
| 31235 | + | ||
| 31236 | + if (packetsize > remsize) { | ||
| 31237 | + /* frame truncation handling */ | ||
| 31238 | + if (acx_debug & L_USBRXTX) { | ||
| 31239 | + printk("need to truncate packet, " | ||
| 31240 | + "packetsize=%d remsize=%d " | ||
| 31241 | + "size=%d bytes:", | ||
| 31242 | + packetsize, remsize, size); | ||
| 31243 | + acx_dump_bytes(ptr, RXBUF_HDRSIZE); | ||
| 31244 | + } | ||
| 31245 | + memcpy(&adev->rxtruncbuf, ptr, remsize); | ||
| 31246 | + adev->rxtruncsize = remsize; | ||
| 31247 | + break; | ||
| 31248 | + } | ||
| 31249 | + | ||
| 31250 | + /* packetsize <= remsize */ | ||
| 31251 | + /* now handle the received data */ | ||
| 31252 | + acx_l_process_rxbuf(adev, ptr); | ||
| 31253 | +next: | ||
| 31254 | + ptr = (rxbuffer_t *)(((char *)ptr) + packetsize); | ||
| 31255 | + remsize -= packetsize; | ||
| 31256 | + if ((acx_debug & L_USBRXTX) && remsize) { | ||
| 31257 | + printk("more than one packet in buffer, " | ||
| 31258 | + "second packet hdr:"); | ||
| 31259 | + acx_dump_bytes(ptr, RXBUF_HDRSIZE); | ||
| 31260 | + } | ||
| 31261 | + } | ||
| 31262 | + | ||
| 31263 | +end_unlock: | ||
| 31264 | + acx_unlock(adev, flags); | ||
| 31265 | +/* end: */ | ||
| 31266 | + FN_EXIT0; | ||
| 31267 | +} | ||
| 31268 | + | ||
| 31269 | + | ||
| 31270 | +/*********************************************************************** | ||
| 31271 | +** acxusb_i_complete_tx() | ||
| 31272 | +** Inputs: | ||
| 31273 | +** urb -> pointer to USB request block | ||
| 31274 | +** regs -> pointer to register-buffer for syscalls (see asm/ptrace.h) | ||
| 31275 | +** | ||
| 31276 | +** This function is invoked upon termination of a USB transfer. | ||
| 31277 | +*/ | ||
| 31278 | +static void | ||
| 31279 | +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 19) | ||
| 31280 | +acxusb_i_complete_tx(struct urb *urb) | ||
| 31281 | +#else | ||
| 31282 | +acxusb_i_complete_tx(struct urb *urb, struct pt_regs *regs) | ||
| 31283 | +#endif | ||
| 31284 | +{ | ||
| 31285 | + acx_device_t *adev; | ||
| 31286 | + usb_tx_t *tx; | ||
| 31287 | + unsigned long flags; | ||
| 31288 | + int txnum; | ||
| 31289 | + | ||
| 31290 | + FN_ENTER; | ||
| 31291 | + | ||
| 31292 | + BUG_ON(!urb->context); | ||
| 31293 | + | ||
| 31294 | + tx = (usb_tx_t *)urb->context; | ||
| 31295 | + adev = tx->adev; | ||
| 31296 | + | ||
| 31297 | + txnum = tx - adev->usb_tx; | ||
| 31298 | + | ||
| 31299 | + acx_lock(adev, flags); | ||
| 31300 | + | ||
| 31301 | + /* | ||
| 31302 | + * If the iface isn't up, we don't have any right | ||
| 31303 | + * to play with them. The urb may get unlinked. | ||
| 31304 | + */ | ||
| 31305 | + if (unlikely(!(adev->dev_state_mask & ACX_STATE_IFACE_UP))) { | ||
| 31306 | + log(L_USBRXTX, "tx: device is down, not doing anything\n"); | ||
| 31307 | + goto end_unlock; | ||
| 31308 | + } | ||
| 31309 | + | ||
| 31310 | + log(L_USBRXTX, "RETURN TX (%d): status=%d size=%d\n", | ||
| 31311 | + txnum, urb->status, urb->actual_length); | ||
| 31312 | + | ||
| 31313 | + /* handle USB transfer errors */ | ||
| 31314 | + switch (urb->status) { | ||
| 31315 | + case 0: /* No error */ | ||
| 31316 | + break; | ||
| 31317 | + case -ESHUTDOWN: | ||
| 31318 | + goto end_unlock; | ||
| 31319 | + break; | ||
| 31320 | + case -ECONNRESET: | ||
| 31321 | + goto end_unlock; | ||
| 31322 | + break; | ||
| 31323 | + /* FIXME: real error-handling code here please */ | ||
| 31324 | + default: | ||
| 31325 | + printk(KERN_ERR "acx: tx error, urb status=%d\n", urb->status); | ||
| 31326 | + /* FIXME: real error-handling code here please */ | ||
| 31327 | + } | ||
| 31328 | + | ||
| 31329 | + /* free the URB and check for more data */ | ||
| 31330 | + tx->busy = 0; | ||
| 31331 | + adev->tx_free++; | ||
| 31332 | + if ((adev->tx_free >= TX_START_QUEUE) | ||
| 31333 | + && (adev->status == ACX_STATUS_4_ASSOCIATED) | ||
| 31334 | + && (acx_queue_stopped(adev->ndev)) | ||
| 31335 | + ) { | ||
| 31336 | + log(L_BUF, "tx: wake queue (%u free txbufs)\n", | ||
| 31337 | + adev->tx_free); | ||
| 31338 | + acx_wake_queue(adev->ndev, NULL); | ||
| 31339 | + } | ||
| 31340 | + | ||
| 31341 | +end_unlock: | ||
| 31342 | + acx_unlock(adev, flags); | ||
| 31343 | +/* end: */ | ||
| 31344 | + FN_EXIT0; | ||
| 31345 | +} | ||
| 31346 | + | ||
| 31347 | + | ||
| 31348 | +/*************************************************************** | ||
| 31349 | +** acxusb_l_alloc_tx | ||
| 31350 | +** Actually returns a usb_tx_t* ptr | ||
| 31351 | +*/ | ||
| 31352 | +tx_t* | ||
| 31353 | +acxusb_l_alloc_tx(acx_device_t *adev) | ||
| 31354 | +{ | ||
| 31355 | + usb_tx_t *tx; | ||
| 31356 | + unsigned head; | ||
| 31357 | + | ||
| 31358 | + FN_ENTER; | ||
| 31359 | + | ||
| 31360 | + head = adev->tx_head; | ||
| 31361 | + do { | ||
| 31362 | + head = (head + 1) % ACX_TX_URB_CNT; | ||
| 31363 | + if (!adev->usb_tx[head].busy) { | ||
| 31364 | + log(L_USBRXTX, "allocated tx %d\n", head); | ||
| 31365 | + tx = &adev->usb_tx[head]; | ||
| 31366 | + tx->busy = 1; | ||
| 31367 | + adev->tx_free--; | ||
| 31368 | + /* Keep a few free descs between head and tail of tx ring. | ||
| 31369 | + ** It is not absolutely needed, just feels safer */ | ||
| 31370 | + if (adev->tx_free < TX_STOP_QUEUE) { | ||
| 31371 | + log(L_BUF, "tx: stop queue " | ||
| 31372 | + "(%u free txbufs)\n", adev->tx_free); | ||
| 31373 | + acx_stop_queue(adev->ndev, NULL); | ||
| 31374 | + } | ||
| 31375 | + goto end; | ||
| 31376 | + } | ||
| 31377 | + } while (likely(head!=adev->tx_head)); | ||
| 31378 | + tx = NULL; | ||
| 31379 | + printk_ratelimited("acx: tx buffers full\n"); | ||
| 31380 | +end: | ||
| 31381 | + adev->tx_head = head; | ||
| 31382 | + FN_EXIT0; | ||
| 31383 | + return (tx_t*)tx; | ||
| 31384 | +} | ||
| 31385 | + | ||
| 31386 | + | ||
| 31387 | +/*************************************************************** | ||
| 31388 | +** Used if alloc_tx()'ed buffer needs to be cancelled without doing tx | ||
| 31389 | +*/ | ||
| 31390 | +void | ||
| 31391 | +acxusb_l_dealloc_tx(tx_t *tx_opaque) | ||
| 31392 | +{ | ||
| 31393 | + usb_tx_t* tx = (usb_tx_t*)tx_opaque; | ||
| 31394 | + tx->busy = 0; | ||
| 31395 | +} | ||
| 31396 | + | ||
| 31397 | + | ||
| 31398 | +/*************************************************************** | ||
| 31399 | +*/ | ||
| 31400 | +void* | ||
| 31401 | +acxusb_l_get_txbuf(acx_device_t *adev, tx_t* tx_opaque) | ||
| 31402 | +{ | ||
| 31403 | + usb_tx_t* tx = (usb_tx_t*)tx_opaque; | ||
| 31404 | + return &tx->bulkout.data; | ||
| 31405 | +} | ||
| 31406 | + | ||
| 31407 | + | ||
| 31408 | +/*************************************************************** | ||
| 31409 | +** acxusb_l_tx_data | ||
| 31410 | +** | ||
| 31411 | +** Can be called from IRQ (rx -> (AP bridging or mgmt response) -> tx). | ||
| 31412 | +** Can be called from acx_i_start_xmit (data frames from net core). | ||
| 31413 | +*/ | ||
| 31414 | +void | ||
| 31415 | +acxusb_l_tx_data(acx_device_t *adev, tx_t* tx_opaque, int wlanpkt_len) | ||
| 31416 | +{ | ||
| 31417 | + struct usb_device *usbdev; | ||
| 31418 | + struct urb* txurb; | ||
| 31419 | + usb_tx_t* tx; | ||
| 31420 | + usb_txbuffer_t* txbuf; | ||
| 31421 | + client_t *clt; | ||
| 31422 | + wlan_hdr_t* whdr; | ||
| 31423 | + unsigned int outpipe; | ||
| 31424 | + int ucode, txnum; | ||
| 31425 | + | ||
| 31426 | + FN_ENTER; | ||
| 31427 | + | ||
| 31428 | + tx = ((usb_tx_t *)tx_opaque); | ||
| 31429 | + txurb = tx->urb; | ||
| 31430 | + txbuf = &tx->bulkout; | ||
| 31431 | + whdr = (wlan_hdr_t *)txbuf->data; | ||
| 31432 | + txnum = tx - adev->usb_tx; | ||
| 31433 | + | ||
| 31434 | + log(L_DEBUG, "using buf#%d free=%d len=%d\n", | ||
| 31435 | + txnum, adev->tx_free, wlanpkt_len); | ||
| 31436 | + | ||
| 31437 | + switch (adev->mode) { | ||
| 31438 | + case ACX_MODE_0_ADHOC: | ||
| 31439 | + case ACX_MODE_3_AP: | ||
| 31440 | + clt = acx_l_sta_list_get(adev, whdr->a1); | ||
| 31441 | + break; | ||
| 31442 | + case ACX_MODE_2_STA: | ||
| 31443 | + clt = adev->ap_client; | ||
| 31444 | + break; | ||
| 31445 | + default: /* ACX_MODE_OFF, ACX_MODE_MONITOR */ | ||
| 31446 | + clt = NULL; | ||
| 31447 | + break; | ||
| 31448 | + } | ||
| 31449 | + | ||
| 31450 | + if (unlikely(clt && !clt->rate_cur)) { | ||
| 31451 | + printk("acx: driver bug! bad ratemask\n"); | ||
| 31452 | + goto end; | ||
| 31453 | + } | ||
| 31454 | + | ||
| 31455 | + /* fill the USB transfer header */ | ||
| 31456 | + txbuf->desc = cpu_to_le16(USB_TXBUF_TXDESC); | ||
| 31457 | + txbuf->mpdu_len = cpu_to_le16(wlanpkt_len); | ||
| 31458 | + txbuf->queue_index = 1; | ||
| 31459 | + if (clt) { | ||
| 31460 | + txbuf->rate = clt->rate_100; | ||
| 31461 | + txbuf->hostdata = (clt - adev->sta_list) | (clt->rate_cur << 16); | ||
| 31462 | + } else { | ||
| 31463 | + txbuf->rate = adev->rate_bcast100; | ||
| 31464 | + txbuf->hostdata = ((u16)-1) | (adev->rate_bcast << 16); | ||
| 31465 | + } | ||
| 31466 | + txbuf->ctrl1 = DESC_CTL_FIRSTFRAG; | ||
| 31467 | + if (1 == adev->preamble_cur) | ||
| 31468 | + SET_BIT(txbuf->ctrl1, DESC_CTL_SHORT_PREAMBLE); | ||
| 31469 | + txbuf->ctrl2 = 0; | ||
| 31470 | + txbuf->data_len = cpu_to_le16(wlanpkt_len); | ||
| 31471 | + | ||
| 31472 | + if (unlikely(acx_debug & L_DATA)) { | ||
| 31473 | + printk("dump of bulk out urb:\n"); | ||
| 31474 | + acx_dump_bytes(txbuf, wlanpkt_len + USB_TXBUF_HDRSIZE); | ||
| 31475 | + } | ||
| 31476 | + | ||
| 31477 | + if (unlikely(txurb->status == -EINPROGRESS)) { | ||
| 31478 | + printk("acx: trying to submit tx urb while already in progress\n"); | ||
| 31479 | + } | ||
| 31480 | + | ||
| 31481 | + /* now schedule the USB transfer */ | ||
| 31482 | + usbdev = adev->usbdev; | ||
| 31483 | + outpipe = usb_sndbulkpipe(usbdev, adev->bulkoutep); | ||
| 31484 | + | ||
| 31485 | + usb_fill_bulk_urb(txurb, usbdev, outpipe, | ||
| 31486 | + txbuf, /* dataptr */ | ||
| 31487 | + wlanpkt_len + USB_TXBUF_HDRSIZE, /* size */ | ||
| 31488 | + acxusb_i_complete_tx, /* handler */ | ||
| 31489 | + tx /* handler param */ | ||
| 31490 | + ); | ||
| 31491 | + | ||
| 31492 | + txurb->transfer_flags = URB_ASYNC_UNLINK|URB_ZERO_PACKET; | ||
| 31493 | + ucode = usb_submit_urb(txurb, GFP_ATOMIC); | ||
| 31494 | + log(L_USBRXTX, "SUBMIT TX (%d): outpipe=0x%X buf=%p txsize=%d " | ||
| 31495 | + "rate=%u errcode=%d\n", txnum, outpipe, txbuf, | ||
| 31496 | + wlanpkt_len + USB_TXBUF_HDRSIZE, txbuf->rate, ucode); | ||
| 31497 | + | ||
| 31498 | + if (unlikely(ucode)) { | ||
| 31499 | + printk(KERN_ERR "acx: submit_urb() error=%d txsize=%d\n", | ||
| 31500 | + ucode, wlanpkt_len + USB_TXBUF_HDRSIZE); | ||
| 31501 | + | ||
| 31502 | + /* on error, just mark the frame as done and update | ||
| 31503 | + ** the statistics | ||
| 31504 | + */ | ||
| 31505 | + adev->stats.tx_errors++; | ||
| 31506 | + tx->busy = 0; | ||
| 31507 | + adev->tx_free++; | ||
| 31508 | + /* needed? if (adev->tx_free > TX_START_QUEUE) acx_wake_queue(...) */ | ||
| 31509 | + } | ||
| 31510 | +end: | ||
| 31511 | + FN_EXIT0; | ||
| 31512 | +} | ||
| 31513 | + | ||
| 31514 | + | ||
| 31515 | +/*********************************************************************** | ||
| 31516 | +*/ | ||
| 31517 | +static void | ||
| 31518 | +acxusb_i_set_rx_mode(struct net_device *ndev) | ||
| 31519 | +{ | ||
| 31520 | +} | ||
| 31521 | + | ||
| 31522 | + | ||
| 31523 | +/*********************************************************************** | ||
| 31524 | +*/ | ||
| 31525 | +#ifdef HAVE_TX_TIMEOUT | ||
| 31526 | +static void | ||
| 31527 | +acxusb_i_tx_timeout(struct net_device *ndev) | ||
| 31528 | +{ | ||
| 31529 | + acx_device_t *adev = ndev2adev(ndev); | ||
| 31530 | + unsigned long flags; | ||
| 31531 | + int i; | ||
| 31532 | + | ||
| 31533 | + FN_ENTER; | ||
| 31534 | + | ||
| 31535 | + acx_lock(adev, flags); | ||
| 31536 | + /* unlink the URBs */ | ||
| 31537 | + for (i = 0; i < ACX_TX_URB_CNT; i++) { | ||
| 31538 | + acxusb_unlink_urb(adev->usb_tx[i].urb); | ||
| 31539 | + adev->usb_tx[i].busy = 0; | ||
| 31540 | + } | ||
| 31541 | + adev->tx_free = ACX_TX_URB_CNT; | ||
| 31542 | + /* TODO: stats update */ | ||
| 31543 | + acx_unlock(adev, flags); | ||
| 31544 | + | ||
| 31545 | + FN_EXIT0; | ||
| 31546 | +} | ||
| 31547 | +#endif | ||
| 31548 | + | ||
| 31549 | + | ||
| 31550 | +/*********************************************************************** | ||
| 31551 | +** init_module() | ||
| 31552 | +** | ||
| 31553 | +** This function is invoked upon loading of the kernel module. | ||
| 31554 | +** It registers itself at the kernel's USB subsystem. | ||
| 31555 | +** | ||
| 31556 | +** Returns: Errorcode on failure, 0 on success | ||
| 31557 | +*/ | ||
| 31558 | +int __init | ||
| 31559 | +acxusb_e_init_module(void) | ||
| 31560 | +{ | ||
| 31561 | + log(L_INIT, "USB module " ACX_RELEASE " initialized, " | ||
| 31562 | + "probing for devices...\n"); | ||
| 31563 | + return usb_register(&acxusb_driver); | ||
| 31564 | +} | ||
| 31565 | + | ||
| 31566 | + | ||
| 31567 | + | ||
| 31568 | +/*********************************************************************** | ||
| 31569 | +** cleanup_module() | ||
| 31570 | +** | ||
| 31571 | +** This function is invoked as last step of the module unloading. It simply | ||
| 31572 | +** deregisters this module at the kernel's USB subsystem. | ||
| 31573 | +*/ | ||
| 31574 | +void __exit | ||
| 31575 | +acxusb_e_cleanup_module() | ||
| 31576 | +{ | ||
| 31577 | + usb_deregister(&acxusb_driver); | ||
| 31578 | +} | ||
| 31579 | + | ||
| 31580 | + | ||
| 31581 | +/*********************************************************************** | ||
| 31582 | +** DEBUG STUFF | ||
| 31583 | +*/ | ||
| 31584 | +#if ACX_DEBUG | ||
| 31585 | + | ||
| 31586 | +#ifdef UNUSED | ||
| 31587 | +static void | ||
| 31588 | +dump_device(struct usb_device *usbdev) | ||
| 31589 | +{ | ||
| 31590 | + int i; | ||
| 31591 | + struct usb_config_descriptor *cd; | ||
| 31592 | + | ||
| 31593 | + printk("acx device dump:\n"); | ||
| 31594 | + printk(" devnum: %d\n", usbdev->devnum); | ||
| 31595 | + printk(" speed: %d\n", usbdev->speed); | ||
| 31596 | + printk(" tt: 0x%X\n", (unsigned int)(usbdev->tt)); | ||
| 31597 | + printk(" ttport: %d\n", (unsigned int)(usbdev->ttport)); | ||
| 31598 | + printk(" toggle[0]: 0x%X toggle[1]: 0x%X\n", (unsigned int)(usbdev->toggle[0]), (unsigned int)(usbdev->toggle[1])); | ||
| 31599 | +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 11) | ||
| 31600 | + /* This saw a change after 2.6.10 */ | ||
| 31601 | + printk(" ep_in wMaxPacketSize: "); | ||
| 31602 | + for (i = 0; i < 16; ++i) | ||
| 31603 | + if (usbdev->ep_in[i] != NULL) | ||
| 31604 | + printk("%d:%d ", i, usbdev->ep_in[i]->desc.wMaxPacketSize); | ||
| 31605 | + printk("\n"); | ||
| 31606 | + printk(" ep_out wMaxPacketSize: "); | ||
| 31607 | + for (i = 0; i < VEC_SIZE(usbdev->ep_out); ++i) | ||
| 31608 | + if (usbdev->ep_out[i] != NULL) | ||
| 31609 | + printk("%d:%d ", i, usbdev->ep_out[i]->desc.wMaxPacketSize); | ||
| 31610 | + printk("\n"); | ||
| 31611 | +#else | ||
| 31612 | + printk(" epmaxpacketin: "); | ||
| 31613 | + for (i = 0; i < 16; i++) | ||
| 31614 | + printk("%d ", usbdev->epmaxpacketin[i]); | ||
| 31615 | + printk("\n"); | ||
| 31616 | + printk(" epmaxpacketout: "); | ||
| 31617 | + for (i = 0; i < 16; i++) | ||
| 31618 | + printk("%d ", usbdev->epmaxpacketout[i]); | ||
| 31619 | + printk("\n"); | ||
| 31620 | +#endif | ||
| 31621 | + printk(" parent: 0x%X\n", (unsigned int)usbdev->parent); | ||
| 31622 | + printk(" bus: 0x%X\n", (unsigned int)usbdev->bus); | ||
| 31623 | +#ifdef NO_DATATYPE | ||
| 31624 | + printk(" configs: "); | ||
| 31625 | + for (i = 0; i < usbdev->descriptor.bNumConfigurations; i++) | ||
| 31626 | + printk("0x%X ", usbdev->config[i]); | ||
| 31627 | + printk("\n"); | ||
| 31628 | +#endif | ||
| 31629 | + printk(" actconfig: %p\n", usbdev->actconfig); | ||
| 31630 | + dump_device_descriptor(&usbdev->descriptor); | ||
| 31631 | + | ||
| 31632 | + cd = &usbdev->config->desc; | ||
| 31633 | + dump_config_descriptor(cd); | ||
| 31634 | +} | ||
| 31635 | + | ||
| 31636 | + | ||
| 31637 | +/*********************************************************************** | ||
| 31638 | +*/ | ||
| 31639 | +static void | ||
| 31640 | +dump_config_descriptor(struct usb_config_descriptor *cd) | ||
| 31641 | +{ | ||
| 31642 | + printk("Configuration Descriptor:\n"); | ||
| 31643 | + if (!cd) { | ||
| 31644 | + printk("NULL\n"); | ||
| 31645 | + return; | ||
| 31646 | + } | ||
| 31647 | + printk(" bLength: %d (0x%X)\n", cd->bLength, cd->bLength); | ||
| 31648 | + printk(" bDescriptorType: %d (0x%X)\n", cd->bDescriptorType, cd->bDescriptorType); | ||
| 31649 | + printk(" bNumInterfaces: %d (0x%X)\n", cd->bNumInterfaces, cd->bNumInterfaces); | ||
| 31650 | + printk(" bConfigurationValue: %d (0x%X)\n", cd->bConfigurationValue, cd->bConfigurationValue); | ||
| 31651 | + printk(" iConfiguration: %d (0x%X)\n", cd->iConfiguration, cd->iConfiguration); | ||
| 31652 | + printk(" bmAttributes: %d (0x%X)\n", cd->bmAttributes, cd->bmAttributes); | ||
| 31653 | + /* printk(" MaxPower: %d (0x%X)\n", cd->bMaxPower, cd->bMaxPower); */ | ||
| 31654 | +} | ||
| 31655 | + | ||
| 31656 | + | ||
| 31657 | +static void | ||
| 31658 | +dump_device_descriptor(struct usb_device_descriptor *dd) | ||
| 31659 | +{ | ||
| 31660 | + printk("Device Descriptor:\n"); | ||
| 31661 | + if (!dd) { | ||
| 31662 | + printk("NULL\n"); | ||
| 31663 | + return; | ||
| 31664 | + } | ||
| 31665 | + printk(" bLength: %d (0x%X)\n", dd->bLength, dd->bLength); | ||
| 31666 | + printk(" bDescriptortype: %d (0x%X)\n", dd->bDescriptorType, dd->bDescriptorType); | ||
| 31667 | + printk(" bcdUSB: %d (0x%X)\n", dd->bcdUSB, dd->bcdUSB); | ||
| 31668 | + printk(" bDeviceClass: %d (0x%X)\n", dd->bDeviceClass, dd->bDeviceClass); | ||
| 31669 | + printk(" bDeviceSubClass: %d (0x%X)\n", dd->bDeviceSubClass, dd->bDeviceSubClass); | ||
| 31670 | + printk(" bDeviceProtocol: %d (0x%X)\n", dd->bDeviceProtocol, dd->bDeviceProtocol); | ||
| 31671 | + printk(" bMaxPacketSize0: %d (0x%X)\n", dd->bMaxPacketSize0, dd->bMaxPacketSize0); | ||
| 31672 | + printk(" idVendor: %d (0x%X)\n", dd->idVendor, dd->idVendor); | ||
| 31673 | + printk(" idProduct: %d (0x%X)\n", dd->idProduct, dd->idProduct); | ||
| 31674 | + printk(" bcdDevice: %d (0x%X)\n", dd->bcdDevice, dd->bcdDevice); | ||
| 31675 | + printk(" iManufacturer: %d (0x%X)\n", dd->iManufacturer, dd->iManufacturer); | ||
| 31676 | + printk(" iProduct: %d (0x%X)\n", dd->iProduct, dd->iProduct); | ||
| 31677 | + printk(" iSerialNumber: %d (0x%X)\n", dd->iSerialNumber, dd->iSerialNumber); | ||
| 31678 | + printk(" bNumConfigurations: %d (0x%X)\n", dd->bNumConfigurations, dd->bNumConfigurations); | ||
| 31679 | +} | ||
| 31680 | +#endif /* UNUSED */ | ||
| 31681 | + | ||
| 31682 | +#endif /* ACX_DEBUG */ | ||
| 31683 | Index: linux-2.6.23/drivers/net/wireless/acx/wlan.c | ||
| 31684 | =================================================================== | ||
| 31685 | --- /dev/null 1970-01-01 00:00:00.000000000 +0000 | ||
| 31686 | +++ linux-2.6.23/drivers/net/wireless/acx/wlan.c 2008-01-20 21:13:40.000000000 +0000 | ||
| 31687 | @@ -0,0 +1,424 @@ | ||
| 31688 | +/*********************************************************************** | ||
| 31689 | +** Copyright (C) 2003 ACX100 Open Source Project | ||
| 31690 | +** | ||
| 31691 | +** The contents of this file are subject to the Mozilla Public | ||
| 31692 | +** License Version 1.1 (the "License"); you may not use this file | ||
| 31693 | +** except in compliance with the License. You may obtain a copy of | ||
| 31694 | +** the License at http://www.mozilla.org/MPL/ | ||
| 31695 | +** | ||
| 31696 | +** Software distributed under the License is distributed on an "AS | ||
| 31697 | +** IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or | ||
| 31698 | +** implied. See the License for the specific language governing | ||
| 31699 | +** rights and limitations under the License. | ||
| 31700 | +** | ||
| 31701 | +** Alternatively, the contents of this file may be used under the | ||
| 31702 | +** terms of the GNU Public License version 2 (the "GPL"), in which | ||
| 31703 | +** case the provisions of the GPL are applicable instead of the | ||
| 31704 | +** above. If you wish to allow the use of your version of this file | ||
| 31705 | +** only under the terms of the GPL and not to allow others to use | ||
| 31706 | +** your version of this file under the MPL, indicate your decision | ||
| 31707 | +** by deleting the provisions above and replace them with the notice | ||
| 31708 | +** and other provisions required by the GPL. If you do not delete | ||
| 31709 | +** the provisions above, a recipient may use your version of this | ||
| 31710 | +** file under either the MPL or the GPL. | ||
| 31711 | +** --------------------------------------------------------------------- | ||
| 31712 | +** Inquiries regarding the ACX100 Open Source Project can be | ||
| 31713 | +** made directly to: | ||
| 31714 | +** | ||
| 31715 | +** acx100-users@lists.sf.net | ||
| 31716 | +** http://acx100.sf.net | ||
| 31717 | +** --------------------------------------------------------------------- | ||
| 31718 | +*/ | ||
| 31719 | + | ||
| 31720 | +/*********************************************************************** | ||
| 31721 | +** This code is based on elements which are | ||
| 31722 | +** Copyright (C) 1999 AbsoluteValue Systems, Inc. All Rights Reserved. | ||
| 31723 | +** info@linux-wlan.com | ||
| 31724 | +** http://www.linux-wlan.com | ||
| 31725 | +*/ | ||
| 31726 | + | ||
| 31727 | +#include <linux/version.h> | ||
| 31728 | +#if LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 18) | ||
| 31729 | +#include <linux/config.h> | ||
| 31730 | +#endif | ||
| 31731 | +#include <linux/types.h> | ||
| 31732 | +#include <linux/if_arp.h> | ||
| 31733 | +#include <linux/wireless.h> | ||
| 31734 | +#include <net/iw_handler.h> | ||
| 31735 | + | ||
| 31736 | +#include "acx.h" | ||
| 31737 | + | ||
| 31738 | + | ||
| 31739 | +/*********************************************************************** | ||
| 31740 | +*/ | ||
| 31741 | +#define LOG_BAD_EID(hdr,len,ie_ptr) acx_log_bad_eid(hdr, len, ((wlan_ie_t*)ie_ptr)) | ||
| 31742 | + | ||
| 31743 | +#define IE_EID(ie_ptr) (((wlan_ie_t*)(ie_ptr))->eid) | ||
| 31744 | +#define IE_LEN(ie_ptr) (((wlan_ie_t*)(ie_ptr))->len) | ||
| 31745 | +#define OFFSET(hdr,off) (WLAN_HDR_A3_DATAP(hdr) + (off)) | ||
| 31746 | + | ||
| 31747 | + | ||
| 31748 | +/*********************************************************************** | ||
| 31749 | +** wlan_mgmt_decode_XXX | ||
| 31750 | +** | ||
| 31751 | +** Given a complete frame in f->hdr, sets the pointers in f to | ||
| 31752 | +** the areas that correspond to the parts of the frame. | ||
| 31753 | +** | ||
| 31754 | +** Assumptions: | ||
| 31755 | +** 1) f->len and f->hdr are already set | ||
| 31756 | +** 2) f->len is the length of the MAC header + data, the FCS | ||
| 31757 | +** is NOT included | ||
| 31758 | +** 3) all members except len and hdr are zero | ||
| 31759 | +** Arguments: | ||
| 31760 | +** f frame structure | ||
| 31761 | +** | ||
| 31762 | +** Returns: | ||
| 31763 | +** nothing | ||
| 31764 | +** | ||
| 31765 | +** Side effects: | ||
| 31766 | +** frame structure members are pointing at their | ||
| 31767 | +** respective portions of the frame buffer. | ||
| 31768 | +*/ | ||
| 31769 | +void | ||
| 31770 | +wlan_mgmt_decode_beacon(wlan_fr_beacon_t * f) | ||
| 31771 | +{ | ||
| 31772 | + u8 *ie_ptr; | ||
| 31773 | + u8 *end = (u8*)f->hdr + f->len; | ||
| 31774 | + | ||
| 31775 | + f->type = WLAN_FSTYPE_BEACON; | ||
| 31776 | + | ||
| 31777 | + /*-- Fixed Fields ----*/ | ||
| 31778 | + f->ts = (u64 *) OFFSET(f->hdr, WLAN_BEACON_OFF_TS); | ||
| 31779 | + f->bcn_int = (u16 *) OFFSET(f->hdr, WLAN_BEACON_OFF_BCN_INT); | ||
| 31780 | + f->cap_info = (u16 *) OFFSET(f->hdr, WLAN_BEACON_OFF_CAPINFO); | ||
| 31781 | + | ||
| 31782 | + /*-- Information elements */ | ||
| 31783 | + ie_ptr = OFFSET(f->hdr, WLAN_BEACON_OFF_SSID); | ||
| 31784 | + while (ie_ptr < end) { | ||
| 31785 | + switch (IE_EID(ie_ptr)) { | ||
| 31786 | + case WLAN_EID_SSID: | ||
| 31787 | + f->ssid = (wlan_ie_ssid_t *) ie_ptr; | ||
| 31788 | + break; | ||
| 31789 | + case WLAN_EID_SUPP_RATES: | ||
| 31790 | + f->supp_rates = (wlan_ie_supp_rates_t *) ie_ptr; | ||
| 31791 | + break; | ||
| 31792 | + case WLAN_EID_EXT_RATES: | ||
| 31793 | + f->ext_rates = (wlan_ie_supp_rates_t *) ie_ptr; | ||
| 31794 | + break; | ||
| 31795 | + case WLAN_EID_FH_PARMS: | ||
| 31796 | + f->fh_parms = (wlan_ie_fh_parms_t *) ie_ptr; | ||
| 31797 | + break; | ||
| 31798 | + case WLAN_EID_DS_PARMS: | ||
| 31799 | + f->ds_parms = (wlan_ie_ds_parms_t *) ie_ptr; | ||
| 31800 | + break; | ||
| 31801 | + case WLAN_EID_CF_PARMS: | ||
| 31802 | + f->cf_parms = (wlan_ie_cf_parms_t *) ie_ptr; | ||
| 31803 | + break; | ||
| 31804 | + case WLAN_EID_IBSS_PARMS: | ||
| 31805 | + f->ibss_parms = (wlan_ie_ibss_parms_t *) ie_ptr; | ||
| 31806 | + break; | ||
| 31807 | + case WLAN_EID_TIM: | ||
| 31808 | + f->tim = (wlan_ie_tim_t *) ie_ptr; | ||
| 31809 | + break; | ||
| 31810 | + case WLAN_EID_ERP_INFO: | ||
| 31811 | + f->erp = (wlan_ie_erp_t *) ie_ptr; | ||
| 31812 | + break; | ||
| 31813 | + | ||
| 31814 | + case WLAN_EID_COUNTRY: | ||
| 31815 | + /* was seen: 07 06 47 42 20 01 0D 14 */ | ||
| 31816 | + case WLAN_EID_PWR_CONSTRAINT: | ||
| 31817 | + /* was seen by Ashwin Mansinghka <ashwin_man@yahoo.com> from | ||
| 31818 | + Atheros-based PCI card in AP mode using madwifi drivers: */ | ||
| 31819 | + /* 20 01 00 */ | ||
| 31820 | + case WLAN_EID_NONERP: | ||
| 31821 | + /* was seen from WRT54GS with OpenWrt: 2F 01 07 */ | ||
| 31822 | + case WLAN_EID_UNKNOWN128: | ||
| 31823 | + /* was seen by Jacek Jablonski <conexion2000@gmail.com> from Orinoco AP */ | ||
| 31824 | + /* 80 06 00 60 1D 2C 3B 00 */ | ||
| 31825 | + case WLAN_EID_UNKNOWN133: | ||
| 31826 | + /* was seen by David Bronaugh <dbronaugh@linuxboxen.org> from ???? */ | ||
| 31827 | + /* 85 1E 00 00 84 12 07 00 FF 00 11 00 61 70 63 31 */ | ||
| 31828 | + /* 63 73 72 30 34 32 00 00 00 00 00 00 00 00 00 25 */ | ||
| 31829 | + case WLAN_EID_UNKNOWN223: | ||
| 31830 | + /* was seen by Carlos Martin <carlosmn@gmail.com> from ???? */ | ||
| 31831 | + /* DF 20 01 1E 04 00 00 00 06 63 09 02 FF 0F 30 30 */ | ||
| 31832 | + /* 30 42 36 42 33 34 30 39 46 31 00 00 00 00 00 00 00 00 */ | ||
| 31833 | + case WLAN_EID_GENERIC: | ||
| 31834 | + /* WPA: hostap code: | ||
| 31835 | + if (pos[1] >= 4 && | ||
| 31836 | + pos[2] == 0x00 && pos[3] == 0x50 && | ||
| 31837 | + pos[4] == 0xf2 && pos[5] == 1) { | ||
| 31838 | + wpa = pos; | ||
| 31839 | + wpa_len = pos[1] + 2; | ||
| 31840 | + } | ||
| 31841 | + TI x4 mode: seen DD 04 08 00 28 00 | ||
| 31842 | + (08 00 28 is TI's OUI) | ||
| 31843 | + last byte is probably 0/1 - disabled/enabled | ||
| 31844 | + */ | ||
| 31845 | + case WLAN_EID_RSN: | ||
| 31846 | + /* hostap does something with it: | ||
| 31847 | + rsn = pos; | ||
| 31848 | + rsn_len = pos[1] + 2; | ||
| 31849 | + */ | ||
| 31850 | + break; | ||
| 31851 | + | ||
| 31852 | + default: | ||
| 31853 | + LOG_BAD_EID(f->hdr, f->len, ie_ptr); | ||
| 31854 | + break; | ||
| 31855 | + } | ||
| 31856 | + ie_ptr = ie_ptr + 2 + IE_LEN(ie_ptr); | ||
| 31857 | + } | ||
| 31858 | +} | ||
| 31859 | + | ||
| 31860 | + | ||
| 31861 | +#ifdef UNUSED | ||
| 31862 | +void wlan_mgmt_decode_ibssatim(wlan_fr_ibssatim_t * f) | ||
| 31863 | +{ | ||
| 31864 | + f->type = WLAN_FSTYPE_ATIM; | ||
| 31865 | + /*-- Fixed Fields ----*/ | ||
| 31866 | + /*-- Information elements */ | ||
| 31867 | +} | ||
| 31868 | +#endif /* UNUSED */ | ||
| 31869 | + | ||
| 31870 | +void | ||
| 31871 | +wlan_mgmt_decode_disassoc(wlan_fr_disassoc_t * f) | ||
| 31872 | +{ | ||
| 31873 | + f->type = WLAN_FSTYPE_DISASSOC; | ||
| 31874 | + | ||
| 31875 | + /*-- Fixed Fields ----*/ | ||
| 31876 | + f->reason = (u16 *) OFFSET(f->hdr, WLAN_DISASSOC_OFF_REASON); | ||
| 31877 | + | ||
| 31878 | + /*-- Information elements */ | ||
| 31879 | +} | ||
| 31880 | + | ||
| 31881 | + | ||
| 31882 | +void | ||
| 31883 | +wlan_mgmt_decode_assocreq(wlan_fr_assocreq_t * f) | ||
| 31884 | +{ | ||
| 31885 | + u8 *ie_ptr; | ||
| 31886 | + u8 *end = (u8*)f->hdr + f->len; | ||
| 31887 | + | ||
| 31888 | + | ||
| 31889 | + f->type = WLAN_FSTYPE_ASSOCREQ; | ||
| 31890 | + | ||
| 31891 | + /*-- Fixed Fields ----*/ | ||
| 31892 | + f->cap_info = (u16 *) OFFSET(f->hdr, WLAN_ASSOCREQ_OFF_CAP_INFO); | ||
| 31893 | + f->listen_int = (u16 *) OFFSET(f->hdr, WLAN_ASSOCREQ_OFF_LISTEN_INT); | ||
| 31894 | + | ||
| 31895 | + /*-- Information elements */ | ||
| 31896 | + ie_ptr = OFFSET(f->hdr, WLAN_ASSOCREQ_OFF_SSID); | ||
| 31897 | + while (ie_ptr < end) { | ||
| 31898 | + switch (IE_EID(ie_ptr)) { | ||
| 31899 | + case WLAN_EID_SSID: | ||
| 31900 | + f->ssid = (wlan_ie_ssid_t *) ie_ptr; | ||
| 31901 | + break; | ||
| 31902 | + case WLAN_EID_SUPP_RATES: | ||
| 31903 | + f->supp_rates = (wlan_ie_supp_rates_t *) ie_ptr; | ||
| 31904 | + break; | ||
| 31905 | + case WLAN_EID_EXT_RATES: | ||
| 31906 | + f->ext_rates = (wlan_ie_supp_rates_t *) ie_ptr; | ||
| 31907 | + break; | ||
| 31908 | + default: | ||
| 31909 | + LOG_BAD_EID(f->hdr, f->len, ie_ptr); | ||
| 31910 | + break; | ||
| 31911 | + } | ||
| 31912 | + ie_ptr = ie_ptr + 2 + IE_LEN(ie_ptr); | ||
| 31913 | + } | ||
| 31914 | +} | ||
| 31915 | + | ||
| 31916 | + | ||
| 31917 | +void | ||
| 31918 | +wlan_mgmt_decode_assocresp(wlan_fr_assocresp_t * f) | ||
| 31919 | +{ | ||
| 31920 | + f->type = WLAN_FSTYPE_ASSOCRESP; | ||
| 31921 | + | ||
| 31922 | + /*-- Fixed Fields ----*/ | ||
| 31923 | + f->cap_info = (u16 *) OFFSET(f->hdr, WLAN_ASSOCRESP_OFF_CAP_INFO); | ||
| 31924 | + f->status = (u16 *) OFFSET(f->hdr, WLAN_ASSOCRESP_OFF_STATUS); | ||
| 31925 | + f->aid = (u16 *) OFFSET(f->hdr, WLAN_ASSOCRESP_OFF_AID); | ||
| 31926 | + | ||
| 31927 | + /*-- Information elements */ | ||
| 31928 | + f->supp_rates = (wlan_ie_supp_rates_t *) | ||
| 31929 | + OFFSET(f->hdr, WLAN_ASSOCRESP_OFF_SUPP_RATES); | ||
| 31930 | +} | ||
| 31931 | + | ||
| 31932 | + | ||
| 31933 | +#ifdef UNUSED | ||
| 31934 | +void | ||
| 31935 | +wlan_mgmt_decode_reassocreq(wlan_fr_reassocreq_t * f) | ||
| 31936 | +{ | ||
| 31937 | + u8 *ie_ptr; | ||
| 31938 | + u8 *end = (u8*)f->hdr + f->len; | ||
| 31939 | + | ||
| 31940 | + f->type = WLAN_FSTYPE_REASSOCREQ; | ||
| 31941 | + | ||
| 31942 | + /*-- Fixed Fields ----*/ | ||
| 31943 | + f->cap_info = (u16 *) OFFSET(f->hdr, WLAN_REASSOCREQ_OFF_CAP_INFO); | ||
| 31944 | + f->listen_int = (u16 *) OFFSET(f->hdr, WLAN_REASSOCREQ_OFF_LISTEN_INT); | ||
| 31945 | + f->curr_ap = (u8 *) OFFSET(f->hdr, WLAN_REASSOCREQ_OFF_CURR_AP); | ||
| 31946 | + | ||
| 31947 | + /*-- Information elements */ | ||
| 31948 | + ie_ptr = OFFSET(f->hdr, WLAN_REASSOCREQ_OFF_SSID); | ||
| 31949 | + while (ie_ptr < end) { | ||
| 31950 | + switch (IE_EID(ie_ptr)) { | ||
| 31951 | + case WLAN_EID_SSID: | ||
| 31952 | + f->ssid = (wlan_ie_ssid_t *) ie_ptr; | ||
| 31953 | + break; | ||
| 31954 | + case WLAN_EID_SUPP_RATES: | ||
| 31955 | + f->supp_rates = (wlan_ie_supp_rates_t *) ie_ptr; | ||
| 31956 | + break; | ||
| 31957 | + case WLAN_EID_EXT_RATES: | ||
| 31958 | + f->ext_rates = (wlan_ie_supp_rates_t *) ie_ptr; | ||
| 31959 | + break; | ||
| 31960 | + default: | ||
| 31961 | + LOG_BAD_EID(f->hdr, f->len, ie_ptr); | ||
| 31962 | + break; | ||
| 31963 | + } | ||
| 31964 | + ie_ptr = ie_ptr + 2 + IE_LEN(ie_ptr); | ||
| 31965 | + } | ||
| 31966 | +} | ||
| 31967 | + | ||
| 31968 | + | ||
| 31969 | +void | ||
| 31970 | +wlan_mgmt_decode_reassocresp(wlan_fr_reassocresp_t * f) | ||
| 31971 | +{ | ||
| 31972 | + f->type = WLAN_FSTYPE_REASSOCRESP; | ||
| 31973 | + | ||
| 31974 | + /*-- Fixed Fields ----*/ | ||
| 31975 | + f->cap_info = (u16 *) OFFSET(f->hdr, WLAN_REASSOCRESP_OFF_CAP_INFO); | ||
| 31976 | + f->status = (u16 *) OFFSET(f->hdr, WLAN_REASSOCRESP_OFF_STATUS); | ||
| 31977 | + f->aid = (u16 *) OFFSET(f->hdr, WLAN_REASSOCRESP_OFF_AID); | ||
| 31978 | + | ||
| 31979 | + /*-- Information elements */ | ||
| 31980 | + f->supp_rates = (wlan_ie_supp_rates_t *) | ||
| 31981 | + OFFSET(f->hdr, WLAN_REASSOCRESP_OFF_SUPP_RATES); | ||
| 31982 | +} | ||
| 31983 | + | ||
| 31984 | + | ||
| 31985 | +void | ||
| 31986 | +wlan_mgmt_decode_probereq(wlan_fr_probereq_t * f) | ||
| 31987 | +{ | ||
| 31988 | + u8 *ie_ptr; | ||
| 31989 | + u8 *end = (u8*)f->hdr + f->len; | ||
| 31990 | + | ||
| 31991 | + f->type = WLAN_FSTYPE_PROBEREQ; | ||
| 31992 | + | ||
| 31993 | + /*-- Fixed Fields ----*/ | ||
| 31994 | + | ||
| 31995 | + /*-- Information elements */ | ||
| 31996 | + ie_ptr = OFFSET(f->hdr, WLAN_PROBEREQ_OFF_SSID); | ||
| 31997 | + while (ie_ptr < end) { | ||
| 31998 | + switch (IE_EID(ie_ptr)) { | ||
| 31999 | + case WLAN_EID_SSID: | ||
| 32000 | + f->ssid = (wlan_ie_ssid_t *) ie_ptr; | ||
| 32001 | + break; | ||
| 32002 | + case WLAN_EID_SUPP_RATES: | ||
| 32003 | + f->supp_rates = (wlan_ie_supp_rates_t *) ie_ptr; | ||
| 32004 | + break; | ||
| 32005 | + case WLAN_EID_EXT_RATES: | ||
| 32006 | + f->ext_rates = (wlan_ie_supp_rates_t *) ie_ptr; | ||
| 32007 | + break; | ||
| 32008 | + default: | ||
| 32009 | + LOG_BAD_EID(f->hdr, f->len, ie_ptr); | ||
| 32010 | + break; | ||
| 32011 | + } | ||
| 32012 | + ie_ptr = ie_ptr + 2 + IE_LEN(ie_ptr); | ||
| 32013 | + } | ||
| 32014 | +} | ||
| 32015 | +#endif /* UNUSED */ | ||
| 32016 | + | ||
| 32017 | + | ||
| 32018 | +/* TODO: decoding of beacon and proberesp can be merged (similar structure) */ | ||
| 32019 | +void | ||
| 32020 | +wlan_mgmt_decode_proberesp(wlan_fr_proberesp_t * f) | ||
| 32021 | +{ | ||
| 32022 | + u8 *ie_ptr; | ||
| 32023 | + u8 *end = (u8*)f->hdr + f->len; | ||
| 32024 | + | ||
| 32025 | + f->type = WLAN_FSTYPE_PROBERESP; | ||
| 32026 | + | ||
| 32027 | + /*-- Fixed Fields ----*/ | ||
| 32028 | + f->ts = (u64 *) OFFSET(f->hdr, WLAN_PROBERESP_OFF_TS); | ||
| 32029 | + f->bcn_int = (u16 *) OFFSET(f->hdr, WLAN_PROBERESP_OFF_BCN_INT); | ||
| 32030 | + f->cap_info = (u16 *) OFFSET(f->hdr, WLAN_PROBERESP_OFF_CAP_INFO); | ||
| 32031 | + | ||
| 32032 | + /*-- Information elements */ | ||
| 32033 | + ie_ptr = OFFSET(f->hdr, WLAN_PROBERESP_OFF_SSID); | ||
| 32034 | + while (ie_ptr < end) { | ||
| 32035 | + switch (IE_EID(ie_ptr)) { | ||
| 32036 | + case WLAN_EID_SSID: | ||
| 32037 | + f->ssid = (wlan_ie_ssid_t *) ie_ptr; | ||
| 32038 | + break; | ||
| 32039 | + case WLAN_EID_SUPP_RATES: | ||
| 32040 | + f->supp_rates = (wlan_ie_supp_rates_t *) ie_ptr; | ||
| 32041 | + break; | ||
| 32042 | + case WLAN_EID_EXT_RATES: | ||
| 32043 | + f->ext_rates = (wlan_ie_supp_rates_t *) ie_ptr; | ||
| 32044 | + break; | ||
| 32045 | + case WLAN_EID_FH_PARMS: | ||
| 32046 | + f->fh_parms = (wlan_ie_fh_parms_t *) ie_ptr; | ||
| 32047 | + break; | ||
| 32048 | + case WLAN_EID_DS_PARMS: | ||
| 32049 | + f->ds_parms = (wlan_ie_ds_parms_t *) ie_ptr; | ||
| 32050 | + break; | ||
| 32051 | + case WLAN_EID_CF_PARMS: | ||
| 32052 | + f->cf_parms = (wlan_ie_cf_parms_t *) ie_ptr; | ||
| 32053 | + break; | ||
| 32054 | + case WLAN_EID_IBSS_PARMS: | ||
| 32055 | + f->ibss_parms = (wlan_ie_ibss_parms_t *) ie_ptr; | ||
| 32056 | + break; | ||
| 32057 | +#ifdef DONT_DO_IT_ADD_REAL_HANDLING_INSTEAD | ||
| 32058 | + case WLAN_EID_COUNTRY: | ||
| 32059 | + break; | ||
| 32060 | + ... | ||
| 32061 | +#endif | ||
| 32062 | +#ifdef SENT_HERE_BY_OPENWRT | ||
| 32063 | + /* should those be trapped or handled?? */ | ||
| 32064 | + case WLAN_EID_ERP_INFO: | ||
| 32065 | + break; | ||
| 32066 | + case WLAN_EID_NONERP: | ||
| 32067 | + break; | ||
| 32068 | + case WLAN_EID_GENERIC: | ||
| 32069 | + break; | ||
| 32070 | +#endif | ||
| 32071 | + default: | ||
| 32072 | + LOG_BAD_EID(f->hdr, f->len, ie_ptr); | ||
| 32073 | + break; | ||
| 32074 | + } | ||
| 32075 | + | ||
| 32076 | + ie_ptr = ie_ptr + 2 + IE_LEN(ie_ptr); | ||
| 32077 | + } | ||
| 32078 | +} | ||
| 32079 | + | ||
| 32080 | + | ||
| 32081 | +void | ||
| 32082 | +wlan_mgmt_decode_authen(wlan_fr_authen_t * f) | ||
| 32083 | +{ | ||
| 32084 | + u8 *ie_ptr; | ||
| 32085 | + u8 *end = (u8*)f->hdr + f->len; | ||
| 32086 | + | ||
| 32087 | + f->type = WLAN_FSTYPE_AUTHEN; | ||
| 32088 | + | ||
| 32089 | + /*-- Fixed Fields ----*/ | ||
| 32090 | + f->auth_alg = (u16 *) OFFSET(f->hdr, WLAN_AUTHEN_OFF_AUTH_ALG); | ||
| 32091 | + f->auth_seq = (u16 *) OFFSET(f->hdr, WLAN_AUTHEN_OFF_AUTH_SEQ); | ||
| 32092 | + f->status = (u16 *) OFFSET(f->hdr, WLAN_AUTHEN_OFF_STATUS); | ||
| 32093 | + | ||
| 32094 | + /*-- Information elements */ | ||
| 32095 | + ie_ptr = OFFSET(f->hdr, WLAN_AUTHEN_OFF_CHALLENGE); | ||
| 32096 | + if ((ie_ptr < end) && (IE_EID(ie_ptr) == WLAN_EID_CHALLENGE)) { | ||
| 32097 | + f->challenge = (wlan_ie_challenge_t *) ie_ptr; | ||
| 32098 | + } | ||
| 32099 | +} | ||
| 32100 | + | ||
| 32101 | + | ||
| 32102 | +void | ||
| 32103 | +wlan_mgmt_decode_deauthen(wlan_fr_deauthen_t * f) | ||
| 32104 | +{ | ||
| 32105 | + f->type = WLAN_FSTYPE_DEAUTHEN; | ||
| 32106 | + | ||
| 32107 | + /*-- Fixed Fields ----*/ | ||
| 32108 | + f->reason = (u16 *) OFFSET(f->hdr, WLAN_DEAUTHEN_OFF_REASON); | ||
| 32109 | + | ||
| 32110 | + /*-- Information elements */ | ||
| 32111 | +} | ||
| 32112 | Index: linux-2.6.23/drivers/net/wireless/acx/wlan_compat.h | ||
| 32113 | =================================================================== | ||
| 32114 | --- /dev/null 1970-01-01 00:00:00.000000000 +0000 | ||
| 32115 | +++ linux-2.6.23/drivers/net/wireless/acx/wlan_compat.h 2008-01-20 21:13:40.000000000 +0000 | ||
| 32116 | @@ -0,0 +1,260 @@ | ||
| 32117 | +/*********************************************************************** | ||
| 32118 | +** Copyright (C) 2003 ACX100 Open Source Project | ||
| 32119 | +** | ||
| 32120 | +** The contents of this file are subject to the Mozilla Public | ||
| 32121 | +** License Version 1.1 (the "License"); you may not use this file | ||
| 32122 | +** except in compliance with the License. You may obtain a copy of | ||
| 32123 | +** the License at http://www.mozilla.org/MPL/ | ||
| 32124 | +** | ||
| 32125 | +** Software distributed under the License is distributed on an "AS | ||
| 32126 | +** IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or | ||
| 32127 | +** implied. See the License for the specific language governing | ||
| 32128 | +** rights and limitations under the License. | ||
| 32129 | +** | ||
| 32130 | +** Alternatively, the contents of this file may be used under the | ||
| 32131 | +** terms of the GNU Public License version 2 (the "GPL"), in which | ||
| 32132 | +** case the provisions of the GPL are applicable instead of the | ||
| 32133 | +** above. If you wish to allow the use of your version of this file | ||
| 32134 | +** only under the terms of the GPL and not to allow others to use | ||
| 32135 | +** your version of this file under the MPL, indicate your decision | ||
| 32136 | +** by deleting the provisions above and replace them with the notice | ||
| 32137 | +** and other provisions required by the GPL. If you do not delete | ||
| 32138 | +** the provisions above, a recipient may use your version of this | ||
| 32139 | +** file under either the MPL or the GPL. | ||
| 32140 | +** --------------------------------------------------------------------- | ||
| 32141 | +** Inquiries regarding the ACX100 Open Source Project can be | ||
| 32142 | +** made directly to: | ||
| 32143 | +** | ||
| 32144 | +** acx100-users@lists.sf.net | ||
| 32145 | +** http://acx100.sf.net | ||
| 32146 | +** --------------------------------------------------------------------- | ||
| 32147 | +*/ | ||
| 32148 | + | ||
| 32149 | +/*********************************************************************** | ||
| 32150 | +** This code is based on elements which are | ||
| 32151 | +** Copyright (C) 1999 AbsoluteValue Systems, Inc. All Rights Reserved. | ||
| 32152 | +** info@linux-wlan.com | ||
| 32153 | +** http://www.linux-wlan.com | ||
| 32154 | +*/ | ||
| 32155 | + | ||
| 32156 | +/*=============================================================*/ | ||
| 32157 | +/*------ Establish Platform Identity --------------------------*/ | ||
| 32158 | +/*=============================================================*/ | ||
| 32159 | +/* Key macros: */ | ||
| 32160 | +/* WLAN_CPU_FAMILY */ | ||
| 32161 | +#define WLAN_Ix86 1 | ||
| 32162 | +#define WLAN_PPC 2 | ||
| 32163 | +#define WLAN_Ix96 3 | ||
| 32164 | +#define WLAN_ARM 4 | ||
| 32165 | +#define WLAN_ALPHA 5 | ||
| 32166 | +#define WLAN_MIPS 6 | ||
| 32167 | +#define WLAN_HPPA 7 | ||
| 32168 | +#define WLAN_SPARC 8 | ||
| 32169 | +#define WLAN_SH 9 | ||
| 32170 | +#define WLAN_x86_64 10 | ||
| 32171 | +/* WLAN_CPU_CORE */ | ||
| 32172 | +#define WLAN_I386CORE 1 | ||
| 32173 | +#define WLAN_PPCCORE 2 | ||
| 32174 | +#define WLAN_I296 3 | ||
| 32175 | +#define WLAN_ARMCORE 4 | ||
| 32176 | +#define WLAN_ALPHACORE 5 | ||
| 32177 | +#define WLAN_MIPSCORE 6 | ||
| 32178 | +#define WLAN_HPPACORE 7 | ||
| 32179 | +/* WLAN_CPU_PART */ | ||
| 32180 | +#define WLAN_I386PART 1 | ||
| 32181 | +#define WLAN_MPC860 2 | ||
| 32182 | +#define WLAN_MPC823 3 | ||
| 32183 | +#define WLAN_I296SA 4 | ||
| 32184 | +#define WLAN_PPCPART 5 | ||
| 32185 | +#define WLAN_ARMPART 6 | ||
| 32186 | +#define WLAN_ALPHAPART 7 | ||
| 32187 | +#define WLAN_MIPSPART 8 | ||
| 32188 | +#define WLAN_HPPAPART 9 | ||
| 32189 | +/* WLAN_SYSARCH */ | ||
| 32190 | +#define WLAN_PCAT 1 | ||
| 32191 | +#define WLAN_MBX 2 | ||
| 32192 | +#define WLAN_RPX 3 | ||
| 32193 | +#define WLAN_LWARCH 4 | ||
| 32194 | +#define WLAN_PMAC 5 | ||
| 32195 | +#define WLAN_SKIFF 6 | ||
| 32196 | +#define WLAN_BITSY 7 | ||
| 32197 | +#define WLAN_ALPHAARCH 7 | ||
| 32198 | +#define WLAN_MIPSARCH 9 | ||
| 32199 | +#define WLAN_HPPAARCH 10 | ||
| 32200 | +/* WLAN_HOSTIF (generally set on the command line, not detected) */ | ||
| 32201 | +#define WLAN_PCMCIA 1 | ||
| 32202 | +#define WLAN_ISA 2 | ||
| 32203 | +#define WLAN_PCI 3 | ||
| 32204 | +#define WLAN_USB 4 | ||
| 32205 | +#define WLAN_PLX 5 | ||
| 32206 | + | ||
| 32207 | +/* Note: the PLX HOSTIF above refers to some vendors implementations for */ | ||
| 32208 | +/* PCI. It's a PLX chip that is a PCI to PCMCIA adapter, but it */ | ||
| 32209 | +/* isn't a real PCMCIA host interface adapter providing all the */ | ||
| 32210 | +/* card&socket services. */ | ||
| 32211 | + | ||
| 32212 | +#ifdef __powerpc__ | ||
| 32213 | +#ifndef __ppc__ | ||
| 32214 | +#define __ppc__ | ||
| 32215 | +#endif | ||
| 32216 | +#endif | ||
| 32217 | + | ||
| 32218 | +#if (defined(CONFIG_PPC) || defined(CONFIG_8xx)) | ||
| 32219 | +#ifndef __ppc__ | ||
| 32220 | +#define __ppc__ | ||
| 32221 | +#endif | ||
| 32222 | +#endif | ||
| 32223 | + | ||
| 32224 | +#if defined(__x86_64__) | ||
| 32225 | + #define WLAN_CPU_FAMILY WLAN_x86_64 | ||
| 32226 | + #define WLAN_SYSARCH WLAN_PCAT | ||
| 32227 | +#elif defined(__i386__) || defined(__i486__) || defined(__i586__) || defined(__i686__) | ||
| 32228 | + #define WLAN_CPU_FAMILY WLAN_Ix86 | ||
| 32229 | + #define WLAN_CPU_CORE WLAN_I386CORE | ||
| 32230 | + #define WLAN_CPU_PART WLAN_I386PART | ||
| 32231 | + #define WLAN_SYSARCH WLAN_PCAT | ||
| 32232 | +#elif defined(__ppc__) | ||
| 32233 | + #define WLAN_CPU_FAMILY WLAN_PPC | ||
| 32234 | + #define WLAN_CPU_CORE WLAN_PPCCORE | ||
| 32235 | + #if defined(CONFIG_MBX) | ||
| 32236 | + #define WLAN_CPU_PART WLAN_MPC860 | ||
| 32237 | + #define WLAN_SYSARCH WLAN_MBX | ||
| 32238 | + #elif defined(CONFIG_RPXLITE) | ||
| 32239 | + #define WLAN_CPU_PART WLAN_MPC823 | ||
| 32240 | + #define WLAN_SYSARCH WLAN_RPX | ||
| 32241 | + #elif defined(CONFIG_RPXCLASSIC) | ||
| 32242 | + #define WLAN_CPU_PART WLAN_MPC860 | ||
| 32243 | + #define WLAN_SYSARCH WLAN_RPX | ||
| 32244 | + #else | ||
| 32245 | + #define WLAN_CPU_PART WLAN_PPCPART | ||
| 32246 | + #define WLAN_SYSARCH WLAN_PMAC | ||
| 32247 | + #endif | ||
| 32248 | +#elif defined(__arm__) | ||
| 32249 | + #define WLAN_CPU_FAMILY WLAN_ARM | ||
| 32250 | + #define WLAN_CPU_CORE WLAN_ARMCORE | ||
| 32251 | + #define WLAN_CPU_PART WLAN_ARM_PART | ||
| 32252 | + #define WLAN_SYSARCH WLAN_SKIFF | ||
| 32253 | +#elif defined(__alpha__) | ||
| 32254 | + #define WLAN_CPU_FAMILY WLAN_ALPHA | ||
| 32255 | + #define WLAN_CPU_CORE WLAN_ALPHACORE | ||
| 32256 | + #define WLAN_CPU_PART WLAN_ALPHAPART | ||
| 32257 | + #define WLAN_SYSARCH WLAN_ALPHAARCH | ||
| 32258 | +#elif defined(__mips__) | ||
| 32259 | + #define WLAN_CPU_FAMILY WLAN_MIPS | ||
| 32260 | + #define WLAN_CPU_CORE WLAN_MIPSCORE | ||
| 32261 | + #define WLAN_CPU_PART WLAN_MIPSPART | ||
| 32262 | + #define WLAN_SYSARCH WLAN_MIPSARCH | ||
| 32263 | +#elif defined(__hppa__) | ||
| 32264 | + #define WLAN_CPU_FAMILY WLAN_HPPA | ||
| 32265 | + #define WLAN_CPU_CORE WLAN_HPPACORE | ||
| 32266 | + #define WLAN_CPU_PART WLAN_HPPAPART | ||
| 32267 | + #define WLAN_SYSARCH WLAN_HPPAARCH | ||
| 32268 | +#elif defined(__sparc__) | ||
| 32269 | + #define WLAN_CPU_FAMILY WLAN_SPARC | ||
| 32270 | + #define WLAN_SYSARCH WLAN_SPARC | ||
| 32271 | +#elif defined(__sh__) | ||
| 32272 | + #define WLAN_CPU_FAMILY WLAN_SH | ||
| 32273 | + #define WLAN_SYSARCH WLAN_SHARCH | ||
| 32274 | + #ifndef __LITTLE_ENDIAN__ | ||
| 32275 | + #define __LITTLE_ENDIAN__ | ||
| 32276 | + #endif | ||
| 32277 | +#else | ||
| 32278 | + #error "No CPU identified!" | ||
| 32279 | +#endif | ||
| 32280 | + | ||
| 32281 | +/* | ||
| 32282 | + Some big endian machines implicitly do all I/O in little endian mode. | ||
| 32283 | + | ||
| 32284 | + In particular: | ||
| 32285 | + Linux/PPC on PowerMacs (PCI) | ||
| 32286 | + Arm/Intel Xscale (PCI) | ||
| 32287 | + | ||
| 32288 | + This may also affect PLX boards and other BE &| PPC platforms; | ||
| 32289 | + as new ones are discovered, add them below. | ||
| 32290 | +*/ | ||
| 32291 | + | ||
| 32292 | +#if ((WLAN_SYSARCH == WLAN_SKIFF) || (WLAN_SYSARCH == WLAN_PMAC)) | ||
| 32293 | +#define REVERSE_ENDIAN | ||
| 32294 | +#endif | ||
| 32295 | + | ||
| 32296 | +/*=============================================================*/ | ||
| 32297 | +/*------ Hardware Portability Macros --------------------------*/ | ||
| 32298 | +/*=============================================================*/ | ||
| 32299 | +#if (WLAN_CPU_FAMILY == WLAN_PPC) | ||
| 32300 | +#define wlan_inw(a) in_be16((unsigned short *)((a)+_IO_BASE)) | ||
| 32301 | +#define wlan_inw_le16_to_cpu(a) inw((a)) | ||
| 32302 | +#define wlan_outw(v,a) out_be16((unsigned short *)((a)+_IO_BASE), (v)) | ||
| 32303 | +#define wlan_outw_cpu_to_le16(v,a) outw((v),(a)) | ||
| 32304 | +#else | ||
| 32305 | +#define wlan_inw(a) inw((a)) | ||
| 32306 | +#define wlan_inw_le16_to_cpu(a) __cpu_to_le16(inw((a))) | ||
| 32307 | +#define wlan_outw(v,a) outw((v),(a)) | ||
| 32308 | +#define wlan_outw_cpu_to_le16(v,a) outw(__cpu_to_le16((v)),(a)) | ||
| 32309 | +#endif | ||
| 32310 | + | ||
| 32311 | +/*=============================================================*/ | ||
| 32312 | +/*------ Bit settings -----------------------------------------*/ | ||
| 32313 | +/*=============================================================*/ | ||
| 32314 | +#define ieee2host16(n) __le16_to_cpu(n) | ||
| 32315 | +#define ieee2host32(n) __le32_to_cpu(n) | ||
| 32316 | +#define host2ieee16(n) __cpu_to_le16(n) | ||
| 32317 | +#define host2ieee32(n) __cpu_to_le32(n) | ||
| 32318 | + | ||
| 32319 | +/* for constants */ | ||
| 32320 | +#ifdef __LITTLE_ENDIAN | ||
| 32321 | + #define IEEE16(a,n) a = n, a##i = n, | ||
| 32322 | +#else | ||
| 32323 | + #ifdef __BIG_ENDIAN | ||
| 32324 | + /* shifts would produce gcc warnings. Oh well... */ | ||
| 32325 | + #define IEEE16(a,n) a = n, a##i = ((n&0xff)*256 + ((n&0xff00)/256)), | ||
| 32326 | + #else | ||
| 32327 | + #error give me endianness or give me death | ||
| 32328 | + #endif | ||
| 32329 | +#endif | ||
| 32330 | + | ||
| 32331 | +/*=============================================================*/ | ||
| 32332 | +/*------ Compiler Portability Macros --------------------------*/ | ||
| 32333 | +/*=============================================================*/ | ||
| 32334 | +#define WLAN_PACKED __attribute__ ((packed)) | ||
| 32335 | + | ||
| 32336 | +/* Interrupt handler backwards compatibility stuff */ | ||
| 32337 | +#ifndef IRQ_NONE | ||
| 32338 | +#define IRQ_NONE | ||
| 32339 | +#define IRQ_HANDLED | ||
| 32340 | +typedef void irqreturn_t; | ||
| 32341 | +#endif | ||
| 32342 | + | ||
| 32343 | +#ifndef ARPHRD_IEEE80211_PRISM | ||
| 32344 | +#define ARPHRD_IEEE80211_PRISM 802 | ||
| 32345 | +#endif | ||
| 32346 | + | ||
| 32347 | +#define ETH_P_80211_RAW (ETH_P_ECONET + 1) | ||
| 32348 | + | ||
| 32349 | +/*============================================================================* | ||
| 32350 | + * Constants * | ||
| 32351 | + *============================================================================*/ | ||
| 32352 | +#define WLAN_IEEE_OUI_LEN 3 | ||
| 32353 | + | ||
| 32354 | +/*============================================================================* | ||
| 32355 | + * Types * | ||
| 32356 | + *============================================================================*/ | ||
| 32357 | + | ||
| 32358 | +/* local ether header type */ | ||
| 32359 | +typedef struct wlan_ethhdr { | ||
| 32360 | + u8 daddr[ETH_ALEN]; | ||
| 32361 | + u8 saddr[ETH_ALEN]; | ||
| 32362 | + u16 type; | ||
| 32363 | +} WLAN_PACKED wlan_ethhdr_t; | ||
| 32364 | + | ||
| 32365 | +/* local llc header type */ | ||
| 32366 | +typedef struct wlan_llc { | ||
| 32367 | + u8 dsap; | ||
| 32368 | + u8 ssap; | ||
| 32369 | + u8 ctl; | ||
| 32370 | +} WLAN_PACKED wlan_llc_t; | ||
| 32371 | + | ||
| 32372 | +/* local snap header type */ | ||
| 32373 | +typedef struct wlan_snap { | ||
| 32374 | + u8 oui[WLAN_IEEE_OUI_LEN]; | ||
| 32375 | + u16 type; | ||
| 32376 | +} WLAN_PACKED wlan_snap_t; | ||
| 32377 | Index: linux-2.6.23/drivers/net/wireless/acx/wlan_hdr.h | ||
| 32378 | =================================================================== | ||
| 32379 | --- /dev/null 1970-01-01 00:00:00.000000000 +0000 | ||
| 32380 | +++ linux-2.6.23/drivers/net/wireless/acx/wlan_hdr.h 2008-01-20 21:13:40.000000000 +0000 | ||
| 32381 | @@ -0,0 +1,497 @@ | ||
| 32382 | +/*********************************************************************** | ||
| 32383 | +** Copyright (C) 2003 ACX100 Open Source Project | ||
| 32384 | +** | ||
| 32385 | +** The contents of this file are subject to the Mozilla Public | ||
| 32386 | +** License Version 1.1 (the "License"); you may not use this file | ||
| 32387 | +** except in compliance with the License. You may obtain a copy of | ||
| 32388 | +** the License at http://www.mozilla.org/MPL/ | ||
| 32389 | +** | ||
| 32390 | +** Software distributed under the License is distributed on an "AS | ||
| 32391 | +** IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or | ||
| 32392 | +** implied. See the License for the specific language governing | ||
| 32393 | +** rights and limitations under the License. | ||
| 32394 | +** | ||
| 32395 | +** Alternatively, the contents of this file may be used under the | ||
| 32396 | +** terms of the GNU Public License version 2 (the "GPL"), in which | ||
| 32397 | +** case the provisions of the GPL are applicable instead of the | ||
| 32398 | +** above. If you wish to allow the use of your version of this file | ||
| 32399 | +** only under the terms of the GPL and not to allow others to use | ||
| 32400 | +** your version of this file under the MPL, indicate your decision | ||
| 32401 | +** by deleting the provisions above and replace them with the notice | ||
| 32402 | +** and other provisions required by the GPL. If you do not delete | ||
| 32403 | +** the provisions above, a recipient may use your version of this | ||
| 32404 | +** file under either the MPL or the GPL. | ||
| 32405 | +** --------------------------------------------------------------------- | ||
| 32406 | +** Inquiries regarding the ACX100 Open Source Project can be | ||
| 32407 | +** made directly to: | ||
| 32408 | +** | ||
| 32409 | +** acx100-users@lists.sf.net | ||
| 32410 | +** http://acx100.sf.net | ||
| 32411 | +** --------------------------------------------------------------------- | ||
| 32412 | +*/ | ||
| 32413 | + | ||
| 32414 | +/*********************************************************************** | ||
| 32415 | +** This code is based on elements which are | ||
| 32416 | +** Copyright (C) 1999 AbsoluteValue Systems, Inc. All Rights Reserved. | ||
| 32417 | +** info@linux-wlan.com | ||
| 32418 | +** http://www.linux-wlan.com | ||
| 32419 | +*/ | ||
| 32420 | + | ||
| 32421 | +/* mini-doc | ||
| 32422 | + | ||
| 32423 | +Here are all 11b/11g/11a rates and modulations: | ||
| 32424 | + | ||
| 32425 | + 11b 11g 11a | ||
| 32426 | + --- --- --- | ||
| 32427 | + 1 |B |B | | ||
| 32428 | + 2 |Q |Q | | ||
| 32429 | + 5.5|Cp |C p| | ||
| 32430 | + 6 | |Od |O | ||
| 32431 | + 9 | |od |o | ||
| 32432 | +11 |Cp |C p| | ||
| 32433 | +12 | |Od |O | ||
| 32434 | +18 | |od |o | ||
| 32435 | +22 | | p| | ||
| 32436 | +24 | |Od |O | ||
| 32437 | +33 | | p| | ||
| 32438 | +36 | |od |o | ||
| 32439 | +48 | |od |o | ||
| 32440 | +54 | |od |o | ||
| 32441 | + | ||
| 32442 | +Mandatory: | ||
| 32443 | + B - DBPSK (Differential Binary Phase Shift Keying) | ||
| 32444 | + Q - DQPSK (Differential Quaternary Phase Shift Keying) | ||
| 32445 | + C - CCK (Complementary Code Keying, a form of DSSS | ||
| 32446 | + (Direct Sequence Spread Spectrum) modulation) | ||
| 32447 | + O - OFDM (Orthogonal Frequency Division Multiplexing) | ||
| 32448 | +Optional: | ||
| 32449 | + o - OFDM | ||
| 32450 | + d - CCK-OFDM (also known as DSSS-OFDM) | ||
| 32451 | + p - PBCC (Packet Binary Convolutional Coding) | ||
| 32452 | + | ||
| 32453 | +The term CCK-OFDM may be used interchangeably with DSSS-OFDM | ||
| 32454 | +(the IEEE 802.11g-2003 standard uses the latter terminology). | ||
| 32455 | +In the CCK-OFDM, the PLCP header of the frame uses the CCK form of DSSS, | ||
| 32456 | +while the PLCP payload (the MAC frame) is modulated using OFDM. | ||
| 32457 | + | ||
| 32458 | +Basically, you must use CCK-OFDM if you have mixed 11b/11g environment, | ||
| 32459 | +or else (pure OFDM) 11b equipment may not realize that AP | ||
| 32460 | +is sending a packet and start sending its own one. | ||
| 32461 | +Sadly, looks like acx111 does not support CCK-OFDM, only pure OFDM. | ||
| 32462 | + | ||
| 32463 | +Re PBCC: avoid using it. It makes sense only if you have | ||
| 32464 | +TI "11b+" hardware. You _must_ use PBCC in order to reach 22Mbps on it. | ||
| 32465 | + | ||
| 32466 | +Preambles: | ||
| 32467 | + | ||
| 32468 | +Long preamble (at 1Mbit rate, takes 144 us): | ||
| 32469 | + 16 bytes ones | ||
| 32470 | + 2 bytes 0xF3A0 (lsb sent first) | ||
| 32471 | +PLCP header follows (at 1Mbit also): | ||
| 32472 | + 1 byte Signal: speed, in 0.1Mbit units, except for: | ||
| 32473 | + 33Mbit: 33 (instead of 330 - doesn't fit in octet) | ||
| 32474 | + all CCK-OFDM rates: 30 | ||
| 32475 | + 1 byte Service | ||
| 32476 | + 0,1,4: reserved | ||
| 32477 | + 2: 1=locked clock | ||
| 32478 | + 3: 1=PBCC | ||
| 32479 | + 5: Length Extension (PBCC 22,33Mbit (11g only)) <- | ||
| 32480 | + 6: Length Extension (PBCC 22,33Mbit (11g only)) <- BLACK MAGIC HERE | ||
| 32481 | + 7: Length Extension <- | ||
| 32482 | + 2 bytes Length (time needed to tx this frame) | ||
| 32483 | + a) 5.5 Mbit/s CCK | ||
| 32484 | + Length = octets*8/5.5, rounded up to integer | ||
| 32485 | + b) 11 Mbit/s CCK | ||
| 32486 | + Length = octets*8/11, rounded up to integer | ||
| 32487 | + Service bit 7: | ||
| 32488 | + 0 = rounding took less than 8/11 | ||
| 32489 | + 1 = rounding took more than or equal to 8/11 | ||
| 32490 | + c) 5.5 Mbit/s PBCC | ||
| 32491 | + Length = (octets+1)*8/5.5, rounded up to integer | ||
| 32492 | + d) 11 Mbit/s PBCC | ||
| 32493 | + Length = (octets+1)*8/11, rounded up to integer | ||
| 32494 | + Service bit 7: | ||
| 32495 | + 0 = rounding took less than 8/11 | ||
| 32496 | + 1 = rounding took more than or equal to 8/11 | ||
| 32497 | + e) 22 Mbit/s PBCC | ||
| 32498 | + Length = (octets+1)*8/22, rounded up to integer | ||
| 32499 | + Service bits 6,7: | ||
| 32500 | + 00 = rounding took less than 8/22ths | ||
| 32501 | + 01 = rounding took 8/22...15/22ths | ||
| 32502 | + 10 = rounding took 16/22ths or more. | ||
| 32503 | + f) 33 Mbit/s PBCC | ||
| 32504 | + Length = (octets+1)*8/33, rounded up to integer | ||
| 32505 | + Service bits 5,6,7: | ||
| 32506 | + 000 rounding took less than 8/33 | ||
| 32507 | + 001 rounding took 8/33...15/33 | ||
| 32508 | + 010 rounding took 16/33...23/33 | ||
| 32509 | + 011 rounding took 24/33...31/33 | ||
| 32510 | + 100 rounding took 32/33 or more | ||
| 32511 | + 2 bytes CRC | ||
| 32512 | + | ||
| 32513 | +PSDU follows (up to 2346 bytes at selected rate) | ||
| 32514 | + | ||
| 32515 | +While Signal value alone is not enough to determine rate and modulation, | ||
| 32516 | +Signal+Service is always sufficient. | ||
| 32517 | + | ||
| 32518 | +Short preamble (at 1Mbit rate, takes 72 us): | ||
| 32519 | + 7 bytes zeroes | ||
| 32520 | + 2 bytes 0x05CF (lsb sent first) | ||
| 32521 | +PLCP header follows *at 2Mbit/s*. Format is the same as in long preamble. | ||
| 32522 | +PSDU follows (up to 2346 bytes at selected rate) | ||
| 32523 | + | ||
| 32524 | +OFDM preamble is completely different, uses OFDM | ||
| 32525 | +modulation from the start and thus easily identifiable. | ||
| 32526 | +Not shown here. | ||
| 32527 | +*/ | ||
| 32528 | + | ||
| 32529 | + | ||
| 32530 | +/*********************************************************************** | ||
| 32531 | +** Constants | ||
| 32532 | +*/ | ||
| 32533 | + | ||
| 32534 | +#define WLAN_HDR_A3_LEN 24 | ||
| 32535 | +#define WLAN_HDR_A4_LEN 30 | ||
| 32536 | +/* IV structure: | ||
| 32537 | +** 3 bytes: Initialization Vector (24 bits) | ||
| 32538 | +** 1 byte: 0..5: padding, must be 0; 6..7: key selector (0-3) | ||
| 32539 | +*/ | ||
| 32540 | +#define WLAN_WEP_IV_LEN 4 | ||
| 32541 | +/* 802.11 says 2312 but looks like 2312 is a max size of _WEPed data_ */ | ||
| 32542 | +#define WLAN_DATA_MAXLEN 2304 | ||
| 32543 | +#define WLAN_WEP_ICV_LEN 4 | ||
| 32544 | +#define WLAN_FCS_LEN 4 | ||
| 32545 | +#define WLAN_A3FR_MAXLEN (WLAN_HDR_A3_LEN + WLAN_DATA_MAXLEN) | ||
| 32546 | +#define WLAN_A4FR_MAXLEN (WLAN_HDR_A4_LEN + WLAN_DATA_MAXLEN) | ||
| 32547 | +#define WLAN_A3FR_MAXLEN_FCS (WLAN_HDR_A3_LEN + WLAN_DATA_MAXLEN + 4) | ||
| 32548 | +#define WLAN_A4FR_MAXLEN_FCS (WLAN_HDR_A4_LEN + WLAN_DATA_MAXLEN + 4) | ||
| 32549 | +#define WLAN_A3FR_MAXLEN_WEP (WLAN_A3FR_MAXLEN + 8) | ||
| 32550 | +#define WLAN_A4FR_MAXLEN_WEP (WLAN_A4FR_MAXLEN + 8) | ||
| 32551 | +#define WLAN_A3FR_MAXLEN_WEP_FCS (WLAN_A3FR_MAXLEN_FCS + 8) | ||
| 32552 | +#define WLAN_A4FR_MAXLEN_WEP_FCS (WLAN_A4FR_MAXLEN_FCS + 8) | ||
| 32553 | + | ||
| 32554 | +#define WLAN_BSS_TS_LEN 8 | ||
| 32555 | +#define WLAN_SSID_MAXLEN 32 | ||
| 32556 | +#define WLAN_BEACON_FR_MAXLEN (WLAN_HDR_A3_LEN + 334) | ||
| 32557 | +#define WLAN_ATIM_FR_MAXLEN (WLAN_HDR_A3_LEN + 0) | ||
| 32558 | +#define WLAN_DISASSOC_FR_MAXLEN (WLAN_HDR_A3_LEN + 2) | ||
| 32559 | +#define WLAN_ASSOCREQ_FR_MAXLEN (WLAN_HDR_A3_LEN + 48) | ||
| 32560 | +#define WLAN_ASSOCRESP_FR_MAXLEN (WLAN_HDR_A3_LEN + 16) | ||
| 32561 | +#define WLAN_REASSOCREQ_FR_MAXLEN (WLAN_HDR_A3_LEN + 54) | ||
| 32562 | +#define WLAN_REASSOCRESP_FR_MAXLEN (WLAN_HDR_A3_LEN + 16) | ||
| 32563 | +#define WLAN_PROBEREQ_FR_MAXLEN (WLAN_HDR_A3_LEN + 44) | ||
| 32564 | +#define WLAN_PROBERESP_FR_MAXLEN (WLAN_HDR_A3_LEN + 78) | ||
| 32565 | +#define WLAN_AUTHEN_FR_MAXLEN (WLAN_HDR_A3_LEN + 261) | ||
| 32566 | +#define WLAN_DEAUTHEN_FR_MAXLEN (WLAN_HDR_A3_LEN + 2) | ||
| 32567 | +#define WLAN_CHALLENGE_IE_LEN 130 | ||
| 32568 | +#define WLAN_CHALLENGE_LEN 128 | ||
| 32569 | +#define WLAN_WEP_MAXKEYLEN 13 | ||
| 32570 | +#define WLAN_WEP_NKEYS 4 | ||
| 32571 | + | ||
| 32572 | +/*--- Frame Control Field -------------------------------------*/ | ||
| 32573 | +/* Frame Types */ | ||
| 32574 | +#define WLAN_FTYPE_MGMT 0x00 | ||
| 32575 | +#define WLAN_FTYPE_CTL 0x01 | ||
| 32576 | +#define WLAN_FTYPE_DATA 0x02 | ||
| 32577 | + | ||
| 32578 | +/* Frame subtypes */ | ||
| 32579 | +/* Management */ | ||
| 32580 | +#define WLAN_FSTYPE_ASSOCREQ 0x00 | ||
| 32581 | +#define WLAN_FSTYPE_ASSOCRESP 0x01 | ||
| 32582 | +#define WLAN_FSTYPE_REASSOCREQ 0x02 | ||
| 32583 | +#define WLAN_FSTYPE_REASSOCRESP 0x03 | ||
| 32584 | +#define WLAN_FSTYPE_PROBEREQ 0x04 | ||
| 32585 | +#define WLAN_FSTYPE_PROBERESP 0x05 | ||
| 32586 | +#define WLAN_FSTYPE_BEACON 0x08 | ||
| 32587 | +#define WLAN_FSTYPE_ATIM 0x09 | ||
| 32588 | +#define WLAN_FSTYPE_DISASSOC 0x0a | ||
| 32589 | +#define WLAN_FSTYPE_AUTHEN 0x0b | ||
| 32590 | +#define WLAN_FSTYPE_DEAUTHEN 0x0c | ||
| 32591 | + | ||
| 32592 | +/* Control */ | ||
| 32593 | +#define WLAN_FSTYPE_PSPOLL 0x0a | ||
| 32594 | +#define WLAN_FSTYPE_RTS 0x0b | ||
| 32595 | +#define WLAN_FSTYPE_CTS 0x0c | ||
| 32596 | +#define WLAN_FSTYPE_ACK 0x0d | ||
| 32597 | +#define WLAN_FSTYPE_CFEND 0x0e | ||
| 32598 | +#define WLAN_FSTYPE_CFENDCFACK 0x0f | ||
| 32599 | + | ||
| 32600 | +/* Data */ | ||
| 32601 | +#define WLAN_FSTYPE_DATAONLY 0x00 | ||
| 32602 | +#define WLAN_FSTYPE_DATA_CFACK 0x01 | ||
| 32603 | +#define WLAN_FSTYPE_DATA_CFPOLL 0x02 | ||
| 32604 | +#define WLAN_FSTYPE_DATA_CFACK_CFPOLL 0x03 | ||
| 32605 | +#define WLAN_FSTYPE_NULL 0x04 | ||
| 32606 | +#define WLAN_FSTYPE_CFACK 0x05 | ||
| 32607 | +#define WLAN_FSTYPE_CFPOLL 0x06 | ||
| 32608 | +#define WLAN_FSTYPE_CFACK_CFPOLL 0x07 | ||
| 32609 | + | ||
| 32610 | +/*--- FC Constants v. 2.0 ------------------------------------*/ | ||
| 32611 | +/* Each constant is defined twice: WF_CONST is in host */ | ||
| 32612 | +/* byteorder, WF_CONSTi is in ieee byteorder. */ | ||
| 32613 | +/* Usage: */ | ||
| 32614 | +/* printf("the frame subtype is %X", WF_FC_FTYPEi & rx.fc); */ | ||
| 32615 | +/* tx.fc = WF_FTYPE_CTLi | WF_FSTYPE_RTSi; */ | ||
| 32616 | +/*------------------------------------------------------------*/ | ||
| 32617 | + | ||
| 32618 | +enum { | ||
| 32619 | +/*--- Frame Control Field -------------------------------------*/ | ||
| 32620 | +/* Protocol version: always 0 for current 802.11 standards */ | ||
| 32621 | +IEEE16(WF_FC_PVER, 0x0003) | ||
| 32622 | +IEEE16(WF_FC_FTYPE, 0x000c) | ||
| 32623 | +IEEE16(WF_FC_FSTYPE, 0x00f0) | ||
| 32624 | +IEEE16(WF_FC_TODS, 0x0100) | ||
| 32625 | +IEEE16(WF_FC_FROMDS, 0x0200) | ||
| 32626 | +IEEE16(WF_FC_FROMTODS, 0x0300) | ||
| 32627 | +IEEE16(WF_FC_MOREFRAG, 0x0400) | ||
| 32628 | +IEEE16(WF_FC_RETRY, 0x0800) | ||
| 32629 | +/* Indicates PS mode in which STA will be after successful completion | ||
| 32630 | +** of current frame exchange sequence. Always 0 for AP frames */ | ||
| 32631 | +IEEE16(WF_FC_PWRMGT, 0x1000) | ||
| 32632 | +/* What MoreData=1 means: | ||
| 32633 | +** From AP to STA in PS mode: don't sleep yet, I have more frames for you | ||
| 32634 | +** From Contention-Free (CF) Pollable STA in response to a CF-Poll: | ||
| 32635 | +** STA has buffered frames for transmission in response to next CF-Poll | ||
| 32636 | +** Bcast/mcast frames transmitted from AP: | ||
| 32637 | +** when additional bcast/mcast frames remain to be transmitted by AP | ||
| 32638 | +** during this beacon interval | ||
| 32639 | +** In all other cases MoreData=0 */ | ||
| 32640 | +IEEE16(WF_FC_MOREDATA, 0x2000) | ||
| 32641 | +IEEE16(WF_FC_ISWEP, 0x4000) | ||
| 32642 | +IEEE16(WF_FC_ORDER, 0x8000) | ||
| 32643 | + | ||
| 32644 | +/* Frame Types */ | ||
| 32645 | +IEEE16(WF_FTYPE_MGMT, 0x00) | ||
| 32646 | +IEEE16(WF_FTYPE_CTL, 0x04) | ||
| 32647 | +IEEE16(WF_FTYPE_DATA, 0x08) | ||
| 32648 | + | ||
| 32649 | +/* Frame subtypes */ | ||
| 32650 | +/* Management */ | ||
| 32651 | +IEEE16(WF_FSTYPE_ASSOCREQ, 0x00) | ||
| 32652 | +IEEE16(WF_FSTYPE_ASSOCRESP, 0x10) | ||
| 32653 | +IEEE16(WF_FSTYPE_REASSOCREQ, 0x20) | ||
| 32654 | +IEEE16(WF_FSTYPE_REASSOCRESP, 0x30) | ||
| 32655 | +IEEE16(WF_FSTYPE_PROBEREQ, 0x40) | ||
| 32656 | +IEEE16(WF_FSTYPE_PROBERESP, 0x50) | ||
| 32657 | +IEEE16(WF_FSTYPE_BEACON, 0x80) | ||
| 32658 | +IEEE16(WF_FSTYPE_ATIM, 0x90) | ||
| 32659 | +IEEE16(WF_FSTYPE_DISASSOC, 0xa0) | ||
| 32660 | +IEEE16(WF_FSTYPE_AUTHEN, 0xb0) | ||
| 32661 | +IEEE16(WF_FSTYPE_DEAUTHEN, 0xc0) | ||
| 32662 | + | ||
| 32663 | +/* Control */ | ||
| 32664 | +IEEE16(WF_FSTYPE_PSPOLL, 0xa0) | ||
| 32665 | +IEEE16(WF_FSTYPE_RTS, 0xb0) | ||
| 32666 | +IEEE16(WF_FSTYPE_CTS, 0xc0) | ||
| 32667 | +IEEE16(WF_FSTYPE_ACK, 0xd0) | ||
| 32668 | +IEEE16(WF_FSTYPE_CFEND, 0xe0) | ||
| 32669 | +IEEE16(WF_FSTYPE_CFENDCFACK, 0xf0) | ||
| 32670 | + | ||
| 32671 | +/* Data */ | ||
| 32672 | +IEEE16(WF_FSTYPE_DATAONLY, 0x00) | ||
| 32673 | +IEEE16(WF_FSTYPE_DATA_CFACK, 0x10) | ||
| 32674 | +IEEE16(WF_FSTYPE_DATA_CFPOLL, 0x20) | ||
| 32675 | +IEEE16(WF_FSTYPE_DATA_CFACK_CFPOLL, 0x30) | ||
| 32676 | +IEEE16(WF_FSTYPE_NULL, 0x40) | ||
| 32677 | +IEEE16(WF_FSTYPE_CFACK, 0x50) | ||
| 32678 | +IEEE16(WF_FSTYPE_CFPOLL, 0x60) | ||
| 32679 | +IEEE16(WF_FSTYPE_CFACK_CFPOLL, 0x70) | ||
| 32680 | +}; | ||
| 32681 | + | ||
| 32682 | + | ||
| 32683 | +/*********************************************************************** | ||
| 32684 | +** Macros | ||
| 32685 | +*/ | ||
| 32686 | + | ||
| 32687 | +/*--- Duration Macros ----------------------------------------*/ | ||
| 32688 | +/* Macros to get/set the bitfields of the Duration Field */ | ||
| 32689 | +/* - the duration value is only valid when bit15 is zero */ | ||
| 32690 | +/* - the firmware handles these values, so I'm not going */ | ||
| 32691 | +/* to use these macros right now. */ | ||
| 32692 | +/*------------------------------------------------------------*/ | ||
| 32693 | + | ||
| 32694 | +/*--- Sequence Control Macros -------------------------------*/ | ||
| 32695 | +/* Macros to get/set the bitfields of the Sequence Control */ | ||
| 32696 | +/* Field. */ | ||
| 32697 | +/*------------------------------------------------------------*/ | ||
| 32698 | +#define WLAN_GET_SEQ_FRGNUM(n) ((u16)(n) & 0x000f) | ||
| 32699 | +#define WLAN_GET_SEQ_SEQNUM(n) (((u16)(n) & 0xfff0) >> 4) | ||
| 32700 | + | ||
| 32701 | +/*--- Data ptr macro -----------------------------------------*/ | ||
| 32702 | +/* Creates a u8* to the data portion of a frame */ | ||
| 32703 | +/* Assumes you're passing in a ptr to the beginning of the hdr*/ | ||
| 32704 | +/*------------------------------------------------------------*/ | ||
| 32705 | +#define WLAN_HDR_A3_DATAP(p) (((u8*)(p)) + WLAN_HDR_A3_LEN) | ||
| 32706 | +#define WLAN_HDR_A4_DATAP(p) (((u8*)(p)) + WLAN_HDR_A4_LEN) | ||
| 32707 | + | ||
| 32708 | + | ||
| 32709 | +/*********************************************************************** | ||
| 32710 | +** Types | ||
| 32711 | +*/ | ||
| 32712 | + | ||
| 32713 | +/* 802.11 header type | ||
| 32714 | +** | ||
| 32715 | +** Note the following: | ||
| 32716 | +** a1 *always* is receiver's mac or bcast/mcast | ||
| 32717 | +** a2 *always* is transmitter's mac, if a2 exists | ||
| 32718 | +** seq: [0:3] frag#, [4:15] seq# - used for dup detection | ||
| 32719 | +** (dups from retries have same seq#) */ | ||
| 32720 | +typedef struct wlan_hdr { | ||
| 32721 | + u16 fc; | ||
| 32722 | + u16 dur; | ||
| 32723 | + u8 a1[ETH_ALEN]; | ||
| 32724 | + u8 a2[ETH_ALEN]; | ||
| 32725 | + u8 a3[ETH_ALEN]; | ||
| 32726 | + u16 seq; | ||
| 32727 | + u8 a4[ETH_ALEN]; | ||
| 32728 | +} WLAN_PACKED wlan_hdr_t; | ||
| 32729 | + | ||
| 32730 | +/* Separate structs for use if frame type is known */ | ||
| 32731 | +typedef struct wlan_hdr_a3 { | ||
| 32732 | + u16 fc; | ||
| 32733 | + u16 dur; | ||
| 32734 | + u8 a1[ETH_ALEN]; | ||
| 32735 | + u8 a2[ETH_ALEN]; | ||
| 32736 | + u8 a3[ETH_ALEN]; | ||
| 32737 | + u16 seq; | ||
| 32738 | +} WLAN_PACKED wlan_hdr_a3_t; | ||
| 32739 | + | ||
| 32740 | +typedef struct wlan_hdr_mgmt { | ||
| 32741 | + u16 fc; | ||
| 32742 | + u16 dur; | ||
| 32743 | + u8 da[ETH_ALEN]; | ||
| 32744 | + u8 sa[ETH_ALEN]; | ||
| 32745 | + u8 bssid[ETH_ALEN]; | ||
| 32746 | + u16 seq; | ||
| 32747 | +} WLAN_PACKED wlan_hdr_mgmt_t; | ||
| 32748 | + | ||
| 32749 | +#ifdef NOT_NEEDED_YET | ||
| 32750 | +typedef struct { /* ad-hoc peer->peer (to/from DS = 0/0) */ | ||
| 32751 | + u16 fc; | ||
| 32752 | + u16 dur; | ||
| 32753 | + u8 da[ETH_ALEN]; | ||
| 32754 | + u8 sa[ETH_ALEN]; | ||
| 32755 | + u8 bssid[ETH_ALEN]; | ||
| 32756 | + u16 seq; | ||
| 32757 | +} WLAN_PACKED ibss; | ||
| 32758 | +typedef struct { /* ap->sta (to/from DS = 0/1) */ | ||
| 32759 | + u16 fc; | ||
| 32760 | + u16 dur; | ||
| 32761 | + u8 da[ETH_ALEN]; | ||
| 32762 | + u8 bssid[ETH_ALEN]; | ||
| 32763 | + u8 sa[ETH_ALEN]; | ||
| 32764 | + u16 seq; | ||
| 32765 | +} WLAN_PACKED fromap; | ||
| 32766 | +typedef struct { /* sta->ap (to/from DS = 1/0) */ | ||
| 32767 | + u16 fc; | ||
| 32768 | + u16 dur; | ||
| 32769 | + u8 bssid[ETH_ALEN]; | ||
| 32770 | + u8 sa[ETH_ALEN]; | ||
| 32771 | + u8 da[ETH_ALEN]; | ||
| 32772 | + u16 seq; | ||
| 32773 | +} WLAN_PACKED toap; | ||
| 32774 | +typedef struct { /* wds->wds (to/from DS = 1/1), the only 4addr pkt */ | ||
| 32775 | + u16 fc; | ||
| 32776 | + u16 dur; | ||
| 32777 | + u8 ra[ETH_ALEN]; | ||
| 32778 | + u8 ta[ETH_ALEN]; | ||
| 32779 | + u8 da[ETH_ALEN]; | ||
| 32780 | + u16 seq; | ||
| 32781 | + u8 sa[ETH_ALEN]; | ||
| 32782 | +} WLAN_PACKED wds; | ||
| 32783 | +typedef struct { /* all management packets */ | ||
| 32784 | + u16 fc; | ||
| 32785 | + u16 dur; | ||
| 32786 | + u8 da[ETH_ALEN]; | ||
| 32787 | + u8 sa[ETH_ALEN]; | ||
| 32788 | + u8 bssid[ETH_ALEN]; | ||
| 32789 | + u16 seq; | ||
| 32790 | +} WLAN_PACKED mgmt; | ||
| 32791 | +typedef struct { /* has no body, just a FCS */ | ||
| 32792 | + u16 fc; | ||
| 32793 | + u16 dur; | ||
| 32794 | + u8 ra[ETH_ALEN]; | ||
| 32795 | + u8 ta[ETH_ALEN]; | ||
| 32796 | +} WLAN_PACKED rts; | ||
| 32797 | +typedef struct { /* has no body, just a FCS */ | ||
| 32798 | + u16 fc; | ||
| 32799 | + u16 dur; | ||
| 32800 | + u8 ra[ETH_ALEN]; | ||
| 32801 | +} WLAN_PACKED cts; | ||
| 32802 | +typedef struct { /* has no body, just a FCS */ | ||
| 32803 | + u16 fc; | ||
| 32804 | + u16 dur; | ||
| 32805 | + u8 ra[ETH_ALEN]; | ||
| 32806 | +} WLAN_PACKED ack; | ||
| 32807 | +typedef struct { /* has no body, just a FCS */ | ||
| 32808 | + u16 fc; | ||
| 32809 | + /* NB: this one holds Assoc ID in dur field: */ | ||
| 32810 | + u16 aid; | ||
| 32811 | + u8 bssid[ETH_ALEN]; | ||
| 32812 | + u8 ta[ETH_ALEN]; | ||
| 32813 | +} WLAN_PACKED pspoll; | ||
| 32814 | +typedef struct { /* has no body, just a FCS */ | ||
| 32815 | + u16 fc; | ||
| 32816 | + u16 dur; | ||
| 32817 | + u8 ra[ETH_ALEN]; | ||
| 32818 | + u8 bssid[ETH_ALEN]; | ||
| 32819 | +} WLAN_PACKED cfend; | ||
| 32820 | +typedef struct { /* has no body, just a FCS */ | ||
| 32821 | + u16 fc; | ||
| 32822 | + u16 dur; | ||
| 32823 | + u8 ra[ETH_ALEN]; | ||
| 32824 | + u8 bssid[ETH_ALEN]; | ||
| 32825 | +} WLAN_PACKED cfendcfack; | ||
| 32826 | +#endif | ||
| 32827 | + | ||
| 32828 | +/* Prism header emulation (monitor mode) */ | ||
| 32829 | +typedef struct wlanitem_u32 { | ||
| 32830 | + u32 did; | ||
| 32831 | + u16 status; | ||
| 32832 | + u16 len; | ||
| 32833 | + u32 data; | ||
| 32834 | +} WLAN_PACKED wlanitem_u32_t; | ||
| 32835 | +#define WLANITEM_STATUS_data_ok 0 | ||
| 32836 | +#define WLANITEM_STATUS_no_value 1 | ||
| 32837 | +#define WLANITEM_STATUS_invalid_itemname 2 | ||
| 32838 | +#define WLANITEM_STATUS_invalid_itemdata 3 | ||
| 32839 | +#define WLANITEM_STATUS_missing_itemdata 4 | ||
| 32840 | +#define WLANITEM_STATUS_incomplete_itemdata 5 | ||
| 32841 | +#define WLANITEM_STATUS_invalid_msg_did 6 | ||
| 32842 | +#define WLANITEM_STATUS_invalid_mib_did 7 | ||
| 32843 | +#define WLANITEM_STATUS_missing_conv_func 8 | ||
| 32844 | +#define WLANITEM_STATUS_string_too_long 9 | ||
| 32845 | +#define WLANITEM_STATUS_data_out_of_range 10 | ||
| 32846 | +#define WLANITEM_STATUS_string_too_short 11 | ||
| 32847 | +#define WLANITEM_STATUS_missing_valid_func 12 | ||
| 32848 | +#define WLANITEM_STATUS_unknown 13 | ||
| 32849 | +#define WLANITEM_STATUS_invalid_did 14 | ||
| 32850 | +#define WLANITEM_STATUS_missing_print_func 15 | ||
| 32851 | + | ||
| 32852 | +#define WLAN_DEVNAMELEN_MAX 16 | ||
| 32853 | +typedef struct wlansniffrm { | ||
| 32854 | + u32 msgcode; | ||
| 32855 | + u32 msglen; | ||
| 32856 | + u8 devname[WLAN_DEVNAMELEN_MAX]; | ||
| 32857 | + wlanitem_u32_t hosttime; | ||
| 32858 | + wlanitem_u32_t mactime; | ||
| 32859 | + wlanitem_u32_t channel; | ||
| 32860 | + wlanitem_u32_t rssi; | ||
| 32861 | + wlanitem_u32_t sq; | ||
| 32862 | + wlanitem_u32_t signal; | ||
| 32863 | + wlanitem_u32_t noise; | ||
| 32864 | + wlanitem_u32_t rate; | ||
| 32865 | + wlanitem_u32_t istx; /* tx? 0:no 1:yes */ | ||
| 32866 | + wlanitem_u32_t frmlen; | ||
| 32867 | +} WLAN_PACKED wlansniffrm_t; | ||
| 32868 | +#define WLANSNIFFFRM 0x0041 | ||
| 32869 | +#define WLANSNIFFFRM_hosttime 0x1041 | ||
| 32870 | +#define WLANSNIFFFRM_mactime 0x2041 | ||
| 32871 | +#define WLANSNIFFFRM_channel 0x3041 | ||
| 32872 | +#define WLANSNIFFFRM_rssi 0x4041 | ||
| 32873 | +#define WLANSNIFFFRM_sq 0x5041 | ||
| 32874 | +#define WLANSNIFFFRM_signal 0x6041 | ||
| 32875 | +#define WLANSNIFFFRM_noise 0x7041 | ||
| 32876 | +#define WLANSNIFFFRM_rate 0x8041 | ||
| 32877 | +#define WLANSNIFFFRM_istx 0x9041 | ||
| 32878 | +#define WLANSNIFFFRM_frmlen 0xA041 | ||
| 32879 | Index: linux-2.6.23/drivers/net/wireless/acx/wlan_mgmt.h | ||
| 32880 | =================================================================== | ||
| 32881 | --- /dev/null 1970-01-01 00:00:00.000000000 +0000 | ||
| 32882 | +++ linux-2.6.23/drivers/net/wireless/acx/wlan_mgmt.h 2008-01-20 21:13:40.000000000 +0000 | ||
| 32883 | @@ -0,0 +1,582 @@ | ||
| 32884 | +/*********************************************************************** | ||
| 32885 | +** Copyright (C) 2003 ACX100 Open Source Project | ||
| 32886 | +** | ||
| 32887 | +** The contents of this file are subject to the Mozilla Public | ||
| 32888 | +** License Version 1.1 (the "License"); you may not use this file | ||
| 32889 | +** except in compliance with the License. You may obtain a copy of | ||
| 32890 | +** the License at http://www.mozilla.org/MPL/ | ||
| 32891 | +** | ||
| 32892 | +** Software distributed under the License is distributed on an "AS | ||
| 32893 | +** IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or | ||
| 32894 | +** implied. See the License for the specific language governing | ||
| 32895 | +** rights and limitations under the License. | ||
| 32896 | +** | ||
| 32897 | +** Alternatively, the contents of this file may be used under the | ||
| 32898 | +** terms of the GNU Public License version 2 (the "GPL"), in which | ||
| 32899 | +** case the provisions of the GPL are applicable instead of the | ||
| 32900 | +** above. If you wish to allow the use of your version of this file | ||
| 32901 | +** only under the terms of the GPL and not to allow others to use | ||
| 32902 | +** your version of this file under the MPL, indicate your decision | ||
| 32903 | +** by deleting the provisions above and replace them with the notice | ||
| 32904 | +** and other provisions required by the GPL. If you do not delete | ||
| 32905 | +** the provisions above, a recipient may use your version of this | ||
| 32906 | +** file under either the MPL or the GPL. | ||
| 32907 | +** --------------------------------------------------------------------- | ||
| 32908 | +** Inquiries regarding the ACX100 Open Source Project can be | ||
| 32909 | +** made directly to: | ||
| 32910 | +** | ||
| 32911 | +** acx100-users@lists.sf.net | ||
| 32912 | +** http://acx100.sf.net | ||
| 32913 | +** --------------------------------------------------------------------- | ||
| 32914 | +*/ | ||
| 32915 | + | ||
| 32916 | +/*********************************************************************** | ||
| 32917 | +** This code is based on elements which are | ||
| 32918 | +** Copyright (C) 1999 AbsoluteValue Systems, Inc. All Rights Reserved. | ||
| 32919 | +** info@linux-wlan.com | ||
| 32920 | +** http://www.linux-wlan.com | ||
| 32921 | +*/ | ||
| 32922 | + | ||
| 32923 | +/*********************************************************************** | ||
| 32924 | +** Constants | ||
| 32925 | +*/ | ||
| 32926 | + | ||
| 32927 | +/*-- Information Element IDs --------------------*/ | ||
| 32928 | +#define WLAN_EID_SSID 0 | ||
| 32929 | +#define WLAN_EID_SUPP_RATES 1 | ||
| 32930 | +#define WLAN_EID_FH_PARMS 2 | ||
| 32931 | +#define WLAN_EID_DS_PARMS 3 | ||
| 32932 | +#define WLAN_EID_CF_PARMS 4 | ||
| 32933 | +#define WLAN_EID_TIM 5 | ||
| 32934 | +#define WLAN_EID_IBSS_PARMS 6 | ||
| 32935 | +#define WLAN_EID_COUNTRY 7 /* 802.11d */ | ||
| 32936 | +#define WLAN_EID_FH_HOP_PARMS 8 /* 802.11d */ | ||
| 32937 | +#define WLAN_EID_FH_TABLE 9 /* 802.11d */ | ||
| 32938 | +#define WLAN_EID_REQUEST 10 /* 802.11d */ | ||
| 32939 | +/*-- values 11-15 reserved --*/ | ||
| 32940 | +#define WLAN_EID_CHALLENGE 16 | ||
| 32941 | +/*-- values 17-31 reserved for challenge text extension --*/ | ||
| 32942 | +#define WLAN_EID_PWR_CONSTRAINT 32 /* 11h PowerConstraint */ | ||
| 32943 | +#define WLAN_EID_ERP_INFO 42 /* was seen from WRT54GS with OpenWrt */ | ||
| 32944 | +#define WLAN_EID_NONERP 47 /* was seen from WRT54GS with OpenWrt */ | ||
| 32945 | +#define WLAN_EID_RSN 48 | ||
| 32946 | +#define WLAN_EID_EXT_RATES 50 | ||
| 32947 | +#define WLAN_EID_UNKNOWN128 128 | ||
| 32948 | +#define WLAN_EID_UNKNOWN133 133 | ||
| 32949 | +#define WLAN_EID_GENERIC 221 /* was seen from WRT54GS with OpenWrt */ | ||
| 32950 | +#define WLAN_EID_UNKNOWN223 223 | ||
| 32951 | + | ||
| 32952 | +#if 0 | ||
| 32953 | +#define WLAN_EID_PWR_CAP 33 /* 11h PowerCapability */ | ||
| 32954 | +#define WLAN_EID_TPC_REQUEST 34 /* 11h TPC Request */ | ||
| 32955 | +#define WLAN_EID_TPC_REPORT 35 /* 11h TPC Report */ | ||
| 32956 | +#define WLAN_EID_SUPP_CHANNELS 36 /* 11h Supported Channels */ | ||
| 32957 | +#define WLAN_EID_CHANNEL_SWITCH 37 /* 11h ChannelSwitch */ | ||
| 32958 | +#define WLAN_EID_MEASURE_REQUEST 38 /* 11h MeasurementRequest */ | ||
| 32959 | +#define WLAN_EID_MEASURE_REPORT 39 /* 11h MeasurementReport */ | ||
| 32960 | +#define WLAN_EID_QUIET_ID 40 /* 11h Quiet */ | ||
| 32961 | +#define WLAN_EID_IBSS_DFS_ID 41 /* 11h IBSS_DFS */ | ||
| 32962 | +#endif | ||
| 32963 | + | ||
| 32964 | +/*-- Reason Codes -------------------------------*/ | ||
| 32965 | +#define WLAN_MGMT_REASON_RSVD 0 | ||
| 32966 | +#define WLAN_MGMT_REASON_UNSPEC 1 | ||
| 32967 | +#define WLAN_MGMT_REASON_PRIOR_AUTH_INVALID 2 | ||
| 32968 | +#define WLAN_MGMT_REASON_DEAUTH_LEAVING 3 | ||
| 32969 | +#define WLAN_MGMT_REASON_DISASSOC_INACTIVE 4 | ||
| 32970 | +#define WLAN_MGMT_REASON_DISASSOC_AP_BUSY 5 | ||
| 32971 | +#define WLAN_MGMT_REASON_CLASS2_NONAUTH 6 | ||
| 32972 | +#define WLAN_MGMT_REASON_CLASS3_NONASSOC 7 | ||
| 32973 | +#define WLAN_MGMT_REASON_DISASSOC_STA_HASLEFT 8 | ||
| 32974 | +#define WLAN_MGMT_REASON_CANT_ASSOC_NONAUTH 9 | ||
| 32975 | + | ||
| 32976 | +/*-- Status Codes -------------------------------*/ | ||
| 32977 | +#define WLAN_MGMT_STATUS_SUCCESS 0 | ||
| 32978 | +#define WLAN_MGMT_STATUS_UNSPEC_FAILURE 1 | ||
| 32979 | +#define WLAN_MGMT_STATUS_CAPS_UNSUPPORTED 10 | ||
| 32980 | +#define WLAN_MGMT_STATUS_REASSOC_NO_ASSOC 11 | ||
| 32981 | +#define WLAN_MGMT_STATUS_ASSOC_DENIED_UNSPEC 12 | ||
| 32982 | +#define WLAN_MGMT_STATUS_UNSUPPORTED_AUTHALG 13 | ||
| 32983 | +#define WLAN_MGMT_STATUS_RX_AUTH_NOSEQ 14 | ||
| 32984 | +#define WLAN_MGMT_STATUS_CHALLENGE_FAIL 15 | ||
| 32985 | +#define WLAN_MGMT_STATUS_AUTH_TIMEOUT 16 | ||
| 32986 | +#define WLAN_MGMT_STATUS_ASSOC_DENIED_BUSY 17 | ||
| 32987 | +#define WLAN_MGMT_STATUS_ASSOC_DENIED_RATES 18 | ||
| 32988 | +/* p80211b additions */ | ||
| 32989 | +#define WLAN_MGMT_STATUS_ASSOC_DENIED_NOSHORT 19 | ||
| 32990 | +#define WLAN_MGMT_STATUS_ASSOC_DENIED_NOPBCC 20 | ||
| 32991 | +#define WLAN_MGMT_STATUS_ASSOC_DENIED_NOAGILITY 21 | ||
| 32992 | + | ||
| 32993 | +/*-- Auth Algorithm Field ---------------------------*/ | ||
| 32994 | +#define WLAN_AUTH_ALG_OPENSYSTEM 0 | ||
| 32995 | +#define WLAN_AUTH_ALG_SHAREDKEY 1 | ||
| 32996 | + | ||
| 32997 | +/*-- Management Frame Field Offsets -------------*/ | ||
| 32998 | +/* Note: Not all fields are listed because of variable lengths */ | ||
| 32999 | +/* Note: These offsets are from the start of the frame data */ | ||
| 33000 | + | ||
| 33001 | +#define WLAN_BEACON_OFF_TS 0 | ||
| 33002 | +#define WLAN_BEACON_OFF_BCN_INT 8 | ||
| 33003 | +#define WLAN_BEACON_OFF_CAPINFO 10 | ||
| 33004 | +#define WLAN_BEACON_OFF_SSID 12 | ||
| 33005 | + | ||
| 33006 | +#define WLAN_DISASSOC_OFF_REASON 0 | ||
| 33007 | + | ||
| 33008 | +#define WLAN_ASSOCREQ_OFF_CAP_INFO 0 | ||
| 33009 | +#define WLAN_ASSOCREQ_OFF_LISTEN_INT 2 | ||
| 33010 | +#define WLAN_ASSOCREQ_OFF_SSID 4 | ||
| 33011 | + | ||
| 33012 | +#define WLAN_ASSOCRESP_OFF_CAP_INFO 0 | ||
| 33013 | +#define WLAN_ASSOCRESP_OFF_STATUS 2 | ||
| 33014 | +#define WLAN_ASSOCRESP_OFF_AID 4 | ||
| 33015 | +#define WLAN_ASSOCRESP_OFF_SUPP_RATES 6 | ||
| 33016 | + | ||
| 33017 | +#define WLAN_REASSOCREQ_OFF_CAP_INFO 0 | ||
| 33018 | +#define WLAN_REASSOCREQ_OFF_LISTEN_INT 2 | ||
| 33019 | +#define WLAN_REASSOCREQ_OFF_CURR_AP 4 | ||
| 33020 | +#define WLAN_REASSOCREQ_OFF_SSID 10 | ||
| 33021 | + | ||
| 33022 | +#define WLAN_REASSOCRESP_OFF_CAP_INFO 0 | ||
| 33023 | +#define WLAN_REASSOCRESP_OFF_STATUS 2 | ||
| 33024 | +#define WLAN_REASSOCRESP_OFF_AID 4 | ||
| 33025 | +#define WLAN_REASSOCRESP_OFF_SUPP_RATES 6 | ||
| 33026 | + | ||
| 33027 | +#define WLAN_PROBEREQ_OFF_SSID 0 | ||
| 33028 | + | ||
| 33029 | +#define WLAN_PROBERESP_OFF_TS 0 | ||
| 33030 | +#define WLAN_PROBERESP_OFF_BCN_INT 8 | ||
| 33031 | +#define WLAN_PROBERESP_OFF_CAP_INFO 10 | ||
| 33032 | +#define WLAN_PROBERESP_OFF_SSID 12 | ||
| 33033 | + | ||
| 33034 | +#define WLAN_AUTHEN_OFF_AUTH_ALG 0 | ||
| 33035 | +#define WLAN_AUTHEN_OFF_AUTH_SEQ 2 | ||
| 33036 | +#define WLAN_AUTHEN_OFF_STATUS 4 | ||
| 33037 | +#define WLAN_AUTHEN_OFF_CHALLENGE 6 | ||
| 33038 | + | ||
| 33039 | +#define WLAN_DEAUTHEN_OFF_REASON 0 | ||
| 33040 | + | ||
| 33041 | +enum { | ||
| 33042 | +IEEE16(WF_MGMT_CAP_ESS, 0x0001) | ||
| 33043 | +IEEE16(WF_MGMT_CAP_IBSS, 0x0002) | ||
| 33044 | +/* In (re)assoc request frames by STA: | ||
| 33045 | +** Pollable=0, PollReq=0: STA is not CF-Pollable | ||
| 33046 | +** 0 1: STA is CF-Pollable, not requesting to be placed on the CF-Polling list | ||
| 33047 | +** 1 0: STA is CF-Pollable, requesting to be placed on the CF-Polling list | ||
| 33048 | +** 1 1: STA is CF-Pollable, requesting never to be polled | ||
| 33049 | +** In beacon, proberesp, (re)assoc resp frames by AP: | ||
| 33050 | +** 0 0: No point coordinator at AP | ||
| 33051 | +** 0 1: Point coordinator at AP for delivery only (no polling) | ||
| 33052 | +** 1 0: Point coordinator at AP for delivery and polling | ||
| 33053 | +** 1 1: Reserved */ | ||
| 33054 | +IEEE16(WF_MGMT_CAP_CFPOLLABLE, 0x0004) | ||
| 33055 | +IEEE16(WF_MGMT_CAP_CFPOLLREQ, 0x0008) | ||
| 33056 | +/* 1=non-WEP data frames are disallowed */ | ||
| 33057 | +IEEE16(WF_MGMT_CAP_PRIVACY, 0x0010) | ||
| 33058 | +/* In beacon, proberesp, (re)assocresp by AP/AdHoc: | ||
| 33059 | +** 1=use of shortpre is allowed ("I can receive shortpre") */ | ||
| 33060 | +IEEE16(WF_MGMT_CAP_SHORT, 0x0020) | ||
| 33061 | +IEEE16(WF_MGMT_CAP_PBCC, 0x0040) | ||
| 33062 | +IEEE16(WF_MGMT_CAP_AGILITY, 0x0080) | ||
| 33063 | +/* In (re)assoc request frames by STA: | ||
| 33064 | +** 1=short slot time implemented and enabled | ||
| 33065 | +** NB: AP shall use long slot time beginning at the next Beacon after assoc | ||
| 33066 | +** of STA with this bit set to 0 | ||
| 33067 | +** In beacon, proberesp, (re)assoc resp frames by AP: | ||
| 33068 | +** currently used slot time value: 0/1 - long/short */ | ||
| 33069 | +IEEE16(WF_MGMT_CAP_SHORTSLOT, 0x0400) | ||
| 33070 | +/* In (re)assoc request frames by STA: 1=CCK-OFDM is implemented and enabled | ||
| 33071 | +** In beacon, proberesp, (re)assoc resp frames by AP/AdHoc: | ||
| 33072 | +** 1=CCK-OFDM is allowed */ | ||
| 33073 | +IEEE16(WF_MGMT_CAP_CCKOFDM, 0x2000) | ||
| 33074 | +}; | ||
| 33075 | + | ||
| 33076 | + | ||
| 33077 | +/*********************************************************************** | ||
| 33078 | +** Types | ||
| 33079 | +*/ | ||
| 33080 | + | ||
| 33081 | +/* Information Element types */ | ||
| 33082 | + | ||
| 33083 | +/* prototype structure, all IEs start with these members */ | ||
| 33084 | +typedef struct wlan_ie { | ||
| 33085 | + u8 eid; | ||
| 33086 | + u8 len; | ||
| 33087 | +} WLAN_PACKED wlan_ie_t; | ||
| 33088 | + | ||
| 33089 | +/*-- Service Set Identity (SSID) -----------------*/ | ||
| 33090 | +typedef struct wlan_ie_ssid { | ||
| 33091 | + u8 eid; | ||
| 33092 | + u8 len; | ||
| 33093 | + u8 ssid[1]; /* may be zero */ | ||
| 33094 | +} WLAN_PACKED wlan_ie_ssid_t; | ||
| 33095 | + | ||
| 33096 | +/*-- Supported Rates -----------------------------*/ | ||
| 33097 | +typedef struct wlan_ie_supp_rates { | ||
| 33098 | + u8 eid; | ||
| 33099 | + u8 len; | ||
| 33100 | + u8 rates[1]; /* had better be at LEAST one! */ | ||
| 33101 | +} WLAN_PACKED wlan_ie_supp_rates_t; | ||
| 33102 | + | ||
| 33103 | +/*-- FH Parameter Set ----------------------------*/ | ||
| 33104 | +typedef struct wlan_ie_fh_parms { | ||
| 33105 | + u8 eid; | ||
| 33106 | + u8 len; | ||
| 33107 | + u16 dwell; | ||
| 33108 | + u8 hopset; | ||
| 33109 | + u8 hoppattern; | ||
| 33110 | + u8 hopindex; | ||
| 33111 | +} WLAN_PACKED wlan_ie_fh_parms_t; | ||
| 33112 | + | ||
| 33113 | +/*-- DS Parameter Set ----------------------------*/ | ||
| 33114 | +typedef struct wlan_ie_ds_parms { | ||
| 33115 | + u8 eid; | ||
| 33116 | + u8 len; | ||
| 33117 | + u8 curr_ch; | ||
| 33118 | +} WLAN_PACKED wlan_ie_ds_parms_t; | ||
| 33119 | + | ||
| 33120 | +/*-- CF Parameter Set ----------------------------*/ | ||
| 33121 | +typedef struct wlan_ie_cf_parms { | ||
| 33122 | + u8 eid; | ||
| 33123 | + u8 len; | ||
| 33124 | + u8 cfp_cnt; | ||
| 33125 | + u8 cfp_period; | ||
| 33126 | + u16 cfp_maxdur; | ||
| 33127 | + u16 cfp_durremaining; | ||
| 33128 | +} WLAN_PACKED wlan_ie_cf_parms_t; | ||
| 33129 | + | ||
| 33130 | +/*-- TIM ------------------------------------------*/ | ||
| 33131 | +typedef struct wlan_ie_tim { | ||
| 33132 | + u8 eid; | ||
| 33133 | + u8 len; | ||
| 33134 | + u8 dtim_cnt; | ||
| 33135 | + u8 dtim_period; | ||
| 33136 | + u8 bitmap_ctl; | ||
| 33137 | + u8 virt_bm[1]; | ||
| 33138 | +} WLAN_PACKED wlan_ie_tim_t; | ||
| 33139 | + | ||
| 33140 | +/*-- IBSS Parameter Set ---------------------------*/ | ||
| 33141 | +typedef struct wlan_ie_ibss_parms { | ||
| 33142 | + u8 eid; | ||
| 33143 | + u8 len; | ||
| 33144 | + u16 atim_win; | ||
| 33145 | +} WLAN_PACKED wlan_ie_ibss_parms_t; | ||
| 33146 | + | ||
| 33147 | +/*-- Challenge Text ------------------------------*/ | ||
| 33148 | +typedef struct wlan_ie_challenge { | ||
| 33149 | + u8 eid; | ||
| 33150 | + u8 len; | ||
| 33151 | + u8 challenge[1]; | ||
| 33152 | +} WLAN_PACKED wlan_ie_challenge_t; | ||
| 33153 | + | ||
| 33154 | +/*-- ERP (42) -------------------------------------*/ | ||
| 33155 | +typedef struct wlan_ie_erp { | ||
| 33156 | + u8 eid; | ||
| 33157 | + u8 len; | ||
| 33158 | + /* bit 0:Non ERP present | ||
| 33159 | + ** 1:Use Protection | ||
| 33160 | + ** 2:Barker Preamble mode | ||
| 33161 | + ** 3-7:reserved */ | ||
| 33162 | + u8 erp; | ||
| 33163 | +} WLAN_PACKED wlan_ie_erp_t; | ||
| 33164 | + | ||
| 33165 | +/* Types for parsing mgmt frames */ | ||
| 33166 | + | ||
| 33167 | +/* prototype structure, all mgmt frame types will start with these members */ | ||
| 33168 | +typedef struct wlan_fr_mgmt { | ||
| 33169 | + u16 type; | ||
| 33170 | + u16 len; /* DOES NOT include FCS */ | ||
| 33171 | + wlan_hdr_t *hdr; | ||
| 33172 | + /* used for target specific data, skb in Linux */ | ||
| 33173 | + /*-- fixed fields -----------*/ | ||
| 33174 | + /*-- info elements ----------*/ | ||
| 33175 | +} WLAN_PACKED wlan_fr_mgmt_t; | ||
| 33176 | + | ||
| 33177 | +/*-- Beacon ---------------------------------------*/ | ||
| 33178 | +typedef struct wlan_fr_beacon { | ||
| 33179 | + u16 type; | ||
| 33180 | + u16 len; | ||
| 33181 | + wlan_hdr_t *hdr; | ||
| 33182 | + /*-- fixed fields -----------*/ | ||
| 33183 | + u64 *ts; | ||
| 33184 | + u16 *bcn_int; | ||
| 33185 | + u16 *cap_info; | ||
| 33186 | + /*-- info elements ----------*/ | ||
| 33187 | + wlan_ie_ssid_t *ssid; | ||
| 33188 | + wlan_ie_supp_rates_t *supp_rates; | ||
| 33189 | + wlan_ie_supp_rates_t *ext_rates; | ||
| 33190 | + wlan_ie_fh_parms_t *fh_parms; | ||
| 33191 | + wlan_ie_ds_parms_t *ds_parms; | ||
| 33192 | + wlan_ie_cf_parms_t *cf_parms; | ||
| 33193 | + wlan_ie_ibss_parms_t *ibss_parms; | ||
| 33194 | + wlan_ie_tim_t *tim; /* in beacon only, not proberesp */ | ||
| 33195 | + wlan_ie_erp_t *erp; /* in beacon only, not proberesp */ | ||
| 33196 | +} wlan_fr_beacon_t; | ||
| 33197 | +#define wlan_fr_proberesp wlan_fr_beacon | ||
| 33198 | +#define wlan_fr_proberesp_t wlan_fr_beacon_t | ||
| 33199 | + | ||
| 33200 | +/*-- IBSS ATIM ------------------------------------*/ | ||
| 33201 | +typedef struct wlan_fr_ibssatim { | ||
| 33202 | + u16 type; | ||
| 33203 | + u16 len; | ||
| 33204 | + wlan_hdr_t *hdr; | ||
| 33205 | + /*-- fixed fields -----------*/ | ||
| 33206 | + /*-- info elements ----------*/ | ||
| 33207 | + /* this frame type has a null body */ | ||
| 33208 | +} wlan_fr_ibssatim_t; | ||
| 33209 | + | ||
| 33210 | +/*-- Disassociation -------------------------------*/ | ||
| 33211 | +typedef struct wlan_fr_disassoc { | ||
| 33212 | + u16 type; | ||
| 33213 | + u16 len; | ||
| 33214 | + wlan_hdr_t *hdr; | ||
| 33215 | + /*-- fixed fields -----------*/ | ||
| 33216 | + u16 *reason; | ||
| 33217 | + /*-- info elements ----------*/ | ||
| 33218 | +} wlan_fr_disassoc_t; | ||
| 33219 | + | ||
| 33220 | +/*-- Association Request --------------------------*/ | ||
| 33221 | +typedef struct wlan_fr_assocreq { | ||
| 33222 | + u16 type; | ||
| 33223 | + u16 len; | ||
| 33224 | + wlan_hdr_t *hdr; | ||
| 33225 | + /*-- fixed fields -----------*/ | ||
| 33226 | + u16 *cap_info; | ||
| 33227 | + u16 *listen_int; | ||
| 33228 | + /*-- info elements ----------*/ | ||
| 33229 | + wlan_ie_ssid_t *ssid; | ||
| 33230 | + wlan_ie_supp_rates_t *supp_rates; | ||
| 33231 | + wlan_ie_supp_rates_t *ext_rates; | ||
| 33232 | +} wlan_fr_assocreq_t; | ||
| 33233 | + | ||
| 33234 | +/*-- Association Response -------------------------*/ | ||
| 33235 | +typedef struct wlan_fr_assocresp { | ||
| 33236 | + u16 type; | ||
| 33237 | + u16 len; | ||
| 33238 | + wlan_hdr_t *hdr; | ||
| 33239 | + /*-- fixed fields -----------*/ | ||
| 33240 | + u16 *cap_info; | ||
| 33241 | + u16 *status; | ||
| 33242 | + u16 *aid; | ||
| 33243 | + /*-- info elements ----------*/ | ||
| 33244 | + wlan_ie_supp_rates_t *supp_rates; | ||
| 33245 | + wlan_ie_supp_rates_t *ext_rates; | ||
| 33246 | +} wlan_fr_assocresp_t; | ||
| 33247 | + | ||
| 33248 | +/*-- Reassociation Request ------------------------*/ | ||
| 33249 | +typedef struct wlan_fr_reassocreq { | ||
| 33250 | + u16 type; | ||
| 33251 | + u16 len; | ||
| 33252 | + wlan_hdr_t *hdr; | ||
| 33253 | + /*-- fixed fields -----------*/ | ||
| 33254 | + u16 *cap_info; | ||
| 33255 | + u16 *listen_int; | ||
| 33256 | + u8 *curr_ap; | ||
| 33257 | + /*-- info elements ----------*/ | ||
| 33258 | + wlan_ie_ssid_t *ssid; | ||
| 33259 | + wlan_ie_supp_rates_t *supp_rates; | ||
| 33260 | + wlan_ie_supp_rates_t *ext_rates; | ||
| 33261 | +} wlan_fr_reassocreq_t; | ||
| 33262 | + | ||
| 33263 | +/*-- Reassociation Response -----------------------*/ | ||
| 33264 | +typedef struct wlan_fr_reassocresp { | ||
| 33265 | + u16 type; | ||
| 33266 | + u16 len; | ||
| 33267 | + wlan_hdr_t *hdr; | ||
| 33268 | + /*-- fixed fields -----------*/ | ||
| 33269 | + u16 *cap_info; | ||
| 33270 | + u16 *status; | ||
| 33271 | + u16 *aid; | ||
| 33272 | + /*-- info elements ----------*/ | ||
| 33273 | + wlan_ie_supp_rates_t *supp_rates; | ||
| 33274 | + wlan_ie_supp_rates_t *ext_rates; | ||
| 33275 | +} wlan_fr_reassocresp_t; | ||
| 33276 | + | ||
| 33277 | +/*-- Probe Request --------------------------------*/ | ||
| 33278 | +typedef struct wlan_fr_probereq { | ||
| 33279 | + u16 type; | ||
| 33280 | + u16 len; | ||
| 33281 | + wlan_hdr_t *hdr; | ||
| 33282 | + /*-- fixed fields -----------*/ | ||
| 33283 | + /*-- info elements ----------*/ | ||
| 33284 | + wlan_ie_ssid_t *ssid; | ||
| 33285 | + wlan_ie_supp_rates_t *supp_rates; | ||
| 33286 | + wlan_ie_supp_rates_t *ext_rates; | ||
| 33287 | +} wlan_fr_probereq_t; | ||
| 33288 | + | ||
| 33289 | +/*-- Authentication -------------------------------*/ | ||
| 33290 | +typedef struct wlan_fr_authen { | ||
| 33291 | + u16 type; | ||
| 33292 | + u16 len; | ||
| 33293 | + wlan_hdr_t *hdr; | ||
| 33294 | + /*-- fixed fields -----------*/ | ||
| 33295 | + u16 *auth_alg; | ||
| 33296 | + u16 *auth_seq; | ||
| 33297 | + u16 *status; | ||
| 33298 | + /*-- info elements ----------*/ | ||
| 33299 | + wlan_ie_challenge_t *challenge; | ||
| 33300 | +} wlan_fr_authen_t; | ||
| 33301 | + | ||
| 33302 | +/*-- Deauthenication -----------------------------*/ | ||
| 33303 | +typedef struct wlan_fr_deauthen { | ||
| 33304 | + u16 type; | ||
| 33305 | + u16 len; | ||
| 33306 | + wlan_hdr_t *hdr; | ||
| 33307 | + /*-- fixed fields -----------*/ | ||
| 33308 | + u16 *reason; | ||
| 33309 | + /*-- info elements ----------*/ | ||
| 33310 | +} wlan_fr_deauthen_t; | ||
| 33311 | + | ||
| 33312 | +/* Types for building mgmt frames */ | ||
| 33313 | + | ||
| 33314 | +/* Warning. Several types used in below structs are | ||
| 33315 | +** in fact variable length. Use structs with such fields with caution */ | ||
| 33316 | +typedef struct auth_frame_body { | ||
| 33317 | + u16 auth_alg; | ||
| 33318 | + u16 auth_seq; | ||
| 33319 | + u16 status; | ||
| 33320 | + wlan_ie_challenge_t challenge; | ||
| 33321 | +} WLAN_PACKED auth_frame_body_t; | ||
| 33322 | + | ||
| 33323 | +typedef struct assocresp_frame_body { | ||
| 33324 | + u16 cap_info; | ||
| 33325 | + u16 status; | ||
| 33326 | + u16 aid; | ||
| 33327 | + wlan_ie_supp_rates_t rates; | ||
| 33328 | +} WLAN_PACKED assocresp_frame_body_t; | ||
| 33329 | + | ||
| 33330 | +typedef struct reassocreq_frame_body { | ||
| 33331 | + u16 cap_info; | ||
| 33332 | + u16 listen_int; | ||
| 33333 | + u8 current_ap[ETH_ALEN]; | ||
| 33334 | + wlan_ie_ssid_t ssid; | ||
| 33335 | +/* access to this one is disabled since ssid_t is variable length: */ | ||
| 33336 | + /* wlan_ie_supp_rates_t rates; */ | ||
| 33337 | +} WLAN_PACKED reassocreq_frame_body_t; | ||
| 33338 | + | ||
| 33339 | +typedef struct reassocresp_frame_body { | ||
| 33340 | + u16 cap_info; | ||
| 33341 | + u16 status; | ||
| 33342 | + u16 aid; | ||
| 33343 | + wlan_ie_supp_rates_t rates; | ||
| 33344 | +} WLAN_PACKED reassocresp_frame_body_t; | ||
| 33345 | + | ||
| 33346 | +typedef struct deauthen_frame_body { | ||
| 33347 | + u16 reason; | ||
| 33348 | +} WLAN_PACKED deauthen_frame_body_t; | ||
| 33349 | + | ||
| 33350 | +typedef struct disassoc_frame_body { | ||
| 33351 | + u16 reason; | ||
| 33352 | +} WLAN_PACKED disassoc_frame_body_t; | ||
| 33353 | + | ||
| 33354 | +typedef struct probereq_frame_body { | ||
| 33355 | + wlan_ie_ssid_t ssid; | ||
| 33356 | + wlan_ie_supp_rates_t rates; | ||
| 33357 | +} WLAN_PACKED probereq_frame_body_t; | ||
| 33358 | + | ||
| 33359 | +typedef struct proberesp_frame_body { | ||
| 33360 | + u8 timestamp[8]; | ||
| 33361 | + u16 beacon_int; | ||
| 33362 | + u16 cap_info; | ||
| 33363 | + wlan_ie_ssid_t ssid; | ||
| 33364 | +/* access to these is disabled since ssid_t is variable length: */ | ||
| 33365 | + /* wlan_ie_supp_rates_t rates; */ | ||
| 33366 | + /* fhps_t fhps; */ | ||
| 33367 | + /* dsps_t dsps; */ | ||
| 33368 | + /* cfps_t cfps; */ | ||
| 33369 | +} WLAN_PACKED proberesp_frame_body_t; | ||
| 33370 | + | ||
| 33371 | + | ||
| 33372 | +/*********************************************************************** | ||
| 33373 | +** Functions | ||
| 33374 | +*/ | ||
| 33375 | + | ||
| 33376 | +/* Helpers for parsing mgmt frames */ | ||
| 33377 | +void wlan_mgmt_decode_ibssatim(wlan_fr_ibssatim_t *f); | ||
| 33378 | +void wlan_mgmt_decode_assocreq(wlan_fr_assocreq_t *f); | ||
| 33379 | +void wlan_mgmt_decode_assocresp(wlan_fr_assocresp_t *f); | ||
| 33380 | +void wlan_mgmt_decode_authen(wlan_fr_authen_t *f); | ||
| 33381 | +void wlan_mgmt_decode_beacon(wlan_fr_beacon_t *f); | ||
| 33382 | +void wlan_mgmt_decode_deauthen(wlan_fr_deauthen_t *f); | ||
| 33383 | +void wlan_mgmt_decode_disassoc(wlan_fr_disassoc_t *f); | ||
| 33384 | +void wlan_mgmt_decode_probereq(wlan_fr_probereq_t *f); | ||
| 33385 | +void wlan_mgmt_decode_proberesp(wlan_fr_proberesp_t *f); | ||
| 33386 | +void wlan_mgmt_decode_reassocreq(wlan_fr_reassocreq_t *f); | ||
| 33387 | +void wlan_mgmt_decode_reassocresp(wlan_fr_reassocresp_t *f); | ||
| 33388 | + | ||
| 33389 | +/* Helpers for building mgmt frames */ | ||
| 33390 | +static inline u8* | ||
| 33391 | +wlan_fill_ie_ssid(u8 *p, int len, const char *ssid) | ||
| 33392 | +{ | ||
| 33393 | + struct wlan_ie_ssid *ie = (void*)p; | ||
| 33394 | + ie->eid = WLAN_EID_SSID; | ||
| 33395 | + ie->len = len; | ||
| 33396 | + memcpy(ie->ssid, ssid, len); | ||
| 33397 | + return p + len + 2; | ||
| 33398 | +} | ||
| 33399 | +/* This controls whether we create 802.11g 'ext supported rates' IEs | ||
| 33400 | +** or just create overlong 'supported rates' IEs instead | ||
| 33401 | +** (non-11g compliant) */ | ||
| 33402 | +#define WE_OBEY_802_11G 1 | ||
| 33403 | +static inline u8* | ||
| 33404 | +wlan_fill_ie_rates(u8 *p, int len, const u8 *rates) | ||
| 33405 | +{ | ||
| 33406 | + struct wlan_ie_supp_rates *ie = (void*)p; | ||
| 33407 | +#if WE_OBEY_802_11G | ||
| 33408 | + if (len > 8 ) len = 8; | ||
| 33409 | +#endif | ||
| 33410 | + /* supported rates (1 to 8 octets) */ | ||
| 33411 | + ie->eid = WLAN_EID_SUPP_RATES; | ||
| 33412 | + ie->len = len; | ||
| 33413 | + memcpy(ie->rates, rates, len); | ||
| 33414 | + return p + len + 2; | ||
| 33415 | +} | ||
| 33416 | +/* This one wouldn't create an IE at all if not needed */ | ||
| 33417 | +static inline u8* | ||
| 33418 | +wlan_fill_ie_rates_ext(u8 *p, int len, const u8 *rates) | ||
| 33419 | +{ | ||
| 33420 | + struct wlan_ie_supp_rates *ie = (void*)p; | ||
| 33421 | +#if !WE_OBEY_802_11G | ||
| 33422 | + return p; | ||
| 33423 | +#endif | ||
| 33424 | + len -= 8; | ||
| 33425 | + if (len <= 0) return p; | ||
| 33426 | + /* ext supported rates */ | ||
| 33427 | + ie->eid = WLAN_EID_EXT_RATES; | ||
| 33428 | + ie->len = len; | ||
| 33429 | + memcpy(ie->rates, rates+8, len); | ||
| 33430 | + return p + len + 2; | ||
| 33431 | +} | ||
| 33432 | +static inline u8* | ||
| 33433 | +wlan_fill_ie_ds_parms(u8 *p, int channel) | ||
| 33434 | +{ | ||
| 33435 | + struct wlan_ie_ds_parms *ie = (void*)p; | ||
| 33436 | + ie->eid = WLAN_EID_DS_PARMS; | ||
| 33437 | + ie->len = 1; | ||
| 33438 | + ie->curr_ch = channel; | ||
| 33439 | + return p + sizeof(*ie); | ||
| 33440 | +} | ||
| 33441 | +static inline u8* | ||
| 33442 | +wlan_fill_ie_ibss_parms(u8 *p, int atim_win) | ||
| 33443 | +{ | ||
| 33444 | + struct wlan_ie_ibss_parms *ie = (void*)p; | ||
| 33445 | + ie->eid = WLAN_EID_IBSS_PARMS; | ||
| 33446 | + ie->len = 2; | ||
| 33447 | + ie->atim_win = atim_win; | ||
| 33448 | + return p + sizeof(*ie); | ||
| 33449 | +} | ||
| 33450 | +static inline u8* | ||
| 33451 | +wlan_fill_ie_tim(u8 *p, int rem, int period, int bcast, | ||
| 33452 | + int ofs, int len, const u8 *vbm) | ||
| 33453 | +{ | ||
| 33454 | + struct wlan_ie_tim *ie = (void*)p; | ||
| 33455 | + ie->eid = WLAN_EID_TIM; | ||
| 33456 | + ie->len = len + 3; | ||
| 33457 | + ie->dtim_cnt = rem; | ||
| 33458 | + ie->dtim_period = period; | ||
| 33459 | + ie->bitmap_ctl = ofs | (bcast!=0); | ||
| 33460 | + if (vbm) | ||
| 33461 | + memcpy(ie->virt_bm, vbm, len); /* min 1 byte */ | ||
| 33462 | + else | ||
| 33463 | + ie->virt_bm[0] = 0; | ||
| 33464 | + return p + len + 3 + 2; | ||
| 33465 | +} | ||
| 33466 | Index: linux-2.6.23/drivers/net/wireless/Kconfig | ||
| 33467 | =================================================================== | ||
| 33468 | --- linux-2.6.23.orig/drivers/net/wireless/Kconfig 2008-01-20 21:13:17.000000000 +0000 | ||
| 33469 | +++ linux-2.6.23/drivers/net/wireless/Kconfig 2008-01-20 21:15:12.000000000 +0000 | ||
| 33470 | @@ -5,6 +5,36 @@ | ||
| 33471 | menu "Wireless LAN" | ||
| 33472 | depends on !S390 | ||
| 33473 | |||
| 33474 | +config NET_RADIO | ||
| 33475 | + bool "Wireless LAN drivers (non-hamradio) & Wireless Extensions" | ||
| 33476 | + select WIRELESS_EXT | ||
| 33477 | + ---help--- | ||
| 33478 | + Support for wireless LANs and everything having to do with radio, | ||
| 33479 | + but not with amateur radio or FM broadcasting. | ||
| 33480 | + | ||
| 33481 | + Saying Y here also enables the Wireless Extensions (creates | ||
| 33482 | + /proc/net/wireless and enables iwconfig access). The Wireless | ||
| 33483 | + Extension is a generic API allowing a driver to expose to the user | ||
| 33484 | + space configuration and statistics specific to common Wireless LANs. | ||
| 33485 | + The beauty of it is that a single set of tool can support all the | ||
| 33486 | + variations of Wireless LANs, regardless of their type (as long as | ||
| 33487 | + the driver supports Wireless Extension). Another advantage is that | ||
| 33488 | + these parameters may be changed on the fly without restarting the | ||
| 33489 | + driver (or Linux). If you wish to use Wireless Extensions with | ||
| 33490 | + wireless PCMCIA (PC-) cards, you need to say Y here; you can fetch | ||
| 33491 | + the tools from | ||
| 33492 | + <http://www.hpl.hp.com/personal/Jean_Tourrilhes/Linux/Tools.html>. | ||
| 33493 | + | ||
| 33494 | +config NET_WIRELESS_RTNETLINK | ||
| 33495 | + bool "Wireless Extension API over RtNetlink" | ||
| 33496 | + depends on NET_RADIO | ||
| 33497 | + ---help--- | ||
| 33498 | + Support the Wireless Extension API over the RtNetlink socket | ||
| 33499 | + in addition to the traditional ioctl interface (selected above). | ||
| 33500 | + | ||
| 33501 | + For now, few tools use this facility, but it might grow in the | ||
| 33502 | + future. The only downside is that it adds 4.5 kB to your kernel. | ||
| 33503 | + | ||
| 33504 | config WLAN_PRE80211 | ||
| 33505 | bool "Wireless LAN (pre-802.11)" | ||
| 33506 | depends on NETDEVICES | ||
| 33507 | @@ -650,6 +680,7 @@ config P54_PCI | ||
| 33508 | |||
| 33509 | source "drivers/net/wireless/iwlwifi/Kconfig" | ||
| 33510 | source "drivers/net/wireless/hostap/Kconfig" | ||
| 33511 | +source "drivers/net/wireless/acx/Kconfig" | ||
| 33512 | source "drivers/net/wireless/bcm43xx/Kconfig" | ||
| 33513 | source "drivers/net/wireless/b43/Kconfig" | ||
| 33514 | source "drivers/net/wireless/b43legacy/Kconfig" | ||
| 33515 | Index: linux-2.6.23/drivers/net/wireless/Makefile | ||
| 33516 | =================================================================== | ||
| 33517 | --- linux-2.6.23.orig/drivers/net/wireless/Makefile 2008-01-20 21:13:17.000000000 +0000 | ||
| 33518 | +++ linux-2.6.23/drivers/net/wireless/Makefile 2008-01-20 21:13:40.000000000 +0000 | ||
| 33519 | @@ -34,6 +34,8 @@ obj-$(CONFIG_PCMCIA_ATMEL) += atmel | ||
| 33520 | |||
| 33521 | obj-$(CONFIG_PRISM54) += prism54/ | ||
| 33522 | |||
| 33523 | +obj-$(CONFIG_ACX) += acx/ | ||
| 33524 | + | ||
| 33525 | obj-$(CONFIG_HOSTAP) += hostap/ | ||
| 33526 | obj-$(CONFIG_BCM43XX) += bcm43xx/ | ||
| 33527 | obj-$(CONFIG_B43) += b43/ | ||
diff --git a/meta/packages/linux/linux-rp-2.6.25+2.6.26-rc4/htcuni.patch b/meta/packages/linux/linux-rp-2.6.25+2.6.26-rc4/htcuni.patch new file mode 100644 index 0000000000..783f55b064 --- /dev/null +++ b/meta/packages/linux/linux-rp-2.6.25+2.6.26-rc4/htcuni.patch | |||
| @@ -0,0 +1,7899 @@ | |||
| 1 | --- | ||
| 2 | arch/arm/Kconfig | 2 | ||
| 3 | arch/arm/mach-pxa/Kconfig | 89 + | ||
| 4 | arch/arm/mach-pxa/Makefile | 1 | ||
| 5 | arch/arm/mach-pxa/generic.c | 13 | ||
| 6 | arch/arm/mach-pxa/htcuniversal/Makefile | 19 | ||
| 7 | arch/arm/mach-pxa/htcuniversal/htcuniversal.c | 468 +++++ | ||
| 8 | arch/arm/mach-pxa/htcuniversal/htcuniversal_ak4641.c | 917 +++++++++++ | ||
| 9 | arch/arm/mach-pxa/htcuniversal/htcuniversal_ak4641.h | 65 | ||
| 10 | arch/arm/mach-pxa/htcuniversal/htcuniversal_asic3_leds.c | 143 + | ||
| 11 | arch/arm/mach-pxa/htcuniversal/htcuniversal_bl.c | 61 | ||
| 12 | arch/arm/mach-pxa/htcuniversal/htcuniversal_bt.c | 135 + | ||
| 13 | arch/arm/mach-pxa/htcuniversal/htcuniversal_bt.h | 17 | ||
| 14 | arch/arm/mach-pxa/htcuniversal/htcuniversal_buttons.c | 87 + | ||
| 15 | arch/arm/mach-pxa/htcuniversal/htcuniversal_core.c | 226 ++ | ||
| 16 | arch/arm/mach-pxa/htcuniversal/htcuniversal_lcd.c | 212 ++ | ||
| 17 | arch/arm/mach-pxa/htcuniversal/htcuniversal_phone.c | 167 ++ | ||
| 18 | arch/arm/mach-pxa/htcuniversal/htcuniversal_phone.h | 16 | ||
| 19 | arch/arm/mach-pxa/htcuniversal/htcuniversal_pm.c | 69 | ||
| 20 | arch/arm/mach-pxa/htcuniversal/htcuniversal_power2.c | 97 + | ||
| 21 | arch/arm/mach-pxa/htcuniversal/htcuniversal_ts2.c | 490 ++++++ | ||
| 22 | arch/arm/mach-pxa/htcuniversal/htcuniversal_udc.c | 71 | ||
| 23 | arch/arm/mach-pxa/htcuniversal/tsc2046_ts.h | 20 | ||
| 24 | drivers/input/keyboard/Kconfig | 7 | ||
| 25 | drivers/input/keyboard/Makefile | 1 | ||
| 26 | drivers/input/keyboard/asic3_keys.c | 131 + | ||
| 27 | drivers/leds/Kconfig | 7 | ||
| 28 | drivers/leds/Makefile | 1 | ||
| 29 | drivers/leds/leds-asic3.c | 189 ++ | ||
| 30 | drivers/mfd/Kconfig | 10 | ||
| 31 | drivers/mfd/Makefile | 2 | ||
| 32 | drivers/mfd/asic3_base.c | 1208 +++++++++++++++ | ||
| 33 | drivers/mfd/soc-core.c | 106 + | ||
| 34 | drivers/mfd/soc-core.h | 30 | ||
| 35 | drivers/mmc/host/Kconfig | 6 | ||
| 36 | drivers/mmc/host/Makefile | 1 | ||
| 37 | drivers/mmc/host/asic3_mmc.c | 900 +++++++++++ | ||
| 38 | drivers/mmc/host/asic3_mmc.h | 25 | ||
| 39 | drivers/serial/pxa.c | 22 | ||
| 40 | include/asm-arm/arch-pxa/clock.h | 27 | ||
| 41 | include/asm-arm/arch-pxa/htcuniversal-asic.h | 213 ++ | ||
| 42 | include/asm-arm/arch-pxa/htcuniversal-gpio.h | 220 ++ | ||
| 43 | include/asm-arm/arch-pxa/htcuniversal-init.h | 14 | ||
| 44 | include/asm-arm/arch-pxa/htcuniversal.h | 3 | ||
| 45 | include/asm-arm/arch-pxa/irqs.h | 2 | ||
| 46 | include/asm-arm/arch-pxa/pxa-pm_ll.h | 6 | ||
| 47 | include/asm-arm/arch-pxa/pxa-regs.h | 2 | ||
| 48 | include/asm-arm/arch-pxa/serial.h | 78 | ||
| 49 | include/asm-arm/hardware/asic3_keys.h | 18 | ||
| 50 | include/asm-arm/hardware/asic3_leds.h | 34 | ||
| 51 | include/asm-arm/hardware/ipaq-asic3.h | 602 +++++++ | ||
| 52 | include/linux/backlight.h | 7 | ||
| 53 | include/linux/gpiodev.h | 44 | ||
| 54 | include/linux/input_pda.h | 47 | ||
| 55 | include/linux/ioport.h | 1 | ||
| 56 | include/linux/soc/asic3_base.h | 104 + | ||
| 57 | include/linux/soc/tmio_mmc.h | 17 | ||
| 58 | 56 files changed, 7469 insertions(+), 1 deletion(-) | ||
| 59 | |||
| 60 | Index: linux-2.6.26-rc4/arch/arm/mach-pxa/htcuniversal/Makefile | ||
| 61 | =================================================================== | ||
| 62 | --- /dev/null 1970-01-01 00:00:00.000000000 +0000 | ||
| 63 | +++ linux-2.6.26-rc4/arch/arm/mach-pxa/htcuniversal/Makefile 2008-06-01 18:49:45.000000000 +0100 | ||
| 64 | @@ -0,0 +1,19 @@ | ||
| 65 | +# | ||
| 66 | +# Makefile for HTC Universal | ||
| 67 | +# | ||
| 68 | + | ||
| 69 | +snd-htcuniversal-ak4641-objs := htcuniversal_ak4641.o | ||
| 70 | + | ||
| 71 | +obj-$(CONFIG_MACH_HTCUNIVERSAL) += htcuniversal.o | ||
| 72 | +obj-$(CONFIG_HTCUNIVERSAL_CORE) += htcuniversal_core.o | ||
| 73 | +obj-$(CONFIG_HTCUNIVERSAL_POWER) += htcuniversal_power2.o | ||
| 74 | +obj-$(CONFIG_HTCUNIVERSAL_LCD) += htcuniversal_lcd.o | ||
| 75 | +obj-$(CONFIG_HTCUNIVERSAL_BACKLIGHT) += htcuniversal_bl.o | ||
| 76 | +obj-$(CONFIG_HTCUNIVERSAL_TS2) += htcuniversal_ts2.o | ||
| 77 | +obj-$(CONFIG_HTCUNIVERSAL_BUTTONS) += htcuniversal_buttons.o | ||
| 78 | +obj-$(CONFIG_HTCUNIVERSAL_BLUETOOTH) += htcuniversal_bt.o | ||
| 79 | +obj-$(CONFIG_HTCUNIVERSAL_PHONE) += htcuniversal_phone.o | ||
| 80 | +obj-$(CONFIG_HTCUNIVERSAL_ASIC3_LEDS) += htcuniversal_asic3_leds.o | ||
| 81 | +obj-$(CONFIG_HTCUNIVERSAL_UDC) += htcuniversal_udc.o | ||
| 82 | + | ||
| 83 | +obj-$(CONFIG_HTCUNIVERSAL_AK4641) += htcuniversal_ak4641.o | ||
| 84 | Index: linux-2.6.26-rc4/arch/arm/mach-pxa/htcuniversal/htcuniversal.c | ||
| 85 | =================================================================== | ||
| 86 | --- /dev/null 1970-01-01 00:00:00.000000000 +0000 | ||
| 87 | +++ linux-2.6.26-rc4/arch/arm/mach-pxa/htcuniversal/htcuniversal.c 2008-06-01 18:49:45.000000000 +0100 | ||
| 88 | @@ -0,0 +1,468 @@ | ||
| 89 | +/* | ||
| 90 | + * Hardware definitions for HTC Universal | ||
| 91 | + * | ||
| 92 | + * Copyright (c) 2006 Oleg Gusev | ||
| 93 | + * | ||
| 94 | + * Use consistent with the GNU GPL is permitted, | ||
| 95 | + * provided that this copyright notice is | ||
| 96 | + * preserved in its entirety in all copies and derived works. | ||
| 97 | + * | ||
| 98 | + */ | ||
| 99 | + | ||
| 100 | +#include <linux/kernel.h> | ||
| 101 | +#include <linux/init.h> | ||
| 102 | +#include <linux/platform_device.h> | ||
| 103 | +#include <linux/irq.h> | ||
| 104 | +#include <linux/input.h> | ||
| 105 | +#include <linux/gpio_keys.h> | ||
| 106 | +#include <linux/soc/asic3_base.h> | ||
| 107 | + | ||
| 108 | +#include <asm/mach-types.h> | ||
| 109 | +#include <asm/hardware.h> | ||
| 110 | +#include <asm/setup.h> | ||
| 111 | + | ||
| 112 | +#include <asm/mach/irq.h> | ||
| 113 | +#include <asm/mach/arch.h> | ||
| 114 | + | ||
| 115 | +#include <asm/arch/bitfield.h> | ||
| 116 | +#include <asm/arch/pxa-regs.h> | ||
| 117 | +#include <asm/arch/serial.h> | ||
| 118 | +#include <asm/arch/pxa27x_keyboard.h> | ||
| 119 | +#include <asm/arch/pxafb.h> | ||
| 120 | +#include <asm/arch/irda.h> | ||
| 121 | +#include <asm/arch/ohci.h> | ||
| 122 | + | ||
| 123 | +#include <asm/arch/htcuniversal.h> | ||
| 124 | +#include <asm/arch/htcuniversal-gpio.h> | ||
| 125 | +#include <asm/arch/htcuniversal-init.h> | ||
| 126 | +#include <asm/arch/htcuniversal-asic.h> | ||
| 127 | + | ||
| 128 | +#include <asm/hardware/ipaq-asic3.h> | ||
| 129 | + | ||
| 130 | +#include "../generic.h" | ||
| 131 | + | ||
| 132 | +#include "htcuniversal_bt.h" | ||
| 133 | +#include "htcuniversal_phone.h" | ||
| 134 | +#include "tsc2046_ts.h" | ||
| 135 | + | ||
| 136 | +/* | ||
| 137 | + * IRDA | ||
| 138 | + */ | ||
| 139 | + | ||
| 140 | +static void htcuniversal_irda_transceiver_mode(struct device *dev, int mode) | ||
| 141 | +{ | ||
| 142 | + /* */ | ||
| 143 | +} | ||
| 144 | + | ||
| 145 | +static struct pxaficp_platform_data htcuniversal_ficp_platform_data = { | ||
| 146 | + .transceiver_cap = IR_SIRMODE | IR_FIRMODE, | ||
| 147 | + .transceiver_mode = htcuniversal_irda_transceiver_mode, | ||
| 148 | +}; | ||
| 149 | + | ||
| 150 | +/* | ||
| 151 | + * Bluetooth - Relies on other loadable modules, like ASIC3 and Core, | ||
| 152 | + * so make the calls indirectly through pointers. Requires that the | ||
| 153 | + * htcuniversal_bt module be loaded before any attempt to use | ||
| 154 | + * bluetooth (obviously). | ||
| 155 | + */ | ||
| 156 | + | ||
| 157 | +static struct htcuniversal_bt_funcs bt_funcs; | ||
| 158 | + | ||
| 159 | +static void | ||
| 160 | +htcuniversal_bt_configure( int state ) | ||
| 161 | +{ | ||
| 162 | + if (bt_funcs.configure != NULL) | ||
| 163 | + bt_funcs.configure( state ); | ||
| 164 | +} | ||
| 165 | + | ||
| 166 | +static struct htcuniversal_phone_funcs phone_funcs; | ||
| 167 | + | ||
| 168 | +static void | ||
| 169 | +htcuniversal_phone_configure( int state ) | ||
| 170 | +{ | ||
| 171 | + if (phone_funcs.configure != NULL) | ||
| 172 | + phone_funcs.configure( state ); | ||
| 173 | +} | ||
| 174 | + | ||
| 175 | +//void htcuniversal_ll_pm_init(void); | ||
| 176 | + | ||
| 177 | +extern struct platform_device htcuniversal_bl; | ||
| 178 | +static struct platform_device htcuniversal_lcd = { .name = "htcuniversal_lcd", }; | ||
| 179 | +//static struct platform_device htcuniversal_kbd = { .name = "htcuniversal_kbd", }; | ||
| 180 | +static struct platform_device htcuniversal_buttons = { .name = "htcuniversal_buttons", }; | ||
| 181 | +//static struct platform_device htcuniversal_ts = { .name = "htcuniversal_ts", }; | ||
| 182 | +//static struct platform_device htcuniversal_bt = { .name = "htcuniversal_bt", }; | ||
| 183 | +//static struct platform_device htcuniversal_phone = { .name = "htcuniversal_phone", }; | ||
| 184 | +static struct platform_device htcuniversal_power = { .name = "htcuniversal_power", }; | ||
| 185 | +static struct platform_device htcuniversal_udc = { .name = "htcuniversal_udc", }; | ||
| 186 | + | ||
| 187 | +static struct tsc2046_mach_info htcuniversal_ts_platform_data = { | ||
| 188 | + .port = 1, | ||
| 189 | + .clock = CKEN_SSP1, | ||
| 190 | + .pwrbit_X = 1, | ||
| 191 | + .pwrbit_Y = 1, | ||
| 192 | + .irq = 0 /* asic3 irq */ | ||
| 193 | +}; | ||
| 194 | + | ||
| 195 | +static struct platform_device htcuniversal_ts = { | ||
| 196 | + .name = "htcuniversal_ts", | ||
| 197 | + .dev = { | ||
| 198 | + .platform_data = &htcuniversal_ts_platform_data, | ||
| 199 | + }, | ||
| 200 | +}; | ||
| 201 | + | ||
| 202 | + | ||
| 203 | +/* Bluetooth */ | ||
| 204 | + | ||
| 205 | +static struct platform_device htcuniversal_bt = { | ||
| 206 | + .name = "htcuniversal_bt", | ||
| 207 | + .id = -1, | ||
| 208 | + .dev = { | ||
| 209 | + .platform_data = &bt_funcs, | ||
| 210 | + }, | ||
| 211 | +}; | ||
| 212 | + | ||
| 213 | +static struct platform_device htcuniversal_phone = { | ||
| 214 | + .name = "htcuniversal_phone", | ||
| 215 | + .id = -1, | ||
| 216 | + .dev = { | ||
| 217 | + .platform_data = &phone_funcs, | ||
| 218 | + }, | ||
| 219 | +}; | ||
| 220 | + | ||
| 221 | +/* PXA2xx Keys */ | ||
| 222 | + | ||
| 223 | +static struct gpio_keys_button htcuniversal_button_table[] = { | ||
| 224 | + { KEY_POWER, GPIO_NR_HTCUNIVERSAL_KEY_ON_N, 1 }, | ||
| 225 | +}; | ||
| 226 | + | ||
| 227 | +static struct gpio_keys_platform_data htcuniversal_pxa_keys_data = { | ||
| 228 | + .buttons = htcuniversal_button_table, | ||
| 229 | + .nbuttons = ARRAY_SIZE(htcuniversal_button_table), | ||
| 230 | +}; | ||
| 231 | + | ||
| 232 | +static struct platform_device htcuniversal_pxa_keys = { | ||
| 233 | + .name = "gpio-keys", | ||
| 234 | + .dev = { | ||
| 235 | + .platform_data = &htcuniversal_pxa_keys_data, | ||
| 236 | + }, | ||
| 237 | + .id = -1, | ||
| 238 | +}; | ||
| 239 | + | ||
| 240 | +/**************************************************************** | ||
| 241 | + * Keyboard | ||
| 242 | + ****************************************************************/ | ||
| 243 | + | ||
| 244 | +static struct pxa27x_keyboard_platform_data htcuniversal_kbd = { | ||
| 245 | + .nr_rows = 8, | ||
| 246 | + .nr_cols = 8, | ||
| 247 | + .keycodes = { | ||
| 248 | + { | ||
| 249 | + /* row 0 */ | ||
| 250 | + KEY_ENTER, | ||
| 251 | + KEY_MINUS, | ||
| 252 | + KEY_ESC, | ||
| 253 | + KEY_1, | ||
| 254 | + KEY_TAB, | ||
| 255 | + KEY_CAPSLOCK, | ||
| 256 | + KEY_LEFTSHIFT, | ||
| 257 | + KEY_RIGHTALT, /* Fn */ | ||
| 258 | + }, { /* row 1 */ | ||
| 259 | + KEY_COMMA, | ||
| 260 | + KEY_EQUAL, | ||
| 261 | + KEY_F1, | ||
| 262 | + KEY_2, | ||
| 263 | + KEY_Q, | ||
| 264 | + KEY_A, | ||
| 265 | + KEY_Z, | ||
| 266 | + KEY_LEFTCTRL, | ||
| 267 | + }, { /* row 2 */ | ||
| 268 | + KEY_UP, | ||
| 269 | + KEY_I, | ||
| 270 | + KEY_F2, | ||
| 271 | + KEY_3, | ||
| 272 | + KEY_W, | ||
| 273 | + KEY_S, | ||
| 274 | + KEY_X, | ||
| 275 | + KEY_F6, | ||
| 276 | + }, { /* row 3 */ | ||
| 277 | + KEY_DOT, | ||
| 278 | + KEY_O, | ||
| 279 | + KEY_F3, | ||
| 280 | + KEY_4, | ||
| 281 | + KEY_E, | ||
| 282 | + KEY_D, | ||
| 283 | + KEY_C, | ||
| 284 | + KEY_LEFTALT, | ||
| 285 | + }, { /* row 4 */ | ||
| 286 | + KEY_F9, | ||
| 287 | + KEY_P, | ||
| 288 | + KEY_F4, | ||
| 289 | + KEY_5, | ||
| 290 | + KEY_R, | ||
| 291 | + KEY_F, | ||
| 292 | + KEY_V, | ||
| 293 | + KEY_SPACE, | ||
| 294 | + }, { /* row 5 */ | ||
| 295 | + KEY_RIGHT, | ||
| 296 | + KEY_BACKSPACE, | ||
| 297 | + KEY_F5, | ||
| 298 | + KEY_6, | ||
| 299 | + KEY_T, | ||
| 300 | + KEY_G, | ||
| 301 | + KEY_B, | ||
| 302 | + KEY_F7, | ||
| 303 | + }, { /* row 6 */ | ||
| 304 | + KEY_F9, | ||
| 305 | + KEY_K, | ||
| 306 | + KEY_9, | ||
| 307 | + KEY_7, | ||
| 308 | + KEY_Y, | ||
| 309 | + KEY_H, | ||
| 310 | + KEY_N, | ||
| 311 | + KEY_LEFT, | ||
| 312 | + }, { /* row 7 */ | ||
| 313 | + KEY_F10, | ||
| 314 | + KEY_L, | ||
| 315 | + KEY_0, | ||
| 316 | + KEY_8, | ||
| 317 | + KEY_U, | ||
| 318 | + KEY_J, | ||
| 319 | + KEY_M, | ||
| 320 | + KEY_DOWN, | ||
| 321 | + }, | ||
| 322 | + }, | ||
| 323 | + .gpio_modes = { | ||
| 324 | + GPIO_NR_HTCUNIVERSAL_KP_MKIN0_MD, | ||
| 325 | + GPIO_NR_HTCUNIVERSAL_KP_MKIN1_MD, | ||
| 326 | + GPIO_NR_HTCUNIVERSAL_KP_MKIN2_MD, | ||
| 327 | + GPIO_NR_HTCUNIVERSAL_KP_MKIN3_MD, | ||
| 328 | + GPIO_NR_HTCUNIVERSAL_KP_MKIN4_MD, | ||
| 329 | + GPIO_NR_HTCUNIVERSAL_KP_MKIN5_MD, | ||
| 330 | + GPIO_NR_HTCUNIVERSAL_KP_MKIN6_MD, | ||
| 331 | + GPIO_NR_HTCUNIVERSAL_KP_MKIN7_MD, | ||
| 332 | + GPIO_NR_HTCUNIVERSAL_KP_MKOUT0_MD, | ||
| 333 | + GPIO_NR_HTCUNIVERSAL_KP_MKOUT1_MD, | ||
| 334 | + GPIO_NR_HTCUNIVERSAL_KP_MKOUT2_MD, | ||
| 335 | + GPIO_NR_HTCUNIVERSAL_KP_MKOUT3_MD, | ||
| 336 | + GPIO_NR_HTCUNIVERSAL_KP_MKOUT4_MD, | ||
| 337 | + GPIO_NR_HTCUNIVERSAL_KP_MKOUT5_MD, | ||
| 338 | + GPIO_NR_HTCUNIVERSAL_KP_MKOUT6_MD, | ||
| 339 | + GPIO_NR_HTCUNIVERSAL_KP_MKOUT7_MD, | ||
| 340 | + }, | ||
| 341 | +}; | ||
| 342 | + | ||
| 343 | +static struct platform_device htcuniversal_pxa_keyboard = { | ||
| 344 | + .name = "pxa27x-keyboard", | ||
| 345 | + .id = -1, | ||
| 346 | + .dev = { | ||
| 347 | + .platform_data = &htcuniversal_kbd, | ||
| 348 | + }, | ||
| 349 | +}; | ||
| 350 | +/* Core Hardware Functions */ | ||
| 351 | + | ||
| 352 | +struct platform_device htcuniversal_core = { | ||
| 353 | + .name = "htcuniversal_core", | ||
| 354 | + .id = 0, | ||
| 355 | + .dev = { | ||
| 356 | + .platform_data = NULL, | ||
| 357 | + }, | ||
| 358 | +}; | ||
| 359 | + | ||
| 360 | +static struct platform_device *devices[] __initdata = { | ||
| 361 | + &htcuniversal_core, | ||
| 362 | +// &htcuniversal_flash, | ||
| 363 | + &htcuniversal_pxa_keyboard, | ||
| 364 | + &htcuniversal_pxa_keys, | ||
| 365 | +}; | ||
| 366 | + | ||
| 367 | +static struct platform_device *htcuniversal_asic3_devices[] __initdata = { | ||
| 368 | + &htcuniversal_lcd, | ||
| 369 | +#ifdef CONFIG_HTCUNIVERSAL_BACKLIGHT | ||
| 370 | + &htcuniversal_bl, | ||
| 371 | +#endif | ||
| 372 | + &htcuniversal_buttons, | ||
| 373 | + &htcuniversal_ts, | ||
| 374 | + &htcuniversal_bt, | ||
| 375 | + &htcuniversal_phone, | ||
| 376 | + &htcuniversal_power, | ||
| 377 | + &htcuniversal_udc, | ||
| 378 | +}; | ||
| 379 | + | ||
| 380 | +static struct asic3_platform_data htcuniversal_asic3_platform_data = { | ||
| 381 | + | ||
| 382 | + /* Setting ASIC3 GPIO registers to the below initialization states | ||
| 383 | + * HTC Universal asic3 information: | ||
| 384 | + * http://wiki.xda-developers.com/index.php?pagename=UniversalASIC3 | ||
| 385 | + * http://wiki.xda-developers.com/index.php?pagename=ASIC3 | ||
| 386 | + * | ||
| 387 | + * dir: Direction of the GPIO pin. 0: input, 1: output. | ||
| 388 | + * If unknown, set as output to avoid power consuming floating input nodes | ||
| 389 | + * init: Initial state of the GPIO bits | ||
| 390 | + * | ||
| 391 | + * These registers are configured as they are on Wince. | ||
| 392 | + */ | ||
| 393 | + .gpio_a = { | ||
| 394 | + .dir = (1<<GPIOA_LCD_PWR5_ON) | | ||
| 395 | + (1<<GPIOA_FLASHLIGHT) | | ||
| 396 | + (1<<GPIOA_UNKNOWN9) | | ||
| 397 | + (1<<GPIOA_SPK_PWR2_ON) | | ||
| 398 | + (1<<GPIOA_UNKNOWN4) | | ||
| 399 | + (1<<GPIOA_EARPHONE_PWR_ON)| | ||
| 400 | + (1<<GPIOA_AUDIO_PWR_ON) | | ||
| 401 | + (1<<GPIOA_SPK_PWR1_ON) | | ||
| 402 | + (1<<GPIOA_I2C_EN), | ||
| 403 | + .init = (1<<GPIOA_LCD_PWR5_ON) | | ||
| 404 | + (1<<GPIOA_I2C_EN), | ||
| 405 | + .sleep_out = 0x0000, | ||
| 406 | + .batt_fault_out = 0x0000, | ||
| 407 | + .alt_function = 0x0000, | ||
| 408 | + .sleep_conf = 0x000c, | ||
| 409 | + }, | ||
| 410 | + .gpio_b = { | ||
| 411 | + .dir = 0xc142, | ||
| 412 | + .init = 0x8842, // TODO: 0x0900 | ||
| 413 | + .sleep_out = 0x0000, | ||
| 414 | + .batt_fault_out = 0x0000, | ||
| 415 | + .alt_function = 0x0000, | ||
| 416 | + .sleep_conf = 0x000c, | ||
| 417 | + }, | ||
| 418 | + .gpio_c = { | ||
| 419 | + .dir = 0xc7e7, | ||
| 420 | + .init = 0xc6e0, // TODO: 0x8000 | ||
| 421 | + .sleep_out = 0x0000, | ||
| 422 | + .batt_fault_out = 0x0000, | ||
| 423 | + .alt_function = 0x0007, // GPIOC_LED_RED | GPIOC_LED_GREEN | GPIOC_LED_BLUE | ||
| 424 | + .sleep_conf = 0x000c, | ||
| 425 | + }, | ||
| 426 | + .gpio_d = { | ||
| 427 | + .dir = 0xffc0, | ||
| 428 | + .init = 0x7840, // TODO: 0x0000 | ||
| 429 | + .sleep_out = 0x0000, | ||
| 430 | + .batt_fault_out = 0x0000, | ||
| 431 | + .alt_function = 0x0000, | ||
| 432 | + .sleep_conf = 0x0008, | ||
| 433 | + }, | ||
| 434 | + .bus_shift = 1, | ||
| 435 | + .irq_base = HTCUNIVERSAL_ASIC3_IRQ_BASE, | ||
| 436 | + | ||
| 437 | + .child_platform_devs = htcuniversal_asic3_devices, | ||
| 438 | + .num_child_platform_devs = ARRAY_SIZE(htcuniversal_asic3_devices), | ||
| 439 | +}; | ||
| 440 | + | ||
| 441 | +static struct resource htcuniversal_asic3_resources[] = { | ||
| 442 | + [0] = { | ||
| 443 | + .start = HTCUNIVERSAL_ASIC3_GPIO_PHYS, | ||
| 444 | + .end = HTCUNIVERSAL_ASIC3_GPIO_PHYS + IPAQ_ASIC3_MAP_SIZE, | ||
| 445 | + .flags = IORESOURCE_MEM, | ||
| 446 | + }, | ||
| 447 | + [1] = { | ||
| 448 | + .start = HTCUNIVERSAL_IRQ(ASIC3_EXT_INT), | ||
| 449 | + .end = HTCUNIVERSAL_IRQ(ASIC3_EXT_INT), | ||
| 450 | + .flags = IORESOURCE_IRQ, | ||
| 451 | + }, | ||
| 452 | + [2] = { | ||
| 453 | + .start = HTCUNIVERSAL_ASIC3_MMC_PHYS, | ||
| 454 | + .end = HTCUNIVERSAL_ASIC3_MMC_PHYS + IPAQ_ASIC3_MAP_SIZE, | ||
| 455 | + .flags = IORESOURCE_MEM, | ||
| 456 | + }, | ||
| 457 | + [3] = { | ||
| 458 | + .start = HTCUNIVERSAL_IRQ(ASIC3_SDIO_INT_N), | ||
| 459 | + .flags = IORESOURCE_IRQ, | ||
| 460 | + }, | ||
| 461 | +}; | ||
| 462 | + | ||
| 463 | +struct platform_device htcuniversal_asic3 = { | ||
| 464 | + .name = "asic3", | ||
| 465 | + .id = 0, | ||
| 466 | + .num_resources = ARRAY_SIZE(htcuniversal_asic3_resources), | ||
| 467 | + .resource = htcuniversal_asic3_resources, | ||
| 468 | + .dev = { .platform_data = &htcuniversal_asic3_platform_data, }, | ||
| 469 | +}; | ||
| 470 | +EXPORT_SYMBOL(htcuniversal_asic3); | ||
| 471 | + | ||
| 472 | +static struct pxafb_mode_info htcuniversal_lcd_modes[] = { | ||
| 473 | +{ | ||
| 474 | + .pixclock = 96153, | ||
| 475 | + .xres = 480, | ||
| 476 | + .yres = 640, | ||
| 477 | + .bpp = 16, | ||
| 478 | + .hsync_len = 4, | ||
| 479 | + .vsync_len = 1, | ||
| 480 | + .left_margin = 20, | ||
| 481 | + .right_margin = 8, | ||
| 482 | + .upper_margin = 7, | ||
| 483 | + .lower_margin = 8, | ||
| 484 | + | ||
| 485 | +// .sync = FB_SYNC_HOR_LOW_ACT|FB_SYNC_VERT_LOW_ACT, | ||
| 486 | + | ||
| 487 | +}, | ||
| 488 | +}; | ||
| 489 | + | ||
| 490 | +static struct pxafb_mach_info sony_acx526akm = { | ||
| 491 | + .modes = htcuniversal_lcd_modes, | ||
| 492 | + .num_modes = ARRAY_SIZE(htcuniversal_lcd_modes), | ||
| 493 | + | ||
| 494 | + /* fixme: use constants defined in pxafb.h */ | ||
| 495 | + .lccr0 = 0x00000080, | ||
| 496 | + .lccr3 = 0x00400000, | ||
| 497 | +// .lccr4 = 0x80000000, | ||
| 498 | +}; | ||
| 499 | + | ||
| 500 | +static void __init htcuniversal_init_irq(void) | ||
| 501 | +{ | ||
| 502 | + pxa27x_init_irq(); | ||
| 503 | +} | ||
| 504 | + | ||
| 505 | +static struct platform_pxa_serial_funcs htcuniversal_pxa_bt_funcs = { | ||
| 506 | + .configure = htcuniversal_bt_configure, | ||
| 507 | +}; | ||
| 508 | +static struct platform_pxa_serial_funcs htcuniversal_pxa_phone_funcs = { | ||
| 509 | + .configure = htcuniversal_phone_configure, | ||
| 510 | +}; | ||
| 511 | + | ||
| 512 | +/* USB OHCI */ | ||
| 513 | + | ||
| 514 | +static int htcuniversal_ohci_init(struct device *dev) | ||
| 515 | +{ | ||
| 516 | + /* missing GPIO setup here */ | ||
| 517 | + | ||
| 518 | + /* got the value from wince */ | ||
| 519 | + UHCHR=UHCHR_CGR; | ||
| 520 | + | ||
| 521 | + return 0; | ||
| 522 | +} | ||
| 523 | + | ||
| 524 | +static struct pxaohci_platform_data htcuniversal_ohci_platform_data = { | ||
| 525 | + .port_mode = PMM_PERPORT_MODE, | ||
| 526 | + .init = htcuniversal_ohci_init, | ||
| 527 | +}; | ||
| 528 | + | ||
| 529 | +static void __init htcuniversal_map_io(void) | ||
| 530 | +{ | ||
| 531 | + pxa_map_io(); | ||
| 532 | + | ||
| 533 | + pxa_set_btuart_info(&htcuniversal_pxa_bt_funcs); | ||
| 534 | + pxa_set_ffuart_info(&htcuniversal_pxa_phone_funcs); | ||
| 535 | +} | ||
| 536 | + | ||
| 537 | +static void __init htcuniversal_init(void) | ||
| 538 | +{ | ||
| 539 | + set_pxa_fb_info(&sony_acx526akm); | ||
| 540 | + | ||
| 541 | + platform_device_register(&htcuniversal_asic3); | ||
| 542 | + platform_add_devices(devices, ARRAY_SIZE(devices) ); | ||
| 543 | + pxa_set_ficp_info(&htcuniversal_ficp_platform_data); | ||
| 544 | + pxa_set_ohci_info(&htcuniversal_ohci_platform_data); | ||
| 545 | +} | ||
| 546 | + | ||
| 547 | +MACHINE_START(HTCUNIVERSAL, "HTC Universal") | ||
| 548 | + /* Maintainer xanadux.org */ | ||
| 549 | + .phys_io = 0x40000000, | ||
| 550 | + .io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc, | ||
| 551 | + .boot_params = 0xa0000100, | ||
| 552 | + .map_io = htcuniversal_map_io, | ||
| 553 | + .init_irq = htcuniversal_init_irq, | ||
| 554 | + .init_machine = htcuniversal_init, | ||
| 555 | + .timer = &pxa_timer, | ||
| 556 | +MACHINE_END | ||
| 557 | Index: linux-2.6.26-rc4/arch/arm/mach-pxa/htcuniversal/htcuniversal_ak4641.c | ||
| 558 | =================================================================== | ||
| 559 | --- /dev/null 1970-01-01 00:00:00.000000000 +0000 | ||
| 560 | +++ linux-2.6.26-rc4/arch/arm/mach-pxa/htcuniversal/htcuniversal_ak4641.c 2008-06-01 18:49:45.000000000 +0100 | ||
| 561 | @@ -0,0 +1,917 @@ | ||
| 562 | +/* | ||
| 563 | + * Audio support for codec Asahi Kasei AK4641 | ||
| 564 | + * | ||
| 565 | + * This program is free software; you can redistribute it and/or modify | ||
| 566 | + * it under the terms of the GNU General Public License version 2 as | ||
| 567 | + * published by the Free Software Foundation. | ||
| 568 | + * | ||
| 569 | + * Copyright (c) 2006 Giorgio Padrin <giorgio@mandarinlogiq.org> | ||
| 570 | + * | ||
| 571 | + * History: | ||
| 572 | + * | ||
| 573 | + * 2006-03 Written -- Giorgio Padrin | ||
| 574 | + * 2006-09 Test and debug on machine (HP hx4700) -- Elshin Roman <roxmail@list.ru> | ||
| 575 | + * | ||
| 576 | + * AK4641 codec device driver | ||
| 577 | + * | ||
| 578 | + * Copyright (c) 2005 SDG Systems, LLC | ||
| 579 | + * | ||
| 580 | + * Based on code: | ||
| 581 | + * Copyright (c) 2002 Hewlett-Packard Company | ||
| 582 | + * Copyright (c) 2000 Nicolas Pitre <nico@cam.org> | ||
| 583 | + * Copyright (c) 2000 Lernout & Hauspie Speech Products, N.V. | ||
| 584 | + * | ||
| 585 | + * This program is free software; you can redistribute it and/or | ||
| 586 | + * modify it under the terms of the GNU General Public License. | ||
| 587 | + */ | ||
| 588 | + | ||
| 589 | +#include <sound/driver.h> | ||
| 590 | + | ||
| 591 | +#include <linux/module.h> | ||
| 592 | +#include <linux/init.h> | ||
| 593 | +#include <linux/types.h> | ||
| 594 | +#include <linux/string.h> | ||
| 595 | +#include <linux/slab.h> | ||
| 596 | +#include <linux/errno.h> | ||
| 597 | +#include <linux/ioctl.h> | ||
| 598 | +#include <linux/delay.h> | ||
| 599 | +#include <linux/i2c.h> | ||
| 600 | + | ||
| 601 | +#include <sound/core.h> | ||
| 602 | +#include <sound/control.h> | ||
| 603 | +#include <sound/initval.h> | ||
| 604 | +#include <sound/info.h> | ||
| 605 | + | ||
| 606 | +#include "htcuniversal_ak4641.h" | ||
| 607 | + | ||
| 608 | +/* Registers */ | ||
| 609 | +#define R_PM1 0x00 | ||
| 610 | +#define R_PM2 0x01 | ||
| 611 | +#define R_SEL1 0x02 | ||
| 612 | +#define R_SEL2 0x03 | ||
| 613 | +#define R_MODE1 0x04 | ||
| 614 | +#define R_MODE2 0x05 | ||
| 615 | +#define R_DAC 0x06 | ||
| 616 | +#define R_MIC 0x07 | ||
| 617 | +#define REG_TIMER 0x08 | ||
| 618 | +#define REG_ALC1 0x09 | ||
| 619 | +#define REG_ALC2 0x0a | ||
| 620 | +#define R_PGA 0x0b | ||
| 621 | +#define R_ATTL 0x0c | ||
| 622 | +#define R_ATTR 0x0d | ||
| 623 | +#define REG_VOL 0x0e | ||
| 624 | +#define R_STATUS 0x0f | ||
| 625 | +#define REG_EQLO 0x10 | ||
| 626 | +#define REG_EQMID 0x11 | ||
| 627 | +#define REG_EQHI 0x12 | ||
| 628 | +#define REG_BTIF 0x13 | ||
| 629 | + | ||
| 630 | +/* Register flags */ | ||
| 631 | +/* REG_PWR1 */ | ||
| 632 | +#define R_PM1_PMADC 0x01 | ||
| 633 | +#define R_PM1_PMMIC 0x02 | ||
| 634 | +#define REG_PWR1_PMAUX 0x04 | ||
| 635 | +#define REG_PWR1_PMMO 0x08 | ||
| 636 | +#define R_PM1_PMLO 0x10 | ||
| 637 | +/* unused 0x20 */ | ||
| 638 | +/* unused 0x40 */ | ||
| 639 | +#define R_PM1_PMVCM 0x80 | ||
| 640 | + | ||
| 641 | +/* REG_PWR2 */ | ||
| 642 | +#define R_PM2_PMDAC 0x01 | ||
| 643 | +/* unused 0x02 */ | ||
| 644 | +/* unused 0x04 */ | ||
| 645 | +#define R_PM2_PMMO2 0x08 | ||
| 646 | +#define REG_PWR2_MCKAC 0x10 | ||
| 647 | +/* unused 0x20 */ | ||
| 648 | +/* unused 0x40 */ | ||
| 649 | +#define R_PM2_MCKPD 0x80 | ||
| 650 | + | ||
| 651 | +/* REG_SEL1 */ | ||
| 652 | +#define R_SEL1_PSMO2 0x01 | ||
| 653 | +/* unused 0x02 */ | ||
| 654 | +/* unused 0x04 */ | ||
| 655 | +/* unused 0x08 */ | ||
| 656 | +#define REG_SEL1_MICM 0x10 | ||
| 657 | +#define REG_SEL1_DACM 0x20 | ||
| 658 | +#define REG_SEL1_PSMO 0x40 | ||
| 659 | +#define REG_SEL1_MOGN 0x80 | ||
| 660 | + | ||
| 661 | +/* REG_SEL2 */ | ||
| 662 | +#define R_SEL2_PSLOR 0x01 | ||
| 663 | +#define R_SEL2_PSLOL 0x02 | ||
| 664 | +#define REG_SEL2_AUXSI 0x04 | ||
| 665 | +/* unused 0x08 */ | ||
| 666 | +#define REG_SEL2_MICL 0x10 | ||
| 667 | +#define REG_SEL2_AUXL 0x20 | ||
| 668 | +/* unused 0x40 */ | ||
| 669 | +#define R_SEL2_DACL 0x80 | ||
| 670 | + | ||
| 671 | +/* REG_MODE1 */ | ||
| 672 | +#define REG_MODE1_DIF0 0x01 | ||
| 673 | +#define REG_MODE1_DIF1 0x02 | ||
| 674 | +/* unused 0x04 */ | ||
| 675 | +/* unused 0x08 */ | ||
| 676 | +/* unused 0x10 */ | ||
| 677 | +/* unused 0x20 */ | ||
| 678 | +/* unused 0x40 */ | ||
| 679 | +/* unused 0x80 */ | ||
| 680 | + | ||
| 681 | +/* REG_MODE2 */ | ||
| 682 | +/* unused 0x01 */ | ||
| 683 | +#define REG_MODE2_LOOP 0x02 | ||
| 684 | +#define REG_MODE2_HPM 0x04 | ||
| 685 | +/* unused 0x08 */ | ||
| 686 | +/* unused 0x10 */ | ||
| 687 | +#define REG_MODE2_MCK0 0x20 | ||
| 688 | +#define REG_MODE2_MCK1 0x40 | ||
| 689 | +/* unused 0x80 */ | ||
| 690 | + | ||
| 691 | +/* REG_DAC */ | ||
| 692 | +#define REG_DAC_DEM0 0x01 | ||
| 693 | +#define REG_DAC_DEM1 0x02 | ||
| 694 | +#define REG_DAC_EQ 0x04 | ||
| 695 | +/* unused 0x08 */ | ||
| 696 | +#define R_DAC_DATTC 0x10 | ||
| 697 | +#define R_DAC_SMUTE 0x20 | ||
| 698 | +#define REG_DAC_TM 0x40 | ||
| 699 | +/* unused 0x80 */ | ||
| 700 | + | ||
| 701 | +/* REG_MIC */ | ||
| 702 | +#define R_MIC_MGAIN 0x01 | ||
| 703 | +#define R_MIC_MSEL 0x02 | ||
| 704 | +#define R_MIC_MICAD 0x04 | ||
| 705 | +#define R_MIC_MPWRI 0x08 | ||
| 706 | +#define R_MIC_MPWRE 0x10 | ||
| 707 | +#define REG_MIC_AUXAD 0x20 | ||
| 708 | +/* unused 0x40 */ | ||
| 709 | +/* unused 0x80 */ | ||
| 710 | + | ||
| 711 | +/* REG_TIMER */ | ||
| 712 | + | ||
| 713 | +#define REG_TIMER_LTM0 0x01 | ||
| 714 | +#define REG_TIMER_LTM1 0x02 | ||
| 715 | +#define REG_TIMER_WTM0 0x04 | ||
| 716 | +#define REG_TIMER_WTM1 0x08 | ||
| 717 | +#define REG_TIMER_ZTM0 0x10 | ||
| 718 | +#define REG_TIMER_ZTM1 0x20 | ||
| 719 | +/* unused 0x40 */ | ||
| 720 | +/* unused 0x80 */ | ||
| 721 | + | ||
| 722 | +#define REG_ALC1_LMTH 0x01 | ||
| 723 | +#define REG_ALC1_RATT 0x02 | ||
| 724 | +#define REG_ALC1_LMAT0 0x04 | ||
| 725 | +#define REG_ALC1_LMAT1 0x08 | ||
| 726 | +#define REG_ALC1_ZELM 0x10 | ||
| 727 | +#define REG_ALC1_ALC1 0x20 | ||
| 728 | +/* unused 0x40 */ | ||
| 729 | +/* unused 0x80 */ | ||
| 730 | + | ||
| 731 | +/* REG_ALC2 */ | ||
| 732 | + | ||
| 733 | +/* REG_PGA */ | ||
| 734 | + | ||
| 735 | +/* REG_ATTL */ | ||
| 736 | + | ||
| 737 | +/* REG_ATTR */ | ||
| 738 | + | ||
| 739 | +/* REG_VOL */ | ||
| 740 | +#define REG_VOL_ATTM 0x80 | ||
| 741 | + | ||
| 742 | +/* REG_STATUS */ | ||
| 743 | +#define R_STATUS_DTMIC 0x01 | ||
| 744 | + | ||
| 745 | +/* REG_EQ controls use 4 bits for each of 5 EQ levels */ | ||
| 746 | + | ||
| 747 | +/* Bluetooth not yet implemented */ | ||
| 748 | +#define REG_BTIF_PMAD2 0x01 | ||
| 749 | +#define REG_BTIF_PMDA2 0x02 | ||
| 750 | +#define REG_BTIF_PMBIF 0x04 | ||
| 751 | +#define REG_BTIF_ADC2 0x08 | ||
| 752 | +#define REG_BTIF_DAC2 0x10 | ||
| 753 | +#define REG_BTIF_BTFMT0 0x20 | ||
| 754 | +#define REG_BTIF_BTFMT1 0x40 | ||
| 755 | +/* unused 0x80 */ | ||
| 756 | + | ||
| 757 | +/* begin {{ I2C }} */ | ||
| 758 | + | ||
| 759 | +static struct i2c_driver snd_ak4641_i2c_driver = { | ||
| 760 | + .driver = { | ||
| 761 | + .name = "ak4641-i2c" | ||
| 762 | + }, | ||
| 763 | +}; | ||
| 764 | + | ||
| 765 | +static int snd_ak4641_i2c_init(void) | ||
| 766 | +{ | ||
| 767 | + return i2c_add_driver(&snd_ak4641_i2c_driver); | ||
| 768 | +} | ||
| 769 | + | ||
| 770 | +static void snd_ak4641_i2c_free(void) | ||
| 771 | +{ | ||
| 772 | + i2c_del_driver(&snd_ak4641_i2c_driver); | ||
| 773 | +} | ||
| 774 | + | ||
| 775 | +static inline int snd_ak4641_i2c_probe(struct snd_ak4641 *ak) | ||
| 776 | +{ | ||
| 777 | + if (ak->i2c_client.adapter == NULL) return -EINVAL; | ||
| 778 | + ak->i2c_client.addr = 0x12; | ||
| 779 | + if (i2c_smbus_xfer(ak->i2c_client.adapter, ak->i2c_client.addr, | ||
| 780 | + 0, 0, 0, I2C_SMBUS_QUICK, NULL) < 0) | ||
| 781 | + return -ENODEV; | ||
| 782 | + else return 0; | ||
| 783 | +} | ||
| 784 | + | ||
| 785 | +static int snd_ak4641_i2c_attach(struct snd_ak4641 *ak) | ||
| 786 | +{ | ||
| 787 | + int ret = 0; | ||
| 788 | + if ((ret = snd_ak4641_i2c_probe(ak)) < 0) return ret; | ||
| 789 | + snprintf(ak->i2c_client.name, sizeof(ak->i2c_client.name), | ||
| 790 | + "ak4641-i2c at %d-%04x", | ||
| 791 | + i2c_adapter_id(ak->i2c_client.adapter), ak->i2c_client.addr); | ||
| 792 | + return i2c_attach_client(&ak->i2c_client); | ||
| 793 | +} | ||
| 794 | + | ||
| 795 | +static void snd_ak4641_i2c_detach(struct snd_ak4641 *ak) | ||
| 796 | +{ | ||
| 797 | + i2c_detach_client(&ak->i2c_client); | ||
| 798 | +} | ||
| 799 | + | ||
| 800 | +/* end {{ I2C }} */ | ||
| 801 | + | ||
| 802 | + | ||
| 803 | +/* begin {{ Registers & Cache Ops }} */ | ||
| 804 | + | ||
| 805 | +static int snd_ak4641_hwsync(struct snd_ak4641 *ak, int read, u8 reg) | ||
| 806 | +{ | ||
| 807 | + struct i2c_msg msgs[2]; | ||
| 808 | + u8 buf[2]; | ||
| 809 | + int ret; | ||
| 810 | + | ||
| 811 | + snd_assert(reg < ARRAY_SIZE(ak->regs), return -EINVAL); | ||
| 812 | + | ||
| 813 | + /* setup i2c msgs */ | ||
| 814 | + msgs[0].addr = ak->i2c_client.addr; | ||
| 815 | + msgs[0].flags = 0; | ||
| 816 | + msgs[0].buf = buf; | ||
| 817 | + if (!read) | ||
| 818 | + msgs[0].len = 2; | ||
| 819 | + else { | ||
| 820 | + msgs[1].flags = I2C_M_RD; | ||
| 821 | + msgs[1].addr = msgs[0].addr; | ||
| 822 | + msgs[1].buf = msgs[0].buf + 1; | ||
| 823 | + msgs[0].len = 1; | ||
| 824 | + msgs[1].len = 1; | ||
| 825 | + } | ||
| 826 | + | ||
| 827 | + buf[0] = reg; | ||
| 828 | + | ||
| 829 | + /* regs[reg] -> buffer, on write */ | ||
| 830 | + if (!read) buf[1] = ak->regs[reg]; | ||
| 831 | + | ||
| 832 | + /* i2c transfer */ | ||
| 833 | + ret = i2c_transfer(ak->i2c_client.adapter, msgs, read ? 2 : 1); | ||
| 834 | + if (ret != (read ? 2 : 1)) return ret; /* transfer error */ //@@ error ret < 0, or not ? | ||
| 835 | + | ||
| 836 | + /* regs[reg] <- buffer, on read */ | ||
| 837 | + if (read) ak->regs[reg] = buf[1]; | ||
| 838 | + | ||
| 839 | + return 0; | ||
| 840 | +} | ||
| 841 | + | ||
| 842 | +static inline int snd_ak4641_hwsync_read(struct snd_ak4641 *ak, u8 reg) | ||
| 843 | +{ | ||
| 844 | + return snd_ak4641_hwsync(ak, 1, reg); | ||
| 845 | +} | ||
| 846 | + | ||
| 847 | +static inline int snd_ak4641_hwsync_write(struct snd_ak4641 *ak, u8 reg) | ||
| 848 | +{ | ||
| 849 | + return snd_ak4641_hwsync(ak, 0, reg); | ||
| 850 | +} | ||
| 851 | + | ||
| 852 | +static int snd_ak4641_hwsync_read_all(struct snd_ak4641 *ak) | ||
| 853 | +{ | ||
| 854 | + u8 reg; | ||
| 855 | + for (reg = 0; reg < ARRAY_SIZE(ak->regs); reg++) | ||
| 856 | + if (snd_ak4641_hwsync_read(ak, reg) < 0) return -1; | ||
| 857 | + return 0; | ||
| 858 | +} | ||
| 859 | + | ||
| 860 | +static int snd_ak4641_hwsync_write_all(struct snd_ak4641 *ak) | ||
| 861 | +{ | ||
| 862 | + u8 reg; | ||
| 863 | + for (reg = 0; reg < ARRAY_SIZE(ak->regs); reg++) | ||
| 864 | + if (snd_ak4641_hwsync_write(ak, reg) < 0) return -1; | ||
| 865 | + return 0; | ||
| 866 | +} | ||
| 867 | + | ||
| 868 | +static int snd_ak4641_reg_changed(struct snd_ak4641 *ak, u8 reg) | ||
| 869 | +{ | ||
| 870 | + if ((reg != R_PGA && ak->powered_on) || | ||
| 871 | + (reg == R_PGA && (ak->regs[R_PM1] & R_PM1_PMMIC))) | ||
| 872 | + return snd_ak4641_hwsync_write(ak, reg); | ||
| 873 | + return 0; | ||
| 874 | +} | ||
| 875 | + | ||
| 876 | +/* end {{ Registers & Cache Ops }}*/ | ||
| 877 | + | ||
| 878 | + | ||
| 879 | +static inline void snd_ak4641_lock(struct snd_ak4641 *ak) | ||
| 880 | +{ | ||
| 881 | + down(&ak->sem); | ||
| 882 | +} | ||
| 883 | + | ||
| 884 | +static inline void snd_ak4641_unlock(struct snd_ak4641 *ak) | ||
| 885 | +{ | ||
| 886 | + up(&ak->sem); | ||
| 887 | +} | ||
| 888 | + | ||
| 889 | +#define WRITE_MASK(i, val, mask) (((i) & ~(mask)) | ((val) & (mask))) | ||
| 890 | + | ||
| 891 | + | ||
| 892 | +/* begin {{ Controls }} */ | ||
| 893 | + | ||
| 894 | +#define INV_RANGE(val, mask) \ | ||
| 895 | + (~(val) & (mask)) | ||
| 896 | + | ||
| 897 | +/*-begin----------------------------------------------------------*/ | ||
| 898 | +static int snd_ak4641_actl_playback_volume_info(struct snd_kcontrol *kcontrol, | ||
| 899 | + struct snd_ctl_elem_info *uinfo) | ||
| 900 | +{ | ||
| 901 | + uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; | ||
| 902 | + uinfo->count = 2; | ||
| 903 | + uinfo->value.integer.min = 0; | ||
| 904 | + uinfo->value.integer.max = 0xff; | ||
| 905 | + return 0; | ||
| 906 | +} | ||
| 907 | + | ||
| 908 | +static int snd_ak4641_actl_playback_volume_get(struct snd_kcontrol *kcontrol, | ||
| 909 | + struct snd_ctl_elem_value *ucontrol) | ||
| 910 | +{ | ||
| 911 | + struct snd_ak4641 *ak = (struct snd_ak4641 *) kcontrol->private_data; | ||
| 912 | + | ||
| 913 | + snd_ak4641_lock(ak); | ||
| 914 | + ucontrol->value.integer.value[0] = INV_RANGE(ak->regs[R_ATTL], 0xff); | ||
| 915 | + ucontrol->value.integer.value[1] = INV_RANGE(ak->regs[R_ATTR], 0xff); | ||
| 916 | + snd_ak4641_unlock(ak); | ||
| 917 | + return 0; | ||
| 918 | +} | ||
| 919 | + | ||
| 920 | +static int snd_ak4641_actl_playback_volume_put(struct snd_kcontrol *kcontrol, | ||
| 921 | + struct snd_ctl_elem_value *ucontrol) | ||
| 922 | +{ | ||
| 923 | + struct snd_ak4641 *ak = (struct snd_ak4641 *) kcontrol->private_data; | ||
| 924 | + | ||
| 925 | + snd_ak4641_lock(ak); | ||
| 926 | + ak->regs[R_ATTL] = INV_RANGE(ucontrol->value.integer.value[0], 0xff); | ||
| 927 | + ak->regs[R_ATTR] = INV_RANGE(ucontrol->value.integer.value[1], 0xff); | ||
| 928 | + snd_ak4641_reg_changed(ak, R_ATTL); | ||
| 929 | + snd_ak4641_reg_changed(ak, R_ATTR); | ||
| 930 | + snd_ak4641_unlock(ak); | ||
| 931 | + return 0; | ||
| 932 | +} | ||
| 933 | +/*-end------------------------------------------------------------*/ | ||
| 934 | + | ||
| 935 | +/*-begin----------------------------------------------------------*/ | ||
| 936 | +static int snd_ak4641_actl_mic_gain_info(struct snd_kcontrol *kcontrol, | ||
| 937 | + struct snd_ctl_elem_info *uinfo) | ||
| 938 | +{ | ||
| 939 | + uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; | ||
| 940 | + uinfo->count = 1; | ||
| 941 | + uinfo->value.integer.min = 0; | ||
| 942 | + uinfo->value.integer.max = 0x7f; | ||
| 943 | + return 0; | ||
| 944 | +} | ||
| 945 | + | ||
| 946 | +static int snd_ak4641_actl_mic_gain_get(struct snd_kcontrol *kcontrol, | ||
| 947 | + struct snd_ctl_elem_value *ucontrol) | ||
| 948 | +{ | ||
| 949 | + struct snd_ak4641 *ak = (struct snd_ak4641 *) kcontrol->private_data; | ||
| 950 | + | ||
| 951 | + ucontrol->value.integer.value[0] = ak->regs[R_PGA]; | ||
| 952 | + return 0; | ||
| 953 | +} | ||
| 954 | + | ||
| 955 | +static int snd_ak4641_actl_mic_gain_put(struct snd_kcontrol *kcontrol, | ||
| 956 | + struct snd_ctl_elem_value *ucontrol) | ||
| 957 | +{ | ||
| 958 | + struct snd_ak4641 *ak = (struct snd_ak4641 *) kcontrol->private_data; | ||
| 959 | + | ||
| 960 | + snd_ak4641_lock(ak); | ||
| 961 | + ak->regs[R_PGA] = ucontrol->value.integer.value[0]; | ||
| 962 | + snd_ak4641_reg_changed(ak, R_PGA); | ||
| 963 | + snd_ak4641_unlock(ak); | ||
| 964 | + return 0; | ||
| 965 | +} | ||
| 966 | +/*-end------------------------------------------------------------*/ | ||
| 967 | + | ||
| 968 | +#define ACTL(ctl_name, _name) \ | ||
| 969 | +static struct snd_kcontrol_new snd_ak4641_actl_ ## ctl_name = \ | ||
| 970 | +{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = _name, \ | ||
| 971 | + .info = snd_ak4641_actl_ ## ctl_name ## _info, \ | ||
| 972 | + .get = snd_ak4641_actl_ ## ctl_name ## _get, .put = snd_ak4641_actl_ ## ctl_name ## _put }; | ||
| 973 | + | ||
| 974 | +ACTL(playback_volume, "Master Playback Volume") | ||
| 975 | +ACTL(mic_gain, "Mic Capture Gain") | ||
| 976 | + | ||
| 977 | +struct snd_ak4641_uctl_bool { | ||
| 978 | + int (*get) (struct snd_ak4641 *uda); | ||
| 979 | + int (*set) (struct snd_ak4641 *uda, int on); | ||
| 980 | +}; | ||
| 981 | + | ||
| 982 | +static int snd_ak4641_actl_bool_info(struct snd_kcontrol *kcontrol, | ||
| 983 | + struct snd_ctl_elem_info *uinfo) | ||
| 984 | +{ | ||
| 985 | + uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN; | ||
| 986 | + uinfo->count = 1; | ||
| 987 | + return 0; | ||
| 988 | +} | ||
| 989 | + | ||
| 990 | +static int snd_ak4641_actl_bool_get(struct snd_kcontrol *kcontrol, | ||
| 991 | + struct snd_ctl_elem_value *ucontrol) | ||
| 992 | +{ | ||
| 993 | + struct snd_ak4641 *ak = (struct snd_ak4641 *) kcontrol->private_data; | ||
| 994 | + struct snd_ak4641_uctl_bool *uctl = | ||
| 995 | + (struct snd_ak4641_uctl_bool *) kcontrol->private_value; | ||
| 996 | + | ||
| 997 | + ucontrol->value.integer.value[0] = uctl->get(ak); | ||
| 998 | + return 0; | ||
| 999 | +} | ||
| 1000 | + | ||
| 1001 | +static int snd_ak4641_actl_bool_put(struct snd_kcontrol *kcontrol, | ||
| 1002 | + struct snd_ctl_elem_value *ucontrol) | ||
| 1003 | +{ | ||
| 1004 | + struct snd_ak4641 *ak = (struct snd_ak4641 *) kcontrol->private_data; | ||
| 1005 | + struct snd_ak4641_uctl_bool *uctl = | ||
| 1006 | + (struct snd_ak4641_uctl_bool *) kcontrol->private_value; | ||
| 1007 | + | ||
| 1008 | + return uctl->set(ak, ucontrol->value.integer.value[0]); | ||
| 1009 | +} | ||
| 1010 | + | ||
| 1011 | +/*-begin----------------------------------------------------------*/ | ||
| 1012 | +static int snd_ak4641_uctl_playback_switch_get(struct snd_ak4641 *ak) | ||
| 1013 | +{ | ||
| 1014 | + return (ak->regs[R_DAC] & R_DAC_SMUTE) == 0x00; | ||
| 1015 | +} | ||
| 1016 | + | ||
| 1017 | +static int snd_ak4641_uctl_playback_switch_set(struct snd_ak4641 *ak, int on) | ||
| 1018 | +{ | ||
| 1019 | + snd_ak4641_lock(ak); | ||
| 1020 | + ak->regs[R_DAC] = WRITE_MASK(ak->regs[R_DAC], | ||
| 1021 | + on ? 0x00 : R_DAC_SMUTE, R_DAC_SMUTE); | ||
| 1022 | + snd_ak4641_reg_changed(ak, R_DAC); | ||
| 1023 | + snd_ak4641_unlock(ak); | ||
| 1024 | + return 0; | ||
| 1025 | +} | ||
| 1026 | +/*-end------------------------------------------------------------*/ | ||
| 1027 | + | ||
| 1028 | +/*-begin----------------------------------------------------------*/ | ||
| 1029 | +static int snd_ak4641_uctl_mic_boost_get(struct snd_ak4641 *ak) | ||
| 1030 | +{ | ||
| 1031 | + return (ak->regs[R_MIC] & R_MIC_MGAIN) == R_MIC_MGAIN; | ||
| 1032 | +} | ||
| 1033 | + | ||
| 1034 | +static int snd_ak4641_uctl_mic_boost_set(struct snd_ak4641 *ak, int on) | ||
| 1035 | +{ | ||
| 1036 | + snd_ak4641_lock(ak); | ||
| 1037 | + ak->regs[R_MIC] = WRITE_MASK(ak->regs[R_MIC], | ||
| 1038 | + on ? R_MIC_MGAIN : 0x00, R_MIC_MGAIN); | ||
| 1039 | + snd_ak4641_reg_changed(ak, R_MIC); | ||
| 1040 | + snd_ak4641_unlock(ak); | ||
| 1041 | + return 0; | ||
| 1042 | +} | ||
| 1043 | +/*-end------------------------------------------------------------*/ | ||
| 1044 | + | ||
| 1045 | +/*-begin----------------------------------------------------------*/ | ||
| 1046 | +static int snd_ak4641_uctl_mono_out_get(struct snd_ak4641 *ak) | ||
| 1047 | +{ | ||
| 1048 | + printk("mono_out status 0x%8.8x -> 0x%8.8x\n",ak->regs[R_SEL1], ak->regs[R_SEL1] & REG_SEL1_PSMO); | ||
| 1049 | + return (ak->regs[R_SEL1] & REG_SEL1_PSMO) == REG_SEL1_PSMO; | ||
| 1050 | +} | ||
| 1051 | + | ||
| 1052 | +static int snd_ak4641_uctl_mono_out_set(struct snd_ak4641 *ak, int on) | ||
| 1053 | +{ | ||
| 1054 | + printk("phone mic enable called. on=%d\n",on); | ||
| 1055 | + snd_ak4641_lock(ak); | ||
| 1056 | + ak->regs[R_PM1] = WRITE_MASK(ak->regs[R_PM1], on ? R_PM1_PMMIC : 0x00, R_PM1_PMMIC); | ||
| 1057 | + ak->regs[R_PM1] = WRITE_MASK(ak->regs[R_PM1], on ? REG_PWR1_PMMO : 0x00, REG_PWR1_PMMO); | ||
| 1058 | + snd_ak4641_reg_changed(ak, R_PM1); | ||
| 1059 | + | ||
| 1060 | + snd_ak4641_hwsync_write(ak, R_PGA); /* mic PGA gain is reset when PMMIC = 0 */ | ||
| 1061 | + | ||
| 1062 | + /* internal mic */ | ||
| 1063 | + ak->regs[R_MIC] = WRITE_MASK(ak->regs[R_MIC], on ? R_MIC_MPWRI : 0x0, R_MIC_MPWRI); | ||
| 1064 | + ak->regs[R_MIC] = WRITE_MASK(ak->regs[R_MIC], 0x0, R_MIC_MSEL); | ||
| 1065 | + snd_ak4641_hwsync_write(ak, R_MIC); | ||
| 1066 | + | ||
| 1067 | +// ak->regs[REG_BTIF] = WRITE_MASK(ak->regs[REG_BTIF], 0x0, REG_BTIF_DAC2); | ||
| 1068 | +// snd_ak4641_hwsync_write(ak, REG_BTIF); | ||
| 1069 | + /* */ | ||
| 1070 | +// ak->regs[REG_VOL] = WRITE_MASK(ak->regs[REG_VOL], on ? REG_VOL_ATTM : 0x00, REG_VOL_ATTM); | ||
| 1071 | +// ak->regs[R_SEL1] = WRITE_MASK(ak->regs[R_SEL1], on ? REG_SEL1_MOGN : 0x00, REG_SEL1_MOGN); | ||
| 1072 | + ak->regs[R_SEL1] = WRITE_MASK(ak->regs[R_SEL1], on ? REG_SEL1_MICM : 0x00, REG_SEL1_MICM); | ||
| 1073 | + ak->regs[R_SEL1] = WRITE_MASK(ak->regs[R_SEL1], on ? REG_SEL1_PSMO : 0x00, REG_SEL1_PSMO); | ||
| 1074 | + snd_ak4641_reg_changed(ak, R_SEL1); | ||
| 1075 | + snd_ak4641_unlock(ak); | ||
| 1076 | + return 0; | ||
| 1077 | +} | ||
| 1078 | +/*-end------------------------------------------------------------*/ | ||
| 1079 | + | ||
| 1080 | +#define ACTL_BOOL(ctl_name, _name) \ | ||
| 1081 | +static struct snd_ak4641_uctl_bool snd_ak4641_actl_ ## ctl_name ## _pvalue = \ | ||
| 1082 | +{ .get = snd_ak4641_uctl_ ## ctl_name ## _get, \ | ||
| 1083 | + .set = snd_ak4641_uctl_ ## ctl_name ## _set }; \ | ||
| 1084 | +static struct snd_kcontrol_new snd_ak4641_actl_ ## ctl_name = \ | ||
| 1085 | +{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = _name, .info = snd_ak4641_actl_bool_info, \ | ||
| 1086 | + .get = snd_ak4641_actl_bool_get, .put = snd_ak4641_actl_bool_put, \ | ||
| 1087 | + .private_value = (unsigned long) &snd_ak4641_actl_ ## ctl_name ## _pvalue }; | ||
| 1088 | + | ||
| 1089 | +ACTL_BOOL(playback_switch, "Master Playback Switch") | ||
| 1090 | +ACTL_BOOL(mic_boost, "Mic Boost (+20dB)") | ||
| 1091 | +ACTL_BOOL(mono_out, "Phone mic enable") | ||
| 1092 | + | ||
| 1093 | +static void snd_ak4641_headphone_on(struct snd_ak4641 *ak, int on); | ||
| 1094 | +static void snd_ak4641_speaker_on(struct snd_ak4641 *ak, int on); | ||
| 1095 | +static void snd_ak4641_select_mic(struct snd_ak4641 *ak); | ||
| 1096 | + | ||
| 1097 | +void snd_ak4641_hp_connected(struct snd_ak4641 *ak, int connected) | ||
| 1098 | +{ | ||
| 1099 | + snd_ak4641_lock(ak); | ||
| 1100 | + if (connected != ak->hp_connected) { | ||
| 1101 | + ak->hp_connected = connected; | ||
| 1102 | + | ||
| 1103 | + /* headphone or speaker, on playback */ | ||
| 1104 | + if (ak->playback_on) { | ||
| 1105 | + if (connected) { | ||
| 1106 | + snd_ak4641_headphone_on(ak, 1); | ||
| 1107 | + snd_ak4641_speaker_on(ak, 0); | ||
| 1108 | + } else { | ||
| 1109 | + snd_ak4641_speaker_on(ak, 1); | ||
| 1110 | + snd_ak4641_headphone_on(ak, 0); | ||
| 1111 | + } | ||
| 1112 | + } | ||
| 1113 | + | ||
| 1114 | + /* headset or internal mic, on capture */ | ||
| 1115 | + if (ak->capture_on) | ||
| 1116 | + snd_ak4641_select_mic(ak); | ||
| 1117 | + } | ||
| 1118 | + snd_ak4641_unlock(ak); | ||
| 1119 | +} | ||
| 1120 | + | ||
| 1121 | +/* end {{ Controls }} */ | ||
| 1122 | + | ||
| 1123 | + | ||
| 1124 | +/* begin {{ Headphone Detected Notification }} */ | ||
| 1125 | + | ||
| 1126 | +static void snd_ak4641_hp_detected_w_fn(void *p) | ||
| 1127 | +{ | ||
| 1128 | + struct snd_ak4641 *ak = (struct snd_ak4641 *)p; | ||
| 1129 | + | ||
| 1130 | + snd_ak4641_hp_connected(ak, ak->hp_detected.detected); | ||
| 1131 | +} | ||
| 1132 | + | ||
| 1133 | +void snd_ak4641_hp_detected(struct snd_ak4641 *ak, int detected) | ||
| 1134 | +{ | ||
| 1135 | + if (detected != ak->hp_detected.detected) { | ||
| 1136 | + ak->hp_detected.detected = detected; | ||
| 1137 | + queue_work(ak->hp_detected.wq, &ak->hp_detected.w); | ||
| 1138 | + } | ||
| 1139 | +} | ||
| 1140 | + | ||
| 1141 | +static int snd_ak4641_hp_detected_init(struct snd_ak4641 *ak) | ||
| 1142 | +{ | ||
| 1143 | + INIT_WORK(&ak->hp_detected.w, snd_ak4641_hp_detected_w_fn); | ||
| 1144 | + ak->hp_detected.detected = ak->hp_connected; | ||
| 1145 | + ak->hp_detected.wq = create_singlethread_workqueue("ak4641"); | ||
| 1146 | + if (ak->hp_detected.wq) return 0; | ||
| 1147 | + else return -1; | ||
| 1148 | +} | ||
| 1149 | + | ||
| 1150 | +static void snd_ak4641_hp_detected_free(struct snd_ak4641 *ak) | ||
| 1151 | +{ | ||
| 1152 | + destroy_workqueue(ak->hp_detected.wq); | ||
| 1153 | +} | ||
| 1154 | + | ||
| 1155 | +/* end {{ Headphone Detected Notification }} */ | ||
| 1156 | + | ||
| 1157 | + | ||
| 1158 | +/* begin {{ Codec Control }} */ | ||
| 1159 | + | ||
| 1160 | +static void snd_ak4641_headphone_on(struct snd_ak4641 *ak, int on) | ||
| 1161 | +{ | ||
| 1162 | + if (on) { | ||
| 1163 | + ak->regs[R_PM1] = WRITE_MASK(ak->regs[R_PM1], R_PM1_PMLO, R_PM1_PMLO); | ||
| 1164 | + snd_ak4641_hwsync_write(ak, R_PM1); | ||
| 1165 | + ak->headphone_out_on(1); | ||
| 1166 | + ak->regs[R_SEL2] = WRITE_MASK(ak->regs[R_SEL2], | ||
| 1167 | + R_SEL2_PSLOL | R_SEL2_PSLOR, | ||
| 1168 | + R_SEL2_PSLOL | R_SEL2_PSLOR); | ||
| 1169 | + snd_ak4641_hwsync_write(ak, R_SEL2); | ||
| 1170 | + } else { | ||
| 1171 | + ak->regs[R_SEL2] = WRITE_MASK(ak->regs[R_SEL2], | ||
| 1172 | + 0x00, R_SEL2_PSLOL | R_SEL2_PSLOR); | ||
| 1173 | + snd_ak4641_hwsync_write(ak, R_SEL2); | ||
| 1174 | + ak->headphone_out_on(0); | ||
| 1175 | + ak->regs[R_PM1] = WRITE_MASK(ak->regs[R_PM1], 0x00, R_PM1_PMLO); | ||
| 1176 | + snd_ak4641_hwsync_write(ak, R_PM1); | ||
| 1177 | + } | ||
| 1178 | +} | ||
| 1179 | + | ||
| 1180 | +static void snd_ak4641_speaker_on(struct snd_ak4641 *ak, int on) | ||
| 1181 | +{ | ||
| 1182 | + if (on) { | ||
| 1183 | + ak->regs[R_PM1] = WRITE_MASK(ak->regs[R_PM1], R_PM1_PMLO, R_PM1_PMLO); | ||
| 1184 | + snd_ak4641_hwsync_write(ak, R_PM1); | ||
| 1185 | + ak->speaker_out_on(1); | ||
| 1186 | + ak->regs[R_SEL2] = WRITE_MASK(ak->regs[R_SEL2], | ||
| 1187 | + R_SEL2_PSLOL | R_SEL2_PSLOR, | ||
| 1188 | + R_SEL2_PSLOL | R_SEL2_PSLOR); | ||
| 1189 | + snd_ak4641_hwsync_write(ak, R_SEL2); | ||
| 1190 | + } else { | ||
| 1191 | + ak->regs[R_SEL2] = WRITE_MASK(ak->regs[R_SEL2], | ||
| 1192 | + 0x00, R_SEL2_PSLOL | R_SEL2_PSLOR); | ||
| 1193 | + snd_ak4641_hwsync_write(ak, R_SEL2); | ||
| 1194 | + ak->speaker_out_on(0); | ||
| 1195 | + ak->regs[R_PM1] = WRITE_MASK(ak->regs[R_PM1], 0x00, R_PM1_PMLO); | ||
| 1196 | + snd_ak4641_hwsync_write(ak, R_PM1); | ||
| 1197 | + } | ||
| 1198 | +} | ||
| 1199 | + | ||
| 1200 | +static inline int snd_ak4641_power_on(struct snd_ak4641 *ak) | ||
| 1201 | +{ | ||
| 1202 | + ak->reset_pin(1); | ||
| 1203 | + ak->power_on_chip(1); | ||
| 1204 | + msleep(1); | ||
| 1205 | + ak->reset_pin(0); | ||
| 1206 | + ak->powered_on = 1; | ||
| 1207 | + return 0; | ||
| 1208 | +} | ||
| 1209 | + | ||
| 1210 | +static inline int snd_ak4641_power_off(struct snd_ak4641 *ak) | ||
| 1211 | +{ | ||
| 1212 | + ak->powered_on = 0; | ||
| 1213 | + ak->power_on_chip(0); | ||
| 1214 | + return 0; | ||
| 1215 | +} | ||
| 1216 | + | ||
| 1217 | +static inline void snd_ak4641_headphone_out_on(struct snd_ak4641 *ak, int on) | ||
| 1218 | +{ | ||
| 1219 | + if (ak->headphone_out_on) ak->headphone_out_on(on); | ||
| 1220 | +} | ||
| 1221 | + | ||
| 1222 | +static inline void snd_ak4641_speaker_out_on(struct snd_ak4641 *ak, int on) | ||
| 1223 | +{ | ||
| 1224 | + if (ak->speaker_out_on) ak->speaker_out_on(on); | ||
| 1225 | +} | ||
| 1226 | + | ||
| 1227 | +static int snd_ak4641_playback_on(struct snd_ak4641 *ak) | ||
| 1228 | +{ | ||
| 1229 | + if (ak->playback_on) return 0; | ||
| 1230 | + | ||
| 1231 | + ak->regs[R_PM2] = WRITE_MASK(ak->regs[R_PM2], | ||
| 1232 | + R_PM2_PMDAC, R_PM2_MCKPD | R_PM2_PMDAC); | ||
| 1233 | + ak->regs[R_PM1] = WRITE_MASK(ak->regs[R_PM1], R_PM1_PMLO, R_PM1_PMLO); | ||
| 1234 | + snd_ak4641_hwsync_write(ak, R_PM2); | ||
| 1235 | + snd_ak4641_hwsync_write(ak, R_PM1); | ||
| 1236 | + if (ak->hp_connected) snd_ak4641_headphone_on(ak, 1); | ||
| 1237 | + else snd_ak4641_speaker_on(ak, 1); | ||
| 1238 | + | ||
| 1239 | + ak->playback_on = 1; | ||
| 1240 | + | ||
| 1241 | + return 0; | ||
| 1242 | +} | ||
| 1243 | + | ||
| 1244 | +static int snd_ak4641_playback_off(struct snd_ak4641 *ak) | ||
| 1245 | +{ | ||
| 1246 | + if (!ak->playback_on) return 0; | ||
| 1247 | + | ||
| 1248 | + ak->playback_on = 0; | ||
| 1249 | + | ||
| 1250 | + if (ak->hp_connected) snd_ak4641_headphone_on(ak, 0); | ||
| 1251 | + else snd_ak4641_speaker_on(ak, 0); | ||
| 1252 | + ak->regs[R_PM1] = WRITE_MASK(ak->regs[R_PM1], 0x00, R_PM1_PMLO); | ||
| 1253 | + ak->regs[R_PM2] = WRITE_MASK(ak->regs[R_PM2], | ||
| 1254 | + (!ak->capture_on ? R_PM2_MCKPD : 0x00) | R_PM2_PMDAC, | ||
| 1255 | + R_PM2_MCKPD | R_PM2_PMDAC); | ||
| 1256 | + snd_ak4641_hwsync_write(ak, R_PM1); | ||
| 1257 | + snd_ak4641_hwsync_write(ak, R_PM2); | ||
| 1258 | + | ||
| 1259 | + return 0; | ||
| 1260 | +} | ||
| 1261 | + | ||
| 1262 | +static void snd_ak4641_select_mic(struct snd_ak4641 *ak) | ||
| 1263 | +{ | ||
| 1264 | + int mic = 0; | ||
| 1265 | + u8 r_mic; | ||
| 1266 | + | ||
| 1267 | + if (ak->hp_connected) { | ||
| 1268 | + /* check headset mic */ | ||
| 1269 | + ak->regs[R_MIC] = WRITE_MASK(ak->regs[R_MIC], R_MIC_MPWRE, R_MIC_MPWRE); | ||
| 1270 | + snd_ak4641_hwsync_write(ak, R_MIC); | ||
| 1271 | + snd_ak4641_hwsync_read(ak, R_STATUS); | ||
| 1272 | + mic = (ak->regs[R_STATUS] & R_STATUS_DTMIC) == R_STATUS_DTMIC; | ||
| 1273 | + | ||
| 1274 | + printk("htcuniversal_ak4641_select_mic: mic=%d\n",mic); | ||
| 1275 | + | ||
| 1276 | + r_mic = WRITE_MASK(ak->regs[R_MIC], | ||
| 1277 | + R_MIC_MSEL | (ak->capture_on ? R_MIC_MPWRE : 0x00), | ||
| 1278 | + R_MIC_MSEL | R_MIC_MPWRI | R_MIC_MPWRE); | ||
| 1279 | + } | ||
| 1280 | + else | ||
| 1281 | + r_mic = WRITE_MASK(ak->regs[R_MIC], | ||
| 1282 | + 0x00 | (ak->capture_on ? R_MIC_MPWRI : 0x00), | ||
| 1283 | + R_MIC_MSEL | R_MIC_MPWRI | R_MIC_MPWRE); | ||
| 1284 | + | ||
| 1285 | + if (r_mic != ak->regs[R_MIC]) { | ||
| 1286 | + ak->regs[R_MIC] = r_mic; | ||
| 1287 | + snd_ak4641_hwsync_write(ak, R_MIC); | ||
| 1288 | + } | ||
| 1289 | +} | ||
| 1290 | + | ||
| 1291 | +static int snd_ak4641_capture_on(struct snd_ak4641 *ak) | ||
| 1292 | +{ | ||
| 1293 | + if (ak->capture_on) return 0; | ||
| 1294 | + | ||
| 1295 | + if (!ak->playback_on) { | ||
| 1296 | + ak->regs[R_PM2] = WRITE_MASK(ak->regs[R_PM2], 0x00, R_PM2_MCKPD); | ||
| 1297 | + snd_ak4641_hwsync_write(ak, R_PM2); | ||
| 1298 | + } | ||
| 1299 | + ak->regs[R_PM1] = WRITE_MASK(ak->regs[R_PM1], R_PM1_PMMIC | R_PM1_PMADC, | ||
| 1300 | + R_PM1_PMMIC | R_PM1_PMADC); | ||
| 1301 | + snd_ak4641_hwsync_write(ak, R_PM1); | ||
| 1302 | + snd_ak4641_hwsync_write(ak, R_PGA); /* mic PGA gain is reset when PMMIC = 0 */ | ||
| 1303 | + | ||
| 1304 | + ak->capture_on = 1; | ||
| 1305 | + | ||
| 1306 | + snd_ak4641_select_mic(ak); | ||
| 1307 | + | ||
| 1308 | + msleep(47); /* accounts for ADC init cycle, time enough for fs >= 44.1 kHz */ | ||
| 1309 | + | ||
| 1310 | + return 0; | ||
| 1311 | +} | ||
| 1312 | + | ||
| 1313 | +static int snd_ak4641_capture_off(struct snd_ak4641 *ak) | ||
| 1314 | +{ | ||
| 1315 | + if (!ak->capture_on) return 0; | ||
| 1316 | + | ||
| 1317 | + ak->regs[R_MIC] = WRITE_MASK(ak->regs[R_MIC], | ||
| 1318 | + 0x00, R_MIC_MPWRI | R_MIC_MPWRE | R_MIC_MSEL); | ||
| 1319 | + ak->regs[R_PM1] = WRITE_MASK(ak->regs[R_PM1], 0x00, R_PM1_PMMIC | R_PM1_PMADC); | ||
| 1320 | + snd_ak4641_hwsync_write(ak, R_MIC); | ||
| 1321 | + snd_ak4641_hwsync_write(ak, R_PM1); | ||
| 1322 | + if (!ak->playback_on) { | ||
| 1323 | + ak->regs[R_PM2] = WRITE_MASK(ak->regs[R_PM2], R_PM2_MCKPD, R_PM2_MCKPD); | ||
| 1324 | + snd_ak4641_hwsync_write(ak, R_PM2); | ||
| 1325 | + } | ||
| 1326 | + | ||
| 1327 | + ak->capture_on = 0; | ||
| 1328 | + | ||
| 1329 | + return 0; | ||
| 1330 | +} | ||
| 1331 | + | ||
| 1332 | +int snd_ak4641_open_stream(struct snd_ak4641 *ak, int stream) | ||
| 1333 | +{ | ||
| 1334 | + snd_ak4641_lock(ak); | ||
| 1335 | + if (stream == SNDRV_PCM_STREAM_PLAYBACK) { | ||
| 1336 | + ak->playback_stream_opened = 1; | ||
| 1337 | + snd_ak4641_playback_on(ak); | ||
| 1338 | + } else { | ||
| 1339 | + ak->capture_stream_opened = 1; | ||
| 1340 | + snd_ak4641_capture_on(ak); | ||
| 1341 | + } | ||
| 1342 | + snd_ak4641_unlock(ak); | ||
| 1343 | + return 0; | ||
| 1344 | +} | ||
| 1345 | + | ||
| 1346 | +int snd_ak4641_close_stream(struct snd_ak4641 *ak, int stream) | ||
| 1347 | +{ | ||
| 1348 | + snd_ak4641_lock(ak); | ||
| 1349 | + if (stream == SNDRV_PCM_STREAM_PLAYBACK) { | ||
| 1350 | + ak->playback_stream_opened = 0; | ||
| 1351 | + snd_ak4641_playback_off(ak); | ||
| 1352 | + } else { | ||
| 1353 | + ak->capture_stream_opened = 0; | ||
| 1354 | + snd_ak4641_capture_off(ak); | ||
| 1355 | + } | ||
| 1356 | + snd_ak4641_unlock(ak); | ||
| 1357 | + return 0; | ||
| 1358 | +} | ||
| 1359 | + | ||
| 1360 | +static int snd_ak4641_init_regs(struct snd_ak4641 *ak) | ||
| 1361 | +{ | ||
| 1362 | + snd_ak4641_hwsync_read_all(ak); | ||
| 1363 | + | ||
| 1364 | + //@@ MEMO: add some configs | ||
| 1365 | + | ||
| 1366 | + ak->regs[R_PM1] = WRITE_MASK(ak->regs[R_PM1], R_PM1_PMVCM, R_PM1_PMVCM); | ||
| 1367 | + ak->regs[R_DAC] = WRITE_MASK(ak->regs[R_DAC], 0x00, R_DAC_DATTC); | ||
| 1368 | + snd_ak4641_hwsync_write(ak, R_PM1); | ||
| 1369 | + snd_ak4641_hwsync_write(ak, R_DAC); | ||
| 1370 | + | ||
| 1371 | + return 0; | ||
| 1372 | +} | ||
| 1373 | + | ||
| 1374 | +int snd_ak4641_suspend(struct snd_ak4641 *ak, pm_message_t state) | ||
| 1375 | +{ | ||
| 1376 | + snd_ak4641_lock(ak); | ||
| 1377 | + if (ak->playback_on) snd_ak4641_playback_off(ak); | ||
| 1378 | + if (ak->capture_on) snd_ak4641_capture_off(ak); | ||
| 1379 | + snd_ak4641_power_off(ak); | ||
| 1380 | + snd_ak4641_unlock(ak); | ||
| 1381 | + return 0; | ||
| 1382 | +} | ||
| 1383 | + | ||
| 1384 | +int snd_ak4641_resume(struct snd_ak4641 *ak) | ||
| 1385 | +{ | ||
| 1386 | + snd_ak4641_lock(ak); | ||
| 1387 | + snd_ak4641_power_on(ak); | ||
| 1388 | + snd_ak4641_hwsync_write_all(ak); | ||
| 1389 | + if (ak->playback_stream_opened) snd_ak4641_playback_on(ak); | ||
| 1390 | + if (ak->capture_stream_opened) snd_ak4641_capture_on(ak); | ||
| 1391 | + snd_ak4641_unlock(ak); | ||
| 1392 | + return 0; | ||
| 1393 | +} | ||
| 1394 | + | ||
| 1395 | +static void snd_ak4641_init_ak(struct snd_ak4641 *ak) | ||
| 1396 | +{ | ||
| 1397 | + init_MUTEX(&ak->sem); | ||
| 1398 | + ak->i2c_client.driver = &snd_ak4641_i2c_driver; | ||
| 1399 | +} | ||
| 1400 | + | ||
| 1401 | +int snd_ak4641_activate(struct snd_ak4641 *ak) | ||
| 1402 | +{ | ||
| 1403 | + int ret = 0; | ||
| 1404 | + | ||
| 1405 | + snd_ak4641_init_ak(ak); | ||
| 1406 | + snd_ak4641_lock(ak); | ||
| 1407 | + snd_ak4641_power_on(ak); | ||
| 1408 | + if ((ret = snd_ak4641_i2c_attach(ak)) < 0) | ||
| 1409 | + goto failed_i2c_attach; | ||
| 1410 | + snd_ak4641_init_regs(ak); | ||
| 1411 | + if ((ret = snd_ak4641_hp_detected_init(ak)) < 0) | ||
| 1412 | + goto failed_hp_detected_init; | ||
| 1413 | + snd_ak4641_unlock(ak); | ||
| 1414 | + return 0; | ||
| 1415 | + | ||
| 1416 | + failed_hp_detected_init: | ||
| 1417 | + snd_ak4641_i2c_detach(ak); | ||
| 1418 | + failed_i2c_attach: | ||
| 1419 | + snd_ak4641_power_off(ak); | ||
| 1420 | + snd_ak4641_unlock(ak); | ||
| 1421 | + return ret; | ||
| 1422 | +} | ||
| 1423 | + | ||
| 1424 | +void snd_ak4641_deactivate(struct snd_ak4641 *ak) | ||
| 1425 | +{ | ||
| 1426 | + snd_ak4641_lock(ak); | ||
| 1427 | + snd_ak4641_hp_detected_free(ak); | ||
| 1428 | + snd_ak4641_i2c_detach(ak); | ||
| 1429 | + snd_ak4641_power_off(ak); | ||
| 1430 | + snd_ak4641_unlock(ak); | ||
| 1431 | +} | ||
| 1432 | + | ||
| 1433 | +int snd_ak4641_add_mixer_controls(struct snd_ak4641 *ak, struct snd_card *card) | ||
| 1434 | +{ | ||
| 1435 | + snd_ak4641_lock(ak); | ||
| 1436 | + snd_ctl_add(card, snd_ctl_new1(&snd_ak4641_actl_playback_volume, ak)); | ||
| 1437 | + snd_ctl_add(card, snd_ctl_new1(&snd_ak4641_actl_playback_switch, ak)); | ||
| 1438 | + snd_ctl_add(card, snd_ctl_new1(&snd_ak4641_actl_mic_gain, ak)); | ||
| 1439 | + snd_ctl_add(card, snd_ctl_new1(&snd_ak4641_actl_mic_boost, ak)); | ||
| 1440 | + snd_ctl_add(card, snd_ctl_new1(&snd_ak4641_actl_mono_out, ak)); | ||
| 1441 | + snd_ak4641_unlock(ak); | ||
| 1442 | + return 0; | ||
| 1443 | +} | ||
| 1444 | + | ||
| 1445 | +/* end {{ Codec Control }} */ | ||
| 1446 | + | ||
| 1447 | + | ||
| 1448 | +/* begin {{ Module }} */ | ||
| 1449 | + | ||
| 1450 | +static int __init snd_ak4641_module_on_load(void) | ||
| 1451 | +{ | ||
| 1452 | + snd_ak4641_i2c_init(); | ||
| 1453 | + return 0; | ||
| 1454 | +} | ||
| 1455 | + | ||
| 1456 | +static void __exit snd_ak4641_module_on_unload(void) | ||
| 1457 | +{ | ||
| 1458 | + snd_ak4641_i2c_free(); | ||
| 1459 | +} | ||
| 1460 | + | ||
| 1461 | +module_init(snd_ak4641_module_on_load); | ||
| 1462 | +module_exit(snd_ak4641_module_on_unload); | ||
| 1463 | + | ||
| 1464 | +EXPORT_SYMBOL(snd_ak4641_activate); | ||
| 1465 | +EXPORT_SYMBOL(snd_ak4641_deactivate); | ||
| 1466 | +EXPORT_SYMBOL(snd_ak4641_add_mixer_controls); | ||
| 1467 | +EXPORT_SYMBOL(snd_ak4641_open_stream); | ||
| 1468 | +EXPORT_SYMBOL(snd_ak4641_close_stream); | ||
| 1469 | +EXPORT_SYMBOL(snd_ak4641_suspend); | ||
| 1470 | +EXPORT_SYMBOL(snd_ak4641_resume); | ||
| 1471 | +EXPORT_SYMBOL(snd_ak4641_hp_connected); | ||
| 1472 | +EXPORT_SYMBOL(snd_ak4641_hp_detected); | ||
| 1473 | + | ||
| 1474 | +MODULE_AUTHOR("Giorgio Padrin"); | ||
| 1475 | +MODULE_DESCRIPTION("Audio support for codec Asahi Kasei AK4641"); | ||
| 1476 | +MODULE_LICENSE("GPL"); | ||
| 1477 | + | ||
| 1478 | +/* end {{ Module }} */ | ||
| 1479 | Index: linux-2.6.26-rc4/arch/arm/mach-pxa/htcuniversal/htcuniversal_ak4641.h | ||
| 1480 | =================================================================== | ||
| 1481 | --- /dev/null 1970-01-01 00:00:00.000000000 +0000 | ||
| 1482 | +++ linux-2.6.26-rc4/arch/arm/mach-pxa/htcuniversal/htcuniversal_ak4641.h 2008-06-01 18:49:45.000000000 +0100 | ||
| 1483 | @@ -0,0 +1,65 @@ | ||
| 1484 | +/* | ||
| 1485 | + * Audio support for codec Asahi Kasei AK4641 | ||
| 1486 | + * | ||
| 1487 | + * This program is free software; you can redistribute it and/or modify | ||
| 1488 | + * it under the terms of the GNU General Public License version 2 as | ||
| 1489 | + * published by the Free Software Foundation. | ||
| 1490 | + * | ||
| 1491 | + * Copyright (c) 2006 Giorgio Padrin <giorgio@mandarinlogiq.org> | ||
| 1492 | + */ | ||
| 1493 | + | ||
| 1494 | +#ifndef __SOUND_AK4641_H | ||
| 1495 | +#define __SOUND_AK4641_H | ||
| 1496 | + | ||
| 1497 | +#include <linux/i2c.h> | ||
| 1498 | + | ||
| 1499 | +struct snd_ak4641 { | ||
| 1500 | + struct semaphore sem; | ||
| 1501 | + | ||
| 1502 | + u8 regs[0x14]; /* registers cache */ | ||
| 1503 | + | ||
| 1504 | + unsigned int | ||
| 1505 | + powered_on:1, | ||
| 1506 | + playback_on:1, | ||
| 1507 | + playback_stream_opened:1, | ||
| 1508 | + capture_on:1, | ||
| 1509 | + capture_stream_opened:1; | ||
| 1510 | + | ||
| 1511 | + unsigned int | ||
| 1512 | + hp_connected:1; | ||
| 1513 | + | ||
| 1514 | + /* -- configuration (to fill before activation) -- */ | ||
| 1515 | + void (*power_on_chip)(int on); | ||
| 1516 | + void (*reset_pin)(int on); | ||
| 1517 | + void (*headphone_out_on)(int on); | ||
| 1518 | + void (*speaker_out_on)(int on); | ||
| 1519 | + | ||
| 1520 | + struct i2c_client i2c_client; /* to fill .adapter */ | ||
| 1521 | + /* ----------------------------------------------- */ | ||
| 1522 | + | ||
| 1523 | + struct { | ||
| 1524 | + int detected; | ||
| 1525 | + struct workqueue_struct *wq; | ||
| 1526 | + struct work_struct w; | ||
| 1527 | + } hp_detected; | ||
| 1528 | +}; | ||
| 1529 | + | ||
| 1530 | + | ||
| 1531 | +/* Note: opening, closing, suspending and resuming a stream | ||
| 1532 | + * require the clocks (MCLK and I2S ones) running | ||
| 1533 | + */ | ||
| 1534 | + | ||
| 1535 | +/* don't forget to specify I2C adapter in i2c_client field */ | ||
| 1536 | +int snd_ak4641_activate(struct snd_ak4641 *ak); | ||
| 1537 | + | ||
| 1538 | +void snd_ak4641_deactivate(struct snd_ak4641 *ak); | ||
| 1539 | +int snd_ak4641_add_mixer_controls(struct snd_ak4641 *ak, struct snd_card *card); | ||
| 1540 | +int snd_ak4641_open_stream(struct snd_ak4641 *ak, int stream); | ||
| 1541 | +int snd_ak4641_close_stream(struct snd_ak4641 *ak, int stream); | ||
| 1542 | +int snd_ak4641_suspend(struct snd_ak4641 *ak, pm_message_t state); | ||
| 1543 | +int snd_ak4641_resume(struct snd_ak4641 *ak); | ||
| 1544 | + | ||
| 1545 | +void snd_ak4641_hp_connected(struct snd_ak4641 *ak, int connected); /* non atomic context */ | ||
| 1546 | +void snd_ak4641_hp_detected(struct snd_ak4641 *ak, int detected); /* atomic context */ | ||
| 1547 | + | ||
| 1548 | +#endif /* __SOUND_AK4641_H */ | ||
| 1549 | Index: linux-2.6.26-rc4/arch/arm/mach-pxa/htcuniversal/htcuniversal_asic3_leds.c | ||
| 1550 | =================================================================== | ||
| 1551 | --- /dev/null 1970-01-01 00:00:00.000000000 +0000 | ||
| 1552 | +++ linux-2.6.26-rc4/arch/arm/mach-pxa/htcuniversal/htcuniversal_asic3_leds.c 2008-06-01 18:49:45.000000000 +0100 | ||
| 1553 | @@ -0,0 +1,143 @@ | ||
| 1554 | +/* | ||
| 1555 | + * LEDs support for the HP iPaq hx4700 | ||
| 1556 | + * | ||
| 1557 | + * Copyright (c) 2006 Anton Vorontsov <cbou@mail.ru> | ||
| 1558 | + * | ||
| 1559 | + * This file is subject to the terms and conditions of the GNU General Public | ||
| 1560 | + * License. See the file COPYING in the main directory of this archive for | ||
| 1561 | + * more details. | ||
| 1562 | + * | ||
| 1563 | + */ | ||
| 1564 | + | ||
| 1565 | +#include <linux/kernel.h> | ||
| 1566 | +#include <linux/init.h> | ||
| 1567 | +#include <linux/platform_device.h> | ||
| 1568 | +#include <linux/leds.h> | ||
| 1569 | +#include <linux/soc/asic3_base.h> | ||
| 1570 | + | ||
| 1571 | +#include <asm/hardware/ipaq-asic3.h> | ||
| 1572 | +#include <asm/mach-types.h> | ||
| 1573 | +#include <asm/hardware/asic3_leds.h> | ||
| 1574 | +#include <asm/arch/htcuniversal-asic.h> | ||
| 1575 | + | ||
| 1576 | +//FIXME | ||
| 1577 | +//DEFINE_LED_TRIGGER_SHARED_GLOBAL(htcuniversal_radio_trig); | ||
| 1578 | +//EXPORT_LED_TRIGGER_SHARED(htcuniversal_radio_trig); | ||
| 1579 | + | ||
| 1580 | +static struct asic3_led htcuniversal_leds[] = { | ||
| 1581 | + { | ||
| 1582 | + .led_cdev = { | ||
| 1583 | + .name = "htcuniversal:red", | ||
| 1584 | + .default_trigger = "htcuniversal-charging", | ||
| 1585 | + }, | ||
| 1586 | + .hw_num = 2, | ||
| 1587 | + | ||
| 1588 | + }, | ||
| 1589 | + { | ||
| 1590 | + .led_cdev = { | ||
| 1591 | + .name = "htcuniversal:green", | ||
| 1592 | + .default_trigger = "htcuniversal-chargefull", | ||
| 1593 | + }, | ||
| 1594 | + .hw_num = 1, | ||
| 1595 | + }, | ||
| 1596 | + { | ||
| 1597 | + .led_cdev = { | ||
| 1598 | + .name = "htcuniversal:wifi-bt", | ||
| 1599 | + .default_trigger = "htcuniversal-radio", | ||
| 1600 | + }, | ||
| 1601 | + .hw_num = 0, | ||
| 1602 | + }, | ||
| 1603 | + { | ||
| 1604 | + .led_cdev = { | ||
| 1605 | + .name = "htcuniversal:phonebuttons", | ||
| 1606 | + .default_trigger = "htcuniversal-phonebuttons", | ||
| 1607 | + }, | ||
| 1608 | + .hw_num = -1, | ||
| 1609 | + .gpio_num = ('D'-'A')*16+GPIOD_BL_KEYP_PWR_ON, | ||
| 1610 | + }, | ||
| 1611 | + { | ||
| 1612 | + .led_cdev = { | ||
| 1613 | + .name = "htcuniversal:vibra", | ||
| 1614 | + .default_trigger = "htcuniversal-vibra", | ||
| 1615 | + }, | ||
| 1616 | + .hw_num = -1, | ||
| 1617 | + .gpio_num = ('D'-'A')*16+GPIOD_VIBRA_PWR_ON, | ||
| 1618 | + }, | ||
| 1619 | + { | ||
| 1620 | + .led_cdev = { | ||
| 1621 | + .name = "htcuniversal:flashlight1", | ||
| 1622 | + .default_trigger = "htcuniversal-flashlight1", | ||
| 1623 | + }, | ||
| 1624 | + .hw_num = -1, | ||
| 1625 | + .gpio_num = ('A'-'A')*16+GPIOA_FLASHLIGHT, | ||
| 1626 | + }, | ||
| 1627 | + { | ||
| 1628 | + .led_cdev = { | ||
| 1629 | + .name = "htcuniversal:kbdbacklight", | ||
| 1630 | + .default_trigger = "htcuniversal-kbdbacklight", | ||
| 1631 | + }, | ||
| 1632 | + .hw_num = -1, | ||
| 1633 | + .gpio_num = ('D'-'A')*16+GPIOD_BL_KEYB_PWR_ON, | ||
| 1634 | + }, | ||
| 1635 | +}; | ||
| 1636 | + | ||
| 1637 | +void htcuniversal_leds_release(struct device *dev) | ||
| 1638 | +{ | ||
| 1639 | + return; | ||
| 1640 | +} | ||
| 1641 | + | ||
| 1642 | +static | ||
| 1643 | +struct asic3_leds_machinfo htcuniversal_leds_machinfo = { | ||
| 1644 | + .num_leds = ARRAY_SIZE(htcuniversal_leds), | ||
| 1645 | + .leds = htcuniversal_leds, | ||
| 1646 | + .asic3_pdev = &htcuniversal_asic3, | ||
| 1647 | +}; | ||
| 1648 | + | ||
| 1649 | +static | ||
| 1650 | +struct platform_device htcuniversal_leds_pdev = { | ||
| 1651 | + .name = "asic3-leds", | ||
| 1652 | + .dev = { | ||
| 1653 | + .platform_data = &htcuniversal_leds_machinfo, | ||
| 1654 | + .release = htcuniversal_leds_release, | ||
| 1655 | + }, | ||
| 1656 | +}; | ||
| 1657 | + | ||
| 1658 | +static | ||
| 1659 | +int __init htcuniversal_leds_init(void) | ||
| 1660 | +{ | ||
| 1661 | + int ret; | ||
| 1662 | + printk("htcuniversal LEDs Driver\n"); | ||
| 1663 | +// led_trigger_register_shared("htcuniversal-radio", &htcuniversal_radio_trig); | ||
| 1664 | + | ||
| 1665 | + ret = asic3_leds_register(); | ||
| 1666 | + if (ret) goto asic3_leds_failed; | ||
| 1667 | + | ||
| 1668 | + ret = platform_device_register(&htcuniversal_leds_pdev); | ||
| 1669 | + if (ret) goto platform_device_failed; | ||
| 1670 | + | ||
| 1671 | + goto success; | ||
| 1672 | + | ||
| 1673 | +platform_device_failed: | ||
| 1674 | + asic3_leds_unregister(); | ||
| 1675 | +asic3_leds_failed: | ||
| 1676 | +// led_trigger_unregister_shared(htcuniversal_radio_trig); | ||
| 1677 | + printk("htcuniversal LEDs Driver failed to init"); | ||
| 1678 | +success: | ||
| 1679 | + return ret; | ||
| 1680 | +} | ||
| 1681 | + | ||
| 1682 | +static | ||
| 1683 | +void __exit htcuniversal_leds_exit(void) | ||
| 1684 | +{ | ||
| 1685 | +// led_trigger_unregister_shared(htcuniversal_radio_trig); | ||
| 1686 | + platform_device_unregister(&htcuniversal_leds_pdev); | ||
| 1687 | + asic3_leds_unregister(); | ||
| 1688 | + return; | ||
| 1689 | +} | ||
| 1690 | + | ||
| 1691 | +module_init(htcuniversal_leds_init); | ||
| 1692 | +module_exit(htcuniversal_leds_exit); | ||
| 1693 | + | ||
| 1694 | +MODULE_AUTHOR("Anton Vorontsov <cbou@mail.ru>"); | ||
| 1695 | +MODULE_DESCRIPTION("htcuniversal LEDs driver"); | ||
| 1696 | +MODULE_LICENSE("GPL"); | ||
| 1697 | Index: linux-2.6.26-rc4/arch/arm/mach-pxa/htcuniversal/htcuniversal_bl.c | ||
| 1698 | =================================================================== | ||
| 1699 | --- /dev/null 1970-01-01 00:00:00.000000000 +0000 | ||
| 1700 | +++ linux-2.6.26-rc4/arch/arm/mach-pxa/htcuniversal/htcuniversal_bl.c 2008-06-01 18:49:45.000000000 +0100 | ||
| 1701 | @@ -0,0 +1,61 @@ | ||
| 1702 | +/* | ||
| 1703 | + * Use consistent with the GNU GPL is permitted, | ||
| 1704 | + * provided that this copyright notice is | ||
| 1705 | + * preserved in its entirety in all copies and derived works. | ||
| 1706 | + * | ||
| 1707 | + * Copyright (C) 2006 Paul Sokolosvky | ||
| 1708 | + * Based on code from older versions of htcuniversal_lcd.c | ||
| 1709 | + * | ||
| 1710 | + */ | ||
| 1711 | + | ||
| 1712 | +#include <linux/types.h> | ||
| 1713 | +#include <linux/platform_device.h> | ||
| 1714 | +#include <asm/arch/hardware.h> /* for pxa-regs.h (__REG) */ | ||
| 1715 | +#include <asm/arch/pxa-regs.h> | ||
| 1716 | +#include <asm/mach-types.h> /* machine_is_htcuniversal */ | ||
| 1717 | +//#include <linux/corgi_bl.h> | ||
| 1718 | +#include <linux/backlight.h> | ||
| 1719 | +#include <linux/err.h> | ||
| 1720 | + | ||
| 1721 | +#include <asm/arch/htcuniversal-gpio.h> | ||
| 1722 | +#include <asm/arch/htcuniversal-asic.h> | ||
| 1723 | +#include <asm/hardware/ipaq-asic3.h> | ||
| 1724 | +#include <linux/soc/asic3_base.h> | ||
| 1725 | + | ||
| 1726 | +#define HTCUNIVERSAL_MAX_INTENSITY 0xc7 | ||
| 1727 | + | ||
| 1728 | +static void htcuniversal_set_bl_intensity(int intensity) | ||
| 1729 | +{ | ||
| 1730 | + PWM_CTRL1 = 1; /* pre-scaler */ | ||
| 1731 | + PWM_PWDUTY1 = intensity; /* duty cycle */ | ||
| 1732 | + PWM_PERVAL1 = HTCUNIVERSAL_MAX_INTENSITY+1; /* period */ | ||
| 1733 | + | ||
| 1734 | + if (intensity > 0) { | ||
| 1735 | + pxa_set_cken(CKEN_PWM1, 1); | ||
| 1736 | + asic3_set_gpio_out_d(&htcuniversal_asic3.dev, | ||
| 1737 | + (1<<GPIOD_FL_PWR_ON), (1<<GPIOD_FL_PWR_ON)); | ||
| 1738 | + } else { | ||
| 1739 | + pxa_set_cken(CKEN_PWM1, 0); | ||
| 1740 | + asic3_set_gpio_out_d(&htcuniversal_asic3.dev, | ||
| 1741 | + (1<<GPIOD_FL_PWR_ON), 0); | ||
| 1742 | + } | ||
| 1743 | +} | ||
| 1744 | + | ||
| 1745 | + | ||
| 1746 | +static struct generic_bl_info htcuniversal_bl_machinfo = { | ||
| 1747 | + .default_intensity = HTCUNIVERSAL_MAX_INTENSITY / 4, | ||
| 1748 | + .limit_mask = 0xff, | ||
| 1749 | + .max_intensity = HTCUNIVERSAL_MAX_INTENSITY, | ||
| 1750 | + .set_bl_intensity = htcuniversal_set_bl_intensity, | ||
| 1751 | +}; | ||
| 1752 | + | ||
| 1753 | +struct platform_device htcuniversal_bl = { | ||
| 1754 | + .name = "corgi-bl", | ||
| 1755 | + .dev = { | ||
| 1756 | + .platform_data = &htcuniversal_bl_machinfo, | ||
| 1757 | + }, | ||
| 1758 | +}; | ||
| 1759 | + | ||
| 1760 | +MODULE_AUTHOR("Paul Sokolovsky <pmiscml@gmail.com>"); | ||
| 1761 | +MODULE_DESCRIPTION("Backlight driver for HTC Universal"); | ||
| 1762 | +MODULE_LICENSE("GPL"); | ||
| 1763 | Index: linux-2.6.26-rc4/arch/arm/mach-pxa/htcuniversal/htcuniversal_bt.c | ||
| 1764 | =================================================================== | ||
| 1765 | --- /dev/null 1970-01-01 00:00:00.000000000 +0000 | ||
| 1766 | +++ linux-2.6.26-rc4/arch/arm/mach-pxa/htcuniversal/htcuniversal_bt.c 2008-06-01 18:49:45.000000000 +0100 | ||
| 1767 | @@ -0,0 +1,135 @@ | ||
| 1768 | +/* Bluetooth interface driver for TI BRF6150 on HX4700 | ||
| 1769 | + * | ||
| 1770 | + * Copyright (c) 2005 SDG Systems, LLC | ||
| 1771 | + * | ||
| 1772 | + * 2005-04-21 Todd Blumer Created. | ||
| 1773 | + */ | ||
| 1774 | + | ||
| 1775 | +#include <linux/module.h> | ||
| 1776 | +#include <linux/kernel.h> | ||
| 1777 | +#include <linux/delay.h> | ||
| 1778 | +#include <linux/platform_device.h> | ||
| 1779 | +#include <linux/soc/asic3_base.h> | ||
| 1780 | + | ||
| 1781 | +#include <asm/hardware.h> | ||
| 1782 | +#include <asm/arch/serial.h> | ||
| 1783 | +#include <asm/hardware/ipaq-asic3.h> | ||
| 1784 | +#include <asm/arch/htcuniversal-gpio.h> | ||
| 1785 | +#include <asm/arch/htcuniversal-asic.h> | ||
| 1786 | + | ||
| 1787 | +#include "htcuniversal_bt.h" | ||
| 1788 | + | ||
| 1789 | +static uint use_led=1; | ||
| 1790 | + | ||
| 1791 | +static void | ||
| 1792 | +htcuniversal_bt_configure( int state ) | ||
| 1793 | +{ | ||
| 1794 | + int tries; | ||
| 1795 | + | ||
| 1796 | + printk( KERN_NOTICE "htcuniversal configure bluetooth: %d\n", state ); | ||
| 1797 | + switch (state) { | ||
| 1798 | + | ||
| 1799 | + case PXA_UART_CFG_PRE_STARTUP: | ||
| 1800 | + break; | ||
| 1801 | + | ||
| 1802 | + case PXA_UART_CFG_POST_STARTUP: | ||
| 1803 | + /* pre-serial-up hardware configuration */ | ||
| 1804 | + htcuniversal_egpio_enable(1<<EGPIO5_BT_3V3_ON); | ||
| 1805 | + mdelay(50); | ||
| 1806 | + asic3_set_gpio_out_c(&htcuniversal_asic3.dev, 1<<GPIOC_BT_PWR_ON, 1<<GPIOC_BT_PWR_ON); | ||
| 1807 | + mdelay(10); | ||
| 1808 | + asic3_set_gpio_out_c(&htcuniversal_asic3.dev, 1<<GPIOC_BT_RESET, 0); | ||
| 1809 | + mdelay(10); | ||
| 1810 | + asic3_set_gpio_out_c(&htcuniversal_asic3.dev, 1<<GPIOC_BT_RESET, 1<<GPIOC_BT_RESET); | ||
| 1811 | + mdelay(10); | ||
| 1812 | + | ||
| 1813 | + /* | ||
| 1814 | + * BRF6150's RTS goes low when firmware is ready | ||
| 1815 | + * so check for CTS=1 (nCTS=0 -> CTS=1). Typical 150ms | ||
| 1816 | + */ | ||
| 1817 | + tries = 0; | ||
| 1818 | + do { | ||
| 1819 | + mdelay(10); | ||
| 1820 | + } while ((BTMSR & MSR_CTS) == 0 && tries++ < 50); | ||
| 1821 | + if (use_led) { | ||
| 1822 | +// htcuniversal_set_led(2, 16, 16); | ||
| 1823 | + } | ||
| 1824 | + break; | ||
| 1825 | + | ||
| 1826 | + case PXA_UART_CFG_PRE_SHUTDOWN: | ||
| 1827 | + htcuniversal_egpio_disable(1<<EGPIO5_BT_3V3_ON ); | ||
| 1828 | + mdelay(50); | ||
| 1829 | +// htcuniversal_clear_led(2); | ||
| 1830 | + asic3_set_gpio_out_c(&htcuniversal_asic3.dev, 1<<GPIOC_BT_PWR_ON, 0); | ||
| 1831 | + break; | ||
| 1832 | + | ||
| 1833 | + default: | ||
| 1834 | + break; | ||
| 1835 | + } | ||
| 1836 | +} | ||
| 1837 | + | ||
| 1838 | + | ||
| 1839 | +static int | ||
| 1840 | +htcuniversal_bt_probe( struct platform_device *dev ) | ||
| 1841 | +{ | ||
| 1842 | + struct htcuniversal_bt_funcs *funcs = dev->dev.platform_data; | ||
| 1843 | + | ||
| 1844 | + /* configure bluetooth UART */ | ||
| 1845 | + pxa_gpio_mode( GPIO_NR_HTCUNIVERSAL_BT_RXD_MD ); | ||
| 1846 | + pxa_gpio_mode( GPIO_NR_HTCUNIVERSAL_BT_TXD_MD ); | ||
| 1847 | + pxa_gpio_mode( GPIO_NR_HTCUNIVERSAL_BT_UART_CTS_MD ); | ||
| 1848 | + pxa_gpio_mode( GPIO_NR_HTCUNIVERSAL_BT_UART_RTS_MD ); | ||
| 1849 | + | ||
| 1850 | + funcs->configure = htcuniversal_bt_configure; | ||
| 1851 | + | ||
| 1852 | + /* Make sure the LED is off */ | ||
| 1853 | +// htcuniversal_clear_led(2); | ||
| 1854 | + | ||
| 1855 | + return 0; | ||
| 1856 | +} | ||
| 1857 | + | ||
| 1858 | +static int | ||
| 1859 | +htcuniversal_bt_remove( struct platform_device *dev ) | ||
| 1860 | +{ | ||
| 1861 | + struct htcuniversal_bt_funcs *funcs = dev->dev.platform_data; | ||
| 1862 | + | ||
| 1863 | + funcs->configure = NULL; | ||
| 1864 | + | ||
| 1865 | + /* Make sure the LED is off */ | ||
| 1866 | +// htcuniversal_clear_led(2); | ||
| 1867 | + | ||
| 1868 | + return 0; | ||
| 1869 | +} | ||
| 1870 | + | ||
| 1871 | +static struct platform_driver bt_driver = { | ||
| 1872 | + .driver = { | ||
| 1873 | + .name = "htcuniversal_bt", | ||
| 1874 | + }, | ||
| 1875 | + .probe = htcuniversal_bt_probe, | ||
| 1876 | + .remove = htcuniversal_bt_remove, | ||
| 1877 | +}; | ||
| 1878 | + | ||
| 1879 | +module_param(use_led, uint, 0); | ||
| 1880 | + | ||
| 1881 | +static int __init | ||
| 1882 | +htcuniversal_bt_init( void ) | ||
| 1883 | +{ | ||
| 1884 | + printk(KERN_NOTICE "htcuniversal Bluetooth Driver\n"); | ||
| 1885 | + return platform_driver_register( &bt_driver ); | ||
| 1886 | +} | ||
| 1887 | + | ||
| 1888 | +static void __exit | ||
| 1889 | +htcuniversal_bt_exit( void ) | ||
| 1890 | +{ | ||
| 1891 | + platform_driver_unregister( &bt_driver ); | ||
| 1892 | +} | ||
| 1893 | + | ||
| 1894 | +module_init( htcuniversal_bt_init ); | ||
| 1895 | +module_exit( htcuniversal_bt_exit ); | ||
| 1896 | + | ||
| 1897 | +MODULE_AUTHOR("Todd Blumer, SDG Systems, LLC"); | ||
| 1898 | +MODULE_DESCRIPTION("HTC Universal Bluetooth Support Driver"); | ||
| 1899 | +MODULE_LICENSE("GPL"); | ||
| 1900 | + | ||
| 1901 | +/* vim600: set noexpandtab sw=8 ts=8 :*/ | ||
| 1902 | + | ||
| 1903 | Index: linux-2.6.26-rc4/arch/arm/mach-pxa/htcuniversal/htcuniversal_bt.h | ||
| 1904 | =================================================================== | ||
| 1905 | --- /dev/null 1970-01-01 00:00:00.000000000 +0000 | ||
| 1906 | +++ linux-2.6.26-rc4/arch/arm/mach-pxa/htcuniversal/htcuniversal_bt.h 2008-06-01 18:49:45.000000000 +0100 | ||
| 1907 | @@ -0,0 +1,17 @@ | ||
| 1908 | +/* | ||
| 1909 | + * Bluetooth support file for calling bluetooth configuration functions | ||
| 1910 | + * | ||
| 1911 | + * Copyright (c) 2005 SDG Systems, LLC | ||
| 1912 | + * | ||
| 1913 | + * 2005-06 Todd Blumer Initial Revision | ||
| 1914 | + */ | ||
| 1915 | + | ||
| 1916 | +#ifndef _HTCUNIVERSAL_BT_H | ||
| 1917 | +#define _HTCUNIVERSAL_BT_H | ||
| 1918 | + | ||
| 1919 | +struct htcuniversal_bt_funcs { | ||
| 1920 | + void (*configure) ( int state ); | ||
| 1921 | +}; | ||
| 1922 | + | ||
| 1923 | + | ||
| 1924 | +#endif | ||
| 1925 | Index: linux-2.6.26-rc4/arch/arm/mach-pxa/htcuniversal/htcuniversal_buttons.c | ||
| 1926 | =================================================================== | ||
| 1927 | --- /dev/null 1970-01-01 00:00:00.000000000 +0000 | ||
| 1928 | +++ linux-2.6.26-rc4/arch/arm/mach-pxa/htcuniversal/htcuniversal_buttons.c 2008-06-01 18:49:45.000000000 +0100 | ||
| 1929 | @@ -0,0 +1,87 @@ | ||
| 1930 | +/* | ||
| 1931 | + * Buttons driver for HTC Universal | ||
| 1932 | + * | ||
| 1933 | + * This file is subject to the terms and conditions of the GNU General Public | ||
| 1934 | + * License. | ||
| 1935 | + * | ||
| 1936 | + * Copyright (C) 2005 Pawel Kolodziejski | ||
| 1937 | + * Copyright (C) 2003 Joshua Wise | ||
| 1938 | + * | ||
| 1939 | + */ | ||
| 1940 | + | ||
| 1941 | +#include <linux/input.h> | ||
| 1942 | +#include <linux/input_pda.h> | ||
| 1943 | +#include <linux/module.h> | ||
| 1944 | +#include <linux/init.h> | ||
| 1945 | +#include <linux/interrupt.h> | ||
| 1946 | +#include <linux/irq.h> | ||
| 1947 | +#include <linux/platform_device.h> | ||
| 1948 | +#include <linux/gpio_keys.h> | ||
| 1949 | +#include <linux/soc/asic3_base.h> | ||
| 1950 | +#include <asm/mach-types.h> | ||
| 1951 | +#include <asm/hardware/asic3_keys.h> | ||
| 1952 | +#include <asm/arch/htcuniversal-gpio.h> | ||
| 1953 | +#include <asm/arch/htcuniversal-asic.h> | ||
| 1954 | + | ||
| 1955 | +static struct asic3_keys_button asic3_buttons[] = { | ||
| 1956 | +//{KEY_SCREEN, ASIC3_GPIOA_IRQ_BASE+GPIOA_COVER_ROTATE_N, 1, "screen_cover", EV_SW}, | ||
| 1957 | +//{KEY_SWITCHVIDEOMODE, ASIC3_GPIOB_IRQ_BASE+GPIOB_CLAMSHELL_N, 1, "clamshell_rotate", EV_SW}, | ||
| 1958 | +//{KEY_KBDILLUMTOGGLE, ASIC3_GPIOB_IRQ_BASE+GPIOB_NIGHT_SENSOR, 1, "night_sensor", EV_SW}, | ||
| 1959 | +{SW_LID, ASIC3_GPIOA_IRQ_BASE+GPIOA_COVER_ROTATE_N, 1, "screen_cover", EV_SW}, | ||
| 1960 | +{SW_TABLET_MODE, ASIC3_GPIOB_IRQ_BASE+GPIOB_CLAMSHELL_N, 1, "clamshell_rotate", EV_SW}, | ||
| 1961 | +//{SW_NIGHT_SENSOR, ASIC3_GPIOB_IRQ_BASE+GPIOB_NIGHT_SENSOR, 1, "night_sensor", EV_SW}, | ||
| 1962 | +{KEY_F10, ASIC3_GPIOA_IRQ_BASE+GPIOA_BUTTON_BACKLIGHT_N, 1, "backlight_button"}, | ||
| 1963 | +{KEY_RECORD, ASIC3_GPIOA_IRQ_BASE+GPIOA_BUTTON_RECORD_N, 1, "record_button"}, | ||
| 1964 | +{KEY_CAMERA, ASIC3_GPIOA_IRQ_BASE+GPIOA_BUTTON_CAMERA_N, 1, "camera_button"}, | ||
| 1965 | +{KEY_VOLUMEDOWN, ASIC3_GPIOA_IRQ_BASE+GPIOA_VOL_UP_N, 1, "volume_slider_down"}, | ||
| 1966 | +{KEY_VOLUMEUP, ASIC3_GPIOA_IRQ_BASE+GPIOA_VOL_DOWN_N, 1, "volume_slider_up"}, | ||
| 1967 | +{KEY_KPENTER, ASIC3_GPIOD_IRQ_BASE+GPIOD_KEY_OK_N, 1, "select"}, | ||
| 1968 | +{KEY_RIGHT, ASIC3_GPIOD_IRQ_BASE+GPIOD_KEY_RIGHT_N, 1, "right"}, | ||
| 1969 | +{KEY_LEFT, ASIC3_GPIOD_IRQ_BASE+GPIOD_KEY_LEFT_N, 1, "left"}, | ||
| 1970 | +{KEY_DOWN, ASIC3_GPIOD_IRQ_BASE+GPIOD_KEY_DOWN_N, 1, "down"}, | ||
| 1971 | +{KEY_UP, ASIC3_GPIOD_IRQ_BASE+GPIOD_KEY_UP_N, 1, "up"}, | ||
| 1972 | +}; | ||
| 1973 | + | ||
| 1974 | +static struct asic3_keys_platform_data asic3_keys_data = { | ||
| 1975 | + .buttons = asic3_buttons, | ||
| 1976 | + .nbuttons = ARRAY_SIZE(asic3_buttons), | ||
| 1977 | + .asic3_dev = &htcuniversal_asic3.dev, | ||
| 1978 | +}; | ||
| 1979 | + | ||
| 1980 | +static struct platform_device htcuniversal_keys_asic3 = { | ||
| 1981 | + .name = "asic3-keys", | ||
| 1982 | + .dev = { .platform_data = &asic3_keys_data, } | ||
| 1983 | +}; | ||
| 1984 | + | ||
| 1985 | +static int __init htcuniversal_buttons_probe(struct platform_device *dev) | ||
| 1986 | +{ | ||
| 1987 | + platform_device_register(&htcuniversal_keys_asic3); | ||
| 1988 | + return 0; | ||
| 1989 | +} | ||
| 1990 | + | ||
| 1991 | +static struct platform_driver htcuniversal_buttons_driver = { | ||
| 1992 | + .driver = { | ||
| 1993 | + .name = "htcuniversal_buttons", | ||
| 1994 | + }, | ||
| 1995 | + .probe = htcuniversal_buttons_probe, | ||
| 1996 | +}; | ||
| 1997 | + | ||
| 1998 | +static int __init htcuniversal_buttons_init(void) | ||
| 1999 | +{ | ||
| 2000 | + if (!machine_is_htcuniversal()) | ||
| 2001 | + return -ENODEV; | ||
| 2002 | + | ||
| 2003 | + return platform_driver_register(&htcuniversal_buttons_driver); | ||
| 2004 | +} | ||
| 2005 | + | ||
| 2006 | +static void __exit htcuniversal_buttons_exit(void) | ||
| 2007 | +{ | ||
| 2008 | + platform_driver_unregister(&htcuniversal_buttons_driver); | ||
| 2009 | +} | ||
| 2010 | + | ||
| 2011 | +module_init(htcuniversal_buttons_init); | ||
| 2012 | +module_exit(htcuniversal_buttons_exit); | ||
| 2013 | + | ||
| 2014 | +MODULE_AUTHOR ("Joshua Wise, Pawel Kolodziejski, Paul Sokolosvky"); | ||
| 2015 | +MODULE_DESCRIPTION ("Buttons support for HTC Universal"); | ||
| 2016 | +MODULE_LICENSE ("GPL"); | ||
| 2017 | Index: linux-2.6.26-rc4/arch/arm/mach-pxa/htcuniversal/htcuniversal_core.c | ||
| 2018 | =================================================================== | ||
| 2019 | --- /dev/null 1970-01-01 00:00:00.000000000 +0000 | ||
| 2020 | +++ linux-2.6.26-rc4/arch/arm/mach-pxa/htcuniversal/htcuniversal_core.c 2008-06-01 18:49:45.000000000 +0100 | ||
| 2021 | @@ -0,0 +1,226 @@ | ||
| 2022 | +/* Core Hardware driver for Hx4700 (Serial, ASIC3, EGPIOs) | ||
| 2023 | + * | ||
| 2024 | + * Copyright (c) 2005 SDG Systems, LLC | ||
| 2025 | + * | ||
| 2026 | + * 2005-03-29 Todd Blumer Converted basic structure to support hx4700 | ||
| 2027 | + * 2005-04-30 Todd Blumer Add IRDA code from H2200 | ||
| 2028 | + */ | ||
| 2029 | + | ||
| 2030 | +#include <linux/module.h> | ||
| 2031 | +#include <linux/version.h> | ||
| 2032 | +#include <linux/interrupt.h> | ||
| 2033 | +#include <linux/platform_device.h> | ||
| 2034 | +#include <linux/delay.h> | ||
| 2035 | +#include <linux/pm.h> | ||
| 2036 | +#include <linux/irq.h> | ||
| 2037 | + | ||
| 2038 | +#include <asm/io.h> | ||
| 2039 | +#include <asm/mach/irq.h> | ||
| 2040 | +#include <asm/arch/pxa-regs.h> | ||
| 2041 | +#include <asm/arch/pxa-pm_ll.h> | ||
| 2042 | +#include <asm/arch/htcuniversal-gpio.h> | ||
| 2043 | +#include <asm/arch/htcuniversal-asic.h> | ||
| 2044 | + | ||
| 2045 | +#include <linux/soc/asic3_base.h> | ||
| 2046 | +#include <asm/hardware/ipaq-asic3.h> | ||
| 2047 | + | ||
| 2048 | +volatile u_int16_t *egpios; | ||
| 2049 | +u_int16_t egpio_reg; | ||
| 2050 | + | ||
| 2051 | +static int htc_bootloader = 0; /* Is the stock HTC bootloader installed? */ | ||
| 2052 | + | ||
| 2053 | +/* | ||
| 2054 | + * may make sense to put egpios elsewhere, but they're here now | ||
| 2055 | + * since they share some of the same address space with the TI WLAN | ||
| 2056 | + * | ||
| 2057 | + * EGPIO register is write-only | ||
| 2058 | + */ | ||
| 2059 | + | ||
| 2060 | +void | ||
| 2061 | +htcuniversal_egpio_enable( u_int16_t bits ) | ||
| 2062 | +{ | ||
| 2063 | + unsigned long flags; | ||
| 2064 | + | ||
| 2065 | + local_irq_save(flags); | ||
| 2066 | + | ||
| 2067 | + egpio_reg |= bits; | ||
| 2068 | + *egpios = egpio_reg; | ||
| 2069 | + | ||
| 2070 | + local_irq_restore(flags); | ||
| 2071 | +} | ||
| 2072 | +EXPORT_SYMBOL_GPL(htcuniversal_egpio_enable); | ||
| 2073 | + | ||
| 2074 | +void | ||
| 2075 | +htcuniversal_egpio_disable( u_int16_t bits ) | ||
| 2076 | +{ | ||
| 2077 | + unsigned long flags; | ||
| 2078 | + | ||
| 2079 | + local_irq_save(flags); | ||
| 2080 | + | ||
| 2081 | + egpio_reg &= ~bits; | ||
| 2082 | + *egpios = egpio_reg; | ||
| 2083 | + | ||
| 2084 | + local_irq_restore(flags); | ||
| 2085 | +} | ||
| 2086 | +EXPORT_SYMBOL_GPL(htcuniversal_egpio_disable); | ||
| 2087 | + | ||
| 2088 | +#ifdef CONFIG_PM | ||
| 2089 | + | ||
| 2090 | +//void htcuniversal_ll_pm_init(void); | ||
| 2091 | + | ||
| 2092 | +static int htcuniversal_suspend(struct platform_device *dev, pm_message_t state) | ||
| 2093 | +{ | ||
| 2094 | + /* Turn off external clocks here, because htcuniversal_power and asic3_mmc | ||
| 2095 | + * scared to do so to not hurt each other. (-5 mA) */ | ||
| 2096 | + | ||
| 2097 | + | ||
| 2098 | + /* 0x20c2 is HTC clock value | ||
| 2099 | + * CLOCK_CDEX_SOURCE 2 | ||
| 2100 | + * CLOCK_CDEX_SPI 0 | ||
| 2101 | + * CLOCK_CDEX_OWM 0 | ||
| 2102 | + * | ||
| 2103 | + * CLOCK_CDEX_PWM0 0 | ||
| 2104 | + * CLOCK_CDEX_PWM1 0 | ||
| 2105 | + * CLOCK_CDEX_LED0 1 | ||
| 2106 | + * CLOCK_CDEX_LED1 1 | ||
| 2107 | + * | ||
| 2108 | + * CLOCK_CDEX_LED2 0 | ||
| 2109 | + * CLOCK_CDEX_SD_HOST 0 | ||
| 2110 | + * CLOCK_CDEX_SD_BUS 0 | ||
| 2111 | + * CLOCK_CDEX_SMBUS 0 | ||
| 2112 | + * | ||
| 2113 | + * CLOCK_CDEX_CONTROL_CX 0 | ||
| 2114 | + * CLOCK_CDEX_EX0 1 | ||
| 2115 | + * CLOCK_CDEX_EX1 0 | ||
| 2116 | + * */ | ||
| 2117 | + asic3_set_clock_cdex(&htcuniversal_asic3.dev, 0xffff, CLOCK_CDEX_SOURCE1 | ||
| 2118 | + |CLOCK_CDEX_LED0 | ||
| 2119 | + |CLOCK_CDEX_LED1 | ||
| 2120 | + |CLOCK_CDEX_LED2 | ||
| 2121 | + |CLOCK_CDEX_EX0 | ||
| 2122 | + |CLOCK_CDEX_EX1); | ||
| 2123 | + | ||
| 2124 | + *egpios = 0; /* turn off all egpio power */ | ||
| 2125 | + | ||
| 2126 | + /* Wake up enable. */ | ||
| 2127 | + PWER = PWER_GPIO0 | ||
| 2128 | + | PWER_GPIO1 /* reset */ | ||
| 2129 | + | PWER_GPIO9 /* USB */ | ||
| 2130 | + | PWER_GPIO10 /* AC on USB */ | ||
| 2131 | + | PWER_GPIO14 /* ASIC3 mux */ | ||
| 2132 | + | PWER_RTC; | ||
| 2133 | + /* Wake up on falling edge. */ | ||
| 2134 | + PFER = PWER_GPIO0 | ||
| 2135 | + | PWER_GPIO1 | ||
| 2136 | + | PWER_GPIO9 | ||
| 2137 | + | PWER_GPIO10 | ||
| 2138 | + | PWER_GPIO14; | ||
| 2139 | + | ||
| 2140 | + /* Wake up on rising edge. */ | ||
| 2141 | + PRER = PWER_GPIO0 | ||
| 2142 | + | PWER_GPIO1 | ||
| 2143 | + | PWER_GPIO9 | ||
| 2144 | + | PWER_GPIO10; | ||
| 2145 | + /* 3.6864 MHz oscillator power-down enable */ | ||
| 2146 | + PCFR = PCFR_OPDE | PCFR_PI2CEN | PCFR_GPROD | PCFR_GPR_EN; | ||
| 2147 | + | ||
| 2148 | + PGSR0 = 0x09088004; | ||
| 2149 | + PGSR1 = 0x00020002; | ||
| 2150 | + PGSR2 = 0x8001c000; | ||
| 2151 | + PGSR3 = 0x00106284; | ||
| 2152 | + | ||
| 2153 | + PSLR = 0xcc000000; | ||
| 2154 | + | ||
| 2155 | +#if 0 | ||
| 2156 | + /* | ||
| 2157 | + * If we're using bootldr and not the stock HTC bootloader, | ||
| 2158 | + * we want to wake up periodically to see if the charge is full while | ||
| 2159 | + * it is suspended. We do this with the OS timer 4 in the pxa270. | ||
| 2160 | + */ | ||
| 2161 | + if (!htc_bootloader) { | ||
| 2162 | + OMCR4 = 0x4b; /* Periodic, self-resetting, 1-second timer */ | ||
| 2163 | + OSMR4 = 5; /* Wake up bootldr after x seconds so it can | ||
| 2164 | + figure out what to do with the LEDs. */ | ||
| 2165 | + OIER |= 0x10; /* Enable interrupt source for Timer 4 */ | ||
| 2166 | + OSCR4 = 0; /* This starts the timer */ | ||
| 2167 | + } | ||
| 2168 | +#endif | ||
| 2169 | + | ||
| 2170 | + asic3_set_extcf_select(&htcuniversal_asic3.dev, ASIC3_EXTCF_OWM_EN, 0); | ||
| 2171 | + | ||
| 2172 | + return 0; | ||
| 2173 | +} | ||
| 2174 | + | ||
| 2175 | +static int htcuniversal_resume(struct platform_device *dev) | ||
| 2176 | +{ | ||
| 2177 | + htcuniversal_egpio_enable(0); | ||
| 2178 | + | ||
| 2179 | + return 0; | ||
| 2180 | +} | ||
| 2181 | +#else | ||
| 2182 | +# define htcuniversal_suspend NULL | ||
| 2183 | +# define htcuniversal_resume NULL | ||
| 2184 | +#endif | ||
| 2185 | + | ||
| 2186 | +static int | ||
| 2187 | +htcuniversal_core_probe( struct platform_device *dev ) | ||
| 2188 | +{ | ||
| 2189 | + | ||
| 2190 | + printk( KERN_NOTICE "HTC Universal Core Hardware Driver\n" ); | ||
| 2191 | + | ||
| 2192 | + egpios = (volatile u_int16_t *)ioremap_nocache(HTCUNIVERSAL_EGPIO_BASE, sizeof *egpios ); | ||
| 2193 | + if (!egpios) | ||
| 2194 | + return -ENODEV; | ||
| 2195 | + else | ||
| 2196 | + printk( KERN_NOTICE "HTC Universal Core: egpio at phy=0x%8.8x is at virt=0x%p\n", | ||
| 2197 | + HTCUNIVERSAL_EGPIO_BASE, egpios ); | ||
| 2198 | + | ||
| 2199 | + printk("Using stock HTC first stage bootloader\n"); | ||
| 2200 | + htc_bootloader = 1; | ||
| 2201 | + | ||
| 2202 | +// htcuniversal_ll_pm_init(); | ||
| 2203 | + | ||
| 2204 | + return 0; | ||
| 2205 | +} | ||
| 2206 | + | ||
| 2207 | +static int | ||
| 2208 | +htcuniversal_core_remove( struct platform_device *dev ) | ||
| 2209 | +{ | ||
| 2210 | + | ||
| 2211 | + if (egpios != NULL) | ||
| 2212 | + iounmap( (void *)egpios ); | ||
| 2213 | + | ||
| 2214 | + return 0; | ||
| 2215 | +} | ||
| 2216 | + | ||
| 2217 | +static struct platform_driver htcuniversal_core_driver = { | ||
| 2218 | + .driver = { | ||
| 2219 | + .name = "htcuniversal_core", | ||
| 2220 | + }, | ||
| 2221 | + .probe = htcuniversal_core_probe, | ||
| 2222 | + .remove = htcuniversal_core_remove, | ||
| 2223 | + .suspend = htcuniversal_suspend, | ||
| 2224 | + .resume = htcuniversal_resume, | ||
| 2225 | +}; | ||
| 2226 | + | ||
| 2227 | +static int __init | ||
| 2228 | +htcuniversal_core_init( void ) | ||
| 2229 | +{ | ||
| 2230 | + return platform_driver_register( &htcuniversal_core_driver ); | ||
| 2231 | +} | ||
| 2232 | + | ||
| 2233 | + | ||
| 2234 | +static void __exit | ||
| 2235 | +htcuniversal_core_exit( void ) | ||
| 2236 | +{ | ||
| 2237 | + platform_driver_unregister( &htcuniversal_core_driver ); | ||
| 2238 | +} | ||
| 2239 | + | ||
| 2240 | +module_init( htcuniversal_core_init ); | ||
| 2241 | +module_exit( htcuniversal_core_exit ); | ||
| 2242 | + | ||
| 2243 | +MODULE_AUTHOR("Todd Blumer, SDG Systems, LLC"); | ||
| 2244 | +MODULE_DESCRIPTION("HTC Universal Core Hardware Driver"); | ||
| 2245 | +MODULE_LICENSE("GPL"); | ||
| 2246 | + | ||
| 2247 | +/* vim600: set noexpandtab sw=8 ts=8 :*/ | ||
| 2248 | Index: linux-2.6.26-rc4/arch/arm/mach-pxa/htcuniversal/htcuniversal_lcd.c | ||
| 2249 | =================================================================== | ||
| 2250 | --- /dev/null 1970-01-01 00:00:00.000000000 +0000 | ||
| 2251 | +++ linux-2.6.26-rc4/arch/arm/mach-pxa/htcuniversal/htcuniversal_lcd.c 2008-06-01 18:49:45.000000000 +0100 | ||
| 2252 | @@ -0,0 +1,212 @@ | ||
| 2253 | +/* | ||
| 2254 | + * Use consistent with the GNU GPL is permitted, | ||
| 2255 | + * provided that this copyright notice is | ||
| 2256 | + * preserved in its entirety in all copies and derived works. | ||
| 2257 | + * | ||
| 2258 | + * History: | ||
| 2259 | + * | ||
| 2260 | + * 2004-03-01 Eddi De Pieri Adapted for htcuniversal using h3900_lcd.c | ||
| 2261 | + * 2004 Shawn Anderson Lcd hacking on htcuniversal | ||
| 2262 | + * see h3900_lcd.c for more history. | ||
| 2263 | + * | ||
| 2264 | + */ | ||
| 2265 | + | ||
| 2266 | +#include <linux/types.h> | ||
| 2267 | +#include <asm/arch/hardware.h> /* for pxa-regs.h (__REG) */ | ||
| 2268 | +#include <linux/platform_device.h> | ||
| 2269 | +#include <asm/arch/pxa-regs.h> /* LCCR[0,1,2,3]* */ | ||
| 2270 | +#include <asm/arch/bitfield.h> /* for pxa-regs.h (Fld, etc) */ | ||
| 2271 | +#include <asm/arch/pxafb.h> /* pxafb_mach_info, set_pxa_fb_info */ | ||
| 2272 | +#include <asm/mach-types.h> /* machine_is_htcuniversal */ | ||
| 2273 | +#include <linux/lcd.h> /* lcd_device */ | ||
| 2274 | +#include <linux/err.h> | ||
| 2275 | +#include <linux/delay.h> | ||
| 2276 | + | ||
| 2277 | +#include <asm/arch/htcuniversal-gpio.h> | ||
| 2278 | +#include <asm/arch/htcuniversal-asic.h> | ||
| 2279 | +#include <asm/hardware/ipaq-asic3.h> | ||
| 2280 | +#include <linux/soc/asic3_base.h> | ||
| 2281 | + | ||
| 2282 | +static int saved_lcdpower=-1; | ||
| 2283 | + | ||
| 2284 | +static int powerup_lcd(void) | ||
| 2285 | +{ | ||
| 2286 | + printk( KERN_INFO "htcuniversal powerup_lcd: called\n"); | ||
| 2287 | + | ||
| 2288 | + asic3_set_gpio_out_c(&htcuniversal_asic3.dev, 1<<GPIOC_LCD_PWR1_ON, 0); | ||
| 2289 | + asic3_set_gpio_out_c(&htcuniversal_asic3.dev, 1<<GPIOC_LCD_PWR2_ON, 0); | ||
| 2290 | + asic3_set_gpio_out_b(&htcuniversal_asic3.dev, 1<<GPIOB_LCD_PWR3_ON, 0); | ||
| 2291 | + asic3_set_gpio_out_d(&htcuniversal_asic3.dev, 1<<GPIOD_LCD_PWR4_ON, 0); | ||
| 2292 | + asic3_set_gpio_out_a(&htcuniversal_asic3.dev, 1<<GPIOA_LCD_PWR5_ON, 0); | ||
| 2293 | +#if 1 | ||
| 2294 | + LCCR4|=LCCR4_PCDDIV; | ||
| 2295 | +#endif | ||
| 2296 | + pxa_set_cken(CKEN_LCD, 0); | ||
| 2297 | + | ||
| 2298 | + mdelay(100); | ||
| 2299 | + asic3_set_gpio_out_a(&htcuniversal_asic3.dev, 1<<GPIOA_LCD_PWR5_ON, 1<<GPIOA_LCD_PWR5_ON); | ||
| 2300 | + mdelay(5); | ||
| 2301 | + asic3_set_gpio_out_b(&htcuniversal_asic3.dev, 1<<GPIOB_LCD_PWR3_ON, 1<<GPIOB_LCD_PWR3_ON); | ||
| 2302 | + mdelay(2); | ||
| 2303 | + asic3_set_gpio_out_c(&htcuniversal_asic3.dev, 1<<GPIOC_LCD_PWR1_ON, 1<<GPIOC_LCD_PWR1_ON); | ||
| 2304 | + mdelay(2); | ||
| 2305 | + asic3_set_gpio_out_c(&htcuniversal_asic3.dev, 1<<GPIOC_LCD_PWR2_ON, 1<<GPIOC_LCD_PWR2_ON); | ||
| 2306 | + mdelay(20); | ||
| 2307 | + asic3_set_gpio_out_d(&htcuniversal_asic3.dev, 1<<GPIOD_LCD_PWR4_ON, 1<<GPIOD_LCD_PWR4_ON); | ||
| 2308 | + mdelay(1); | ||
| 2309 | + pxa_set_cken(CKEN_LCD, 1); | ||
| 2310 | + | ||
| 2311 | + SET_HTCUNIVERSAL_GPIO(LCD1,1); | ||
| 2312 | + SET_HTCUNIVERSAL_GPIO(LCD2,1); | ||
| 2313 | + return 0; | ||
| 2314 | +} | ||
| 2315 | + | ||
| 2316 | +static int powerdown_lcd(void) | ||
| 2317 | +{ | ||
| 2318 | + printk( KERN_INFO "htcuniversal powerdown_lcd: called\n"); | ||
| 2319 | + | ||
| 2320 | +#if 1 | ||
| 2321 | + asic3_set_gpio_out_c(&htcuniversal_asic3.dev, 1<<GPIOC_LCD_PWR2_ON, 0); | ||
| 2322 | + mdelay(100); | ||
| 2323 | + asic3_set_gpio_out_d(&htcuniversal_asic3.dev, 1<<GPIOD_LCD_PWR4_ON, 0); | ||
| 2324 | + mdelay(10); | ||
| 2325 | + asic3_set_gpio_out_a(&htcuniversal_asic3.dev, 1<<GPIOA_LCD_PWR5_ON, 0); | ||
| 2326 | + mdelay(1); | ||
| 2327 | + asic3_set_gpio_out_b(&htcuniversal_asic3.dev, 1<<GPIOB_LCD_PWR3_ON, 0); | ||
| 2328 | + mdelay(1); | ||
| 2329 | + asic3_set_gpio_out_c(&htcuniversal_asic3.dev, 1<<GPIOC_LCD_PWR1_ON, 0); | ||
| 2330 | + pxa_set_cken(CKEN_LCD, 0); | ||
| 2331 | + | ||
| 2332 | + SET_HTCUNIVERSAL_GPIO(LCD1,0); | ||
| 2333 | + SET_HTCUNIVERSAL_GPIO(LCD2,0); | ||
| 2334 | +#else | ||
| 2335 | + pxa_set_cken(CKEN_LCD, 0); | ||
| 2336 | + | ||
| 2337 | + SET_HTCUNIVERSAL_GPIO(LCD1,0); | ||
| 2338 | + SET_HTCUNIVERSAL_GPIO(LCD2,0); | ||
| 2339 | + | ||
| 2340 | + asic3_set_gpio_out_c(&htcuniversal_asic3.dev, 1<<GPIOC_LCD_PWR2_ON, 0); | ||
| 2341 | + mdelay(100); | ||
| 2342 | + asic3_set_gpio_out_d(&htcuniversal_asic3.dev, 1<<GPIOD_LCD_PWR4_ON, 0); | ||
| 2343 | + mdelay(10); | ||
| 2344 | + asic3_set_gpio_out_a(&htcuniversal_asic3.dev, 1<<GPIOA_LCD_PWR5_ON, 0); | ||
| 2345 | + mdelay(1); | ||
| 2346 | + asic3_set_gpio_out_b(&htcuniversal_asic3.dev, 1<<GPIOB_LCD_PWR3_ON, 0); | ||
| 2347 | + mdelay(1); | ||
| 2348 | + asic3_set_gpio_out_c(&htcuniversal_asic3.dev, 1<<GPIOC_LCD_PWR1_ON, 0); | ||
| 2349 | +#endif | ||
| 2350 | + return 0; | ||
| 2351 | +} | ||
| 2352 | + | ||
| 2353 | +static int htcuniversal_lcd_set_power(struct lcd_device *lm, int power) | ||
| 2354 | +{ | ||
| 2355 | + /* Enable or disable power to the LCD (0: on; 4: off) */ | ||
| 2356 | + | ||
| 2357 | + if ( power < 1 ) { | ||
| 2358 | + | ||
| 2359 | + powerup_lcd(); | ||
| 2360 | + | ||
| 2361 | + } else { | ||
| 2362 | + | ||
| 2363 | + powerdown_lcd(); | ||
| 2364 | + | ||
| 2365 | + } | ||
| 2366 | + | ||
| 2367 | + saved_lcdpower=power; | ||
| 2368 | + | ||
| 2369 | + return 0; | ||
| 2370 | +} | ||
| 2371 | + | ||
| 2372 | +static int htcuniversal_lcd_get_power(struct lcd_device *lm) | ||
| 2373 | +{ | ||
| 2374 | + /* Get the LCD panel power status (0: full on, 1..3: controller | ||
| 2375 | + * power on, flat panel power off, 4: full off) */ | ||
| 2376 | + | ||
| 2377 | + if (saved_lcdpower == -1) | ||
| 2378 | + { | ||
| 2379 | + htcuniversal_lcd_set_power(lm, 4); | ||
| 2380 | + saved_lcdpower=4; | ||
| 2381 | + } | ||
| 2382 | + | ||
| 2383 | + return saved_lcdpower; | ||
| 2384 | +} | ||
| 2385 | + | ||
| 2386 | +static struct lcd_ops htcuniversal_lcd_properties = | ||
| 2387 | +{ | ||
| 2388 | + .get_power = htcuniversal_lcd_get_power, | ||
| 2389 | + .set_power = htcuniversal_lcd_set_power, | ||
| 2390 | +}; | ||
| 2391 | + | ||
| 2392 | +static struct lcd_device *htcuniversal_lcd_dev; | ||
| 2393 | + | ||
| 2394 | +static int htcuniversal_lcd_probe(struct platform_device * dev) | ||
| 2395 | +{ | ||
| 2396 | + htcuniversal_lcd_dev = lcd_device_register("pxa2xx-fb", &dev->dev, NULL, | ||
| 2397 | + &htcuniversal_lcd_properties); | ||
| 2398 | + if (IS_ERR(htcuniversal_lcd_dev)) { | ||
| 2399 | + printk("htcuniversal_lcd_probe: error registering devices\n"); | ||
| 2400 | + return -1; | ||
| 2401 | + } | ||
| 2402 | + | ||
| 2403 | + return 0; | ||
| 2404 | +} | ||
| 2405 | + | ||
| 2406 | +static int htcuniversal_lcd_remove(struct platform_device * dev) | ||
| 2407 | +{ | ||
| 2408 | + htcuniversal_lcd_set_power(htcuniversal_lcd_dev, 4); | ||
| 2409 | + lcd_device_unregister(htcuniversal_lcd_dev); | ||
| 2410 | + | ||
| 2411 | + return 0; | ||
| 2412 | +} | ||
| 2413 | + | ||
| 2414 | +static int htcuniversal_lcd_suspend(struct platform_device * dev, pm_message_t state) | ||
| 2415 | +{ | ||
| 2416 | +// printk("htcuniversal_lcd_suspend: called.\n"); | ||
| 2417 | + htcuniversal_lcd_set_power(htcuniversal_lcd_dev, 4); | ||
| 2418 | + return 0; | ||
| 2419 | +} | ||
| 2420 | + | ||
| 2421 | +static int htcuniversal_lcd_resume(struct platform_device * dev) | ||
| 2422 | +{ | ||
| 2423 | +// printk("htcuniversal_lcd_resume: called.\n"); | ||
| 2424 | + | ||
| 2425 | + /* */ | ||
| 2426 | +#if 1 | ||
| 2427 | + LCCR4|=LCCR4_PCDDIV; | ||
| 2428 | +#endif | ||
| 2429 | + | ||
| 2430 | + htcuniversal_lcd_set_power(htcuniversal_lcd_dev, 0); | ||
| 2431 | + return 0; | ||
| 2432 | +} | ||
| 2433 | + | ||
| 2434 | +static struct platform_driver htcuniversal_lcd_driver = { | ||
| 2435 | + .driver = { | ||
| 2436 | + .name = "htcuniversal_lcd", | ||
| 2437 | + }, | ||
| 2438 | + .probe = htcuniversal_lcd_probe, | ||
| 2439 | + .remove = htcuniversal_lcd_remove, | ||
| 2440 | + .suspend = htcuniversal_lcd_suspend, | ||
| 2441 | + .resume = htcuniversal_lcd_resume, | ||
| 2442 | +}; | ||
| 2443 | + | ||
| 2444 | +static int htcuniversal_lcd_init(void) | ||
| 2445 | +{ | ||
| 2446 | + if (!machine_is_htcuniversal()) | ||
| 2447 | + return -ENODEV; | ||
| 2448 | + | ||
| 2449 | + return platform_driver_register(&htcuniversal_lcd_driver); | ||
| 2450 | +} | ||
| 2451 | + | ||
| 2452 | +static void htcuniversal_lcd_exit(void) | ||
| 2453 | +{ | ||
| 2454 | + lcd_device_unregister(htcuniversal_lcd_dev); | ||
| 2455 | + platform_driver_unregister(&htcuniversal_lcd_driver); | ||
| 2456 | +} | ||
| 2457 | + | ||
| 2458 | +module_init(htcuniversal_lcd_init); | ||
| 2459 | +module_exit(htcuniversal_lcd_exit); | ||
| 2460 | + | ||
| 2461 | +MODULE_AUTHOR("xanadux.org"); | ||
| 2462 | +MODULE_DESCRIPTION("Framebuffer driver for HTC Universal"); | ||
| 2463 | +MODULE_LICENSE("GPL"); | ||
| 2464 | + | ||
| 2465 | Index: linux-2.6.26-rc4/arch/arm/mach-pxa/htcuniversal/htcuniversal_phone.c | ||
| 2466 | =================================================================== | ||
| 2467 | --- /dev/null 1970-01-01 00:00:00.000000000 +0000 | ||
| 2468 | +++ linux-2.6.26-rc4/arch/arm/mach-pxa/htcuniversal/htcuniversal_phone.c 2008-06-01 18:49:45.000000000 +0100 | ||
| 2469 | @@ -0,0 +1,167 @@ | ||
| 2470 | + | ||
| 2471 | +/* Phone interface driver for Qualcomm MSM6250 on HTC Universal | ||
| 2472 | + * | ||
| 2473 | + * Copyright (c) 2005 SDG Systems, LLC | ||
| 2474 | + * | ||
| 2475 | + * 2005-04-21 Todd Blumer Created. | ||
| 2476 | + */ | ||
| 2477 | + | ||
| 2478 | +#include <linux/module.h> | ||
| 2479 | +#include <linux/kernel.h> | ||
| 2480 | +#include <linux/delay.h> | ||
| 2481 | +#include <linux/platform_device.h> | ||
| 2482 | +#include <linux/soc/asic3_base.h> | ||
| 2483 | + | ||
| 2484 | +#include <asm/hardware.h> | ||
| 2485 | +#include <asm/arch/serial.h> | ||
| 2486 | +#include <asm/hardware/ipaq-asic3.h> | ||
| 2487 | +#include <asm/arch/htcuniversal-gpio.h> | ||
| 2488 | +#include <asm/arch/htcuniversal-asic.h> | ||
| 2489 | + | ||
| 2490 | +#include "htcuniversal_phone.h" | ||
| 2491 | + | ||
| 2492 | +static void phone_reset(void) | ||
| 2493 | +{ | ||
| 2494 | + asic3_set_gpio_out_b(&htcuniversal_asic3.dev, 1<<GPIOB_BB_RESET2, 0); | ||
| 2495 | + | ||
| 2496 | + SET_HTCUNIVERSAL_GPIO(PHONE_RESET,0); | ||
| 2497 | + asic3_set_gpio_out_d(&htcuniversal_asic3.dev, 1<<GPIOD_BB_RESET1, 0); | ||
| 2498 | + mdelay(1); | ||
| 2499 | + asic3_set_gpio_out_d(&htcuniversal_asic3.dev, 1<<GPIOD_BB_RESET1, 1<<GPIOD_BB_RESET1); | ||
| 2500 | + mdelay(20); | ||
| 2501 | + SET_HTCUNIVERSAL_GPIO(PHONE_RESET,1); | ||
| 2502 | + mdelay(200); | ||
| 2503 | + asic3_set_gpio_out_d(&htcuniversal_asic3.dev, 1<<GPIOD_BB_RESET1, 0); | ||
| 2504 | +} | ||
| 2505 | + | ||
| 2506 | +static void phone_off(void) | ||
| 2507 | +{ | ||
| 2508 | + asic3_set_gpio_out_d(&htcuniversal_asic3.dev, 1<<GPIOD_BB_RESET1, 1<<GPIOD_BB_RESET1); | ||
| 2509 | + mdelay(2000); | ||
| 2510 | + asic3_set_gpio_out_d(&htcuniversal_asic3.dev, 1<<GPIOD_BB_RESET1, 0); | ||
| 2511 | + | ||
| 2512 | + asic3_set_gpio_out_b(&htcuniversal_asic3.dev, 1<<GPIOB_BB_RESET2, 1<<GPIOB_BB_RESET2); | ||
| 2513 | + SET_HTCUNIVERSAL_GPIO(PHONE_OFF,0); | ||
| 2514 | +} | ||
| 2515 | + | ||
| 2516 | +static void | ||
| 2517 | +htcuniversal_phone_configure( int state ) | ||
| 2518 | +{ | ||
| 2519 | + int tries; | ||
| 2520 | + unsigned short statusb; | ||
| 2521 | + | ||
| 2522 | + printk( KERN_NOTICE "htcuniversal configure phone: %d\n", state ); | ||
| 2523 | + switch (state) { | ||
| 2524 | + | ||
| 2525 | + case PXA_UART_CFG_PRE_STARTUP: | ||
| 2526 | + break; | ||
| 2527 | + | ||
| 2528 | + case PXA_UART_CFG_POST_STARTUP: | ||
| 2529 | + /* pre-serial-up hardware configuration */ | ||
| 2530 | + | ||
| 2531 | + SET_HTCUNIVERSAL_GPIO(PHONE_START,0); /* "bootloader" */ | ||
| 2532 | + SET_HTCUNIVERSAL_GPIO(PHONE_UNKNOWN,0); /* not used */ | ||
| 2533 | + SET_HTCUNIVERSAL_GPIO(PHONE_OFF,0); /* PHONE_OFF */ | ||
| 2534 | + | ||
| 2535 | + phone_reset(); | ||
| 2536 | + | ||
| 2537 | + SET_HTCUNIVERSAL_GPIO(PHONE_START,1); /* phone */ | ||
| 2538 | + | ||
| 2539 | + phone_reset(); | ||
| 2540 | + | ||
| 2541 | + asic3_set_gpio_dir_b(&htcuniversal_asic3.dev, 1<<GPIOB_BB_READY, 0); | ||
| 2542 | + asic3_set_gpio_dir_b(&htcuniversal_asic3.dev, 1<<GPIOB_BB_UNKNOWN3, 0); | ||
| 2543 | + | ||
| 2544 | + /* | ||
| 2545 | + */ | ||
| 2546 | + tries = 0; | ||
| 2547 | + do { | ||
| 2548 | + mdelay(10); | ||
| 2549 | + statusb = asic3_get_gpio_status_b( &htcuniversal_asic3.dev ); | ||
| 2550 | + } while ( (statusb & (1<<GPIOB_UMTS_DCD)) == 0 && tries++ < 200); | ||
| 2551 | + | ||
| 2552 | + printk("UMTS_DCD tries=%d of 200\n",tries); | ||
| 2553 | + | ||
| 2554 | + tries = 0; | ||
| 2555 | + do { | ||
| 2556 | + SET_HTCUNIVERSAL_GPIO(PHONE_OFF,1); | ||
| 2557 | + mdelay(10); | ||
| 2558 | + SET_HTCUNIVERSAL_GPIO(PHONE_OFF,0); | ||
| 2559 | + mdelay(20); | ||
| 2560 | + statusb = asic3_get_gpio_status_b( &htcuniversal_asic3.dev ); | ||
| 2561 | + } while ( (statusb & (1<<GPIOB_BB_READY)) == 0 && tries++ < 200); | ||
| 2562 | + | ||
| 2563 | + printk("BB_READY tries=%d of 200\n",tries); | ||
| 2564 | + | ||
| 2565 | + break; | ||
| 2566 | + | ||
| 2567 | + case PXA_UART_CFG_PRE_SHUTDOWN: | ||
| 2568 | + | ||
| 2569 | + phone_off(); | ||
| 2570 | + | ||
| 2571 | + break; | ||
| 2572 | + | ||
| 2573 | + default: | ||
| 2574 | + break; | ||
| 2575 | + } | ||
| 2576 | +} | ||
| 2577 | + | ||
| 2578 | + | ||
| 2579 | +static int | ||
| 2580 | +htcuniversal_phone_probe( struct platform_device *dev ) | ||
| 2581 | +{ | ||
| 2582 | + struct htcuniversal_phone_funcs *funcs = dev->dev.platform_data; | ||
| 2583 | + | ||
| 2584 | + /* configure phone UART */ | ||
| 2585 | + pxa_gpio_mode( GPIO_NR_HTCUNIVERSAL_PHONE_RXD_MD ); | ||
| 2586 | + pxa_gpio_mode( GPIO_NR_HTCUNIVERSAL_PHONE_TXD_MD ); | ||
| 2587 | + pxa_gpio_mode( GPIO_NR_HTCUNIVERSAL_PHONE_UART_CTS_MD ); | ||
| 2588 | + pxa_gpio_mode( GPIO_NR_HTCUNIVERSAL_PHONE_UART_RTS_MD ); | ||
| 2589 | + | ||
| 2590 | + funcs->configure = htcuniversal_phone_configure; | ||
| 2591 | + | ||
| 2592 | + return 0; | ||
| 2593 | +} | ||
| 2594 | + | ||
| 2595 | +static int | ||
| 2596 | +htcuniversal_phone_remove( struct platform_device *dev ) | ||
| 2597 | +{ | ||
| 2598 | + struct htcuniversal_phone_funcs *funcs = dev->dev.platform_data; | ||
| 2599 | + | ||
| 2600 | + funcs->configure = NULL; | ||
| 2601 | + | ||
| 2602 | + asic3_set_gpio_dir_b(&htcuniversal_asic3.dev, 1<<GPIOB_BB_READY, 1<<GPIOB_BB_READY); | ||
| 2603 | + asic3_set_gpio_dir_b(&htcuniversal_asic3.dev, 1<<GPIOB_BB_UNKNOWN3, 1<<GPIOB_BB_UNKNOWN3); | ||
| 2604 | + | ||
| 2605 | + return 0; | ||
| 2606 | +} | ||
| 2607 | + | ||
| 2608 | +static struct platform_driver phone_driver = { | ||
| 2609 | + .driver = { | ||
| 2610 | + .name = "htcuniversal_phone", | ||
| 2611 | + }, | ||
| 2612 | + .probe = htcuniversal_phone_probe, | ||
| 2613 | + .remove = htcuniversal_phone_remove, | ||
| 2614 | +}; | ||
| 2615 | + | ||
| 2616 | +static int __init | ||
| 2617 | +htcuniversal_phone_init( void ) | ||
| 2618 | +{ | ||
| 2619 | + printk(KERN_NOTICE "htcuniversal Phone Driver\n"); | ||
| 2620 | + return platform_driver_register( &phone_driver ); | ||
| 2621 | +} | ||
| 2622 | + | ||
| 2623 | +static void __exit | ||
| 2624 | +htcuniversal_phone_exit( void ) | ||
| 2625 | +{ | ||
| 2626 | + platform_driver_unregister( &phone_driver ); | ||
| 2627 | +} | ||
| 2628 | + | ||
| 2629 | +module_init( htcuniversal_phone_init ); | ||
| 2630 | +module_exit( htcuniversal_phone_exit ); | ||
| 2631 | + | ||
| 2632 | +MODULE_AUTHOR("Todd Blumer, SDG Systems, LLC"); | ||
| 2633 | +MODULE_DESCRIPTION("HTC Universal Phone Support Driver"); | ||
| 2634 | +MODULE_LICENSE("GPL"); | ||
| 2635 | + | ||
| 2636 | +/* vim600: set noexpandtab sw=8 ts=8 :*/ | ||
| 2637 | Index: linux-2.6.26-rc4/arch/arm/mach-pxa/htcuniversal/htcuniversal_phone.h | ||
| 2638 | =================================================================== | ||
| 2639 | --- /dev/null 1970-01-01 00:00:00.000000000 +0000 | ||
| 2640 | +++ linux-2.6.26-rc4/arch/arm/mach-pxa/htcuniversal/htcuniversal_phone.h 2008-06-01 18:49:45.000000000 +0100 | ||
| 2641 | @@ -0,0 +1,16 @@ | ||
| 2642 | +/* | ||
| 2643 | + * Bluetooth support file for calling bluetooth configuration functions | ||
| 2644 | + * | ||
| 2645 | + * Copyright (c) 2005 SDG Systems, LLC | ||
| 2646 | + * | ||
| 2647 | + * 2005-06 Todd Blumer Initial Revision | ||
| 2648 | + */ | ||
| 2649 | + | ||
| 2650 | +#ifndef _HTCUNIVERSAL_PHONE_H | ||
| 2651 | +#define _HTCUNIVERSAL_PHONE_H | ||
| 2652 | + | ||
| 2653 | +struct htcuniversal_phone_funcs { | ||
| 2654 | + void (*configure) ( int state ); | ||
| 2655 | +}; | ||
| 2656 | + | ||
| 2657 | +#endif | ||
| 2658 | Index: linux-2.6.26-rc4/arch/arm/mach-pxa/htcuniversal/htcuniversal_pm.c | ||
| 2659 | =================================================================== | ||
| 2660 | --- /dev/null 1970-01-01 00:00:00.000000000 +0000 | ||
| 2661 | +++ linux-2.6.26-rc4/arch/arm/mach-pxa/htcuniversal/htcuniversal_pm.c 2008-06-01 18:49:45.000000000 +0100 | ||
| 2662 | @@ -0,0 +1,69 @@ | ||
| 2663 | +/* | ||
| 2664 | + * MyPal 716 power management support for the original HTC IPL in DoC G3 | ||
| 2665 | + * | ||
| 2666 | + * Use consistent with the GNU GPL is permitted, provided that this | ||
| 2667 | + * copyright notice is preserved in its entirety in all copies and | ||
| 2668 | + * derived works. | ||
| 2669 | + * | ||
| 2670 | + * Copyright (C) 2005 Pawel Kolodziejski | ||
| 2671 | + * | ||
| 2672 | + */ | ||
| 2673 | + | ||
| 2674 | +#include <linux/kernel.h> | ||
| 2675 | +#include <linux/module.h> | ||
| 2676 | +#include <linux/device.h> | ||
| 2677 | +#include <linux/pm.h> | ||
| 2678 | + | ||
| 2679 | +#include <asm/mach-types.h> | ||
| 2680 | +#include <asm/hardware.h> | ||
| 2681 | +#include <asm/arch/pxa-regs.h> | ||
| 2682 | +#include <asm/arch/pxa-pm_ll.h> | ||
| 2683 | + | ||
| 2684 | +#ifdef CONFIG_PM | ||
| 2685 | + | ||
| 2686 | +static u32 *addr_a0040000; | ||
| 2687 | +static u32 *addr_a0040004; | ||
| 2688 | +static u32 *addr_a0040008; | ||
| 2689 | +static u32 *addr_a004000c; | ||
| 2690 | + | ||
| 2691 | +static u32 save_a0040000; | ||
| 2692 | +static u32 save_a0040004; | ||
| 2693 | +static u32 save_a0040008; | ||
| 2694 | +static u32 save_a004000c; | ||
| 2695 | + | ||
| 2696 | +static void htcuniversal_pxa_ll_pm_suspend(unsigned long resume_addr) | ||
| 2697 | +{ | ||
| 2698 | + save_a0040000 = *addr_a0040000; | ||
| 2699 | + save_a0040004 = *addr_a0040004; | ||
| 2700 | + save_a0040008 = *addr_a0040008; | ||
| 2701 | + save_a004000c = *addr_a004000c; | ||
| 2702 | + | ||
| 2703 | + /* jump to PSPR */ | ||
| 2704 | + *addr_a0040000 = 0xe3a00101; // mov r0, #0x40000000 | ||
| 2705 | + *addr_a0040004 = 0xe380060f; // orr r0, r0, #0x0f000000 | ||
| 2706 | + *addr_a0040008 = 0xe3800008; // orr r0, r0, #8 | ||
| 2707 | + *addr_a004000c = 0xe590f000; // ldr pc, [r0] | ||
| 2708 | +} | ||
| 2709 | + | ||
| 2710 | +static void htcuniversal_pxa_ll_pm_resume(void) | ||
| 2711 | +{ | ||
| 2712 | + *addr_a0040000 = save_a0040000; | ||
| 2713 | + *addr_a0040004 = save_a0040004; | ||
| 2714 | + *addr_a0040008 = save_a0040008; | ||
| 2715 | + *addr_a004000c = save_a004000c; | ||
| 2716 | +} | ||
| 2717 | + | ||
| 2718 | +static struct pxa_ll_pm_ops htcuniversal_ll_pm_ops = { | ||
| 2719 | + .suspend = htcuniversal_pxa_ll_pm_suspend, | ||
| 2720 | + .resume = htcuniversal_pxa_ll_pm_resume, | ||
| 2721 | +}; | ||
| 2722 | + | ||
| 2723 | +void htcuniversal_ll_pm_init(void) { | ||
| 2724 | + addr_a0040000 = phys_to_virt(0xa0040000); | ||
| 2725 | + addr_a0040004 = phys_to_virt(0xa0040004); | ||
| 2726 | + addr_a0040008 = phys_to_virt(0xa0040008); | ||
| 2727 | + addr_a004000c = phys_to_virt(0xa004000c); | ||
| 2728 | + | ||
| 2729 | + pxa_pm_set_ll_ops(&htcuniversal_ll_pm_ops); | ||
| 2730 | +} | ||
| 2731 | +#endif /* CONFIG_PM */ | ||
| 2732 | Index: linux-2.6.26-rc4/arch/arm/mach-pxa/htcuniversal/htcuniversal_power2.c | ||
| 2733 | =================================================================== | ||
| 2734 | --- /dev/null 1970-01-01 00:00:00.000000000 +0000 | ||
| 2735 | +++ linux-2.6.26-rc4/arch/arm/mach-pxa/htcuniversal/htcuniversal_power2.c 2008-06-01 18:49:45.000000000 +0100 | ||
| 2736 | @@ -0,0 +1,97 @@ | ||
| 2737 | +/* | ||
| 2738 | + * pda_power driver for HTC Universal | ||
| 2739 | + * | ||
| 2740 | + * This program is free software; you can redistribute it and/or modify | ||
| 2741 | + * it under the terms of the GNU General Public License as published by | ||
| 2742 | + * the Free Software Foundation; either version 2 of the License, or (at | ||
| 2743 | + * your option) any later version. | ||
| 2744 | + * | ||
| 2745 | + */ | ||
| 2746 | + | ||
| 2747 | +#include <linux/platform_device.h> | ||
| 2748 | +#include <linux/module.h> | ||
| 2749 | +#include <linux/pda_power.h> | ||
| 2750 | +#include <linux/soc/asic3_base.h> | ||
| 2751 | + | ||
| 2752 | +#include <asm/mach-types.h> | ||
| 2753 | +#include <asm/hardware.h> | ||
| 2754 | +#include <asm/arch/htcuniversal-gpio.h> | ||
| 2755 | +#include <asm/arch/htcuniversal-asic.h> | ||
| 2756 | + | ||
| 2757 | +static void charge_on(int flags) | ||
| 2758 | +{ | ||
| 2759 | + asic3_set_gpio_out_b(&htcuniversal_asic3.dev, 1<<GPIOB_CHARGE_EN, 0); | ||
| 2760 | +} | ||
| 2761 | + | ||
| 2762 | +static int ac_on(void) | ||
| 2763 | +{ | ||
| 2764 | + return (GET_HTCUNIVERSAL_GPIO(POWER_DET) == 0); | ||
| 2765 | +} | ||
| 2766 | + | ||
| 2767 | +static int usb_on(void) | ||
| 2768 | +{ | ||
| 2769 | + return (GET_HTCUNIVERSAL_GPIO(USB_DET) == 0); | ||
| 2770 | +} | ||
| 2771 | + | ||
| 2772 | +static char *supplicants[] = { | ||
| 2773 | + "ds2760-battery.0", "backup-battery" | ||
| 2774 | +}; | ||
| 2775 | + | ||
| 2776 | +static struct pda_power_pdata power_pdata = { | ||
| 2777 | + .is_ac_online = ac_on, | ||
| 2778 | + .is_usb_online = usb_on, | ||
| 2779 | + .set_charge = charge_on, | ||
| 2780 | + .supplied_to = supplicants, | ||
| 2781 | + .num_supplicants = ARRAY_SIZE(supplicants), | ||
| 2782 | +}; | ||
| 2783 | + | ||
| 2784 | +static struct resource power_resources[] = { | ||
| 2785 | + [0] = { | ||
| 2786 | + .name = "ac", | ||
| 2787 | + .start = HTCUNIVERSAL_IRQ(POWER_DET), | ||
| 2788 | + .end = HTCUNIVERSAL_IRQ(POWER_DET), | ||
| 2789 | + .flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHEDGE | IORESOURCE_IRQ_LOWEDGE, | ||
| 2790 | + }, | ||
| 2791 | + [1] = { | ||
| 2792 | + .name = "usb", | ||
| 2793 | + .start = HTCUNIVERSAL_IRQ(USB_DET), | ||
| 2794 | + .end = HTCUNIVERSAL_IRQ(USB_DET), | ||
| 2795 | + .flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHEDGE | IORESOURCE_IRQ_LOWEDGE, | ||
| 2796 | + }, | ||
| 2797 | +}; | ||
| 2798 | + | ||
| 2799 | +static void dev_release(struct device *dev) | ||
| 2800 | +{ | ||
| 2801 | + return; | ||
| 2802 | +} | ||
| 2803 | + | ||
| 2804 | +static struct platform_device power_dev = | ||
| 2805 | +{ | ||
| 2806 | + .name = "pda-power", | ||
| 2807 | + .id = -1, | ||
| 2808 | + .resource = power_resources, | ||
| 2809 | + .num_resources = ARRAY_SIZE(power_resources), | ||
| 2810 | + .dev = | ||
| 2811 | + { | ||
| 2812 | + .platform_data = &power_pdata, | ||
| 2813 | + .release = dev_release, | ||
| 2814 | + }, | ||
| 2815 | +}; | ||
| 2816 | + | ||
| 2817 | +static int htcuniversal_power_init(void) | ||
| 2818 | +{ | ||
| 2819 | + return platform_device_register(&power_dev); | ||
| 2820 | +} | ||
| 2821 | + | ||
| 2822 | +static void htcuniversal_power_exit(void) | ||
| 2823 | +{ | ||
| 2824 | + platform_device_unregister(&power_dev); | ||
| 2825 | + | ||
| 2826 | + return; | ||
| 2827 | +} | ||
| 2828 | + | ||
| 2829 | +module_init(htcuniversal_power_init); | ||
| 2830 | +module_exit(htcuniversal_power_exit); | ||
| 2831 | + | ||
| 2832 | +MODULE_DESCRIPTION("Power driver for HTC Universal"); | ||
| 2833 | +MODULE_LICENSE("GPL"); | ||
| 2834 | Index: linux-2.6.26-rc4/arch/arm/mach-pxa/htcuniversal/htcuniversal_ts2.c | ||
| 2835 | =================================================================== | ||
| 2836 | --- /dev/null 1970-01-01 00:00:00.000000000 +0000 | ||
| 2837 | +++ linux-2.6.26-rc4/arch/arm/mach-pxa/htcuniversal/htcuniversal_ts2.c 2008-06-01 18:49:45.000000000 +0100 | ||
| 2838 | @@ -0,0 +1,490 @@ | ||
| 2839 | +/* Touch screen driver for the TI something-or-other | ||
| 2840 | + * | ||
| 2841 | + * Copyright © 2005 SDG Systems, LLC | ||
| 2842 | + * | ||
| 2843 | + * Based on code that was based on the SAMCOP driver. | ||
| 2844 | + * Copyright © 2003, 2004 Compaq Computer Corporation. | ||
| 2845 | + * | ||
| 2846 | + * Use consistent with the GNU GPL is permitted, | ||
| 2847 | + * provided that this copyright notice is | ||
| 2848 | + * preserved in its entirety in all copies and derived works. | ||
| 2849 | + * | ||
| 2850 | + * COMPAQ COMPUTER CORPORATION MAKES NO WARRANTIES, EXPRESSED OR IMPLIED, | ||
| 2851 | + * AS TO THE USEFULNESS OR CORRECTNESS OF THIS CODE OR ITS | ||
| 2852 | + * FITNESS FOR ANY PARTICULAR PURPOSE. | ||
| 2853 | + * | ||
| 2854 | + * Author: Keith Packard <keith.packard@hp.com> | ||
| 2855 | + * May 2003 | ||
| 2856 | + * | ||
| 2857 | + * Updates: | ||
| 2858 | + * | ||
| 2859 | + * 2004-02-11 Michael Opdenacker Renamed names from samcop to shamcop, | ||
| 2860 | + * Goal:support HAMCOP and SAMCOP. | ||
| 2861 | + * 2004-02-14 Michael Opdenacker Temporary fix for device id handling | ||
| 2862 | + * | ||
| 2863 | + * 2005-02-18 Aric Blumer Converted basic structure to support hx4700 | ||
| 2864 | + * | ||
| 2865 | + * 2005-06-07 Aric Blumer Added tssim device handling so we can | ||
| 2866 | + * hook in the fbvncserver. | ||
| 2867 | + */ | ||
| 2868 | + | ||
| 2869 | +#include <linux/module.h> | ||
| 2870 | +#include <linux/version.h> | ||
| 2871 | + | ||
| 2872 | +#include <linux/init.h> | ||
| 2873 | +#include <linux/fs.h> | ||
| 2874 | +#include <linux/cdev.h> | ||
| 2875 | +#include <linux/interrupt.h> | ||
| 2876 | +#include <linux/sched.h> | ||
| 2877 | +#include <linux/pm.h> | ||
| 2878 | +#include <linux/delay.h> | ||
| 2879 | +#include <linux/input.h> | ||
| 2880 | +#include <linux/platform_device.h> | ||
| 2881 | +#include <linux/irq.h> | ||
| 2882 | + | ||
| 2883 | +#include <asm/arch/hardware.h> | ||
| 2884 | +#include <asm/mach/irq.h> | ||
| 2885 | +#include <asm/io.h> | ||
| 2886 | + | ||
| 2887 | +/* remove me */ | ||
| 2888 | +#include <asm/arch/pxa-regs.h> | ||
| 2889 | +#include <asm/arch/htcuniversal-gpio.h> | ||
| 2890 | +#include <asm/arch/htcuniversal-asic.h> | ||
| 2891 | +#include <asm/mach-types.h> | ||
| 2892 | + | ||
| 2893 | +#include <asm/hardware/ipaq-asic3.h> | ||
| 2894 | +#include <linux/soc/asic3_base.h> | ||
| 2895 | + | ||
| 2896 | + | ||
| 2897 | +#include "tsc2046_ts.h" | ||
| 2898 | + | ||
| 2899 | +enum touchscreen_state { | ||
| 2900 | + STATE_WAIT_FOR_TOUCH, /* Waiting for a PEN interrupt */ | ||
| 2901 | + STATE_SAMPLING /* Actively sampling ADC */ | ||
| 2902 | +}; | ||
| 2903 | + | ||
| 2904 | +struct touchscreen_data { | ||
| 2905 | + enum touchscreen_state state; | ||
| 2906 | + struct timer_list timer; | ||
| 2907 | + int irq; | ||
| 2908 | + struct input_dev *input; | ||
| 2909 | + /* */ | ||
| 2910 | + int port; | ||
| 2911 | + int clock; | ||
| 2912 | + int pwrbit_X; | ||
| 2913 | + int pwrbit_Y; | ||
| 2914 | + int (*pen_down)(void); | ||
| 2915 | +}; | ||
| 2916 | + | ||
| 2917 | +static unsigned long poll_sample_time = 10; /* Sample every 10 milliseconds */ | ||
| 2918 | + | ||
| 2919 | +static struct touchscreen_data *ts_data; | ||
| 2920 | + | ||
| 2921 | +static int irqblock; | ||
| 2922 | + | ||
| 2923 | +module_param(poll_sample_time, ulong, 0644); | ||
| 2924 | +MODULE_PARM_DESC(poll_sample_time, "Poll sample time"); | ||
| 2925 | + | ||
| 2926 | +static inline void | ||
| 2927 | +report_touchpanel(struct touchscreen_data *ts, int pressure, int x, int y) | ||
| 2928 | +{ | ||
| 2929 | + input_report_abs(ts->input, ABS_PRESSURE, pressure); | ||
| 2930 | + input_report_abs(ts->input, ABS_X, x); | ||
| 2931 | + input_report_abs(ts->input, ABS_Y, y); | ||
| 2932 | + input_sync(ts->input); | ||
| 2933 | +} | ||
| 2934 | + | ||
| 2935 | +static void start_read(struct touchscreen_data *touch); | ||
| 2936 | + | ||
| 2937 | +static irqreturn_t | ||
| 2938 | +pen_isr(int irq, void *irq_desc) | ||
| 2939 | +{ | ||
| 2940 | + struct touchscreen_data *ts = ts_data; | ||
| 2941 | + | ||
| 2942 | + if(irq == ts->irq /* && !irqblock */) { | ||
| 2943 | + irqblock = 1; | ||
| 2944 | + | ||
| 2945 | + /* | ||
| 2946 | + * Disable the pen interrupt. It's reenabled when the user lifts the | ||
| 2947 | + * pen. | ||
| 2948 | + */ | ||
| 2949 | + disable_irq(ts->irq); | ||
| 2950 | + | ||
| 2951 | + if (ts->state == STATE_WAIT_FOR_TOUCH) { | ||
| 2952 | + ts->state = STATE_SAMPLING; | ||
| 2953 | + start_read(ts); | ||
| 2954 | + } else { | ||
| 2955 | + /* Shouldn't happen */ | ||
| 2956 | + printk(KERN_ERR "Unexpected ts interrupt\n"); | ||
| 2957 | + } | ||
| 2958 | + | ||
| 2959 | + } | ||
| 2960 | + return IRQ_HANDLED; | ||
| 2961 | +} | ||
| 2962 | + | ||
| 2963 | +static void | ||
| 2964 | +ssp_init(int port, int clock) | ||
| 2965 | +{ | ||
| 2966 | + | ||
| 2967 | + pxa_set_cken(clock, 0); | ||
| 2968 | + | ||
| 2969 | + pxa_gpio_mode(GPIO_NR_HTCUNIVERSAL_TOUCHSCREEN_SPI_CLK_MD); | ||
| 2970 | + pxa_gpio_mode(GPIO_NR_HTCUNIVERSAL_TOUCHSCREEN_SPI_FRM_MD); | ||
| 2971 | + pxa_gpio_mode(GPIO_NR_HTCUNIVERSAL_TOUCHSCREEN_SPI_DO_MD); | ||
| 2972 | + pxa_gpio_mode(GPIO_NR_HTCUNIVERSAL_TOUCHSCREEN_SPI_DI_MD); | ||
| 2973 | + | ||
| 2974 | + SET_HTCUNIVERSAL_GPIO(SPI_FRM,1); | ||
| 2975 | + | ||
| 2976 | + /* *** Set up the SPI Registers *** */ | ||
| 2977 | + SSCR0_P(port) = | ||
| 2978 | + SSCR0_EDSS /* Extended Data Size Select */ | ||
| 2979 | + | SSCR0_SerClkDiv(7) /* Serial Clock Rate */ | ||
| 2980 | + /* Synchronous Serial Enable (Disable for now) */ | ||
| 2981 | + | SSCR0_Motorola /* Motorola SPI Interface */ | ||
| 2982 | + | SSCR0_DataSize(8) /* Data Size Select (24-bit) */ | ||
| 2983 | + ; | ||
| 2984 | + SSCR1_P(port) = 0; | ||
| 2985 | + SSPSP_P(port) = 0; | ||
| 2986 | + | ||
| 2987 | + /* Clear the Status */ | ||
| 2988 | + SSSR_P(port) = SSSR_P(port) & 0x00fcfffc; | ||
| 2989 | + | ||
| 2990 | + /* Now enable it */ | ||
| 2991 | + SSCR0_P(port) = | ||
| 2992 | + SSCR0_EDSS /* Extended Data Size Select */ | ||
| 2993 | + | SSCR0_SerClkDiv(7) /* Serial Clock Rate */ | ||
| 2994 | + | SSCR0_SSE /* Synchronous Serial Enable */ | ||
| 2995 | + | SSCR0_Motorola /* Motorola SPI Interface */ | ||
| 2996 | + | SSCR0_DataSize(8) /* Data Size Select (24-bit) */ | ||
| 2997 | + ; | ||
| 2998 | + | ||
| 2999 | + pxa_set_cken(clock, 1); | ||
| 3000 | +} | ||
| 3001 | + | ||
| 3002 | +static void | ||
| 3003 | +start_read(struct touchscreen_data *touch) | ||
| 3004 | +{ | ||
| 3005 | + unsigned long inc = (poll_sample_time * HZ) / 1000; | ||
| 3006 | + int i; | ||
| 3007 | + | ||
| 3008 | + /* Write here to the serial port. We request X and Y only for now. | ||
| 3009 | + * Then we have to wait for poll_sample_time before we read out the serial | ||
| 3010 | + * port. Then, when we read it out, we check to see if the pen is still | ||
| 3011 | + * down. If so, then we issue another request here. | ||
| 3012 | + */ | ||
| 3013 | +#define TS_SAMPLES 7 | ||
| 3014 | + | ||
| 3015 | + /* | ||
| 3016 | + * We do four samples for each, and throw out the highest and lowest, then | ||
| 3017 | + * average the other two. | ||
| 3018 | + */ | ||
| 3019 | + | ||
| 3020 | + for(i = 0; i < TS_SAMPLES; i++) { | ||
| 3021 | + while(!(SSSR_P(touch->port) & SSSR_TNF)) | ||
| 3022 | + ; | ||
| 3023 | + /* It's not full. Write the command for X */ | ||
| 3024 | + SSDR_P(touch->port) = (TSC2046_SAMPLE_X|(touch->pwrbit_X))<<16; | ||
| 3025 | + } | ||
| 3026 | + | ||
| 3027 | + for(i = 0; i < TS_SAMPLES; i++) { | ||
| 3028 | + while(!(SSSR_P(touch->port) & SSSR_TNF)) | ||
| 3029 | + ; | ||
| 3030 | + /* It's not full. Write the command for Y */ | ||
| 3031 | + SSDR_P(touch->port) = (TSC2046_SAMPLE_Y|(touch->pwrbit_Y))<<16; | ||
| 3032 | + } | ||
| 3033 | + | ||
| 3034 | + /* | ||
| 3035 | + * Enable the timer. We should get an interrupt, but we want keep a timer | ||
| 3036 | + * to ensure that we can detect missing data | ||
| 3037 | + */ | ||
| 3038 | + mod_timer(&touch->timer, jiffies + inc); | ||
| 3039 | +} | ||
| 3040 | + | ||
| 3041 | +static void | ||
| 3042 | +ts_timer_callback(unsigned long data) | ||
| 3043 | +{ | ||
| 3044 | + struct touchscreen_data *ts = (struct touchscreen_data *)data; | ||
| 3045 | + int x, a[TS_SAMPLES], y; | ||
| 3046 | + static int oldx, oldy; | ||
| 3047 | + int ssrval; | ||
| 3048 | + | ||
| 3049 | + /* | ||
| 3050 | + * Check here to see if there is anything in the SPI FIFO. If so, | ||
| 3051 | + * return it if there has been a change. If not, then we have a | ||
| 3052 | + * timeout. Generate an erro somehow. | ||
| 3053 | + */ | ||
| 3054 | + ssrval = SSSR_P(ts->port); | ||
| 3055 | + | ||
| 3056 | + if(ssrval & SSSR_RNE) { /* Look at Rx Not Empty bit */ | ||
| 3057 | + int number_of_entries_in_fifo; | ||
| 3058 | + | ||
| 3059 | + /* The FIFO is not emtpy. Good! Now make sure there are at least two | ||
| 3060 | + * entries. (Should be two exactly.) */ | ||
| 3061 | + | ||
| 3062 | + number_of_entries_in_fifo = ((ssrval >> 12) & 0xf) + 1; | ||
| 3063 | + | ||
| 3064 | + if(number_of_entries_in_fifo < TS_SAMPLES * 2) { | ||
| 3065 | + /* Not ready yet. Come back later. */ | ||
| 3066 | + unsigned long inc = (poll_sample_time * HZ) / 1000; | ||
| 3067 | + mod_timer(&ts->timer, jiffies + inc); | ||
| 3068 | + return; | ||
| 3069 | + } | ||
| 3070 | + | ||
| 3071 | + if(number_of_entries_in_fifo == TS_SAMPLES * 2) { | ||
| 3072 | + int i, j; | ||
| 3073 | + | ||
| 3074 | + for(i = 0; i < TS_SAMPLES; i++) { | ||
| 3075 | + a[i] = SSDR_P(ts->port); | ||
| 3076 | + } | ||
| 3077 | + /* Sort them (bubble) */ | ||
| 3078 | + for(j = TS_SAMPLES - 1; j > 0; j--) { | ||
| 3079 | + for(i = 0; i < j; i++) { | ||
| 3080 | + if(a[i] > a[i + 1]) { | ||
| 3081 | + int tmp; | ||
| 3082 | + tmp = a[i+1]; | ||
| 3083 | + a[i+1] = a[i]; | ||
| 3084 | + a[i] = tmp; | ||
| 3085 | + } | ||
| 3086 | + } | ||
| 3087 | + } | ||
| 3088 | + | ||
| 3089 | + /* Take the average of the middle two */ | ||
| 3090 | + /* x = (a[TS_SAMPLES/2 - 1] + a[TS_SAMPLES/2] + a[TS_SAMPLES/2+1] + a[TS_SAMPLES/2+2]) >> 2; */ | ||
| 3091 | + x = a[TS_SAMPLES/2]; | ||
| 3092 | + | ||
| 3093 | + for(i = 0; i < TS_SAMPLES; i++) { | ||
| 3094 | + a[i] = SSDR_P(ts->port); | ||
| 3095 | + } | ||
| 3096 | + /* Sort them (bubble) */ | ||
| 3097 | + for(j = TS_SAMPLES - 1; j > 0; j--) { | ||
| 3098 | + for(i = 0; i < j; i++) { | ||
| 3099 | + if(a[i] > a[i + 1]) { | ||
| 3100 | + int tmp; | ||
| 3101 | + tmp = a[i+1]; | ||
| 3102 | + a[i+1] = a[i]; | ||
| 3103 | + a[i] = tmp; | ||
| 3104 | + } | ||
| 3105 | + } | ||
| 3106 | + } | ||
| 3107 | + | ||
| 3108 | + | ||
| 3109 | + /* Take the average of the middle two */ | ||
| 3110 | + /* y = (a[TS_SAMPLES/2 - 1] + a[TS_SAMPLES/2] + a[TS_SAMPLES/2+1] + a[TS_SAMPLES/2+2]) >> 2; */ | ||
| 3111 | + y = a[TS_SAMPLES/2]; | ||
| 3112 | + } else { | ||
| 3113 | + /* We have an error! Too many entries. */ | ||
| 3114 | + printk(KERN_ERR "TS: Expected %d entries. Got %d\n", TS_SAMPLES*2, number_of_entries_in_fifo); | ||
| 3115 | + /* Try to clear the FIFO */ | ||
| 3116 | + while(number_of_entries_in_fifo--) { | ||
| 3117 | + (void)SSDR_P(ts->port); | ||
| 3118 | + } | ||
| 3119 | + | ||
| 3120 | + if (ts->pen_down()) | ||
| 3121 | + start_read(ts); | ||
| 3122 | + | ||
| 3123 | + return; | ||
| 3124 | + } | ||
| 3125 | + } else { | ||
| 3126 | + /* Not ready yet. Come back later. */ | ||
| 3127 | + unsigned long inc = (poll_sample_time * HZ) / 1000; | ||
| 3128 | + mod_timer(&ts->timer, jiffies + inc); | ||
| 3129 | + return; | ||
| 3130 | + } | ||
| 3131 | + | ||
| 3132 | + /* | ||
| 3133 | + * Now we check to see if the pen is still down. If it is, then call | ||
| 3134 | + * start_read(). | ||
| 3135 | + */ | ||
| 3136 | + if (ts->pen_down()) | ||
| 3137 | + { | ||
| 3138 | + /* Still down */ | ||
| 3139 | + if(oldx != x || oldy != y) { | ||
| 3140 | + oldx = x; | ||
| 3141 | + oldy = y; | ||
| 3142 | + report_touchpanel(ts, 1, x, y); | ||
| 3143 | + } | ||
| 3144 | + start_read(ts); | ||
| 3145 | + } else { | ||
| 3146 | + /* Up */ | ||
| 3147 | + report_touchpanel(ts, 0, 0, 0); | ||
| 3148 | + irqblock = 0; | ||
| 3149 | + ts->state = STATE_WAIT_FOR_TOUCH; | ||
| 3150 | + /* Re-enable pen down interrupt */ | ||
| 3151 | + enable_irq(ts->irq); | ||
| 3152 | + } | ||
| 3153 | +} | ||
| 3154 | + | ||
| 3155 | +static int pen_down(void) | ||
| 3156 | +{ | ||
| 3157 | + return ( asic3_get_gpio_status_a( &htcuniversal_asic3.dev ) & (1<<GPIOA_TOUCHSCREEN_N)) == 0 ; | ||
| 3158 | +} | ||
| 3159 | + | ||
| 3160 | +static int | ||
| 3161 | +ts_probe (struct platform_device *dev) | ||
| 3162 | +{ | ||
| 3163 | + int retval; | ||
| 3164 | + struct touchscreen_data *ts; | ||
| 3165 | + struct tsc2046_mach_info *mach = dev->dev.platform_data; | ||
| 3166 | + | ||
| 3167 | + printk("htcuniversal: ts_probe\n"); | ||
| 3168 | + | ||
| 3169 | + ts = ts_data = kmalloc (sizeof (*ts), GFP_KERNEL); | ||
| 3170 | + if (ts == NULL) { | ||
| 3171 | + printk( KERN_NOTICE "htcuniversal_ts: unable to allocate memory\n" ); | ||
| 3172 | + return -ENOMEM; | ||
| 3173 | + } | ||
| 3174 | + memset (ts, 0, sizeof (*ts)); | ||
| 3175 | + | ||
| 3176 | + ts->input = input_allocate_device(); | ||
| 3177 | + if (ts->input == NULL) { | ||
| 3178 | + printk( KERN_NOTICE "htcuniversal_ts: unable to allocation touchscreen input\n" ); | ||
| 3179 | + kfree(ts); | ||
| 3180 | + return -ENOMEM; | ||
| 3181 | + } | ||
| 3182 | + ts->input->evbit[0] = BIT(EV_ABS); | ||
| 3183 | + ts->input->absbit[0] = BIT(ABS_X) | BIT(ABS_Y) | BIT(ABS_PRESSURE); | ||
| 3184 | + ts->input->absmin[ABS_X] = 0; | ||
| 3185 | + ts->input->absmax[ABS_X] = 32767; | ||
| 3186 | + ts->input->absmin[ABS_Y] = 0; | ||
| 3187 | + ts->input->absmax[ABS_Y] = 32767; | ||
| 3188 | + ts->input->absmin[ABS_PRESSURE] = 0; | ||
| 3189 | + ts->input->absmax[ABS_PRESSURE] = 1; | ||
| 3190 | + | ||
| 3191 | + ts->input->name = "htcuniversal_ts"; | ||
| 3192 | + ts->input->phys = "touchscreen/htcuniversal_ts"; | ||
| 3193 | + ts->input->private = ts; | ||
| 3194 | + | ||
| 3195 | + input_register_device(ts->input); | ||
| 3196 | + | ||
| 3197 | + ts->timer.function = ts_timer_callback; | ||
| 3198 | + ts->timer.data = (unsigned long)ts; | ||
| 3199 | + ts->state = STATE_WAIT_FOR_TOUCH; | ||
| 3200 | + init_timer (&ts->timer); | ||
| 3201 | + | ||
| 3202 | + platform_set_drvdata(dev, ts); | ||
| 3203 | + | ||
| 3204 | + ts->port=-1; | ||
| 3205 | + | ||
| 3206 | + if (mach) { | ||
| 3207 | + ts->port = mach->port; | ||
| 3208 | + ts->clock = mach->clock; | ||
| 3209 | + ts->pwrbit_X = mach->pwrbit_X; | ||
| 3210 | + ts->pwrbit_Y = mach->pwrbit_Y; | ||
| 3211 | + | ||
| 3212 | + /* static irq */ | ||
| 3213 | + if (mach->irq) | ||
| 3214 | + ts->irq = mach->irq; | ||
| 3215 | + | ||
| 3216 | + if (mach->pen_down) | ||
| 3217 | + ts->pen_down=mach->pen_down; | ||
| 3218 | + } | ||
| 3219 | + | ||
| 3220 | + if (ts->port == -1) | ||
| 3221 | + { | ||
| 3222 | + printk("tsc2046: your device is not supported by this driver\n"); | ||
| 3223 | + return -ENODEV; | ||
| 3224 | + } | ||
| 3225 | + | ||
| 3226 | + /* *** Initialize the SSP interface *** */ | ||
| 3227 | + ssp_init(ts->port, ts->clock); | ||
| 3228 | + | ||
| 3229 | + while(!(SSSR_P(ts->port) & SSSR_TNF)) | ||
| 3230 | + ; | ||
| 3231 | + SSDR_P(ts->port) = (TSC2046_SAMPLE_X|(ts->pwrbit_X))<<16; | ||
| 3232 | + | ||
| 3233 | + for(retval = 0; retval < 100; retval++) { | ||
| 3234 | + if(SSSR_P(ts->port) & SSSR_RNE) { | ||
| 3235 | + while(SSSR_P(ts->port) & SSSR_RNE) { | ||
| 3236 | + (void)SSDR_P(ts->port); | ||
| 3237 | + } | ||
| 3238 | + break; | ||
| 3239 | + } | ||
| 3240 | + mdelay(1); | ||
| 3241 | + } | ||
| 3242 | + | ||
| 3243 | + if (machine_is_htcuniversal() ) | ||
| 3244 | + { | ||
| 3245 | + ts->irq = asic3_irq_base( &htcuniversal_asic3.dev ) + ASIC3_GPIOA_IRQ_BASE + GPIOA_TOUCHSCREEN_N; | ||
| 3246 | + ts->pen_down=pen_down; | ||
| 3247 | + } | ||
| 3248 | + | ||
| 3249 | + retval = request_irq(ts->irq, pen_isr, IRQF_DISABLED, "tsc2046_ts", ts); | ||
| 3250 | + if(retval) { | ||
| 3251 | + printk("Unable to get interrupt\n"); | ||
| 3252 | + input_unregister_device (ts->input); | ||
| 3253 | + return -ENODEV; | ||
| 3254 | + } | ||
| 3255 | + set_irq_type(ts->irq, IRQ_TYPE_EDGE_FALLING); | ||
| 3256 | + | ||
| 3257 | + return 0; | ||
| 3258 | +} | ||
| 3259 | + | ||
| 3260 | +static int | ||
| 3261 | +ts_remove (struct platform_device *dev) | ||
| 3262 | +{ | ||
| 3263 | + struct touchscreen_data *ts = platform_get_drvdata(dev); | ||
| 3264 | + | ||
| 3265 | + input_unregister_device (ts->input); | ||
| 3266 | + del_timer_sync (&ts->timer); | ||
| 3267 | + free_irq (ts->irq, ts); | ||
| 3268 | + pxa_set_cken(ts->clock, 0); | ||
| 3269 | + | ||
| 3270 | + kfree(ts); | ||
| 3271 | + return 0; | ||
| 3272 | +} | ||
| 3273 | + | ||
| 3274 | +static int | ||
| 3275 | +ts_suspend (struct platform_device *dev, pm_message_t state) | ||
| 3276 | +{ | ||
| 3277 | + struct touchscreen_data *ts = platform_get_drvdata(dev); | ||
| 3278 | + | ||
| 3279 | + disable_irq(ts->irq); | ||
| 3280 | + | ||
| 3281 | + printk("htcuniversal_ts2_suspend: called.\n"); | ||
| 3282 | + return 0; | ||
| 3283 | +} | ||
| 3284 | + | ||
| 3285 | +static int | ||
| 3286 | +ts_resume (struct platform_device *dev) | ||
| 3287 | +{ | ||
| 3288 | + struct touchscreen_data *ts = platform_get_drvdata(dev); | ||
| 3289 | + | ||
| 3290 | + ts->state = STATE_WAIT_FOR_TOUCH; | ||
| 3291 | + ssp_init(ts->port, ts->clock); | ||
| 3292 | + enable_irq(ts->irq); | ||
| 3293 | + | ||
| 3294 | + printk("htcuniversal_ts2_resume: called.\n"); | ||
| 3295 | + return 0; | ||
| 3296 | +} | ||
| 3297 | + | ||
| 3298 | +static struct platform_driver ts_driver = { | ||
| 3299 | + .probe = ts_probe, | ||
| 3300 | + .remove = ts_remove, | ||
| 3301 | + .suspend = ts_suspend, | ||
| 3302 | + .resume = ts_resume, | ||
| 3303 | + .driver = { | ||
| 3304 | + .name = "htcuniversal_ts", | ||
| 3305 | + }, | ||
| 3306 | +}; | ||
| 3307 | + | ||
| 3308 | + | ||
| 3309 | +static int | ||
| 3310 | +ts_module_init (void) | ||
| 3311 | +{ | ||
| 3312 | + printk(KERN_NOTICE "HTC Universal Touch Screen Driver\n"); | ||
| 3313 | + | ||
| 3314 | + return platform_driver_register(&ts_driver); | ||
| 3315 | +} | ||
| 3316 | + | ||
| 3317 | +static void | ||
| 3318 | +ts_module_cleanup (void) | ||
| 3319 | +{ | ||
| 3320 | + platform_driver_unregister (&ts_driver); | ||
| 3321 | +} | ||
| 3322 | + | ||
| 3323 | +module_init(ts_module_init); | ||
| 3324 | +module_exit(ts_module_cleanup); | ||
| 3325 | + | ||
| 3326 | +MODULE_LICENSE("GPL"); | ||
| 3327 | +MODULE_AUTHOR("Aric Blumer, SDG Systems, LLC"); | ||
| 3328 | +MODULE_DESCRIPTION("HTC Universal Touch Screen Driver"); | ||
| 3329 | Index: linux-2.6.26-rc4/arch/arm/mach-pxa/htcuniversal/htcuniversal_udc.c | ||
| 3330 | =================================================================== | ||
| 3331 | --- /dev/null 1970-01-01 00:00:00.000000000 +0000 | ||
| 3332 | +++ linux-2.6.26-rc4/arch/arm/mach-pxa/htcuniversal/htcuniversal_udc.c 2008-06-01 18:49:45.000000000 +0100 | ||
| 3333 | @@ -0,0 +1,71 @@ | ||
| 3334 | + | ||
| 3335 | +/* | ||
| 3336 | + * | ||
| 3337 | + * htcuniversal_udc.c: | ||
| 3338 | + * htcuniversal specific code for the pxa27x usb device controller. | ||
| 3339 | + * | ||
| 3340 | + * Use consistent with the GNU GPL is permitted. | ||
| 3341 | + * | ||
| 3342 | + */ | ||
| 3343 | + | ||
| 3344 | +#include <linux/module.h> | ||
| 3345 | +#include <linux/init.h> | ||
| 3346 | +#include <linux/platform_device.h> | ||
| 3347 | +#include <asm/arch/hardware.h> | ||
| 3348 | +#include <asm/arch/pxa-regs.h> | ||
| 3349 | +#include <asm/arch/udc.h> | ||
| 3350 | +#include <linux/soc/asic3_base.h> | ||
| 3351 | +#include <asm/arch/htcuniversal-gpio.h> | ||
| 3352 | +#include <asm/arch/htcuniversal-asic.h> | ||
| 3353 | + | ||
| 3354 | +static void htcuniversal_udc_command(int cmd) | ||
| 3355 | +{ | ||
| 3356 | + switch (cmd) { | ||
| 3357 | + case PXA2XX_UDC_CMD_DISCONNECT: | ||
| 3358 | + asic3_set_gpio_out_b(&htcuniversal_asic3.dev, | ||
| 3359 | + 1<<GPIOB_USB_PUEN, 0); | ||
| 3360 | +// SET_HTCUNIVERSAL_GPIO(USB_PUEN,0); | ||
| 3361 | + break; | ||
| 3362 | + case PXA2XX_UDC_CMD_CONNECT: | ||
| 3363 | + asic3_set_gpio_out_b(&htcuniversal_asic3.dev, | ||
| 3364 | + 1<<GPIOB_USB_PUEN, 1<<GPIOB_USB_PUEN); | ||
| 3365 | +// SET_HTCUNIVERSAL_GPIO(USB_PUEN,1); | ||
| 3366 | + break; | ||
| 3367 | + default: | ||
| 3368 | + printk("_udc_control: unknown command!\n"); | ||
| 3369 | + break; | ||
| 3370 | + } | ||
| 3371 | +} | ||
| 3372 | + | ||
| 3373 | +static int htcuniversal_udc_is_connected(void) | ||
| 3374 | +{ | ||
| 3375 | + return (GET_HTCUNIVERSAL_GPIO(USB_DET) != 0); | ||
| 3376 | +} | ||
| 3377 | + | ||
| 3378 | +static struct pxa2xx_udc_mach_info htcuniversal_udc_info __initdata = { | ||
| 3379 | + .udc_is_connected = htcuniversal_udc_is_connected, | ||
| 3380 | + .udc_command = htcuniversal_udc_command, | ||
| 3381 | +}; | ||
| 3382 | + | ||
| 3383 | +static int htcuniversal_udc_probe(struct platform_device * dev) | ||
| 3384 | +{ | ||
| 3385 | + asic3_set_gpio_dir_b(&htcuniversal_asic3.dev, 1<<GPIOB_USB_PUEN, 1<<GPIOB_USB_PUEN); | ||
| 3386 | + | ||
| 3387 | + pxa_set_udc_info(&htcuniversal_udc_info); | ||
| 3388 | + return 0; | ||
| 3389 | +} | ||
| 3390 | + | ||
| 3391 | +static struct platform_driver htcuniversal_udc_driver = { | ||
| 3392 | + .driver = { | ||
| 3393 | + .name = "htcuniversal_udc", | ||
| 3394 | + }, | ||
| 3395 | + .probe = htcuniversal_udc_probe, | ||
| 3396 | +}; | ||
| 3397 | + | ||
| 3398 | +static int __init htcuniversal_udc_init(void) | ||
| 3399 | +{ | ||
| 3400 | + return platform_driver_register(&htcuniversal_udc_driver); | ||
| 3401 | +} | ||
| 3402 | + | ||
| 3403 | +module_init(htcuniversal_udc_init); | ||
| 3404 | +MODULE_LICENSE("GPL"); | ||
| 3405 | Index: linux-2.6.26-rc4/arch/arm/mach-pxa/htcuniversal/tsc2046_ts.h | ||
| 3406 | =================================================================== | ||
| 3407 | --- /dev/null 1970-01-01 00:00:00.000000000 +0000 | ||
| 3408 | +++ linux-2.6.26-rc4/arch/arm/mach-pxa/htcuniversal/tsc2046_ts.h 2008-06-01 18:49:45.000000000 +0100 | ||
| 3409 | @@ -0,0 +1,20 @@ | ||
| 3410 | +/* | ||
| 3411 | + * temporary TSC2046 touchscreen hack | ||
| 3412 | + */ | ||
| 3413 | + | ||
| 3414 | +#ifndef _TSC2046_TS_H | ||
| 3415 | +#define _TSC2046_TS_H | ||
| 3416 | + | ||
| 3417 | +struct tsc2046_mach_info { | ||
| 3418 | + int port; | ||
| 3419 | + int clock; | ||
| 3420 | + int pwrbit_X; | ||
| 3421 | + int pwrbit_Y; | ||
| 3422 | + int irq; | ||
| 3423 | + int (*pen_down)(void); | ||
| 3424 | +}; | ||
| 3425 | + | ||
| 3426 | +#define TSC2046_SAMPLE_X 0xd0 | ||
| 3427 | +#define TSC2046_SAMPLE_Y 0x90 | ||
| 3428 | + | ||
| 3429 | +#endif | ||
| 3430 | Index: linux-2.6.26-rc4/arch/arm/mach-pxa/Kconfig | ||
| 3431 | =================================================================== | ||
| 3432 | --- linux-2.6.26-rc4.orig/arch/arm/mach-pxa/Kconfig 2008-06-01 18:49:43.000000000 +0100 | ||
| 3433 | +++ linux-2.6.26-rc4/arch/arm/mach-pxa/Kconfig 2008-06-01 18:49:45.000000000 +0100 | ||
| 3434 | @@ -147,6 +147,14 @@ | ||
| 3435 | select PXA27x | ||
| 3436 | select IWMMXT | ||
| 3437 | |||
| 3438 | +config MACH_HTCUNIVERSAL | ||
| 3439 | + bool "HTC Universal" | ||
| 3440 | + select PXA27x | ||
| 3441 | + help | ||
| 3442 | + Say Y here if you intend to run this kernel on a | ||
| 3443 | + HTC Universal. Currently there is only basic support | ||
| 3444 | + for this PDA. | ||
| 3445 | + | ||
| 3446 | endchoice | ||
| 3447 | |||
| 3448 | choice | ||
| 3449 | @@ -204,6 +212,86 @@ | ||
| 3450 | |||
| 3451 | endif | ||
| 3452 | |||
| 3453 | +if MACH_HTCUNIVERSAL | ||
| 3454 | + | ||
| 3455 | +menu "HTC Universal support" | ||
| 3456 | + | ||
| 3457 | +config HTCUNIVERSAL_CORE | ||
| 3458 | + tristate "HTC Universal core" | ||
| 3459 | + depends on MACH_HTCUNIVERSAL | ||
| 3460 | + help | ||
| 3461 | + This selection enables HTC Universal core support. | ||
| 3462 | + | ||
| 3463 | +config HTCUNIVERSAL_UDC | ||
| 3464 | + bool "USB Device Controller support" | ||
| 3465 | + depends on MACH_HTCUNIVERSAL && HTC_ASIC3 && USB_PXA27X | ||
| 3466 | + help | ||
| 3467 | + Enables HTC Universal specific USB detection | ||
| 3468 | + | ||
| 3469 | +config HTCUNIVERSAL_POWER | ||
| 3470 | + tristate "HTC Universal power" | ||
| 3471 | + depends on MACH_HTCUNIVERSAL && HTC_ASIC3 | ||
| 3472 | + help | ||
| 3473 | + This selection enables HTC Universal power monitoring | ||
| 3474 | + hardware support (through ASIC3). | ||
| 3475 | + | ||
| 3476 | +config HTCUNIVERSAL_BACKLIGHT | ||
| 3477 | + bool "HTC Universal Backlight" | ||
| 3478 | + depends on MACH_HTCUNIVERSAL && HTC_ASIC3 && BACKLIGHT_CLASS_DEVICE | ||
| 3479 | + help | ||
| 3480 | + This driver provides support for changing power and brightness | ||
| 3481 | + on HTC Universal LCD backlight. | ||
| 3482 | + | ||
| 3483 | +config HTCUNIVERSAL_LCD | ||
| 3484 | + tristate "HTC Universal LCD" | ||
| 3485 | + depends on MACH_HTCUNIVERSAL && HTC_ASIC3 && LCD_CLASS_DEVICE | ||
| 3486 | + help | ||
| 3487 | + This driver provides support for changing power and brightness | ||
| 3488 | + on HTC Universal LCD display. | ||
| 3489 | + | ||
| 3490 | +config HTCUNIVERSAL_TS2 | ||
| 3491 | + tristate "HTC Universal Touchscreen (old)" | ||
| 3492 | + depends on MACH_HTCUNIVERSAL && HTC_ASIC3 | ||
| 3493 | + help | ||
| 3494 | + Enable support for the HTC Universal Touchscreen Panel. | ||
| 3495 | + | ||
| 3496 | +config HTCUNIVERSAL_BUTTONS | ||
| 3497 | + tristate "HTC Universal buttons support" | ||
| 3498 | + depends on MACH_HTCUNIVERSAL && HTC_ASIC3 | ||
| 3499 | + | ||
| 3500 | +config HTCUNIVERSAL_BLUETOOTH | ||
| 3501 | + tristate "HTC Universal Bluetooth" | ||
| 3502 | + depends on MACH_HTCUNIVERSAL && HTCUNIVERSAL_CORE && HTC_ASIC3 | ||
| 3503 | + help | ||
| 3504 | + Enables support for the TI BRF6150 Bluetooth Module | ||
| 3505 | + in the HTC Universal. | ||
| 3506 | + | ||
| 3507 | +config HTCUNIVERSAL_ASIC3_LEDS | ||
| 3508 | + tristate "HTC Universal ASIC3 LED support" | ||
| 3509 | + select LEDS_ASIC3 | ||
| 3510 | + depends on MACH_HTCUNIVERSAL && HTCUNIVERSAL_CORE && HTC_ASIC3 | ||
| 3511 | + ---help--- | ||
| 3512 | + Support for right (colors red+green+(amber)) and left (green+blue) led | ||
| 3513 | + Off/on hook keys LED backlight | ||
| 3514 | + Keyboard backlight | ||
| 3515 | + Vibra | ||
| 3516 | + Flashlight | ||
| 3517 | + | ||
| 3518 | +config HTCUNIVERSAL_PHONE | ||
| 3519 | + tristate "HTC Universal Phone" | ||
| 3520 | + depends on MACH_HTCUNIVERSAL && HTCUNIVERSAL_CORE && HTC_ASIC3 | ||
| 3521 | + help | ||
| 3522 | + Enables support for the Qualcomm MSM6520 Phone Module | ||
| 3523 | + in the HTC Universal. | ||
| 3524 | + | ||
| 3525 | +config HTCUNIVERSAL_AK4641 | ||
| 3526 | + depends on SND && I2C | ||
| 3527 | + tristate "AK4641 chipset support" | ||
| 3528 | + | ||
| 3529 | +endmenu | ||
| 3530 | + | ||
| 3531 | +endif | ||
| 3532 | + | ||
| 3533 | endmenu | ||
| 3534 | |||
| 3535 | config MACH_POODLE | ||
| 3536 | @@ -289,4 +377,3 @@ | ||
| 3537 | depends on (PXA25x || PXA27x) && INPUT | ||
| 3538 | |||
| 3539 | endif | ||
| 3540 | - | ||
| 3541 | Index: linux-2.6.26-rc4/arch/arm/mach-pxa/Makefile | ||
| 3542 | =================================================================== | ||
| 3543 | --- linux-2.6.26-rc4.orig/arch/arm/mach-pxa/Makefile 2008-06-01 18:49:43.000000000 +0100 | ||
| 3544 | +++ linux-2.6.26-rc4/arch/arm/mach-pxa/Makefile 2008-06-01 18:50:46.000000000 +0100 | ||
| 3545 | @@ -36,6 +36,7 @@ | ||
| 3546 | obj-$(CONFIG_MACH_PCM990_BASEBOARD) += pcm990-baseboard.o | ||
| 3547 | obj-$(CONFIG_MACH_TOSA) += tosa.o | ||
| 3548 | obj-$(CONFIG_MACH_EM_X270) += em-x270.o | ||
| 3549 | +obj-$(CONFIG_MACH_HTCUNIVERSAL) += htcuniversal/ | ||
| 3550 | obj-$(CONFIG_MACH_MAGICIAN) += magician.o | ||
| 3551 | obj-$(CONFIG_ARCH_PXA_ESERIES) += eseries.o | ||
| 3552 | |||
| 3553 | Index: linux-2.6.26-rc4/drivers/leds/Kconfig | ||
| 3554 | =================================================================== | ||
| 3555 | --- linux-2.6.26-rc4.orig/drivers/leds/Kconfig 2008-05-26 19:08:11.000000000 +0100 | ||
| 3556 | +++ linux-2.6.26-rc4/drivers/leds/Kconfig 2008-06-01 18:49:45.000000000 +0100 | ||
| 3557 | @@ -147,6 +147,13 @@ | ||
| 3558 | To compile this driver as a module, choose M here: the | ||
| 3559 | module will be called leds-clevo-mail. | ||
| 3560 | |||
| 3561 | +config LEDS_ASIC3 | ||
| 3562 | + tristate "LED Support for the HTC ASIC3 chip" | ||
| 3563 | + depends on LEDS_CLASS && HTC_ASIC3 | ||
| 3564 | + help | ||
| 3565 | + This option enables support for the LEDs connected to the | ||
| 3566 | + HTC ASIC3 chip. | ||
| 3567 | + | ||
| 3568 | comment "LED Triggers" | ||
| 3569 | |||
| 3570 | config LEDS_TRIGGERS | ||
| 3571 | Index: linux-2.6.26-rc4/drivers/leds/leds-asic3.c | ||
| 3572 | =================================================================== | ||
| 3573 | --- /dev/null 1970-01-01 00:00:00.000000000 +0000 | ||
| 3574 | +++ linux-2.6.26-rc4/drivers/leds/leds-asic3.c 2008-06-01 18:49:45.000000000 +0100 | ||
| 3575 | @@ -0,0 +1,189 @@ | ||
| 3576 | +/* | ||
| 3577 | + * LEDs support for HTC ASIC3 devices. | ||
| 3578 | + * | ||
| 3579 | + * Copyright (c) 2006 Anton Vorontsov <cbou@mail.ru> | ||
| 3580 | + * | ||
| 3581 | + * This file is subject to the terms and conditions of the GNU General Public | ||
| 3582 | + * License. See the file COPYING in the main directory of this archive for | ||
| 3583 | + * more details. | ||
| 3584 | + * | ||
| 3585 | + */ | ||
| 3586 | + | ||
| 3587 | +#include <linux/kernel.h> | ||
| 3588 | +#include <linux/init.h> | ||
| 3589 | +#include <linux/platform_device.h> | ||
| 3590 | +#include <linux/leds.h> | ||
| 3591 | +#include "leds.h" | ||
| 3592 | + | ||
| 3593 | +#include <asm/hardware/ipaq-asic3.h> | ||
| 3594 | +#include <linux/soc/asic3_base.h> | ||
| 3595 | +#include <asm/mach-types.h> | ||
| 3596 | +#include <asm/hardware/asic3_leds.h> | ||
| 3597 | + | ||
| 3598 | +#ifdef DEBUG | ||
| 3599 | +#define dbg(msg, ...) printk(msg, __VA_ARGS__) | ||
| 3600 | +#else | ||
| 3601 | +#define dbg(msg, ...) | ||
| 3602 | +#endif | ||
| 3603 | + | ||
| 3604 | +static | ||
| 3605 | +void asic3_leds_set(struct led_classdev *led_cdev, enum led_brightness b) | ||
| 3606 | +{ | ||
| 3607 | + struct asic3_led *led = container_of(led_cdev, struct asic3_led, | ||
| 3608 | + led_cdev); | ||
| 3609 | + struct asic3_leds_machinfo *machinfo = led->machinfo; | ||
| 3610 | + struct device *asic3_dev = &machinfo->asic3_pdev->dev; | ||
| 3611 | + | ||
| 3612 | + dbg("%s:%s %d(%d)-%s %d\n", __FILE__, __FUNCTION__, led->hw_num, | ||
| 3613 | + led->gpio_num, led->led_cdev.name, b); | ||
| 3614 | + | ||
| 3615 | + if (led->hw_num == -1) { | ||
| 3616 | + asic3_gpio_set_value(asic3_dev, led->gpio_num, b); | ||
| 3617 | + return; | ||
| 3618 | + } | ||
| 3619 | + | ||
| 3620 | + if (b == LED_OFF) { | ||
| 3621 | + asic3_set_led(asic3_dev, led->hw_num, 0, 16, 6); | ||
| 3622 | + asic3_set_gpio_out_c(asic3_dev, led->hw_num, 0); | ||
| 3623 | + } | ||
| 3624 | + else { | ||
| 3625 | + asic3_set_gpio_out_c(asic3_dev, led->hw_num, led->hw_num); | ||
| 3626 | + #ifdef CONFIG_LEDS_TRIGGER_HWTIMER | ||
| 3627 | + if (led_cdev->trigger && led_cdev->trigger->is_led_supported && | ||
| 3628 | + (led_cdev->trigger->is_led_supported(led_cdev) & | ||
| 3629 | + LED_SUPPORTS_HWTIMER)) { | ||
| 3630 | + struct hwtimer_data *td = led_cdev->trigger_data; | ||
| 3631 | + if (!td) return; | ||
| 3632 | + asic3_set_led(asic3_dev, led->hw_num, td->delay_on/8, | ||
| 3633 | + (td->delay_on + td->delay_off)/8, 6); | ||
| 3634 | + } | ||
| 3635 | + else | ||
| 3636 | + #endif | ||
| 3637 | + asic3_set_led(asic3_dev, led->hw_num, 16, 16, 6); | ||
| 3638 | + } | ||
| 3639 | + | ||
| 3640 | + return; | ||
| 3641 | +} | ||
| 3642 | + | ||
| 3643 | +static | ||
| 3644 | +int asic3_leds_probe(struct platform_device *pdev) | ||
| 3645 | +{ | ||
| 3646 | + struct asic3_leds_machinfo *machinfo = pdev->dev.platform_data; | ||
| 3647 | + struct asic3_led *leds = machinfo->leds; | ||
| 3648 | + int ret, i = 0; | ||
| 3649 | + | ||
| 3650 | + dbg("%s:%s\n", __FILE__, __FUNCTION__); | ||
| 3651 | + | ||
| 3652 | + // Turn on clocks early, for the case if trigger would enable | ||
| 3653 | + // led immediately after led_classdev_register(). | ||
| 3654 | + asic3_set_clock_cdex(&machinfo->asic3_pdev->dev, | ||
| 3655 | + CLOCK_CDEX_LED0 | CLOCK_CDEX_LED1 | CLOCK_CDEX_LED2, | ||
| 3656 | + CLOCK_CDEX_LED0 | CLOCK_CDEX_LED1 | CLOCK_CDEX_LED2); | ||
| 3657 | + | ||
| 3658 | + for (i = 0; i < machinfo->num_leds; i++) { | ||
| 3659 | + leds[i].machinfo = machinfo; | ||
| 3660 | + leds[i].led_cdev.brightness_set = asic3_leds_set; | ||
| 3661 | + ret = led_classdev_register(&pdev->dev, &leds[i].led_cdev); | ||
| 3662 | + if (ret) { | ||
| 3663 | + printk(KERN_ERR "Error: can't register %s led\n", | ||
| 3664 | + leds[i].led_cdev.name); | ||
| 3665 | + goto out_err; | ||
| 3666 | + } | ||
| 3667 | + } | ||
| 3668 | + | ||
| 3669 | + return 0; | ||
| 3670 | + | ||
| 3671 | +out_err: | ||
| 3672 | + while (--i >= 0) led_classdev_unregister(&leds[i].led_cdev); | ||
| 3673 | + | ||
| 3674 | + asic3_set_clock_cdex(&machinfo->asic3_pdev->dev, | ||
| 3675 | + CLOCK_CDEX_LED0 | CLOCK_CDEX_LED1 | CLOCK_CDEX_LED2, | ||
| 3676 | + 0 | 0 | 0); | ||
| 3677 | + | ||
| 3678 | + return ret; | ||
| 3679 | +} | ||
| 3680 | + | ||
| 3681 | +static | ||
| 3682 | +int asic3_leds_remove(struct platform_device *pdev) | ||
| 3683 | +{ | ||
| 3684 | + struct asic3_leds_machinfo *machinfo = pdev->dev.platform_data; | ||
| 3685 | + struct asic3_led *leds = machinfo->leds; | ||
| 3686 | + int i = 0; | ||
| 3687 | + | ||
| 3688 | + dbg("%s:%s\n", __FILE__, __FUNCTION__); | ||
| 3689 | + | ||
| 3690 | + for (i = 0; i < machinfo->num_leds; i++) | ||
| 3691 | + led_classdev_unregister(&leds[i].led_cdev); | ||
| 3692 | + | ||
| 3693 | + asic3_set_clock_cdex(&machinfo->asic3_pdev->dev, | ||
| 3694 | + CLOCK_CDEX_LED0 | CLOCK_CDEX_LED1 | CLOCK_CDEX_LED2, | ||
| 3695 | + 0 | 0 | 0); | ||
| 3696 | + | ||
| 3697 | + return 0; | ||
| 3698 | +} | ||
| 3699 | + | ||
| 3700 | +#ifdef CONFIG_PM | ||
| 3701 | + | ||
| 3702 | +static | ||
| 3703 | +int asic3_leds_suspend(struct platform_device *pdev, pm_message_t state) | ||
| 3704 | +{ | ||
| 3705 | + struct asic3_leds_machinfo *machinfo = pdev->dev.platform_data; | ||
| 3706 | + struct asic3_led *leds = machinfo->leds; | ||
| 3707 | + int i = 0; | ||
| 3708 | + | ||
| 3709 | + dbg("%s:%s\n", __FILE__, __FUNCTION__); | ||
| 3710 | + | ||
| 3711 | + for (i = 0; i < machinfo->num_leds; i++) | ||
| 3712 | + led_classdev_suspend(&leds[i].led_cdev); | ||
| 3713 | + | ||
| 3714 | + return 0; | ||
| 3715 | +} | ||
| 3716 | + | ||
| 3717 | +static | ||
| 3718 | +int asic3_leds_resume(struct platform_device *pdev) | ||
| 3719 | +{ | ||
| 3720 | + struct asic3_leds_machinfo *machinfo = pdev->dev.platform_data; | ||
| 3721 | + struct asic3_led *leds = machinfo->leds; | ||
| 3722 | + int i = 0; | ||
| 3723 | + | ||
| 3724 | + dbg("%s:%s\n", __FILE__, __FUNCTION__); | ||
| 3725 | + | ||
| 3726 | + for (i = 0; i < machinfo->num_leds; i++) | ||
| 3727 | + led_classdev_resume(&leds[i].led_cdev); | ||
| 3728 | + | ||
| 3729 | + return 0; | ||
| 3730 | +} | ||
| 3731 | + | ||
| 3732 | +#endif | ||
| 3733 | + | ||
| 3734 | +static | ||
| 3735 | +struct platform_driver asic3_leds_driver = { | ||
| 3736 | + .probe = asic3_leds_probe, | ||
| 3737 | + .remove = asic3_leds_remove, | ||
| 3738 | +#ifdef CONFIG_PM | ||
| 3739 | + .suspend = asic3_leds_suspend, | ||
| 3740 | + .resume = asic3_leds_resume, | ||
| 3741 | +#endif | ||
| 3742 | + .driver = { | ||
| 3743 | + .name = "asic3-leds", | ||
| 3744 | + }, | ||
| 3745 | +}; | ||
| 3746 | + | ||
| 3747 | +int asic3_leds_register(void) | ||
| 3748 | +{ | ||
| 3749 | + dbg("%s:%s\n", __FILE__, __FUNCTION__); | ||
| 3750 | + return platform_driver_register(&asic3_leds_driver); | ||
| 3751 | +} | ||
| 3752 | + | ||
| 3753 | +void asic3_leds_unregister(void) | ||
| 3754 | +{ | ||
| 3755 | + platform_driver_unregister(&asic3_leds_driver); | ||
| 3756 | + return; | ||
| 3757 | +} | ||
| 3758 | + | ||
| 3759 | +EXPORT_SYMBOL_GPL(asic3_leds_register); | ||
| 3760 | +EXPORT_SYMBOL_GPL(asic3_leds_unregister); | ||
| 3761 | + | ||
| 3762 | +MODULE_AUTHOR("Anton Vorontsov <cbou@mail.ru>"); | ||
| 3763 | +MODULE_DESCRIPTION("HTC ASIC3 LEDs driver"); | ||
| 3764 | +MODULE_LICENSE("GPL"); | ||
| 3765 | Index: linux-2.6.26-rc4/drivers/mfd/Kconfig | ||
| 3766 | =================================================================== | ||
| 3767 | --- linux-2.6.26-rc4.orig/drivers/mfd/Kconfig 2008-06-01 18:49:43.000000000 +0100 | ||
| 3768 | +++ linux-2.6.26-rc4/drivers/mfd/Kconfig 2008-06-01 18:49:45.000000000 +0100 | ||
| 3769 | @@ -44,6 +44,16 @@ | ||
| 3770 | help | ||
| 3771 | Support for TI TSC2101 Touchscreen and Audio Codec | ||
| 3772 | |||
| 3773 | +config HTC_ASIC3 | ||
| 3774 | + tristate "HTC ASIC3 (iPAQ h1900/h3900/h4000/hx4700/rx3000) support" | ||
| 3775 | + | ||
| 3776 | +config HTC_ASIC3_DS1WM | ||
| 3777 | + bool "Support HTC ASIC3 builtin DS1WM block" | ||
| 3778 | + help | ||
| 3779 | + Choose Y here if you want to include support for ASIC3's builtin | ||
| 3780 | + W1 controller. Some devices do not use it, and yet other have | ||
| 3781 | + separate DS1WM controller. For them, choose N. | ||
| 3782 | + | ||
| 3783 | endmenu | ||
| 3784 | |||
| 3785 | menu "Multimedia Capabilities Port drivers" | ||
| 3786 | Index: linux-2.6.26-rc4/drivers/mfd/Makefile | ||
| 3787 | =================================================================== | ||
| 3788 | --- linux-2.6.26-rc4.orig/drivers/mfd/Makefile 2008-06-01 18:49:43.000000000 +0100 | ||
| 3789 | +++ linux-2.6.26-rc4/drivers/mfd/Makefile 2008-06-01 18:49:45.000000000 +0100 | ||
| 3790 | @@ -2,6 +2,8 @@ | ||
| 3791 | # Makefile for multifunction miscellaneous devices | ||
| 3792 | # | ||
| 3793 | |||
| 3794 | +obj-$(CONFIG_HTC_ASIC3) += asic3_base.o soc-core.o | ||
| 3795 | + | ||
| 3796 | obj-$(CONFIG_MFD_SM501) += sm501.o | ||
| 3797 | obj-$(CONFIG_MFD_ASIC3) += asic3.o | ||
| 3798 | |||
| 3799 | Index: linux-2.6.26-rc4/drivers/mfd/asic3_base.c | ||
| 3800 | =================================================================== | ||
| 3801 | --- /dev/null 1970-01-01 00:00:00.000000000 +0000 | ||
| 3802 | +++ linux-2.6.26-rc4/drivers/mfd/asic3_base.c 2008-06-01 18:49:45.000000000 +0100 | ||
| 3803 | @@ -0,0 +1,1208 @@ | ||
| 3804 | +/* | ||
| 3805 | + * Driver interface to HTC "ASIC3" | ||
| 3806 | + * | ||
| 3807 | + * Copyright 2001 Compaq Computer Corporation. | ||
| 3808 | + * Copyright 2004-2005 Phil Blundell | ||
| 3809 | + * | ||
| 3810 | + * This program is free software; you can redistribute it and/or modify | ||
| 3811 | + * it under the terms of the GNU General Public License as published by | ||
| 3812 | + * the Free Software Foundation; either version 2 of the License, or | ||
| 3813 | + * (at your option) any later version. | ||
| 3814 | + * | ||
| 3815 | + * COMPAQ COMPUTER CORPORATION MAKES NO WARRANTIES, EXPRESSED OR IMPLIED, | ||
| 3816 | + * AS TO THE USEFULNESS OR CORRECTNESS OF THIS CODE OR ITS | ||
| 3817 | + * FITNESS FOR ANY PARTICULAR PURPOSE. | ||
| 3818 | + * | ||
| 3819 | + * Author: Andrew Christian | ||
| 3820 | + * <Andrew.Christian@compaq.com> | ||
| 3821 | + * October 2001 | ||
| 3822 | + */ | ||
| 3823 | + | ||
| 3824 | +#include <linux/module.h> | ||
| 3825 | +#include <linux/version.h> | ||
| 3826 | +#include <linux/platform_device.h> | ||
| 3827 | +#include <linux/delay.h> | ||
| 3828 | +#include <linux/init.h> | ||
| 3829 | +#include <linux/irq.h> | ||
| 3830 | +#include <linux/clk.h> | ||
| 3831 | +#include <linux/ds1wm.h> | ||
| 3832 | +#include <asm/arch/clock.h> | ||
| 3833 | + | ||
| 3834 | +#include <asm/hardware.h> | ||
| 3835 | +#include <asm/irq.h> | ||
| 3836 | +#include <asm/io.h> | ||
| 3837 | + | ||
| 3838 | +#include <asm/hardware/ipaq-asic3.h> | ||
| 3839 | +#include <linux/soc/asic3_base.h> | ||
| 3840 | +#include <linux/soc/tmio_mmc.h> | ||
| 3841 | +#include "soc-core.h" | ||
| 3842 | + | ||
| 3843 | + | ||
| 3844 | +struct asic3_data { | ||
| 3845 | + void *mapping; | ||
| 3846 | + unsigned int bus_shift; | ||
| 3847 | + int irq_base; | ||
| 3848 | + int irq_nr; | ||
| 3849 | + | ||
| 3850 | + u16 irq_bothedge[4]; | ||
| 3851 | + struct device *dev; | ||
| 3852 | + | ||
| 3853 | + struct platform_device *mmc_dev; | ||
| 3854 | +}; | ||
| 3855 | + | ||
| 3856 | +static DEFINE_SPINLOCK(asic3_gpio_lock); | ||
| 3857 | + | ||
| 3858 | +static int asic3_remove(struct platform_device *dev); | ||
| 3859 | + | ||
| 3860 | +static inline unsigned long asic3_address(struct device *dev, | ||
| 3861 | + unsigned int reg) | ||
| 3862 | +{ | ||
| 3863 | + struct asic3_data *adata; | ||
| 3864 | + | ||
| 3865 | + adata = (struct asic3_data *)dev->driver_data; | ||
| 3866 | + | ||
| 3867 | + return (unsigned long)adata->mapping + (reg >> (2 - adata->bus_shift)); | ||
| 3868 | +} | ||
| 3869 | + | ||
| 3870 | +void asic3_write_register(struct device *dev, unsigned int reg, u32 value) | ||
| 3871 | +{ | ||
| 3872 | + __raw_writew(value, asic3_address(dev, reg)); | ||
| 3873 | +} | ||
| 3874 | +EXPORT_SYMBOL(asic3_write_register); | ||
| 3875 | + | ||
| 3876 | +u32 asic3_read_register(struct device *dev, unsigned int reg) | ||
| 3877 | +{ | ||
| 3878 | + return __raw_readw(asic3_address(dev, reg)); | ||
| 3879 | +} | ||
| 3880 | +EXPORT_SYMBOL(asic3_read_register); | ||
| 3881 | + | ||
| 3882 | +static inline void __asic3_write_register(struct asic3_data *asic, | ||
| 3883 | + unsigned int reg, u32 value) | ||
| 3884 | +{ | ||
| 3885 | + __raw_writew(value, (unsigned long)asic->mapping | ||
| 3886 | + + (reg >> (2 - asic->bus_shift))); | ||
| 3887 | +} | ||
| 3888 | + | ||
| 3889 | +static inline u32 __asic3_read_register(struct asic3_data *asic, | ||
| 3890 | + unsigned int reg) | ||
| 3891 | +{ | ||
| 3892 | + return __raw_readw((unsigned long)asic->mapping | ||
| 3893 | + + (reg >> (2 - asic->bus_shift))); | ||
| 3894 | +} | ||
| 3895 | + | ||
| 3896 | +#define ASIC3_GPIO_FN(get_fn_name, set_fn_name, REG) \ | ||
| 3897 | +u32 get_fn_name(struct device *dev) \ | ||
| 3898 | +{ \ | ||
| 3899 | + return asic3_read_register(dev, REG); \ | ||
| 3900 | +} \ | ||
| 3901 | +EXPORT_SYMBOL(get_fn_name); \ | ||
| 3902 | + \ | ||
| 3903 | +void set_fn_name(struct device *dev, u32 bits, u32 val) \ | ||
| 3904 | +{ \ | ||
| 3905 | + unsigned long flags; \ | ||
| 3906 | + \ | ||
| 3907 | + spin_lock_irqsave(&asic3_gpio_lock, flags); \ | ||
| 3908 | + val |= (asic3_read_register(dev, REG) & ~bits); \ | ||
| 3909 | + asic3_write_register(dev, REG, val); \ | ||
| 3910 | + spin_unlock_irqrestore(&asic3_gpio_lock, flags); \ | ||
| 3911 | +} \ | ||
| 3912 | +EXPORT_SYMBOL(set_fn_name); | ||
| 3913 | + | ||
| 3914 | +#define ASIC3_GPIO_REGISTER(ACTION, action, fn, FN) \ | ||
| 3915 | + ASIC3_GPIO_FN(asic3_get_gpio_ ## action ## _ ## fn , \ | ||
| 3916 | + asic3_set_gpio_ ## action ## _ ## fn , \ | ||
| 3917 | + _IPAQ_ASIC3_GPIO_ ## FN ## _Base \ | ||
| 3918 | + + _IPAQ_ASIC3_GPIO_ ## ACTION ) | ||
| 3919 | + | ||
| 3920 | +#define ASIC3_GPIO_FUNCTIONS(fn, FN) \ | ||
| 3921 | + ASIC3_GPIO_REGISTER(Direction, dir, fn, FN) \ | ||
| 3922 | + ASIC3_GPIO_REGISTER(Out, out, fn, FN) \ | ||
| 3923 | + ASIC3_GPIO_REGISTER(SleepMask, sleepmask, fn, FN) \ | ||
| 3924 | + ASIC3_GPIO_REGISTER(SleepOut, sleepout, fn, FN) \ | ||
| 3925 | + ASIC3_GPIO_REGISTER(BattFaultOut, battfaultout, fn, FN) \ | ||
| 3926 | + ASIC3_GPIO_REGISTER(AltFunction, alt_fn, fn, FN) \ | ||
| 3927 | + ASIC3_GPIO_REGISTER(SleepConf, sleepconf, fn, FN) \ | ||
| 3928 | + ASIC3_GPIO_REGISTER(Status, status, fn, FN) | ||
| 3929 | + | ||
| 3930 | +#if 0 | ||
| 3931 | + ASIC3_GPIO_REGISTER(Mask, mask, fn, FN) | ||
| 3932 | + ASIC3_GPIO_REGISTER(TriggerType, trigtype, fn, FN) | ||
| 3933 | + ASIC3_GPIO_REGISTER(EdgeTrigger, rising, fn, FN) | ||
| 3934 | + ASIC3_GPIO_REGISTER(LevelTrigger, triglevel, fn, FN) | ||
| 3935 | + ASIC3_GPIO_REGISTER(IntStatus, intstatus, fn, FN) | ||
| 3936 | +#endif | ||
| 3937 | + | ||
| 3938 | +ASIC3_GPIO_FUNCTIONS(a, A) | ||
| 3939 | +ASIC3_GPIO_FUNCTIONS(b, B) | ||
| 3940 | +ASIC3_GPIO_FUNCTIONS(c, C) | ||
| 3941 | +ASIC3_GPIO_FUNCTIONS(d, D) | ||
| 3942 | + | ||
| 3943 | +int asic3_gpio_get_value(struct device *dev, unsigned gpio) | ||
| 3944 | +{ | ||
| 3945 | + u32 mask = ASIC3_GPIO_bit(gpio); | ||
| 3946 | + printk("%s(%d)\n", __FUNCTION__, gpio); | ||
| 3947 | + switch (gpio >> 4) { | ||
| 3948 | + case _IPAQ_ASIC3_GPIO_BANK_A: | ||
| 3949 | + return asic3_get_gpio_status_a(dev) & mask; | ||
| 3950 | + case _IPAQ_ASIC3_GPIO_BANK_B: | ||
| 3951 | + return asic3_get_gpio_status_b(dev) & mask; | ||
| 3952 | + case _IPAQ_ASIC3_GPIO_BANK_C: | ||
| 3953 | + return asic3_get_gpio_status_c(dev) & mask; | ||
| 3954 | + case _IPAQ_ASIC3_GPIO_BANK_D: | ||
| 3955 | + return asic3_get_gpio_status_d(dev) & mask; | ||
| 3956 | + } | ||
| 3957 | + | ||
| 3958 | + printk(KERN_ERR "%s: invalid GPIO value 0x%x", __FUNCTION__, gpio); | ||
| 3959 | + return 0; | ||
| 3960 | +} | ||
| 3961 | +EXPORT_SYMBOL(asic3_gpio_get_value); | ||
| 3962 | + | ||
| 3963 | +void asic3_gpio_set_value(struct device *dev, unsigned gpio, int val) | ||
| 3964 | +{ | ||
| 3965 | + u32 mask = ASIC3_GPIO_bit(gpio); | ||
| 3966 | + u32 bitval = 0; | ||
| 3967 | + if (val) bitval = mask; | ||
| 3968 | + printk("%s(%d, %d)\n", __FUNCTION__, gpio, val); | ||
| 3969 | + | ||
| 3970 | + switch (gpio >> 4) { | ||
| 3971 | + case _IPAQ_ASIC3_GPIO_BANK_A: | ||
| 3972 | + asic3_set_gpio_out_a(dev, mask, bitval); | ||
| 3973 | + return; | ||
| 3974 | + case _IPAQ_ASIC3_GPIO_BANK_B: | ||
| 3975 | + asic3_set_gpio_out_b(dev, mask, bitval); | ||
| 3976 | + return; | ||
| 3977 | + case _IPAQ_ASIC3_GPIO_BANK_C: | ||
| 3978 | + asic3_set_gpio_out_c(dev, mask, bitval); | ||
| 3979 | + return; | ||
| 3980 | + case _IPAQ_ASIC3_GPIO_BANK_D: | ||
| 3981 | + asic3_set_gpio_out_d(dev, mask, bitval); | ||
| 3982 | + return; | ||
| 3983 | + } | ||
| 3984 | + | ||
| 3985 | + printk(KERN_ERR "%s: invalid GPIO value 0x%x", __FUNCTION__, gpio); | ||
| 3986 | +} | ||
| 3987 | +EXPORT_SYMBOL(asic3_gpio_set_value); | ||
| 3988 | + | ||
| 3989 | +int asic3_irq_base(struct device *dev) | ||
| 3990 | +{ | ||
| 3991 | + struct asic3_data *asic = dev->driver_data; | ||
| 3992 | + | ||
| 3993 | + return asic->irq_base; | ||
| 3994 | +} | ||
| 3995 | +EXPORT_SYMBOL(asic3_irq_base); | ||
| 3996 | + | ||
| 3997 | +static int asic3_gpio_to_irq(struct device *dev, unsigned gpio) | ||
| 3998 | +{ | ||
| 3999 | + struct asic3_data *asic = dev->driver_data; | ||
| 4000 | + printk("%s(%d)\n", __FUNCTION__, gpio); | ||
| 4001 | + | ||
| 4002 | + return asic->irq_base + gpio; | ||
| 4003 | +} | ||
| 4004 | + | ||
| 4005 | +void asic3_set_led(struct device *dev, int led_num, int duty_time, | ||
| 4006 | + int cycle_time, int timebase) | ||
| 4007 | +{ | ||
| 4008 | + struct asic3_data *asic = dev->driver_data; | ||
| 4009 | + unsigned int led_base; | ||
| 4010 | + | ||
| 4011 | + /* it's a macro thing: see #define _IPAQ_ASIC_LED_0_Base for why you | ||
| 4012 | + * can't substitute led_num in the macros below... | ||
| 4013 | + */ | ||
| 4014 | + | ||
| 4015 | + switch (led_num) { | ||
| 4016 | + case 0: | ||
| 4017 | + led_base = _IPAQ_ASIC3_LED_0_Base; | ||
| 4018 | + break; | ||
| 4019 | + case 1: | ||
| 4020 | + led_base = _IPAQ_ASIC3_LED_1_Base; | ||
| 4021 | + break; | ||
| 4022 | + case 2: | ||
| 4023 | + led_base = _IPAQ_ASIC3_LED_2_Base; | ||
| 4024 | + break; | ||
| 4025 | + default: | ||
| 4026 | + printk(KERN_ERR "%s: invalid led number %d", __FUNCTION__, | ||
| 4027 | + led_num); | ||
| 4028 | + return; | ||
| 4029 | + } | ||
| 4030 | + | ||
| 4031 | + __asic3_write_register(asic, led_base + _IPAQ_ASIC3_LED_TimeBase, | ||
| 4032 | + timebase | LED_EN); | ||
| 4033 | + __asic3_write_register(asic, led_base + _IPAQ_ASIC3_LED_PeriodTime, | ||
| 4034 | + cycle_time); | ||
| 4035 | + __asic3_write_register(asic, led_base + _IPAQ_ASIC3_LED_DutyTime, | ||
| 4036 | + 0); | ||
| 4037 | + udelay(20); /* asic voodoo - possibly need a whole duty cycle? */ | ||
| 4038 | + __asic3_write_register(asic, led_base + _IPAQ_ASIC3_LED_DutyTime, | ||
| 4039 | + duty_time); | ||
| 4040 | +} | ||
| 4041 | +EXPORT_SYMBOL(asic3_set_led); | ||
| 4042 | + | ||
| 4043 | +void asic3_set_clock_sel(struct device *dev, u32 bits, u32 val) | ||
| 4044 | +{ | ||
| 4045 | + struct asic3_data *asic = dev->driver_data; | ||
| 4046 | + unsigned long flags; | ||
| 4047 | + u32 v; | ||
| 4048 | + | ||
| 4049 | + spin_lock_irqsave(&asic3_gpio_lock, flags); | ||
| 4050 | + v = __asic3_read_register(asic, IPAQ_ASIC3_OFFSET(CLOCK, SEL)); | ||
| 4051 | + v = (v & ~bits) | val; | ||
| 4052 | + __asic3_write_register(asic, IPAQ_ASIC3_OFFSET(CLOCK, SEL), v); | ||
| 4053 | + spin_unlock_irqrestore(&asic3_gpio_lock, flags); | ||
| 4054 | +} | ||
| 4055 | +EXPORT_SYMBOL(asic3_set_clock_sel); | ||
| 4056 | + | ||
| 4057 | +void asic3_set_clock_cdex(struct device *dev, u32 bits, u32 val) | ||
| 4058 | +{ | ||
| 4059 | + struct asic3_data *asic = dev->driver_data; | ||
| 4060 | + unsigned long flags; | ||
| 4061 | + u32 v; | ||
| 4062 | + | ||
| 4063 | + spin_lock_irqsave(&asic3_gpio_lock, flags); | ||
| 4064 | + v = __asic3_read_register(asic, IPAQ_ASIC3_OFFSET(CLOCK, CDEX)); | ||
| 4065 | + v = (v & ~bits) | val; | ||
| 4066 | + __asic3_write_register(asic, IPAQ_ASIC3_OFFSET(CLOCK, CDEX), v); | ||
| 4067 | + spin_unlock_irqrestore(&asic3_gpio_lock, flags); | ||
| 4068 | +} | ||
| 4069 | +EXPORT_SYMBOL(asic3_set_clock_cdex); | ||
| 4070 | + | ||
| 4071 | +static void asic3_clock_cdex_enable(struct clk *clk) | ||
| 4072 | +{ | ||
| 4073 | + struct asic3_data *asic = (struct asic3_data *)clk->parent->ctrlbit; | ||
| 4074 | + unsigned long flags, val; | ||
| 4075 | + | ||
| 4076 | + local_irq_save(flags); | ||
| 4077 | + | ||
| 4078 | + val = __asic3_read_register(asic, IPAQ_ASIC3_OFFSET(CLOCK, CDEX)); | ||
| 4079 | + val |= clk->ctrlbit; | ||
| 4080 | + __asic3_write_register(asic, IPAQ_ASIC3_OFFSET(CLOCK, CDEX), val); | ||
| 4081 | + | ||
| 4082 | + local_irq_restore(flags); | ||
| 4083 | +} | ||
| 4084 | + | ||
| 4085 | +static void asic3_clock_cdex_disable(struct clk *clk) | ||
| 4086 | +{ | ||
| 4087 | + struct asic3_data *asic = (struct asic3_data *)clk->parent->ctrlbit; | ||
| 4088 | + unsigned long flags, val; | ||
| 4089 | + | ||
| 4090 | + local_irq_save(flags); | ||
| 4091 | + | ||
| 4092 | + val = __asic3_read_register(asic, IPAQ_ASIC3_OFFSET(CLOCK, CDEX)); | ||
| 4093 | + val &= ~clk->ctrlbit; | ||
| 4094 | + __asic3_write_register(asic, IPAQ_ASIC3_OFFSET(CLOCK, CDEX), val); | ||
| 4095 | + | ||
| 4096 | + local_irq_restore(flags); | ||
| 4097 | +} | ||
| 4098 | + | ||
| 4099 | +/* base clocks */ | ||
| 4100 | + | ||
| 4101 | +static struct clk clk_g = { | ||
| 4102 | + .name = "gclk", | ||
| 4103 | + .rate = 0, | ||
| 4104 | + .parent = NULL, | ||
| 4105 | +}; | ||
| 4106 | + | ||
| 4107 | +/* clock definitions */ | ||
| 4108 | + | ||
| 4109 | +static struct clk asic3_clocks[] = { | ||
| 4110 | + { | ||
| 4111 | + .name = "spi", | ||
| 4112 | + .id = -1, | ||
| 4113 | + .parent = &clk_g, | ||
| 4114 | + .enable = asic3_clock_cdex_enable, | ||
| 4115 | + .disable = asic3_clock_cdex_disable, | ||
| 4116 | + .ctrlbit = CLOCK_CDEX_SPI, | ||
| 4117 | + }, | ||
| 4118 | +#ifdef CONFIG_HTC_ASIC3_DS1WM | ||
| 4119 | + { | ||
| 4120 | + .name = "ds1wm", | ||
| 4121 | + .id = -1, | ||
| 4122 | + .rate = 5000000, | ||
| 4123 | + .parent = &clk_g, | ||
| 4124 | + .enable = asic3_clock_cdex_enable, | ||
| 4125 | + .disable = asic3_clock_cdex_disable, | ||
| 4126 | + .ctrlbit = CLOCK_CDEX_OWM, | ||
| 4127 | + }, | ||
| 4128 | +#endif | ||
| 4129 | + { | ||
| 4130 | + .name = "pwm0", | ||
| 4131 | + .id = -1, | ||
| 4132 | + .parent = &clk_g, | ||
| 4133 | + .enable = asic3_clock_cdex_enable, | ||
| 4134 | + .disable = asic3_clock_cdex_disable, | ||
| 4135 | + .ctrlbit = CLOCK_CDEX_PWM0, | ||
| 4136 | + }, | ||
| 4137 | + { | ||
| 4138 | + .name = "pwm1", | ||
| 4139 | + .id = -1, | ||
| 4140 | + .parent = &clk_g, | ||
| 4141 | + .enable = asic3_clock_cdex_enable, | ||
| 4142 | + .disable = asic3_clock_cdex_disable, | ||
| 4143 | + .ctrlbit = CLOCK_CDEX_PWM1, | ||
| 4144 | + }, | ||
| 4145 | + { | ||
| 4146 | + .name = "led0", | ||
| 4147 | + .id = -1, | ||
| 4148 | + .parent = &clk_g, | ||
| 4149 | + .enable = asic3_clock_cdex_enable, | ||
| 4150 | + .disable = asic3_clock_cdex_disable, | ||
| 4151 | + .ctrlbit = CLOCK_CDEX_LED0, | ||
| 4152 | + }, | ||
| 4153 | + { | ||
| 4154 | + .name = "led1", | ||
| 4155 | + .id = -1, | ||
| 4156 | + .parent = &clk_g, | ||
| 4157 | + .enable = asic3_clock_cdex_enable, | ||
| 4158 | + .disable = asic3_clock_cdex_disable, | ||
| 4159 | + .ctrlbit = CLOCK_CDEX_LED1, | ||
| 4160 | + }, | ||
| 4161 | + { | ||
| 4162 | + .name = "led2", | ||
| 4163 | + .id = -1, | ||
| 4164 | + .parent = &clk_g, | ||
| 4165 | + .enable = asic3_clock_cdex_enable, | ||
| 4166 | + .disable = asic3_clock_cdex_disable, | ||
| 4167 | + .ctrlbit = CLOCK_CDEX_LED2, | ||
| 4168 | + }, | ||
| 4169 | + { | ||
| 4170 | + .name = "smbus", | ||
| 4171 | + .id = -1, | ||
| 4172 | + .parent = &clk_g, | ||
| 4173 | + .enable = asic3_clock_cdex_enable, | ||
| 4174 | + .disable = asic3_clock_cdex_disable, | ||
| 4175 | + .ctrlbit = CLOCK_CDEX_SMBUS, | ||
| 4176 | + }, | ||
| 4177 | + { | ||
| 4178 | + .name = "ex0", | ||
| 4179 | + .id = -1, | ||
| 4180 | + .parent = &clk_g, | ||
| 4181 | + .enable = asic3_clock_cdex_enable, | ||
| 4182 | + .disable = asic3_clock_cdex_disable, | ||
| 4183 | + .ctrlbit = CLOCK_CDEX_EX0, | ||
| 4184 | + }, | ||
| 4185 | + { | ||
| 4186 | + .name = "ex1", | ||
| 4187 | + .id = -1, | ||
| 4188 | + .parent = &clk_g, | ||
| 4189 | + .enable = asic3_clock_cdex_enable, | ||
| 4190 | + .disable = asic3_clock_cdex_disable, | ||
| 4191 | + .ctrlbit = CLOCK_CDEX_EX1, | ||
| 4192 | + }, | ||
| 4193 | +}; | ||
| 4194 | + | ||
| 4195 | +void asic3_set_extcf_select(struct device *dev, u32 bits, u32 val) | ||
| 4196 | +{ | ||
| 4197 | + struct asic3_data *asic = dev->driver_data; | ||
| 4198 | + unsigned long flags; | ||
| 4199 | + u32 v; | ||
| 4200 | + | ||
| 4201 | + spin_lock_irqsave(&asic3_gpio_lock, flags); | ||
| 4202 | + v = __asic3_read_register(asic, IPAQ_ASIC3_OFFSET(EXTCF, Select)); | ||
| 4203 | + v = (v & ~bits) | val; | ||
| 4204 | + __asic3_write_register(asic, IPAQ_ASIC3_OFFSET(EXTCF, Select), v); | ||
| 4205 | + spin_unlock_irqrestore(&asic3_gpio_lock, flags); | ||
| 4206 | +} | ||
| 4207 | +EXPORT_SYMBOL(asic3_set_extcf_select); | ||
| 4208 | + | ||
| 4209 | +void asic3_set_extcf_reset(struct device *dev, u32 bits, u32 val) | ||
| 4210 | +{ | ||
| 4211 | + struct asic3_data *asic = dev->driver_data; | ||
| 4212 | + unsigned long flags; | ||
| 4213 | + u32 v; | ||
| 4214 | + | ||
| 4215 | + spin_lock_irqsave(&asic3_gpio_lock, flags); | ||
| 4216 | + v = __asic3_read_register(asic, IPAQ_ASIC3_OFFSET(EXTCF, Reset)); | ||
| 4217 | + v = (v & ~bits) | val; | ||
| 4218 | + __asic3_write_register(asic, IPAQ_ASIC3_OFFSET(EXTCF, Reset), v); | ||
| 4219 | + spin_unlock_irqrestore(&asic3_gpio_lock, flags); | ||
| 4220 | +} | ||
| 4221 | +EXPORT_SYMBOL(asic3_set_extcf_reset); | ||
| 4222 | + | ||
| 4223 | +void asic3_set_sdhwctrl(struct device *dev, u32 bits, u32 val) | ||
| 4224 | +{ | ||
| 4225 | + struct asic3_data *asic = dev->driver_data; | ||
| 4226 | + unsigned long flags; | ||
| 4227 | + u32 v; | ||
| 4228 | + | ||
| 4229 | + spin_lock_irqsave (&asic3_gpio_lock, flags); | ||
| 4230 | + v = __asic3_read_register(asic, IPAQ_ASIC3_OFFSET(SDHWCTRL, SDConf)); | ||
| 4231 | + v = (v & ~bits) | val; | ||
| 4232 | + __asic3_write_register(asic, IPAQ_ASIC3_OFFSET(SDHWCTRL, SDConf), v); | ||
| 4233 | + spin_unlock_irqrestore(&asic3_gpio_lock, flags); | ||
| 4234 | +} | ||
| 4235 | +EXPORT_SYMBOL(asic3_set_sdhwctrl); | ||
| 4236 | + | ||
| 4237 | + | ||
| 4238 | +#define MAX_ASIC_ISR_LOOPS 20 | ||
| 4239 | +#define _IPAQ_ASIC3_GPIO_Base_INCR \ | ||
| 4240 | + (_IPAQ_ASIC3_GPIO_B_Base - _IPAQ_ASIC3_GPIO_A_Base) | ||
| 4241 | + | ||
| 4242 | +static inline void asic3_irq_flip_edge(struct asic3_data *asic, | ||
| 4243 | + u32 base, int bit) | ||
| 4244 | +{ | ||
| 4245 | + u16 edge = __asic3_read_register(asic, | ||
| 4246 | + base + _IPAQ_ASIC3_GPIO_EdgeTrigger); | ||
| 4247 | + edge ^= bit; | ||
| 4248 | + __asic3_write_register(asic, | ||
| 4249 | + base + _IPAQ_ASIC3_GPIO_EdgeTrigger, edge); | ||
| 4250 | +} | ||
| 4251 | + | ||
| 4252 | +static void asic3_irq_demux(unsigned int irq, struct irq_desc *desc) | ||
| 4253 | +{ | ||
| 4254 | + int iter; | ||
| 4255 | + struct asic3_data *asic; | ||
| 4256 | + | ||
| 4257 | + /* Acknowledge the parrent (i.e. CPU's) IRQ */ | ||
| 4258 | + desc->chip->ack(irq); | ||
| 4259 | + | ||
| 4260 | + asic = desc->handler_data; | ||
| 4261 | + | ||
| 4262 | + /* printk( KERN_NOTICE "asic3_irq_demux: irq=%d\n", irq ); */ | ||
| 4263 | + for (iter = 0 ; iter < MAX_ASIC_ISR_LOOPS; iter++) { | ||
| 4264 | + u32 status; | ||
| 4265 | + int bank; | ||
| 4266 | + | ||
| 4267 | + status = __asic3_read_register(asic, | ||
| 4268 | + IPAQ_ASIC3_OFFSET(INTR, PIntStat)); | ||
| 4269 | + /* Check all ten register bits */ | ||
| 4270 | + if ((status & 0x3ff) == 0) | ||
| 4271 | + break; | ||
| 4272 | + | ||
| 4273 | + /* Handle GPIO IRQs */ | ||
| 4274 | + for (bank = 0; bank < 4; bank++) { | ||
| 4275 | + if (status & (1 << bank)) { | ||
| 4276 | + unsigned long base, i, istat; | ||
| 4277 | + | ||
| 4278 | + base = _IPAQ_ASIC3_GPIO_A_Base | ||
| 4279 | + + bank * _IPAQ_ASIC3_GPIO_Base_INCR; | ||
| 4280 | + istat = __asic3_read_register(asic, | ||
| 4281 | + base + _IPAQ_ASIC3_GPIO_IntStatus); | ||
| 4282 | + /* IntStatus is write 0 to clear */ | ||
| 4283 | + /* XXX could miss interrupts! */ | ||
| 4284 | + __asic3_write_register(asic, | ||
| 4285 | + base + _IPAQ_ASIC3_GPIO_IntStatus, 0); | ||
| 4286 | + | ||
| 4287 | + for (i = 0; i < 16; i++) { | ||
| 4288 | + int bit = (1 << i); | ||
| 4289 | + unsigned int irqnr; | ||
| 4290 | + if (!(istat & bit)) | ||
| 4291 | + continue; | ||
| 4292 | + | ||
| 4293 | + irqnr = asic->irq_base | ||
| 4294 | + + (16 * bank) + i; | ||
| 4295 | + desc = irq_desc + irqnr; | ||
| 4296 | + desc->handle_irq(irqnr, desc); | ||
| 4297 | + if (asic->irq_bothedge[bank] & bit) { | ||
| 4298 | + asic3_irq_flip_edge(asic, base, | ||
| 4299 | + bit); | ||
| 4300 | + } | ||
| 4301 | + } | ||
| 4302 | + } | ||
| 4303 | + } | ||
| 4304 | + | ||
| 4305 | + /* Handle remaining IRQs in the status register */ | ||
| 4306 | + { | ||
| 4307 | + int i; | ||
| 4308 | + | ||
| 4309 | + for (i = ASIC3_LED0_IRQ; i <= ASIC3_OWM_IRQ; i++) { | ||
| 4310 | + /* They start at bit 4 and go up */ | ||
| 4311 | + if (status & (1 << (i - ASIC3_LED0_IRQ + 4))) { | ||
| 4312 | + desc = irq_desc + asic->irq_base + i; | ||
| 4313 | + desc->handle_irq(asic->irq_base + i, | ||
| 4314 | + desc); | ||
| 4315 | + } | ||
| 4316 | + } | ||
| 4317 | + } | ||
| 4318 | + | ||
| 4319 | + } | ||
| 4320 | + | ||
| 4321 | + if (iter >= MAX_ASIC_ISR_LOOPS) | ||
| 4322 | + printk(KERN_ERR "%s: interrupt processing overrun\n", | ||
| 4323 | + __FUNCTION__); | ||
| 4324 | +} | ||
| 4325 | + | ||
| 4326 | +static inline int asic3_irq_to_bank(struct asic3_data *asic, int irq) | ||
| 4327 | +{ | ||
| 4328 | + int n; | ||
| 4329 | + | ||
| 4330 | + n = (irq - asic->irq_base) >> 4; | ||
| 4331 | + | ||
| 4332 | + return (n * (_IPAQ_ASIC3_GPIO_B_Base - _IPAQ_ASIC3_GPIO_A_Base)); | ||
| 4333 | +} | ||
| 4334 | + | ||
| 4335 | +static inline int asic3_irq_to_index(struct asic3_data *asic, int irq) | ||
| 4336 | +{ | ||
| 4337 | + return (irq - asic->irq_base) & 15; | ||
| 4338 | +} | ||
| 4339 | + | ||
| 4340 | +static void asic3_mask_gpio_irq(unsigned int irq) | ||
| 4341 | +{ | ||
| 4342 | + struct asic3_data *asic = get_irq_chip_data(irq); | ||
| 4343 | + u32 val, bank, index; | ||
| 4344 | + unsigned long flags; | ||
| 4345 | + | ||
| 4346 | + bank = asic3_irq_to_bank(asic, irq); | ||
| 4347 | + index = asic3_irq_to_index(asic, irq); | ||
| 4348 | + | ||
| 4349 | + spin_lock_irqsave(&asic3_gpio_lock, flags); | ||
| 4350 | + val = __asic3_read_register(asic, bank + _IPAQ_ASIC3_GPIO_Mask); | ||
| 4351 | + val |= 1 << index; | ||
| 4352 | + __asic3_write_register(asic, bank + _IPAQ_ASIC3_GPIO_Mask, val); | ||
| 4353 | + spin_unlock_irqrestore(&asic3_gpio_lock, flags); | ||
| 4354 | +} | ||
| 4355 | + | ||
| 4356 | +static void asic3_mask_irq(unsigned int irq) | ||
| 4357 | +{ | ||
| 4358 | + struct asic3_data *asic = get_irq_chip_data(irq); | ||
| 4359 | + int regval; | ||
| 4360 | + | ||
| 4361 | + if (irq < ASIC3_NR_GPIO_IRQS) { | ||
| 4362 | + printk(KERN_ERR "asic3_base: gpio mask attempt, irq %d\n", | ||
| 4363 | + irq); | ||
| 4364 | + return; | ||
| 4365 | + } | ||
| 4366 | + | ||
| 4367 | + regval = __asic3_read_register(asic, | ||
| 4368 | + _IPAQ_ASIC3_INTR_Base + _IPAQ_ASIC3_INTR_IntMask); | ||
| 4369 | + | ||
| 4370 | + switch (irq - asic->irq_base) { | ||
| 4371 | + case ASIC3_LED0_IRQ: | ||
| 4372 | + __asic3_write_register(asic, | ||
| 4373 | + _IPAQ_ASIC3_INTR_Base + _IPAQ_ASIC3_INTR_IntMask, | ||
| 4374 | + regval & ~ASIC3_INTMASK_MASK0); | ||
| 4375 | + break; | ||
| 4376 | + case ASIC3_LED1_IRQ: | ||
| 4377 | + __asic3_write_register(asic, | ||
| 4378 | + _IPAQ_ASIC3_INTR_Base + _IPAQ_ASIC3_INTR_IntMask, | ||
| 4379 | + regval & ~ASIC3_INTMASK_MASK1); | ||
| 4380 | + break; | ||
| 4381 | + case ASIC3_LED2_IRQ: | ||
| 4382 | + __asic3_write_register(asic, | ||
| 4383 | + _IPAQ_ASIC3_INTR_Base + _IPAQ_ASIC3_INTR_IntMask, | ||
| 4384 | + regval & ~ASIC3_INTMASK_MASK2); | ||
| 4385 | + break; | ||
| 4386 | + case ASIC3_SPI_IRQ: | ||
| 4387 | + __asic3_write_register(asic, | ||
| 4388 | + _IPAQ_ASIC3_INTR_Base + _IPAQ_ASIC3_INTR_IntMask, | ||
| 4389 | + regval & ~ASIC3_INTMASK_MASK3); | ||
| 4390 | + break; | ||
| 4391 | + case ASIC3_SMBUS_IRQ: | ||
| 4392 | + __asic3_write_register(asic, | ||
| 4393 | + _IPAQ_ASIC3_INTR_Base + _IPAQ_ASIC3_INTR_IntMask, | ||
| 4394 | + regval & ~ASIC3_INTMASK_MASK4); | ||
| 4395 | + break; | ||
| 4396 | + case ASIC3_OWM_IRQ: | ||
| 4397 | + __asic3_write_register(asic, | ||
| 4398 | + _IPAQ_ASIC3_INTR_Base + _IPAQ_ASIC3_INTR_IntMask, | ||
| 4399 | + regval & ~ASIC3_INTMASK_MASK5); | ||
| 4400 | + break; | ||
| 4401 | + default: | ||
| 4402 | + printk(KERN_ERR "asic3_base: bad non-gpio irq %d\n", irq); | ||
| 4403 | + break; | ||
| 4404 | + } | ||
| 4405 | +} | ||
| 4406 | + | ||
| 4407 | +static void asic3_unmask_gpio_irq(unsigned int irq) | ||
| 4408 | +{ | ||
| 4409 | + struct asic3_data *asic = get_irq_chip_data(irq); | ||
| 4410 | + u32 val, bank, index; | ||
| 4411 | + unsigned long flags; | ||
| 4412 | + | ||
| 4413 | + bank = asic3_irq_to_bank(asic, irq); | ||
| 4414 | + index = asic3_irq_to_index(asic, irq); | ||
| 4415 | + | ||
| 4416 | + spin_lock_irqsave(&asic3_gpio_lock, flags); | ||
| 4417 | + val = __asic3_read_register(asic, bank + _IPAQ_ASIC3_GPIO_Mask); | ||
| 4418 | + val &= ~(1 << index); | ||
| 4419 | + __asic3_write_register(asic, bank + _IPAQ_ASIC3_GPIO_Mask, val); | ||
| 4420 | + spin_unlock_irqrestore(&asic3_gpio_lock, flags); | ||
| 4421 | +} | ||
| 4422 | + | ||
| 4423 | +static void asic3_unmask_irq(unsigned int irq) | ||
| 4424 | +{ | ||
| 4425 | + struct asic3_data *asic = get_irq_chip_data(irq); | ||
| 4426 | + int regval; | ||
| 4427 | + | ||
| 4428 | + if (irq < ASIC3_NR_GPIO_IRQS) { | ||
| 4429 | + printk(KERN_ERR "asic3_base: gpio unmask attempt, irq %d\n", | ||
| 4430 | + irq); | ||
| 4431 | + return; | ||
| 4432 | + } | ||
| 4433 | + | ||
| 4434 | + regval = __asic3_read_register(asic, | ||
| 4435 | + _IPAQ_ASIC3_INTR_Base + _IPAQ_ASIC3_INTR_IntMask); | ||
| 4436 | + | ||
| 4437 | + switch (irq - asic->irq_base) { | ||
| 4438 | + case ASIC3_LED0_IRQ: | ||
| 4439 | + __asic3_write_register(asic, | ||
| 4440 | + _IPAQ_ASIC3_INTR_Base + _IPAQ_ASIC3_INTR_IntMask, | ||
| 4441 | + regval | ASIC3_INTMASK_MASK0); | ||
| 4442 | + break; | ||
| 4443 | + case ASIC3_LED1_IRQ: | ||
| 4444 | + __asic3_write_register(asic, | ||
| 4445 | + _IPAQ_ASIC3_INTR_Base + _IPAQ_ASIC3_INTR_IntMask, | ||
| 4446 | + regval | ASIC3_INTMASK_MASK1); | ||
| 4447 | + break; | ||
| 4448 | + case ASIC3_LED2_IRQ: | ||
| 4449 | + __asic3_write_register(asic, | ||
| 4450 | + _IPAQ_ASIC3_INTR_Base + _IPAQ_ASIC3_INTR_IntMask, | ||
| 4451 | + regval | ASIC3_INTMASK_MASK2); | ||
| 4452 | + break; | ||
| 4453 | + case ASIC3_SPI_IRQ: | ||
| 4454 | + __asic3_write_register(asic, | ||
| 4455 | + _IPAQ_ASIC3_INTR_Base + _IPAQ_ASIC3_INTR_IntMask, | ||
| 4456 | + regval | ASIC3_INTMASK_MASK3); | ||
| 4457 | + break; | ||
| 4458 | + case ASIC3_SMBUS_IRQ: | ||
| 4459 | + __asic3_write_register(asic, | ||
| 4460 | + _IPAQ_ASIC3_INTR_Base + _IPAQ_ASIC3_INTR_IntMask, | ||
| 4461 | + regval | ASIC3_INTMASK_MASK4); | ||
| 4462 | + break; | ||
| 4463 | + case ASIC3_OWM_IRQ: | ||
| 4464 | + __asic3_write_register(asic, | ||
| 4465 | + _IPAQ_ASIC3_INTR_Base + _IPAQ_ASIC3_INTR_IntMask, | ||
| 4466 | + regval | ASIC3_INTMASK_MASK5); | ||
| 4467 | + break; | ||
| 4468 | + default: | ||
| 4469 | + printk(KERN_ERR "asic3_base: bad non-gpio irq %d\n", irq); | ||
| 4470 | + break; | ||
| 4471 | + } | ||
| 4472 | +} | ||
| 4473 | + | ||
| 4474 | +static int asic3_gpio_irq_type(unsigned int irq, unsigned int type) | ||
| 4475 | +{ | ||
| 4476 | + struct asic3_data *asic = get_irq_chip_data(irq); | ||
| 4477 | + u32 bank, index; | ||
| 4478 | + unsigned long flags; | ||
| 4479 | + u16 trigger, level, edge, bit; | ||
| 4480 | + | ||
| 4481 | + bank = asic3_irq_to_bank(asic, irq); | ||
| 4482 | + index = asic3_irq_to_index(asic, irq); | ||
| 4483 | + bit = 1<<index; | ||
| 4484 | + | ||
| 4485 | + spin_lock_irqsave(&asic3_gpio_lock, flags); | ||
| 4486 | + level = __asic3_read_register(asic, | ||
| 4487 | + bank + _IPAQ_ASIC3_GPIO_LevelTrigger); | ||
| 4488 | + edge = __asic3_read_register(asic, | ||
| 4489 | + bank + _IPAQ_ASIC3_GPIO_EdgeTrigger); | ||
| 4490 | + trigger = __asic3_read_register(asic, | ||
| 4491 | + bank + _IPAQ_ASIC3_GPIO_TriggerType); | ||
| 4492 | + asic->irq_bothedge[(irq - asic->irq_base) >> 4] &= ~bit; | ||
| 4493 | + | ||
| 4494 | + if (type == IRQT_RISING) { | ||
| 4495 | + trigger |= bit; | ||
| 4496 | + edge |= bit; | ||
| 4497 | + } else if (type == IRQT_FALLING) { | ||
| 4498 | + trigger |= bit; | ||
| 4499 | + edge &= ~bit; | ||
| 4500 | + } else if (type == IRQT_BOTHEDGE) { | ||
| 4501 | + trigger |= bit; | ||
| 4502 | + if (asic3_gpio_get_value(asic->dev, irq - asic->irq_base)) | ||
| 4503 | + edge &= ~bit; | ||
| 4504 | + else | ||
| 4505 | + edge |= bit; | ||
| 4506 | + asic->irq_bothedge[(irq - asic->irq_base) >> 4] |= bit; | ||
| 4507 | + } else if (type == IRQT_LOW) { | ||
| 4508 | + trigger &= ~bit; | ||
| 4509 | + level &= ~bit; | ||
| 4510 | + } else if (type == IRQT_HIGH) { | ||
| 4511 | + trigger &= ~bit; | ||
| 4512 | + level |= bit; | ||
| 4513 | + } else { | ||
| 4514 | + /* | ||
| 4515 | + * if type == IRQT_NOEDGE, we should mask interrupts, but | ||
| 4516 | + * be careful to not unmask them if mask was also called. | ||
| 4517 | + * Probably need internal state for mask. | ||
| 4518 | + */ | ||
| 4519 | + printk(KERN_NOTICE "asic3: irq type not changed.\n"); | ||
| 4520 | + } | ||
| 4521 | + __asic3_write_register(asic, bank + _IPAQ_ASIC3_GPIO_LevelTrigger, | ||
| 4522 | + level); | ||
| 4523 | + __asic3_write_register(asic, bank + _IPAQ_ASIC3_GPIO_EdgeTrigger, | ||
| 4524 | + edge); | ||
| 4525 | + __asic3_write_register(asic, bank + _IPAQ_ASIC3_GPIO_TriggerType, | ||
| 4526 | + trigger); | ||
| 4527 | + spin_unlock_irqrestore(&asic3_gpio_lock, flags); | ||
| 4528 | + return 0; | ||
| 4529 | +} | ||
| 4530 | + | ||
| 4531 | +static struct irq_chip asic3_gpio_irq_chip = { | ||
| 4532 | + .name = "ASIC3-GPIO", | ||
| 4533 | + .ack = asic3_mask_gpio_irq, | ||
| 4534 | + .mask = asic3_mask_gpio_irq, | ||
| 4535 | + .unmask = asic3_unmask_gpio_irq, | ||
| 4536 | + .set_type = asic3_gpio_irq_type, | ||
| 4537 | +}; | ||
| 4538 | + | ||
| 4539 | +static struct irq_chip asic3_irq_chip = { | ||
| 4540 | + .name = "ASIC3", | ||
| 4541 | + .ack = asic3_mask_irq, | ||
| 4542 | + .mask = asic3_mask_irq, | ||
| 4543 | + .unmask = asic3_unmask_irq, | ||
| 4544 | +}; | ||
| 4545 | + | ||
| 4546 | +static void asic3_release(struct device *dev) | ||
| 4547 | +{ | ||
| 4548 | + struct platform_device *sdev = to_platform_device(dev); | ||
| 4549 | + | ||
| 4550 | + kfree(sdev->resource); | ||
| 4551 | + kfree(sdev); | ||
| 4552 | +} | ||
| 4553 | + | ||
| 4554 | +int asic3_register_mmc(struct device *dev) | ||
| 4555 | +{ | ||
| 4556 | + struct platform_device *sdev = kzalloc(sizeof(*sdev), GFP_KERNEL); | ||
| 4557 | + struct tmio_mmc_hwconfig *mmc_config = kmalloc(sizeof(*mmc_config), | ||
| 4558 | + GFP_KERNEL); | ||
| 4559 | + struct platform_device *pdev = to_platform_device(dev); | ||
| 4560 | + struct asic3_data *asic = dev->driver_data; | ||
| 4561 | + struct asic3_platform_data *asic3_pdata = dev->platform_data; | ||
| 4562 | + struct resource *res; | ||
| 4563 | + int rc; | ||
| 4564 | + | ||
| 4565 | + if (sdev == NULL || mmc_config == NULL) | ||
| 4566 | + return -ENOMEM; | ||
| 4567 | + | ||
| 4568 | + if (asic3_pdata->tmio_mmc_hwconfig) { | ||
| 4569 | + memcpy(mmc_config, asic3_pdata->tmio_mmc_hwconfig, | ||
| 4570 | + sizeof(*mmc_config)); | ||
| 4571 | + } else { | ||
| 4572 | + memset(mmc_config, 0, sizeof(*mmc_config)); | ||
| 4573 | + } | ||
| 4574 | + mmc_config->address_shift = asic->bus_shift; | ||
| 4575 | + | ||
| 4576 | + sdev->id = -1; | ||
| 4577 | + sdev->name = "asic3_mmc"; | ||
| 4578 | + sdev->dev.parent = dev; | ||
| 4579 | + sdev->num_resources = 2; | ||
| 4580 | + sdev->dev.platform_data = mmc_config; | ||
| 4581 | + sdev->dev.release = asic3_release; | ||
| 4582 | + | ||
| 4583 | + res = kzalloc(sdev->num_resources * sizeof(struct resource), | ||
| 4584 | + GFP_KERNEL); | ||
| 4585 | + if (res == NULL) { | ||
| 4586 | + kfree(sdev); | ||
| 4587 | + kfree(mmc_config); | ||
| 4588 | + return -ENOMEM; | ||
| 4589 | + } | ||
| 4590 | + sdev->resource = res; | ||
| 4591 | + | ||
| 4592 | + res[0].start = pdev->resource[2].start; | ||
| 4593 | + res[0].end = pdev->resource[2].end; | ||
| 4594 | + res[0].flags = IORESOURCE_MEM; | ||
| 4595 | + res[1].start = res[1].end = pdev->resource[3].start; | ||
| 4596 | + res[1].flags = IORESOURCE_IRQ; | ||
| 4597 | + | ||
| 4598 | + rc = platform_device_register(sdev); | ||
| 4599 | + if (rc) { | ||
| 4600 | + printk(KERN_ERR "asic3_base: " | ||
| 4601 | + "Could not register asic3_mmc device\n"); | ||
| 4602 | + kfree(res); | ||
| 4603 | + kfree(sdev); | ||
| 4604 | + return rc; | ||
| 4605 | + } | ||
| 4606 | + | ||
| 4607 | + asic->mmc_dev = sdev; | ||
| 4608 | + | ||
| 4609 | + return 0; | ||
| 4610 | +} | ||
| 4611 | +EXPORT_SYMBOL(asic3_register_mmc); | ||
| 4612 | + | ||
| 4613 | +int asic3_unregister_mmc(struct device *dev) | ||
| 4614 | +{ | ||
| 4615 | + struct asic3_data *asic = dev->driver_data; | ||
| 4616 | + platform_device_unregister(asic->mmc_dev); | ||
| 4617 | + asic->mmc_dev = 0; | ||
| 4618 | + | ||
| 4619 | + return 0; | ||
| 4620 | +} | ||
| 4621 | +EXPORT_SYMBOL(asic3_unregister_mmc); | ||
| 4622 | + | ||
| 4623 | +#ifdef CONFIG_HTC_ASIC3_DS1WM | ||
| 4624 | +/* | ||
| 4625 | + * DS1WM subdevice | ||
| 4626 | + */ | ||
| 4627 | + | ||
| 4628 | +static void asic3_ds1wm_enable(struct platform_device *ds1wm_dev) | ||
| 4629 | +{ | ||
| 4630 | + struct device *dev = ds1wm_dev->dev.parent; | ||
| 4631 | + | ||
| 4632 | + /* Turn on external clocks and the OWM clock */ | ||
| 4633 | + asic3_set_clock_cdex(dev, | ||
| 4634 | + CLOCK_CDEX_EX0 | CLOCK_CDEX_EX1 | CLOCK_CDEX_OWM, | ||
| 4635 | + CLOCK_CDEX_EX0 | CLOCK_CDEX_EX1 | CLOCK_CDEX_OWM); | ||
| 4636 | + | ||
| 4637 | + mdelay(1); | ||
| 4638 | + | ||
| 4639 | + asic3_set_extcf_reset(dev, ASIC3_EXTCF_OWM_RESET, | ||
| 4640 | + ASIC3_EXTCF_OWM_RESET); | ||
| 4641 | + mdelay(1); | ||
| 4642 | + asic3_set_extcf_reset(dev, ASIC3_EXTCF_OWM_RESET, 0); | ||
| 4643 | + mdelay(1); | ||
| 4644 | + | ||
| 4645 | + /* Clear OWM_SMB, set OWM_EN */ | ||
| 4646 | + asic3_set_extcf_select(dev, | ||
| 4647 | + ASIC3_EXTCF_OWM_SMB | ASIC3_EXTCF_OWM_EN, | ||
| 4648 | + 0 | ASIC3_EXTCF_OWM_EN); | ||
| 4649 | + | ||
| 4650 | + mdelay(1); | ||
| 4651 | +} | ||
| 4652 | + | ||
| 4653 | +static void asic3_ds1wm_disable(struct platform_device *ds1wm_dev) | ||
| 4654 | +{ | ||
| 4655 | + struct device *dev = ds1wm_dev->dev.parent; | ||
| 4656 | + | ||
| 4657 | + asic3_set_extcf_select(dev, | ||
| 4658 | + ASIC3_EXTCF_OWM_SMB | ASIC3_EXTCF_OWM_EN, | ||
| 4659 | + 0 | 0); | ||
| 4660 | + | ||
| 4661 | + asic3_set_clock_cdex(dev, | ||
| 4662 | + CLOCK_CDEX_EX0 | CLOCK_CDEX_EX1 | CLOCK_CDEX_OWM, | ||
| 4663 | + CLOCK_CDEX_EX0 | CLOCK_CDEX_EX1 | 0); | ||
| 4664 | +} | ||
| 4665 | + | ||
| 4666 | + | ||
| 4667 | +static struct resource asic3_ds1wm_resources[] = { | ||
| 4668 | + { | ||
| 4669 | + .start = _IPAQ_ASIC3_OWM_Base, | ||
| 4670 | + .end = _IPAQ_ASIC3_OWM_Base + 0x14 - 1, | ||
| 4671 | + .flags = IORESOURCE_MEM, | ||
| 4672 | + }, | ||
| 4673 | + { | ||
| 4674 | + .start = ASIC3_OWM_IRQ, | ||
| 4675 | + .end = ASIC3_OWM_IRQ, | ||
| 4676 | + .flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHEDGE | | ||
| 4677 | + IORESOURCE_IRQ_SOC_SUBDEVICE, | ||
| 4678 | + }, | ||
| 4679 | +}; | ||
| 4680 | + | ||
| 4681 | +static struct ds1wm_platform_data ds1wm_pd = { | ||
| 4682 | + .enable = asic3_ds1wm_enable, | ||
| 4683 | + .disable = asic3_ds1wm_disable, | ||
| 4684 | +}; | ||
| 4685 | +#endif | ||
| 4686 | + | ||
| 4687 | +static struct soc_device_data asic3_blocks[] = { | ||
| 4688 | +#ifdef CONFIG_HTC_ASIC3_DS1WM | ||
| 4689 | + { | ||
| 4690 | + .name = "ds1wm", | ||
| 4691 | + .res = asic3_ds1wm_resources, | ||
| 4692 | + .num_resources = ARRAY_SIZE(asic3_ds1wm_resources), | ||
| 4693 | + .hwconfig = &ds1wm_pd, | ||
| 4694 | + }, | ||
| 4695 | +#endif | ||
| 4696 | +}; | ||
| 4697 | + | ||
| 4698 | +static int asic3_probe(struct platform_device *pdev) | ||
| 4699 | +{ | ||
| 4700 | + struct asic3_platform_data *pdata = pdev->dev.platform_data; | ||
| 4701 | + struct asic3_data *asic; | ||
| 4702 | + struct device *dev = &pdev->dev; | ||
| 4703 | + unsigned long clksel; | ||
| 4704 | + int i, rc; | ||
| 4705 | + | ||
| 4706 | + asic = kzalloc(sizeof(struct asic3_data), GFP_KERNEL); | ||
| 4707 | + if (!asic) | ||
| 4708 | + return -ENOMEM; | ||
| 4709 | + | ||
| 4710 | + platform_set_drvdata(pdev, asic); | ||
| 4711 | + asic->dev = &pdev->dev; | ||
| 4712 | + | ||
| 4713 | + asic->mapping = ioremap(pdev->resource[0].start, IPAQ_ASIC3_MAP_SIZE); | ||
| 4714 | + if (!asic->mapping) { | ||
| 4715 | + printk(KERN_ERR "asic3: couldn't ioremap ASIC3\n"); | ||
| 4716 | + kfree (asic); | ||
| 4717 | + return -ENOMEM; | ||
| 4718 | + } | ||
| 4719 | + | ||
| 4720 | + if (pdata && pdata->bus_shift) | ||
| 4721 | + asic->bus_shift = pdata->bus_shift; | ||
| 4722 | + else | ||
| 4723 | + asic->bus_shift = 2; | ||
| 4724 | + | ||
| 4725 | + /* XXX: should get correct SD clock values from pdata struct */ | ||
| 4726 | + clksel = 0; | ||
| 4727 | + __asic3_write_register(asic, IPAQ_ASIC3_OFFSET(CLOCK, SEL), clksel); | ||
| 4728 | + | ||
| 4729 | + /* Register ASIC3's clocks. */ | ||
| 4730 | + clk_g.ctrlbit = (int)asic; | ||
| 4731 | + | ||
| 4732 | + if (clk_register(&clk_g) < 0) | ||
| 4733 | + printk(KERN_ERR "asic3: failed to register ASIC3 gclk\n"); | ||
| 4734 | + | ||
| 4735 | + for (i = 0; i < ARRAY_SIZE(asic3_clocks); i++) { | ||
| 4736 | + rc = clk_register(&asic3_clocks[i]); | ||
| 4737 | + if (rc < 0) | ||
| 4738 | + printk(KERN_ERR "asic3: " | ||
| 4739 | + "failed to register clock %s (%d)\n", | ||
| 4740 | + asic3_clocks[i].name, rc); | ||
| 4741 | + } | ||
| 4742 | + | ||
| 4743 | + __asic3_write_register(asic, IPAQ_ASIC3_GPIO_OFFSET(A, Mask), 0xffff); | ||
| 4744 | + __asic3_write_register(asic, IPAQ_ASIC3_GPIO_OFFSET(B, Mask), 0xffff); | ||
| 4745 | + __asic3_write_register(asic, IPAQ_ASIC3_GPIO_OFFSET(C, Mask), 0xffff); | ||
| 4746 | + __asic3_write_register(asic, IPAQ_ASIC3_GPIO_OFFSET(D, Mask), 0xffff); | ||
| 4747 | + | ||
| 4748 | + asic3_set_gpio_sleepmask_a(dev, 0xffff, 0xffff); | ||
| 4749 | + asic3_set_gpio_sleepmask_b(dev, 0xffff, 0xffff); | ||
| 4750 | + asic3_set_gpio_sleepmask_c(dev, 0xffff, 0xffff); | ||
| 4751 | + asic3_set_gpio_sleepmask_d(dev, 0xffff, 0xffff); | ||
| 4752 | + | ||
| 4753 | + if (pdata) { | ||
| 4754 | + asic3_set_gpio_out_a(dev, 0xffff, pdata->gpio_a.init); | ||
| 4755 | + asic3_set_gpio_out_b(dev, 0xffff, pdata->gpio_b.init); | ||
| 4756 | + asic3_set_gpio_out_c(dev, 0xffff, pdata->gpio_c.init); | ||
| 4757 | + asic3_set_gpio_out_d(dev, 0xffff, pdata->gpio_d.init); | ||
| 4758 | + | ||
| 4759 | + asic3_set_gpio_dir_a(dev, 0xffff, pdata->gpio_a.dir); | ||
| 4760 | + asic3_set_gpio_dir_b(dev, 0xffff, pdata->gpio_b.dir); | ||
| 4761 | + asic3_set_gpio_dir_c(dev, 0xffff, pdata->gpio_c.dir); | ||
| 4762 | + asic3_set_gpio_dir_d(dev, 0xffff, pdata->gpio_d.dir); | ||
| 4763 | + | ||
| 4764 | + asic3_set_gpio_sleepmask_a(dev, 0xffff, | ||
| 4765 | + pdata->gpio_a.sleep_mask); | ||
| 4766 | + asic3_set_gpio_sleepmask_b(dev, 0xffff, | ||
| 4767 | + pdata->gpio_b.sleep_mask); | ||
| 4768 | + asic3_set_gpio_sleepmask_c(dev, 0xffff, | ||
| 4769 | + pdata->gpio_c.sleep_mask); | ||
| 4770 | + asic3_set_gpio_sleepmask_d(dev, 0xffff, | ||
| 4771 | + pdata->gpio_d.sleep_mask); | ||
| 4772 | + | ||
| 4773 | + asic3_set_gpio_sleepout_a(dev, 0xffff, | ||
| 4774 | + pdata->gpio_a.sleep_out); | ||
| 4775 | + asic3_set_gpio_sleepout_b(dev, 0xffff, | ||
| 4776 | + pdata->gpio_b.sleep_out); | ||
| 4777 | + asic3_set_gpio_sleepout_c(dev, 0xffff, | ||
| 4778 | + pdata->gpio_c.sleep_out); | ||
| 4779 | + asic3_set_gpio_sleepout_d(dev, 0xffff, | ||
| 4780 | + pdata->gpio_d.sleep_out); | ||
| 4781 | + | ||
| 4782 | + asic3_set_gpio_battfaultout_a(dev, 0xffff, | ||
| 4783 | + pdata->gpio_a.batt_fault_out); | ||
| 4784 | + asic3_set_gpio_battfaultout_b(dev, 0xffff, | ||
| 4785 | + pdata->gpio_b.batt_fault_out); | ||
| 4786 | + asic3_set_gpio_battfaultout_c(dev, 0xffff, | ||
| 4787 | + pdata->gpio_c.batt_fault_out); | ||
| 4788 | + asic3_set_gpio_battfaultout_d(dev, 0xffff, | ||
| 4789 | + pdata->gpio_d.batt_fault_out); | ||
| 4790 | + | ||
| 4791 | + asic3_set_gpio_sleepconf_a(dev, 0xffff, | ||
| 4792 | + pdata->gpio_a.sleep_conf); | ||
| 4793 | + asic3_set_gpio_sleepconf_b(dev, 0xffff, | ||
| 4794 | + pdata->gpio_b.sleep_conf); | ||
| 4795 | + asic3_set_gpio_sleepconf_c(dev, 0xffff, | ||
| 4796 | + pdata->gpio_c.sleep_conf); | ||
| 4797 | + asic3_set_gpio_sleepconf_d(dev, 0xffff, | ||
| 4798 | + pdata->gpio_d.sleep_conf); | ||
| 4799 | + | ||
| 4800 | + asic3_set_gpio_alt_fn_a(dev, 0xffff, | ||
| 4801 | + pdata->gpio_a.alt_function); | ||
| 4802 | + asic3_set_gpio_alt_fn_b(dev, 0xffff, | ||
| 4803 | + pdata->gpio_b.alt_function); | ||
| 4804 | + asic3_set_gpio_alt_fn_c(dev, 0xffff, | ||
| 4805 | + pdata->gpio_c.alt_function); | ||
| 4806 | + asic3_set_gpio_alt_fn_d(dev, 0xffff, | ||
| 4807 | + pdata->gpio_d.alt_function); | ||
| 4808 | + } | ||
| 4809 | + | ||
| 4810 | + asic->irq_nr = -1; | ||
| 4811 | + asic->irq_base = -1; | ||
| 4812 | + | ||
| 4813 | + if (pdev->num_resources > 1) | ||
| 4814 | + asic->irq_nr = pdev->resource[1].start; | ||
| 4815 | + | ||
| 4816 | + if (asic->irq_nr != -1) { | ||
| 4817 | + unsigned int i; | ||
| 4818 | + | ||
| 4819 | + if (!pdata->irq_base) { | ||
| 4820 | + printk(KERN_ERR "asic3: IRQ base not specified\n"); | ||
| 4821 | + asic3_remove(pdev); | ||
| 4822 | + return -EINVAL; | ||
| 4823 | + } | ||
| 4824 | + | ||
| 4825 | + asic->irq_base = pdata->irq_base; | ||
| 4826 | + | ||
| 4827 | + /* turn on clock to IRQ controller */ | ||
| 4828 | + clksel |= CLOCK_SEL_CX; | ||
| 4829 | + __asic3_write_register(asic, IPAQ_ASIC3_OFFSET(CLOCK, SEL), | ||
| 4830 | + clksel); | ||
| 4831 | + | ||
| 4832 | + printk(KERN_INFO "asic3: using irq %d-%d on irq %d\n", | ||
| 4833 | + asic->irq_base, asic->irq_base + ASIC3_NR_IRQS - 1, | ||
| 4834 | + asic->irq_nr); | ||
| 4835 | + | ||
| 4836 | + for (i = 0 ; i < ASIC3_NR_IRQS ; i++) { | ||
| 4837 | + int irq = i + asic->irq_base; | ||
| 4838 | + if (i < ASIC3_NR_GPIO_IRQS) { | ||
| 4839 | + set_irq_chip(irq, &asic3_gpio_irq_chip); | ||
| 4840 | + set_irq_chip_data(irq, asic); | ||
| 4841 | + set_irq_handler(irq, handle_level_irq); | ||
| 4842 | + set_irq_flags(irq, IRQF_VALID | IRQF_PROBE); | ||
| 4843 | + } else { | ||
| 4844 | + /* The remaining IRQs are not GPIO */ | ||
| 4845 | + set_irq_chip(irq, &asic3_irq_chip); | ||
| 4846 | + set_irq_chip_data(irq, asic); | ||
| 4847 | + set_irq_handler(irq, handle_level_irq); | ||
| 4848 | + set_irq_flags(irq, IRQF_VALID | IRQF_PROBE); | ||
| 4849 | + } | ||
| 4850 | + } | ||
| 4851 | + | ||
| 4852 | + __asic3_write_register(asic, IPAQ_ASIC3_OFFSET(INTR, IntMask), | ||
| 4853 | + ASIC3_INTMASK_GINTMASK); | ||
| 4854 | + | ||
| 4855 | + set_irq_chained_handler(asic->irq_nr, asic3_irq_demux); | ||
| 4856 | + set_irq_type(asic->irq_nr, IRQT_RISING); | ||
| 4857 | + set_irq_data(asic->irq_nr, asic); | ||
| 4858 | + } | ||
| 4859 | + | ||
| 4860 | +#ifdef CONFIG_HTC_ASIC3_DS1WM | ||
| 4861 | + ds1wm_pd.bus_shift = asic->bus_shift; | ||
| 4862 | +#endif | ||
| 4863 | + | ||
| 4864 | + pdata->gpiodev_ops.get = asic3_gpio_get_value; | ||
| 4865 | + pdata->gpiodev_ops.set = asic3_gpio_set_value; | ||
| 4866 | + pdata->gpiodev_ops.to_irq = asic3_gpio_to_irq; | ||
| 4867 | + | ||
| 4868 | + soc_add_devices(pdev, asic3_blocks, ARRAY_SIZE(asic3_blocks), | ||
| 4869 | + &pdev->resource[0], | ||
| 4870 | + asic->bus_shift - ASIC3_DEFAULT_ADDR_SHIFT, | ||
| 4871 | + asic->irq_base); | ||
| 4872 | + | ||
| 4873 | + if (pdev->num_resources > 2) { | ||
| 4874 | + int rc; | ||
| 4875 | + rc = asic3_register_mmc(dev); | ||
| 4876 | + if (rc) { | ||
| 4877 | + asic3_remove(pdev); | ||
| 4878 | + return rc; | ||
| 4879 | + } | ||
| 4880 | + } | ||
| 4881 | + | ||
| 4882 | + if (pdata && pdata->num_child_platform_devs != 0) | ||
| 4883 | + platform_add_devices(pdata->child_platform_devs, | ||
| 4884 | + pdata->num_child_platform_devs); | ||
| 4885 | + | ||
| 4886 | + return 0; | ||
| 4887 | +} | ||
| 4888 | + | ||
| 4889 | +static int asic3_remove(struct platform_device *pdev) | ||
| 4890 | +{ | ||
| 4891 | + struct asic3_platform_data *pdata = pdev->dev.platform_data; | ||
| 4892 | + struct asic3_data *asic = platform_get_drvdata(pdev); | ||
| 4893 | + int i; | ||
| 4894 | + | ||
| 4895 | + if (pdata && pdata->num_child_platform_devs != 0) { | ||
| 4896 | + for (i = 0; i < pdata->num_child_platform_devs; i++) { | ||
| 4897 | + platform_device_unregister( | ||
| 4898 | + pdata->child_platform_devs[i]); | ||
| 4899 | + } | ||
| 4900 | + } | ||
| 4901 | + | ||
| 4902 | + if (asic->irq_nr != -1) { | ||
| 4903 | + unsigned int i; | ||
| 4904 | + | ||
| 4905 | + for (i = 0 ; i < ASIC3_NR_IRQS ; i++) { | ||
| 4906 | + int irq = i + asic->irq_base; | ||
| 4907 | + set_irq_flags(irq, 0); | ||
| 4908 | + set_irq_handler (irq, NULL); | ||
| 4909 | + set_irq_chip (irq, NULL); | ||
| 4910 | + set_irq_chip_data(irq, NULL); | ||
| 4911 | + } | ||
| 4912 | + | ||
| 4913 | + set_irq_chained_handler(asic->irq_nr, NULL); | ||
| 4914 | + } | ||
| 4915 | + | ||
| 4916 | + if (asic->mmc_dev) | ||
| 4917 | + asic3_unregister_mmc(&pdev->dev); | ||
| 4918 | + | ||
| 4919 | + for (i = 0; i < ARRAY_SIZE(asic3_clocks); i++) | ||
| 4920 | + clk_unregister(&asic3_clocks[i]); | ||
| 4921 | + clk_unregister(&clk_g); | ||
| 4922 | + | ||
| 4923 | + __asic3_write_register(asic, IPAQ_ASIC3_OFFSET(CLOCK, SEL), 0); | ||
| 4924 | + __asic3_write_register(asic, IPAQ_ASIC3_OFFSET(INTR, IntMask), 0); | ||
| 4925 | + | ||
| 4926 | + iounmap(asic->mapping); | ||
| 4927 | + | ||
| 4928 | + kfree(asic); | ||
| 4929 | + | ||
| 4930 | + return 0; | ||
| 4931 | +} | ||
| 4932 | + | ||
| 4933 | +static void asic3_shutdown(struct platform_device *pdev) | ||
| 4934 | +{ | ||
| 4935 | +} | ||
| 4936 | + | ||
| 4937 | +#define ASIC3_SUSPEND_CDEX_MASK \ | ||
| 4938 | + (CLOCK_CDEX_LED0 | CLOCK_CDEX_LED1 | CLOCK_CDEX_LED2) | ||
| 4939 | +static unsigned short suspend_cdex; | ||
| 4940 | + | ||
| 4941 | +static int asic3_suspend(struct platform_device *pdev, pm_message_t state) | ||
| 4942 | +{ | ||
| 4943 | + struct asic3_data *asic = platform_get_drvdata(pdev); | ||
| 4944 | + suspend_cdex = __asic3_read_register(asic, | ||
| 4945 | + _IPAQ_ASIC3_CLOCK_Base + _IPAQ_ASIC3_CLOCK_CDEX); | ||
| 4946 | + /* The LEDs are still active during suspend */ | ||
| 4947 | + __asic3_write_register(asic, | ||
| 4948 | + _IPAQ_ASIC3_CLOCK_Base + _IPAQ_ASIC3_CLOCK_CDEX, | ||
| 4949 | + suspend_cdex & ASIC3_SUSPEND_CDEX_MASK); | ||
| 4950 | + return 0; | ||
| 4951 | +} | ||
| 4952 | + | ||
| 4953 | +static int asic3_resume(struct platform_device *pdev) | ||
| 4954 | +{ | ||
| 4955 | + struct asic3_data *asic = platform_get_drvdata(pdev); | ||
| 4956 | + unsigned short intmask; | ||
| 4957 | + | ||
| 4958 | + __asic3_write_register(asic, IPAQ_ASIC3_OFFSET(CLOCK, CDEX), | ||
| 4959 | + suspend_cdex); | ||
| 4960 | + | ||
| 4961 | + if (asic->irq_nr != -1) { | ||
| 4962 | + /* Toggle the interrupt mask to try to get ASIC3 to show | ||
| 4963 | + * the CPU an interrupt edge. For more details see the | ||
| 4964 | + * kernel-discuss thread around 13 June 2005 with the | ||
| 4965 | + * subject "asic3 suspend / resume". */ | ||
| 4966 | + intmask = __asic3_read_register(asic, | ||
| 4967 | + IPAQ_ASIC3_OFFSET(INTR, IntMask)); | ||
| 4968 | + __asic3_write_register(asic, IPAQ_ASIC3_OFFSET(INTR, IntMask), | ||
| 4969 | + intmask & ~ASIC3_INTMASK_GINTMASK); | ||
| 4970 | + mdelay(1); | ||
| 4971 | + __asic3_write_register(asic, IPAQ_ASIC3_OFFSET(INTR, IntMask), | ||
| 4972 | + intmask | ASIC3_INTMASK_GINTMASK); | ||
| 4973 | + } | ||
| 4974 | + | ||
| 4975 | + return 0; | ||
| 4976 | +} | ||
| 4977 | + | ||
| 4978 | +static struct platform_driver asic3_device_driver = { | ||
| 4979 | + .driver = { | ||
| 4980 | + .name = "asic3", | ||
| 4981 | + }, | ||
| 4982 | + .probe = asic3_probe, | ||
| 4983 | + .remove = asic3_remove, | ||
| 4984 | + .suspend = asic3_suspend, | ||
| 4985 | + .resume = asic3_resume, | ||
| 4986 | + .shutdown = asic3_shutdown, | ||
| 4987 | +}; | ||
| 4988 | + | ||
| 4989 | +static int __init asic3_base_init(void) | ||
| 4990 | +{ | ||
| 4991 | + int retval = 0; | ||
| 4992 | + retval = platform_driver_register(&asic3_device_driver); | ||
| 4993 | + return retval; | ||
| 4994 | +} | ||
| 4995 | + | ||
| 4996 | +static void __exit asic3_base_exit(void) | ||
| 4997 | +{ | ||
| 4998 | + platform_driver_unregister(&asic3_device_driver); | ||
| 4999 | +} | ||
| 5000 | + | ||
| 5001 | +#ifdef MODULE | ||
| 5002 | +module_init(asic3_base_init); | ||
| 5003 | +#else /* start early for dependencies */ | ||
| 5004 | +subsys_initcall(asic3_base_init); | ||
| 5005 | +#endif | ||
| 5006 | +module_exit(asic3_base_exit); | ||
| 5007 | + | ||
| 5008 | +MODULE_LICENSE("GPL"); | ||
| 5009 | +MODULE_AUTHOR("Phil Blundell <pb@handhelds.org>"); | ||
| 5010 | +MODULE_DESCRIPTION("Core driver for HTC ASIC3"); | ||
| 5011 | +MODULE_SUPPORTED_DEVICE("asic3"); | ||
| 5012 | Index: linux-2.6.26-rc4/drivers/mfd/soc-core.c | ||
| 5013 | =================================================================== | ||
| 5014 | --- /dev/null 1970-01-01 00:00:00.000000000 +0000 | ||
| 5015 | +++ linux-2.6.26-rc4/drivers/mfd/soc-core.c 2008-06-01 18:49:45.000000000 +0100 | ||
| 5016 | @@ -0,0 +1,106 @@ | ||
| 5017 | +/* | ||
| 5018 | + * drivers/soc/soc-core.c | ||
| 5019 | + * | ||
| 5020 | + * core SoC support | ||
| 5021 | + * Copyright (c) 2006 Ian Molton | ||
| 5022 | + * | ||
| 5023 | + * This program is free software; you can redistribute it and/or modify | ||
| 5024 | + * it under the terms of the GNU General Public License version 2 as | ||
| 5025 | + * published by the Free Software Foundation. | ||
| 5026 | + * | ||
| 5027 | + * This file contains functionality used by many SoC type devices. | ||
| 5028 | + * | ||
| 5029 | + * Created: 2006-11-28 | ||
| 5030 | + * | ||
| 5031 | + */ | ||
| 5032 | + | ||
| 5033 | +#include <linux/ioport.h> | ||
| 5034 | +#include <linux/slab.h> | ||
| 5035 | +#include <linux/kernel.h> | ||
| 5036 | +#include <linux/platform_device.h> | ||
| 5037 | +#include "soc-core.h" | ||
| 5038 | + | ||
| 5039 | +void soc_free_devices(struct platform_device *devices, int nr_devs) | ||
| 5040 | +{ | ||
| 5041 | + struct platform_device *dev = devices; | ||
| 5042 | + int i; | ||
| 5043 | + | ||
| 5044 | + for (i = 0; i < nr_devs; i++) { | ||
| 5045 | + struct resource *res = dev->resource; | ||
| 5046 | + platform_device_unregister(dev++); | ||
| 5047 | + kfree(res); | ||
| 5048 | + } | ||
| 5049 | + kfree(devices); | ||
| 5050 | +} | ||
| 5051 | +EXPORT_SYMBOL_GPL(soc_free_devices); | ||
| 5052 | + | ||
| 5053 | +#define SIGNED_SHIFT(val, shift) ((shift) >= 0 ? ((val) << (shift)) : ((val) >> -(shift))) | ||
| 5054 | + | ||
| 5055 | +struct platform_device *soc_add_devices(struct platform_device *dev, | ||
| 5056 | + struct soc_device_data *soc, int nr_devs, | ||
| 5057 | + struct resource *mem, | ||
| 5058 | + int relative_addr_shift, int irq_base) | ||
| 5059 | +{ | ||
| 5060 | + struct platform_device *devices; | ||
| 5061 | + int i, r, base; | ||
| 5062 | + | ||
| 5063 | + devices = kzalloc(nr_devs * sizeof(struct platform_device), GFP_KERNEL); | ||
| 5064 | + if (!devices) | ||
| 5065 | + return NULL; | ||
| 5066 | + | ||
| 5067 | + for (i = 0; i < nr_devs; i++) { | ||
| 5068 | + struct platform_device *sdev = &devices[i]; | ||
| 5069 | + struct soc_device_data *blk = &soc[i]; | ||
| 5070 | + struct resource *res; | ||
| 5071 | + | ||
| 5072 | + sdev->id = -1; | ||
| 5073 | + sdev->name = blk->name; | ||
| 5074 | + | ||
| 5075 | + sdev->dev.parent = &dev->dev; | ||
| 5076 | + sdev->dev.platform_data = (void *)blk->hwconfig; | ||
| 5077 | + sdev->num_resources = blk->num_resources; | ||
| 5078 | + | ||
| 5079 | + /* Allocate space for the subdevice resources */ | ||
| 5080 | + res = kzalloc (blk->num_resources * sizeof (struct resource), GFP_KERNEL); | ||
| 5081 | + if (!res) | ||
| 5082 | + goto fail; | ||
| 5083 | + | ||
| 5084 | + for (r = 0 ; r < blk->num_resources ; r++) { | ||
| 5085 | + res[r].name = blk->res[r].name; // Fixme - should copy | ||
| 5086 | + | ||
| 5087 | + /* Find out base to use */ | ||
| 5088 | + base = 0; | ||
| 5089 | + if (blk->res[r].flags & IORESOURCE_MEM) { | ||
| 5090 | + base = mem->start; | ||
| 5091 | + } else if ((blk->res[r].flags & IORESOURCE_IRQ) && | ||
| 5092 | + (blk->res[r].flags & IORESOURCE_IRQ_SOC_SUBDEVICE)) { | ||
| 5093 | + base = irq_base; | ||
| 5094 | + } | ||
| 5095 | + | ||
| 5096 | + /* Adjust resource */ | ||
| 5097 | + if (blk->res[r].flags & IORESOURCE_MEM) { | ||
| 5098 | + res[r].parent = mem; | ||
| 5099 | + res[r].start = base + SIGNED_SHIFT(blk->res[r].start, relative_addr_shift); | ||
| 5100 | + res[r].end = base + SIGNED_SHIFT(blk->res[r].end, relative_addr_shift); | ||
| 5101 | + } else { | ||
| 5102 | + res[r].start = base + blk->res[r].start; | ||
| 5103 | + res[r].end = base + blk->res[r].end; | ||
| 5104 | + } | ||
| 5105 | + res[r].flags = blk->res[r].flags; | ||
| 5106 | + } | ||
| 5107 | + | ||
| 5108 | + sdev->resource = res; | ||
| 5109 | + if (platform_device_register(sdev)) { | ||
| 5110 | + kfree(res); | ||
| 5111 | + goto fail; | ||
| 5112 | + } | ||
| 5113 | + | ||
| 5114 | + printk(KERN_INFO "SoC: registering %s\n", blk->name); | ||
| 5115 | + } | ||
| 5116 | + return devices; | ||
| 5117 | + | ||
| 5118 | +fail: | ||
| 5119 | + soc_free_devices(devices, i + 1); | ||
| 5120 | + return NULL; | ||
| 5121 | +} | ||
| 5122 | +EXPORT_SYMBOL_GPL(soc_add_devices); | ||
| 5123 | Index: linux-2.6.26-rc4/drivers/mfd/soc-core.h | ||
| 5124 | =================================================================== | ||
| 5125 | --- /dev/null 1970-01-01 00:00:00.000000000 +0000 | ||
| 5126 | +++ linux-2.6.26-rc4/drivers/mfd/soc-core.h 2008-06-01 18:49:45.000000000 +0100 | ||
| 5127 | @@ -0,0 +1,30 @@ | ||
| 5128 | +/* | ||
| 5129 | + * drivers/soc/soc-core.h | ||
| 5130 | + * | ||
| 5131 | + * core SoC support | ||
| 5132 | + * Copyright (c) 2006 Ian Molton | ||
| 5133 | + * | ||
| 5134 | + * This program is free software; you can redistribute it and/or modify | ||
| 5135 | + * it under the terms of the GNU General Public License version 2 as | ||
| 5136 | + * published by the Free Software Foundation. | ||
| 5137 | + * | ||
| 5138 | + * This file contains prototypes for the functions in soc-core.c | ||
| 5139 | + * | ||
| 5140 | + * Created: 2006-11-28 | ||
| 5141 | + * | ||
| 5142 | + */ | ||
| 5143 | + | ||
| 5144 | +struct soc_device_data { | ||
| 5145 | + char *name; | ||
| 5146 | + struct resource *res; | ||
| 5147 | + int num_resources; | ||
| 5148 | + void *hwconfig; /* platform_data to pass to the subdevice */ | ||
| 5149 | +}; | ||
| 5150 | + | ||
| 5151 | +struct platform_device *soc_add_devices(struct platform_device *dev, | ||
| 5152 | + struct soc_device_data *soc, int n_devs, | ||
| 5153 | + struct resource *mem, | ||
| 5154 | + int relative_addr_shift, int irq_base); | ||
| 5155 | + | ||
| 5156 | +void soc_free_devices(struct platform_device *devices, int nr_devs); | ||
| 5157 | + | ||
| 5158 | Index: linux-2.6.26-rc4/include/asm-arm/arch-pxa/clock.h | ||
| 5159 | =================================================================== | ||
| 5160 | --- /dev/null 1970-01-01 00:00:00.000000000 +0000 | ||
| 5161 | +++ linux-2.6.26-rc4/include/asm-arm/arch-pxa/clock.h 2008-06-01 18:49:45.000000000 +0100 | ||
| 5162 | @@ -0,0 +1,27 @@ | ||
| 5163 | +/* | ||
| 5164 | + * linux/include/asm-arm/arch-pxa/clock.h | ||
| 5165 | + * | ||
| 5166 | + * Copyright (C) 2006 Erik Hovland | ||
| 5167 | + * | ||
| 5168 | + * This program is free software; you can redistribute it and/or modify | ||
| 5169 | + * it under the terms of the GNU General Public License version 2 as | ||
| 5170 | + * published by the Free Software Foundation. | ||
| 5171 | + */ | ||
| 5172 | + | ||
| 5173 | +struct clk { | ||
| 5174 | + struct list_head node; | ||
| 5175 | + struct module *owner; | ||
| 5176 | + struct clk *parent; | ||
| 5177 | + const char *name; | ||
| 5178 | + int id; | ||
| 5179 | + unsigned int enabled; | ||
| 5180 | + unsigned long rate; | ||
| 5181 | + unsigned long ctrlbit; | ||
| 5182 | + | ||
| 5183 | + void (*enable)(struct clk *); | ||
| 5184 | + void (*disable)(struct clk *); | ||
| 5185 | +}; | ||
| 5186 | + | ||
| 5187 | + | ||
| 5188 | +extern int clk_register(struct clk *clk); | ||
| 5189 | +extern void clk_unregister(struct clk *clk); | ||
| 5190 | Index: linux-2.6.26-rc4/include/asm-arm/arch-pxa/htcuniversal-asic.h | ||
| 5191 | =================================================================== | ||
| 5192 | --- /dev/null 1970-01-01 00:00:00.000000000 +0000 | ||
| 5193 | +++ linux-2.6.26-rc4/include/asm-arm/arch-pxa/htcuniversal-asic.h 2008-06-01 18:49:45.000000000 +0100 | ||
| 5194 | @@ -0,0 +1,213 @@ | ||
| 5195 | +/* | ||
| 5196 | + * include/asm/arm/arch-pxa/htcuniversal-asic.h | ||
| 5197 | + * | ||
| 5198 | + * Authors: Giuseppe Zompatori <giuseppe_zompatori@yahoo.it> | ||
| 5199 | + * | ||
| 5200 | + * based on previews work, see below: | ||
| 5201 | + * | ||
| 5202 | + * include/asm/arm/arch-pxa/hx4700-asic.h | ||
| 5203 | + * Copyright (c) 2004 SDG Systems, LLC | ||
| 5204 | + * | ||
| 5205 | + */ | ||
| 5206 | + | ||
| 5207 | +#ifndef _HTCUNIVERSAL_ASIC_H_ | ||
| 5208 | +#define _HTCUNIVERSAL_ASIC_H_ | ||
| 5209 | + | ||
| 5210 | +#include <asm/hardware/ipaq-asic3.h> | ||
| 5211 | + | ||
| 5212 | +/* ASIC3 */ | ||
| 5213 | + | ||
| 5214 | +#define HTCUNIVERSAL_ASIC3_GPIO_PHYS PXA_CS4_PHYS | ||
| 5215 | +#define HTCUNIVERSAL_ASIC3_MMC_PHYS PXA_CS3_PHYS | ||
| 5216 | + | ||
| 5217 | +/* TODO: some information is missing here */ | ||
| 5218 | + | ||
| 5219 | +/* ASIC3 GPIO A bank */ | ||
| 5220 | + | ||
| 5221 | +#define GPIOA_I2C_EN 0 /* Output */ | ||
| 5222 | +#define GPIOA_SPK_PWR1_ON 1 /* Output */ | ||
| 5223 | +#define GPIOA_AUDIO_PWR_ON 2 /* Output */ | ||
| 5224 | +#define GPIOA_EARPHONE_PWR_ON 3 /* Output */ | ||
| 5225 | + | ||
| 5226 | +#define GPIOA_UNKNOWN4 4 /* Output */ | ||
| 5227 | +#define GPIOA_BUTTON_BACKLIGHT_N 5 /* Input */ | ||
| 5228 | +#define GPIOA_SPK_PWR2_ON 6 /* Output */ | ||
| 5229 | +#define GPIOA_BUTTON_RECORD_N 7 /* Input */ | ||
| 5230 | + | ||
| 5231 | +#define GPIOA_BUTTON_CAMERA_N 8 /* Input */ | ||
| 5232 | +#define GPIOA_UNKNOWN9 9 /* Output */ | ||
| 5233 | +#define GPIOA_FLASHLIGHT 10 /* Output */ | ||
| 5234 | +#define GPIOA_COVER_ROTATE_N 11 /* Input */ | ||
| 5235 | + | ||
| 5236 | +#define GPIOA_TOUCHSCREEN_N 12 /* Input */ | ||
| 5237 | +#define GPIOA_VOL_UP_N 13 /* Input */ | ||
| 5238 | +#define GPIOA_VOL_DOWN_N 14 /* Input */ | ||
| 5239 | +#define GPIOA_LCD_PWR5_ON 15 /* Output */ | ||
| 5240 | + | ||
| 5241 | +/* ASIC3 GPIO B bank */ | ||
| 5242 | + | ||
| 5243 | +#define GPIOB_BB_READY 0 /* Input */ | ||
| 5244 | +#define GPIOB_CODEC_PDN 1 /* Output */ | ||
| 5245 | +#define GPIOB_UNKNOWN2 2 /* Input */ | ||
| 5246 | +#define GPIOB_BB_UNKNOWN3 3 /* Input */ | ||
| 5247 | + | ||
| 5248 | +#define GPIOB_BT_IRQ 4 /* Input */ | ||
| 5249 | +#define GPIOB_CLAMSHELL_N 5 /* Input */ | ||
| 5250 | +#define GPIOB_LCD_PWR3_ON 6 /* Output */ | ||
| 5251 | +#define GPIOB_BB_ALERT 7 /* Input */ | ||
| 5252 | + | ||
| 5253 | +#define GPIOB_BB_RESET2 8 /* Output */ | ||
| 5254 | +#define GPIOB_EARPHONE_N 9 /* Input */ | ||
| 5255 | +#define GPIOB_MICRECORD_N 10 /* Input */ | ||
| 5256 | +#define GPIOB_NIGHT_SENSOR 11 /* Input */ | ||
| 5257 | + | ||
| 5258 | +#define GPIOB_UMTS_DCD 12 /* Input */ | ||
| 5259 | +#define GPIOB_UNKNOWN13 13 /* Input */ | ||
| 5260 | +#define GPIOB_CHARGE_EN 14 /* Output */ | ||
| 5261 | +#define GPIOB_USB_PUEN 15 /* Output */ | ||
| 5262 | + | ||
| 5263 | +/* ASIC3 GPIO C bank */ | ||
| 5264 | + | ||
| 5265 | +#define GPIOC_LED_BTWIFI 0 /* Output */ | ||
| 5266 | +#define GPIOC_LED_RED 1 /* Output */ | ||
| 5267 | +#define GPIOC_LED_GREEN 2 /* Output */ | ||
| 5268 | +#define GPIOC_BOARDID3 3 /* Input */ | ||
| 5269 | + | ||
| 5270 | +#define GPIOC_WIFI_IRQ_N 4 /* Input */ | ||
| 5271 | +#define GPIOC_WIFI_RESET 5 /* Output */ | ||
| 5272 | +#define GPIOC_WIFI_PWR1_ON 6 /* Output */ | ||
| 5273 | +#define GPIOC_BT_RESET 7 /* Output */ | ||
| 5274 | + | ||
| 5275 | +#define GPIOC_UNKNOWN8 8 /* Output */ | ||
| 5276 | +#define GPIOC_LCD_PWR1_ON 9 /* Output */ | ||
| 5277 | +#define GPIOC_LCD_PWR2_ON 10 /* Output */ | ||
| 5278 | +#define GPIOC_BOARDID2 11 /* Input */ | ||
| 5279 | + | ||
| 5280 | +#define GPIOC_BOARDID1 12 /* Input */ | ||
| 5281 | +#define GPIOC_BOARDID0 13 /* Input */ | ||
| 5282 | +#define GPIOC_BT_PWR_ON 14 /* Output */ | ||
| 5283 | +#define GPIOC_CHARGE_ON 15 /* Output */ | ||
| 5284 | + | ||
| 5285 | +/* ASIC3 GPIO D bank */ | ||
| 5286 | + | ||
| 5287 | +#define GPIOD_KEY_OK_N 0 /* Input */ | ||
| 5288 | +#define GPIOD_KEY_RIGHT_N 1 /* Input */ | ||
| 5289 | +#define GPIOD_KEY_LEFT_N 2 /* Input */ | ||
| 5290 | +#define GPIOD_KEY_DOWN_N 3 /* Input */ | ||
| 5291 | + | ||
| 5292 | +#define GPIOD_KEY_UP_N 4 /* Input */ | ||
| 5293 | +#define GPIOD_SDIO_DET 5 /* Input */ | ||
| 5294 | +#define GPIOD_WIFI_PWR2_ON 6 /* Output */ | ||
| 5295 | +#define GPIOD_HW_REBOOT 7 /* Output */ | ||
| 5296 | + | ||
| 5297 | +#define GPIOD_BB_RESET1 8 /* Output */ | ||
| 5298 | +#define GPIOD_UNKNOWN9 9 /* Output */ | ||
| 5299 | +#define GPIOD_VIBRA_PWR_ON 10 /* Output */ | ||
| 5300 | +#define GPIOD_WIFI_PWR3_ON 11 /* Output */ | ||
| 5301 | + | ||
| 5302 | +#define GPIOD_FL_PWR_ON 12 /* Output */ | ||
| 5303 | +#define GPIOD_LCD_PWR4_ON 13 /* Output */ | ||
| 5304 | +#define GPIOD_BL_KEYP_PWR_ON 14 /* Output */ | ||
| 5305 | +#define GPIOD_BL_KEYB_PWR_ON 15 /* Output */ | ||
| 5306 | + | ||
| 5307 | +extern struct platform_device htcuniversal_asic3; | ||
| 5308 | + | ||
| 5309 | +/* ASIC3 GPIO A bank */ | ||
| 5310 | + | ||
| 5311 | +#define GPIO_I2C_EN 0*16+GPIOA_I2C_EN | ||
| 5312 | +#define GPIO_SPK_PWR1_ON 0*16+GPIOA_SPK_PWR1_ON | ||
| 5313 | +#define GPIO_AUDIO_PWR_ON 0*16+GPIOA_AUDIO_PWR_ON | ||
| 5314 | +#define GPIO_EARPHONE_PWR_ON 0*16+GPIOA_EARPHONE_PWR_ON | ||
| 5315 | + | ||
| 5316 | +#define GPIO_UNKNOWNA4 0*16+GPIOA_UNKNOWN4 | ||
| 5317 | +#define GPIO_BUTTON_BACKLIGHT_N 0*16+GPIOA_BUTTON_BACKLIGHT_N | ||
| 5318 | +#define GPIO_SPK_PWR2_ON 0*16+GPIOA_SPK_PWR2_ON | ||
| 5319 | +#define GPIO_BUTTON_RECORD_N 0*16+GPIOA_BUTTON_RECORD_N | ||
| 5320 | + | ||
| 5321 | +#define GPIO_BUTTON_CAMERA_N 0*16+GPIOA_BUTTON_CAMERA_N | ||
| 5322 | +#define GPIO_UNKNOWNA9 0*16+GPIOA_UNKNOWN9 | ||
| 5323 | +#define GPIO_FLASHLIGHT 0*16+GPIOA_FLASHLIGHT | ||
| 5324 | +#define GPIO_COVER_ROTATE_N 0*16+GPIOA_COVER_ROTATE_N | ||
| 5325 | + | ||
| 5326 | +#define GPIO_TOUCHSCREEN_N 0*16+GPIOA_TOUCHSCREEN_N | ||
| 5327 | +#define GPIO_VOL_UP_N 0*16+GPIOA_VOL_UP_N | ||
| 5328 | +#define GPIO_VOL_DOWN_N 0*16+GPIOA_VOL_DOWN_N | ||
| 5329 | +#define GPIO_LCD_PWR5_ON 0*16+GPIOA_LCD_PWR5_ON | ||
| 5330 | + | ||
| 5331 | +/* ASIC3 GPIO B bank */ | ||
| 5332 | + | ||
| 5333 | +#define GPIO_BB_READY 1*16+GPIOB_BB_READY | ||
| 5334 | +#define GPIO_CODEC_PDN 1*16+GPIOB_CODEC_PDN | ||
| 5335 | +#define GPIO_UNKNOWNB2 1*16+GPIOB_UNKNOWN2 | ||
| 5336 | +#define GPIO_BB_UNKNOWN3 1*16+GPIOB_BB_UNKNOWN3 | ||
| 5337 | + | ||
| 5338 | +#define GPIO_BT_IRQ 1*16+GPIOB_BT_IRQ | ||
| 5339 | +#define GPIO_CLAMSHELL_N 1*16+GPIOB_CLAMSHELL_N | ||
| 5340 | +#define GPIO_LCD_PWR3_ON 1*16+GPIOB_LCD_PWR3_ON | ||
| 5341 | +#define GPIO_BB_ALERT 1*16+GPIOB_BB_ALERT | ||
| 5342 | + | ||
| 5343 | +#define GPIO_BB_RESET2 1*16+GPIOB_BB_RESET2 | ||
| 5344 | +#define GPIO_EARPHONE_N 1*16+GPIOB_EARPHONE_N | ||
| 5345 | +#define GPIO_MICRECORD_N 1*16+GPIOB_MICRECORD_N | ||
| 5346 | +#define GPIO_NIGHT_SENSOR 1*16+GPIOB_NIGHT_SENSOR | ||
| 5347 | + | ||
| 5348 | +#define GPIO_UMTS_DCD 1*16+GPIOB_UMTS_DCD | ||
| 5349 | +#define GPIO_UNKNOWNB13 1*16+GPIOB_UNKNOWN13 | ||
| 5350 | +#define GPIO_CHARGE_EN 1*16+GPIOB_CHARGE_EN | ||
| 5351 | +#define GPIO_USB_PUEN 1*16+GPIOB_USB_PUEN | ||
| 5352 | + | ||
| 5353 | +/* ASIC3 GPIO C bank */ | ||
| 5354 | + | ||
| 5355 | +#define GPIO_LED_BTWIFI 2*16+GPIOC_LED_BTWIFI | ||
| 5356 | +#define GPIO_LED_RED 2*16+GPIOC_LED_RED | ||
| 5357 | +#define GPIO_LED_GREEN 2*16+GPIOC_LED_GREEN | ||
| 5358 | +#define GPIO_BOARDID3 2*16+GPIOC_BOARDID3 | ||
| 5359 | + | ||
| 5360 | +#define GPIO_WIFI_IRQ_N 2*16+GPIOC_WIFI_IRQ_N | ||
| 5361 | +#define GPIO_WIFI_RESET 2*16+GPIOC_WIFI_RESET | ||
| 5362 | +#define GPIO_WIFI_PWR1_ON 2*16+GPIOC_WIFI_PWR1_ON | ||
| 5363 | +#define GPIO_BT_RESET 2*16+GPIOC_BT_RESET | ||
| 5364 | + | ||
| 5365 | +#define GPIO_UNKNOWNC8 2*16+GPIOC_UNKNOWN8 | ||
| 5366 | +#define GPIO_LCD_PWR1_ON 2*16+GPIOC_LCD_PWR1_ON | ||
| 5367 | +#define GPIO_LCD_PWR2_ON 2*16+GPIOC_LCD_PWR2_ON | ||
| 5368 | +#define GPIO_BOARDID2 2*16+GPIOC_BOARDID2 | ||
| 5369 | + | ||
| 5370 | +#define GPIO_BOARDID1 2*16+GPIOC_BOARDID1 | ||
| 5371 | +#define GPIO_BOARDID0 2*16+GPIOC_BOARDID0 | ||
| 5372 | +#define GPIO_BT_PWR_ON 2*16+GPIOC_BT_PWR_ON | ||
| 5373 | +#define GPIO_CHARGE_ON 2*16+GPIOC_CHARGE_ON | ||
| 5374 | + | ||
| 5375 | +/* ASIC3 GPIO D bank */ | ||
| 5376 | + | ||
| 5377 | +#define GPIO_KEY_OK_N 3*16+GPIOD_KEY_OK_N | ||
| 5378 | +#define GPIO_KEY_RIGHT_N 3*16+GPIOD_KEY_RIGHT_N | ||
| 5379 | +#define GPIO_KEY_LEFT_N 3*16+GPIOD_KEY_LEFT_N | ||
| 5380 | +#define GPIO_KEY_DOWN_N 3*16+GPIOD_KEY_DOWN_N | ||
| 5381 | + | ||
| 5382 | +#define GPIO_KEY_UP_N 3*16+GPIOD_KEY_UP_N | ||
| 5383 | +#define GPIO_SDIO_DET 3*16+GPIOD_SDIO_DET | ||
| 5384 | +#define GPIO_WIFI_PWR2_ON 3*16+GPIOD_WIFI_PWR2_ON | ||
| 5385 | +#define GPIO_HW_REBOOT 3*16+GPIOD_HW_REBOOT | ||
| 5386 | + | ||
| 5387 | +#define GPIO_BB_RESET1 3*16+GPIOD_BB_RESET1 | ||
| 5388 | +#define GPIO_UNKNOWND9 3*16+GPIOD_UNKNOWN9 | ||
| 5389 | +#define GPIO_VIBRA_PWR_ON 3*16+GPIOD_VIBRA_PWR_ON | ||
| 5390 | +#define GPIO_WIFI_PWR3_ON 3*16+GPIOD_WIFI_PWR3_ON | ||
| 5391 | + | ||
| 5392 | +#define GPIO_FL_PWR_ON 3*16+GPIOD_FL_PWR_ON | ||
| 5393 | +#define GPIO_LCD_PWR4_ON 3*16+GPIOD_LCD_PWR4_ON | ||
| 5394 | +#define GPIO_BL_KEYP_PWR_ON 3*16+GPIOD_BL_KEYP_PWR_ON | ||
| 5395 | +#define GPIO_BL_KEYB_PWR_ON 3*16+GPIOD_BL_KEYB_PWR_ON | ||
| 5396 | + | ||
| 5397 | +#define HTCUNIVERSAL_EGPIO_BASE PXA_CS2_PHYS+0x02000000 | ||
| 5398 | + | ||
| 5399 | +#define EGPIO4_ON 4 /* something */ | ||
| 5400 | +#define EGPIO5_BT_3V3_ON 5 /* Bluetooth related */ | ||
| 5401 | +#define EGPIO6_WIFI_ON 6 /* WLAN related*/ | ||
| 5402 | + | ||
| 5403 | +extern void htcuniversal_egpio_enable( u_int16_t bits ); | ||
| 5404 | +extern void htcuniversal_egpio_disable( u_int16_t bits ); | ||
| 5405 | + | ||
| 5406 | +#endif /* _HTCUNIVERSAL_ASIC_H_ */ | ||
| 5407 | + | ||
| 5408 | Index: linux-2.6.26-rc4/include/asm-arm/arch-pxa/htcuniversal-gpio.h | ||
| 5409 | =================================================================== | ||
| 5410 | --- /dev/null 1970-01-01 00:00:00.000000000 +0000 | ||
| 5411 | +++ linux-2.6.26-rc4/include/asm-arm/arch-pxa/htcuniversal-gpio.h 2008-06-01 18:49:45.000000000 +0100 | ||
| 5412 | @@ -0,0 +1,220 @@ | ||
| 5413 | +/* | ||
| 5414 | + * include/asm-arm/arch-pxa/htcuniversal-gpio.h | ||
| 5415 | + * History: | ||
| 5416 | + * | ||
| 5417 | + * 2004-12-10 Michael Opdenacker. Wrote down GPIO settings as identified by Jamey Hicks. | ||
| 5418 | + * Reused the h2200-gpio.h file as a template. | ||
| 5419 | + */ | ||
| 5420 | + | ||
| 5421 | +#ifndef _HTCUNIVERSAL_GPIO_H_ | ||
| 5422 | +#define _HTCUNIVERSAL_GPIO_H_ | ||
| 5423 | + | ||
| 5424 | +#include <asm/arch/pxa-regs.h> | ||
| 5425 | + | ||
| 5426 | +#define GET_HTCUNIVERSAL_GPIO(gpio) \ | ||
| 5427 | + (GPLR(GPIO_NR_HTCUNIVERSAL_ ## gpio) & GPIO_bit(GPIO_NR_HTCUNIVERSAL_ ## gpio)) | ||
| 5428 | + | ||
| 5429 | +#define SET_HTCUNIVERSAL_GPIO(gpio, setp) \ | ||
| 5430 | +do { \ | ||
| 5431 | +if (setp) \ | ||
| 5432 | + GPSR(GPIO_NR_HTCUNIVERSAL_ ## gpio) = GPIO_bit(GPIO_NR_HTCUNIVERSAL_ ## gpio); \ | ||
| 5433 | +else \ | ||
| 5434 | + GPCR(GPIO_NR_HTCUNIVERSAL_ ## gpio) = GPIO_bit(GPIO_NR_HTCUNIVERSAL_ ## gpio); \ | ||
| 5435 | +} while (0) | ||
| 5436 | + | ||
| 5437 | +#define SET_HTCUNIVERSAL_GPIO_N(gpio, setp) \ | ||
| 5438 | +do { \ | ||
| 5439 | +if (setp) \ | ||
| 5440 | + GPCR(GPIO_NR_HTCUNIVERSAL_ ## gpio ## _N) = GPIO_bit(GPIO_NR_HTCUNIVERSAL_ ## gpio ## _N); \ | ||
| 5441 | +else \ | ||
| 5442 | + GPSR(GPIO_NR_HTCUNIVERSAL_ ## gpio ## _N) = GPIO_bit(GPIO_NR_HTCUNIVERSAL_ ## gpio ## _N); \ | ||
| 5443 | +} while (0) | ||
| 5444 | + | ||
| 5445 | +#define HTCUNIVERSAL_IRQ(gpio) \ | ||
| 5446 | + IRQ_GPIO(GPIO_NR_HTCUNIVERSAL_ ## gpio) | ||
| 5447 | + | ||
| 5448 | +#define GPIO_NR_HTCUNIVERSAL_KEY_ON_N 0 | ||
| 5449 | +#define GPIO_NR_HTCUNIVERSAL_GP_RST_N 1 | ||
| 5450 | + | ||
| 5451 | +#define GPIO_NR_HTCUNIVERSAL_USB_DET 9 | ||
| 5452 | +#define GPIO_NR_HTCUNIVERSAL_POWER_DET 10 | ||
| 5453 | + | ||
| 5454 | +#define GPIO_NR_HTCUNIVERSAL_CIF_DD7 12 | ||
| 5455 | +#define GPIO_NR_HTCUNIVERSAL_ASIC3_SDIO_INT_N 13 | ||
| 5456 | +#define GPIO_NR_HTCUNIVERSAL_ASIC3_EXT_INT 14 | ||
| 5457 | +#define GPIO_NR_HTCUNIVERSAL_CS1_N 15 | ||
| 5458 | + | ||
| 5459 | +#define GPIO_NR_HTCUNIVERSAL_CIF_DD6 17 | ||
| 5460 | +#define GPIO_NR_HTCUNIVERSAL_RDY 18 | ||
| 5461 | + | ||
| 5462 | +#define GPIO_NR_HTCUNIVERSAL_PHONE_START 19 | ||
| 5463 | + | ||
| 5464 | +#define GPIO_NR_HTCUNIVERSAL_KP_MKOUT7 22 | ||
| 5465 | +#define GPIO_NR_HTCUNIVERSAL_SPI_CLK 23 | ||
| 5466 | +#define GPIO_NR_HTCUNIVERSAL_SPI_FRM 24 | ||
| 5467 | +#define GPIO_NR_HTCUNIVERSAL_SPI_DO 25 | ||
| 5468 | +#define GPIO_NR_HTCUNIVERSAL_SPI_DI 26 | ||
| 5469 | + | ||
| 5470 | +#define GPIO_NR_HTCUNIVERSAL_CODEC_ON 27 | ||
| 5471 | +#define GPIO_NR_HTCUNIVERSAL_I2S_BCK 28 | ||
| 5472 | +#define GPIO_NR_HTCUNIVERSAL_I2S_DIN 29 | ||
| 5473 | +#define GPIO_NR_HTCUNIVERSAL_I2S_DOUT 30 | ||
| 5474 | +#define GPIO_NR_HTCUNIVERSAL_I2S_SYNC 31 | ||
| 5475 | + | ||
| 5476 | +#define GPIO_NR_HTCUNIVERSAL_RS232_ON 32 | ||
| 5477 | +#define GPIO_NR_HTCUNIVERSAL_CS5_N 33 | ||
| 5478 | + | ||
| 5479 | +#define GPIO_NR_HTCUNIVERSAL_PHONE_RXD 34 | ||
| 5480 | +#define GPIO_NR_HTCUNIVERSAL_PHONE_UART_CTS 35 | ||
| 5481 | +#define GPIO_NR_HTCUNIVERSAL_KP_MKIN7 36 | ||
| 5482 | +#define GPIO_NR_HTCUNIVERSAL_KP_MKIN3 37 | ||
| 5483 | +#define GPIO_NR_HTCUNIVERSAL_KP_MKIN4 38 | ||
| 5484 | +#define GPIO_NR_HTCUNIVERSAL_PHONE_TXD 39 | ||
| 5485 | +#define GPIO_NR_HTCUNIVERSAL_KP_MKOUT6 40 | ||
| 5486 | +#define GPIO_NR_HTCUNIVERSAL_PHONE_UART_RTS 41 | ||
| 5487 | +#define GPIO_NR_HTCUNIVERSAL_BT_RXD 42 | ||
| 5488 | +#define GPIO_NR_HTCUNIVERSAL_BT_TXD 43 | ||
| 5489 | +#define GPIO_NR_HTCUNIVERSAL_BT_UART_CTS 44 | ||
| 5490 | +#define GPIO_NR_HTCUNIVERSAL_BT_UART_RTS 45 | ||
| 5491 | + | ||
| 5492 | +#define GPIO_NR_HTCUNIVERSAL_SIR_RXD 42 | ||
| 5493 | +#define GPIO_NR_HTCUNIVERSAL_SIR_TXD 43 | ||
| 5494 | + | ||
| 5495 | +#define GPIO_NR_HTCUNIVERSAL_POE_N 48 | ||
| 5496 | +#define GPIO_NR_HTCUNIVERSAL_PWE_N 49 | ||
| 5497 | +#define GPIO_NR_HTCUNIVERSAL_CIF_DD3 50 | ||
| 5498 | +#define GPIO_NR_HTCUNIVERSAL_CIF_DD2 51 | ||
| 5499 | +#define GPIO_NR_HTCUNIVERSAL_CIF_DD4 52 | ||
| 5500 | + | ||
| 5501 | +#define GPIO_NR_HTCUNIVERSAL_CIF_MCLK 53 | ||
| 5502 | +#define GPIO_NR_HTCUNIVERSAL_CIF_PCLK 54 | ||
| 5503 | +#define GPIO_NR_HTCUNIVERSAL_CIF_DD1 55 | ||
| 5504 | + | ||
| 5505 | +#define GPIO_NR_HTCUNIVERSAL_LDD0 58 | ||
| 5506 | +#define GPIO_NR_HTCUNIVERSAL_LDD1 59 | ||
| 5507 | +#define GPIO_NR_HTCUNIVERSAL_LDD2 60 | ||
| 5508 | +#define GPIO_NR_HTCUNIVERSAL_LDD3 61 | ||
| 5509 | +#define GPIO_NR_HTCUNIVERSAL_LDD4 62 | ||
| 5510 | +#define GPIO_NR_HTCUNIVERSAL_LDD5 63 | ||
| 5511 | +#define GPIO_NR_HTCUNIVERSAL_LDD6 64 | ||
| 5512 | +#define GPIO_NR_HTCUNIVERSAL_LDD7 65 | ||
| 5513 | +#define GPIO_NR_HTCUNIVERSAL_LDD8 66 | ||
| 5514 | +#define GPIO_NR_HTCUNIVERSAL_LDD9 67 | ||
| 5515 | +#define GPIO_NR_HTCUNIVERSAL_LDD10 68 | ||
| 5516 | +#define GPIO_NR_HTCUNIVERSAL_LDD11 69 | ||
| 5517 | +#define GPIO_NR_HTCUNIVERSAL_LDD12 70 | ||
| 5518 | +#define GPIO_NR_HTCUNIVERSAL_LDD13 71 | ||
| 5519 | +#define GPIO_NR_HTCUNIVERSAL_LDD14 72 | ||
| 5520 | +#define GPIO_NR_HTCUNIVERSAL_LDD15 73 | ||
| 5521 | + | ||
| 5522 | +#define GPIO_NR_HTCUNIVERSAL_LFCLK_RD 74 | ||
| 5523 | +#define GPIO_NR_HTCUNIVERSAL_LFCLK_A0 75 | ||
| 5524 | +#define GPIO_NR_HTCUNIVERSAL_LFCLK_WR 76 | ||
| 5525 | +#define GPIO_NR_HTCUNIVERSAL_LBIAS 77 | ||
| 5526 | + | ||
| 5527 | +#define GPIO_NR_HTCUNIVERSAL_CS2_N 78 | ||
| 5528 | +#define GPIO_NR_HTCUNIVERSAL_CS3_N 79 | ||
| 5529 | +#define GPIO_NR_HTCUNIVERSAL_CS4_N 80 | ||
| 5530 | +#define GPIO_NR_HTCUNIVERSAL_CIF_DD0 81 | ||
| 5531 | +#define GPIO_NR_HTCUNIVERSAL_CIF_DD5 82 | ||
| 5532 | + | ||
| 5533 | +#define GPIO_NR_HTCUNIVERSAL_CIF_LV 84 | ||
| 5534 | +#define GPIO_NR_HTCUNIVERSAL_CIF_FV 85 | ||
| 5535 | + | ||
| 5536 | +#define GPIO_NR_HTCUNIVERSAL_LCD1 86 | ||
| 5537 | +#define GPIO_NR_HTCUNIVERSAL_LCD2 87 | ||
| 5538 | + | ||
| 5539 | +#define GPIO_NR_HTCUNIVERSAL_KP_MKIN5 90 | ||
| 5540 | +#define GPIO_NR_HTCUNIVERSAL_KP_MKIN6 91 | ||
| 5541 | + | ||
| 5542 | +#define GPIO_NR_HTCUNIVERSAL_DREQ1 97 | ||
| 5543 | + | ||
| 5544 | +#define GPIO_NR_HTCUNIVERSAL_PHONE_RESET 98 | ||
| 5545 | + | ||
| 5546 | +#define GPIO_NR_HTCUNIVERSAL_KP_MKIN0 100 | ||
| 5547 | +#define GPIO_NR_HTCUNIVERSAL_KP_MKIN1 101 | ||
| 5548 | +#define GPIO_NR_HTCUNIVERSAL_KP_MKIN2 102 | ||
| 5549 | +#define GPIO_NR_HTCUNIVERSAL_KP_MKOUT0 103 | ||
| 5550 | +#define GPIO_NR_HTCUNIVERSAL_KP_MKOUT1 104 | ||
| 5551 | +#define GPIO_NR_HTCUNIVERSAL_KP_MKOUT2 105 | ||
| 5552 | +#define GPIO_NR_HTCUNIVERSAL_KP_MKOUT3 106 | ||
| 5553 | +#define GPIO_NR_HTCUNIVERSAL_KP_MKOUT4 107 | ||
| 5554 | +#define GPIO_NR_HTCUNIVERSAL_KP_MKOUT5 108 | ||
| 5555 | + | ||
| 5556 | +#define GPIO_NR_HTCUNIVERSAL_PHONE_UNKNOWN 109 | ||
| 5557 | +#define GPIO_NR_HTCUNIVERSAL_PHONE_OFF 110 | ||
| 5558 | + | ||
| 5559 | +#define GPIO_NR_HTCUNIVERSAL_USB_PUEN 112 | ||
| 5560 | +#define GPIO_NR_HTCUNIVERSAL_I2S_SYSCLK 113 | ||
| 5561 | + | ||
| 5562 | +#define GPIO_NR_HTCUNIVERSAL_PWM_OUT1 115 | ||
| 5563 | + | ||
| 5564 | +#define GPIO_NR_HTCUNIVERSAL_I2C_SCL 117 | ||
| 5565 | +#define GPIO_NR_HTCUNIVERSAL_I2C_SDA 118 | ||
| 5566 | + | ||
| 5567 | +#if 0 | ||
| 5568 | +#define GPIO_NR_HTCUNIVERSAL_CPU_BATT_FAULT_N | ||
| 5569 | +#define GPIO_NR_HTCUNIVERSAL_ASIC3_RESET_N | ||
| 5570 | +#define GPIO_NR_HTCUNIVERSAL_CHARGE_EN_N | ||
| 5571 | +#define GPIO_NR_HTCUNIVERSAL_FLASH_VPEN | ||
| 5572 | +#define GPIO_NR_HTCUNIVERSAL_BATT_OFF | ||
| 5573 | +#define GPIO_NR_HTCUNIVERSAL_USB_CHARGE_RATE | ||
| 5574 | +#define GPIO_NR_HTCUNIVERSAL_BL_DETECT_N | ||
| 5575 | +#define GPIO_NR_HTCUNIVERSAL_CPU_HW_RESET_N | ||
| 5576 | +#endif | ||
| 5577 | + | ||
| 5578 | + | ||
| 5579 | +#define GPIO_NR_HTCUNIVERSAL_TOUCHSCREEN_SPI_CLK_MD (23 | GPIO_ALT_FN_2_OUT) | ||
| 5580 | +#define GPIO_NR_HTCUNIVERSAL_TOUCHSCREEN_SPI_FRM_MD (24 | GPIO_ALT_FN_2_OUT) | ||
| 5581 | +#define GPIO_NR_HTCUNIVERSAL_TOUCHSCREEN_SPI_DO_MD (25 | GPIO_ALT_FN_2_OUT) | ||
| 5582 | +#define GPIO_NR_HTCUNIVERSAL_TOUCHSCREEN_SPI_DI_MD (26 | GPIO_ALT_FN_1_IN) | ||
| 5583 | + | ||
| 5584 | +#define GPIO_NR_HTCUNIVERSAL_I2S_BCK_MD (28 | GPIO_ALT_FN_1_OUT) | ||
| 5585 | +#define GPIO_NR_HTCUNIVERSAL_I2S_DIN_MD (29 | GPIO_ALT_FN_2_IN) | ||
| 5586 | +#define GPIO_NR_HTCUNIVERSAL_I2S_DOUT_MD (30 | GPIO_ALT_FN_1_OUT) | ||
| 5587 | +#define GPIO_NR_HTCUNIVERSAL_I2S_SYNC_MD (31 | GPIO_ALT_FN_1_OUT) | ||
| 5588 | + | ||
| 5589 | +#define GPIO_NR_HTCUNIVERSAL_PHONE_RXD_MD (34 | GPIO_ALT_FN_1_IN) | ||
| 5590 | +#define GPIO_NR_HTCUNIVERSAL_PHONE_UART_CTS_MD (35 | GPIO_ALT_FN_1_IN) | ||
| 5591 | + | ||
| 5592 | +#define GPIO_NR_HTCUNIVERSAL_PHONE_TXD_MD (39 | GPIO_ALT_FN_2_OUT) | ||
| 5593 | +#define GPIO_NR_HTCUNIVERSAL_PHONE_UART_RTS_MD (41 | GPIO_ALT_FN_2_OUT) | ||
| 5594 | + | ||
| 5595 | +#define GPIO_NR_HTCUNIVERSAL_BT_RXD_MD (42 | GPIO_ALT_FN_1_IN) | ||
| 5596 | +#define GPIO_NR_HTCUNIVERSAL_BT_TXD_MD (43 | GPIO_ALT_FN_2_OUT) | ||
| 5597 | +#define GPIO_NR_HTCUNIVERSAL_BT_UART_CTS_MD (44 | GPIO_ALT_FN_1_IN) | ||
| 5598 | +#define GPIO_NR_HTCUNIVERSAL_BT_UART_RTS_MD (45 | GPIO_ALT_FN_2_OUT) | ||
| 5599 | + | ||
| 5600 | +#define GPIO_NR_HTCUNIVERSAL_SIR_RXD_MD (46 | GPIO_ALT_FN_2_IN) | ||
| 5601 | +#define GPIO_NR_HTCUNIVERSAL_SIR_TXD_MD (47 | GPIO_ALT_FN_1_OUT) | ||
| 5602 | + | ||
| 5603 | +#define GPIO_NR_HTCUNIVERSAL_POE_N_MD (48 | GPIO_ALT_FN_2_OUT | GPIO_DFLT_HIGH) | ||
| 5604 | +#define GPIO_NR_HTCUNIVERSAL_PWE_N_MD (49 | GPIO_ALT_FN_2_OUT | GPIO_DFLT_HIGH) | ||
| 5605 | + | ||
| 5606 | +#define GPIO_NR_HTCUNIVERSAL_KP_MKIN0_MD (GPIO_NR_HTCUNIVERSAL_KP_MKIN0 | GPIO_ALT_FN_1_IN) | ||
| 5607 | +#define GPIO_NR_HTCUNIVERSAL_KP_MKIN1_MD (GPIO_NR_HTCUNIVERSAL_KP_MKIN1 | GPIO_ALT_FN_1_IN) | ||
| 5608 | +#define GPIO_NR_HTCUNIVERSAL_KP_MKIN2_MD (GPIO_NR_HTCUNIVERSAL_KP_MKIN2 | GPIO_ALT_FN_1_IN) | ||
| 5609 | +#define GPIO_NR_HTCUNIVERSAL_KP_MKIN3_MD (GPIO_NR_HTCUNIVERSAL_KP_MKIN3 | GPIO_ALT_FN_3_IN) | ||
| 5610 | +#define GPIO_NR_HTCUNIVERSAL_KP_MKIN4_MD (GPIO_NR_HTCUNIVERSAL_KP_MKIN4 | GPIO_ALT_FN_2_IN) | ||
| 5611 | +#define GPIO_NR_HTCUNIVERSAL_KP_MKIN5_MD (GPIO_NR_HTCUNIVERSAL_KP_MKIN5 | GPIO_ALT_FN_1_IN) | ||
| 5612 | +#define GPIO_NR_HTCUNIVERSAL_KP_MKIN6_MD (GPIO_NR_HTCUNIVERSAL_KP_MKIN6 | GPIO_ALT_FN_1_IN) | ||
| 5613 | +#define GPIO_NR_HTCUNIVERSAL_KP_MKIN7_MD (GPIO_NR_HTCUNIVERSAL_KP_MKIN7 | GPIO_ALT_FN_3_IN) | ||
| 5614 | + | ||
| 5615 | +#define GPIO_NR_HTCUNIVERSAL_KP_MKOUT0_MD (GPIO_NR_HTCUNIVERSAL_KP_MKOUT0 | GPIO_ALT_FN_2_OUT) | ||
| 5616 | +#define GPIO_NR_HTCUNIVERSAL_KP_MKOUT1_MD (GPIO_NR_HTCUNIVERSAL_KP_MKOUT1 | GPIO_ALT_FN_2_OUT) | ||
| 5617 | +#define GPIO_NR_HTCUNIVERSAL_KP_MKOUT2_MD (GPIO_NR_HTCUNIVERSAL_KP_MKOUT2 | GPIO_ALT_FN_2_OUT) | ||
| 5618 | +#define GPIO_NR_HTCUNIVERSAL_KP_MKOUT3_MD (GPIO_NR_HTCUNIVERSAL_KP_MKOUT3 | GPIO_ALT_FN_2_OUT) | ||
| 5619 | +#define GPIO_NR_HTCUNIVERSAL_KP_MKOUT4_MD (GPIO_NR_HTCUNIVERSAL_KP_MKOUT4 | GPIO_ALT_FN_2_OUT) | ||
| 5620 | +#define GPIO_NR_HTCUNIVERSAL_KP_MKOUT5_MD (GPIO_NR_HTCUNIVERSAL_KP_MKOUT5 | GPIO_ALT_FN_2_OUT) | ||
| 5621 | +#define GPIO_NR_HTCUNIVERSAL_KP_MKOUT6_MD (GPIO_NR_HTCUNIVERSAL_KP_MKOUT6 | GPIO_ALT_FN_1_OUT) | ||
| 5622 | +#define GPIO_NR_HTCUNIVERSAL_KP_MKOUT7_MD (GPIO_NR_HTCUNIVERSAL_KP_MKOUT7 | GPIO_ALT_FN_1_OUT) | ||
| 5623 | + | ||
| 5624 | + | ||
| 5625 | +#define GPIO_NR_HTCUNIVERSAL_I2S_SYSCLK_MD (113 | GPIO_ALT_FN_1_OUT) | ||
| 5626 | + | ||
| 5627 | +#define GPIO_NR_HTCUNIVERSAL_PWM1OUT_MD (115 | GPIO_ALT_FN_3_OUT) | ||
| 5628 | + | ||
| 5629 | +#define GPIO_NR_HTCUNIVERSAL_I2C_SCL_MD (117 | GPIO_ALT_FN_1_OUT) | ||
| 5630 | +#define GPIO_NR_HTCUNIVERSAL_I2C_SDA_MD (118 | GPIO_ALT_FN_1_OUT) | ||
| 5631 | + | ||
| 5632 | +#endif /* _HTCUNIVERSAL_GPIO_H */ | ||
| 5633 | Index: linux-2.6.26-rc4/include/asm-arm/arch-pxa/htcuniversal-init.h | ||
| 5634 | =================================================================== | ||
| 5635 | --- /dev/null 1970-01-01 00:00:00.000000000 +0000 | ||
| 5636 | +++ linux-2.6.26-rc4/include/asm-arm/arch-pxa/htcuniversal-init.h 2008-06-01 18:49:45.000000000 +0100 | ||
| 5637 | @@ -0,0 +1,14 @@ | ||
| 5638 | +/* | ||
| 5639 | + * include/asm/arm/arch-pxa/htcuniversal-init.h | ||
| 5640 | + * Copyright (c) 2004 SDG Systems, LLC | ||
| 5641 | + */ | ||
| 5642 | + | ||
| 5643 | +#ifndef _HTCUNIVERSAL_INIT_H_ | ||
| 5644 | +#define _HTCUNIVERSAL_INIT_H_ | ||
| 5645 | + | ||
| 5646 | +/* htcuniversal initialization data should be found here | ||
| 5647 | + * See -init.h files from other devices for details | ||
| 5648 | + */ | ||
| 5649 | + | ||
| 5650 | +#endif /* _HTCUNIVERSAL_INIT_H_ */ | ||
| 5651 | + | ||
| 5652 | Index: linux-2.6.26-rc4/include/asm-arm/arch-pxa/htcuniversal.h | ||
| 5653 | =================================================================== | ||
| 5654 | --- /dev/null 1970-01-01 00:00:00.000000000 +0000 | ||
| 5655 | +++ linux-2.6.26-rc4/include/asm-arm/arch-pxa/htcuniversal.h 2008-06-01 18:49:45.000000000 +0100 | ||
| 5656 | @@ -0,0 +1,3 @@ | ||
| 5657 | +#include <asm/arch/irqs.h> | ||
| 5658 | + | ||
| 5659 | +#define HTCUNIVERSAL_ASIC3_IRQ_BASE IRQ_BOARD_START | ||
| 5660 | Index: linux-2.6.26-rc4/include/asm-arm/arch-pxa/pxa-pm_ll.h | ||
| 5661 | =================================================================== | ||
| 5662 | --- /dev/null 1970-01-01 00:00:00.000000000 +0000 | ||
| 5663 | +++ linux-2.6.26-rc4/include/asm-arm/arch-pxa/pxa-pm_ll.h 2008-06-01 18:49:45.000000000 +0100 | ||
| 5664 | @@ -0,0 +1,6 @@ | ||
| 5665 | +struct pxa_ll_pm_ops { | ||
| 5666 | + void (*suspend)(unsigned long); | ||
| 5667 | + void (*resume)(void); | ||
| 5668 | +}; | ||
| 5669 | + | ||
| 5670 | +extern struct pxa_ll_pm_ops *pxa_pm_set_ll_ops(struct pxa_ll_pm_ops *new_ops); | ||
| 5671 | Index: linux-2.6.26-rc4/include/asm-arm/hardware/asic3_keys.h | ||
| 5672 | =================================================================== | ||
| 5673 | --- /dev/null 1970-01-01 00:00:00.000000000 +0000 | ||
| 5674 | +++ linux-2.6.26-rc4/include/asm-arm/hardware/asic3_keys.h 2008-06-01 18:49:45.000000000 +0100 | ||
| 5675 | @@ -0,0 +1,18 @@ | ||
| 5676 | +#include <linux/input.h> | ||
| 5677 | + | ||
| 5678 | +struct asic3_keys_button { | ||
| 5679 | + /* Configuration parameters */ | ||
| 5680 | + int keycode; | ||
| 5681 | + int gpio; | ||
| 5682 | + int active_low; | ||
| 5683 | + char *desc; | ||
| 5684 | + int type; | ||
| 5685 | + /* Internal state vars - add below */ | ||
| 5686 | +}; | ||
| 5687 | + | ||
| 5688 | +struct asic3_keys_platform_data { | ||
| 5689 | + struct asic3_keys_button *buttons; | ||
| 5690 | + int nbuttons; | ||
| 5691 | + struct input_dev *input; | ||
| 5692 | + struct device *asic3_dev; | ||
| 5693 | +}; | ||
| 5694 | Index: linux-2.6.26-rc4/include/asm-arm/hardware/asic3_leds.h | ||
| 5695 | =================================================================== | ||
| 5696 | --- /dev/null 1970-01-01 00:00:00.000000000 +0000 | ||
| 5697 | +++ linux-2.6.26-rc4/include/asm-arm/hardware/asic3_leds.h 2008-06-01 18:49:45.000000000 +0100 | ||
| 5698 | @@ -0,0 +1,34 @@ | ||
| 5699 | +/* | ||
| 5700 | + * LEDs support for HTC ASIC3 devices. | ||
| 5701 | + * | ||
| 5702 | + * Copyright (c) 2006 Anton Vorontsov <cbou@mail.ru> | ||
| 5703 | + * | ||
| 5704 | + * This file is subject to the terms and conditions of the GNU General Public | ||
| 5705 | + * License. See the file COPYING in the main directory of this archive for | ||
| 5706 | + * more details. | ||
| 5707 | + * | ||
| 5708 | + */ | ||
| 5709 | + | ||
| 5710 | +#include <linux/kernel.h> | ||
| 5711 | +#include <linux/init.h> | ||
| 5712 | +#include <linux/platform_device.h> | ||
| 5713 | +#include <linux/leds.h> | ||
| 5714 | + | ||
| 5715 | +struct asic3_leds_machinfo; | ||
| 5716 | + | ||
| 5717 | +struct asic3_led { | ||
| 5718 | + struct led_classdev led_cdev; | ||
| 5719 | + int hw_num; /* Number of "hardware-accelerated" led */ | ||
| 5720 | + int gpio_num; /* Number of GPIO if hw_num == -1 */ | ||
| 5721 | + struct asic3_leds_machinfo *machinfo; | ||
| 5722 | +}; | ||
| 5723 | + | ||
| 5724 | +struct asic3_leds_machinfo { | ||
| 5725 | + int num_leds; | ||
| 5726 | + struct asic3_led *leds; | ||
| 5727 | + struct platform_device *asic3_pdev; | ||
| 5728 | +}; | ||
| 5729 | + | ||
| 5730 | +extern int asic3_leds_register(void); | ||
| 5731 | +extern void asic3_leds_unregister(void); | ||
| 5732 | + | ||
| 5733 | Index: linux-2.6.26-rc4/include/asm-arm/hardware/ipaq-asic3.h | ||
| 5734 | =================================================================== | ||
| 5735 | --- /dev/null 1970-01-01 00:00:00.000000000 +0000 | ||
| 5736 | +++ linux-2.6.26-rc4/include/asm-arm/hardware/ipaq-asic3.h 2008-06-01 18:49:45.000000000 +0100 | ||
| 5737 | @@ -0,0 +1,602 @@ | ||
| 5738 | +/* | ||
| 5739 | + * | ||
| 5740 | + * Definitions for the HTC ASIC3 chip found in several handheld devices | ||
| 5741 | + * | ||
| 5742 | + * Copyright 2001 Compaq Computer Corporation. | ||
| 5743 | + * | ||
| 5744 | + * This program is free software; you can redistribute it and/or modify | ||
| 5745 | + * it under the terms of the GNU General Public License as published by | ||
| 5746 | + * the Free Software Foundation; either version 2 of the License, or | ||
| 5747 | + * (at your option) any later version. | ||
| 5748 | + * | ||
| 5749 | + * COMPAQ COMPUTER CORPORATION MAKES NO WARRANTIES, EXPRESSED OR IMPLIED, | ||
| 5750 | + * AS TO THE USEFULNESS OR CORRECTNESS OF THIS CODE OR ITS | ||
| 5751 | + * FITNESS FOR ANY PARTICULAR PURPOSE. | ||
| 5752 | + * | ||
| 5753 | + * Author: Andrew Christian | ||
| 5754 | + * | ||
| 5755 | + */ | ||
| 5756 | + | ||
| 5757 | +#ifndef IPAQ_ASIC3_H | ||
| 5758 | +#define IPAQ_ASIC3_H | ||
| 5759 | + | ||
| 5760 | +/****************************************************/ | ||
| 5761 | +/* IPAQ, ASIC #3, replaces ASIC #1 */ | ||
| 5762 | + | ||
| 5763 | +#define IPAQ_ASIC3_OFFSET(x,y) (_IPAQ_ASIC3_ ## x ## _Base + _IPAQ_ASIC3_ ## x ## _ ## y) | ||
| 5764 | +#define IPAQ_ASIC3_GPIO_OFFSET(x,y) (_IPAQ_ASIC3_GPIO_ ## x ## _Base + _IPAQ_ASIC3_GPIO_ ## y) | ||
| 5765 | + | ||
| 5766 | + | ||
| 5767 | +/* All offsets below are specified with the following address bus shift */ | ||
| 5768 | +#define ASIC3_DEFAULT_ADDR_SHIFT 2 | ||
| 5769 | + | ||
| 5770 | +#define _IPAQ_ASIC3_GPIO_A_Base 0x0000 | ||
| 5771 | +#define _IPAQ_ASIC3_GPIO_B_Base 0x0100 | ||
| 5772 | +#define _IPAQ_ASIC3_GPIO_C_Base 0x0200 | ||
| 5773 | +#define _IPAQ_ASIC3_GPIO_D_Base 0x0300 | ||
| 5774 | + | ||
| 5775 | +#define _IPAQ_ASIC3_GPIO_Mask 0x00 /* R/W 0:don't mask, 1:mask interrupt */ | ||
| 5776 | +#define _IPAQ_ASIC3_GPIO_Direction 0x04 /* R/W 0:input, 1:output */ | ||
| 5777 | +#define _IPAQ_ASIC3_GPIO_Out 0x08 /* R/W 0:output low, 1:output high */ | ||
| 5778 | +#define _IPAQ_ASIC3_GPIO_TriggerType 0x0c /* R/W 0:level, 1:edge */ | ||
| 5779 | +#define _IPAQ_ASIC3_GPIO_EdgeTrigger 0x10 /* R/W 0:falling, 1:rising */ | ||
| 5780 | +#define _IPAQ_ASIC3_GPIO_LevelTrigger 0x14 /* R/W 0:low, 1:high level detect */ | ||
| 5781 | +#define _IPAQ_ASIC3_GPIO_SleepMask 0x18 /* R/W 0:don't mask, 1:mask trigger in sleep mode */ | ||
| 5782 | +#define _IPAQ_ASIC3_GPIO_SleepOut 0x1c /* R/W level 0:low, 1:high in sleep mode */ | ||
| 5783 | +#define _IPAQ_ASIC3_GPIO_BattFaultOut 0x20 /* R/W level 0:low, 1:high in batt_fault */ | ||
| 5784 | +#define _IPAQ_ASIC3_GPIO_IntStatus 0x24 /* R/W 0:none, 1:detect */ | ||
| 5785 | +#define _IPAQ_ASIC3_GPIO_AltFunction 0x28 /* R/W 0:normal control 1:LED register control */ | ||
| 5786 | +#define _IPAQ_ASIC3_GPIO_SleepConf 0x2c /* R/W bit 1: autosleep 0: disable gposlpout in normal mode, enable gposlpout in sleep mode */ | ||
| 5787 | +#define _IPAQ_ASIC3_GPIO_Status 0x30 /* R Pin status */ | ||
| 5788 | + | ||
| 5789 | +#define IPAQ_ASIC3_GPIO_A_MASK(_b) IPAQ_ASIC3_GPIO( _b, u16, A, Mask ) | ||
| 5790 | +#define IPAQ_ASIC3_GPIO_A_DIR(_b) IPAQ_ASIC3_GPIO( _b, u16, A, Direction ) | ||
| 5791 | +#define IPAQ_ASIC3_GPIO_A_OUT(_b) IPAQ_ASIC3_GPIO( _b, u16, A, Out ) | ||
| 5792 | +#define IPAQ_ASIC3_GPIO_A_LEVELTRI(_b) IPAQ_ASIC3_GPIO( _b, u16, A, TriggerType ) | ||
| 5793 | +#define IPAQ_ASIC3_GPIO_A_RISING(_b) IPAQ_ASIC3_GPIO( _b, u16, A, EdgeTrigger ) | ||
| 5794 | +#define IPAQ_ASIC3_GPIO_A_LEVEL(_b) IPAQ_ASIC3_GPIO( _b, u16, A, LevelTrigger ) | ||
| 5795 | +#define IPAQ_ASIC3_GPIO_A_SLEEP_MASK(_b) IPAQ_ASIC3_GPIO( _b, u16, A, SleepMask ) | ||
| 5796 | +#define IPAQ_ASIC3_GPIO_A_SLEEP_OUT(_b) IPAQ_ASIC3_GPIO( _b, u16, A, SleepOut ) | ||
| 5797 | +#define IPAQ_ASIC3_GPIO_A_BATT_FAULT_OUT(_b) IPAQ_ASIC3_GPIO( _b, u16, A, BattFaultOut ) | ||
| 5798 | +#define IPAQ_ASIC3_GPIO_A_INT_STATUS(_b) IPAQ_ASIC3_GPIO( _b, u16, A, IntStatus ) | ||
| 5799 | +#define IPAQ_ASIC3_GPIO_A_ALT_FUNCTION(_b) IPAQ_ASIC3_GPIO( _b, u16, A, AltFunction ) | ||
| 5800 | +#define IPAQ_ASIC3_GPIO_A_SLEEP_CONF(_b) IPAQ_ASIC3_GPIO( _b, u16, A, SleepConf ) | ||
| 5801 | +#define IPAQ_ASIC3_GPIO_A_STATUS(_b) IPAQ_ASIC3_GPIO( _b, u16, A, Status ) | ||
| 5802 | + | ||
| 5803 | +#define IPAQ_ASIC3_GPIO_B_MASK(_b) IPAQ_ASIC3_GPIO( _b, u16, B, Mask ) | ||
| 5804 | +#define IPAQ_ASIC3_GPIO_B_DIR(_b) IPAQ_ASIC3_GPIO( _b, u16, B, Direction ) | ||
| 5805 | +#define IPAQ_ASIC3_GPIO_B_OUT(_b) IPAQ_ASIC3_GPIO( _b, u16, B, Out ) | ||
| 5806 | +#define IPAQ_ASIC3_GPIO_B_LEVELTRI(_b) IPAQ_ASIC3_GPIO( _b, u16, B, TriggerType ) | ||
| 5807 | +#define IPAQ_ASIC3_GPIO_B_RISING(_b) IPAQ_ASIC3_GPIO( _b, u16, B, EdgeTrigger ) | ||
| 5808 | +#define IPAQ_ASIC3_GPIO_B_LEVEL(_b) IPAQ_ASIC3_GPIO( _b, u16, B, LevelTrigger ) | ||
| 5809 | +#define IPAQ_ASIC3_GPIO_B_SLEEP_MASK(_b) IPAQ_ASIC3_GPIO( _b, u16, B, SleepMask ) | ||
| 5810 | +#define IPAQ_ASIC3_GPIO_B_SLEEP_OUT(_b) IPAQ_ASIC3_GPIO( _b, u16, B, SleepOut ) | ||
| 5811 | +#define IPAQ_ASIC3_GPIO_B_BATT_FAULT_OUT(_b) IPAQ_ASIC3_GPIO( _b, u16, B, BattFaultOut ) | ||
| 5812 | +#define IPAQ_ASIC3_GPIO_B_INT_STATUS(_b) IPAQ_ASIC3_GPIO( _b, u16, B, IntStatus ) | ||
| 5813 | +#define IPAQ_ASIC3_GPIO_B_ALT_FUNCTION(_b) IPAQ_ASIC3_GPIO( _b, u16, B, AltFunction ) | ||
| 5814 | +#define IPAQ_ASIC3_GPIO_B_SLEEP_CONF(_b) IPAQ_ASIC3_GPIO( _b, u16, B, SleepConf ) | ||
| 5815 | +#define IPAQ_ASIC3_GPIO_B_STATUS(_b) IPAQ_ASIC3_GPIO( _b, u16, B, Status ) | ||
| 5816 | + | ||
| 5817 | +#define IPAQ_ASIC3_GPIO_C_MASK(_b) IPAQ_ASIC3_GPIO( _b, u16, C, Mask ) | ||
| 5818 | +#define IPAQ_ASIC3_GPIO_C_DIR(_b) IPAQ_ASIC3_GPIO( _b, u16, C, Direction ) | ||
| 5819 | +#define IPAQ_ASIC3_GPIO_C_OUT(_b) IPAQ_ASIC3_GPIO( _b, u16, C, Out ) | ||
| 5820 | +#define IPAQ_ASIC3_GPIO_C_LEVELTRI(_b) IPAQ_ASIC3_GPIO( _b, u16, C, TriggerType ) | ||
| 5821 | +#define IPAQ_ASIC3_GPIO_C_RISING(_b) IPAQ_ASIC3_GPIO( _b, u16, C, EdgeTrigger ) | ||
| 5822 | +#define IPAQ_ASIC3_GPIO_C_LEVEL(_b) IPAQ_ASIC3_GPIO( _b, u16, C, LevelTrigger ) | ||
| 5823 | +#define IPAQ_ASIC3_GPIO_C_SLEEP_MASK(_b) IPAQ_ASIC3_GPIO( _b, u16, C, SleepMask ) | ||
| 5824 | +#define IPAQ_ASIC3_GPIO_C_SLEEP_OUT(_b) IPAQ_ASIC3_GPIO( _b, u16, C, SleepOut ) | ||
| 5825 | +#define IPAQ_ASIC3_GPIO_C_BATT_FAULT_OUT(_b) IPAQ_ASIC3_GPIO( _b, u16, C, BattFaultOut ) | ||
| 5826 | +#define IPAQ_ASIC3_GPIO_C_INT_STATUS(_b) IPAQ_ASIC3_GPIO( _b, u16, C, IntStatus ) | ||
| 5827 | +#define IPAQ_ASIC3_GPIO_C_ALT_FUNCTION(_b) IPAQ_ASIC3_GPIO( _b, u16, C, AltFunction ) | ||
| 5828 | +#define IPAQ_ASIC3_GPIO_C_SLEEP_CONF(_b) IPAQ_ASIC3_GPIO( _b, u16, C, SleepConf ) | ||
| 5829 | +#define IPAQ_ASIC3_GPIO_C_STATUS(_b) IPAQ_ASIC3_GPIO( _b, u16, C, Status ) | ||
| 5830 | + | ||
| 5831 | +#define IPAQ_ASIC3_GPIO_D_MASK(_b) IPAQ_ASIC3_GPIO( _b, u16, D, Mask ) | ||
| 5832 | +#define IPAQ_ASIC3_GPIO_D_DIR(_b) IPAQ_ASIC3_GPIO( _b, u16, D, Direction ) | ||
| 5833 | +#define IPAQ_ASIC3_GPIO_D_OUT(_b) IPAQ_ASIC3_GPIO( _b, u16, D, Out ) | ||
| 5834 | +#define IPAQ_ASIC3_GPIO_D_LEVELTRI(_b) IPAQ_ASIC3_GPIO( _b, u16, D, TriggerType ) | ||
| 5835 | +#define IPAQ_ASIC3_GPIO_D_RISING(_b) IPAQ_ASIC3_GPIO( _b, u16, D, EdgeTrigger ) | ||
| 5836 | +#define IPAQ_ASIC3_GPIO_D_LEVEL(_b) IPAQ_ASIC3_GPIO( _b, u16, D, LevelTrigger ) | ||
| 5837 | +#define IPAQ_ASIC3_GPIO_D_SLEEP_MASK(_b) IPAQ_ASIC3_GPIO( _b, u16, D, SleepMask ) | ||
| 5838 | +#define IPAQ_ASIC3_GPIO_D_SLEEP_OUT(_b) IPAQ_ASIC3_GPIO( _b, u16, D, SleepOut ) | ||
| 5839 | +#define IPAQ_ASIC3_GPIO_D_BATT_FAULT_OUT(_b) IPAQ_ASIC3_GPIO( _b, u16, D, BattFaultOut ) | ||
| 5840 | +#define IPAQ_ASIC3_GPIO_D_INT_STATUS(_b) IPAQ_ASIC3_GPIO( _b, u16, D, IntStatus ) | ||
| 5841 | +#define IPAQ_ASIC3_GPIO_D_ALT_FUNCTION(_b) IPAQ_ASIC3_GPIO( _b, u16, D, AltFunction ) | ||
| 5842 | +#define IPAQ_ASIC3_GPIO_D_SLEEP_CONF(_b) IPAQ_ASIC3_GPIO( _b, u16, D, SleepConf ) | ||
| 5843 | +#define IPAQ_ASIC3_GPIO_D_STATUS(_b) IPAQ_ASIC3_GPIO( _b, u16, D, Status ) | ||
| 5844 | + | ||
| 5845 | +#define _IPAQ_ASIC3_SPI_Base 0x0400 | ||
| 5846 | +#define _IPAQ_ASIC3_SPI_Control 0x0000 | ||
| 5847 | +#define _IPAQ_ASIC3_SPI_TxData 0x0004 | ||
| 5848 | +#define _IPAQ_ASIC3_SPI_RxData 0x0008 | ||
| 5849 | +#define _IPAQ_ASIC3_SPI_Int 0x000c | ||
| 5850 | +#define _IPAQ_ASIC3_SPI_Status 0x0010 | ||
| 5851 | + | ||
| 5852 | +#define IPAQ_ASIC3_SPI_Control(_b) IPAQ_ASIC3( _b, u16, SPI, Control ) | ||
| 5853 | +#define IPAQ_ASIC3_SPI_TxData(_b) IPAQ_ASIC3( _b, u16, SPI, TxData ) | ||
| 5854 | +#define IPAQ_ASIC3_SPI_RxData(_b) IPAQ_ASIC3( _b, u16, SPI, RxData ) | ||
| 5855 | +#define IPAQ_ASIC3_SPI_Int(_b) IPAQ_ASIC3( _b, u16, SPI, Int ) | ||
| 5856 | +#define IPAQ_ASIC3_SPI_Status(_b) IPAQ_ASIC3( _b, u16, SPI, Status ) | ||
| 5857 | + | ||
| 5858 | +#define SPI_CONTROL_SPR(clk) ((clk) & 0x0f) /* Clock rate */ | ||
| 5859 | + | ||
| 5860 | +#define _IPAQ_ASIC3_PWM_0_Base 0x0500 | ||
| 5861 | +#define _IPAQ_ASIC3_PWM_1_Base 0x0600 | ||
| 5862 | +#define _IPAQ_ASIC3_PWM_TimeBase 0x0000 | ||
| 5863 | +#define _IPAQ_ASIC3_PWM_PeriodTime 0x0004 | ||
| 5864 | +#define _IPAQ_ASIC3_PWM_DutyTime 0x0008 | ||
| 5865 | + | ||
| 5866 | +#define IPAQ_ASIC3_PWM_TimeBase(_b, x) IPAQ_ASIC3_N( _b, u16, PWM, x, TimeBase ) | ||
| 5867 | +#define IPAQ_ASIC3_PWM_PeriodTime(_b, x) IPAQ_ASIC3_N( _b, u16, PWM, x, PeriodTime ) | ||
| 5868 | +#define IPAQ_ASIC3_PWM_DutyTime(_b, x) IPAQ_ASIC3_N( _b, u16, PWM, x, DutyTime ) | ||
| 5869 | + | ||
| 5870 | +#define PWM_TIMEBASE_VALUE(x) ((x)&0xf) /* Low 4 bits sets time base */ | ||
| 5871 | +#define PWM_TIMEBASE_ENABLE (1 << 4) /* Enable clock */ | ||
| 5872 | + | ||
| 5873 | +#define _IPAQ_ASIC3_LED_0_Base 0x0700 | ||
| 5874 | +#define _IPAQ_ASIC3_LED_1_Base 0x0800 | ||
| 5875 | +#define _IPAQ_ASIC3_LED_2_Base 0x0900 | ||
| 5876 | +#define _IPAQ_ASIC3_LED_TimeBase 0x0000 /* R/W 7 bits */ | ||
| 5877 | +#define _IPAQ_ASIC3_LED_PeriodTime 0x0004 /* R/W 12 bits */ | ||
| 5878 | +#define _IPAQ_ASIC3_LED_DutyTime 0x0008 /* R/W 12 bits */ | ||
| 5879 | +#define _IPAQ_ASIC3_LED_AutoStopCount 0x000c /* R/W 16 bits */ | ||
| 5880 | + | ||
| 5881 | +#define IPAQ_ASIC3_LED_TimeBase(_b, x) IPAQ_ASIC3_N( _b, u8, LED, x, TimeBase ) | ||
| 5882 | +#define IPAQ_ASIC3_LED_PeriodTime(_b, x) IPAQ_ASIC3_N( _b, u16, LED, x, PeriodTime ) | ||
| 5883 | +#define IPAQ_ASIC3_LED_DutyTime(_b, x) IPAQ_ASIC3_N( _b, u16, LED, x, DutyTime ) | ||
| 5884 | +#define IPAQ_ASIC3_LED_AutoStopCount(_b, x) IPAQ_ASIC3_N( _b, u16, LED, x, AutoStopCount ) | ||
| 5885 | + | ||
| 5886 | +/* LED TimeBase bits - match ASIC2 */ | ||
| 5887 | +#define LED_TBS 0x0f /* Low 4 bits sets time base, max = 13 */ | ||
| 5888 | + /* Note: max = 5 on hx4700 */ | ||
| 5889 | + /* 0: maximum time base */ | ||
| 5890 | + /* 1: maximum time base / 2 */ | ||
| 5891 | + /* n: maximum time base / 2^n */ | ||
| 5892 | + | ||
| 5893 | +#define LED_EN (1 << 4) /* LED ON/OFF 0:off, 1:on */ | ||
| 5894 | +#define LED_AUTOSTOP (1 << 5) /* LED ON/OFF auto stop set 0:disable, 1:enable */ | ||
| 5895 | +#define LED_ALWAYS (1 << 6) /* LED Interrupt Mask 0:No mask, 1:mask */ | ||
| 5896 | + | ||
| 5897 | +#define _IPAQ_ASIC3_CLOCK_Base 0x0A00 | ||
| 5898 | +#define _IPAQ_ASIC3_CLOCK_CDEX 0x00 | ||
| 5899 | +#define _IPAQ_ASIC3_CLOCK_SEL 0x04 | ||
| 5900 | + | ||
| 5901 | +#define IPAQ_ASIC3_CLOCK_CDEX(_b) IPAQ_ASIC3( _b, u16, CLOCK, CDEX ) | ||
| 5902 | +#define IPAQ_ASIC3_CLOCK_SEL(_b) IPAQ_ASIC3( _b, u16, CLOCK, SEL ) | ||
| 5903 | + | ||
| 5904 | +#define CLOCK_CDEX_SOURCE (1 << 0) /* 2 bits */ | ||
| 5905 | +#define CLOCK_CDEX_SOURCE0 (1 << 0) | ||
| 5906 | +#define CLOCK_CDEX_SOURCE1 (1 << 1) | ||
| 5907 | +#define CLOCK_CDEX_SPI (1 << 2) | ||
| 5908 | +#define CLOCK_CDEX_OWM (1 << 3) | ||
| 5909 | +#define CLOCK_CDEX_PWM0 (1 << 4) | ||
| 5910 | +#define CLOCK_CDEX_PWM1 (1 << 5) | ||
| 5911 | +#define CLOCK_CDEX_LED0 (1 << 6) | ||
| 5912 | +#define CLOCK_CDEX_LED1 (1 << 7) | ||
| 5913 | +#define CLOCK_CDEX_LED2 (1 << 8) | ||
| 5914 | + | ||
| 5915 | +#define CLOCK_CDEX_SD_HOST (1 << 9) /* R/W: SD host clock source 24.576M/12.288M */ | ||
| 5916 | +#define CLOCK_CDEX_SD_BUS (1 << 10) /* R/W: SD bus clock source control 24.576M/12.288M */ | ||
| 5917 | +#define CLOCK_CDEX_SMBUS (1 << 11) | ||
| 5918 | +#define CLOCK_CDEX_CONTROL_CX (1 << 12) | ||
| 5919 | + | ||
| 5920 | +#define CLOCK_CDEX_EX0 (1 << 13) /* R/W: 32.768 kHz crystal */ | ||
| 5921 | +#define CLOCK_CDEX_EX1 (1 << 14) /* R/W: 24.576 MHz crystal */ | ||
| 5922 | + | ||
| 5923 | +#define CLOCK_SEL_SD_HCLK_SEL (1 << 0) /* R/W: SDIO host clock select - 1: 24.576 Mhz, 0: 12.288 MHz */ | ||
| 5924 | +#define CLOCK_SEL_SD_BCLK_SEL (1 << 1) /* R/W: SDIO bus clock select - 1: 24.576 MHz, 0: 12.288 MHz */ | ||
| 5925 | +#define CLOCK_SEL_CX (1 << 2) /* R/W: INT clock source control (32.768 kHz) */ | ||
| 5926 | + | ||
| 5927 | + | ||
| 5928 | +#define _IPAQ_ASIC3_INTR_Base 0x0B00 | ||
| 5929 | + | ||
| 5930 | +#define _IPAQ_ASIC3_INTR_IntMask 0x00 /* Interrupt mask control */ | ||
| 5931 | +#define _IPAQ_ASIC3_INTR_PIntStat 0x04 /* Peripheral interrupt status */ | ||
| 5932 | +#define _IPAQ_ASIC3_INTR_IntCPS 0x08 /* Interrupt timer clock pre-scale */ | ||
| 5933 | +#define _IPAQ_ASIC3_INTR_IntTBS 0x0c /* Interrupt timer set */ | ||
| 5934 | + | ||
| 5935 | +#define IPAQ_ASIC3_INTR_IntMask(_b) IPAQ_ASIC3( _b, u8, INTR, IntMask ) | ||
| 5936 | +#define IPAQ_ASIC3_INTR_PIntStat(_b) IPAQ_ASIC3( _b, u8, INTR, PIntStat ) | ||
| 5937 | +#define IPAQ_ASIC3_INTR_IntCPS(_b) IPAQ_ASIC3( _b, u8, INTR, IntCPS ) | ||
| 5938 | +#define IPAQ_ASIC3_INTR_IntTBS(_b) IPAQ_ASIC3( _b, u16, INTR, IntTBS ) | ||
| 5939 | + | ||
| 5940 | +#define ASIC3_INTMASK_GINTMASK (1 << 0) /* Global interrupt mask 1:enable */ | ||
| 5941 | +#define ASIC3_INTMASK_GINTEL (1 << 1) /* 1: rising edge, 0: hi level */ | ||
| 5942 | +#define ASIC3_INTMASK_MASK0 (1 << 2) | ||
| 5943 | +#define ASIC3_INTMASK_MASK1 (1 << 3) | ||
| 5944 | +#define ASIC3_INTMASK_MASK2 (1 << 4) | ||
| 5945 | +#define ASIC3_INTMASK_MASK3 (1 << 5) | ||
| 5946 | +#define ASIC3_INTMASK_MASK4 (1 << 6) | ||
| 5947 | +#define ASIC3_INTMASK_MASK5 (1 << 7) | ||
| 5948 | + | ||
| 5949 | +#define ASIC3_INTR_PERIPHERAL_A (1 << 0) | ||
| 5950 | +#define ASIC3_INTR_PERIPHERAL_B (1 << 1) | ||
| 5951 | +#define ASIC3_INTR_PERIPHERAL_C (1 << 2) | ||
| 5952 | +#define ASIC3_INTR_PERIPHERAL_D (1 << 3) | ||
| 5953 | +#define ASIC3_INTR_LED0 (1 << 4) | ||
| 5954 | +#define ASIC3_INTR_LED1 (1 << 5) | ||
| 5955 | +#define ASIC3_INTR_LED2 (1 << 6) | ||
| 5956 | +#define ASIC3_INTR_SPI (1 << 7) | ||
| 5957 | +#define ASIC3_INTR_SMBUS (1 << 8) | ||
| 5958 | +#define ASIC3_INTR_OWM (1 << 9) | ||
| 5959 | + | ||
| 5960 | +#define ASIC3_INTR_CPS(x) ((x)&0x0f) /* 4 bits, max 14 */ | ||
| 5961 | +#define ASIC3_INTR_CPS_SET ( 1 << 4 ) /* Time base enable */ | ||
| 5962 | + | ||
| 5963 | + | ||
| 5964 | +/* Basic control of the SD ASIC */ | ||
| 5965 | +#define _IPAQ_ASIC3_SDHWCTRL_Base 0x0E00 | ||
| 5966 | + | ||
| 5967 | +#define _IPAQ_ASIC3_SDHWCTRL_SDConf 0x00 | ||
| 5968 | +#define IPAQ_ASIC3_SDHWCTRL_SDConf(_b) IPAQ_ASIC3( _b, u8, SDHWCTRL, SDConf ) | ||
| 5969 | + | ||
| 5970 | +#define ASIC3_SDHWCTRL_SUSPEND (1 << 0) /* 1=suspend all SD operations */ | ||
| 5971 | +#define ASIC3_SDHWCTRL_CLKSEL (1 << 1) /* 1=SDICK, 0=HCLK */ | ||
| 5972 | +#define ASIC3_SDHWCTRL_PCLR (1 << 2) /* All registers of SDIO cleared */ | ||
| 5973 | +#define ASIC3_SDHWCTRL_LEVCD (1 << 3) /* Level of SD card detection: 1:high, 0:low */ | ||
| 5974 | +#define ASIC3_SDHWCTRL_LEVWP (1 << 4) /* Level of SD card write protection: 1=low, 0=high */ | ||
| 5975 | +#define ASIC3_SDHWCTRL_SDLED (1 << 5) /* SD card LED signal 1=enable, 0=disable */ | ||
| 5976 | +#define ASIC3_SDHWCTRL_SDPWR (1 << 6) /* SD card power supply control 1=enable */ | ||
| 5977 | + | ||
| 5978 | + | ||
| 5979 | +/* This is a pointer to an array of 12 u32 values - but only the lower 2 bytes matter */ | ||
| 5980 | +/* Use it as "IPAQ_ASIC3_HWPROTECT_ARRAY[x]" */ | ||
| 5981 | + | ||
| 5982 | +#define _IPAQ_ASIC3_HWPROTECT_Base 0x1000 | ||
| 5983 | +#define IPAQ_ASIC3_HWPROTECT_ARRAY ((volatile u32*)(_IPAQ_ASIC3_Base + _IPAQ_ASIC3_HWPROTECT_Base)) | ||
| 5984 | +#define HWPROTECT_ARRAY_LEN 12 | ||
| 5985 | +#define HWPROTECT_ARRAY_VALUES {0x4854,0x432d,0x5344,0x494f,0x2050,0x2f4e,0x3a33,0x3048,0x3830,0x3032,0x382d,0x3030} | ||
| 5986 | + | ||
| 5987 | + | ||
| 5988 | +#define _IPAQ_ASIC3_EXTCF_Base 0x1100 | ||
| 5989 | + | ||
| 5990 | +#define _IPAQ_ASIC3_EXTCF_Select 0x00 | ||
| 5991 | +#define _IPAQ_ASIC3_EXTCF_Reset 0x04 | ||
| 5992 | + | ||
| 5993 | +#define IPAQ_ASIC3_EXTCF_Select(_b) IPAQ_ASIC3( _b, u16, EXTCF, Select ) | ||
| 5994 | +#define IPAQ_ASIC3_EXTCF_Reset(_b) IPAQ_ASIC3( _b, u16, EXTCF, Reset ) | ||
| 5995 | + | ||
| 5996 | +#define ASIC3_EXTCF_SMOD0 (1 << 0) /* slot number of mode 0 */ | ||
| 5997 | +#define ASIC3_EXTCF_SMOD1 (1 << 1) /* slot number of mode 1 */ | ||
| 5998 | +#define ASIC3_EXTCF_SMOD2 (1 << 2) /* slot number of mode 2 */ | ||
| 5999 | +#define ASIC3_EXTCF_OWM_EN (1 << 4) /* enable onewire module */ | ||
| 6000 | +#define ASIC3_EXTCF_OWM_SMB (1 << 5) /* OWM bus selection */ | ||
| 6001 | +#define ASIC3_EXTCF_OWM_RESET (1 << 6) /* undocumented, used by OWM and CF */ | ||
| 6002 | +#define ASIC3_EXTCF_CF0_SLEEP_MODE (1 << 7) /* CF0 sleep state control */ | ||
| 6003 | +#define ASIC3_EXTCF_CF1_SLEEP_MODE (1 << 8) /* CF1 sleep state control */ | ||
| 6004 | +#define ASIC3_EXTCF_CF0_PWAIT_EN (1 << 10) /* CF0 PWAIT_n control */ | ||
| 6005 | +#define ASIC3_EXTCF_CF1_PWAIT_EN (1 << 11) /* CF1 PWAIT_n control */ | ||
| 6006 | +#define ASIC3_EXTCF_CF0_BUF_EN (1 << 12) /* CF0 buffer control */ | ||
| 6007 | +#define ASIC3_EXTCF_CF1_BUF_EN (1 << 13) /* CF1 buffer control */ | ||
| 6008 | +#define ASIC3_EXTCF_SD_MEM_ENABLE (1 << 14) | ||
| 6009 | +#define ASIC3_EXTCF_CF_SLEEP (1 << 15) /* CF sleep mode control */ | ||
| 6010 | + | ||
| 6011 | +/***************************************************************************** | ||
| 6012 | + * The Onewire interface registers | ||
| 6013 | + * | ||
| 6014 | + * OWM_CMD | ||
| 6015 | + * OWM_DAT | ||
| 6016 | + * OWM_INTR | ||
| 6017 | + * OWM_INTEN | ||
| 6018 | + * OWM_CLKDIV | ||
| 6019 | + * | ||
| 6020 | + *****************************************************************************/ | ||
| 6021 | + | ||
| 6022 | +#define _IPAQ_ASIC3_OWM_Base 0xC00 | ||
| 6023 | + | ||
| 6024 | +#define _IPAQ_ASIC3_OWM_CMD 0x00 | ||
| 6025 | +#define _IPAQ_ASIC3_OWM_DAT 0x04 | ||
| 6026 | +#define _IPAQ_ASIC3_OWM_INTR 0x08 | ||
| 6027 | +#define _IPAQ_ASIC3_OWM_INTEN 0x0C | ||
| 6028 | +#define _IPAQ_ASIC3_OWM_CLKDIV 0x10 | ||
| 6029 | + | ||
| 6030 | +#define ASIC3_OWM_CMD_ONEWR (1 << 0) | ||
| 6031 | +#define ASIC3_OWM_CMD_SRA (1 << 1) | ||
| 6032 | +#define ASIC3_OWM_CMD_DQO (1 << 2) | ||
| 6033 | +#define ASIC3_OWM_CMD_DQI (1 << 3) | ||
| 6034 | + | ||
| 6035 | +#define ASIC3_OWM_INTR_PD (1 << 0) | ||
| 6036 | +#define ASIC3_OWM_INTR_PDR (1 << 1) | ||
| 6037 | +#define ASIC3_OWM_INTR_TBE (1 << 2) | ||
| 6038 | +#define ASIC3_OWM_INTR_TEMP (1 << 3) | ||
| 6039 | +#define ASIC3_OWM_INTR_RBF (1 << 4) | ||
| 6040 | + | ||
| 6041 | +#define ASIC3_OWM_INTEN_EPD (1 << 0) | ||
| 6042 | +#define ASIC3_OWM_INTEN_IAS (1 << 1) | ||
| 6043 | +#define ASIC3_OWM_INTEN_ETBE (1 << 2) | ||
| 6044 | +#define ASIC3_OWM_INTEN_ETMT (1 << 3) | ||
| 6045 | +#define ASIC3_OWM_INTEN_ERBF (1 << 4) | ||
| 6046 | + | ||
| 6047 | +#define ASIC3_OWM_CLKDIV_PRE (3 << 0) /* two bits wide at bit position 0 */ | ||
| 6048 | +#define ASIC3_OWM_CLKDIV_DIV (7 << 2) /* 3 bits wide at bit position 2 */ | ||
| 6049 | + | ||
| 6050 | + | ||
| 6051 | +/***************************************************************************** | ||
| 6052 | + * The SD configuration registers are at a completely different location | ||
| 6053 | + * in memory. They are divided into three sets of registers: | ||
| 6054 | + * | ||
| 6055 | + * SD_CONFIG Core configuration register | ||
| 6056 | + * SD_CTRL Control registers for SD operations | ||
| 6057 | + * SDIO_CTRL Control registers for SDIO operations | ||
| 6058 | + * | ||
| 6059 | + *****************************************************************************/ | ||
| 6060 | + | ||
| 6061 | +#define IPAQ_ASIC3_SD_CONFIG(_b, s,x) \ | ||
| 6062 | + (*((volatile s *) ((_b) + _IPAQ_ASIC3_SD_CONFIG_Base + (_IPAQ_ASIC3_SD_CONFIG_ ## x)))) | ||
| 6063 | + | ||
| 6064 | +#define _IPAQ_ASIC3_SD_CONFIG_Base 0x0400 // Assumes 32 bit addressing | ||
| 6065 | + | ||
| 6066 | +#define _IPAQ_ASIC3_SD_CONFIG_Command 0x08 /* R/W: Command */ | ||
| 6067 | +#define _IPAQ_ASIC3_SD_CONFIG_Addr0 0x20 /* [9:31] SD Control Register Base Address */ | ||
| 6068 | +#define _IPAQ_ASIC3_SD_CONFIG_Addr1 0x24 /* [9:31] SD Control Register Base Address */ | ||
| 6069 | +#define _IPAQ_ASIC3_SD_CONFIG_IntPin 0x78 /* R/O: interrupt assigned to pin */ | ||
| 6070 | +#define _IPAQ_ASIC3_SD_CONFIG_ClkStop 0x80 /* Set to 0x1f to clock SD controller, 0 otherwise. */ | ||
| 6071 | + /* at 0x82 - Gated Clock Control */ | ||
| 6072 | +#define _IPAQ_ASIC3_SD_CONFIG_ClockMode 0x84 /* Control clock of SD controller */ | ||
| 6073 | +#define _IPAQ_ASIC3_SD_CONFIG_SDHC_PinStatus 0x88 /* R/0: read status of SD pins */ | ||
| 6074 | +#define _IPAQ_ASIC3_SD_CONFIG_SDHC_Power1 0x90 /* Power1 - manual power control */ | ||
| 6075 | + /* Power2 is at 0x92 - auto power up after card inserted */ | ||
| 6076 | +#define _IPAQ_ASIC3_SD_CONFIG_SDHC_Power3 0x94 /* auto power down when card removed */ | ||
| 6077 | +#define _IPAQ_ASIC3_SD_CONFIG_SDHC_CardDetect 0x98 /* */ | ||
| 6078 | +#define _IPAQ_ASIC3_SD_CONFIG_SDHC_Slot 0xA0 /* R/O: define support slot number */ | ||
| 6079 | +#define _IPAQ_ASIC3_SD_CONFIG_SDHC_ExtGateClk1 0x1E0 /* Could be used for gated clock (don't use) */ | ||
| 6080 | +#define _IPAQ_ASIC3_SD_CONFIG_SDHC_ExtGateClk2 0x1E2 /* Could be used for gated clock (don't use) */ | ||
| 6081 | +#define _IPAQ_ASIC3_SD_CONFIG_SDHC_GPIO_OutAndEnable 0x1E8 /* GPIO Output Reg. , at 0x1EA - GPIO Output Enable Reg. */ | ||
| 6082 | +#define _IPAQ_ASIC3_SD_CONFIG_SDHC_GPIO_Status 0x1EC /* GPIO Status Reg. */ | ||
| 6083 | +#define _IPAQ_ASIC3_SD_CONFIG_SDHC_ExtGateClk3 0x1F0 /* Bit 1: double buffer/single buffer */ | ||
| 6084 | + | ||
| 6085 | +#define IPAQ_ASIC3_SD_CONFIG_Command(_b) IPAQ_ASIC3_SD_CONFIG(_b, u16, Command ) | ||
| 6086 | +#define IPAQ_ASIC3_SD_CONFIG_Addr0(_b) IPAQ_ASIC3_SD_CONFIG(_b, u16, Addr0 ) | ||
| 6087 | +#define IPAQ_ASIC3_SD_CONFIG_Addr1(_b) IPAQ_ASIC3_SD_CONFIG(_b, u16, Addr1 ) | ||
| 6088 | +#define IPAQ_ASIC3_SD_CONFIG_IntPin(_b) IPAQ_ASIC3_SD_CONFIG(_b, u8, IntPin ) | ||
| 6089 | +#define IPAQ_ASIC3_SD_CONFIG_ClkStop(_b) IPAQ_ASIC3_SD_CONFIG(_b, u8, ClkStop ) | ||
| 6090 | +#define IPAQ_ASIC3_SD_CONFIG_ClockMode(_b) IPAQ_ASIC3_SD_CONFIG(_b, u8, ClockMode ) | ||
| 6091 | +#define IPAQ_ASIC3_SD_CONFIG_SDHC_PinStatus(_b) IPAQ_ASIC3_SD_CONFIG(_b, u16, SDHC_PinStatus ) | ||
| 6092 | +#define IPAQ_ASIC3_SD_CONFIG_SDHC_Power1(_b) IPAQ_ASIC3_SD_CONFIG(_b, u16, SDHC_Power1 ) | ||
| 6093 | +#define IPAQ_ASIC3_SD_CONFIG_SDHC_Power3(_b) IPAQ_ASIC3_SD_CONFIG(_b, u16, SDHC_Power3 ) | ||
| 6094 | +#define IPAQ_ASIC3_SD_CONFIG_SDHC_CardDetect(_b) IPAQ_ASIC3_SD_CONFIG(_b, u16, SDHC_CardDetect ) | ||
| 6095 | +#define IPAQ_ASIC3_SD_CONFIG_SDHC_Slot(_b) IPAQ_ASIC3_SD_CONFIG(_b, u16, SDHC_Slot ) | ||
| 6096 | +#define IPAQ_ASIC3_SD_CONFIG_SDHC_ExtGateClk1(_b) IPAQ_ASIC3_SD_CONFIG(_b, u16, SDHC_ExtGateClk1 ) | ||
| 6097 | +#define IPAQ_ASIC3_SD_CONFIG_SDHC_ExtGateClk3(_b) IPAQ_ASIC3_SD_CONFIG(_b, u16, SDHC_ExtGateClk3 ) | ||
| 6098 | + | ||
| 6099 | +#define SD_CONFIG_ | ||
| 6100 | + | ||
| 6101 | +#define SD_CONFIG_COMMAND_MAE (1<<1) /* Memory access enable (set to 1 to access SD Controller) */ | ||
| 6102 | + | ||
| 6103 | +#define SD_CONFIG_CLK_ENABLE_ALL 0x1f | ||
| 6104 | + | ||
| 6105 | +#define SD_CONFIG_POWER1_PC_33V 0x0200 /* Set for 3.3 volts */ | ||
| 6106 | +#define SD_CONFIG_POWER1_PC_OFF 0x0000 /* Turn off power */ | ||
| 6107 | + | ||
| 6108 | +#define SD_CONFIG_CARDDETECTMODE_CLK ((x)&0x3) /* two bits - number of cycles for card detection */ | ||
| 6109 | + | ||
| 6110 | + | ||
| 6111 | +#define _IPAQ_ASIC3_SD_CTRL_Base 0x1000 | ||
| 6112 | + | ||
| 6113 | +#define IPAQ_ASIC3_SD(_b, s,x) \ | ||
| 6114 | + (*((volatile s *) ((_b) + _IPAQ_ASIC3_SD_CTRL_Base + (_IPAQ_ASIC3_SD_CTRL_ ## x)))) | ||
| 6115 | + | ||
| 6116 | +#define _IPAQ_ASIC3_SD_CTRL_Cmd 0x00 | ||
| 6117 | +#define _IPAQ_ASIC3_SD_CTRL_Arg0 0x08 | ||
| 6118 | +#define _IPAQ_ASIC3_SD_CTRL_Arg1 0x0C | ||
| 6119 | +#define _IPAQ_ASIC3_SD_CTRL_StopInternal 0x10 | ||
| 6120 | +#define _IPAQ_ASIC3_SD_CTRL_TransferSectorCount 0x14 | ||
| 6121 | +#define _IPAQ_ASIC3_SD_CTRL_Response0 0x18 | ||
| 6122 | +#define _IPAQ_ASIC3_SD_CTRL_Response1 0x1C | ||
| 6123 | +#define _IPAQ_ASIC3_SD_CTRL_Response2 0x20 | ||
| 6124 | +#define _IPAQ_ASIC3_SD_CTRL_Response3 0x24 | ||
| 6125 | +#define _IPAQ_ASIC3_SD_CTRL_Response4 0x28 | ||
| 6126 | +#define _IPAQ_ASIC3_SD_CTRL_Response5 0x2C | ||
| 6127 | +#define _IPAQ_ASIC3_SD_CTRL_Response6 0x30 | ||
| 6128 | +#define _IPAQ_ASIC3_SD_CTRL_Response7 0x34 | ||
| 6129 | +#define _IPAQ_ASIC3_SD_CTRL_CardStatus 0x38 | ||
| 6130 | +#define _IPAQ_ASIC3_SD_CTRL_BufferCtrl 0x3C | ||
| 6131 | +#define _IPAQ_ASIC3_SD_CTRL_IntMaskCard 0x40 | ||
| 6132 | +#define _IPAQ_ASIC3_SD_CTRL_IntMaskBuffer 0x44 | ||
| 6133 | +#define _IPAQ_ASIC3_SD_CTRL_CardClockCtrl 0x48 | ||
| 6134 | +#define _IPAQ_ASIC3_SD_CTRL_MemCardXferDataLen 0x4C | ||
| 6135 | +#define _IPAQ_ASIC3_SD_CTRL_MemCardOptionSetup 0x50 | ||
| 6136 | +#define _IPAQ_ASIC3_SD_CTRL_ErrorStatus0 0x58 | ||
| 6137 | +#define _IPAQ_ASIC3_SD_CTRL_ErrorStatus1 0x5C | ||
| 6138 | +#define _IPAQ_ASIC3_SD_CTRL_DataPort 0x60 | ||
| 6139 | +#define _IPAQ_ASIC3_SD_CTRL_TransactionCtrl 0x68 | ||
| 6140 | +#define _IPAQ_ASIC3_SD_CTRL_SoftwareReset 0x1C0 | ||
| 6141 | + | ||
| 6142 | +#define IPAQ_ASIC3_SD_CTRL_Cmd(_b) IPAQ_ASIC3_SD( _b, u16, Cmd ) /* */ | ||
| 6143 | +#define IPAQ_ASIC3_SD_CTRL_Arg0(_b) IPAQ_ASIC3_SD( _b, u16, Arg0 ) /* */ | ||
| 6144 | +#define IPAQ_ASIC3_SD_CTRL_Arg1(_b) IPAQ_ASIC3_SD( _b, u16, Arg1 ) /* */ | ||
| 6145 | +#define IPAQ_ASIC3_SD_CTRL_StopInternal(_b) IPAQ_ASIC3_SD( _b, u16, StopInternal ) /* */ | ||
| 6146 | +#define IPAQ_ASIC3_SD_CTRL_TransferSectorCount(_b) IPAQ_ASIC3_SD( _b, u16, TransferSectorCount ) /* */ | ||
| 6147 | +#define IPAQ_ASIC3_SD_CTRL_Response0(_b) IPAQ_ASIC3_SD( _b, u16, Response0 ) /* */ | ||
| 6148 | +#define IPAQ_ASIC3_SD_CTRL_Response1(_b) IPAQ_ASIC3_SD( _b, u16, Response1 ) /* */ | ||
| 6149 | +#define IPAQ_ASIC3_SD_CTRL_Response2(_b) IPAQ_ASIC3_SD( _b, u16, Response2 ) /* */ | ||
| 6150 | +#define IPAQ_ASIC3_SD_CTRL_Response3(_b) IPAQ_ASIC3_SD( _b, u16, Response3 ) /* */ | ||
| 6151 | +#define IPAQ_ASIC3_SD_CTRL_Response4(_b) IPAQ_ASIC3_SD( _b, u16, Response4 ) /* */ | ||
| 6152 | +#define IPAQ_ASIC3_SD_CTRL_Response5(_b) IPAQ_ASIC3_SD( _b, u16, Response5 ) /* */ | ||
| 6153 | +#define IPAQ_ASIC3_SD_CTRL_Response6(_b) IPAQ_ASIC3_SD( _b, u16, Response6 ) /* */ | ||
| 6154 | +#define IPAQ_ASIC3_SD_CTRL_Response7(_b) IPAQ_ASIC3_SD( _b, u16, Response7 ) /* */ | ||
| 6155 | +#define IPAQ_ASIC3_SD_CTRL_CardStatus(_b) IPAQ_ASIC3_SD( _b, u16, CardStatus ) /* */ | ||
| 6156 | +#define IPAQ_ASIC3_SD_CTRL_BufferCtrl(_b) IPAQ_ASIC3_SD( _b, u16, BufferCtrl ) /* and error status*/ | ||
| 6157 | +#define IPAQ_ASIC3_SD_CTRL_IntMaskCard(_b) IPAQ_ASIC3_SD( _b, u16, IntMaskCard ) /* */ | ||
| 6158 | +#define IPAQ_ASIC3_SD_CTRL_IntMaskBuffer(_b) IPAQ_ASIC3_SD( _b, u16, IntMaskBuffer ) /* */ | ||
| 6159 | +#define IPAQ_ASIC3_SD_CTRL_CardClockCtrl(_b) IPAQ_ASIC3_SD( _b, u16, CardClockCtrl ) /* */ | ||
| 6160 | +#define IPAQ_ASIC3_SD_CTRL_MemCardXferDataLen(_b) IPAQ_ASIC3_SD( _b, u16, MemCardXferDataLen ) /* */ | ||
| 6161 | +#define IPAQ_ASIC3_SD_CTRL_MemCardOptionSetup(_b) IPAQ_ASIC3_SD( _b, u16, MemCardOptionSetup ) /* */ | ||
| 6162 | +#define IPAQ_ASIC3_SD_CTRL_ErrorStatus0(_b) IPAQ_ASIC3_SD( _b, u16, ErrorStatus0 ) /* */ | ||
| 6163 | +#define IPAQ_ASIC3_SD_CTRL_ErrorStatus1(_b) IPAQ_ASIC3_SD( _b, u16, ErrorStatus1 ) /* */ | ||
| 6164 | +#define IPAQ_ASIC3_SD_CTRL_DataPort(_b) IPAQ_ASIC3_SD( _b, u16, DataPort ) /* */ | ||
| 6165 | +#define IPAQ_ASIC3_SD_CTRL_TransactionCtrl(_b) IPAQ_ASIC3_SD( _b, u16, TransactionCtrl ) /* */ | ||
| 6166 | +#define IPAQ_ASIC3_SD_CTRL_SoftwareReset(_b) IPAQ_ASIC3_SD( _b, u16, SoftwareReset ) /* */ | ||
| 6167 | + | ||
| 6168 | +#define SD_CTRL_SOFTWARE_RESET_CLEAR (1<<0) | ||
| 6169 | + | ||
| 6170 | +#define SD_CTRL_TRANSACTIONCONTROL_SET (1<<8) // 0x0100 | ||
| 6171 | + | ||
| 6172 | +#define SD_CTRL_CARDCLOCKCONTROL_FOR_SD_CARD (1<<15)// 0x8000 | ||
| 6173 | +#define SD_CTRL_CARDCLOCKCONTROL_ENABLE_CLOCK (1<<8) // 0x0100 | ||
| 6174 | +#define SD_CTRL_CARDCLOCKCONTROL_CLK_DIV_512 (1<<7) // 0x0080 | ||
| 6175 | +#define SD_CTRL_CARDCLOCKCONTROL_CLK_DIV_256 (1<<6) // 0x0040 | ||
| 6176 | +#define SD_CTRL_CARDCLOCKCONTROL_CLK_DIV_128 (1<<5) // 0x0020 | ||
| 6177 | +#define SD_CTRL_CARDCLOCKCONTROL_CLK_DIV_64 (1<<4) // 0x0010 | ||
| 6178 | +#define SD_CTRL_CARDCLOCKCONTROL_CLK_DIV_32 (1<<3) // 0x0008 | ||
| 6179 | +#define SD_CTRL_CARDCLOCKCONTROL_CLK_DIV_16 (1<<2) // 0x0004 | ||
| 6180 | +#define SD_CTRL_CARDCLOCKCONTROL_CLK_DIV_8 (1<<1) // 0x0002 | ||
| 6181 | +#define SD_CTRL_CARDCLOCKCONTROL_CLK_DIV_4 (1<<0) // 0x0001 | ||
| 6182 | +#define SD_CTRL_CARDCLOCKCONTROL_CLK_DIV_2 (0<<0) // 0x0000 | ||
| 6183 | + | ||
| 6184 | +#define MEM_CARD_OPTION_REQUIRED 0x000e | ||
| 6185 | +#define MEM_CARD_OPTION_DATA_RESPONSE_TIMEOUT(x) (((x)&0x0f)<<4) /* Four bits */ | ||
| 6186 | +#define MEM_CARD_OPTION_C2_MODULE_NOT_PRESENT (1<<14) // 0x4000 | ||
| 6187 | +#define MEM_CARD_OPTION_DATA_XFR_WIDTH_1 (1<<15) // 0x8000 | ||
| 6188 | +#define MEM_CARD_OPTION_DATA_XFR_WIDTH_4 (0<<15) //~0x8000 | ||
| 6189 | + | ||
| 6190 | +#define SD_CTRL_COMMAND_INDEX(x) ((x)&0x3f) /* 0=CMD0, 1=CMD1, ..., 63=CMD63 */ | ||
| 6191 | +#define SD_CTRL_COMMAND_TYPE_CMD (0 << 6) | ||
| 6192 | +#define SD_CTRL_COMMAND_TYPE_ACMD (1 << 6) | ||
| 6193 | +#define SD_CTRL_COMMAND_TYPE_AUTHENTICATION (2 << 6) | ||
| 6194 | +#define SD_CTRL_COMMAND_RESPONSE_TYPE_NORMAL (0 << 8) | ||
| 6195 | +#define SD_CTRL_COMMAND_RESPONSE_TYPE_EXT_R1 (4 << 8) | ||
| 6196 | +#define SD_CTRL_COMMAND_RESPONSE_TYPE_EXT_R1B (5 << 8) | ||
| 6197 | +#define SD_CTRL_COMMAND_RESPONSE_TYPE_EXT_R2 (6 << 8) | ||
| 6198 | +#define SD_CTRL_COMMAND_RESPONSE_TYPE_EXT_R3 (7 << 8) | ||
| 6199 | +#define SD_CTRL_COMMAND_DATA_PRESENT (1 << 11) | ||
| 6200 | +#define SD_CTRL_COMMAND_TRANSFER_READ (1 << 12) | ||
| 6201 | +#define SD_CTRL_COMMAND_TRANSFER_WRITE (0 << 12) | ||
| 6202 | +#define SD_CTRL_COMMAND_MULTI_BLOCK (1 << 13) | ||
| 6203 | +#define SD_CTRL_COMMAND_SECURITY_CMD (1 << 14) | ||
| 6204 | + | ||
| 6205 | +#define SD_CTRL_STOP_INTERNAL_ISSSUE_CMD12 (1 << 0) | ||
| 6206 | +#define SD_CTRL_STOP_INTERNAL_AUTO_ISSUE_CMD12 (1 << 8) | ||
| 6207 | + | ||
| 6208 | +#define SD_CTRL_CARDSTATUS_RESPONSE_END (1 << 0) | ||
| 6209 | +#define SD_CTRL_CARDSTATUS_RW_END (1 << 2) | ||
| 6210 | +#define SD_CTRL_CARDSTATUS_CARD_REMOVED_0 (1 << 3) | ||
| 6211 | +#define SD_CTRL_CARDSTATUS_CARD_INSERTED_0 (1 << 4) | ||
| 6212 | +#define SD_CTRL_CARDSTATUS_SIGNAL_STATE_PRESENT_0 (1 << 5) | ||
| 6213 | +#define SD_CTRL_CARDSTATUS_WRITE_PROTECT (1 << 7) | ||
| 6214 | +#define SD_CTRL_CARDSTATUS_CARD_REMOVED_3 (1 << 8) | ||
| 6215 | +#define SD_CTRL_CARDSTATUS_CARD_INSERTED_3 (1 << 9) | ||
| 6216 | +#define SD_CTRL_CARDSTATUS_SIGNAL_STATE_PRESENT_3 (1 << 10) | ||
| 6217 | + | ||
| 6218 | +#define SD_CTRL_BUFFERSTATUS_CMD_INDEX_ERROR (1 << 0) // 0x0001 | ||
| 6219 | +#define SD_CTRL_BUFFERSTATUS_CRC_ERROR (1 << 1) // 0x0002 | ||
| 6220 | +#define SD_CTRL_BUFFERSTATUS_STOP_BIT_END_ERROR (1 << 2) // 0x0004 | ||
| 6221 | +#define SD_CTRL_BUFFERSTATUS_DATA_TIMEOUT (1 << 3) // 0x0008 | ||
| 6222 | +#define SD_CTRL_BUFFERSTATUS_BUFFER_OVERFLOW (1 << 4) // 0x0010 | ||
| 6223 | +#define SD_CTRL_BUFFERSTATUS_BUFFER_UNDERFLOW (1 << 5) // 0x0020 | ||
| 6224 | +#define SD_CTRL_BUFFERSTATUS_CMD_TIMEOUT (1 << 6) // 0x0040 | ||
| 6225 | +#define SD_CTRL_BUFFERSTATUS_UNK7 (1 << 7) // 0x0080 | ||
| 6226 | +#define SD_CTRL_BUFFERSTATUS_BUFFER_READ_ENABLE (1 << 8) // 0x0100 | ||
| 6227 | +#define SD_CTRL_BUFFERSTATUS_BUFFER_WRITE_ENABLE (1 << 9) // 0x0200 | ||
| 6228 | +#define SD_CTRL_BUFFERSTATUS_ILLEGAL_FUNCTION (1 << 13)// 0x2000 | ||
| 6229 | +#define SD_CTRL_BUFFERSTATUS_CMD_BUSY (1 << 14)// 0x4000 | ||
| 6230 | +#define SD_CTRL_BUFFERSTATUS_ILLEGAL_ACCESS (1 << 15)// 0x8000 | ||
| 6231 | + | ||
| 6232 | +#define SD_CTRL_INTMASKCARD_RESPONSE_END (1 << 0) // 0x0001 | ||
| 6233 | +#define SD_CTRL_INTMASKCARD_RW_END (1 << 2) // 0x0004 | ||
| 6234 | +#define SD_CTRL_INTMASKCARD_CARD_REMOVED_0 (1 << 3) // 0x0008 | ||
| 6235 | +#define SD_CTRL_INTMASKCARD_CARD_INSERTED_0 (1 << 4) // 0x0010 | ||
| 6236 | +#define SD_CTRL_INTMASKCARD_SIGNAL_STATE_PRESENT_0 (1 << 5) // 0x0020 | ||
| 6237 | +#define SD_CTRL_INTMASKCARD_UNK6 (1 << 6) // 0x0040 | ||
| 6238 | +#define SD_CTRL_INTMASKCARD_WRITE_PROTECT (1 << 7) // 0x0080 | ||
| 6239 | +#define SD_CTRL_INTMASKCARD_CARD_REMOVED_3 (1 << 8) // 0x0100 | ||
| 6240 | +#define SD_CTRL_INTMASKCARD_CARD_INSERTED_3 (1 << 9) // 0x0200 | ||
| 6241 | +#define SD_CTRL_INTMASKCARD_SIGNAL_STATE_PRESENT_3 (1 << 10)// 0x0400 | ||
| 6242 | + | ||
| 6243 | +#define SD_CTRL_INTMASKBUFFER_CMD_INDEX_ERROR (1 << 0) // 0x0001 | ||
| 6244 | +#define SD_CTRL_INTMASKBUFFER_CRC_ERROR (1 << 1) // 0x0002 | ||
| 6245 | +#define SD_CTRL_INTMASKBUFFER_STOP_BIT_END_ERROR (1 << 2) // 0x0004 | ||
| 6246 | +#define SD_CTRL_INTMASKBUFFER_DATA_TIMEOUT (1 << 3) // 0x0008 | ||
| 6247 | +#define SD_CTRL_INTMASKBUFFER_BUFFER_OVERFLOW (1 << 4) // 0x0010 | ||
| 6248 | +#define SD_CTRL_INTMASKBUFFER_BUFFER_UNDERFLOW (1 << 5) // 0x0020 | ||
| 6249 | +#define SD_CTRL_INTMASKBUFFER_CMD_TIMEOUT (1 << 6) // 0x0040 | ||
| 6250 | +#define SD_CTRL_INTMASKBUFFER_UNK7 (1 << 7) // 0x0080 | ||
| 6251 | +#define SD_CTRL_INTMASKBUFFER_BUFFER_READ_ENABLE (1 << 8) // 0x0100 | ||
| 6252 | +#define SD_CTRL_INTMASKBUFFER_BUFFER_WRITE_ENABLE (1 << 9) // 0x0200 | ||
| 6253 | +#define SD_CTRL_INTMASKBUFFER_ILLEGAL_FUNCTION (1 << 13)// 0x2000 | ||
| 6254 | +#define SD_CTRL_INTMASKBUFFER_CMD_BUSY (1 << 14)// 0x4000 | ||
| 6255 | +#define SD_CTRL_INTMASKBUFFER_ILLEGAL_ACCESS (1 << 15)// 0x8000 | ||
| 6256 | + | ||
| 6257 | +#define SD_CTRL_DETAIL0_RESPONSE_CMD_ERROR (1 << 0) // 0x0001 | ||
| 6258 | +#define SD_CTRL_DETAIL0_END_BIT_ERROR_FOR_RESPONSE_NON_CMD12 (1 << 2) // 0x0004 | ||
| 6259 | +#define SD_CTRL_DETAIL0_END_BIT_ERROR_FOR_RESPONSE_CMD12 (1 << 3) // 0x0008 | ||
| 6260 | +#define SD_CTRL_DETAIL0_END_BIT_ERROR_FOR_READ_DATA (1 << 4) // 0x0010 | ||
| 6261 | +#define SD_CTRL_DETAIL0_END_BIT_ERROR_FOR_WRITE_CRC_STATUS (1 << 5) // 0x0020 | ||
| 6262 | +#define SD_CTRL_DETAIL0_CRC_ERROR_FOR_RESPONSE_NON_CMD12 (1 << 8) // 0x0100 | ||
| 6263 | +#define SD_CTRL_DETAIL0_CRC_ERROR_FOR_RESPONSE_CMD12 (1 << 9) // 0x0200 | ||
| 6264 | +#define SD_CTRL_DETAIL0_CRC_ERROR_FOR_READ_DATA (1 << 10)// 0x0400 | ||
| 6265 | +#define SD_CTRL_DETAIL0_CRC_ERROR_FOR_WRITE_CMD (1 << 11)// 0x0800 | ||
| 6266 | + | ||
| 6267 | +#define SD_CTRL_DETAIL1_NO_CMD_RESPONSE (1 << 0) // 0x0001 | ||
| 6268 | +#define SD_CTRL_DETAIL1_TIMEOUT_READ_DATA (1 << 4) // 0x0010 | ||
| 6269 | +#define SD_CTRL_DETAIL1_TIMEOUT_CRS_STATUS (1 << 5) // 0x0020 | ||
| 6270 | +#define SD_CTRL_DETAIL1_TIMEOUT_CRC_BUSY (1 << 6) // 0x0040 | ||
| 6271 | + | ||
| 6272 | +#define _IPAQ_ASIC3_SDIO_CTRL_Base 0x1200 | ||
| 6273 | + | ||
| 6274 | +#define IPAQ_ASIC3_SDIO(_b, s,x) \ | ||
| 6275 | + (*((volatile s *) ((_b) + _IPAQ_ASIC3_SDIO_CTRL_Base + (_IPAQ_ASIC3_SDIO_CTRL_ ## x)))) | ||
| 6276 | + | ||
| 6277 | +#define _IPAQ_ASIC3_SDIO_CTRL_Cmd 0x00 | ||
| 6278 | +#define _IPAQ_ASIC3_SDIO_CTRL_CardPortSel 0x04 | ||
| 6279 | +#define _IPAQ_ASIC3_SDIO_CTRL_Arg0 0x08 | ||
| 6280 | +#define _IPAQ_ASIC3_SDIO_CTRL_Arg1 0x0C | ||
| 6281 | +#define _IPAQ_ASIC3_SDIO_CTRL_TransferBlockCount 0x14 | ||
| 6282 | +#define _IPAQ_ASIC3_SDIO_CTRL_Response0 0x18 | ||
| 6283 | +#define _IPAQ_ASIC3_SDIO_CTRL_Response1 0x1C | ||
| 6284 | +#define _IPAQ_ASIC3_SDIO_CTRL_Response2 0x20 | ||
| 6285 | +#define _IPAQ_ASIC3_SDIO_CTRL_Response3 0x24 | ||
| 6286 | +#define _IPAQ_ASIC3_SDIO_CTRL_Response4 0x28 | ||
| 6287 | +#define _IPAQ_ASIC3_SDIO_CTRL_Response5 0x2C | ||
| 6288 | +#define _IPAQ_ASIC3_SDIO_CTRL_Response6 0x30 | ||
| 6289 | +#define _IPAQ_ASIC3_SDIO_CTRL_Response7 0x34 | ||
| 6290 | +#define _IPAQ_ASIC3_SDIO_CTRL_CardStatus 0x38 | ||
| 6291 | +#define _IPAQ_ASIC3_SDIO_CTRL_BufferCtrl 0x3C | ||
| 6292 | +#define _IPAQ_ASIC3_SDIO_CTRL_IntMaskCard 0x40 | ||
| 6293 | +#define _IPAQ_ASIC3_SDIO_CTRL_IntMaskBuffer 0x44 | ||
| 6294 | +#define _IPAQ_ASIC3_SDIO_CTRL_CardXferDataLen 0x4C | ||
| 6295 | +#define _IPAQ_ASIC3_SDIO_CTRL_CardOptionSetup 0x50 | ||
| 6296 | +#define _IPAQ_ASIC3_SDIO_CTRL_ErrorStatus0 0x54 | ||
| 6297 | +#define _IPAQ_ASIC3_SDIO_CTRL_ErrorStatus1 0x58 | ||
| 6298 | +#define _IPAQ_ASIC3_SDIO_CTRL_DataPort 0x60 | ||
| 6299 | +#define _IPAQ_ASIC3_SDIO_CTRL_TransactionCtrl 0x68 | ||
| 6300 | +#define _IPAQ_ASIC3_SDIO_CTRL_CardIntCtrl 0x6C | ||
| 6301 | +#define _IPAQ_ASIC3_SDIO_CTRL_ClocknWaitCtrl 0x70 | ||
| 6302 | +#define _IPAQ_ASIC3_SDIO_CTRL_HostInformation 0x74 | ||
| 6303 | +#define _IPAQ_ASIC3_SDIO_CTRL_ErrorCtrl 0x78 | ||
| 6304 | +#define _IPAQ_ASIC3_SDIO_CTRL_LEDCtrl 0x7C | ||
| 6305 | +#define _IPAQ_ASIC3_SDIO_CTRL_SoftwareReset 0x1C0 | ||
| 6306 | + | ||
| 6307 | +#define IPAQ_ASIC3_SDIO_CTRL_Cmd(_b) IPAQ_ASIC3_SDIO( _b, u16, Cmd ) /* */ | ||
| 6308 | +#define IPAQ_ASIC3_SDIO_CTRL_CardPortSel(_b) IPAQ_ASIC3_SDIO( _b, u16, CardPortSel ) /* */ | ||
| 6309 | +#define IPAQ_ASIC3_SDIO_CTRL_Arg0(_b) IPAQ_ASIC3_SDIO( _b, u16, Arg0 ) /* */ | ||
| 6310 | +#define IPAQ_ASIC3_SDIO_CTRL_Arg1(_b) IPAQ_ASIC3_SDIO( _b, u16, Arg1 ) /* */ | ||
| 6311 | +#define IPAQ_ASIC3_SDIO_CTRL_TransferBlockCount(_b) IPAQ_ASIC3_SDIO( _b, u16, TransferBlockCount ) /* */ | ||
| 6312 | +#define IPAQ_ASIC3_SDIO_CTRL_Response0(_b) IPAQ_ASIC3_SDIO( _b, u16, Response0 ) /* */ | ||
| 6313 | +#define IPAQ_ASIC3_SDIO_CTRL_Response1(_b) IPAQ_ASIC3_SDIO( _b, u16, Response1 ) /* */ | ||
| 6314 | +#define IPAQ_ASIC3_SDIO_CTRL_Response2(_b) IPAQ_ASIC3_SDIO( _b, u16, Response2 ) /* */ | ||
| 6315 | +#define IPAQ_ASIC3_SDIO_CTRL_Response3(_b) IPAQ_ASIC3_SDIO( _b, u16, Response3 ) /* */ | ||
| 6316 | +#define IPAQ_ASIC3_SDIO_CTRL_Response4(_b) IPAQ_ASIC3_SDIO( _b, u16, Response4 ) /* */ | ||
| 6317 | +#define IPAQ_ASIC3_SDIO_CTRL_Response5(_b) IPAQ_ASIC3_SDIO( _b, u16, Response5 ) /* */ | ||
| 6318 | +#define IPAQ_ASIC3_SDIO_CTRL_Response6(_b) IPAQ_ASIC3_SDIO( _b, u16, Response6 ) /* */ | ||
| 6319 | +#define IPAQ_ASIC3_SDIO_CTRL_Response7(_b) IPAQ_ASIC3_SDIO( _b, u16, Response7 ) /* */ | ||
| 6320 | +#define IPAQ_ASIC3_SDIO_CTRL_CardStatus(_b) IPAQ_ASIC3_SDIO( _b, u16, CardStatus ) /* */ | ||
| 6321 | +#define IPAQ_ASIC3_SDIO_CTRL_BufferCtrl(_b) IPAQ_ASIC3_SDIO( _b, u16, BufferCtrl ) /* and error status*/ | ||
| 6322 | +#define IPAQ_ASIC3_SDIO_CTRL_IntMaskCard(_b) IPAQ_ASIC3_SDIO( _b, u16, IntMaskCard ) /* */ | ||
| 6323 | +#define IPAQ_ASIC3_SDIO_CTRL_IntMaskBuffer(_b) IPAQ_ASIC3_SDIO( _b, u16, IntMaskBuffer ) /* */ | ||
| 6324 | +#define IPAQ_ASIC3_SDIO_CTRL_CardXferDataLen(_b) IPAQ_ASIC3_SDIO( _b, u16, CardXferDataLen ) /* */ | ||
| 6325 | +#define IPAQ_ASIC3_SDIO_CTRL_CardOptionSetup(_b) IPAQ_ASIC3_SDIO( _b, u16, CardOptionSetup ) /* */ | ||
| 6326 | +#define IPAQ_ASIC3_SDIO_CTRL_ErrorStatus0(_b) IPAQ_ASIC3_SDIO( _b, u16, ErrorStatus0 ) /* */ | ||
| 6327 | +#define IPAQ_ASIC3_SDIO_CTRL_ErrorStatus1(_b) IPAQ_ASIC3_SDIO( _b, u16, ErrorStatus1 ) /* */ | ||
| 6328 | +#define IPAQ_ASIC3_SDIO_CTRL_DataPort(_b) IPAQ_ASIC3_SDIO( _b, u16, DataPort ) /* */ | ||
| 6329 | +#define IPAQ_ASIC3_SDIO_CTRL_TransactionCtrl(_b) IPAQ_ASIC3_SDIO( _b, u16, TransactionCtrl ) /* */ | ||
| 6330 | +#define IPAQ_ASIC3_SDIO_CTRL_CardIntCtrl(_b) IPAQ_ASIC3_SDIO( _b, u16, CardIntCtrl ) /* */ | ||
| 6331 | +#define IPAQ_ASIC3_SDIO_CTRL_ClocknWaitCtrl(_b) IPAQ_ASIC3_SDIO( _b, u16, ClocknWaitCtrl ) /* */ | ||
| 6332 | +#define IPAQ_ASIC3_SDIO_CTRL_HostInformation(_b) IPAQ_ASIC3_SDIO( _b, u16, HostInformation ) /* */ | ||
| 6333 | +#define IPAQ_ASIC3_SDIO_CTRL_ErrorCtrl(_b) IPAQ_ASIC3_SDIO( _b, u16, ErrorCtrl ) /* */ | ||
| 6334 | +#define IPAQ_ASIC3_SDIO_CTRL_LEDCtrl(_b) IPAQ_ASIC3_SDIO( _b, u16, LEDCtrl ) /* */ | ||
| 6335 | +#define IPAQ_ASIC3_SDIO_CTRL_SoftwareReset(_b) IPAQ_ASIC3_SDIO( _b, u16, SoftwareReset ) /* */ | ||
| 6336 | + | ||
| 6337 | +#define IPAQ_ASIC3_MAP_SIZE 0x2000 | ||
| 6338 | + | ||
| 6339 | +#endif | ||
| 6340 | Index: linux-2.6.26-rc4/include/linux/gpiodev.h | ||
| 6341 | =================================================================== | ||
| 6342 | --- /dev/null 1970-01-01 00:00:00.000000000 +0000 | ||
| 6343 | +++ linux-2.6.26-rc4/include/linux/gpiodev.h 2008-06-01 18:49:45.000000000 +0100 | ||
| 6344 | @@ -0,0 +1,44 @@ | ||
| 6345 | +#ifndef __GPIODEV_H | ||
| 6346 | +#define __GPIODEV_H | ||
| 6347 | + | ||
| 6348 | +#include <linux/device.h> | ||
| 6349 | +#include <linux/platform_device.h> | ||
| 6350 | +#include <asm/gpio.h> | ||
| 6351 | + | ||
| 6352 | +/* Interface */ | ||
| 6353 | + | ||
| 6354 | +/* This structure must be first member of device platform_data structure | ||
| 6355 | + of a device which provides gpiodev interface. All method pointers | ||
| 6356 | + must be non-NULL, so stubs must be used for non-implemented ones. */ | ||
| 6357 | +struct gpiodev_ops { | ||
| 6358 | + int (*get)(struct device *this, unsigned gpio_no); | ||
| 6359 | + void (*set)(struct device *this, unsigned gpio_no, int val); | ||
| 6360 | + int (*to_irq)(struct device *this, unsigned gpio_no); | ||
| 6361 | +}; | ||
| 6362 | + | ||
| 6363 | +/* Generalized GPIO structure */ | ||
| 6364 | + | ||
| 6365 | +struct gpio { | ||
| 6366 | + struct device *gpio_dev; | ||
| 6367 | + unsigned gpio_no; | ||
| 6368 | +}; | ||
| 6369 | + | ||
| 6370 | +/* API functions */ | ||
| 6371 | + | ||
| 6372 | +static inline int gpiodev_get_value(struct gpio *gpio) | ||
| 6373 | +{ | ||
| 6374 | + struct gpiodev_ops *ops = gpio->gpio_dev->platform_data; | ||
| 6375 | + return ops->get(gpio->gpio_dev, gpio->gpio_no); | ||
| 6376 | +} | ||
| 6377 | +static inline void gpiodev_set_value(struct gpio *gpio, int val) | ||
| 6378 | +{ | ||
| 6379 | + struct gpiodev_ops *ops = gpio->gpio_dev->platform_data; | ||
| 6380 | + ops->set(gpio->gpio_dev, gpio->gpio_no, val); | ||
| 6381 | +} | ||
| 6382 | +static inline int gpiodev_to_irq(struct gpio *gpio) | ||
| 6383 | +{ | ||
| 6384 | + struct gpiodev_ops *ops = gpio->gpio_dev->platform_data; | ||
| 6385 | + return ops->to_irq(gpio->gpio_dev, gpio->gpio_no); | ||
| 6386 | +} | ||
| 6387 | + | ||
| 6388 | +#endif /* __GPIODEV_H */ | ||
| 6389 | Index: linux-2.6.26-rc4/include/linux/input_pda.h | ||
| 6390 | =================================================================== | ||
| 6391 | --- /dev/null 1970-01-01 00:00:00.000000000 +0000 | ||
| 6392 | +++ linux-2.6.26-rc4/include/linux/input_pda.h 2008-06-01 18:49:45.000000000 +0100 | ||
| 6393 | @@ -0,0 +1,47 @@ | ||
| 6394 | +#ifndef _INPUT_PDA_H | ||
| 6395 | +#define _INPUT_PDA_H | ||
| 6396 | + | ||
| 6397 | +/* | ||
| 6398 | + * This is temporary virtual button key codes map | ||
| 6399 | + * for keyboardless handheld computers. | ||
| 6400 | + * Its purpose is to provide map common to all devices | ||
| 6401 | + * and known to work with current software and its bugs | ||
| 6402 | + * and misfeatures. Once issues with the software are | ||
| 6403 | + * solved, codes from input.h will be used directly | ||
| 6404 | + * (missing key definitions will be added). | ||
| 6405 | + */ | ||
| 6406 | + | ||
| 6407 | +/* Some directly usable keycodes: | ||
| 6408 | +KEY_POWER - Power/suspend button | ||
| 6409 | +KEY_ENTER - Enter/Action/Central button on joypad | ||
| 6410 | +KEY_UP | ||
| 6411 | +KEY_DOWN | ||
| 6412 | +KEY_LEFT | ||
| 6413 | +KEY_RIGHT | ||
| 6414 | +*/ | ||
| 6415 | + | ||
| 6416 | +/* XXX Instead of using any values in include/linux/input.h, we have to use | ||
| 6417 | + use values < 128 due to some munging that kdrive does to get keystrokes. | ||
| 6418 | + When kdrive gets its key events from evdev instead of the console, | ||
| 6419 | + we should be able to switch to using input.h values and get rid of | ||
| 6420 | + xmodmap. */ | ||
| 6421 | + | ||
| 6422 | +#define _KEY_APP1 KEY_F9 // xmodmap sees 67 + 8 = 75 | ||
| 6423 | +#define _KEY_APP2 KEY_F10 // xmodmap 76 | ||
| 6424 | +#define _KEY_APP3 KEY_F11 // xmodmap 95 | ||
| 6425 | +#define _KEY_APP4 KEY_F12 // xmodmap 96 | ||
| 6426 | + | ||
| 6427 | +#define _KEY_RECORD KEY_RO | ||
| 6428 | + | ||
| 6429 | +/* It is highly recommended to use exactly 4 codes above for | ||
| 6430 | + 4 buttons the device has. This will ensure that console and | ||
| 6431 | + framebuffer applications (e.g. games) will work ok on all | ||
| 6432 | + devices. If you'd like more distinguishable names, following | ||
| 6433 | + convenience defines are provided, suiting many devices. */ | ||
| 6434 | + | ||
| 6435 | +#define _KEY_CALENDAR _KEY_APP1 | ||
| 6436 | +#define _KEY_CONTACTS _KEY_APP2 | ||
| 6437 | +#define _KEY_MAIL _KEY_APP3 | ||
| 6438 | +#define _KEY_HOMEPAGE _KEY_APP4 | ||
| 6439 | + | ||
| 6440 | +#endif | ||
| 6441 | Index: linux-2.6.26-rc4/include/linux/soc/asic3_base.h | ||
| 6442 | =================================================================== | ||
| 6443 | --- /dev/null 1970-01-01 00:00:00.000000000 +0000 | ||
| 6444 | +++ linux-2.6.26-rc4/include/linux/soc/asic3_base.h 2008-06-01 18:49:45.000000000 +0100 | ||
| 6445 | @@ -0,0 +1,104 @@ | ||
| 6446 | +#include <asm/types.h> | ||
| 6447 | +#include <linux/gpiodev.h> | ||
| 6448 | + | ||
| 6449 | +/* Private API - for ASIC3 devices internal use only */ | ||
| 6450 | +#define HDR_IPAQ_ASIC3_ACTION(ACTION,action,fn,FN) \ | ||
| 6451 | +u32 asic3_get_gpio_ ## action ## _ ## fn (struct device *dev); \ | ||
| 6452 | +void asic3_set_gpio_ ## action ## _ ## fn (struct device *dev, u32 bits, u32 val); | ||
| 6453 | + | ||
| 6454 | +#define HDR_IPAQ_ASIC3_FN(fn,FN) \ | ||
| 6455 | + HDR_IPAQ_ASIC3_ACTION ( MASK,mask,fn,FN) \ | ||
| 6456 | + HDR_IPAQ_ASIC3_ACTION ( DIR, dir, fn, FN) \ | ||
| 6457 | + HDR_IPAQ_ASIC3_ACTION ( OUT, out, fn, FN) \ | ||
| 6458 | + HDR_IPAQ_ASIC3_ACTION ( LEVELTRI, trigtype, fn, FN) \ | ||
| 6459 | + HDR_IPAQ_ASIC3_ACTION ( RISING, rising, fn, FN) \ | ||
| 6460 | + HDR_IPAQ_ASIC3_ACTION ( LEVEL, triglevel, fn, FN) \ | ||
| 6461 | + HDR_IPAQ_ASIC3_ACTION ( SLEEP_MASK, sleepmask, fn, FN) \ | ||
| 6462 | + HDR_IPAQ_ASIC3_ACTION ( SLEEP_OUT, sleepout, fn, FN) \ | ||
| 6463 | + HDR_IPAQ_ASIC3_ACTION ( BATT_FAULT_OUT, battfaultout, fn, FN) \ | ||
| 6464 | + HDR_IPAQ_ASIC3_ACTION ( INT_STATUS, intstatus, fn, FN) \ | ||
| 6465 | + HDR_IPAQ_ASIC3_ACTION ( ALT_FUNCTION, alt_fn, fn, FN) \ | ||
| 6466 | + HDR_IPAQ_ASIC3_ACTION ( SLEEP_CONF, sleepconf, fn, FN) \ | ||
| 6467 | + HDR_IPAQ_ASIC3_ACTION ( STATUS, status, fn, FN) | ||
| 6468 | + | ||
| 6469 | +/* Public API */ | ||
| 6470 | + | ||
| 6471 | +#define ASIC3_GPIOA_IRQ_BASE 0 | ||
| 6472 | +#define ASIC3_GPIOB_IRQ_BASE 16 | ||
| 6473 | +#define ASIC3_GPIOC_IRQ_BASE 32 | ||
| 6474 | +#define ASIC3_GPIOD_IRQ_BASE 48 | ||
| 6475 | +#define ASIC3_LED0_IRQ 64 | ||
| 6476 | +#define ASIC3_LED1_IRQ 65 | ||
| 6477 | +#define ASIC3_LED2_IRQ 66 | ||
| 6478 | +#define ASIC3_SPI_IRQ 67 | ||
| 6479 | +#define ASIC3_SMBUS_IRQ 68 | ||
| 6480 | +#define ASIC3_OWM_IRQ 69 | ||
| 6481 | + | ||
| 6482 | +#define ASIC3_NR_GPIO_IRQS 64 /* 16 bits each GPIO A...D banks */ | ||
| 6483 | +#define ASIC3_NR_IRQS (ASIC3_OWM_IRQ + 1) | ||
| 6484 | + | ||
| 6485 | +extern int asic3_irq_base(struct device *dev); | ||
| 6486 | + | ||
| 6487 | +extern void asic3_write_register(struct device *dev, unsigned int reg, | ||
| 6488 | + u32 value); | ||
| 6489 | +extern u32 asic3_read_register(struct device *dev, unsigned int reg); | ||
| 6490 | + | ||
| 6491 | +/* old clock api */ | ||
| 6492 | +extern void asic3_set_clock_sel(struct device *dev, u32 bits, u32 val); | ||
| 6493 | +extern u32 asic3_get_clock_cdex(struct device *dev); | ||
| 6494 | +extern void asic3_set_clock_cdex(struct device *dev, u32 bits, u32 val); | ||
| 6495 | + | ||
| 6496 | +extern void asic3_set_extcf_select(struct device *dev, u32 bits, u32 val); | ||
| 6497 | +extern void asic3_set_extcf_reset(struct device *dev, u32 bits, u32 val); | ||
| 6498 | +extern void asic3_set_sdhwctrl(struct device *dev, u32 bits, u32 val); | ||
| 6499 | + | ||
| 6500 | +extern void asic3_set_led(struct device *dev, int led_num, int duty_time, | ||
| 6501 | + int cycle_time, int timebase); | ||
| 6502 | + | ||
| 6503 | +extern int asic3_register_mmc(struct device *dev); | ||
| 6504 | +extern int asic3_unregister_mmc(struct device *dev); | ||
| 6505 | + | ||
| 6506 | +/* Accessors for GPIO banks */ | ||
| 6507 | +HDR_IPAQ_ASIC3_FN(a, A) | ||
| 6508 | +HDR_IPAQ_ASIC3_FN(b, B) | ||
| 6509 | +HDR_IPAQ_ASIC3_FN(c, C) | ||
| 6510 | +HDR_IPAQ_ASIC3_FN(d, D) | ||
| 6511 | + | ||
| 6512 | +#define _IPAQ_ASIC3_GPIO_BANK_A 0 | ||
| 6513 | +#define _IPAQ_ASIC3_GPIO_BANK_B 1 | ||
| 6514 | +#define _IPAQ_ASIC3_GPIO_BANK_C 2 | ||
| 6515 | +#define _IPAQ_ASIC3_GPIO_BANK_D 3 | ||
| 6516 | + | ||
| 6517 | +#define ASIC3_GPIO_bit(gpio) (1 << (gpio & 0xf)) | ||
| 6518 | + | ||
| 6519 | +extern int asic3_get_gpio_bit(struct device *dev, int gpio); | ||
| 6520 | +extern void asic3_set_gpio_bit(struct device *dev, int gpio, int val); | ||
| 6521 | +extern int asic3_gpio_get_value(struct device *dev, unsigned gpio); | ||
| 6522 | +extern void asic3_gpio_set_value(struct device *dev, unsigned gpio, int val); | ||
| 6523 | + | ||
| 6524 | + | ||
| 6525 | +struct tmio_mmc_hwconfig; | ||
| 6526 | + | ||
| 6527 | +struct asic3_platform_data | ||
| 6528 | +{ | ||
| 6529 | + // Must be first member | ||
| 6530 | + struct gpiodev_ops gpiodev_ops; | ||
| 6531 | + | ||
| 6532 | + struct { | ||
| 6533 | + u32 dir; | ||
| 6534 | + u32 init; | ||
| 6535 | + u32 sleep_mask; | ||
| 6536 | + u32 sleep_out; | ||
| 6537 | + u32 batt_fault_out; | ||
| 6538 | + u32 sleep_conf; | ||
| 6539 | + u32 alt_function; | ||
| 6540 | + } gpio_a, gpio_b, gpio_c, gpio_d; | ||
| 6541 | + | ||
| 6542 | + int irq_base; | ||
| 6543 | + unsigned int bus_shift; | ||
| 6544 | + | ||
| 6545 | + struct platform_device **child_platform_devs; | ||
| 6546 | + int num_child_platform_devs; | ||
| 6547 | + | ||
| 6548 | + struct tmio_mmc_hwconfig *tmio_mmc_hwconfig; | ||
| 6549 | +}; | ||
| 6550 | Index: linux-2.6.26-rc4/include/linux/soc/tmio_mmc.h | ||
| 6551 | =================================================================== | ||
| 6552 | --- /dev/null 1970-01-01 00:00:00.000000000 +0000 | ||
| 6553 | +++ linux-2.6.26-rc4/include/linux/soc/tmio_mmc.h 2008-06-01 18:49:45.000000000 +0100 | ||
| 6554 | @@ -0,0 +1,17 @@ | ||
| 6555 | +#include <linux/platform_device.h> | ||
| 6556 | + | ||
| 6557 | +#define MMC_CLOCK_DISABLED 0 | ||
| 6558 | +#define MMC_CLOCK_ENABLED 1 | ||
| 6559 | + | ||
| 6560 | +#define TMIO_WP_ALWAYS_RW ((void*)-1) | ||
| 6561 | + | ||
| 6562 | +struct tmio_mmc_hwconfig { | ||
| 6563 | + void (*hwinit)(struct platform_device *sdev); | ||
| 6564 | + void (*set_mmc_clock)(struct platform_device *sdev, int state); | ||
| 6565 | + | ||
| 6566 | + /* NULL - use ASIC3 signal, | ||
| 6567 | + TMIO_WP_ALWAYS_RW - assume always R/W (e.g. miniSD) | ||
| 6568 | + otherwise - machine-specific handler */ | ||
| 6569 | + int (*mmc_get_ro)(struct platform_device *pdev); | ||
| 6570 | + short address_shift; | ||
| 6571 | +}; | ||
| 6572 | Index: linux-2.6.26-rc4/include/asm-arm/arch-pxa/pxa-regs.h | ||
| 6573 | =================================================================== | ||
| 6574 | --- linux-2.6.26-rc4.orig/include/asm-arm/arch-pxa/pxa-regs.h 2008-05-26 19:08:11.000000000 +0100 | ||
| 6575 | +++ linux-2.6.26-rc4/include/asm-arm/arch-pxa/pxa-regs.h 2008-06-01 18:49:45.000000000 +0100 | ||
| 6576 | @@ -1117,6 +1117,8 @@ | ||
| 6577 | #define PWM_PWDUTY1 __REG(0x40C00004) /* PWM 1 Duty Cycle Register */ | ||
| 6578 | #define PWM_PERVAL1 __REG(0x40C00008) /* PWM 1 Period Control Register */ | ||
| 6579 | |||
| 6580 | +#define LCCR4_13M_PCD_EN (1<<25) /* 13M PCD enable */ | ||
| 6581 | +#define LCCR4_PCDDIV (1<<31) /* PCD selection */ | ||
| 6582 | |||
| 6583 | /* | ||
| 6584 | * Interrupt Controller | ||
| 6585 | Index: linux-2.6.26-rc4/drivers/mmc/host/Kconfig | ||
| 6586 | =================================================================== | ||
| 6587 | --- linux-2.6.26-rc4.orig/drivers/mmc/host/Kconfig 2008-05-26 19:08:11.000000000 +0100 | ||
| 6588 | +++ linux-2.6.26-rc4/drivers/mmc/host/Kconfig 2008-06-01 18:49:45.000000000 +0100 | ||
| 6589 | @@ -130,3 +130,9 @@ | ||
| 6590 | |||
| 6591 | If unsure, or if your system has no SPI master driver, say N. | ||
| 6592 | |||
| 6593 | +config MMC_ASIC3 | ||
| 6594 | + tristate "HTC ASIC3 SD/MMC support" | ||
| 6595 | + depends on MMC && HTC_ASIC3 | ||
| 6596 | + help | ||
| 6597 | + This provides support for the ASIC3 SD/MMC controller, used | ||
| 6598 | + in the iPAQ hx4700 and others. | ||
| 6599 | Index: linux-2.6.26-rc4/drivers/mmc/host/Makefile | ||
| 6600 | =================================================================== | ||
| 6601 | --- linux-2.6.26-rc4.orig/drivers/mmc/host/Makefile 2008-05-26 19:08:11.000000000 +0100 | ||
| 6602 | +++ linux-2.6.26-rc4/drivers/mmc/host/Makefile 2008-06-01 18:49:45.000000000 +0100 | ||
| 6603 | @@ -13,6 +13,7 @@ | ||
| 6604 | obj-$(CONFIG_MMC_RICOH_MMC) += ricoh_mmc.o | ||
| 6605 | obj-$(CONFIG_MMC_WBSD) += wbsd.o | ||
| 6606 | obj-$(CONFIG_MMC_AU1X) += au1xmmc.o | ||
| 6607 | +obj-$(CONFIG_MMC_ASIC3) += asic3_mmc.o | ||
| 6608 | obj-$(CONFIG_MMC_OMAP) += omap.o | ||
| 6609 | obj-$(CONFIG_MMC_AT91) += at91_mci.o | ||
| 6610 | obj-$(CONFIG_MMC_TIFM_SD) += tifm_sd.o | ||
| 6611 | Index: linux-2.6.26-rc4/drivers/mmc/host/asic3_mmc.c | ||
| 6612 | =================================================================== | ||
| 6613 | --- /dev/null 1970-01-01 00:00:00.000000000 +0000 | ||
| 6614 | +++ linux-2.6.26-rc4/drivers/mmc/host/asic3_mmc.c 2008-06-01 18:49:45.000000000 +0100 | ||
| 6615 | @@ -0,0 +1,900 @@ | ||
| 6616 | +/* Note that this driver can likely be merged into the tmio driver, so | ||
| 6617 | + * consider this code temporary. It works, though. | ||
| 6618 | + */ | ||
| 6619 | +/* | ||
| 6620 | + * linux/drivers/mmc/asic3_mmc.c | ||
| 6621 | + * | ||
| 6622 | + * Copyright (c) 2005 SDG Systems, LLC | ||
| 6623 | + * | ||
| 6624 | + * based on tmio_mmc.c | ||
| 6625 | + * Copyright (C) 2004 Ian Molton | ||
| 6626 | + * | ||
| 6627 | + * Refactored to support all ASIC3 devices, 2006 Paul Sokolovsky | ||
| 6628 | + * | ||
| 6629 | + * This program is free software; you can redistribute it and/or modify | ||
| 6630 | + * it under the terms of the GNU General Public License version 2 as | ||
| 6631 | + * published by the Free Software Foundation. | ||
| 6632 | + * | ||
| 6633 | + * Driver for the SD / SDIO cell found in: | ||
| 6634 | + * | ||
| 6635 | + * TC6393XB | ||
| 6636 | + * | ||
| 6637 | + * This driver draws mainly on scattered spec sheets, Reverse engineering | ||
| 6638 | + * of the toshiba e800 SD driver and some parts of the 2.4 ASIC3 driver (4 bit | ||
| 6639 | + * support). | ||
| 6640 | + * | ||
| 6641 | + * Supports MMC 1 bit transfers and SD 1 and 4 bit modes. | ||
| 6642 | + * | ||
| 6643 | + * TODO: | ||
| 6644 | + * Eliminate FIXMEs | ||
| 6645 | + * SDIO support | ||
| 6646 | + * Power management | ||
| 6647 | + * Handle MMC errors (at all) | ||
| 6648 | + * | ||
| 6649 | + */ | ||
| 6650 | +#include <linux/module.h> | ||
| 6651 | +#include <linux/moduleparam.h> | ||
| 6652 | +#include <linux/init.h> | ||
| 6653 | +#include <linux/ioport.h> | ||
| 6654 | +#include <linux/platform_device.h> | ||
| 6655 | +#include <linux/interrupt.h> | ||
| 6656 | +#include <linux/blkdev.h> | ||
| 6657 | +#include <linux/delay.h> | ||
| 6658 | +#include <linux/err.h> | ||
| 6659 | +#include <linux/mmc/mmc.h> | ||
| 6660 | +#include <linux/mmc/host.h> | ||
| 6661 | +#include <linux/mmc/card.h> | ||
| 6662 | +//#include <linux/mmc/protocol.h> | ||
| 6663 | +#include <linux/mmc/sd.h> | ||
| 6664 | +#include <linux/scatterlist.h> | ||
| 6665 | +//#include <linux/soc-old.h> | ||
| 6666 | +#include <linux/soc/asic3_base.h> | ||
| 6667 | +#include <linux/soc/tmio_mmc.h> | ||
| 6668 | + | ||
| 6669 | +#include <asm/io.h> | ||
| 6670 | +#include <asm/irq.h> | ||
| 6671 | +#include <asm/mach/irq.h> | ||
| 6672 | +#include <linux/clk.h> | ||
| 6673 | +#include <asm/mach-types.h> | ||
| 6674 | + | ||
| 6675 | +#include <asm/hardware/ipaq-asic3.h> | ||
| 6676 | +#include "asic3_mmc.h" | ||
| 6677 | + | ||
| 6678 | +struct asic3_mmc_host { | ||
| 6679 | + void *ctl_base; | ||
| 6680 | + struct device *asic3_dev; /* asic3 device */ | ||
| 6681 | + struct tmio_mmc_hwconfig *hwconfig; /* HW config data/handlers, guaranteed != NULL */ | ||
| 6682 | + unsigned long bus_shift; | ||
| 6683 | + struct mmc_command *cmd; | ||
| 6684 | + struct mmc_request *mrq; | ||
| 6685 | + struct mmc_data *data; | ||
| 6686 | + struct mmc_host *mmc; | ||
| 6687 | + int irq; | ||
| 6688 | + unsigned short clock_for_sd; | ||
| 6689 | + | ||
| 6690 | + /* I/O related stuff */ | ||
| 6691 | + struct scatterlist *sg_ptr; | ||
| 6692 | + unsigned int sg_len; | ||
| 6693 | + unsigned int sg_off; | ||
| 6694 | +}; | ||
| 6695 | + | ||
| 6696 | +static void | ||
| 6697 | +mmc_finish_request(struct asic3_mmc_host *host) | ||
| 6698 | +{ | ||
| 6699 | + struct mmc_request *mrq = host->mrq; | ||
| 6700 | + | ||
| 6701 | + /* Write something to end the command */ | ||
| 6702 | + host->mrq = NULL; | ||
| 6703 | + host->cmd = NULL; | ||
| 6704 | + host->data = NULL; | ||
| 6705 | + | ||
| 6706 | + mmc_request_done(host->mmc, mrq); | ||
| 6707 | +} | ||
| 6708 | + | ||
| 6709 | + | ||
| 6710 | +#define ASIC3_MMC_REG(host, block, reg) (*((volatile u16 *) ((host->ctl_base) + ((_IPAQ_ASIC3_## block ## _Base + _IPAQ_ASIC3_ ## block ## _ ## reg) >> (2 - host->bus_shift))) )) | ||
| 6711 | + | ||
| 6712 | +static void | ||
| 6713 | +mmc_start_command(struct asic3_mmc_host *host, struct mmc_command *cmd) | ||
| 6714 | +{ | ||
| 6715 | + struct mmc_data *data = host->data; | ||
| 6716 | + int c = cmd->opcode; | ||
| 6717 | + | ||
| 6718 | + DBG("[1;33mOpcode: %d[0m, base: %p\n", cmd->opcode, host->ctl_base); | ||
| 6719 | + | ||
| 6720 | + if(cmd->opcode == MMC_STOP_TRANSMISSION) { | ||
| 6721 | + ASIC3_MMC_REG(host, SD_CTRL, StopInternal) = SD_CTRL_STOP_INTERNAL_ISSSUE_CMD12; | ||
| 6722 | + cmd->resp[0] = cmd->opcode; | ||
| 6723 | + cmd->resp[1] = 0; | ||
| 6724 | + cmd->resp[2] = 0; | ||
| 6725 | + cmd->resp[3] = 0; | ||
| 6726 | + cmd->resp[4] = 0; | ||
| 6727 | + return; | ||
| 6728 | + } | ||
| 6729 | + | ||
| 6730 | + switch(cmd->flags & 0x1f) { | ||
| 6731 | + case MMC_RSP_NONE: c |= SD_CTRL_COMMAND_RESPONSE_TYPE_NORMAL; break; | ||
| 6732 | + case MMC_RSP_R1: c |= SD_CTRL_COMMAND_RESPONSE_TYPE_EXT_R1; break; | ||
| 6733 | + case MMC_RSP_R1B: c |= SD_CTRL_COMMAND_RESPONSE_TYPE_EXT_R1B; break; | ||
| 6734 | + case MMC_RSP_R2: c |= SD_CTRL_COMMAND_RESPONSE_TYPE_EXT_R2; break; | ||
| 6735 | + case MMC_RSP_R3: c |= SD_CTRL_COMMAND_RESPONSE_TYPE_EXT_R3; break; | ||
| 6736 | + default: | ||
| 6737 | + DBG("Unknown response type %d\n", cmd->flags & 0x1f); | ||
| 6738 | + break; | ||
| 6739 | + } | ||
| 6740 | + | ||
| 6741 | + host->cmd = cmd; | ||
| 6742 | + | ||
| 6743 | + if(cmd->opcode == MMC_APP_CMD) { | ||
| 6744 | + c |= APP_CMD; | ||
| 6745 | + } | ||
| 6746 | + if (cmd->opcode == MMC_GO_IDLE_STATE) { | ||
| 6747 | + c |= (3 << 8); /* This was removed from ipaq-asic3.h for some reason */ | ||
| 6748 | + } | ||
| 6749 | + if(data) { | ||
| 6750 | + c |= SD_CTRL_COMMAND_DATA_PRESENT; | ||
| 6751 | + if(data->blocks > 1) { | ||
| 6752 | + ASIC3_MMC_REG(host, SD_CTRL, StopInternal) = SD_CTRL_STOP_INTERNAL_AUTO_ISSUE_CMD12; | ||
| 6753 | + c |= SD_CTRL_COMMAND_MULTI_BLOCK; | ||
| 6754 | + } | ||
| 6755 | + if(data->flags & MMC_DATA_READ) { | ||
| 6756 | + c |= SD_CTRL_COMMAND_TRANSFER_READ; | ||
| 6757 | + } | ||
| 6758 | + /* MMC_DATA_WRITE does not require a bit to be set */ | ||
| 6759 | + } | ||
| 6760 | + | ||
| 6761 | + /* Enable the command and data interrupts */ | ||
| 6762 | + ASIC3_MMC_REG(host, SD_CTRL, IntMaskCard) = ~( | ||
| 6763 | + SD_CTRL_INTMASKCARD_RESPONSE_END | ||
| 6764 | + | SD_CTRL_INTMASKCARD_RW_END | ||
| 6765 | + | SD_CTRL_INTMASKCARD_CARD_REMOVED_0 | ||
| 6766 | + | SD_CTRL_INTMASKCARD_CARD_INSERTED_0 | ||
| 6767 | +#if 0 | ||
| 6768 | + | SD_CTRL_INTMASKCARD_CARD_REMOVED_3 | ||
| 6769 | + | SD_CTRL_INTMASKCARD_CARD_INSERTED_3 | ||
| 6770 | +#endif | ||
| 6771 | + ); | ||
| 6772 | + | ||
| 6773 | + ASIC3_MMC_REG(host, SD_CTRL, IntMaskBuffer) = ~( | ||
| 6774 | + SD_CTRL_INTMASKBUFFER_UNK7 | ||
| 6775 | + | SD_CTRL_INTMASKBUFFER_CMD_BUSY | ||
| 6776 | +#if 0 | ||
| 6777 | + | SD_CTRL_INTMASKBUFFER_CMD_INDEX_ERROR | ||
| 6778 | + | SD_CTRL_INTMASKBUFFER_CRC_ERROR | ||
| 6779 | + | SD_CTRL_INTMASKBUFFER_STOP_BIT_END_ERROR | ||
| 6780 | + | SD_CTRL_INTMASKBUFFER_DATA_TIMEOUT | ||
| 6781 | + | SD_CTRL_INTMASKBUFFER_BUFFER_OVERFLOW | ||
| 6782 | + | SD_CTRL_INTMASKBUFFER_BUFFER_UNDERFLOW | ||
| 6783 | + | SD_CTRL_INTMASKBUFFER_CMD_TIMEOUT | ||
| 6784 | + | SD_CTRL_INTMASKBUFFER_BUFFER_READ_ENABLE | ||
| 6785 | + | SD_CTRL_INTMASKBUFFER_BUFFER_WRITE_ENABLE | ||
| 6786 | + | SD_CTRL_INTMASKBUFFER_ILLEGAL_ACCESS | ||
| 6787 | +#endif | ||
| 6788 | + ); | ||
| 6789 | + | ||
| 6790 | + /* Send the command */ | ||
| 6791 | + ASIC3_MMC_REG(host, SD_CTRL, Arg1) = cmd->arg >> 16; | ||
| 6792 | + ASIC3_MMC_REG(host, SD_CTRL, Arg0) = cmd->arg & 0xffff; | ||
| 6793 | + ASIC3_MMC_REG(host, SD_CTRL, Cmd) = c; | ||
| 6794 | +} | ||
| 6795 | + | ||
| 6796 | +/* This chip always returns (at least?) as much data as you ask for. I'm | ||
| 6797 | + * unsure what happens if you ask for less than a block. This should be looked | ||
| 6798 | + * into to ensure that a funny length read doesnt mess up the controller data | ||
| 6799 | + * state machine. | ||
| 6800 | + * | ||
| 6801 | + * Aric: Statement above may not apply to ASIC3. | ||
| 6802 | + * | ||
| 6803 | + * FIXME - this chip cannot do 1 and 2 byte data requests in 4 bit mode | ||
| 6804 | + * | ||
| 6805 | + * Aric: Statement above may not apply to ASIC3. | ||
| 6806 | + */ | ||
| 6807 | + | ||
| 6808 | +static struct tasklet_struct mmc_data_read_tasklet; | ||
| 6809 | + | ||
| 6810 | +static void | ||
| 6811 | +mmc_data_transfer(unsigned long h) | ||
| 6812 | +{ | ||
| 6813 | + struct asic3_mmc_host *host = (struct asic3_mmc_host *)h; | ||
| 6814 | + struct mmc_data *data = host->data; | ||
| 6815 | + unsigned short *buf; | ||
| 6816 | + int count; | ||
| 6817 | + /* unsigned long flags; */ | ||
| 6818 | + | ||
| 6819 | + if(!data){ | ||
| 6820 | + printk(KERN_WARNING DRIVER_NAME ": Spurious Data IRQ\n"); | ||
| 6821 | + return; | ||
| 6822 | + } | ||
| 6823 | + | ||
| 6824 | + /* local_irq_save(flags); */ | ||
| 6825 | + /* buf = kmap_atomic(host->sg_ptr->page, KM_BIO_SRC_IRQ); */ | ||
| 6826 | + buf = kmap(host->sg_ptr->page); | ||
| 6827 | + buf += host->sg_ptr->offset/2 + host->sg_off/2; | ||
| 6828 | + | ||
| 6829 | + /* | ||
| 6830 | + * Ensure we dont read more than one block. The chip will interrupt us | ||
| 6831 | + * When the next block is available. | ||
| 6832 | + */ | ||
| 6833 | + count = host->sg_ptr->length - host->sg_off; | ||
| 6834 | + if(count > data->blksz) { | ||
| 6835 | + count = data->blksz; | ||
| 6836 | + } | ||
| 6837 | + | ||
| 6838 | + DBG("count: %08x, page: %p, offset: %08x flags %08x\n", | ||
| 6839 | + count, host->sg_ptr->page, host->sg_off, data->flags); | ||
| 6840 | + | ||
| 6841 | + host->sg_off += count; | ||
| 6842 | + | ||
| 6843 | + /* Transfer the data */ | ||
| 6844 | + if(data->flags & MMC_DATA_READ) { | ||
| 6845 | + while(count > 0) { | ||
| 6846 | + /* Read two bytes from SD/MMC controller. */ | ||
| 6847 | + *buf = ASIC3_MMC_REG(host, SD_CTRL, DataPort); | ||
| 6848 | + buf++; | ||
| 6849 | + count -= 2; | ||
| 6850 | + } | ||
| 6851 | + //flush_dcache_page(host->sg_ptr->page); | ||
| 6852 | + } else { | ||
| 6853 | + while(count > 0) { | ||
| 6854 | + /* Write two bytes to SD/MMC controller. */ | ||
| 6855 | + ASIC3_MMC_REG(host, SD_CTRL, DataPort) = *buf; | ||
| 6856 | + buf++; | ||
| 6857 | + count -= 2; | ||
| 6858 | + } | ||
| 6859 | + } | ||
| 6860 | + | ||
| 6861 | + /* kunmap_atomic(host->sg_ptr->page, KM_BIO_SRC_IRQ); */ | ||
| 6862 | + kunmap(host->sg_ptr->page); | ||
| 6863 | + /* local_irq_restore(flags); */ | ||
| 6864 | + if(host->sg_off == host->sg_ptr->length) { | ||
| 6865 | + host->sg_ptr++; | ||
| 6866 | + host->sg_off = 0; | ||
| 6867 | + --host->sg_len; | ||
| 6868 | + } | ||
| 6869 | + | ||
| 6870 | + return; | ||
| 6871 | +} | ||
| 6872 | + | ||
| 6873 | +static void | ||
| 6874 | +mmc_data_end_irq(struct asic3_mmc_host *host) | ||
| 6875 | +{ | ||
| 6876 | + struct mmc_data *data = host->data; | ||
| 6877 | + | ||
| 6878 | + host->data = NULL; | ||
| 6879 | + | ||
| 6880 | + if(!data){ | ||
| 6881 | + printk(KERN_WARNING DRIVER_NAME ": Spurious data end IRQ\n"); | ||
| 6882 | + return; | ||
| 6883 | + } | ||
| 6884 | + | ||
| 6885 | + if (data->error == MMC_ERR_NONE) { | ||
| 6886 | + data->bytes_xfered = data->blocks * data->blksz; | ||
| 6887 | + } else { | ||
| 6888 | + data->bytes_xfered = 0; | ||
| 6889 | + } | ||
| 6890 | + | ||
| 6891 | + DBG("Completed data request\n"); | ||
| 6892 | + | ||
| 6893 | + ASIC3_MMC_REG(host, SD_CTRL, StopInternal) = 0; | ||
| 6894 | + | ||
| 6895 | + /* Make sure read enable interrupt and write enable interrupt are disabled */ | ||
| 6896 | + if(data->flags & MMC_DATA_READ) { | ||
| 6897 | + ASIC3_MMC_REG(host, SD_CTRL, IntMaskBuffer) |= SD_CTRL_INTMASKBUFFER_BUFFER_READ_ENABLE; | ||
| 6898 | + } else { | ||
| 6899 | + ASIC3_MMC_REG(host, SD_CTRL, IntMaskBuffer) |= SD_CTRL_INTMASKBUFFER_BUFFER_WRITE_ENABLE; | ||
| 6900 | + } | ||
| 6901 | + | ||
| 6902 | + mmc_finish_request(host); | ||
| 6903 | +} | ||
| 6904 | + | ||
| 6905 | +static void | ||
| 6906 | +mmc_cmd_irq(struct asic3_mmc_host *host, unsigned int buffer_stat) | ||
| 6907 | +{ | ||
| 6908 | + struct mmc_command *cmd = host->cmd; | ||
| 6909 | + u8 *buf = (u8 *)cmd->resp; | ||
| 6910 | + u16 data; | ||
| 6911 | + | ||
| 6912 | + if(!host->cmd) { | ||
| 6913 | + printk(KERN_WARNING DRIVER_NAME ": Spurious CMD irq\n"); | ||
| 6914 | + return; | ||
| 6915 | + } | ||
| 6916 | + | ||
| 6917 | + host->cmd = NULL; | ||
| 6918 | + if(cmd->flags & MMC_RSP_PRESENT && cmd->flags & MMC_RSP_136) { | ||
| 6919 | + /* R2 */ | ||
| 6920 | + buf[12] = 0xff; | ||
| 6921 | + data = ASIC3_MMC_REG(host, SD_CTRL, Response0); | ||
| 6922 | + buf[13] = data & 0xff; | ||
| 6923 | + buf[14] = data >> 8; | ||
| 6924 | + data = ASIC3_MMC_REG(host, SD_CTRL, Response1); | ||
| 6925 | + buf[15] = data & 0xff; | ||
| 6926 | + buf[8] = data >> 8; | ||
| 6927 | + data = ASIC3_MMC_REG(host, SD_CTRL, Response2); | ||
| 6928 | + buf[9] = data & 0xff; | ||
| 6929 | + buf[10] = data >> 8; | ||
| 6930 | + data = ASIC3_MMC_REG(host, SD_CTRL, Response3); | ||
| 6931 | + buf[11] = data & 0xff; | ||
| 6932 | + buf[4] = data >> 8; | ||
| 6933 | + data = ASIC3_MMC_REG(host, SD_CTRL, Response4); | ||
| 6934 | + buf[5] = data & 0xff; | ||
| 6935 | + buf[6] = data >> 8; | ||
| 6936 | + data = ASIC3_MMC_REG(host, SD_CTRL, Response5); | ||
| 6937 | + buf[7] = data & 0xff; | ||
| 6938 | + buf[0] = data >> 8; | ||
| 6939 | + data = ASIC3_MMC_REG(host, SD_CTRL, Response6); | ||
| 6940 | + buf[1] = data & 0xff; | ||
| 6941 | + buf[2] = data >> 8; | ||
| 6942 | + data = ASIC3_MMC_REG(host, SD_CTRL, Response7); | ||
| 6943 | + buf[3] = data & 0xff; | ||
| 6944 | + } else if(cmd->flags & MMC_RSP_PRESENT) { | ||
| 6945 | + /* R1, R1B, R3 */ | ||
| 6946 | + data = ASIC3_MMC_REG(host, SD_CTRL, Response0); | ||
| 6947 | + buf[0] = data & 0xff; | ||
| 6948 | + buf[1] = data >> 8; | ||
| 6949 | + data = ASIC3_MMC_REG(host, SD_CTRL, Response1); | ||
| 6950 | + buf[2] = data & 0xff; | ||
| 6951 | + buf[3] = data >> 8; | ||
| 6952 | + } | ||
| 6953 | + DBG("Response: %08x %08x %08x %08x\n", cmd->resp[0], cmd->resp[1], cmd->resp[2], cmd->resp[3]); | ||
| 6954 | + | ||
| 6955 | + if(buffer_stat & SD_CTRL_BUFFERSTATUS_CMD_TIMEOUT) { | ||
| 6956 | + cmd->error = MMC_ERR_TIMEOUT; | ||
| 6957 | + } else if((buffer_stat & SD_CTRL_BUFFERSTATUS_CRC_ERROR) && (cmd->flags & MMC_RSP_CRC)) { | ||
| 6958 | + cmd->error = MMC_ERR_BADCRC; | ||
| 6959 | + } else if(buffer_stat & | ||
| 6960 | + ( | ||
| 6961 | + SD_CTRL_BUFFERSTATUS_ILLEGAL_ACCESS | ||
| 6962 | + | SD_CTRL_BUFFERSTATUS_CMD_INDEX_ERROR | ||
| 6963 | + | SD_CTRL_BUFFERSTATUS_STOP_BIT_END_ERROR | ||
| 6964 | + | SD_CTRL_BUFFERSTATUS_BUFFER_OVERFLOW | ||
| 6965 | + | SD_CTRL_BUFFERSTATUS_BUFFER_UNDERFLOW | ||
| 6966 | + | SD_CTRL_BUFFERSTATUS_DATA_TIMEOUT | ||
| 6967 | + ) | ||
| 6968 | + ) { | ||
| 6969 | + DBG("Buffer status ERROR 0x%04x - inside check buffer\n", buffer_stat); | ||
| 6970 | + DBG("detail0 error status 0x%04x\n", ASIC3_MMC_REG(host, SD_CTRL, ErrorStatus0)); | ||
| 6971 | + DBG("detail1 error status 0x%04x\n", ASIC3_MMC_REG(host, SD_CTRL, ErrorStatus1)); | ||
| 6972 | + cmd->error = MMC_ERR_FAILED; | ||
| 6973 | + } | ||
| 6974 | + | ||
| 6975 | + if(cmd->error == MMC_ERR_NONE) { | ||
| 6976 | + switch (cmd->opcode) { | ||
| 6977 | + case SD_APP_SET_BUS_WIDTH: | ||
| 6978 | + if(cmd->arg == SD_BUS_WIDTH_4) { | ||
| 6979 | + host->clock_for_sd = SD_CTRL_CARDCLOCKCONTROL_FOR_SD_CARD; | ||
| 6980 | + ASIC3_MMC_REG(host, SD_CTRL, MemCardOptionSetup) = | ||
| 6981 | + MEM_CARD_OPTION_REQUIRED | ||
| 6982 | + | MEM_CARD_OPTION_DATA_RESPONSE_TIMEOUT(14) | ||
| 6983 | + | MEM_CARD_OPTION_C2_MODULE_NOT_PRESENT | ||
| 6984 | + | MEM_CARD_OPTION_DATA_XFR_WIDTH_4; | ||
| 6985 | + } else { | ||
| 6986 | + host->clock_for_sd = 0; | ||
| 6987 | + ASIC3_MMC_REG(host, SD_CTRL, MemCardOptionSetup) = | ||
| 6988 | + MEM_CARD_OPTION_REQUIRED | ||
| 6989 | + | MEM_CARD_OPTION_DATA_RESPONSE_TIMEOUT(14) | ||
| 6990 | + | MEM_CARD_OPTION_C2_MODULE_NOT_PRESENT | ||
| 6991 | + | MEM_CARD_OPTION_DATA_XFR_WIDTH_1; | ||
| 6992 | + } | ||
| 6993 | + break; | ||
| 6994 | + case MMC_SELECT_CARD: | ||
| 6995 | + if((cmd->arg >> 16) == 0) { | ||
| 6996 | + /* We have been deselected. */ | ||
| 6997 | + ASIC3_MMC_REG(host, SD_CTRL, MemCardOptionSetup) = | ||
| 6998 | + MEM_CARD_OPTION_REQUIRED | ||
| 6999 | + | MEM_CARD_OPTION_DATA_RESPONSE_TIMEOUT(14) | ||
| 7000 | + | MEM_CARD_OPTION_C2_MODULE_NOT_PRESENT | ||
| 7001 | + | MEM_CARD_OPTION_DATA_XFR_WIDTH_1; | ||
| 7002 | + } | ||
| 7003 | + } | ||
| 7004 | + } | ||
| 7005 | + | ||
| 7006 | + /* | ||
| 7007 | + * If there is data to handle we enable data IRQs here, and we will | ||
| 7008 | + * ultimatley finish the request in the mmc_data_end_irq handler. | ||
| 7009 | + */ | ||
| 7010 | + if(host->data && (cmd->error == MMC_ERR_NONE)){ | ||
| 7011 | + if(host->data->flags & MMC_DATA_READ) { | ||
| 7012 | + /* Enable the read enable interrupt */ | ||
| 7013 | + ASIC3_MMC_REG(host, SD_CTRL, IntMaskBuffer) &= | ||
| 7014 | + ~SD_CTRL_INTMASKBUFFER_BUFFER_READ_ENABLE; | ||
| 7015 | + } else { | ||
| 7016 | + /* Enable the write enable interrupt */ | ||
| 7017 | + ASIC3_MMC_REG(host, SD_CTRL, IntMaskBuffer) &= | ||
| 7018 | + ~SD_CTRL_INTMASKBUFFER_BUFFER_WRITE_ENABLE; | ||
| 7019 | + } | ||
| 7020 | + } else { | ||
| 7021 | + /* There's no data, or we encountered an error, so finish now. */ | ||
| 7022 | + mmc_finish_request(host); | ||
| 7023 | + } | ||
| 7024 | + | ||
| 7025 | + return; | ||
| 7026 | +} | ||
| 7027 | + | ||
| 7028 | +static void hwinit2_irqsafe(struct asic3_mmc_host *host); | ||
| 7029 | + | ||
| 7030 | +static irqreturn_t | ||
| 7031 | +mmc_irq(int irq, void *irq_desc) | ||
| 7032 | +{ | ||
| 7033 | + struct asic3_mmc_host *host; | ||
| 7034 | + unsigned int breg, bmask, bstatus, creg, cmask, cstatus; | ||
| 7035 | + | ||
| 7036 | + host = irq_desc; | ||
| 7037 | + | ||
| 7038 | + /* asic3 bstatus has errors */ | ||
| 7039 | + bstatus = ASIC3_MMC_REG(host, SD_CTRL, BufferCtrl); | ||
| 7040 | + bmask = ASIC3_MMC_REG(host, SD_CTRL, IntMaskBuffer); | ||
| 7041 | + cstatus = ASIC3_MMC_REG(host, SD_CTRL, CardStatus); | ||
| 7042 | + cmask = ASIC3_MMC_REG(host, SD_CTRL, IntMaskCard); | ||
| 7043 | + breg = bstatus & ~bmask & ~DONT_CARE_BUFFER_BITS; | ||
| 7044 | + creg = cstatus & ~cmask & ~DONT_CARE_CARD_BITS; | ||
| 7045 | + | ||
| 7046 | + if (!breg && !creg) { | ||
| 7047 | + /* This occurs sometimes for no known reason. It doesn't hurt | ||
| 7048 | + * anything, so I don't print it. */ | ||
| 7049 | + ASIC3_MMC_REG(host, SD_CTRL, IntMaskBuffer) &= ~breg; | ||
| 7050 | + ASIC3_MMC_REG(host, SD_CTRL, IntMaskCard) &= ~creg; | ||
| 7051 | + goto out; | ||
| 7052 | + } | ||
| 7053 | + | ||
| 7054 | + while (breg || creg) { | ||
| 7055 | + | ||
| 7056 | + /* XXX TODO: Need to handle errors in breg here. */ | ||
| 7057 | + | ||
| 7058 | + /* | ||
| 7059 | + * Card insert/remove. The mmc controlling code is stateless. That | ||
| 7060 | + * is, it doesn't care if it was an insert or a remove. It treats | ||
| 7061 | + * both the same. | ||
| 7062 | + */ | ||
| 7063 | + /* XXX Asic3 has _3 versions of these status bits, too, for a second slot, perhaps? */ | ||
| 7064 | + if (creg & (SD_CTRL_CARDSTATUS_CARD_INSERTED_0 | SD_CTRL_CARDSTATUS_CARD_REMOVED_0)) { | ||
| 7065 | + ASIC3_MMC_REG(host, SD_CTRL, CardStatus) &= | ||
| 7066 | + ~(SD_CTRL_CARDSTATUS_CARD_REMOVED_0 | SD_CTRL_CARDSTATUS_CARD_INSERTED_0); | ||
| 7067 | + if(creg & SD_CTRL_CARDSTATUS_CARD_INSERTED_0) { | ||
| 7068 | + hwinit2_irqsafe(host); | ||
| 7069 | + } | ||
| 7070 | + mmc_detect_change(host->mmc,1); | ||
| 7071 | + } | ||
| 7072 | + | ||
| 7073 | + /* Command completion */ | ||
| 7074 | + if (creg & SD_CTRL_CARDSTATUS_RESPONSE_END) { | ||
| 7075 | + ASIC3_MMC_REG(host, SD_CTRL, CardStatus) &= | ||
| 7076 | + ~(SD_CTRL_CARDSTATUS_RESPONSE_END); | ||
| 7077 | + mmc_cmd_irq(host, bstatus); | ||
| 7078 | + } | ||
| 7079 | + | ||
| 7080 | + /* Data transfer */ | ||
| 7081 | + if (breg & (SD_CTRL_BUFFERSTATUS_BUFFER_READ_ENABLE | SD_CTRL_BUFFERSTATUS_BUFFER_WRITE_ENABLE)) { | ||
| 7082 | + ASIC3_MMC_REG(host, SD_CTRL, BufferCtrl) &= | ||
| 7083 | + ~(SD_CTRL_BUFFERSTATUS_BUFFER_WRITE_ENABLE | SD_CTRL_BUFFERSTATUS_BUFFER_READ_ENABLE); | ||
| 7084 | + tasklet_schedule(&mmc_data_read_tasklet); | ||
| 7085 | + } | ||
| 7086 | + | ||
| 7087 | + /* Data transfer completion */ | ||
| 7088 | + if (creg & SD_CTRL_CARDSTATUS_RW_END) { | ||
| 7089 | + ASIC3_MMC_REG(host, SD_CTRL, CardStatus) &= ~(SD_CTRL_CARDSTATUS_RW_END); | ||
| 7090 | + mmc_data_end_irq(host); | ||
| 7091 | + } | ||
| 7092 | + | ||
| 7093 | + /* Check status - keep going until we've handled it all */ | ||
| 7094 | + bstatus = ASIC3_MMC_REG(host, SD_CTRL, BufferCtrl); | ||
| 7095 | + bmask = ASIC3_MMC_REG(host, SD_CTRL, IntMaskBuffer); | ||
| 7096 | + cstatus = ASIC3_MMC_REG(host, SD_CTRL, CardStatus); | ||
| 7097 | + cmask = ASIC3_MMC_REG(host, SD_CTRL, IntMaskCard); | ||
| 7098 | + breg = bstatus & ~bmask & ~DONT_CARE_BUFFER_BITS; | ||
| 7099 | + creg = cstatus & ~cmask & ~DONT_CARE_CARD_BITS; | ||
| 7100 | + } | ||
| 7101 | + | ||
| 7102 | +out: | ||
| 7103 | + /* Ensure all interrupt sources are cleared */ | ||
| 7104 | + ASIC3_MMC_REG(host, SD_CTRL, BufferCtrl) = 0; | ||
| 7105 | + ASIC3_MMC_REG(host, SD_CTRL, CardStatus) = 0; | ||
| 7106 | + return IRQ_HANDLED; | ||
| 7107 | +} | ||
| 7108 | + | ||
| 7109 | +static void | ||
| 7110 | +mmc_start_data(struct asic3_mmc_host *host, struct mmc_data *data) | ||
| 7111 | +{ | ||
| 7112 | + DBG("setup data transfer: blocksize %08x nr_blocks %d, page: %08x, offset: %08x\n", data->blksz, | ||
| 7113 | + data->blocks, (int)data->sg->page, data->sg->offset); | ||
| 7114 | + | ||
| 7115 | + host->sg_len = data->sg_len; | ||
| 7116 | + host->sg_ptr = data->sg; | ||
| 7117 | + host->sg_off = 0; | ||
| 7118 | + host->data = data; | ||
| 7119 | + | ||
| 7120 | + /* Set transfer length and blocksize */ | ||
| 7121 | + ASIC3_MMC_REG(host, SD_CTRL, TransferSectorCount) = data->blocks; | ||
| 7122 | + ASIC3_MMC_REG(host, SD_CTRL, MemCardXferDataLen) = data->blksz; | ||
| 7123 | +} | ||
| 7124 | + | ||
| 7125 | +/* Process requests from the MMC layer */ | ||
| 7126 | +static void | ||
| 7127 | +mmc_request(struct mmc_host *mmc, struct mmc_request *mrq) | ||
| 7128 | +{ | ||
| 7129 | + struct asic3_mmc_host *host = mmc_priv(mmc); | ||
| 7130 | + | ||
| 7131 | + WARN_ON(host->mrq != NULL); | ||
| 7132 | + | ||
| 7133 | + host->mrq = mrq; | ||
| 7134 | + | ||
| 7135 | + /* If we're performing a data request we need to setup some | ||
| 7136 | + extra information */ | ||
| 7137 | + if(mrq->data) { | ||
| 7138 | + mmc_start_data(host, mrq->data); | ||
| 7139 | + } | ||
| 7140 | + | ||
| 7141 | + mmc_start_command(host, mrq->cmd); | ||
| 7142 | +} | ||
| 7143 | + | ||
| 7144 | +/* Set MMC clock / power. | ||
| 7145 | + * Note: This controller uses a simple divider scheme therefore it cannot run | ||
| 7146 | + * a MMC card at full speed (20MHz). The max clock is 24MHz on SD, but as MMC | ||
| 7147 | + * wont run that fast, it has to be clocked at 12MHz which is the next slowest | ||
| 7148 | + * setting. This is likely not an issue because we are doing single 16-bit | ||
| 7149 | + * writes for data I/O. | ||
| 7150 | + */ | ||
| 7151 | +static void | ||
| 7152 | +mmc_set_ios(struct mmc_host *mmc, struct mmc_ios *ios) | ||
| 7153 | +{ | ||
| 7154 | + struct asic3_mmc_host *host = mmc_priv(mmc); | ||
| 7155 | + u32 clk = 0; | ||
| 7156 | + | ||
| 7157 | + DBG("clock %uHz busmode %u powermode %u Vdd %u\n", | ||
| 7158 | + ios->clock, ios->bus_mode, ios->power_mode, ios->vdd); | ||
| 7159 | + | ||
| 7160 | + if (ios->clock) { | ||
| 7161 | + clk = 0x80; /* slowest by default */ | ||
| 7162 | + if(ios->clock >= 24000000 / 256) clk >>= 1; | ||
| 7163 | + if(ios->clock >= 24000000 / 128) clk >>= 1; | ||
| 7164 | + if(ios->clock >= 24000000 / 64) clk >>= 1; | ||
| 7165 | + if(ios->clock >= 24000000 / 32) clk >>= 1; | ||
| 7166 | + if(ios->clock >= 24000000 / 16) clk >>= 1; | ||
| 7167 | + if(ios->clock >= 24000000 / 8) clk >>= 1; | ||
| 7168 | + if(ios->clock >= 24000000 / 4) clk >>= 1; | ||
| 7169 | + if(ios->clock >= 24000000 / 2) clk >>= 1; | ||
| 7170 | + if(ios->clock >= 24000000 / 1) clk >>= 1; | ||
| 7171 | + if(clk == 0) { /* For fastest speed we disable the divider. */ | ||
| 7172 | + ASIC3_MMC_REG(host, SD_CONFIG, ClockMode) = 0; | ||
| 7173 | + } else { | ||
| 7174 | + ASIC3_MMC_REG(host, SD_CONFIG, ClockMode) = 1; | ||
| 7175 | + } | ||
| 7176 | + ASIC3_MMC_REG(host, SD_CTRL, CardClockCtrl) = 0; | ||
| 7177 | + ASIC3_MMC_REG(host, SD_CTRL, CardClockCtrl) = | ||
| 7178 | + host->clock_for_sd | ||
| 7179 | + | SD_CTRL_CARDCLOCKCONTROL_ENABLE_CLOCK | ||
| 7180 | + | clk; | ||
| 7181 | + msleep(10); | ||
| 7182 | + } else { | ||
| 7183 | + ASIC3_MMC_REG(host, SD_CTRL, CardClockCtrl) = 0; | ||
| 7184 | + } | ||
| 7185 | + | ||
| 7186 | + switch (ios->power_mode) { | ||
| 7187 | + case MMC_POWER_OFF: | ||
| 7188 | + ASIC3_MMC_REG(host, SD_CONFIG, SDHC_Power1) = 0; | ||
| 7189 | + msleep(1); | ||
| 7190 | + break; | ||
| 7191 | + case MMC_POWER_UP: | ||
| 7192 | + break; | ||
| 7193 | + case MMC_POWER_ON: | ||
| 7194 | + ASIC3_MMC_REG(host, SD_CONFIG, SDHC_Power1) = SD_CONFIG_POWER1_PC_33V; | ||
| 7195 | + msleep(20); | ||
| 7196 | + break; | ||
| 7197 | + } | ||
| 7198 | +} | ||
| 7199 | + | ||
| 7200 | +static int | ||
| 7201 | +mmc_get_ro(struct mmc_host *mmc) | ||
| 7202 | +{ | ||
| 7203 | + struct asic3_mmc_host *host = mmc_priv(mmc); | ||
| 7204 | + | ||
| 7205 | + /* Call custom handler for RO status */ | ||
| 7206 | + if(host->hwconfig->mmc_get_ro) { | ||
| 7207 | + /* Special case for cards w/o WP lock (like miniSD) */ | ||
| 7208 | + if (host->hwconfig->mmc_get_ro == (void*)-1) { | ||
| 7209 | + return 0; | ||
| 7210 | + } else { | ||
| 7211 | + struct platform_device *pdev = to_platform_device(mmc_dev(mmc)); | ||
| 7212 | + return host->hwconfig->mmc_get_ro(pdev); | ||
| 7213 | + } | ||
| 7214 | + } | ||
| 7215 | + | ||
| 7216 | + /* WRITE_PROTECT is active low */ | ||
| 7217 | + return (ASIC3_MMC_REG(host, SD_CTRL, CardStatus) & SD_CTRL_CARDSTATUS_WRITE_PROTECT)?0:1; | ||
| 7218 | +} | ||
| 7219 | + | ||
| 7220 | +static struct mmc_host_ops mmc_ops = { | ||
| 7221 | + .request = mmc_request, | ||
| 7222 | + .set_ios = mmc_set_ios, | ||
| 7223 | + .get_ro = mmc_get_ro, | ||
| 7224 | +}; | ||
| 7225 | + | ||
| 7226 | +static void | ||
| 7227 | +hwinit2_irqsafe(struct asic3_mmc_host *host) | ||
| 7228 | +{ | ||
| 7229 | + ASIC3_MMC_REG(host, SD_CONFIG, Addr1) = 0x0000; | ||
| 7230 | + ASIC3_MMC_REG(host, SD_CONFIG, Addr0) = 0x0800; | ||
| 7231 | + | ||
| 7232 | + ASIC3_MMC_REG(host, SD_CONFIG, ClkStop) = SD_CONFIG_CLKSTOP_ENABLE_ALL; | ||
| 7233 | + ASIC3_MMC_REG(host, SD_CONFIG, SDHC_CardDetect) = 2; | ||
| 7234 | + ASIC3_MMC_REG(host, SD_CONFIG, Command) = SD_CONFIG_COMMAND_MAE; | ||
| 7235 | + | ||
| 7236 | + ASIC3_MMC_REG(host, SD_CTRL, SoftwareReset) = 0; /* reset on */ | ||
| 7237 | + mdelay(2); | ||
| 7238 | + | ||
| 7239 | + ASIC3_MMC_REG(host, SD_CTRL, SoftwareReset) = 1; /* reset off */ | ||
| 7240 | + mdelay(2); | ||
| 7241 | + | ||
| 7242 | + ASIC3_MMC_REG(host, SD_CTRL, MemCardOptionSetup) = | ||
| 7243 | + MEM_CARD_OPTION_REQUIRED | ||
| 7244 | + | MEM_CARD_OPTION_DATA_RESPONSE_TIMEOUT(14) | ||
| 7245 | + | MEM_CARD_OPTION_C2_MODULE_NOT_PRESENT | ||
| 7246 | + | MEM_CARD_OPTION_DATA_XFR_WIDTH_1 | ||
| 7247 | + ; | ||
| 7248 | + host->clock_for_sd = 0; | ||
| 7249 | + | ||
| 7250 | + ASIC3_MMC_REG(host, SD_CTRL, CardClockCtrl) = 0; | ||
| 7251 | + ASIC3_MMC_REG(host, SD_CTRL, CardStatus) = 0; | ||
| 7252 | + ASIC3_MMC_REG(host, SD_CTRL, BufferCtrl) = 0; | ||
| 7253 | + ASIC3_MMC_REG(host, SD_CTRL, ErrorStatus0) = 0; | ||
| 7254 | + ASIC3_MMC_REG(host, SD_CTRL, ErrorStatus1) = 0; | ||
| 7255 | + ASIC3_MMC_REG(host, SD_CTRL, StopInternal) = 0; | ||
| 7256 | + | ||
| 7257 | + ASIC3_MMC_REG(host, SDIO_CTRL, ClocknWaitCtrl) = 0x100; | ||
| 7258 | + /* *((unsigned short *)(((char *)host->ctl_base) + 0x938)) = 0x100; */ | ||
| 7259 | + | ||
| 7260 | + ASIC3_MMC_REG(host, SD_CONFIG, ClockMode) = 0; | ||
| 7261 | + ASIC3_MMC_REG(host, SD_CTRL, CardClockCtrl) = 0; | ||
| 7262 | + | ||
| 7263 | + mdelay(1); | ||
| 7264 | + | ||
| 7265 | + | ||
| 7266 | + ASIC3_MMC_REG(host, SD_CTRL, IntMaskCard) = ~( | ||
| 7267 | + SD_CTRL_INTMASKCARD_RESPONSE_END | ||
| 7268 | + | SD_CTRL_INTMASKCARD_RW_END | ||
| 7269 | + | SD_CTRL_INTMASKCARD_CARD_REMOVED_0 | ||
| 7270 | + | SD_CTRL_INTMASKCARD_CARD_INSERTED_0 | ||
| 7271 | +#if 0 | ||
| 7272 | + | SD_CTRL_INTMASKCARD_CARD_REMOVED_3 | ||
| 7273 | + | SD_CTRL_INTMASKCARD_CARD_INSERTED_3 | ||
| 7274 | +#endif | ||
| 7275 | + ) | ||
| 7276 | + ; /* check */ | ||
| 7277 | + ASIC3_MMC_REG(host, SD_CTRL, IntMaskBuffer) = 0xffff; /* IRQs off */ | ||
| 7278 | + | ||
| 7279 | + /* | ||
| 7280 | + * ASIC3_MMC_REG(host, SD_CTRL, TransactionCtrl) = SD_CTRL_TRANSACTIONCONTROL_SET; | ||
| 7281 | + * Wince has 0x1000 | ||
| 7282 | + */ | ||
| 7283 | + /* ASIC3_MMC_REG(host, SD_CTRL, TransactionCtrl) = 0x1000; */ | ||
| 7284 | + | ||
| 7285 | + | ||
| 7286 | + asic3_set_sdhwctrl(host->asic3_dev, ASIC3_SDHWCTRL_SDPWR, ASIC3_SDHWCTRL_SDPWR); /* turn on power at controller(?) */ | ||
| 7287 | + | ||
| 7288 | +} | ||
| 7289 | + | ||
| 7290 | +static void | ||
| 7291 | +hwinit(struct asic3_mmc_host *host, struct platform_device *pdev) | ||
| 7292 | +{ | ||
| 7293 | + /* Call custom handler for enabling clock (if needed) */ | ||
| 7294 | + if(host->hwconfig->set_mmc_clock) | ||
| 7295 | + host->hwconfig->set_mmc_clock(pdev, MMC_CLOCK_ENABLED); | ||
| 7296 | + | ||
| 7297 | + /* Not sure if it must be done bit by bit, but leaving as-is */ | ||
| 7298 | + asic3_set_sdhwctrl(host->asic3_dev, ASIC3_SDHWCTRL_LEVCD, ASIC3_SDHWCTRL_LEVCD); | ||
| 7299 | + asic3_set_sdhwctrl(host->asic3_dev, ASIC3_SDHWCTRL_LEVWP, ASIC3_SDHWCTRL_LEVWP); | ||
| 7300 | + asic3_set_sdhwctrl(host->asic3_dev, ASIC3_SDHWCTRL_SUSPEND, 0); | ||
| 7301 | + asic3_set_sdhwctrl(host->asic3_dev, ASIC3_SDHWCTRL_PCLR, 0); | ||
| 7302 | + | ||
| 7303 | + asic3_set_clock_cdex (host->asic3_dev, | ||
| 7304 | + CLOCK_CDEX_EX1 | CLOCK_CDEX_EX0, CLOCK_CDEX_EX1 | CLOCK_CDEX_EX0); | ||
| 7305 | + msleep(1); | ||
| 7306 | + | ||
| 7307 | + asic3_set_clock_sel (host->asic3_dev, | ||
| 7308 | + CLOCK_SEL_SD_HCLK_SEL | CLOCK_SEL_SD_BCLK_SEL, | ||
| 7309 | + CLOCK_SEL_SD_HCLK_SEL | 0); /* ? */ | ||
| 7310 | + | ||
| 7311 | + asic3_set_clock_cdex (host->asic3_dev, | ||
| 7312 | + CLOCK_CDEX_SD_HOST | CLOCK_CDEX_SD_BUS, | ||
| 7313 | + CLOCK_CDEX_SD_HOST | CLOCK_CDEX_SD_BUS); | ||
| 7314 | + msleep(1); | ||
| 7315 | + | ||
| 7316 | + asic3_set_extcf_select(host->asic3_dev, ASIC3_EXTCF_SD_MEM_ENABLE, ASIC3_EXTCF_SD_MEM_ENABLE); | ||
| 7317 | + | ||
| 7318 | + /* Long Delay */ | ||
| 7319 | + if( !machine_is_h4700()) | ||
| 7320 | + msleep(500); | ||
| 7321 | + | ||
| 7322 | + hwinit2_irqsafe(host); | ||
| 7323 | +} | ||
| 7324 | + | ||
| 7325 | +#ifdef CONFIG_PM | ||
| 7326 | +static int | ||
| 7327 | +mmc_suspend(struct platform_device *pdev, pm_message_t state) | ||
| 7328 | +{ | ||
| 7329 | + struct mmc_host *mmc = platform_get_drvdata(pdev); | ||
| 7330 | + struct asic3_mmc_host *host = mmc_priv(mmc); | ||
| 7331 | + int ret; | ||
| 7332 | + | ||
| 7333 | + ret = mmc_suspend_host(mmc, state); | ||
| 7334 | + | ||
| 7335 | + if (ret) { | ||
| 7336 | + printk(KERN_ERR DRIVER_NAME ": Could not suspend MMC host, hardware not suspended"); | ||
| 7337 | + return ret; | ||
| 7338 | + } | ||
| 7339 | + | ||
| 7340 | + /* disable the card insert / remove interrupt while sleeping */ | ||
| 7341 | + ASIC3_MMC_REG(host, SD_CTRL, IntMaskCard) = ~( | ||
| 7342 | + SD_CTRL_INTMASKCARD_RESPONSE_END | ||
| 7343 | + | SD_CTRL_INTMASKCARD_RW_END); | ||
| 7344 | + | ||
| 7345 | + /* disable clock */ | ||
| 7346 | + ASIC3_MMC_REG(host, SD_CTRL, CardClockCtrl) = 0; | ||
| 7347 | + ASIC3_MMC_REG(host, SD_CONFIG, ClkStop) = 0; | ||
| 7348 | + | ||
| 7349 | + /* power down */ | ||
| 7350 | + ASIC3_MMC_REG(host, SD_CONFIG, SDHC_Power1) = 0; | ||
| 7351 | + | ||
| 7352 | + asic3_set_clock_cdex (host->asic3_dev, | ||
| 7353 | + CLOCK_CDEX_SD_HOST | CLOCK_CDEX_SD_BUS, 0); | ||
| 7354 | + | ||
| 7355 | + /* disable core clock */ | ||
| 7356 | + if(host->hwconfig->set_mmc_clock) | ||
| 7357 | + host->hwconfig->set_mmc_clock(pdev, MMC_CLOCK_DISABLED); | ||
| 7358 | + | ||
| 7359 | + /* Put in suspend mode */ | ||
| 7360 | + asic3_set_sdhwctrl(host->asic3_dev, ASIC3_SDHWCTRL_SUSPEND, ASIC3_SDHWCTRL_SUSPEND); | ||
| 7361 | + return 0; | ||
| 7362 | +} | ||
| 7363 | + | ||
| 7364 | +static int | ||
| 7365 | +mmc_resume(struct platform_device *pdev) | ||
| 7366 | +{ | ||
| 7367 | + struct mmc_host *mmc = platform_get_drvdata(pdev); | ||
| 7368 | + struct asic3_mmc_host *host = mmc_priv(mmc); | ||
| 7369 | + | ||
| 7370 | + printk(KERN_INFO "%s: starting resume\n", DRIVER_NAME); | ||
| 7371 | + | ||
| 7372 | + asic3_set_sdhwctrl(host->asic3_dev, ASIC3_SDHWCTRL_SUSPEND, 0); | ||
| 7373 | + hwinit(host, pdev); | ||
| 7374 | + | ||
| 7375 | + /* re-enable card remove / insert interrupt */ | ||
| 7376 | + ASIC3_MMC_REG(host, SD_CTRL, IntMaskCard) = ~( | ||
| 7377 | + SD_CTRL_INTMASKCARD_RESPONSE_END | ||
| 7378 | + | SD_CTRL_INTMASKCARD_RW_END | ||
| 7379 | + | SD_CTRL_INTMASKCARD_CARD_REMOVED_0 | ||
| 7380 | + | SD_CTRL_INTMASKCARD_CARD_INSERTED_0 ); | ||
| 7381 | + | ||
| 7382 | + mmc_resume_host(mmc); | ||
| 7383 | + | ||
| 7384 | + printk(KERN_INFO "%s: finished resume\n", DRIVER_NAME); | ||
| 7385 | + return 0; | ||
| 7386 | +} | ||
| 7387 | +#endif | ||
| 7388 | + | ||
| 7389 | +static int | ||
| 7390 | +mmc_probe(struct platform_device *pdev) | ||
| 7391 | +{ | ||
| 7392 | + struct mmc_host *mmc; | ||
| 7393 | + struct asic3_mmc_host *host = NULL; | ||
| 7394 | + int retval = 0; | ||
| 7395 | + struct tmio_mmc_hwconfig *mmc_config = (struct tmio_mmc_hwconfig *)pdev->dev.platform_data; | ||
| 7396 | + | ||
| 7397 | + /* bus_shift is mandatory */ | ||
| 7398 | + if (!mmc_config) { | ||
| 7399 | + printk(KERN_ERR DRIVER_NAME ": Invalid configuration\n"); | ||
| 7400 | + return -EINVAL; | ||
| 7401 | + } | ||
| 7402 | + | ||
| 7403 | + mmc = mmc_alloc_host(sizeof(struct asic3_mmc_host) + 128, &pdev->dev); | ||
| 7404 | + if (!mmc) { | ||
| 7405 | + retval = -ENOMEM; | ||
| 7406 | + goto exceptional_return; | ||
| 7407 | + } | ||
| 7408 | + | ||
| 7409 | + host = mmc_priv(mmc); | ||
| 7410 | + host->mmc = mmc; | ||
| 7411 | + platform_set_drvdata(pdev, mmc); | ||
| 7412 | + | ||
| 7413 | + host->ctl_base = 0; | ||
| 7414 | + host->hwconfig = mmc_config; | ||
| 7415 | + host->bus_shift = mmc_config->address_shift; | ||
| 7416 | + host->asic3_dev = pdev->dev.parent; | ||
| 7417 | + host->clock_for_sd = 0; | ||
| 7418 | + | ||
| 7419 | + tasklet_init(&mmc_data_read_tasklet, mmc_data_transfer, (unsigned long)host); | ||
| 7420 | + | ||
| 7421 | + host->ctl_base = ioremap_nocache ((unsigned long)pdev->resource[0].start, pdev->resource[0].end - pdev->resource[0].start); | ||
| 7422 | + if(!host->ctl_base){ | ||
| 7423 | + printk(KERN_ERR DRIVER_NAME ": Could not map ASIC3 SD controller\n"); | ||
| 7424 | + retval = -ENODEV; | ||
| 7425 | + goto exceptional_return; | ||
| 7426 | + } | ||
| 7427 | + | ||
| 7428 | + printk(DRIVER_NAME ": ASIC3 MMC/SD Driver, controller at 0x%lx\n", (unsigned long)pdev->resource[0].start); | ||
| 7429 | + | ||
| 7430 | + mmc->ops = &mmc_ops; | ||
| 7431 | + mmc->caps = MMC_CAP_4_BIT_DATA; | ||
| 7432 | + mmc->f_min = 46875; /* ARIC: not sure what these should be */ | ||
| 7433 | + mmc->f_max = 24000000; /* ARIC: not sure what these should be */ | ||
| 7434 | + mmc->ocr_avail = MMC_VDD_32_33; | ||
| 7435 | + | ||
| 7436 | + hwinit(host, pdev); | ||
| 7437 | + | ||
| 7438 | + | ||
| 7439 | + host->irq = pdev->resource[1].start; | ||
| 7440 | + | ||
| 7441 | + retval = request_irq(host->irq, mmc_irq, 0, DRIVER_NAME, host); | ||
| 7442 | + if(retval) { | ||
| 7443 | + printk(KERN_ERR DRIVER_NAME ": Unable to get interrupt\n"); | ||
| 7444 | + retval = -ENODEV; | ||
| 7445 | + goto exceptional_return; | ||
| 7446 | + } | ||
| 7447 | + set_irq_type(host->irq, IRQT_FALLING); | ||
| 7448 | + | ||
| 7449 | + mmc_add_host(mmc); | ||
| 7450 | + | ||
| 7451 | +#ifdef CONFIG_PM | ||
| 7452 | + // resume_timer.function = resume_timer_callback; | ||
| 7453 | + // resume_timer.data = 0; | ||
| 7454 | + // init_timer(&resume_timer); | ||
| 7455 | +#endif | ||
| 7456 | + | ||
| 7457 | + return 0; | ||
| 7458 | + | ||
| 7459 | +exceptional_return: | ||
| 7460 | + if (mmc) { | ||
| 7461 | + mmc_free_host(mmc); | ||
| 7462 | + } | ||
| 7463 | + if(host && host->ctl_base) iounmap(host->ctl_base); | ||
| 7464 | + return retval; | ||
| 7465 | +} | ||
| 7466 | + | ||
| 7467 | +static int | ||
| 7468 | +mmc_remove(struct platform_device *pdev) | ||
| 7469 | +{ | ||
| 7470 | + struct mmc_host *mmc = platform_get_drvdata(pdev); | ||
| 7471 | + | ||
| 7472 | + platform_set_drvdata(pdev, NULL); | ||
| 7473 | + | ||
| 7474 | + if (mmc) { | ||
| 7475 | + struct asic3_mmc_host *host = mmc_priv(mmc); | ||
| 7476 | + mmc_remove_host(mmc); | ||
| 7477 | + free_irq(host->irq, host); | ||
| 7478 | + /* FIXME - we might want to consider stopping the chip here... */ | ||
| 7479 | + iounmap(host->ctl_base); | ||
| 7480 | + mmc_free_host(mmc); /* FIXME - why does this call hang? */ | ||
| 7481 | + } | ||
| 7482 | + return 0; | ||
| 7483 | +} | ||
| 7484 | + | ||
| 7485 | +/* ------------------- device registration ----------------------- */ | ||
| 7486 | + | ||
| 7487 | +static struct platform_driver mmc_asic3_driver = { | ||
| 7488 | + .driver = { | ||
| 7489 | + .name = DRIVER_NAME, | ||
| 7490 | + }, | ||
| 7491 | + .probe = mmc_probe, | ||
| 7492 | + .remove = mmc_remove, | ||
| 7493 | +#ifdef CONFIG_PM | ||
| 7494 | + .suspend = mmc_suspend, | ||
| 7495 | + .resume = mmc_resume, | ||
| 7496 | +#endif | ||
| 7497 | +}; | ||
| 7498 | + | ||
| 7499 | +static int __init mmc_init(void) | ||
| 7500 | +{ | ||
| 7501 | + return platform_driver_register(&mmc_asic3_driver); | ||
| 7502 | +} | ||
| 7503 | + | ||
| 7504 | +static void __exit mmc_exit(void) | ||
| 7505 | +{ | ||
| 7506 | + platform_driver_unregister(&mmc_asic3_driver); | ||
| 7507 | +} | ||
| 7508 | + | ||
| 7509 | +late_initcall(mmc_init); | ||
| 7510 | +module_exit(mmc_exit); | ||
| 7511 | + | ||
| 7512 | +MODULE_DESCRIPTION("HTC ASIC3 SD/MMC driver"); | ||
| 7513 | +MODULE_AUTHOR("Aric Blumer, SDG Systems, LLC"); | ||
| 7514 | +MODULE_LICENSE("GPL"); | ||
| 7515 | + | ||
| 7516 | Index: linux-2.6.26-rc4/drivers/mmc/host/asic3_mmc.h | ||
| 7517 | =================================================================== | ||
| 7518 | --- /dev/null 1970-01-01 00:00:00.000000000 +0000 | ||
| 7519 | +++ linux-2.6.26-rc4/drivers/mmc/host/asic3_mmc.h 2008-06-01 18:49:45.000000000 +0100 | ||
| 7520 | @@ -0,0 +1,25 @@ | ||
| 7521 | +#ifndef __ASIC3_MMC_H | ||
| 7522 | +#define __ASIC3_MMC_H | ||
| 7523 | + | ||
| 7524 | +#define DRIVER_NAME "asic3_mmc" | ||
| 7525 | + | ||
| 7526 | +#ifdef CONFIG_MMC_DEBUG | ||
| 7527 | +#define DBG(x...) printk(DRIVER_NAME ": " x) | ||
| 7528 | +#else | ||
| 7529 | +#define DBG(x...) do { } while (0) | ||
| 7530 | +#endif | ||
| 7531 | + | ||
| 7532 | +/* Response types */ | ||
| 7533 | +#define APP_CMD 0x0040 | ||
| 7534 | + | ||
| 7535 | +#define SD_CONFIG_CLKSTOP_ENABLE_ALL 0x1f | ||
| 7536 | + | ||
| 7537 | +#define DONT_CARE_CARD_BITS ( \ | ||
| 7538 | + SD_CTRL_INTMASKCARD_SIGNAL_STATE_PRESENT_3 \ | ||
| 7539 | + | SD_CTRL_INTMASKCARD_WRITE_PROTECT \ | ||
| 7540 | + | SD_CTRL_INTMASKCARD_UNK6 \ | ||
| 7541 | + | SD_CTRL_INTMASKCARD_SIGNAL_STATE_PRESENT_0 \ | ||
| 7542 | + ) | ||
| 7543 | +#define DONT_CARE_BUFFER_BITS ( SD_CTRL_INTMASKBUFFER_UNK7 | SD_CTRL_INTMASKBUFFER_CMD_BUSY ) | ||
| 7544 | + | ||
| 7545 | +#endif // __ASIC3_MMC_H | ||
| 7546 | Index: linux-2.6.26-rc4/drivers/input/keyboard/Makefile | ||
| 7547 | =================================================================== | ||
| 7548 | --- linux-2.6.26-rc4.orig/drivers/input/keyboard/Makefile 2008-05-26 19:08:11.000000000 +0100 | ||
| 7549 | +++ linux-2.6.26-rc4/drivers/input/keyboard/Makefile 2008-06-01 18:52:37.000000000 +0100 | ||
| 7550 | @@ -15,6 +15,7 @@ | ||
| 7551 | obj-$(CONFIG_KEYBOARD_STOWAWAY) += stowaway.o | ||
| 7552 | obj-$(CONFIG_KEYBOARD_CORGI) += corgikbd.o | ||
| 7553 | obj-$(CONFIG_KEYBOARD_SPITZ) += spitzkbd.o | ||
| 7554 | +obj-$(CONFIG_KEYBOARD_ASIC3) += asic3_keys.o | ||
| 7555 | obj-$(CONFIG_KEYBOARD_TOSA) += tosakbd.o | ||
| 7556 | obj-$(CONFIG_KEYBOARD_HIL) += hil_kbd.o | ||
| 7557 | obj-$(CONFIG_KEYBOARD_HIL_OLD) += hilkbd.o | ||
| 7558 | Index: linux-2.6.26-rc4/drivers/input/keyboard/asic3_keys.c | ||
| 7559 | =================================================================== | ||
| 7560 | --- /dev/null 1970-01-01 00:00:00.000000000 +0000 | ||
| 7561 | +++ linux-2.6.26-rc4/drivers/input/keyboard/asic3_keys.c 2008-06-01 18:49:45.000000000 +0100 | ||
| 7562 | @@ -0,0 +1,131 @@ | ||
| 7563 | +/* | ||
| 7564 | + * Generic buttons driver for ASIC3 SoC. | ||
| 7565 | + * | ||
| 7566 | + * This file is subject to the terms and conditions of the GNU General Public | ||
| 7567 | + * License. See the file COPYING in the main directory of this archive for | ||
| 7568 | + * more details. | ||
| 7569 | + * | ||
| 7570 | + * Copyright (C) 2003 Joshua Wise | ||
| 7571 | + * Copyright (C) 2005 Pawel Kolodziejski | ||
| 7572 | + * Copyright (C) 2006 Paul Sokolovsky | ||
| 7573 | + * | ||
| 7574 | + */ | ||
| 7575 | + | ||
| 7576 | +#include <linux/input.h> | ||
| 7577 | +#include <linux/module.h> | ||
| 7578 | +#include <linux/init.h> | ||
| 7579 | +#include <linux/interrupt.h> | ||
| 7580 | +#include <linux/platform_device.h> | ||
| 7581 | +#include <linux/irq.h> | ||
| 7582 | +#include <linux/soc/asic3_base.h> | ||
| 7583 | +#include <asm/mach/arch.h> | ||
| 7584 | +#include <asm/mach/map.h> | ||
| 7585 | +#include <asm/arch/irqs.h> | ||
| 7586 | +#include <asm/hardware.h> | ||
| 7587 | +#include <asm/hardware/ipaq-asic3.h> | ||
| 7588 | +#include <asm/hardware/asic3_keys.h> | ||
| 7589 | + | ||
| 7590 | +static irqreturn_t asic3_keys_asic_handle(int irq, void *data) | ||
| 7591 | +{ | ||
| 7592 | + struct asic3_keys_platform_data *pdata = data; | ||
| 7593 | + int i, base_irq; | ||
| 7594 | + | ||
| 7595 | + base_irq = asic3_irq_base(pdata->asic3_dev); | ||
| 7596 | + for (i = 0; i < pdata->nbuttons; i++) { | ||
| 7597 | + struct asic3_keys_button *b = &pdata->buttons[i]; | ||
| 7598 | + if ((base_irq + b->gpio) == irq) { | ||
| 7599 | + int state = !!asic3_gpio_get_value(pdata->asic3_dev, b->gpio); | ||
| 7600 | + | ||
| 7601 | + if (pdata->buttons[i].type == EV_SW) | ||
| 7602 | + input_report_switch(pdata->input, pdata->buttons[i].keycode, state ^ b->active_low); | ||
| 7603 | + else | ||
| 7604 | + input_report_key(pdata->input, b->keycode, state ^ b->active_low); | ||
| 7605 | + input_sync(pdata->input); | ||
| 7606 | + } | ||
| 7607 | + } | ||
| 7608 | + | ||
| 7609 | + return IRQ_HANDLED; | ||
| 7610 | +} | ||
| 7611 | + | ||
| 7612 | +static int __devinit asic3_keys_probe(struct platform_device *pdev) | ||
| 7613 | +{ | ||
| 7614 | + struct asic3_keys_platform_data *pdata = pdev->dev.platform_data; | ||
| 7615 | + int i, base_irq; | ||
| 7616 | + int j, ret; | ||
| 7617 | + | ||
| 7618 | + pdata->input = input_allocate_device(); | ||
| 7619 | + | ||
| 7620 | + base_irq = asic3_irq_base(pdata->asic3_dev); | ||
| 7621 | + | ||
| 7622 | + for (i = 0; i < pdata->nbuttons; i++) { | ||
| 7623 | + struct asic3_keys_button *b = &pdata->buttons[i]; | ||
| 7624 | + set_bit(b->keycode, pdata->input->keybit); | ||
| 7625 | + ret=request_irq(base_irq + b->gpio, asic3_keys_asic_handle, SA_SAMPLE_RANDOM, b->desc, pdata); | ||
| 7626 | + if (ret) | ||
| 7627 | + { | ||
| 7628 | + printk(KERN_NOTICE "Failed to allocate asic3_keys irq=%d.\n",b->gpio); | ||
| 7629 | + | ||
| 7630 | + for(j=0; j<i ; j++) | ||
| 7631 | + free_irq(base_irq + pdata->buttons[i].gpio, NULL); | ||
| 7632 | + | ||
| 7633 | + input_unregister_device (pdata->input); | ||
| 7634 | + | ||
| 7635 | + return -ENODEV; | ||
| 7636 | + } | ||
| 7637 | + | ||
| 7638 | + set_irq_type(base_irq + b->gpio, IRQT_BOTHEDGE); | ||
| 7639 | + if (pdata->buttons[i].type == EV_SW) { | ||
| 7640 | + pdata->input->evbit[0] |= BIT(EV_SW); | ||
| 7641 | + set_bit(b->keycode, pdata->input->swbit); | ||
| 7642 | + } else { | ||
| 7643 | + pdata->input->evbit[0] |= BIT(EV_KEY); | ||
| 7644 | + set_bit(b->keycode, pdata->input->keybit); | ||
| 7645 | + } | ||
| 7646 | + } | ||
| 7647 | + | ||
| 7648 | + pdata->input->name = pdev->name; | ||
| 7649 | + input_register_device(pdata->input); | ||
| 7650 | + | ||
| 7651 | + return 0; | ||
| 7652 | +} | ||
| 7653 | + | ||
| 7654 | +static int __devexit asic3_keys_remove(struct platform_device *pdev) | ||
| 7655 | +{ | ||
| 7656 | + struct asic3_keys_platform_data *pdata = pdev->dev.platform_data; | ||
| 7657 | + int i, base_irq; | ||
| 7658 | + | ||
| 7659 | + base_irq = asic3_irq_base(pdata->asic3_dev); | ||
| 7660 | + for (i = 0; i < pdata->nbuttons; i++) { | ||
| 7661 | + free_irq(base_irq + pdata->buttons[i].gpio, NULL); | ||
| 7662 | + } | ||
| 7663 | + | ||
| 7664 | + input_unregister_device(pdata->input); | ||
| 7665 | + | ||
| 7666 | + return 0; | ||
| 7667 | +} | ||
| 7668 | + | ||
| 7669 | + | ||
| 7670 | +static struct platform_driver asic3_keys_driver = { | ||
| 7671 | + .probe = asic3_keys_probe, | ||
| 7672 | + .remove = __devexit_p(asic3_keys_remove), | ||
| 7673 | + .driver = { | ||
| 7674 | + .name = "asic3-keys", | ||
| 7675 | + }, | ||
| 7676 | +}; | ||
| 7677 | + | ||
| 7678 | +static int __init asic3_keys_init(void) | ||
| 7679 | +{ | ||
| 7680 | + return platform_driver_register(&asic3_keys_driver); | ||
| 7681 | +} | ||
| 7682 | + | ||
| 7683 | +static void __exit asic3_keys_exit(void) | ||
| 7684 | +{ | ||
| 7685 | + platform_driver_unregister(&asic3_keys_driver); | ||
| 7686 | +} | ||
| 7687 | + | ||
| 7688 | +module_init(asic3_keys_init); | ||
| 7689 | +module_exit(asic3_keys_exit); | ||
| 7690 | + | ||
| 7691 | +MODULE_AUTHOR("Joshua Wise, Pawel Kolodziejski, Paul Sokolovsky"); | ||
| 7692 | +MODULE_DESCRIPTION("Buttons driver for HTC ASIC3 SoC"); | ||
| 7693 | +MODULE_LICENSE("GPL"); | ||
| 7694 | Index: linux-2.6.26-rc4/include/asm-arm/arch-pxa/irqs.h | ||
| 7695 | =================================================================== | ||
| 7696 | --- linux-2.6.26-rc4.orig/include/asm-arm/arch-pxa/irqs.h 2008-05-26 19:08:11.000000000 +0100 | ||
| 7697 | +++ linux-2.6.26-rc4/include/asm-arm/arch-pxa/irqs.h 2008-06-01 18:49:45.000000000 +0100 | ||
| 7698 | @@ -184,6 +184,8 @@ | ||
| 7699 | defined(CONFIG_MACH_PCM027) || \ | ||
| 7700 | defined(CONFIG_MACH_MAGICIAN) | ||
| 7701 | #define NR_IRQS (IRQ_BOARD_END) | ||
| 7702 | +#elif defined(CONFIG_MACH_HTCUNIVERSAL) | ||
| 7703 | +#define NR_IRQS (IRQ_BOARD_START + 96) | ||
| 7704 | #else | ||
| 7705 | #define NR_IRQS (IRQ_BOARD_START) | ||
| 7706 | #endif | ||
| 7707 | Index: linux-2.6.26-rc4/include/linux/ioport.h | ||
| 7708 | =================================================================== | ||
| 7709 | --- linux-2.6.26-rc4.orig/include/linux/ioport.h 2008-05-26 19:08:11.000000000 +0100 | ||
| 7710 | +++ linux-2.6.26-rc4/include/linux/ioport.h 2008-06-01 18:49:45.000000000 +0100 | ||
| 7711 | @@ -59,6 +59,7 @@ | ||
| 7712 | #define IORESOURCE_IRQ_HIGHLEVEL (1<<2) | ||
| 7713 | #define IORESOURCE_IRQ_LOWLEVEL (1<<3) | ||
| 7714 | #define IORESOURCE_IRQ_SHAREABLE (1<<4) | ||
| 7715 | +#define IORESOURCE_IRQ_SOC_SUBDEVICE (1<<5) | ||
| 7716 | |||
| 7717 | /* ISA PnP DMA specific bits (IORESOURCE_BITS) */ | ||
| 7718 | #define IORESOURCE_DMA_TYPE_MASK (3<<0) | ||
| 7719 | Index: linux-2.6.26-rc4/include/asm-arm/arch-pxa/serial.h | ||
| 7720 | =================================================================== | ||
| 7721 | --- /dev/null 1970-01-01 00:00:00.000000000 +0000 | ||
| 7722 | +++ linux-2.6.26-rc4/include/asm-arm/arch-pxa/serial.h 2008-06-01 18:49:45.000000000 +0100 | ||
| 7723 | @@ -0,0 +1,78 @@ | ||
| 7724 | +/* | ||
| 7725 | + * linux/include/asm-arm/arch-pxa/serial.h | ||
| 7726 | + * | ||
| 7727 | + * Author: Nicolas Pitre | ||
| 7728 | + * Copyright: (C) 2001 MontaVista Software Inc. | ||
| 7729 | + * | ||
| 7730 | + * This program is free software; you can redistribute it and/or modify | ||
| 7731 | + * it under the terms of the GNU General Public License version 2 as | ||
| 7732 | + * published by the Free Software Foundation. | ||
| 7733 | + */ | ||
| 7734 | + | ||
| 7735 | +#include <asm/arch/pxa-regs.h> | ||
| 7736 | + | ||
| 7737 | +#define BAUD_BASE 921600 | ||
| 7738 | + | ||
| 7739 | +/* Standard COM flags */ | ||
| 7740 | +#define STD_COM_FLAGS (ASYNC_SKIP_TEST) | ||
| 7741 | + | ||
| 7742 | +#define STD_SERIAL_PORT_DEFNS \ | ||
| 7743 | + { \ | ||
| 7744 | + type: PORT_PXA, \ | ||
| 7745 | + xmit_fifo_size: 64, \ | ||
| 7746 | + baud_base: BAUD_BASE, \ | ||
| 7747 | + iomem_base: &FFUART, \ | ||
| 7748 | + iomem_reg_shift: 2, \ | ||
| 7749 | + io_type: SERIAL_IO_MEM, \ | ||
| 7750 | + irq: IRQ_FFUART, \ | ||
| 7751 | + flags: STD_COM_FLAGS, \ | ||
| 7752 | + }, { \ | ||
| 7753 | + type: PORT_PXA, \ | ||
| 7754 | + xmit_fifo_size: 64, \ | ||
| 7755 | + baud_base: BAUD_BASE, \ | ||
| 7756 | + iomem_base: &STUART, \ | ||
| 7757 | + iomem_reg_shift: 2, \ | ||
| 7758 | + io_type: SERIAL_IO_MEM, \ | ||
| 7759 | + irq: IRQ_STUART, \ | ||
| 7760 | + flags: STD_COM_FLAGS, \ | ||
| 7761 | + }, { \ | ||
| 7762 | + type: PORT_PXA, \ | ||
| 7763 | + xmit_fifo_size: 64, \ | ||
| 7764 | + baud_base: BAUD_BASE, \ | ||
| 7765 | + iomem_base: &BTUART, \ | ||
| 7766 | + iomem_reg_shift: 2, \ | ||
| 7767 | + io_type: SERIAL_IO_MEM, \ | ||
| 7768 | + irq: IRQ_BTUART, \ | ||
| 7769 | + flags: STD_COM_FLAGS, \ | ||
| 7770 | + } | ||
| 7771 | + | ||
| 7772 | +#define EXTRA_SERIAL_PORT_DEFNS | ||
| 7773 | + | ||
| 7774 | +struct platform_pxa_serial_funcs { | ||
| 7775 | + | ||
| 7776 | + /* Initialize whatever is connected to this serial port. */ | ||
| 7777 | + void (*configure)(int state); | ||
| 7778 | +#define PXA_UART_CFG_PRE_STARTUP 0 | ||
| 7779 | +#define PXA_UART_CFG_POST_STARTUP 1 | ||
| 7780 | +#define PXA_UART_CFG_PRE_SHUTDOWN 2 | ||
| 7781 | +#define PXA_UART_CFG_POST_SHUTDOWN 3 | ||
| 7782 | + | ||
| 7783 | + /* Enable or disable the individual transmitter/receiver submodules. | ||
| 7784 | + * On transceivers without echo cancellation (e.g. SIR) | ||
| 7785 | + * transmitter always has priority; e.g. if both bits are set, | ||
| 7786 | + * only the transmitter is enabled. */ | ||
| 7787 | + void (*set_txrx)(int txrx); | ||
| 7788 | +#define PXA_SERIAL_TX 1 | ||
| 7789 | +#define PXA_SERIAL_RX 2 | ||
| 7790 | + | ||
| 7791 | + /* Get the current state of tx/rx. */ | ||
| 7792 | + int (*get_txrx)(void); | ||
| 7793 | + | ||
| 7794 | + int (*suspend)(struct platform_device *dev, pm_message_t state); | ||
| 7795 | + int (*resume)(struct platform_device *dev); | ||
| 7796 | +}; | ||
| 7797 | + | ||
| 7798 | +void pxa_set_ffuart_info(struct platform_pxa_serial_funcs *ffuart_funcs); | ||
| 7799 | +void pxa_set_btuart_info(struct platform_pxa_serial_funcs *btuart_funcs); | ||
| 7800 | +void pxa_set_stuart_info(struct platform_pxa_serial_funcs *stuart_funcs); | ||
| 7801 | +void pxa_set_hwuart_info(struct platform_pxa_serial_funcs *hwuart_funcs); | ||
| 7802 | Index: linux-2.6.26-rc4/drivers/serial/pxa.c | ||
| 7803 | =================================================================== | ||
| 7804 | --- linux-2.6.26-rc4.orig/drivers/serial/pxa.c 2008-05-26 19:08:11.000000000 +0100 | ||
| 7805 | +++ linux-2.6.26-rc4/drivers/serial/pxa.c 2008-06-01 18:49:45.000000000 +0100 | ||
| 7806 | @@ -47,6 +47,7 @@ | ||
| 7807 | #include <asm/io.h> | ||
| 7808 | #include <asm/hardware.h> | ||
| 7809 | #include <asm/irq.h> | ||
| 7810 | +#include <asm/arch/serial.h> | ||
| 7811 | #include <asm/arch/pxa-regs.h> | ||
| 7812 | |||
| 7813 | |||
| 7814 | @@ -60,6 +61,14 @@ | ||
| 7815 | char *name; | ||
| 7816 | }; | ||
| 7817 | |||
| 7818 | + | ||
| 7819 | +#define IS_METHOD(dev, method) (dev && (dev)->platform_data && ((struct platform_pxa_serial_funcs *)(dev)->platform_data)->method) | ||
| 7820 | +#define METHOD_CALL(dev, method) \ | ||
| 7821 | + ((struct platform_pxa_serial_funcs *)(dev)->platform_data)->method() | ||
| 7822 | +#define SAFE_METHOD_CALL(dev, method, args...) \ | ||
| 7823 | + if (IS_METHOD(dev, method)) \ | ||
| 7824 | + ((struct platform_pxa_serial_funcs *)(dev)->platform_data)->method(args) | ||
| 7825 | + | ||
| 7826 | static inline unsigned int serial_in(struct uart_pxa_port *up, int offset) | ||
| 7827 | { | ||
| 7828 | offset <<= 2; | ||
| 7829 | @@ -347,6 +356,9 @@ | ||
| 7830 | unsigned long flags; | ||
| 7831 | int retval; | ||
| 7832 | |||
| 7833 | + /* Perform platform-specific port initialization, if needed. */ | ||
| 7834 | + SAFE_METHOD_CALL(port->dev, configure, PXA_UART_CFG_PRE_STARTUP); | ||
| 7835 | + | ||
| 7836 | if (port->line == 3) /* HWUART */ | ||
| 7837 | up->mcr |= UART_MCR_AFE; | ||
| 7838 | else | ||
| 7839 | @@ -404,6 +416,12 @@ | ||
| 7840 | (void) serial_in(up, UART_IIR); | ||
| 7841 | (void) serial_in(up, UART_MSR); | ||
| 7842 | |||
| 7843 | + /* | ||
| 7844 | + * Perform platform-specific port initialization if needed | ||
| 7845 | + */ | ||
| 7846 | + SAFE_METHOD_CALL(port->dev, configure, PXA_UART_CFG_POST_STARTUP); | ||
| 7847 | + SAFE_METHOD_CALL(port->dev, set_txrx, PXA_SERIAL_RX); | ||
| 7848 | + | ||
| 7849 | return 0; | ||
| 7850 | } | ||
| 7851 | |||
| 7852 | @@ -412,6 +430,8 @@ | ||
| 7853 | struct uart_pxa_port *up = (struct uart_pxa_port *)port; | ||
| 7854 | unsigned long flags; | ||
| 7855 | |||
| 7856 | + SAFE_METHOD_CALL(port->dev, configure, PXA_UART_CFG_PRE_SHUTDOWN); | ||
| 7857 | + | ||
| 7858 | free_irq(up->port.irq, up); | ||
| 7859 | |||
| 7860 | /* | ||
| 7861 | @@ -433,6 +453,8 @@ | ||
| 7862 | UART_FCR_CLEAR_RCVR | | ||
| 7863 | UART_FCR_CLEAR_XMIT); | ||
| 7864 | serial_out(up, UART_FCR, 0); | ||
| 7865 | + | ||
| 7866 | + SAFE_METHOD_CALL(port->dev, configure, PXA_UART_CFG_POST_SHUTDOWN); | ||
| 7867 | } | ||
| 7868 | |||
| 7869 | static void | ||
| 7870 | Index: linux-2.6.26-rc4/drivers/leds/Makefile | ||
| 7871 | =================================================================== | ||
| 7872 | --- linux-2.6.26-rc4.orig/drivers/leds/Makefile 2008-05-26 19:08:11.000000000 +0100 | ||
| 7873 | +++ linux-2.6.26-rc4/drivers/leds/Makefile 2008-06-01 18:49:45.000000000 +0100 | ||
| 7874 | @@ -14,6 +14,7 @@ | ||
| 7875 | obj-$(CONFIG_LEDS_NET48XX) += leds-net48xx.o | ||
| 7876 | obj-$(CONFIG_LEDS_WRAP) += leds-wrap.o | ||
| 7877 | obj-$(CONFIG_LEDS_H1940) += leds-h1940.o | ||
| 7878 | +obj-$(CONFIG_LEDS_ASIC3) += leds-asic3.o | ||
| 7879 | obj-$(CONFIG_LEDS_COBALT_QUBE) += leds-cobalt-qube.o | ||
| 7880 | obj-$(CONFIG_LEDS_COBALT_RAQ) += leds-cobalt-raq.o | ||
| 7881 | obj-$(CONFIG_LEDS_GPIO) += leds-gpio.o | ||
| 7882 | Index: linux-2.6.26-rc4/drivers/input/keyboard/Kconfig | ||
| 7883 | =================================================================== | ||
| 7884 | --- linux-2.6.26-rc4.orig/drivers/input/keyboard/Kconfig 2008-05-26 19:08:11.000000000 +0100 | ||
| 7885 | +++ linux-2.6.26-rc4/drivers/input/keyboard/Kconfig 2008-06-01 18:52:13.000000000 +0100 | ||
| 7886 | @@ -132,6 +132,13 @@ | ||
| 7887 | To compile this driver as a module, choose M here: the | ||
| 7888 | module will be called stowaway. | ||
| 7889 | |||
| 7890 | +config KEYBOARD_ASIC3 | ||
| 7891 | + tristate "Buttons on ASIC3 SoC GPIOs (iPaqs, etc.)" | ||
| 7892 | + depends on HTC_ASIC3 | ||
| 7893 | + help | ||
| 7894 | + This enables support for the buttons attached to GPIOs of | ||
| 7895 | + HTC ASIC3 peripheral controller. | ||
| 7896 | + | ||
| 7897 | config KEYBOARD_CORGI | ||
| 7898 | tristate "Corgi keyboard" | ||
| 7899 | depends on PXA_SHARPSL | ||
diff --git a/meta/packages/linux/linux-rp-2.6.25+2.6.26-rc4/pxa-serial-hack.patch b/meta/packages/linux/linux-rp-2.6.25+2.6.26-rc4/pxa-serial-hack.patch new file mode 100644 index 0000000000..bf20f46a05 --- /dev/null +++ b/meta/packages/linux/linux-rp-2.6.25+2.6.26-rc4/pxa-serial-hack.patch | |||
| @@ -0,0 +1,90 @@ | |||
| 1 | --- | ||
| 2 | drivers/serial/8250.c | 5 +++++ | ||
| 3 | drivers/serial/serial_core.c | 1 + | ||
| 4 | drivers/serial/serial_cs.c | 12 +++++++++--- | ||
| 5 | include/linux/serial_core.h | 1 + | ||
| 6 | 4 files changed, 16 insertions(+), 3 deletions(-) | ||
| 7 | |||
| 8 | Index: linux-2.6.20/drivers/serial/8250.c | ||
| 9 | =================================================================== | ||
| 10 | --- linux-2.6.20.orig/drivers/serial/8250.c 2007-04-27 13:37:26.000000000 +0100 | ||
| 11 | +++ linux-2.6.20/drivers/serial/8250.c 2007-04-27 13:38:16.000000000 +0100 | ||
| 12 | @@ -2429,7 +2429,12 @@ | ||
| 13 | .driver_name = "serial", | ||
| 14 | .dev_name = "ttyS", | ||
| 15 | .major = TTY_MAJOR, | ||
| 16 | +#ifdef CONFIG_SERIAL_PXA | ||
| 17 | + .minor = 64 + 4, | ||
| 18 | + .name_base = 4, | ||
| 19 | +#else | ||
| 20 | .minor = 64, | ||
| 21 | +#endif | ||
| 22 | .nr = UART_NR, | ||
| 23 | .cons = SERIAL8250_CONSOLE, | ||
| 24 | }; | ||
| 25 | Index: linux-2.6.20/drivers/serial/serial_core.c | ||
| 26 | =================================================================== | ||
| 27 | --- linux-2.6.20.orig/drivers/serial/serial_core.c 2007-02-04 18:44:54.000000000 +0000 | ||
| 28 | +++ linux-2.6.20/drivers/serial/serial_core.c 2007-04-27 13:39:39.000000000 +0100 | ||
| 29 | @@ -2068,7 +2068,8 @@ | ||
| 30 | printk(KERN_INFO "%s%s%s%d at %s (irq = %d) is a %s\n", | ||
| 31 | port->dev ? port->dev->bus_id : "", | ||
| 32 | port->dev ? ": " : "", | ||
| 33 | - drv->dev_name, port->line, address, port->irq, uart_type(port)); | ||
| 34 | + drv->dev_name, port->line + drv->name_base, address, port->irq, | ||
| 35 | + uart_type(port)); | ||
| 36 | } | ||
| 37 | |||
| 38 | static void | ||
| 39 | @@ -2183,6 +2184,7 @@ | ||
| 40 | normal->owner = drv->owner; | ||
| 41 | normal->driver_name = drv->driver_name; | ||
| 42 | normal->name = drv->dev_name; | ||
| 43 | + normal->name_base = drv->name_base; | ||
| 44 | normal->major = drv->major; | ||
| 45 | normal->minor_start = drv->minor; | ||
| 46 | normal->type = TTY_DRIVER_TYPE_SERIAL; | ||
| 47 | Index: linux-2.6.20/include/linux/serial_core.h | ||
| 48 | =================================================================== | ||
| 49 | --- linux-2.6.20.orig/include/linux/serial_core.h 2007-02-04 18:44:54.000000000 +0000 | ||
| 50 | +++ linux-2.6.20/include/linux/serial_core.h 2007-04-27 13:37:27.000000000 +0100 | ||
| 51 | @@ -341,6 +341,7 @@ | ||
| 52 | struct module *owner; | ||
| 53 | const char *driver_name; | ||
| 54 | const char *dev_name; | ||
| 55 | + int name_base; | ||
| 56 | int major; | ||
| 57 | int minor; | ||
| 58 | int nr; | ||
| 59 | Index: linux-2.6.20/drivers/serial/serial_cs.c | ||
| 60 | =================================================================== | ||
| 61 | --- linux-2.6.20.orig/drivers/serial/serial_cs.c 2007-02-04 18:44:54.000000000 +0000 | ||
| 62 | +++ linux-2.6.20/drivers/serial/serial_cs.c 2007-04-27 13:40:34.000000000 +0100 | ||
| 63 | @@ -390,7 +390,7 @@ | ||
| 64 | kio_addr_t iobase, int irq) | ||
| 65 | { | ||
| 66 | struct uart_port port; | ||
| 67 | - int line; | ||
| 68 | + int line, linestart; | ||
| 69 | |||
| 70 | memset(&port, 0, sizeof (struct uart_port)); | ||
| 71 | port.iobase = iobase; | ||
| 72 | @@ -411,10 +411,16 @@ | ||
| 73 | return -EINVAL; | ||
| 74 | } | ||
| 75 | |||
| 76 | +#if CONFIG_SERIAL_PXA | ||
| 77 | + linestart = 4; | ||
| 78 | +#else | ||
| 79 | + linestart = 0; | ||
| 80 | +#endif | ||
| 81 | + | ||
| 82 | info->line[info->ndev] = line; | ||
| 83 | - sprintf(info->node[info->ndev].dev_name, "ttyS%d", line); | ||
| 84 | + sprintf(info->node[info->ndev].dev_name, "ttyS%d", line+linestart); | ||
| 85 | info->node[info->ndev].major = TTY_MAJOR; | ||
| 86 | - info->node[info->ndev].minor = 0x40 + line; | ||
| 87 | + info->node[info->ndev].minor = 0x40 + line + linestart; | ||
| 88 | if (info->ndev > 0) | ||
| 89 | info->node[info->ndev - 1].next = &info->node[info->ndev]; | ||
| 90 | info->ndev++; | ||
diff --git a/meta/packages/linux/linux-rp-2.6.25+2.6.26-rc4/pxa_fb_overlay.patch b/meta/packages/linux/linux-rp-2.6.25+2.6.26-rc4/pxa_fb_overlay.patch new file mode 100644 index 0000000000..49c59b3275 --- /dev/null +++ b/meta/packages/linux/linux-rp-2.6.25+2.6.26-rc4/pxa_fb_overlay.patch | |||
| @@ -0,0 +1,26 @@ | |||
| 1 | --- | ||
| 2 | drivers/video/pxafb.h | 4 ++-- | ||
| 3 | 1 file changed, 2 insertions(+), 2 deletions(-) | ||
| 4 | |||
| 5 | Index: linux-2.6.22/drivers/video/pxafb.h | ||
| 6 | =================================================================== | ||
| 7 | --- linux-2.6.22.orig/drivers/video/pxafb.h 2007-09-25 15:44:42.000000000 +0200 | ||
| 8 | +++ linux-2.6.22/drivers/video/pxafb.h 2007-09-25 15:45:07.000000000 +0200 | ||
| 9 | @@ -36,7 +36,7 @@ | ||
| 10 | struct fb_bitfield transp; | ||
| 11 | }; | ||
| 12 | |||
| 13 | -#ifdef CONFIG_PXA27x | ||
| 14 | +#if defined(CONFIG_PXA27x) || defined(CONFIG_PXA3xx) | ||
| 15 | /* PXA Overlay Framebuffer Support */ | ||
| 16 | struct overlayfb_info | ||
| 17 | { | ||
| 18 | @@ -142,7 +142,7 @@ | ||
| 19 | wait_queue_head_t ctrlr_wait; | ||
| 20 | struct work_struct task; | ||
| 21 | |||
| 22 | -#ifdef CONFIG_PXA27x | ||
| 23 | +#if defined(CONFIG_PXA27x) || defined(CONFIG_PXA3xx) | ||
| 24 | /* PXA Overlay Framebuffer Support */ | ||
| 25 | struct overlayfb_info *overlay1fb; | ||
| 26 | struct overlayfb_info *overlay2fb; | ||
diff --git a/meta/packages/linux/linux-rp-2.6.25+2.6.26-rc4/serial-add-support-for-non-standard-xtals-to-16c950-driver.patch b/meta/packages/linux/linux-rp-2.6.25+2.6.26-rc4/serial-add-support-for-non-standard-xtals-to-16c950-driver.patch new file mode 100644 index 0000000000..b513ba1466 --- /dev/null +++ b/meta/packages/linux/linux-rp-2.6.25+2.6.26-rc4/serial-add-support-for-non-standard-xtals-to-16c950-driver.patch | |||
| @@ -0,0 +1,155 @@ | |||
| 1 | |||
| 2 | From: Petr Vandrovec <vandrove@vc.cvut.cz> | ||
| 3 | |||
| 4 | Patch below adds support for using different prescaler than 16 for 16c950 | ||
| 5 | chips. This is needed for using Fujitsu-Siemens Connect2Air compact-flash | ||
| 6 | card, which comes (apparently) with 806kHz clocks, and so you have to | ||
| 7 | program prescaler for division by 7, and DLAB to 1, to get 115200Bd. | ||
| 8 | |||
| 9 | To get card properly running you also have to add lines below to | ||
| 10 | /etc/pcmcia/serial.opts so kernel knows that base speed is not 115200 but | ||
| 11 | 50400 (50400 * 16 = 806400; 806400 / 7 = 115200). As I've found no code | ||
| 12 | specifying baud_rate in serial_cs, I assume that specifying it in | ||
| 13 | serial.opts is right way to do this type of things. | ||
| 14 | |||
| 15 | Patch also fixes problem that for UPF_MAGIC_MULTIPLIER maximum possible | ||
| 16 | baud rate passed to uart code was uartclk / 16 while correct value for | ||
| 17 | these devices (and for 16c950) is uartclk / 4. | ||
| 18 | |||
| 19 | Patch also fixes problem that for UPF_MAGIC_MULTIPLIER devices with | ||
| 20 | baud_rate 19200 or 9600 spd_cust did not work correctly. Not that such | ||
| 21 | devices exist, but we should not ignore spd_cust, user probably knows why | ||
| 22 | he asked for spd_cust. | ||
| 23 | |||
| 24 | serial.opts: | ||
| 25 | |||
| 26 | case "$MANFID-$FUNCID-$PRODID_1-$PRODID_2-$PRODID_3-$PRODID_4" in | ||
| 27 | '0279,950b-2-GPRS Modem---') | ||
| 28 | SERIAL_OPTS="baud_base 50400" | ||
| 29 | ;; | ||
| 30 | esac | ||
| 31 | |||
| 32 | Cc: David Woodhouse <dwmw2@infradead.org> | ||
| 33 | Signed-off-by: Andrew Morton <akpm@osdl.org> | ||
| 34 | --- | ||
| 35 | |||
| 36 | drivers/serial/8250.c | 82 +++++++++++++++++++++++++++++++++++++++----------- | ||
| 37 | 1 file changed, 64 insertions(+), 18 deletions(-) | ||
| 38 | |||
| 39 | Index: linux-2.6.21/drivers/serial/8250.c | ||
| 40 | =================================================================== | ||
| 41 | --- linux-2.6.21.orig/drivers/serial/8250.c 2007-07-01 16:59:52.000000000 +0100 | ||
| 42 | +++ linux-2.6.21/drivers/serial/8250.c 2007-07-01 17:01:21.000000000 +0100 | ||
| 43 | @@ -1964,24 +1964,58 @@ static void serial8250_shutdown(struct u | ||
| 44 | serial_unlink_irq_chain(up); | ||
| 45 | } | ||
| 46 | |||
| 47 | -static unsigned int serial8250_get_divisor(struct uart_port *port, unsigned int baud) | ||
| 48 | +static unsigned int serial8250_get_divisor(struct uart_port *port, unsigned int baud, | ||
| 49 | + unsigned int *prescaler) | ||
| 50 | { | ||
| 51 | - unsigned int quot; | ||
| 52 | - | ||
| 53 | - /* | ||
| 54 | - * Handle magic divisors for baud rates above baud_base on | ||
| 55 | - * SMSC SuperIO chips. | ||
| 56 | + /* | ||
| 57 | + * Use special handling only if user did not supply its own divider. | ||
| 58 | + * spd_cust is defined in terms of baud_base, so always use default | ||
| 59 | + * prescaler when spd_cust is requested. | ||
| 60 | */ | ||
| 61 | - if ((port->flags & UPF_MAGIC_MULTIPLIER) && | ||
| 62 | - baud == (port->uartclk/4)) | ||
| 63 | - quot = 0x8001; | ||
| 64 | - else if ((port->flags & UPF_MAGIC_MULTIPLIER) && | ||
| 65 | - baud == (port->uartclk/8)) | ||
| 66 | - quot = 0x8002; | ||
| 67 | - else | ||
| 68 | - quot = uart_get_divisor(port, baud); | ||
| 69 | |||
| 70 | - return quot; | ||
| 71 | + *prescaler = 16; | ||
| 72 | + if (baud != 38400 || (port->flags & UPF_SPD_MASK) != UPF_SPD_CUST) { | ||
| 73 | + unsigned int quot = port->uartclk / baud; | ||
| 74 | + | ||
| 75 | + /* | ||
| 76 | + * Handle magic divisors for baud rates above baud_base on | ||
| 77 | + * SMSC SuperIO chips. | ||
| 78 | + */ | ||
| 79 | + if (port->flags & UPF_MAGIC_MULTIPLIER) { | ||
| 80 | + if (quot == 4) { | ||
| 81 | + return 0x8001; | ||
| 82 | + } else if (quot == 8) { | ||
| 83 | + return 0x8002; | ||
| 84 | + } | ||
| 85 | + } | ||
| 86 | + if (port->type == PORT_16C950) { | ||
| 87 | + /* | ||
| 88 | + * This computes TCR value (4 to 16), not CPR value (which can | ||
| 89 | + * be between 1.000 and 31.875) - chip I have uses XTAL of | ||
| 90 | + * 806400Hz, and so a division by 7 is required to get 115200Bd. | ||
| 91 | + * I'm leaving CPR disabled for now, until someone will | ||
| 92 | + * hit even more exotic XTAL (it is needed to get 500kbps | ||
| 93 | + * or 1000kbps from 18.432MHz XTAL, but I have no device | ||
| 94 | + * which would benefit from doing that). | ||
| 95 | + * | ||
| 96 | + * If we can use divide by 16, use it. Otherwise look for | ||
| 97 | + * better prescaler, from 15 to 4. If quotient cannot | ||
| 98 | + * be divided by any integer value between 4 and 15, use 4. | ||
| 99 | + */ | ||
| 100 | + if (quot & 0x0F) { | ||
| 101 | + unsigned int div; | ||
| 102 | + | ||
| 103 | + for (div = 15; div > 4; div--) { | ||
| 104 | + if (quot % div == 0) { | ||
| 105 | + break; | ||
| 106 | + } | ||
| 107 | + } | ||
| 108 | + *prescaler = div; | ||
| 109 | + return quot / div; | ||
| 110 | + } | ||
| 111 | + } | ||
| 112 | + } | ||
| 113 | + return uart_get_divisor(port, baud); | ||
| 114 | } | ||
| 115 | |||
| 116 | static void | ||
| 117 | @@ -1991,7 +2025,7 @@ serial8250_set_termios(struct uart_port | ||
| 118 | struct uart_8250_port *up = (struct uart_8250_port *)port; | ||
| 119 | unsigned char cval, fcr = 0; | ||
| 120 | unsigned long flags; | ||
| 121 | - unsigned int baud, quot; | ||
| 122 | + unsigned int baud, quot, prescaler; | ||
| 123 | |||
| 124 | switch (termios->c_cflag & CSIZE) { | ||
| 125 | case CS5: | ||
| 126 | @@ -2023,8 +2057,13 @@ serial8250_set_termios(struct uart_port | ||
| 127 | /* | ||
| 128 | * Ask the core to calculate the divisor for us. | ||
| 129 | */ | ||
| 130 | - baud = uart_get_baud_rate(port, termios, old, 0, port->uartclk/16); | ||
| 131 | - quot = serial8250_get_divisor(port, baud); | ||
| 132 | + if (port->type == PORT_16C950 || (port->flags & UPF_MAGIC_MULTIPLIER)) { | ||
| 133 | + baud = uart_get_baud_rate(port, termios, old, 0, port->uartclk/4); | ||
| 134 | + } else { | ||
| 135 | + baud = uart_get_baud_rate(port, termios, old, 0, port->uartclk/16); | ||
| 136 | + } | ||
| 137 | + quot = serial8250_get_divisor(port, baud, &prescaler); | ||
| 138 | + | ||
| 139 | |||
| 140 | /* | ||
| 141 | * Oxford Semi 952 rev B workaround | ||
| 142 | @@ -2139,6 +2178,13 @@ serial8250_set_termios(struct uart_port | ||
| 143 | serial_dl_write(up, quot); | ||
| 144 | |||
| 145 | /* | ||
| 146 | + * Program prescaler for 16C950 chips. | ||
| 147 | + */ | ||
| 148 | + if (up->port.type == PORT_16C950) { | ||
| 149 | + serial_icr_write(up, UART_TCR, prescaler == 16 ? 0 : prescaler); | ||
| 150 | + } | ||
| 151 | + | ||
| 152 | + /* | ||
| 153 | * LCR DLAB must be set to enable 64-byte FIFO mode. If the FCR | ||
| 154 | * is written without DLAB set, this mode will be disabled. | ||
| 155 | */ | ||
diff --git a/meta/packages/linux/linux-rp-2.6.25+2.6.26-rc4/sharpsl-rc-r1.patch b/meta/packages/linux/linux-rp-2.6.25+2.6.26-rc4/sharpsl-rc-r1.patch new file mode 100644 index 0000000000..93fac307aa --- /dev/null +++ b/meta/packages/linux/linux-rp-2.6.25+2.6.26-rc4/sharpsl-rc-r1.patch | |||
| @@ -0,0 +1,555 @@ | |||
| 1 | This patch adds support for Sharp CE-RH2 on Spitz. | ||
| 2 | |||
| 3 | It is not clean enough to be upstreamed: | ||
| 4 | - It is a bit syslog-noisy. | ||
| 5 | - Does not support other Zaurus models. | ||
| 6 | - Maybe split to more parts: | ||
| 7 | * MAX1111 driver | ||
| 8 | * linear input device | ||
| 9 | * virtual keyboard on top of linear input device | ||
| 10 | |||
| 11 | Index: linux-2.6.26-rc4/arch/arm/mach-pxa/spitz.c | ||
| 12 | =================================================================== | ||
| 13 | --- linux-2.6.26-rc4.orig/arch/arm/mach-pxa/spitz.c 2008-06-02 00:20:03.000000000 +0100 | ||
| 14 | +++ linux-2.6.26-rc4/arch/arm/mach-pxa/spitz.c 2008-06-02 00:20:05.000000000 +0100 | ||
| 15 | @@ -261,6 +261,13 @@ | ||
| 16 | .id = -1, | ||
| 17 | }; | ||
| 18 | |||
| 19 | +/* | ||
| 20 | + * Spitz Remote Control Device | ||
| 21 | + */ | ||
| 22 | +static struct platform_device sharpsl_rc_device = { | ||
| 23 | + .name = "sharpsl-remote-control", | ||
| 24 | + .id = -1, | ||
| 25 | +}; | ||
| 26 | |||
| 27 | /* | ||
| 28 | * Spitz LEDs | ||
| 29 | @@ -522,6 +529,7 @@ | ||
| 30 | &spitzscoop_device, | ||
| 31 | &spitzssp_device, | ||
| 32 | &spitzkbd_device, | ||
| 33 | + &sharpsl_rc_device, | ||
| 34 | &spitzts_device, | ||
| 35 | &spitzbl_device, | ||
| 36 | &spitzled_device, | ||
| 37 | Index: linux-2.6.26-rc4/drivers/input/keyboard/Kconfig | ||
| 38 | =================================================================== | ||
| 39 | --- linux-2.6.26-rc4.orig/drivers/input/keyboard/Kconfig 2008-06-02 00:20:03.000000000 +0100 | ||
| 40 | +++ linux-2.6.26-rc4/drivers/input/keyboard/Kconfig 2008-06-02 09:46:10.000000000 +0100 | ||
| 41 | @@ -175,6 +175,17 @@ | ||
| 42 | |||
| 43 | Say Y only if you know, what you are doing! | ||
| 44 | |||
| 45 | +config SHARPSL_RC | ||
| 46 | + tristate "Sharp SL-Cxx00 Remote Control" | ||
| 47 | + depends on PXA_SHARPSL | ||
| 48 | + default y | ||
| 49 | + help | ||
| 50 | + Say Y here to enable the remote on the Sharp Zaurus SL-Cxx00, | ||
| 51 | + SL-C1000, SL-C3000 and Sl-C3100 series of PDAs. | ||
| 52 | + | ||
| 53 | + To compile this driver as a module, choose M here: the | ||
| 54 | + module will be called sharpsl_rc. | ||
| 55 | + | ||
| 56 | config KEYBOARD_AMIGA | ||
| 57 | tristate "Amiga keyboard" | ||
| 58 | depends on AMIGA | ||
| 59 | Index: linux-2.6.26-rc4/drivers/input/keyboard/Makefile | ||
| 60 | =================================================================== | ||
| 61 | --- linux-2.6.26-rc4.orig/drivers/input/keyboard/Makefile 2008-06-02 00:20:03.000000000 +0100 | ||
| 62 | +++ linux-2.6.26-rc4/drivers/input/keyboard/Makefile 2008-06-02 09:46:10.000000000 +0100 | ||
| 63 | @@ -26,4 +26,5 @@ | ||
| 64 | obj-$(CONFIG_KEYBOARD_HP7XX) += jornada720_kbd.o | ||
| 65 | obj-$(CONFIG_KEYBOARD_MAPLE) += maple_keyb.o | ||
| 66 | obj-$(CONFIG_KEYBOARD_BFIN) += bf54x-keys.o | ||
| 67 | +obj-$(CONFIG_SHARPSL_RC) += sharpsl_rc.o | ||
| 68 | obj-$(CONFIG_KEYBOARD_SH_KEYSC) += sh_keysc.o | ||
| 69 | Index: linux-2.6.26-rc4/drivers/input/keyboard/sharpsl_rc.c | ||
| 70 | =================================================================== | ||
| 71 | --- /dev/null 1970-01-01 00:00:00.000000000 +0000 | ||
| 72 | +++ linux-2.6.26-rc4/drivers/input/keyboard/sharpsl_rc.c 2008-06-02 09:47:39.000000000 +0100 | ||
| 73 | @@ -0,0 +1,319 @@ | ||
| 74 | +/* | ||
| 75 | + * Keyboard driver for Sharp Clamshell Models (SL-Cxx00) | ||
| 76 | + * | ||
| 77 | + * Copyright (c) 2004-2005 Richard Purdie | ||
| 78 | + * | ||
| 79 | + * Based on corgikbd.c and Sharp's RC driver | ||
| 80 | + * | ||
| 81 | + * This program is free software; you can redistribute it and/or modify | ||
| 82 | + * it under the terms of the GNU General Public License version 2 as | ||
| 83 | + * published by the Free Software Foundation. | ||
| 84 | + * | ||
| 85 | + */ | ||
| 86 | + | ||
| 87 | +#define DEBUG 1 | ||
| 88 | +#include <linux/delay.h> | ||
| 89 | +#include <linux/platform_device.h> | ||
| 90 | +#include <linux/init.h> | ||
| 91 | +#include <linux/input.h> | ||
| 92 | +#include <linux/interrupt.h> | ||
| 93 | +#include <linux/jiffies.h> | ||
| 94 | +#include <linux/module.h> | ||
| 95 | +#include <linux/slab.h> | ||
| 96 | + | ||
| 97 | +#include <asm/mach-types.h> | ||
| 98 | +#include <asm/arch/spitz.h> | ||
| 99 | +#include <asm/arch/akita.h> | ||
| 100 | +#include <asm/arch/corgi.h> | ||
| 101 | + | ||
| 102 | +#include <asm/arch/hardware.h> | ||
| 103 | +#include <asm/arch/pxa-regs.h> | ||
| 104 | +#include <asm/arch/pxa2xx-gpio.h> | ||
| 105 | +#include <asm/hardware/scoop.h> | ||
| 106 | +#include <asm/arch/sharpsl.h> | ||
| 107 | +#include <asm/hardware/sharpsl_pm.h> | ||
| 108 | + | ||
| 109 | +#define DPRINTK(fmt, args...) dev_dbg(data->dev, fmt "\n", ##args) | ||
| 110 | + | ||
| 111 | +struct remote_control_key { | ||
| 112 | + unsigned char min; | ||
| 113 | + unsigned char max; | ||
| 114 | + unsigned char key; | ||
| 115 | +}; | ||
| 116 | + | ||
| 117 | +static struct remote_control_key remote_keys_spitz[] = { | ||
| 118 | + /* CE-RH2 values */ | ||
| 119 | + { 25, 35, KEY_STOPCD}, | ||
| 120 | + { 55, 65, KEY_PLAYPAUSE}, | ||
| 121 | + { 85, 95, KEY_NEXTSONG}, | ||
| 122 | + { 115, 125, KEY_VOLUMEUP}, | ||
| 123 | + { 145, 155, KEY_PREVIOUSSONG}, | ||
| 124 | + { 180, 190, KEY_MUTE}, | ||
| 125 | + { 215, 225, KEY_VOLUMEDOWN}, | ||
| 126 | +}; | ||
| 127 | +static struct remote_control_key remote_keys_corgi[] = { | ||
| 128 | + /* CE-RH1 values */ | ||
| 129 | + { 27, 35, KEY_STOPCD}, | ||
| 130 | + { 7, 13, KEY_PLAYPAUSE}, | ||
| 131 | + { 77, 93, KEY_NEXTSONG}, | ||
| 132 | + { 115, 132, KEY_VOLUMEUP}, | ||
| 133 | + { 46, 58, KEY_PREVIOUSSONG}, | ||
| 134 | + { 170, 186, KEY_VOLUMEDOWN}, | ||
| 135 | +}; | ||
| 136 | + | ||
| 137 | +#define RELEASE_HI 230 | ||
| 138 | +#define MAX_EARPHONE 6 | ||
| 139 | +#define RC_POLL_MS 10 | ||
| 140 | +#define RC_FINISH_MS 500 | ||
| 141 | +#define WAIT_STATE 3 | ||
| 142 | +#define NOISE_THRESHOLD 100 | ||
| 143 | + | ||
| 144 | +struct sharpsl_rc { | ||
| 145 | + struct input_dev *input; | ||
| 146 | + struct device *dev; | ||
| 147 | + | ||
| 148 | + spinlock_t lock; | ||
| 149 | + struct timer_list rctimer; | ||
| 150 | + struct timer_list rctimer_finish; | ||
| 151 | + | ||
| 152 | + unsigned int handling_press; | ||
| 153 | + unsigned int noise; | ||
| 154 | + unsigned int state; | ||
| 155 | + unsigned int last_key; | ||
| 156 | +}; | ||
| 157 | + | ||
| 158 | +static int get_remocon_raw(void) | ||
| 159 | +{ | ||
| 160 | + int i, val; | ||
| 161 | + struct remote_control_key *remote_keys; | ||
| 162 | + | ||
| 163 | + if (machine_is_borzoi() || machine_is_spitz() || machine_is_akita()) | ||
| 164 | + remote_keys = remote_keys_spitz; | ||
| 165 | + else | ||
| 166 | + remote_keys = remote_keys_corgi; | ||
| 167 | + | ||
| 168 | + val = sharpsl_pm_pxa_read_max1111(MAX1111_REMCOM); | ||
| 169 | + for (i = 0; i < (machine_is_borzoi() || machine_is_spitz() || machine_is_akita() ? | ||
| 170 | + ARRAY_SIZE(remote_keys_spitz) : ARRAY_SIZE(remote_keys_corgi)); | ||
| 171 | + ++i) { | ||
| 172 | + if (val >= remote_keys[i].min | ||
| 173 | + && val <= remote_keys[i].max) { | ||
| 174 | + printk("get_remocon_raw: VAL=%i, KEY=%i\n", val, remote_keys[i].key); | ||
| 175 | + return remote_keys[i].key; | ||
| 176 | + } | ||
| 177 | + } | ||
| 178 | + return 0; | ||
| 179 | +} | ||
| 180 | + | ||
| 181 | +static irqreturn_t sharpsl_rc_interrupt(int irq, void *dev_id) | ||
| 182 | +{ | ||
| 183 | + struct sharpsl_rc *data = dev_id; | ||
| 184 | + DPRINTK("sharpsl_rc_interrupt %d\n", irq); | ||
| 185 | + if (!data->handling_press) { | ||
| 186 | + DPRINTK("handling interrupt"); | ||
| 187 | + data->handling_press = 1; | ||
| 188 | + data->noise = 0; | ||
| 189 | + data->state = 0; | ||
| 190 | + data->last_key = 0; | ||
| 191 | + | ||
| 192 | + if (machine_is_borzoi() || machine_is_spitz()) | ||
| 193 | + reset_scoop_gpio(platform_scoop_config->devs[1].dev, SPITZ_SCP2_AKIN_PULLUP); | ||
| 194 | + else if (machine_is_akita()) | ||
| 195 | + akita_reset_ioexp(&akitaioexp_device.dev, AKITA_IOEXP_AKIN_PULLUP); | ||
| 196 | + else | ||
| 197 | + reset_scoop_gpio(platform_scoop_config->devs[0].dev, CORGI_SCP_AKIN_PULLUP); | ||
| 198 | + mod_timer(&data->rctimer, jiffies + msecs_to_jiffies(RC_POLL_MS)); | ||
| 199 | + } | ||
| 200 | + return IRQ_HANDLED; | ||
| 201 | +} | ||
| 202 | + | ||
| 203 | +static void sharpsl_rc_timer_callback(unsigned long dataPtr) | ||
| 204 | +{ | ||
| 205 | + struct sharpsl_rc *data = (struct sharpsl_rc *) dataPtr; | ||
| 206 | + int timer = 1; | ||
| 207 | + int key = get_remocon_raw(); | ||
| 208 | + DPRINTK("timer callback, key: %d", key); | ||
| 209 | + | ||
| 210 | + //wait for value to stabilize | ||
| 211 | + if (data->state < WAIT_STATE) { | ||
| 212 | + if (data->last_key != key) { | ||
| 213 | + ++data->noise; | ||
| 214 | + if (data->noise > NOISE_THRESHOLD) { | ||
| 215 | + DPRINTK("too much noise, bailing"); | ||
| 216 | + timer = 0; | ||
| 217 | + } | ||
| 218 | + data->state = 0; | ||
| 219 | + } else { | ||
| 220 | + ++data->state; | ||
| 221 | + } | ||
| 222 | + data->last_key = key; | ||
| 223 | + | ||
| 224 | + //stable value, send event | ||
| 225 | + } else if (data->state == WAIT_STATE) { | ||
| 226 | + data->noise = 0; | ||
| 227 | + //non-key returned, skip the rest of the states and bail now | ||
| 228 | + if (data->last_key == 0) { | ||
| 229 | + DPRINTK("non-key detected %d, noise: %d", data->last_key, data->noise); | ||
| 230 | + timer = 0; | ||
| 231 | + //send button press | ||
| 232 | + } else { | ||
| 233 | + DPRINTK("key press detected %d, noise %d", data->last_key, data->noise); | ||
| 234 | + input_report_key(data->input, data->last_key, 1); | ||
| 235 | + } | ||
| 236 | + ++data->state; | ||
| 237 | + | ||
| 238 | + //wait until key is released | ||
| 239 | + } else if (data->state < WAIT_STATE * 2) { | ||
| 240 | + if (key == data->last_key | ||
| 241 | + && data->noise < NOISE_THRESHOLD) { | ||
| 242 | + data->state = WAIT_STATE + 1; | ||
| 243 | + ++data->noise; | ||
| 244 | + } else { | ||
| 245 | + ++data->state; | ||
| 246 | + } | ||
| 247 | + //key is released, send event | ||
| 248 | + } else { | ||
| 249 | + //send button release | ||
| 250 | + DPRINTK("release key %d", data->last_key); | ||
| 251 | + input_report_key(data->input, data->last_key, 0); | ||
| 252 | + timer = 0; | ||
| 253 | + } | ||
| 254 | + if (timer) { | ||
| 255 | + mod_timer(&data->rctimer, jiffies + msecs_to_jiffies(RC_POLL_MS)); | ||
| 256 | + } else { | ||
| 257 | + if (machine_is_borzoi() || machine_is_spitz()) | ||
| 258 | + set_scoop_gpio(platform_scoop_config->devs[1].dev, SPITZ_SCP2_AKIN_PULLUP); | ||
| 259 | + else if (machine_is_akita()) | ||
| 260 | + akita_set_ioexp(&akitaioexp_device.dev, AKITA_IOEXP_AKIN_PULLUP); | ||
| 261 | + else | ||
| 262 | + set_scoop_gpio(platform_scoop_config->devs[0].dev, CORGI_SCP_AKIN_PULLUP); | ||
| 263 | + data->handling_press = 0; | ||
| 264 | + } | ||
| 265 | +} | ||
| 266 | + | ||
| 267 | +static int __init sharpsl_rc_probe(struct platform_device *pdev) | ||
| 268 | +{ | ||
| 269 | + struct sharpsl_rc *sharpsl_rc; | ||
| 270 | + struct input_dev *input_dev; | ||
| 271 | + int i, ret; | ||
| 272 | + struct remote_control_key *remote_keys; | ||
| 273 | + | ||
| 274 | + dev_dbg(&pdev->dev, "sharpsl_rc_probe\n"); | ||
| 275 | + | ||
| 276 | + sharpsl_rc = kzalloc(sizeof(struct sharpsl_rc), GFP_KERNEL); | ||
| 277 | + input_dev = input_allocate_device(); | ||
| 278 | + if (!sharpsl_rc || !input_dev) { | ||
| 279 | + kfree(sharpsl_rc); | ||
| 280 | + input_free_device(input_dev); | ||
| 281 | + return -ENOMEM; | ||
| 282 | + } | ||
| 283 | + | ||
| 284 | + platform_set_drvdata(pdev, sharpsl_rc); | ||
| 285 | + | ||
| 286 | + sharpsl_rc->dev = &pdev->dev; | ||
| 287 | + sharpsl_rc->input = input_dev; | ||
| 288 | + spin_lock_init(&sharpsl_rc->lock); | ||
| 289 | + | ||
| 290 | + /* Init Remote Control Timer */ | ||
| 291 | + init_timer(&sharpsl_rc->rctimer); | ||
| 292 | + sharpsl_rc->rctimer.function = sharpsl_rc_timer_callback; | ||
| 293 | + sharpsl_rc->rctimer.data = (unsigned long) sharpsl_rc; | ||
| 294 | + | ||
| 295 | + input_dev->name = "Sharp Remote Control CE-RHX"; | ||
| 296 | + input_dev->phys = "sharpsl_rc/input0"; | ||
| 297 | + input_dev->id.bustype = BUS_HOST; | ||
| 298 | + input_dev->id.vendor = 0x0001; | ||
| 299 | + input_dev->id.product = 0x0001; | ||
| 300 | + input_dev->id.version = 0x0100; | ||
| 301 | + input_dev->dev.parent = &pdev->dev; | ||
| 302 | + | ||
| 303 | + input_dev->evbit[0] = BIT(EV_KEY); | ||
| 304 | + | ||
| 305 | + if (machine_is_borzoi() || machine_is_spitz() || machine_is_akita()) | ||
| 306 | + remote_keys = remote_keys_spitz; | ||
| 307 | + else | ||
| 308 | + remote_keys = remote_keys_corgi; | ||
| 309 | + for (i = 0; i < (machine_is_borzoi() || machine_is_spitz() || machine_is_akita() ? | ||
| 310 | + ARRAY_SIZE(remote_keys_spitz) : ARRAY_SIZE(remote_keys_corgi)); | ||
| 311 | + ++i) | ||
| 312 | + set_bit(remote_keys[i].key, input_dev->keybit); | ||
| 313 | + | ||
| 314 | + ret = input_register_device(sharpsl_rc->input); | ||
| 315 | + if (ret) { | ||
| 316 | + dev_dbg(&pdev->dev, "Failed to register Sharp Remote input device\n"); | ||
| 317 | + kfree(sharpsl_rc); | ||
| 318 | + input_free_device(input_dev); | ||
| 319 | + return ret; | ||
| 320 | + } | ||
| 321 | + | ||
| 322 | + if (machine_is_borzoi() || machine_is_spitz() || machine_is_akita()) { | ||
| 323 | + pxa_gpio_mode(SPITZ_GPIO_AK_INT | GPIO_IN); | ||
| 324 | + ret = request_irq(SPITZ_IRQ_GPIO_AK_INT, | ||
| 325 | + sharpsl_rc_interrupt, | ||
| 326 | + IRQF_DISABLED | IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING | IRQF_SHARED, | ||
| 327 | + "sharpsl_rc", | ||
| 328 | + sharpsl_rc); | ||
| 329 | + } else { | ||
| 330 | + pxa_gpio_mode(CORGI_GPIO_AK_INT | GPIO_IN); | ||
| 331 | + ret = request_irq(CORGI_IRQ_GPIO_AK_INT, | ||
| 332 | + sharpsl_rc_interrupt, | ||
| 333 | + IRQF_DISABLED | IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING | IRQF_SHARED, | ||
| 334 | + "sharpsl_rc", | ||
| 335 | + sharpsl_rc); | ||
| 336 | + } | ||
| 337 | + if (ret < 0) { | ||
| 338 | + dev_dbg(&pdev->dev, "Can't get IRQ: %d!\n", i); | ||
| 339 | + kfree(sharpsl_rc); | ||
| 340 | + input_free_device(input_dev); | ||
| 341 | + return ret; | ||
| 342 | + } | ||
| 343 | + | ||
| 344 | + return 0; | ||
| 345 | +} | ||
| 346 | + | ||
| 347 | +static int sharpsl_rc_remove(struct platform_device *pdev) | ||
| 348 | +{ | ||
| 349 | + struct sharpsl_rc *sharpsl_rc = platform_get_drvdata(pdev); | ||
| 350 | + | ||
| 351 | + dev_dbg(&pdev->dev, "sharpsl_rc_remove\n"); | ||
| 352 | + | ||
| 353 | + if (machine_is_borzoi() || machine_is_spitz() || machine_is_akita()) | ||
| 354 | + free_irq(SPITZ_IRQ_GPIO_AK_INT, sharpsl_rc); | ||
| 355 | + else | ||
| 356 | + free_irq(CORGI_IRQ_GPIO_AK_INT, sharpsl_rc); | ||
| 357 | + del_timer_sync(&sharpsl_rc->rctimer); | ||
| 358 | + input_unregister_device(sharpsl_rc->input); | ||
| 359 | + kfree(sharpsl_rc); | ||
| 360 | + | ||
| 361 | + return 0; | ||
| 362 | +} | ||
| 363 | + | ||
| 364 | +static struct platform_driver sharpsl_rc_driver = { | ||
| 365 | + .probe = sharpsl_rc_probe, | ||
| 366 | + .remove = sharpsl_rc_remove, | ||
| 367 | + .suspend = NULL, | ||
| 368 | + .resume = NULL, | ||
| 369 | + .driver = { | ||
| 370 | + .name = "sharpsl-remote-control", | ||
| 371 | + }, | ||
| 372 | +}; | ||
| 373 | + | ||
| 374 | +static int __devinit sharpsl_rc_init(void) | ||
| 375 | +{ | ||
| 376 | + printk("sharpsl_rc_init\n"); | ||
| 377 | + return platform_driver_register(&sharpsl_rc_driver); | ||
| 378 | +} | ||
| 379 | + | ||
| 380 | +static void __exit sharpsl_rc_exit(void) | ||
| 381 | +{ | ||
| 382 | + printk("sharpsl_rc_exit\n"); | ||
| 383 | + platform_driver_unregister(&sharpsl_rc_driver); | ||
| 384 | +} | ||
| 385 | + | ||
| 386 | +module_init(sharpsl_rc_init); | ||
| 387 | +module_exit(sharpsl_rc_exit); | ||
| 388 | + | ||
| 389 | +MODULE_AUTHOR("Justin Patrin <papercrane@reversefold.com>"); | ||
| 390 | +MODULE_AUTHOR("Richard Purdie <rpurdie@rpsys.net>"); | ||
| 391 | +MODULE_DESCRIPTION("SharpSL Remote Control Driver"); | ||
| 392 | +MODULE_LICENSE("GPL"); | ||
| 393 | Index: linux-2.6.26-rc4/drivers/input/keyboard/spitzkbd.c | ||
| 394 | =================================================================== | ||
| 395 | --- linux-2.6.26-rc4.orig/drivers/input/keyboard/spitzkbd.c 2008-06-02 00:20:03.000000000 +0100 | ||
| 396 | +++ linux-2.6.26-rc4/drivers/input/keyboard/spitzkbd.c 2008-06-02 00:20:05.000000000 +0100 | ||
| 397 | @@ -19,6 +19,7 @@ | ||
| 398 | #include <linux/jiffies.h> | ||
| 399 | #include <linux/module.h> | ||
| 400 | #include <linux/slab.h> | ||
| 401 | +#include <linux/kmod.h> | ||
| 402 | |||
| 403 | #include <asm/arch/spitz.h> | ||
| 404 | #include <asm/arch/hardware.h> | ||
| 405 | @@ -280,13 +281,21 @@ | ||
| 406 | static int sharpsl_hinge_state; | ||
| 407 | static int hinge_count; | ||
| 408 | |||
| 409 | +void spitzkbd_handle_sharpsl_rc(void *arg) { | ||
| 410 | + request_module("sharpsl_rc"); | ||
| 411 | +} | ||
| 412 | + | ||
| 413 | +DECLARE_WORK(spitzkbd_work, spitzkbd_handle_sharpsl_rc); | ||
| 414 | + | ||
| 415 | static void spitzkbd_hinge_timer(unsigned long data) | ||
| 416 | { | ||
| 417 | struct spitzkbd *spitzkbd_data = (struct spitzkbd *) data; | ||
| 418 | unsigned long state; | ||
| 419 | unsigned long flags; | ||
| 420 | + unsigned int headphone, remote; | ||
| 421 | |||
| 422 | state = GPLR(SPITZ_GPIO_SWA) & (GPIO_bit(SPITZ_GPIO_SWA)|GPIO_bit(SPITZ_GPIO_SWB)); | ||
| 423 | + state |= (GPLR(SPITZ_GPIO_HP_IN) & GPIO_bit(SPITZ_GPIO_HP_IN)); | ||
| 424 | state |= (GPLR(SPITZ_GPIO_AK_INT) & GPIO_bit(SPITZ_GPIO_AK_INT)); | ||
| 425 | if (state != sharpsl_hinge_state) { | ||
| 426 | hinge_count = 0; | ||
| 427 | @@ -300,9 +309,18 @@ | ||
| 428 | |||
| 429 | input_report_switch(spitzkbd_data->input, SW_LID, ((GPLR(SPITZ_GPIO_SWA) & GPIO_bit(SPITZ_GPIO_SWA)) != 0)); | ||
| 430 | input_report_switch(spitzkbd_data->input, SW_TABLET_MODE, ((GPLR(SPITZ_GPIO_SWB) & GPIO_bit(SPITZ_GPIO_SWB)) != 0)); | ||
| 431 | - input_report_switch(spitzkbd_data->input, SW_HEADPHONE_INSERT, ((GPLR(SPITZ_GPIO_AK_INT) & GPIO_bit(SPITZ_GPIO_AK_INT)) != 0)); | ||
| 432 | + | ||
| 433 | + headphone = ((GPLR(SPITZ_GPIO_HP_IN) & GPIO_bit(SPITZ_GPIO_HP_IN)) != 0); | ||
| 434 | + input_report_switch(spitzkbd_data->input, SW_HEADPHONE_INSERT, headphone); | ||
| 435 | + | ||
| 436 | + remote = headphone && ((GPLR(SPITZ_GPIO_AK_INT) & GPIO_bit(SPITZ_GPIO_AK_INT)) == 0); | ||
| 437 | + input_report_switch(spitzkbd_data->input, SW_REMOTE_INSERT, remote); | ||
| 438 | input_sync(spitzkbd_data->input); | ||
| 439 | |||
| 440 | + if (remote) { | ||
| 441 | + schedule_work(&spitzkbd_work); | ||
| 442 | + } | ||
| 443 | + | ||
| 444 | spin_unlock_irqrestore(&spitzkbd_data->lock, flags); | ||
| 445 | } else { | ||
| 446 | mod_timer(&spitzkbd_data->htimer, jiffies + msecs_to_jiffies(HINGE_SCAN_INTERVAL)); | ||
| 447 | @@ -396,6 +414,7 @@ | ||
| 448 | set_bit(SW_LID, input_dev->swbit); | ||
| 449 | set_bit(SW_TABLET_MODE, input_dev->swbit); | ||
| 450 | set_bit(SW_HEADPHONE_INSERT, input_dev->swbit); | ||
| 451 | + set_bit(SW_REMOTE_INSERT, input_dev->swbit); | ||
| 452 | |||
| 453 | err = input_register_device(input_dev); | ||
| 454 | if (err) | ||
| 455 | @@ -433,9 +452,12 @@ | ||
| 456 | request_irq(SPITZ_IRQ_GPIO_SWB, spitzkbd_hinge_isr, | ||
| 457 | IRQF_DISABLED | IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING, | ||
| 458 | "Spitzkbd SWB", spitzkbd); | ||
| 459 | - request_irq(SPITZ_IRQ_GPIO_AK_INT, spitzkbd_hinge_isr, | ||
| 460 | + request_irq(SPITZ_IRQ_GPIO_HP_IN, spitzkbd_hinge_isr, | ||
| 461 | IRQF_DISABLED | IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING, | ||
| 462 | "Spitzkbd HP", spitzkbd); | ||
| 463 | + request_irq(SPITZ_IRQ_GPIO_AK_INT, spitzkbd_hinge_isr, | ||
| 464 | + IRQF_DISABLED | IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING | IRQF_SHARED, | ||
| 465 | + "Spitzkbd HP Type", spitzkbd); | ||
| 466 | |||
| 467 | return 0; | ||
| 468 | |||
| 469 | @@ -456,6 +478,7 @@ | ||
| 470 | free_irq(SPITZ_IRQ_GPIO_ON_KEY, spitzkbd); | ||
| 471 | free_irq(SPITZ_IRQ_GPIO_SWA, spitzkbd); | ||
| 472 | free_irq(SPITZ_IRQ_GPIO_SWB, spitzkbd); | ||
| 473 | + free_irq(SPITZ_IRQ_GPIO_HP_IN, spitzkbd); | ||
| 474 | free_irq(SPITZ_IRQ_GPIO_AK_INT, spitzkbd); | ||
| 475 | |||
| 476 | del_timer_sync(&spitzkbd->htimer); | ||
| 477 | Index: linux-2.6.26-rc4/arch/arm/mach-pxa/sharpsl.h | ||
| 478 | =================================================================== | ||
| 479 | --- linux-2.6.26-rc4.orig/arch/arm/mach-pxa/sharpsl.h 2008-06-02 00:20:03.000000000 +0100 | ||
| 480 | +++ linux-2.6.26-rc4/arch/arm/mach-pxa/sharpsl.h 2008-06-02 00:20:05.000000000 +0100 | ||
| 481 | @@ -37,15 +37,10 @@ | ||
| 482 | */ | ||
| 483 | #define READ_GPIO_BIT(x) (GPLR(x) & GPIO_bit(x)) | ||
| 484 | |||
| 485 | -/* MAX1111 Channel Definitions */ | ||
| 486 | -#define MAX1111_BATT_VOLT 4u | ||
| 487 | -#define MAX1111_BATT_TEMP 2u | ||
| 488 | -#define MAX1111_ACIN_VOLT 6u | ||
| 489 | - | ||
| 490 | extern struct battery_thresh spitz_battery_levels_acin[]; | ||
| 491 | extern struct battery_thresh spitz_battery_levels_noac[]; | ||
| 492 | void sharpsl_pm_pxa_init(void); | ||
| 493 | void sharpsl_pm_pxa_remove(void); | ||
| 494 | -int sharpsl_pm_pxa_read_max1111(int channel); | ||
| 495 | + | ||
| 496 | |||
| 497 | |||
| 498 | Index: linux-2.6.26-rc4/arch/arm/mach-pxa/sharpsl_pm.c | ||
| 499 | =================================================================== | ||
| 500 | --- linux-2.6.26-rc4.orig/arch/arm/mach-pxa/sharpsl_pm.c 2008-06-02 00:20:03.000000000 +0100 | ||
| 501 | +++ linux-2.6.26-rc4/arch/arm/mach-pxa/sharpsl_pm.c 2008-06-02 00:20:05.000000000 +0100 | ||
| 502 | @@ -136,6 +136,8 @@ | ||
| 503 | | MAXCTRL_SGL | MAXCTRL_UNI | MAXCTRL_STR); | ||
| 504 | } | ||
| 505 | |||
| 506 | +EXPORT_SYMBOL(sharpsl_pm_pxa_read_max1111); | ||
| 507 | + | ||
| 508 | void sharpsl_pm_pxa_init(void) | ||
| 509 | { | ||
| 510 | pxa_gpio_mode(sharpsl_pm.machinfo->gpio_acin | GPIO_IN); | ||
| 511 | Index: linux-2.6.26-rc4/include/asm-arm/hardware/sharpsl_pm.h | ||
| 512 | =================================================================== | ||
| 513 | --- linux-2.6.26-rc4.orig/include/asm-arm/hardware/sharpsl_pm.h 2008-06-02 00:20:03.000000000 +0100 | ||
| 514 | +++ linux-2.6.26-rc4/include/asm-arm/hardware/sharpsl_pm.h 2008-06-02 00:20:05.000000000 +0100 | ||
| 515 | @@ -104,3 +104,10 @@ | ||
| 516 | irqreturn_t sharpsl_chrg_full_isr(int irq, void *dev_id); | ||
| 517 | irqreturn_t sharpsl_fatal_isr(int irq, void *dev_id); | ||
| 518 | |||
| 519 | +/* MAX1111 Channel Definitions */ | ||
| 520 | +#define MAX1111_REMCOM 0u | ||
| 521 | +#define MAX1111_BATT_VOLT 4u | ||
| 522 | +#define MAX1111_BATT_TEMP 2u | ||
| 523 | +#define MAX1111_ACIN_VOLT 6u | ||
| 524 | + | ||
| 525 | +int sharpsl_pm_pxa_read_max1111(int channel); | ||
| 526 | Index: linux-2.6.26-rc4/include/linux/input.h | ||
| 527 | =================================================================== | ||
| 528 | --- linux-2.6.26-rc4.orig/include/linux/input.h 2008-06-02 00:20:03.000000000 +0100 | ||
| 529 | +++ linux-2.6.26-rc4/include/linux/input.h 2008-06-02 00:20:05.000000000 +0100 | ||
| 530 | @@ -638,6 +638,7 @@ | ||
| 531 | #define SW_TABLET_MODE 0x01 /* set = tablet mode */ | ||
| 532 | #define SW_HEADPHONE_INSERT 0x02 /* set = inserted */ | ||
| 533 | #define SW_RADIO 0x03 /* set = radio enabled */ | ||
| 534 | +#define SW_REMOTE_INSERT 0x04 /* set = remote */ | ||
| 535 | #define SW_MAX 0x0f | ||
| 536 | #define SW_CNT (SW_MAX+1) | ||
| 537 | |||
| 538 | Index: linux-2.6.26-rc4/arch/arm/mach-pxa/spitz_pm.c | ||
| 539 | =================================================================== | ||
| 540 | --- linux-2.6.26-rc4.orig/arch/arm/mach-pxa/spitz_pm.c 2008-06-02 00:20:03.000000000 +0100 | ||
| 541 | +++ linux-2.6.26-rc4/arch/arm/mach-pxa/spitz_pm.c 2008-06-02 09:46:10.000000000 +0100 | ||
| 542 | @@ -160,6 +160,13 @@ | ||
| 543 | if (resume_on_alarm && (PEDR & PWER_RTC)) | ||
| 544 | is_resume |= PWER_RTC; | ||
| 545 | |||
| 546 | + printk("wakeup: PEDR: %x, PKSR: %x, HP_IN: %x, AK_INT: %x\n", PEDR, PKSR, GPIO_bit(SPITZ_GPIO_HP_IN), GPIO_bit(SPITZ_GPIO_AK_INT)); | ||
| 547 | + | ||
| 548 | + //remote/headphone interrupt, wakeup | ||
| 549 | + if (PEDR == 0 && (PKSR & 0xc0d01) != 0) { | ||
| 550 | + is_resume |= PWER_RTC; | ||
| 551 | + } | ||
| 552 | + | ||
| 553 | dev_dbg(sharpsl_pm.dev, "is_resume: %x\n",is_resume); | ||
| 554 | return is_resume; | ||
| 555 | } | ||
diff --git a/meta/packages/linux/linux-rp-2.6.25+2.6.26-rc4/spitz_h_rewrite.patch b/meta/packages/linux/linux-rp-2.6.25+2.6.26-rc4/spitz_h_rewrite.patch new file mode 100644 index 0000000000..3dcf4ed8af --- /dev/null +++ b/meta/packages/linux/linux-rp-2.6.25+2.6.26-rc4/spitz_h_rewrite.patch | |||
| @@ -0,0 +1,497 @@ | |||
| 1 | http://www.uwsg.indiana.edu/hypermail/linux/kernel/0802.1/3541.html | ||
| 2 | |||
| 3 | Here is a rewrite of spitz.h, which includes comments documenting | ||
| 4 | function of particular GPIO pins. | ||
| 5 | |||
| 6 | spitz_h_rewrite.patch provides: | ||
| 7 | - no changes in compiled code | ||
| 8 | - partial spitz.h rewrite: | ||
| 9 | * organized by function | ||
| 10 | * describes complete GPIO pinout | ||
| 11 | * comments added | ||
| 12 | * removed defines cloning pxa-regs.h | ||
| 13 | - prefer generic pxa-regs.h GPIO if available | ||
| 14 | - use GPIO names instead of numbers | ||
| 15 | |||
| 16 | Thanks to Trisoft for providing needed information. | ||
| 17 | |||
| 18 | Index: linux-2.6.26-rc4/arch/arm/mach-pxa/spitz_pm.c | ||
| 19 | =================================================================== | ||
| 20 | --- linux-2.6.26-rc4.orig/arch/arm/mach-pxa/spitz_pm.c 2008-06-02 00:13:53.000000000 +0100 | ||
| 21 | +++ linux-2.6.26-rc4/arch/arm/mach-pxa/spitz_pm.c 2008-06-02 00:13:53.000000000 +0100 | ||
| 22 | @@ -111,9 +111,9 @@ | ||
| 23 | pxa_gpio_mode(GPIO18_RDY|GPIO_OUT | GPIO_DFLT_HIGH); | ||
| 24 | |||
| 25 | PRER = GPIO_bit(SPITZ_GPIO_KEY_INT); | ||
| 26 | - PFER = GPIO_bit(SPITZ_GPIO_KEY_INT) | GPIO_bit(SPITZ_GPIO_RESET); | ||
| 27 | - PWER = GPIO_bit(SPITZ_GPIO_KEY_INT) | GPIO_bit(SPITZ_GPIO_RESET) | PWER_RTC; | ||
| 28 | - PKWR = GPIO_bit(SPITZ_GPIO_SYNC) | GPIO_bit(SPITZ_GPIO_KEY_INT) | GPIO_bit(SPITZ_GPIO_RESET); | ||
| 29 | + PFER = GPIO_bit(SPITZ_GPIO_KEY_INT) | GPIO_bit(GPIO1_RST); | ||
| 30 | + PWER = GPIO_bit(SPITZ_GPIO_KEY_INT) | GPIO_bit(GPIO1_RST) | PWER_RTC; | ||
| 31 | + PKWR = GPIO_bit(SPITZ_GPIO_SYNC) | GPIO_bit(SPITZ_GPIO_KEY_INT) | GPIO_bit(GPIO1_RST); | ||
| 32 | PKSR = 0xffffffff; // clear | ||
| 33 | |||
| 34 | /* nRESET_OUT Disable */ | ||
| 35 | @@ -126,7 +126,7 @@ | ||
| 36 | static void spitz_postsuspend(void) | ||
| 37 | { | ||
| 38 | pxa_gpio_mode(GPIO18_RDY_MD); | ||
| 39 | - pxa_gpio_mode(10 | GPIO_IN); | ||
| 40 | + pxa_gpio_mode(SPITZ_GPIO_NC_10 | GPIO_IN); | ||
| 41 | } | ||
| 42 | |||
| 43 | static int spitz_should_wakeup(unsigned int resume_on_alarm) | ||
| 44 | Index: linux-2.6.26-rc4/drivers/video/pxafb.c | ||
| 45 | =================================================================== | ||
| 46 | --- linux-2.6.26-rc4.orig/drivers/video/pxafb.c 2008-05-26 19:08:11.000000000 +0100 | ||
| 47 | +++ linux-2.6.26-rc4/drivers/video/pxafb.c 2008-06-02 00:15:22.000000000 +0100 | ||
| 48 | @@ -966,7 +966,7 @@ | ||
| 49 | return; | ||
| 50 | } | ||
| 51 | |||
| 52 | - for (gpio = 58; ldd_bits; gpio++, ldd_bits--) | ||
| 53 | + for (gpio = GPIO58_LDD_0; ldd_bits; gpio++, ldd_bits--) | ||
| 54 | pxa_gpio_mode(gpio | GPIO_ALT_FN_2_OUT); | ||
| 55 | pxa_gpio_mode(GPIO74_LCD_FCLK_MD); | ||
| 56 | pxa_gpio_mode(GPIO75_LCD_LCLK_MD); | ||
| 57 | Index: linux-2.6.26-rc4/include/asm-arm/arch-pxa/akita.h | ||
| 58 | =================================================================== | ||
| 59 | --- linux-2.6.26-rc4.orig/include/asm-arm/arch-pxa/akita.h 2008-05-26 19:08:11.000000000 +0100 | ||
| 60 | +++ linux-2.6.26-rc4/include/asm-arm/arch-pxa/akita.h 2008-06-02 00:13:53.000000000 +0100 | ||
| 61 | @@ -12,11 +12,11 @@ | ||
| 62 | /* Akita IO Expander GPIOs */ | ||
| 63 | |||
| 64 | #define AKITA_IOEXP_RESERVED_7 (1 << 7) | ||
| 65 | -#define AKITA_IOEXP_IR_ON (1 << 6) | ||
| 66 | -#define AKITA_IOEXP_AKIN_PULLUP (1 << 5) | ||
| 67 | -#define AKITA_IOEXP_BACKLIGHT_CONT (1 << 4) | ||
| 68 | -#define AKITA_IOEXP_BACKLIGHT_ON (1 << 3) | ||
| 69 | -#define AKITA_IOEXP_MIC_BIAS (1 << 2) | ||
| 70 | +#define AKITA_IOEXP_IR_ON (1 << 6) /* IrDA On */ | ||
| 71 | +#define AKITA_IOEXP_AKIN_PULLUP (1 << 5) /* Pull-Up for Remote */ | ||
| 72 | +#define AKITA_IOEXP_BACKLIGHT_CONT (1 << 4) /* Backlight Control */ | ||
| 73 | +#define AKITA_IOEXP_BACKLIGHT_ON (1 << 3) /* Backlight On */ | ||
| 74 | +#define AKITA_IOEXP_MIC_BIAS (1 << 2) /* Mic Bias On */ | ||
| 75 | #define AKITA_IOEXP_RESERVED_1 (1 << 1) | ||
| 76 | #define AKITA_IOEXP_RESERVED_0 (1 << 0) | ||
| 77 | |||
| 78 | Index: linux-2.6.26-rc4/include/asm-arm/arch-pxa/spitz.h | ||
| 79 | =================================================================== | ||
| 80 | --- linux-2.6.26-rc4.orig/include/asm-arm/arch-pxa/spitz.h 2008-05-26 19:08:11.000000000 +0100 | ||
| 81 | +++ linux-2.6.26-rc4/include/asm-arm/arch-pxa/spitz.h 2008-06-02 00:13:53.000000000 +0100 | ||
| 82 | @@ -1,8 +1,9 @@ | ||
| 83 | /* | ||
| 84 | - * Hardware specific definitions for SL-Cx000 series of PDAs | ||
| 85 | + * Hardware specific definitions for SL-Cxx00 series of PDAs | ||
| 86 | * | ||
| 87 | * Copyright (c) 2005 Alexander Wykes | ||
| 88 | * Copyright (c) 2005 Richard Purdie | ||
| 89 | + * Copyright (c) 2008 Stanislav Brabec | ||
| 90 | * | ||
| 91 | * Based on Sharp's 2.4 kernel patches | ||
| 92 | * | ||
| 93 | @@ -13,140 +14,257 @@ | ||
| 94 | */ | ||
| 95 | #ifndef __ASM_ARCH_SPITZ_H | ||
| 96 | #define __ASM_ARCH_SPITZ_H 1 | ||
| 97 | -#endif | ||
| 98 | |||
| 99 | -#include <linux/fb.h> | ||
| 100 | +#include <asm-arm/arch-pxa/irqs.h> | ||
| 101 | +#include <linux/platform_device.h> | ||
| 102 | |||
| 103 | /* Spitz/Akita GPIOs */ | ||
| 104 | |||
| 105 | -#define SPITZ_GPIO_KEY_INT (0) /* Key Interrupt */ | ||
| 106 | -#define SPITZ_GPIO_RESET (1) | ||
| 107 | -#define SPITZ_GPIO_nSD_DETECT (9) | ||
| 108 | -#define SPITZ_GPIO_TP_INT (11) /* Touch Panel interrupt */ | ||
| 109 | -#define SPITZ_GPIO_AK_INT (13) /* Remote Control */ | ||
| 110 | -#define SPITZ_GPIO_ADS7846_CS (14) | ||
| 111 | -#define SPITZ_GPIO_SYNC (16) | ||
| 112 | -#define SPITZ_GPIO_MAX1111_CS (20) | ||
| 113 | -#define SPITZ_GPIO_FATAL_BAT (21) | ||
| 114 | -#define SPITZ_GPIO_HSYNC (22) | ||
| 115 | -#define SPITZ_GPIO_nSD_CLK (32) | ||
| 116 | -#define SPITZ_GPIO_USB_DEVICE (35) | ||
| 117 | -#define SPITZ_GPIO_USB_HOST (37) | ||
| 118 | -#define SPITZ_GPIO_USB_CONNECT (41) | ||
| 119 | -#define SPITZ_GPIO_LCDCON_CS (53) | ||
| 120 | -#define SPITZ_GPIO_nPCE (54) | ||
| 121 | -#define SPITZ_GPIO_nSD_WP (81) | ||
| 122 | -#define SPITZ_GPIO_ON_RESET (89) | ||
| 123 | -#define SPITZ_GPIO_BAT_COVER (90) | ||
| 124 | -#define SPITZ_GPIO_CF_CD (94) | ||
| 125 | -#define SPITZ_GPIO_ON_KEY (95) | ||
| 126 | -#define SPITZ_GPIO_SWA (97) | ||
| 127 | -#define SPITZ_GPIO_SWB (96) | ||
| 128 | -#define SPITZ_GPIO_CHRG_FULL (101) | ||
| 129 | -#define SPITZ_GPIO_CO (101) | ||
| 130 | -#define SPITZ_GPIO_CF_IRQ (105) | ||
| 131 | -#define SPITZ_GPIO_AC_IN (115) | ||
| 132 | -#define SPITZ_GPIO_HP_IN (116) | ||
| 133 | +/* This list refers to all GPIO pins either in defines or in comments. | ||
| 134 | + * | ||
| 135 | + * GPIO pins not listed: | ||
| 136 | + * GPIO2 SYS_EN: System Power Enable | ||
| 137 | + * GPIO5-GPIO8 PWR_CAP0-PWR_CAP3: sleep DC-DC converter power capacitors | ||
| 138 | + * GPIO40 not connected | ||
| 139 | + */ | ||
| 140 | |||
| 141 | -/* Spitz Only GPIOs */ | ||
| 142 | |||
| 143 | -#define SPITZ_GPIO_CF2_IRQ (106) /* CF slot1 Ready */ | ||
| 144 | -#define SPITZ_GPIO_CF2_CD (93) | ||
| 145 | +/* Spitz/Akita System GPIO */ | ||
| 146 | + | ||
| 147 | +#define SPITZ_GPIO_KEY_INT (0) /* Key Interrupt */ | ||
| 148 | +#define SPITZ_GPIO_SYNC (16) /* IOPORT Wake Up (input) */ | ||
| 149 | +#define SPITZ_GPIO_NAND_CS (79) /* NAND Flash Chip Select */ | ||
| 150 | +#define SPITZ_GPIO_NC_10 (10) /* Not Connected (but used in kernel) */ | ||
| 151 | +/* This GPIO pin is connected: | ||
| 152 | + * GPIO1_RST | ||
| 153 | + */ | ||
| 154 | |||
| 155 | |||
| 156 | +/* Compact Flash Interface */ | ||
| 157 | + | ||
| 158 | +/* Spitz/Akita Compact Flash Interface */ | ||
| 159 | +#define SPITZ_GPIO_CF_CD (94) /* CF IRQ */ | ||
| 160 | +#define SPITZ_GPIO_CF_IRQ (105) /* CF Ready */ | ||
| 161 | +/* These GPIO pins are connected: | ||
| 162 | + * GPIO48_nPOE | ||
| 163 | + * GPIO49_nPWE | ||
| 164 | + * GPIO50_nPIOR | ||
| 165 | + * GPIO51_nPIOW | ||
| 166 | + * GPIO54_nPCE_2 | ||
| 167 | + * GPIO55_nPREG | ||
| 168 | + * GPIO56_nPWAIT | ||
| 169 | + * GPIO57_nIOIS16 | ||
| 170 | + * GPIO80_nCS_4 | ||
| 171 | + * GPIO85_nPCE_1 | ||
| 172 | + * GPIO104_pSKTSEL | ||
| 173 | + */ | ||
| 174 | + | ||
| 175 | +/* Spitz only Compact Flash Interface */ | ||
| 176 | +#define SPITZ_GPIO_CF2_CD (93) /* CF slot1 IRQ */ | ||
| 177 | +#define SPITZ_GPIO_CF2_IRQ (106) /* CF slot1 Ready */ | ||
| 178 | +/* This GPIO pin is connected: | ||
| 179 | + * GPIO78_nCS_2 | ||
| 180 | + */ | ||
| 181 | + | ||
| 182 | + | ||
| 183 | +/* Spitz/Akita Battery, Power and Service Connector */ | ||
| 184 | + | ||
| 185 | +#define SPITZ_GPIO_FATAL_BAT (21) /* Fatal Battery */ | ||
| 186 | +#define SPITZ_GPIO_BAT_COVER (90) /* Battery Cover switch */ | ||
| 187 | +#define SPITZ_GPIO_BAT_COVER2 (15) /* Battery Cover switch, parallel pin */ | ||
| 188 | +#define SPITZ_GPIO_CHRG_FULL (101) /* Battery Full */ | ||
| 189 | +#define SPITZ_GPIO_AC_IN (115) /* External Power Supply is active */ | ||
| 190 | +#define SPITZ_GPIO_ON_RESET (89) /* Software Reset */ | ||
| 191 | +#define SPITZ_GPIO_SERVICE0 (83) /* Service Connector */ | ||
| 192 | +#define SPITZ_GPIO_SERVICE1 (84) /* Service Connector */ | ||
| 193 | +/* This GPIO pin is connected: | ||
| 194 | + * GPIO18_RDY | ||
| 195 | + */ | ||
| 196 | + | ||
| 197 | + | ||
| 198 | +/* Spitz/Akita Display Controller */ | ||
| 199 | + | ||
| 200 | +#define SPITZ_GPIO_HSYNC (22) /* Line Sync Feedback */ | ||
| 201 | +/* These GPIO pins are connected: | ||
| 202 | + * GPIO58_LDD_0-GPIO58_LDD_15 | ||
| 203 | + * GPIO74_LCD_FCLK | ||
| 204 | + * GPIO75_LCD_LCLK | ||
| 205 | + * GPIO76_LCD_PCLK | ||
| 206 | + * GPIO77_LCD_ACBIAS | ||
| 207 | + */ | ||
| 208 | + | ||
| 209 | + | ||
| 210 | +/* Spitz/Akita SSP/SPI Bus and Devices */ | ||
| 211 | + | ||
| 212 | +#define SPITZ_GPIO_SSP_CLK (19) /* SSP bus Clock */ | ||
| 213 | +#define SPITZ_GPIO_SSP_RXD (86) /* SSP bus RxD */ | ||
| 214 | +#define SPITZ_GPIO_SSP_TXD (87) /* SSP bus TxD */ | ||
| 215 | +#define SPITZ_GPIO_TP_INT (11) /* Touch Panel IRQ */ | ||
| 216 | +#define SPITZ_GPIO_ADS7846_CS (14) /* Touch Panel Controller Chip Select */ | ||
| 217 | +#define SPITZ_GPIO_MAX1111_CS (20) /* Multi Channel ADC Chip Select */ | ||
| 218 | +#define SPITZ_GPIO_LCDCON_CS (53) /* LCD Controller Chip Select */ | ||
| 219 | + | ||
| 220 | + | ||
| 221 | +/* Spitz/Akita Supplementary USB OTG Pins */ | ||
| 222 | + | ||
| 223 | +#define SPITZ_GPIO_USB_DEVICE (35) /* USB Client power is present */ | ||
| 224 | +#define SPITZ_GPIO_USB_HOST (37) /* USB OTG 5V Host power supply control */ | ||
| 225 | +#define SPITZ_GPIO_USB_CONNECT (41) /* USB Host Cable is connected */ | ||
| 226 | + | ||
| 227 | + | ||
| 228 | +/* Spitz/Akita Audio */ | ||
| 229 | + | ||
| 230 | +#define SPITZ_GPIO_HP_IN (116) /* CPU Headphone detect */ | ||
| 231 | +#define SPITZ_GPIO_AK_INT (13) /* Remote Control detect */ | ||
| 232 | +/* These GPIO AC97 pins are connected: | ||
| 233 | + * GPIO28_BITCLK | ||
| 234 | + * GPIO29_SDATA_IN | ||
| 235 | + * GPIO30_SDATA_OUT | ||
| 236 | + * GPIO31_SYNC | ||
| 237 | + * GPIO113_AC97_RESET_N | ||
| 238 | + */ | ||
| 239 | + | ||
| 240 | + | ||
| 241 | +/* Spitz/Akita SD Slot */ | ||
| 242 | + | ||
| 243 | +#define SPITZ_GPIO_nSD_DETECT (9) /* SD Card Presence */ | ||
| 244 | +#define SPITZ_GPIO_nSD_WP (81) /* SD Write Protection */ | ||
| 245 | +/* These GPIO pins are connected: | ||
| 246 | + * GPIO32_MMCCLK | ||
| 247 | + * GPIO92_MMCDAT0 | ||
| 248 | + * GPIO109_MMCDAT1 | ||
| 249 | + * GPIO110_MMCDAT2 | ||
| 250 | + * GPIO111_MMCDAT3 | ||
| 251 | + * GPIO112_MMCCMD | ||
| 252 | + */ | ||
| 253 | + | ||
| 254 | +/* Spitz/Akita I2C bus */ | ||
| 255 | +#define SPITZ_GPIO_SCL (117) /* I2C SCL */ | ||
| 256 | +#define SPITZ_GPIO_SDA (118) /* I2C SDA */ | ||
| 257 | +#define SPITZ_GPIO_PWR_SCL (3) /* I2C SCL power */ | ||
| 258 | +#define SPITZ_GPIO_PWR_SDA (4) /* I2C SDA power */ | ||
| 259 | + | ||
| 260 | +/* audio codec pins */ | ||
| 261 | + | ||
| 262 | + | ||
| 263 | +/* Spitz/Akita UART ports */ | ||
| 264 | + | ||
| 265 | +/* Fully Featured UART - connected to IOPORT connector */ | ||
| 266 | +#define SPITZ_GPIO_FFRXD (102) /* IOPORT has nRXD inverted levels */ | ||
| 267 | +#define SPITZ_GPIO_FFTXD (99) /* IOPORT has nTXD inverted levels */ | ||
| 268 | +#define SPITZ_GPIO_FFRTS (98) | ||
| 269 | +#define SPITZ_GPIO_FFCTS (100) | ||
| 270 | +#define SPITZ_GPIO_FFDTR (82) | ||
| 271 | +#define SPITZ_GPIO_FFDSR (33) | ||
| 272 | + | ||
| 273 | +/* These UART GPIO pins are connected to Bluetooth | ||
| 274 | + * (only on Akita version with Bluetooth) | ||
| 275 | + * GPIO42_BTRXD | ||
| 276 | + * GPIO43_BTTXD | ||
| 277 | + * GPIO44_BTCTS | ||
| 278 | + * GPIO45_BTRTS | ||
| 279 | + */ | ||
| 280 | + | ||
| 281 | +/* These UART GPIO pins are connected to IrDA: | ||
| 282 | + * GPIO46_STRXD | ||
| 283 | + * GPIO47_STTXD | ||
| 284 | + */ | ||
| 285 | + | ||
| 286 | /* Spitz/Akita Keyboard Definitions */ | ||
| 287 | |||
| 288 | -#define SPITZ_KEY_STROBE_NUM (11) | ||
| 289 | -#define SPITZ_KEY_SENSE_NUM (7) | ||
| 290 | -#define SPITZ_GPIO_G0_STROBE_BIT 0x0f800000 | ||
| 291 | -#define SPITZ_GPIO_G1_STROBE_BIT 0x00100000 | ||
| 292 | -#define SPITZ_GPIO_G2_STROBE_BIT 0x01000000 | ||
| 293 | -#define SPITZ_GPIO_G3_STROBE_BIT 0x00041880 | ||
| 294 | -#define SPITZ_GPIO_G0_SENSE_BIT 0x00021000 | ||
| 295 | -#define SPITZ_GPIO_G1_SENSE_BIT 0x000000d4 | ||
| 296 | -#define SPITZ_GPIO_G2_SENSE_BIT 0x08000000 | ||
| 297 | -#define SPITZ_GPIO_G3_SENSE_BIT 0x00000000 | ||
| 298 | - | ||
| 299 | -#define SPITZ_GPIO_KEY_STROBE0 88 | ||
| 300 | -#define SPITZ_GPIO_KEY_STROBE1 23 | ||
| 301 | -#define SPITZ_GPIO_KEY_STROBE2 24 | ||
| 302 | -#define SPITZ_GPIO_KEY_STROBE3 25 | ||
| 303 | -#define SPITZ_GPIO_KEY_STROBE4 26 | ||
| 304 | -#define SPITZ_GPIO_KEY_STROBE5 27 | ||
| 305 | -#define SPITZ_GPIO_KEY_STROBE6 52 | ||
| 306 | -#define SPITZ_GPIO_KEY_STROBE7 103 | ||
| 307 | -#define SPITZ_GPIO_KEY_STROBE8 107 | ||
| 308 | -#define SPITZ_GPIO_KEY_STROBE9 108 | ||
| 309 | -#define SPITZ_GPIO_KEY_STROBE10 114 | ||
| 310 | - | ||
| 311 | -#define SPITZ_GPIO_KEY_SENSE0 12 | ||
| 312 | -#define SPITZ_GPIO_KEY_SENSE1 17 | ||
| 313 | -#define SPITZ_GPIO_KEY_SENSE2 91 | ||
| 314 | -#define SPITZ_GPIO_KEY_SENSE3 34 | ||
| 315 | -#define SPITZ_GPIO_KEY_SENSE4 36 | ||
| 316 | -#define SPITZ_GPIO_KEY_SENSE5 38 | ||
| 317 | -#define SPITZ_GPIO_KEY_SENSE6 39 | ||
| 318 | +#define SPITZ_KEY_STROBE_NUM (11) | ||
| 319 | +#define SPITZ_KEY_SENSE_NUM (7) | ||
| 320 | +#define SPITZ_GPIO_G0_STROBE_BIT 0x0f800000 | ||
| 321 | +#define SPITZ_GPIO_G1_STROBE_BIT 0x00100000 | ||
| 322 | +#define SPITZ_GPIO_G2_STROBE_BIT 0x01000000 | ||
| 323 | +#define SPITZ_GPIO_G3_STROBE_BIT 0x00041880 | ||
| 324 | +#define SPITZ_GPIO_G0_SENSE_BIT 0x00021000 | ||
| 325 | +#define SPITZ_GPIO_G1_SENSE_BIT 0x000000d4 | ||
| 326 | +#define SPITZ_GPIO_G2_SENSE_BIT 0x08000000 | ||
| 327 | +#define SPITZ_GPIO_G3_SENSE_BIT 0x00000000 | ||
| 328 | +#define SPITZ_GPIO_KEY_STROBE0 (88) | ||
| 329 | +#define SPITZ_GPIO_KEY_STROBE1 (23) | ||
| 330 | +#define SPITZ_GPIO_KEY_STROBE2 (24) | ||
| 331 | +#define SPITZ_GPIO_KEY_STROBE3 (25) | ||
| 332 | +#define SPITZ_GPIO_KEY_STROBE4 (26) | ||
| 333 | +#define SPITZ_GPIO_KEY_STROBE5 (27) | ||
| 334 | +#define SPITZ_GPIO_KEY_STROBE6 (52) | ||
| 335 | +#define SPITZ_GPIO_KEY_STROBE7 (103) | ||
| 336 | +#define SPITZ_GPIO_KEY_STROBE8 (107) | ||
| 337 | +#define SPITZ_GPIO_KEY_STROBE9 (108) | ||
| 338 | +#define SPITZ_GPIO_KEY_STROBE10 (114) | ||
| 339 | +#define SPITZ_GPIO_KEY_SENSE0 (12) | ||
| 340 | +#define SPITZ_GPIO_KEY_SENSE1 (17) | ||
| 341 | +#define SPITZ_GPIO_KEY_SENSE2 (91) | ||
| 342 | +#define SPITZ_GPIO_KEY_SENSE3 (34) | ||
| 343 | +#define SPITZ_GPIO_KEY_SENSE4 (36) | ||
| 344 | +#define SPITZ_GPIO_KEY_SENSE5 (38) | ||
| 345 | +#define SPITZ_GPIO_KEY_SENSE6 (39) | ||
| 346 | + | ||
| 347 | +#define SPITZ_GPIO_SWA (97) /* Keyboard Interrupt A */ | ||
| 348 | +#define SPITZ_GPIO_SWB (96) /* Keyboard Interrupt B */ | ||
| 349 | +#define SPITZ_GPIO_ON_KEY (95) /* Power On Key */ | ||
| 350 | |||
| 351 | |||
| 352 | -/* Spitz Scoop Device (No. 1) GPIOs */ | ||
| 353 | +/* Spitz/Akita Scoop Device (No. 1) GPIOs */ | ||
| 354 | /* Suspend States in comments */ | ||
| 355 | -#define SPITZ_SCP_LED_GREEN SCOOP_GPCR_PA11 /* Keep */ | ||
| 356 | -#define SPITZ_SCP_JK_B SCOOP_GPCR_PA12 /* Keep */ | ||
| 357 | -#define SPITZ_SCP_CHRG_ON SCOOP_GPCR_PA13 /* Keep */ | ||
| 358 | -#define SPITZ_SCP_MUTE_L SCOOP_GPCR_PA14 /* Low */ | ||
| 359 | -#define SPITZ_SCP_MUTE_R SCOOP_GPCR_PA15 /* Low */ | ||
| 360 | -#define SPITZ_SCP_CF_POWER SCOOP_GPCR_PA16 /* Keep */ | ||
| 361 | -#define SPITZ_SCP_LED_ORANGE SCOOP_GPCR_PA17 /* Keep */ | ||
| 362 | -#define SPITZ_SCP_JK_A SCOOP_GPCR_PA18 /* Low */ | ||
| 363 | -#define SPITZ_SCP_ADC_TEMP_ON SCOOP_GPCR_PA19 /* Low */ | ||
| 364 | +#define SPITZ_SCP_LED_GREEN SCOOP_GPCR_PA11 /* Green LED, Keep */ | ||
| 365 | +#define SPITZ_SCP_JK_B SCOOP_GPCR_PA12 /* Fast Charge On, Keep */ | ||
| 366 | +#define SPITZ_SCP_CHRG_ON SCOOP_GPCR_PA13 /* Charge On, Keep */ | ||
| 367 | +#define SPITZ_SCP_MUTE_L SCOOP_GPCR_PA14 /* Extra Mute Left, Low */ | ||
| 368 | +#define SPITZ_SCP_MUTE_R SCOOP_GPCR_PA15 /* Extra Mute Right, Low */ | ||
| 369 | +#define SPITZ_SCP_CF_POWER SCOOP_GPCR_PA16 /* CF+SD Power Circuit, Keep */ | ||
| 370 | +#define SPITZ_SCP_LED_ORANGE SCOOP_GPCR_PA17 /* Orange LED, Keep */ | ||
| 371 | +#define SPITZ_SCP_JK_A SCOOP_GPCR_PA18 /* Dummy Load, Low */ | ||
| 372 | +#define SPITZ_SCP_ADC_TEMP_ON SCOOP_GPCR_PA19 /* Battery Sensor On, Low */ | ||
| 373 | |||
| 374 | #define SPITZ_SCP_IO_DIR (SPITZ_SCP_LED_GREEN | SPITZ_SCP_JK_B | SPITZ_SCP_CHRG_ON | \ | ||
| 375 | - SPITZ_SCP_MUTE_L | SPITZ_SCP_MUTE_R | SPITZ_SCP_LED_ORANGE | \ | ||
| 376 | - SPITZ_SCP_CF_POWER | SPITZ_SCP_JK_A | SPITZ_SCP_ADC_TEMP_ON) | ||
| 377 | + SPITZ_SCP_MUTE_L | SPITZ_SCP_MUTE_R | SPITZ_SCP_LED_ORANGE | \ | ||
| 378 | + SPITZ_SCP_CF_POWER | SPITZ_SCP_JK_A | SPITZ_SCP_ADC_TEMP_ON) | ||
| 379 | #define SPITZ_SCP_IO_OUT (SPITZ_SCP_CHRG_ON | SPITZ_SCP_MUTE_L | SPITZ_SCP_MUTE_R) | ||
| 380 | #define SPITZ_SCP_SUS_CLR (SPITZ_SCP_MUTE_L | SPITZ_SCP_MUTE_R | SPITZ_SCP_JK_A | SPITZ_SCP_ADC_TEMP_ON) | ||
| 381 | #define SPITZ_SCP_SUS_SET 0 | ||
| 382 | |||
| 383 | /* Spitz Scoop Device (No. 2) GPIOs */ | ||
| 384 | -/* Suspend States in comments */ | ||
| 385 | -#define SPITZ_SCP2_IR_ON SCOOP_GPCR_PA11 /* High */ | ||
| 386 | -#define SPITZ_SCP2_AKIN_PULLUP SCOOP_GPCR_PA12 /* Keep */ | ||
| 387 | -#define SPITZ_SCP2_RESERVED_1 SCOOP_GPCR_PA13 /* High */ | ||
| 388 | -#define SPITZ_SCP2_RESERVED_2 SCOOP_GPCR_PA14 /* Low */ | ||
| 389 | -#define SPITZ_SCP2_RESERVED_3 SCOOP_GPCR_PA15 /* Low */ | ||
| 390 | -#define SPITZ_SCP2_RESERVED_4 SCOOP_GPCR_PA16 /* Low */ | ||
| 391 | -#define SPITZ_SCP2_BACKLIGHT_CONT SCOOP_GPCR_PA17 /* Low */ | ||
| 392 | -#define SPITZ_SCP2_BACKLIGHT_ON SCOOP_GPCR_PA18 /* Low */ | ||
| 393 | -#define SPITZ_SCP2_MIC_BIAS SCOOP_GPCR_PA19 /* Low */ | ||
| 394 | +/* Suspend States in comments | ||
| 395 | + * Spitz only, Akita uses corresponding AKITA_IOEXP_ */ | ||
| 396 | +#define SPITZ_SCP2_IR_ON SCOOP_GPCR_PA11 /* IrDA On, High */ | ||
| 397 | +#define SPITZ_SCP2_AKIN_PULLUP SCOOP_GPCR_PA12 /* Pull-Up for Remote, Keep */ | ||
| 398 | +#define SPITZ_SCP2_RESERVED_1 SCOOP_GPCR_PA13 /* High */ | ||
| 399 | +#define SPITZ_SCP2_RESERVED_2 SCOOP_GPCR_PA14 /* Low */ | ||
| 400 | +#define SPITZ_SCP2_RESERVED_3 SCOOP_GPCR_PA15 /* Low */ | ||
| 401 | +#define SPITZ_SCP2_RESERVED_4 SCOOP_GPCR_PA16 /* Low */ | ||
| 402 | +#define SPITZ_SCP2_BACKLIGHT_CONT SCOOP_GPCR_PA17 /* Backlight Control, Low */ | ||
| 403 | +#define SPITZ_SCP2_BACKLIGHT_ON SCOOP_GPCR_PA18 /* Backlight On, Low */ | ||
| 404 | +#define SPITZ_SCP2_MIC_BIAS SCOOP_GPCR_PA19 /* Mic Bias On, Low */ | ||
| 405 | |||
| 406 | #define SPITZ_SCP2_IO_DIR (SPITZ_SCP2_IR_ON | SPITZ_SCP2_AKIN_PULLUP | SPITZ_SCP2_RESERVED_1 | \ | ||
| 407 | - SPITZ_SCP2_RESERVED_2 | SPITZ_SCP2_RESERVED_3 | SPITZ_SCP2_RESERVED_4 | \ | ||
| 408 | - SPITZ_SCP2_BACKLIGHT_CONT | SPITZ_SCP2_BACKLIGHT_ON | SPITZ_SCP2_MIC_BIAS) | ||
| 409 | + SPITZ_SCP2_RESERVED_2 | SPITZ_SCP2_RESERVED_3 | SPITZ_SCP2_RESERVED_4 | \ | ||
| 410 | + SPITZ_SCP2_BACKLIGHT_CONT | SPITZ_SCP2_BACKLIGHT_ON | SPITZ_SCP2_MIC_BIAS) | ||
| 411 | |||
| 412 | #define SPITZ_SCP2_IO_OUT (SPITZ_SCP2_IR_ON | SPITZ_SCP2_AKIN_PULLUP | SPITZ_SCP2_RESERVED_1) | ||
| 413 | #define SPITZ_SCP2_SUS_CLR (SPITZ_SCP2_RESERVED_2 | SPITZ_SCP2_RESERVED_3 | SPITZ_SCP2_RESERVED_4 | \ | ||
| 414 | - SPITZ_SCP2_BACKLIGHT_CONT | SPITZ_SCP2_BACKLIGHT_ON | SPITZ_SCP2_MIC_BIAS) | ||
| 415 | + SPITZ_SCP2_BACKLIGHT_CONT | SPITZ_SCP2_BACKLIGHT_ON | SPITZ_SCP2_MIC_BIAS) | ||
| 416 | #define SPITZ_SCP2_SUS_SET (SPITZ_SCP2_IR_ON | SPITZ_SCP2_RESERVED_1) | ||
| 417 | |||
| 418 | |||
| 419 | -/* Spitz IRQ Definitions */ | ||
| 420 | +/* Spitz/Akita IRQ Definitions */ | ||
| 421 | |||
| 422 | -#define SPITZ_IRQ_GPIO_KEY_INT IRQ_GPIO(SPITZ_GPIO_KEY_INT) | ||
| 423 | -#define SPITZ_IRQ_GPIO_AC_IN IRQ_GPIO(SPITZ_GPIO_AC_IN) | ||
| 424 | -#define SPITZ_IRQ_GPIO_AK_INT IRQ_GPIO(SPITZ_GPIO_AK_INT) | ||
| 425 | -#define SPITZ_IRQ_GPIO_HP_IN IRQ_GPIO(SPITZ_GPIO_HP_IN) | ||
| 426 | -#define SPITZ_IRQ_GPIO_TP_INT IRQ_GPIO(SPITZ_GPIO_TP_INT) | ||
| 427 | -#define SPITZ_IRQ_GPIO_SYNC IRQ_GPIO(SPITZ_GPIO_SYNC) | ||
| 428 | -#define SPITZ_IRQ_GPIO_ON_KEY IRQ_GPIO(SPITZ_GPIO_ON_KEY) | ||
| 429 | -#define SPITZ_IRQ_GPIO_SWA IRQ_GPIO(SPITZ_GPIO_SWA) | ||
| 430 | -#define SPITZ_IRQ_GPIO_SWB IRQ_GPIO(SPITZ_GPIO_SWB) | ||
| 431 | +#define SPITZ_IRQ_GPIO_KEY_INT IRQ_GPIO(SPITZ_GPIO_KEY_INT) | ||
| 432 | +#define SPITZ_IRQ_GPIO_AC_IN IRQ_GPIO(SPITZ_GPIO_AC_IN) | ||
| 433 | +#define SPITZ_IRQ_GPIO_AK_INT IRQ_GPIO(SPITZ_GPIO_AK_INT) | ||
| 434 | +#define SPITZ_IRQ_GPIO_HP_IN IRQ_GPIO(SPITZ_GPIO_HP_IN) | ||
| 435 | +#define SPITZ_IRQ_GPIO_TP_INT IRQ_GPIO(SPITZ_GPIO_TP_INT) | ||
| 436 | +#define SPITZ_IRQ_GPIO_SYNC IRQ_GPIO(SPITZ_GPIO_SYNC) | ||
| 437 | +#define SPITZ_IRQ_GPIO_ON_KEY IRQ_GPIO(SPITZ_GPIO_ON_KEY) | ||
| 438 | +#define SPITZ_IRQ_GPIO_SWA IRQ_GPIO(SPITZ_GPIO_SWA) | ||
| 439 | +#define SPITZ_IRQ_GPIO_SWB IRQ_GPIO(SPITZ_GPIO_SWB) | ||
| 440 | #define SPITZ_IRQ_GPIO_BAT_COVER IRQ_GPIO(SPITZ_GPIO_BAT_COVER) | ||
| 441 | #define SPITZ_IRQ_GPIO_FATAL_BAT IRQ_GPIO(SPITZ_GPIO_FATAL_BAT) | ||
| 442 | -#define SPITZ_IRQ_GPIO_CO IRQ_GPIO(SPITZ_GPIO_CO) | ||
| 443 | -#define SPITZ_IRQ_GPIO_CF_IRQ IRQ_GPIO(SPITZ_GPIO_CF_IRQ) | ||
| 444 | -#define SPITZ_IRQ_GPIO_CF_CD IRQ_GPIO(SPITZ_GPIO_CF_CD) | ||
| 445 | -#define SPITZ_IRQ_GPIO_CF2_IRQ IRQ_GPIO(SPITZ_GPIO_CF2_IRQ) | ||
| 446 | -#define SPITZ_IRQ_GPIO_nSD_INT IRQ_GPIO(SPITZ_GPIO_nSD_INT) | ||
| 447 | +#define SPITZ_IRQ_GPIO_CF_IRQ IRQ_GPIO(SPITZ_GPIO_CF_IRQ) | ||
| 448 | +#define SPITZ_IRQ_GPIO_CF_CD IRQ_GPIO(SPITZ_GPIO_CF_CD) | ||
| 449 | +#define SPITZ_IRQ_GPIO_CF2_IRQ IRQ_GPIO(SPITZ_GPIO_CF2_IRQ) | ||
| 450 | +#define SPITZ_IRQ_GPIO_nSD_INT IRQ_GPIO(SPITZ_GPIO_nSD_INT) | ||
| 451 | #define SPITZ_IRQ_GPIO_nSD_DETECT IRQ_GPIO(SPITZ_GPIO_nSD_DETECT) | ||
| 452 | |||
| 453 | /* | ||
| 454 | @@ -156,3 +274,5 @@ | ||
| 455 | extern struct platform_device spitzscoop2_device; | ||
| 456 | extern struct platform_device spitzssp_device; | ||
| 457 | extern struct sharpsl_charger_machinfo spitz_pm_machinfo; | ||
| 458 | + | ||
| 459 | +#endif | ||
| 460 | Index: linux-2.6.26-rc4/sound/arm/pxa2xx-ac97.c | ||
| 461 | =================================================================== | ||
| 462 | --- linux-2.6.26-rc4.orig/sound/arm/pxa2xx-ac97.c 2008-05-26 19:08:11.000000000 +0100 | ||
| 463 | +++ linux-2.6.26-rc4/sound/arm/pxa2xx-ac97.c 2008-06-02 00:19:38.000000000 +0100 | ||
| 464 | @@ -156,10 +156,10 @@ | ||
| 465 | #ifdef CONFIG_PXA27x | ||
| 466 | /* warm reset broken on Bulverde, | ||
| 467 | so manually keep AC97 reset high */ | ||
| 468 | - pxa_gpio_mode(113 | GPIO_OUT | GPIO_DFLT_HIGH); | ||
| 469 | + pxa_gpio_mode(GPIO113_AC97_RESET_N | GPIO_OUT | GPIO_DFLT_HIGH); | ||
| 470 | udelay(10); | ||
| 471 | GCR |= GCR_WARM_RST; | ||
| 472 | - pxa_gpio_mode(113 | GPIO_ALT_FN_2_OUT); | ||
| 473 | + pxa_gpio_mode(GPIO113_AC97_RESET_N_MD); | ||
| 474 | udelay(500); | ||
| 475 | #elif defined(CONFIG_PXA3xx) | ||
| 476 | timeout = 100; | ||
| 477 | @@ -364,7 +364,7 @@ | ||
| 478 | pxa_gpio_mode(GPIO29_SDATA_IN_AC97_MD); | ||
| 479 | #ifdef CONFIG_PXA27x | ||
| 480 | /* Use GPIO 113 as AC97 Reset on Bulverde */ | ||
| 481 | - pxa_gpio_mode(113 | GPIO_ALT_FN_2_OUT); | ||
| 482 | + pxa_gpio_mode(GPIO113_AC97_RESET_N_MD | GPIO_ALT_FN_2_OUT); | ||
| 483 | ac97conf_clk = clk_get(&dev->dev, "AC97CONFCLK"); | ||
| 484 | if (IS_ERR(ac97conf_clk)) { | ||
| 485 | ret = PTR_ERR(ac97conf_clk); | ||
| 486 | Index: linux-2.6.26-rc4/include/asm-arm/arch-pxa/pxa2xx-gpio.h | ||
| 487 | =================================================================== | ||
| 488 | --- linux-2.6.26-rc4.orig/include/asm-arm/arch-pxa/pxa2xx-gpio.h 2008-06-02 00:18:07.000000000 +0100 | ||
| 489 | +++ linux-2.6.26-rc4/include/asm-arm/arch-pxa/pxa2xx-gpio.h 2008-06-02 00:18:28.000000000 +0100 | ||
| 490 | @@ -138,6 +138,7 @@ | ||
| 491 | #define GPIO102_nPCE_1 102 /* PCMCIA (PXA27x) */ | ||
| 492 | #define GPIO103_CIF_DD_3 103 /* Camera data pin 3 */ | ||
| 493 | #define GPIO104_CIF_DD_2 104 /* Camera data pin 2 */ | ||
| 494 | +#define GPIO104_pSKTSEL 104 /* PCMCIA Socket Select (PXA27x) */ | ||
| 495 | #define GPIO105_CIF_DD_1 105 /* Camera data pin 1 */ | ||
| 496 | #define GPIO106_CIF_DD_9 106 /* Camera data pin 9 */ | ||
| 497 | #define GPIO107_CIF_DD_8 107 /* Camera data pin 8 */ | ||
diff --git a/meta/packages/linux/linux-rp-2.6.25+2.6.26-rc4/versatile-armv6.patch b/meta/packages/linux/linux-rp-2.6.25+2.6.26-rc4/versatile-armv6.patch new file mode 100644 index 0000000000..6f2ca26a9a --- /dev/null +++ b/meta/packages/linux/linux-rp-2.6.25+2.6.26-rc4/versatile-armv6.patch | |||
| @@ -0,0 +1,17 @@ | |||
| 1 | --- | ||
| 2 | arch/arm/mm/Kconfig | 2 +- | ||
| 3 | 1 file changed, 1 insertion(+), 1 deletion(-) | ||
| 4 | |||
| 5 | Index: linux-2.6.26-rc4/arch/arm/mm/Kconfig | ||
| 6 | =================================================================== | ||
| 7 | --- linux-2.6.26-rc4.orig/arch/arm/mm/Kconfig 2008-05-26 19:08:11.000000000 +0100 | ||
| 8 | +++ linux-2.6.26-rc4/arch/arm/mm/Kconfig 2008-06-01 18:40:07.000000000 +0100 | ||
| 9 | @@ -387,7 +387,7 @@ | ||
| 10 | # ARMv6 | ||
| 11 | config CPU_V6 | ||
| 12 | bool "Support ARM V6 processor" | ||
| 13 | - depends on ARCH_INTEGRATOR || MACH_REALVIEW_EB || ARCH_OMAP2 || ARCH_MX3 || ARCH_MSM7X00A || MACH_REALVIEW_PB11MP || MACH_REALVIEW_PB1176 | ||
| 14 | + depends on ARCH_INTEGRATOR || MACH_REALVIEW_EB || ARCH_OMAP2 || ARCH_MX3 || ARCH_MSM7X00A || MACH_REALVIEW_PB11MP || MACH_REALVIEW_PB1176 || ARCH_VERSATILE_PB | ||
| 15 | default y if ARCH_MX3 | ||
| 16 | default y if ARCH_MSM7X00A | ||
| 17 | select CPU_32v6 | ||
diff --git a/meta/packages/linux/linux-rp-2.6.25+2.6.26-rc4/zylonite-boot.patch b/meta/packages/linux/linux-rp-2.6.25+2.6.26-rc4/zylonite-boot.patch new file mode 100644 index 0000000000..f41928eca5 --- /dev/null +++ b/meta/packages/linux/linux-rp-2.6.25+2.6.26-rc4/zylonite-boot.patch | |||
| @@ -0,0 +1,45 @@ | |||
| 1 | From 04c42f566c68b757fdadf54e0e0f9dfe9f3f9b06 Mon Sep 17 00:00:00 2001 | ||
| 2 | From: eric miao <eric.miao@marvell.com> | ||
| 3 | Date: Tue, 19 Jun 2007 16:42:53 +0800 | ||
| 4 | Subject: [PATCH] [PATCH] make zylonite boot | ||
| 5 | |||
| 6 | 1. reuse head-xscale.S for XSC3 | ||
| 7 | |||
| 8 | 2. add a workaround for machine ID assignment, which should be done | ||
| 9 | by boot loader | ||
| 10 | --- | ||
| 11 | arch/arm/boot/compressed/Makefile | 4 ++++ | ||
| 12 | arch/arm/boot/compressed/head-xscale.S | 5 +++++ | ||
| 13 | 2 files changed, 9 insertions(+) | ||
| 14 | |||
| 15 | Index: linux-2.6-pxa3/arch/arm/boot/compressed/Makefile | ||
| 16 | =================================================================== | ||
| 17 | --- linux-2.6-pxa3.orig/arch/arm/boot/compressed/Makefile 2007-09-24 11:25:57.000000000 +0200 | ||
| 18 | +++ linux-2.6-pxa3/arch/arm/boot/compressed/Makefile 2007-09-24 12:26:53.000000000 +0200 | ||
| 19 | @@ -40,6 +40,10 @@ | ||
| 20 | OBJS += head-xscale.o | ||
| 21 | endif | ||
| 22 | |||
| 23 | +ifeq ($(CONFIG_CPU_XSC3),y) | ||
| 24 | +OBJS += head-xscale.o | ||
| 25 | +endif | ||
| 26 | + | ||
| 27 | ifeq ($(CONFIG_PXA_SHARPSL),y) | ||
| 28 | OBJS += head-sharpsl.o | ||
| 29 | endif | ||
| 30 | Index: linux-2.6-pxa3/arch/arm/boot/compressed/head-xscale.S | ||
| 31 | =================================================================== | ||
| 32 | --- linux-2.6-pxa3.orig/arch/arm/boot/compressed/head-xscale.S 2007-09-24 11:42:27.000000000 +0200 | ||
| 33 | +++ linux-2.6-pxa3/arch/arm/boot/compressed/head-xscale.S 2007-09-24 12:26:02.000000000 +0200 | ||
| 34 | @@ -33,6 +33,11 @@ | ||
| 35 | bic r0, r0, #0x1000 @ clear Icache | ||
| 36 | mcr p15, 0, r0, c1, c0, 0 | ||
| 37 | |||
| 38 | +#ifdef CONFIG_MACH_ZYLONITE | ||
| 39 | + mov r7, #(MACH_TYPE_ZYLONITE & 0xff) | ||
| 40 | + orr r7, r7, #(MACH_TYPE_ZYLONITE & 0xff00) | ||
| 41 | +#endif | ||
| 42 | + | ||
| 43 | #ifdef CONFIG_ARCH_COTULLA_IDP | ||
| 44 | mov r7, #MACH_TYPE_COTULLA_IDP | ||
| 45 | #endif | ||
diff --git a/meta/packages/linux/linux-rp-2.6.25+2.6.26-rc4/zylonite_keypad-r0.patch b/meta/packages/linux/linux-rp-2.6.25+2.6.26-rc4/zylonite_keypad-r0.patch new file mode 100644 index 0000000000..1889b3884e --- /dev/null +++ b/meta/packages/linux/linux-rp-2.6.25+2.6.26-rc4/zylonite_keypad-r0.patch | |||
| @@ -0,0 +1,1187 @@ | |||
| 1 | Eric Miao's pxa keypad patchset backport. | ||
| 2 | --- | ||
| 3 | arch/arm/mach-pxa/devices.h | 1 | ||
| 4 | arch/arm/mach-pxa/generic.c | 31 + | ||
| 5 | arch/arm/mach-pxa/pxa27x.c | 2 | ||
| 6 | arch/arm/mach-pxa/pxa300.c | 6 | ||
| 7 | arch/arm/mach-pxa/pxa3xx.c | 1 | ||
| 8 | arch/arm/mach-pxa/zylonite.c | 68 +++ | ||
| 9 | drivers/input/keyboard/Kconfig | 8 | ||
| 10 | drivers/input/keyboard/Makefile | 2 | ||
| 11 | drivers/input/keyboard/pxa27x_keyboard.c | 273 ------------- | ||
| 12 | drivers/input/keyboard/pxa27x_keypad.c | 575 +++++++++++++++++++++++++++++ | ||
| 13 | include/asm-arm/arch-pxa/irqs.h | 2 | ||
| 14 | include/asm-arm/arch-pxa/pxa27x_keyboard.h | 13 | ||
| 15 | include/asm-arm/arch-pxa/pxa27x_keypad.h | 58 ++ | ||
| 16 | 13 files changed, 745 insertions(+), 295 deletions(-) | ||
| 17 | |||
| 18 | Index: linux-2.6.23-z-input/drivers/input/keyboard/Kconfig | ||
| 19 | =================================================================== | ||
| 20 | --- linux-2.6.23-z-input.orig/drivers/input/keyboard/Kconfig 2008-02-18 01:43:28.000000000 +0100 | ||
| 21 | +++ linux-2.6.23-z-input/drivers/input/keyboard/Kconfig 2008-02-18 01:43:28.000000000 +0100 | ||
| 22 | @@ -218,13 +218,13 @@ | ||
| 23 | module will be called omap-keypad. | ||
| 24 | |||
| 25 | config KEYBOARD_PXA27x | ||
| 26 | - tristate "PXA27x keyboard support" | ||
| 27 | - depends on PXA27x | ||
| 28 | + tristate "PXA27x/PXA3xx keypad support" | ||
| 29 | + depends on PXA27x || PXA3xx | ||
| 30 | help | ||
| 31 | - Enable support for PXA27x matrix keyboard controller | ||
| 32 | + Enable support for PXA27x/PXA3xx keypad controller | ||
| 33 | |||
| 34 | To compile this driver as a module, choose M here: the | ||
| 35 | - module will be called pxa27x_keyboard. | ||
| 36 | + module will be called pxa27x_keypad. | ||
| 37 | |||
| 38 | config KEYBOARD_AAED2000 | ||
| 39 | tristate "AAED-2000 keyboard" | ||
| 40 | Index: linux-2.6.23-z-input/drivers/input/keyboard/Makefile | ||
| 41 | =================================================================== | ||
| 42 | --- linux-2.6.23-z-input.orig/drivers/input/keyboard/Makefile 2008-02-18 01:43:28.000000000 +0100 | ||
| 43 | +++ linux-2.6.23-z-input/drivers/input/keyboard/Makefile 2008-02-18 01:43:28.000000000 +0100 | ||
| 44 | @@ -18,7 +18,7 @@ | ||
| 45 | obj-$(CONFIG_KEYBOARD_HIL) += hil_kbd.o | ||
| 46 | obj-$(CONFIG_KEYBOARD_HIL_OLD) += hilkbd.o | ||
| 47 | obj-$(CONFIG_KEYBOARD_OMAP) += omap-keypad.o | ||
| 48 | -obj-$(CONFIG_KEYBOARD_PXA27x) += pxa27x_keyboard.o | ||
| 49 | +obj-$(CONFIG_KEYBOARD_PXA27x) += pxa27x_keypad.o | ||
| 50 | obj-$(CONFIG_KEYBOARD_AAED2000) += aaed2000_kbd.o | ||
| 51 | obj-$(CONFIG_KEYBOARD_GPIO) += gpio_keys.o | ||
| 52 | obj-$(CONFIG_KEYBOARD_ASIC3) += asic3_keys.o | ||
| 53 | Index: linux-2.6.23-z-input/drivers/input/keyboard/pxa27x_keypad.c | ||
| 54 | =================================================================== | ||
| 55 | --- /dev/null 1970-01-01 00:00:00.000000000 +0000 | ||
| 56 | +++ linux-2.6.23-z-input/drivers/input/keyboard/pxa27x_keypad.c 2008-02-19 01:40:04.000000000 +0100 | ||
| 57 | @@ -0,0 +1,575 @@ | ||
| 58 | +/* | ||
| 59 | + * linux/drivers/input/keyboard/pxa27x_keypad.c | ||
| 60 | + * | ||
| 61 | + * Driver for the pxa27x matrix keyboard controller. | ||
| 62 | + * | ||
| 63 | + * Created: Feb 22, 2007 | ||
| 64 | + * Author: Rodolfo Giometti <giometti@linux.it> | ||
| 65 | + * | ||
| 66 | + * Based on a previous implementations by Kevin O'Connor | ||
| 67 | + * <kevin_at_koconnor.net> and Alex Osborne <bobofdoom@gmail.com> and | ||
| 68 | + * on some suggestions by Nicolas Pitre <nico@cam.org>. | ||
| 69 | + * | ||
| 70 | + * This program is free software; you can redistribute it and/or modify | ||
| 71 | + * it under the terms of the GNU General Public License version 2 as | ||
| 72 | + * published by the Free Software Foundation. | ||
| 73 | + */ | ||
| 74 | + | ||
| 75 | + | ||
| 76 | +#include <linux/kernel.h> | ||
| 77 | +#include <linux/module.h> | ||
| 78 | +#include <linux/init.h> | ||
| 79 | +#include <linux/interrupt.h> | ||
| 80 | +#include <linux/input.h> | ||
| 81 | +#include <linux/device.h> | ||
| 82 | +#include <linux/platform_device.h> | ||
| 83 | +#include <linux/clk.h> | ||
| 84 | +#include <linux/err.h> | ||
| 85 | + | ||
| 86 | +#include <asm/mach-types.h> | ||
| 87 | +#include <asm/mach/arch.h> | ||
| 88 | +#include <asm/mach/map.h> | ||
| 89 | + | ||
| 90 | +#include <asm/arch/hardware.h> | ||
| 91 | +#include <asm/arch/mfp.h> | ||
| 92 | +#include <asm/arch/pxa27x_keypad.h> | ||
| 93 | + | ||
| 94 | +#define BIT_MASK(nr) (1UL << ((nr) % BITS_PER_LONG)) | ||
| 95 | + | ||
| 96 | +/* | ||
| 97 | + * Keypad Controller registers | ||
| 98 | + */ | ||
| 99 | +#define KPC 0x0000 /* Keypad Control register */ | ||
| 100 | +#define KPDK 0x0008 /* Keypad Direct Key register */ | ||
| 101 | +#define KPREC 0x0010 /* Keypad Rotary Encoder register */ | ||
| 102 | +#define KPMK 0x0018 /* Keypad Matrix Key register */ | ||
| 103 | +#define KPAS 0x0020 /* Keypad Automatic Scan register */ | ||
| 104 | + | ||
| 105 | +/* Keypad Automatic Scan Multiple Key Presser register 0-3 */ | ||
| 106 | +#define KPASMKP0 0x0028 | ||
| 107 | +#define KPASMKP1 0x0030 | ||
| 108 | +#define KPASMKP2 0x0038 | ||
| 109 | +#define KPASMKP3 0x0040 | ||
| 110 | +#define KPKDI 0x0048 | ||
| 111 | + | ||
| 112 | +/* bit definitions */ | ||
| 113 | +#define KPC_MKRN(n) ((((n) - 1) & 0x7) << 26) /* matrix key row number */ | ||
| 114 | +#define KPC_MKCN(n) ((((n) - 1) & 0x7) << 23) /* matrix key column number */ | ||
| 115 | +#define KPC_DKN(n) ((((n) - 1) & 0x7) << 6) /* direct key number */ | ||
| 116 | + | ||
| 117 | +#define KPC_AS (0x1 << 30) /* Automatic Scan bit */ | ||
| 118 | +#define KPC_ASACT (0x1 << 29) /* Automatic Scan on Activity */ | ||
| 119 | +#define KPC_MI (0x1 << 22) /* Matrix interrupt bit */ | ||
| 120 | +#define KPC_IMKP (0x1 << 21) /* Ignore Multiple Key Press */ | ||
| 121 | + | ||
| 122 | +#define KPC_MS(n) (0x1 << (13 + (n))) /* Matrix scan line 'n' */ | ||
| 123 | +#define KPC_MS_ALL (0xff << 13) | ||
| 124 | + | ||
| 125 | +#define KPC_ME (0x1 << 12) /* Matrix Keypad Enable */ | ||
| 126 | +#define KPC_MIE (0x1 << 11) /* Matrix Interrupt Enable */ | ||
| 127 | +#define KPC_DK_DEB_SEL (0x1 << 9) /* Direct Keypad Debounce Select */ | ||
| 128 | +#define KPC_DI (0x1 << 5) /* Direct key interrupt bit */ | ||
| 129 | +#define KPC_RE_ZERO_DEB (0x1 << 4) /* Rotary Encoder Zero Debounce */ | ||
| 130 | +#define KPC_REE1 (0x1 << 3) /* Rotary Encoder1 Enable */ | ||
| 131 | +#define KPC_REE0 (0x1 << 2) /* Rotary Encoder0 Enable */ | ||
| 132 | +#define KPC_DE (0x1 << 1) /* Direct Keypad Enable */ | ||
| 133 | +#define KPC_DIE (0x1 << 0) /* Direct Keypad interrupt Enable */ | ||
| 134 | + | ||
| 135 | +#define KPDK_DKP (0x1 << 31) | ||
| 136 | +#define KPDK_DK(n) ((n) & 0xff) | ||
| 137 | + | ||
| 138 | +#define KPREC_OF1 (0x1 << 31) | ||
| 139 | +#define kPREC_UF1 (0x1 << 30) | ||
| 140 | +#define KPREC_OF0 (0x1 << 15) | ||
| 141 | +#define KPREC_UF0 (0x1 << 14) | ||
| 142 | + | ||
| 143 | +#define KPREC_RECOUNT0(n) ((n) & 0xff) | ||
| 144 | +#define KPREC_RECOUNT1(n) (((n) >> 16) & 0xff) | ||
| 145 | + | ||
| 146 | +#define KPMK_MKP (0x1 << 31) | ||
| 147 | +#define KPAS_SO (0x1 << 31) | ||
| 148 | +#define KPASMKPx_SO (0x1 << 31) | ||
| 149 | + | ||
| 150 | +#define KPAS_MUKP(n) (((n) >> 26) & 0x1f) | ||
| 151 | +#define KPAS_RP(n) (((n) >> 4) & 0xf) | ||
| 152 | +#define KPAS_CP(n) ((n) & 0xf) | ||
| 153 | + | ||
| 154 | +#define KPASMKP_MKC_MASK (0xff) | ||
| 155 | + | ||
| 156 | +#define keypad_readl(off) __raw_readl(keypad->mmio_base + (off)) | ||
| 157 | +#define keypad_writel(off, v) __raw_writel((v), keypad->mmio_base + (off)) | ||
| 158 | + | ||
| 159 | +#define MAX_MATRIX_KEY_NUM (8 * 8) | ||
| 160 | + | ||
| 161 | +struct pxa27x_keypad { | ||
| 162 | + struct pxa27x_keypad_platform_data *pdata; | ||
| 163 | + | ||
| 164 | + struct clk *clk; | ||
| 165 | + struct input_dev *input_dev; | ||
| 166 | + void __iomem *mmio_base; | ||
| 167 | + | ||
| 168 | + /* matrix key code map */ | ||
| 169 | + unsigned int matrix_keycodes[MAX_MATRIX_KEY_NUM]; | ||
| 170 | + | ||
| 171 | + /* state row bits of each column scan */ | ||
| 172 | + uint32_t matrix_key_state[MAX_MATRIX_KEY_COLS]; | ||
| 173 | + uint32_t direct_key_state; | ||
| 174 | + | ||
| 175 | + unsigned int direct_key_mask; | ||
| 176 | + | ||
| 177 | + int rotary_rel_code[2]; | ||
| 178 | + int rotary_up_key[2]; | ||
| 179 | + int rotary_down_key[2]; | ||
| 180 | +}; | ||
| 181 | + | ||
| 182 | +static void pxa27x_keypad_build_keycode(struct pxa27x_keypad *keypad) | ||
| 183 | +{ | ||
| 184 | + struct pxa27x_keypad_platform_data *pdata = keypad->pdata; | ||
| 185 | + struct input_dev *input_dev = keypad->input_dev; | ||
| 186 | + unsigned int *key; | ||
| 187 | + int i; | ||
| 188 | + | ||
| 189 | + key = &pdata->matrix_key_map[0]; | ||
| 190 | + for (i = 0; i < pdata->matrix_key_map_size; i++, key++) { | ||
| 191 | + int row = ((*key) >> 28) & 0xf; | ||
| 192 | + int col = ((*key) >> 24) & 0xf; | ||
| 193 | + int code = (*key) & 0xffffff; | ||
| 194 | + | ||
| 195 | + keypad->matrix_keycodes[(row << 3) + col] = code; | ||
| 196 | + set_bit(code, input_dev->keybit); | ||
| 197 | + } | ||
| 198 | + | ||
| 199 | + keypad->rotary_up_key[0] = pdata->rotary0_up_key; | ||
| 200 | + keypad->rotary_up_key[1] = pdata->rotary1_up_key; | ||
| 201 | + keypad->rotary_down_key[0] = pdata->rotary0_down_key; | ||
| 202 | + keypad->rotary_down_key[1] = pdata->rotary1_down_key; | ||
| 203 | + keypad->rotary_rel_code[0] = pdata->rotary0_rel_code; | ||
| 204 | + keypad->rotary_rel_code[1] = pdata->rotary1_rel_code; | ||
| 205 | + | ||
| 206 | + if (pdata->rotary0_up_key && pdata->rotary0_down_key) { | ||
| 207 | + set_bit(pdata->rotary0_up_key, input_dev->keybit); | ||
| 208 | + set_bit(pdata->rotary0_down_key, input_dev->keybit); | ||
| 209 | + } else | ||
| 210 | + set_bit(pdata->rotary0_rel_code, input_dev->relbit); | ||
| 211 | + | ||
| 212 | + if (pdata->rotary1_up_key && pdata->rotary1_down_key) { | ||
| 213 | + set_bit(pdata->rotary1_up_key, input_dev->keybit); | ||
| 214 | + set_bit(pdata->rotary1_down_key, input_dev->keybit); | ||
| 215 | + } else | ||
| 216 | + set_bit(pdata->rotary1_rel_code, input_dev->relbit); | ||
| 217 | +} | ||
| 218 | + | ||
| 219 | +static inline unsigned int lookup_matrix_keycode( | ||
| 220 | + struct pxa27x_keypad *keypad, int row, int col) | ||
| 221 | +{ | ||
| 222 | + return keypad->matrix_keycodes[(row << 3) + col]; | ||
| 223 | +} | ||
| 224 | + | ||
| 225 | +static void pxa27x_keypad_scan_matrix(struct pxa27x_keypad *keypad) | ||
| 226 | +{ | ||
| 227 | + struct pxa27x_keypad_platform_data *pdata = keypad->pdata; | ||
| 228 | + int row, col, num_keys_pressed = 0; | ||
| 229 | + uint32_t new_state[MAX_MATRIX_KEY_COLS]; | ||
| 230 | + uint32_t kpas = keypad_readl(KPAS); | ||
| 231 | + | ||
| 232 | + num_keys_pressed = KPAS_MUKP(kpas); | ||
| 233 | + | ||
| 234 | + memset(new_state, 0, sizeof(new_state)); | ||
| 235 | + | ||
| 236 | + if (num_keys_pressed == 0) | ||
| 237 | + goto scan; | ||
| 238 | + | ||
| 239 | + if (num_keys_pressed == 1) { | ||
| 240 | + col = KPAS_CP(kpas); | ||
| 241 | + row = KPAS_RP(kpas); | ||
| 242 | + | ||
| 243 | + /* if invalid row/col, treat as no key pressed */ | ||
| 244 | + if (col >= pdata->matrix_key_cols || | ||
| 245 | + row >= pdata->matrix_key_rows) | ||
| 246 | + goto scan; | ||
| 247 | + | ||
| 248 | + new_state[col] = (1 << row); | ||
| 249 | + goto scan; | ||
| 250 | + } | ||
| 251 | + | ||
| 252 | + if (num_keys_pressed > 1) { | ||
| 253 | + uint32_t kpasmkp0 = keypad_readl(KPASMKP0); | ||
| 254 | + uint32_t kpasmkp1 = keypad_readl(KPASMKP1); | ||
| 255 | + uint32_t kpasmkp2 = keypad_readl(KPASMKP2); | ||
| 256 | + uint32_t kpasmkp3 = keypad_readl(KPASMKP3); | ||
| 257 | + | ||
| 258 | + new_state[0] = kpasmkp0 & KPASMKP_MKC_MASK; | ||
| 259 | + new_state[1] = (kpasmkp0 >> 16) & KPASMKP_MKC_MASK; | ||
| 260 | + new_state[2] = kpasmkp1 & KPASMKP_MKC_MASK; | ||
| 261 | + new_state[3] = (kpasmkp1 >> 16) & KPASMKP_MKC_MASK; | ||
| 262 | + new_state[4] = kpasmkp2 & KPASMKP_MKC_MASK; | ||
| 263 | + new_state[5] = (kpasmkp2 >> 16) & KPASMKP_MKC_MASK; | ||
| 264 | + new_state[6] = kpasmkp3 & KPASMKP_MKC_MASK; | ||
| 265 | + new_state[7] = (kpasmkp3 >> 16) & KPASMKP_MKC_MASK; | ||
| 266 | + } | ||
| 267 | +scan: | ||
| 268 | + for (col = 0; col < pdata->matrix_key_cols; col++) { | ||
| 269 | + uint32_t bits_changed; | ||
| 270 | + | ||
| 271 | + bits_changed = keypad->matrix_key_state[col] ^ new_state[col]; | ||
| 272 | + if (bits_changed == 0) | ||
| 273 | + continue; | ||
| 274 | + | ||
| 275 | + for (row = 0; row < pdata->matrix_key_rows; row++) { | ||
| 276 | + if ((bits_changed & (1 << row)) == 0) | ||
| 277 | + continue; | ||
| 278 | + | ||
| 279 | + input_report_key(keypad->input_dev, | ||
| 280 | + lookup_matrix_keycode(keypad, row, col), | ||
| 281 | + new_state[col] & (1 << row)); | ||
| 282 | + } | ||
| 283 | + } | ||
| 284 | + input_sync(keypad->input_dev); | ||
| 285 | + memcpy(keypad->matrix_key_state, new_state, sizeof(new_state)); | ||
| 286 | +} | ||
| 287 | + | ||
| 288 | +#define DEFAULT_KPREC (0x007f007f) | ||
| 289 | + | ||
| 290 | +static inline int rotary_delta(uint32_t kprec) | ||
| 291 | +{ | ||
| 292 | + if (kprec & KPREC_OF0) | ||
| 293 | + return (kprec & 0xff) + 0x7f; | ||
| 294 | + else if (kprec & KPREC_UF0) | ||
| 295 | + return (kprec & 0xff) - 0x7f - 0xff; | ||
| 296 | + else | ||
| 297 | + return (kprec & 0xff) - 0x7f; | ||
| 298 | +} | ||
| 299 | + | ||
| 300 | +static void report_rotary_event(struct pxa27x_keypad *keypad, int r, int delta) | ||
| 301 | +{ | ||
| 302 | + struct input_dev *dev = keypad->input_dev; | ||
| 303 | + | ||
| 304 | + if (delta == 0) | ||
| 305 | + return; | ||
| 306 | + | ||
| 307 | + if (keypad->rotary_up_key[r] && keypad->rotary_down_key[r]) { | ||
| 308 | + int keycode = (delta > 0) ? keypad->rotary_up_key[r] : | ||
| 309 | + keypad->rotary_down_key[r]; | ||
| 310 | + | ||
| 311 | + /* simulate a press-n-release */ | ||
| 312 | + input_report_key(dev, keycode, 1); | ||
| 313 | + input_sync(dev); | ||
| 314 | + input_report_key(dev, keycode, 0); | ||
| 315 | + input_sync(dev); | ||
| 316 | + } else { | ||
| 317 | + input_report_rel(dev, keypad->rotary_rel_code[r], delta); | ||
| 318 | + input_sync(dev); | ||
| 319 | + } | ||
| 320 | +} | ||
| 321 | + | ||
| 322 | +static void pxa27x_keypad_scan_rotary(struct pxa27x_keypad *keypad) | ||
| 323 | +{ | ||
| 324 | + struct pxa27x_keypad_platform_data *pdata = keypad->pdata; | ||
| 325 | + uint32_t kprec; | ||
| 326 | + | ||
| 327 | + /* read and reset to default count value */ | ||
| 328 | + kprec = keypad_readl(KPREC); | ||
| 329 | + keypad_writel(KPREC, DEFAULT_KPREC); | ||
| 330 | + | ||
| 331 | + if (pdata->enable_rotary0) | ||
| 332 | + report_rotary_event(keypad, 0, rotary_delta(kprec)); | ||
| 333 | + | ||
| 334 | + if (pdata->enable_rotary1) | ||
| 335 | + report_rotary_event(keypad, 1, rotary_delta(kprec >> 16)); | ||
| 336 | +} | ||
| 337 | + | ||
| 338 | +static void pxa27x_keypad_scan_direct(struct pxa27x_keypad *keypad) | ||
| 339 | +{ | ||
| 340 | + struct pxa27x_keypad_platform_data *pdata = keypad->pdata; | ||
| 341 | + unsigned int new_state; | ||
| 342 | + uint32_t kpdk, bits_changed; | ||
| 343 | + int i; | ||
| 344 | + | ||
| 345 | + kpdk = keypad_readl(KPDK); | ||
| 346 | + | ||
| 347 | + if (pdata->enable_rotary0 || pdata->enable_rotary1) | ||
| 348 | + pxa27x_keypad_scan_rotary(keypad); | ||
| 349 | + | ||
| 350 | + if (pdata->direct_key_map == NULL) | ||
| 351 | + return; | ||
| 352 | + | ||
| 353 | + new_state = KPDK_DK(kpdk) & keypad->direct_key_mask; | ||
| 354 | + bits_changed = keypad->direct_key_state ^ new_state; | ||
| 355 | + | ||
| 356 | + if (bits_changed == 0) | ||
| 357 | + return; | ||
| 358 | + | ||
| 359 | + for (i = 0; i < pdata->direct_key_num; i++) { | ||
| 360 | + if (bits_changed & (1 << i)) | ||
| 361 | + input_report_key(keypad->input_dev, | ||
| 362 | + pdata->direct_key_map[i], | ||
| 363 | + (new_state & (1 << i))); | ||
| 364 | + } | ||
| 365 | + input_sync(keypad->input_dev); | ||
| 366 | + keypad->direct_key_state = new_state; | ||
| 367 | +} | ||
| 368 | + | ||
| 369 | +static irqreturn_t pxa27x_keypad_irq_handler(int irq, void *dev_id) | ||
| 370 | +{ | ||
| 371 | + struct pxa27x_keypad *keypad = dev_id; | ||
| 372 | + unsigned long kpc = keypad_readl(KPC); | ||
| 373 | + | ||
| 374 | + if (kpc & KPC_DI) | ||
| 375 | + pxa27x_keypad_scan_direct(keypad); | ||
| 376 | + | ||
| 377 | + if (kpc & KPC_MI) | ||
| 378 | + pxa27x_keypad_scan_matrix(keypad); | ||
| 379 | + | ||
| 380 | + return IRQ_HANDLED; | ||
| 381 | +} | ||
| 382 | + | ||
| 383 | +static void pxa27x_keypad_config(struct pxa27x_keypad *keypad) | ||
| 384 | +{ | ||
| 385 | + struct pxa27x_keypad_platform_data *pdata = keypad->pdata; | ||
| 386 | + unsigned int mask = 0, direct_key_num = 0; | ||
| 387 | + unsigned long kpc = 0; | ||
| 388 | + | ||
| 389 | + /* enable matrix keys with automatic scan */ | ||
| 390 | + if (pdata->matrix_key_rows && pdata->matrix_key_cols) { | ||
| 391 | + kpc |= KPC_ASACT | KPC_MIE | KPC_ME | KPC_MS_ALL; | ||
| 392 | + kpc |= KPC_MKRN(pdata->matrix_key_rows) | | ||
| 393 | + KPC_MKCN(pdata->matrix_key_cols); | ||
| 394 | + } | ||
| 395 | + | ||
| 396 | + /* enable rotary key, debounce interval same as direct keys */ | ||
| 397 | + if (pdata->enable_rotary0) { | ||
| 398 | + mask |= 0x03; | ||
| 399 | + direct_key_num = 2; | ||
| 400 | + kpc |= KPC_REE0; | ||
| 401 | + } | ||
| 402 | + | ||
| 403 | + if (pdata->enable_rotary1) { | ||
| 404 | + mask |= 0x0c; | ||
| 405 | + direct_key_num = 4; | ||
| 406 | + kpc |= KPC_REE1; | ||
| 407 | + } | ||
| 408 | + | ||
| 409 | + if (pdata->direct_key_num > direct_key_num) | ||
| 410 | + direct_key_num = pdata->direct_key_num; | ||
| 411 | + | ||
| 412 | + keypad->direct_key_mask = ((2 << direct_key_num) - 1) & ~mask; | ||
| 413 | + | ||
| 414 | + /* enable direct key */ | ||
| 415 | + if (direct_key_num) | ||
| 416 | + kpc |= KPC_DE | KPC_DIE | KPC_DKN(direct_key_num); | ||
| 417 | + | ||
| 418 | + keypad_writel(KPC, kpc | KPC_RE_ZERO_DEB); | ||
| 419 | + keypad_writel(KPREC, DEFAULT_KPREC); | ||
| 420 | + keypad_writel(KPKDI, pdata->debounce_interval); | ||
| 421 | +} | ||
| 422 | + | ||
| 423 | +static int pxa27x_keypad_open(struct input_dev *dev) | ||
| 424 | +{ | ||
| 425 | + struct pxa27x_keypad *keypad = input_get_drvdata(dev); | ||
| 426 | + | ||
| 427 | + /* Enable unit clock */ | ||
| 428 | + clk_enable(keypad->clk); | ||
| 429 | + pxa27x_keypad_config(keypad); | ||
| 430 | + | ||
| 431 | + return 0; | ||
| 432 | +} | ||
| 433 | + | ||
| 434 | +static void pxa27x_keypad_close(struct input_dev *dev) | ||
| 435 | +{ | ||
| 436 | + struct pxa27x_keypad *keypad = input_get_drvdata(dev); | ||
| 437 | + | ||
| 438 | + /* Disable clock unit */ | ||
| 439 | + clk_disable(keypad->clk); | ||
| 440 | +} | ||
| 441 | + | ||
| 442 | +#ifdef CONFIG_PM | ||
| 443 | +static int pxa27x_keypad_suspend(struct platform_device *pdev, pm_message_t state) | ||
| 444 | +{ | ||
| 445 | + struct pxa27x_keypad *keypad = platform_get_drvdata(pdev); | ||
| 446 | + | ||
| 447 | + clk_disable(keypad->clk); | ||
| 448 | + return 0; | ||
| 449 | +} | ||
| 450 | + | ||
| 451 | +static int pxa27x_keypad_resume(struct platform_device *pdev) | ||
| 452 | +{ | ||
| 453 | + struct pxa27x_keypad *keypad = platform_get_drvdata(pdev); | ||
| 454 | + struct input_dev *input_dev = keypad->input_dev; | ||
| 455 | + | ||
| 456 | + mutex_lock(&input_dev->mutex); | ||
| 457 | + | ||
| 458 | + if (input_dev->users) { | ||
| 459 | + /* Enable unit clock */ | ||
| 460 | + clk_enable(keypad->clk); | ||
| 461 | + pxa27x_keypad_config(keypad); | ||
| 462 | + } | ||
| 463 | + | ||
| 464 | + mutex_unlock(&input_dev->mutex); | ||
| 465 | + | ||
| 466 | + return 0; | ||
| 467 | +} | ||
| 468 | +#else | ||
| 469 | +#define pxa27x_keypad_suspend NULL | ||
| 470 | +#define pxa27x_keypad_resume NULL | ||
| 471 | +#endif | ||
| 472 | + | ||
| 473 | +#define res_size(res) ((res)->end - (res)->start + 1) | ||
| 474 | + | ||
| 475 | +static int __devinit pxa27x_keypad_probe(struct platform_device *pdev) | ||
| 476 | +{ | ||
| 477 | + struct pxa27x_keypad *keypad; | ||
| 478 | + struct input_dev *input_dev; | ||
| 479 | + struct resource *res; | ||
| 480 | + int irq, error; | ||
| 481 | + | ||
| 482 | + keypad = kzalloc(sizeof(struct pxa27x_keypad), GFP_KERNEL); | ||
| 483 | + if (keypad == NULL) { | ||
| 484 | + dev_err(&pdev->dev, "failed to allocate driver data\n"); | ||
| 485 | + return -ENOMEM; | ||
| 486 | + } | ||
| 487 | + | ||
| 488 | + keypad->pdata = pdev->dev.platform_data; | ||
| 489 | + if (keypad->pdata == NULL) { | ||
| 490 | + dev_err(&pdev->dev, "no platform data defined\n"); | ||
| 491 | + error = -EINVAL; | ||
| 492 | + goto failed_free; | ||
| 493 | + } | ||
| 494 | + | ||
| 495 | + irq = platform_get_irq(pdev, 0); | ||
| 496 | + if (irq < 0) { | ||
| 497 | + dev_err(&pdev->dev, "failed to get keypad irq\n"); | ||
| 498 | + error = -ENXIO; | ||
| 499 | + goto failed_free; | ||
| 500 | + } | ||
| 501 | + | ||
| 502 | + res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | ||
| 503 | + if (res == NULL) { | ||
| 504 | + dev_err(&pdev->dev, "failed to get I/O memory\n"); | ||
| 505 | + error = -ENXIO; | ||
| 506 | + goto failed_free; | ||
| 507 | + } | ||
| 508 | + | ||
| 509 | + res = request_mem_region(res->start, res_size(res), pdev->name); | ||
| 510 | + if (res == NULL) { | ||
| 511 | + dev_err(&pdev->dev, "failed to request I/O memory\n"); | ||
| 512 | + error = -EBUSY; | ||
| 513 | + goto failed_free; | ||
| 514 | + } | ||
| 515 | + | ||
| 516 | + keypad->mmio_base = ioremap(res->start, res_size(res)); | ||
| 517 | + if (keypad->mmio_base == NULL) { | ||
| 518 | + dev_err(&pdev->dev, "failed to remap I/O memory\n"); | ||
| 519 | + error = -ENXIO; | ||
| 520 | + goto failed_free_mem; | ||
| 521 | + } | ||
| 522 | + | ||
| 523 | + keypad->clk = clk_get(&pdev->dev, "KBDCLK"); | ||
| 524 | + if (IS_ERR(keypad->clk)) { | ||
| 525 | + dev_err(&pdev->dev, "failed to get keypad clock\n"); | ||
| 526 | + error = PTR_ERR(keypad->clk); | ||
| 527 | + goto failed_free_io; | ||
| 528 | + } | ||
| 529 | + | ||
| 530 | + /* Create and register the input driver. */ | ||
| 531 | + input_dev = input_allocate_device(); | ||
| 532 | + if (!input_dev) { | ||
| 533 | + dev_err(&pdev->dev, "failed to allocate input device\n"); | ||
| 534 | + error = -ENOMEM; | ||
| 535 | + goto failed_put_clk; | ||
| 536 | + } | ||
| 537 | + | ||
| 538 | + input_dev->name = pdev->name; | ||
| 539 | + input_dev->id.bustype = BUS_HOST; | ||
| 540 | + input_dev->open = pxa27x_keypad_open; | ||
| 541 | + input_dev->close = pxa27x_keypad_close; | ||
| 542 | + input_dev->dev.parent = &pdev->dev; | ||
| 543 | + | ||
| 544 | + keypad->input_dev = input_dev; | ||
| 545 | + input_set_drvdata(input_dev, keypad); | ||
| 546 | + | ||
| 547 | + input_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_REP) | | ||
| 548 | + BIT_MASK(EV_REL); | ||
| 549 | + | ||
| 550 | + pxa27x_keypad_build_keycode(keypad); | ||
| 551 | + platform_set_drvdata(pdev, keypad); | ||
| 552 | + | ||
| 553 | + error = request_irq(irq, pxa27x_keypad_irq_handler, IRQF_DISABLED, | ||
| 554 | + pdev->name, keypad); | ||
| 555 | + if (error) { | ||
| 556 | + dev_err(&pdev->dev, "failed to request IRQ\n"); | ||
| 557 | + goto failed_free_dev; | ||
| 558 | + } | ||
| 559 | + | ||
| 560 | + /* Register the input device */ | ||
| 561 | + error = input_register_device(input_dev); | ||
| 562 | + if (error) { | ||
| 563 | + dev_err(&pdev->dev, "failed to register input device\n"); | ||
| 564 | + goto failed_free_irq; | ||
| 565 | + } | ||
| 566 | + | ||
| 567 | + return 0; | ||
| 568 | + | ||
| 569 | +failed_free_irq: | ||
| 570 | + free_irq(irq, pdev); | ||
| 571 | + platform_set_drvdata(pdev, NULL); | ||
| 572 | +failed_free_dev: | ||
| 573 | + input_free_device(input_dev); | ||
| 574 | +failed_put_clk: | ||
| 575 | + clk_put(keypad->clk); | ||
| 576 | +failed_free_io: | ||
| 577 | + iounmap(keypad->mmio_base); | ||
| 578 | +failed_free_mem: | ||
| 579 | + release_mem_region(res->start, res_size(res)); | ||
| 580 | +failed_free: | ||
| 581 | + kfree(keypad); | ||
| 582 | + return error; | ||
| 583 | +} | ||
| 584 | + | ||
| 585 | +static int __devexit pxa27x_keypad_remove(struct platform_device *pdev) | ||
| 586 | +{ | ||
| 587 | + struct pxa27x_keypad *keypad = platform_get_drvdata(pdev); | ||
| 588 | + struct resource *res; | ||
| 589 | + | ||
| 590 | + free_irq(platform_get_irq(pdev, 0), pdev); | ||
| 591 | + | ||
| 592 | + clk_disable(keypad->clk); | ||
| 593 | + clk_put(keypad->clk); | ||
| 594 | + | ||
| 595 | + input_unregister_device(keypad->input_dev); | ||
| 596 | + input_free_device(keypad->input_dev); | ||
| 597 | + | ||
| 598 | + iounmap(keypad->mmio_base); | ||
| 599 | + | ||
| 600 | + res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | ||
| 601 | + release_mem_region(res->start, res_size(res)); | ||
| 602 | + | ||
| 603 | + platform_set_drvdata(pdev, NULL); | ||
| 604 | + kfree(keypad); | ||
| 605 | + return 0; | ||
| 606 | +} | ||
| 607 | + | ||
| 608 | +static struct platform_driver pxa27x_keypad_driver = { | ||
| 609 | + .probe = pxa27x_keypad_probe, | ||
| 610 | + .remove = __devexit_p(pxa27x_keypad_remove), | ||
| 611 | + .suspend = pxa27x_keypad_suspend, | ||
| 612 | + .resume = pxa27x_keypad_resume, | ||
| 613 | + .driver = { | ||
| 614 | + .name = "pxa27x-keypad", | ||
| 615 | + }, | ||
| 616 | +}; | ||
| 617 | + | ||
| 618 | +static int __init pxa27x_keypad_init(void) | ||
| 619 | +{ | ||
| 620 | + return platform_driver_register(&pxa27x_keypad_driver); | ||
| 621 | +} | ||
| 622 | + | ||
| 623 | +static void __exit pxa27x_keypad_exit(void) | ||
| 624 | +{ | ||
| 625 | + platform_driver_unregister(&pxa27x_keypad_driver); | ||
| 626 | +} | ||
| 627 | + | ||
| 628 | +module_init(pxa27x_keypad_init); | ||
| 629 | +module_exit(pxa27x_keypad_exit); | ||
| 630 | + | ||
| 631 | +MODULE_DESCRIPTION("PXA27x Keypad Controller Driver"); | ||
| 632 | +MODULE_LICENSE("GPL"); | ||
| 633 | Index: linux-2.6.23-z-input/include/asm-arm/arch-pxa/pxa27x_keyboard.h | ||
| 634 | =================================================================== | ||
| 635 | --- linux-2.6.23-z-input.orig/include/asm-arm/arch-pxa/pxa27x_keyboard.h 2007-10-09 22:31:38.000000000 +0200 | ||
| 636 | +++ /dev/null 1970-01-01 00:00:00.000000000 +0000 | ||
| 637 | @@ -1,13 +0,0 @@ | ||
| 638 | -#define PXAKBD_MAXROW 8 | ||
| 639 | -#define PXAKBD_MAXCOL 8 | ||
| 640 | - | ||
| 641 | -struct pxa27x_keyboard_platform_data { | ||
| 642 | - int nr_rows, nr_cols; | ||
| 643 | - int keycodes[PXAKBD_MAXROW][PXAKBD_MAXCOL]; | ||
| 644 | - int gpio_modes[PXAKBD_MAXROW + PXAKBD_MAXCOL]; | ||
| 645 | - | ||
| 646 | -#ifdef CONFIG_PM | ||
| 647 | - u32 reg_kpc; | ||
| 648 | - u32 reg_kprec; | ||
| 649 | -#endif | ||
| 650 | -}; | ||
| 651 | Index: linux-2.6.23-z-input/include/asm-arm/arch-pxa/pxa27x_keypad.h | ||
| 652 | =================================================================== | ||
| 653 | --- /dev/null 1970-01-01 00:00:00.000000000 +0000 | ||
| 654 | +++ linux-2.6.23-z-input/include/asm-arm/arch-pxa/pxa27x_keypad.h 2008-02-18 01:43:28.000000000 +0100 | ||
| 655 | @@ -0,0 +1,58 @@ | ||
| 656 | +#ifndef __ASM_ARCH_PXA27x_KEYPAD_H | ||
| 657 | +#define __ASM_ARCH_PXA27x_KEYPAD_H | ||
| 658 | + | ||
| 659 | +#include <linux/input.h> | ||
| 660 | + | ||
| 661 | +#define MAX_MATRIX_KEY_ROWS (8) | ||
| 662 | +#define MAX_MATRIX_KEY_COLS (8) | ||
| 663 | + | ||
| 664 | +/* pxa3xx keypad platform specific parameters | ||
| 665 | + * | ||
| 666 | + * NOTE: | ||
| 667 | + * 1. direct_key_num indicates the number of keys in the direct keypad | ||
| 668 | + * _plus_ the number of rotary-encoder sensor inputs, this can be | ||
| 669 | + * left as 0 if only rotary encoders are enabled, the driver will | ||
| 670 | + * automatically calculate this | ||
| 671 | + * | ||
| 672 | + * 2. direct_key_map is the key code map for the direct keys, if rotary | ||
| 673 | + * encoder(s) are enabled, direct key 0/1(2/3) will be ignored | ||
| 674 | + * | ||
| 675 | + * 3. rotary can be either interpreted as a relative input event (e.g. | ||
| 676 | + * REL_WHEEL/REL_HWHEEL) or specific keys (e.g. UP/DOWN/LEFT/RIGHT) | ||
| 677 | + * | ||
| 678 | + * 4. matrix key and direct key will use the same debounce_interval by | ||
| 679 | + * default, which should be sufficient in most cases | ||
| 680 | + */ | ||
| 681 | +struct pxa27x_keypad_platform_data { | ||
| 682 | + | ||
| 683 | + /* code map for the matrix keys */ | ||
| 684 | + unsigned int matrix_key_rows; | ||
| 685 | + unsigned int matrix_key_cols; | ||
| 686 | + unsigned int *matrix_key_map; | ||
| 687 | + int matrix_key_map_size; | ||
| 688 | + | ||
| 689 | + /* direct keys */ | ||
| 690 | + int direct_key_num; | ||
| 691 | + unsigned int direct_key_map[8]; | ||
| 692 | + | ||
| 693 | + /* rotary encoders 0 */ | ||
| 694 | + int enable_rotary0; | ||
| 695 | + int rotary0_rel_code; | ||
| 696 | + int rotary0_up_key; | ||
| 697 | + int rotary0_down_key; | ||
| 698 | + | ||
| 699 | + /* rotary encoders 1 */ | ||
| 700 | + int enable_rotary1; | ||
| 701 | + int rotary1_rel_code; | ||
| 702 | + int rotary1_up_key; | ||
| 703 | + int rotary1_down_key; | ||
| 704 | + | ||
| 705 | + /* key debounce interval */ | ||
| 706 | + unsigned int debounce_interval; | ||
| 707 | +}; | ||
| 708 | + | ||
| 709 | +#define KEY(row, col, val) (((row) << 28) | ((col) << 24) | (val)) | ||
| 710 | + | ||
| 711 | +extern void pxa_set_keypad_info(struct pxa27x_keypad_platform_data *info); | ||
| 712 | + | ||
| 713 | +#endif /* __ASM_ARCH_PXA27x_KEYPAD_H */ | ||
| 714 | Index: linux-2.6.23-z-input/drivers/input/keyboard/pxa27x_keyboard.c | ||
| 715 | =================================================================== | ||
| 716 | --- linux-2.6.23-z-input.orig/drivers/input/keyboard/pxa27x_keyboard.c 2008-02-18 01:43:28.000000000 +0100 | ||
| 717 | +++ /dev/null 1970-01-01 00:00:00.000000000 +0000 | ||
| 718 | @@ -1,273 +0,0 @@ | ||
| 719 | -/* | ||
| 720 | - * linux/drivers/input/keyboard/pxa27x_keyboard.c | ||
| 721 | - * | ||
| 722 | - * Driver for the pxa27x matrix keyboard controller. | ||
| 723 | - * | ||
| 724 | - * Created: Feb 22, 2007 | ||
| 725 | - * Author: Rodolfo Giometti <giometti@linux.it> | ||
| 726 | - * | ||
| 727 | - * Based on a previous implementations by Kevin O'Connor | ||
| 728 | - * <kevin_at_koconnor.net> and Alex Osborne <bobofdoom@gmail.com> and | ||
| 729 | - * on some suggestions by Nicolas Pitre <nico@cam.org>. | ||
| 730 | - * | ||
| 731 | - * This program is free software; you can redistribute it and/or modify | ||
| 732 | - * it under the terms of the GNU General Public License version 2 as | ||
| 733 | - * published by the Free Software Foundation. | ||
| 734 | - */ | ||
| 735 | - | ||
| 736 | - | ||
| 737 | -#include <linux/kernel.h> | ||
| 738 | -#include <linux/module.h> | ||
| 739 | -#include <linux/init.h> | ||
| 740 | -#include <linux/interrupt.h> | ||
| 741 | -#include <linux/input.h> | ||
| 742 | -#include <linux/device.h> | ||
| 743 | -#include <linux/platform_device.h> | ||
| 744 | -#include <linux/clk.h> | ||
| 745 | -#include <linux/err.h> | ||
| 746 | - | ||
| 747 | -#include <asm/mach-types.h> | ||
| 748 | -#include <asm/mach/arch.h> | ||
| 749 | -#include <asm/mach/map.h> | ||
| 750 | - | ||
| 751 | -#include <asm/arch/hardware.h> | ||
| 752 | -#include <asm/arch/pxa-regs.h> | ||
| 753 | -#include <asm/arch/irqs.h> | ||
| 754 | -#include <asm/arch/pxa27x_keyboard.h> | ||
| 755 | - | ||
| 756 | -#define DRIVER_NAME "pxa27x-keyboard" | ||
| 757 | - | ||
| 758 | -#define KPASMKP(col) (col/2 == 0 ? KPASMKP0 : \ | ||
| 759 | - col/2 == 1 ? KPASMKP1 : \ | ||
| 760 | - col/2 == 2 ? KPASMKP2 : KPASMKP3) | ||
| 761 | -#define KPASMKPx_MKC(row, col) (1 << (row + 16 * (col % 2))) | ||
| 762 | - | ||
| 763 | -static struct clk *pxakbd_clk; | ||
| 764 | - | ||
| 765 | -static irqreturn_t pxakbd_irq_handler(int irq, void *dev_id) | ||
| 766 | -{ | ||
| 767 | - struct platform_device *pdev = dev_id; | ||
| 768 | - struct pxa27x_keyboard_platform_data *pdata = pdev->dev.platform_data; | ||
| 769 | - struct input_dev *input_dev = platform_get_drvdata(pdev); | ||
| 770 | - unsigned long kpc = KPC; | ||
| 771 | - int p, row, col, rel; | ||
| 772 | - | ||
| 773 | - if (kpc & KPC_DI) { | ||
| 774 | - unsigned long kpdk = KPDK; | ||
| 775 | - | ||
| 776 | - if (!(kpdk & KPDK_DKP)) { | ||
| 777 | - /* better luck next time */ | ||
| 778 | - } else if (kpc & KPC_REE0) { | ||
| 779 | - unsigned long kprec = KPREC; | ||
| 780 | - KPREC = 0x7f; | ||
| 781 | - | ||
| 782 | - if (kprec & KPREC_OF0) | ||
| 783 | - rel = (kprec & 0xff) + 0x7f; | ||
| 784 | - else if (kprec & KPREC_UF0) | ||
| 785 | - rel = (kprec & 0xff) - 0x7f - 0xff; | ||
| 786 | - else | ||
| 787 | - rel = (kprec & 0xff) - 0x7f; | ||
| 788 | - | ||
| 789 | - if (rel) { | ||
| 790 | - input_report_rel(input_dev, REL_WHEEL, rel); | ||
| 791 | - input_sync(input_dev); | ||
| 792 | - } | ||
| 793 | - } | ||
| 794 | - } | ||
| 795 | - | ||
| 796 | - if (kpc & KPC_MI) { | ||
| 797 | - /* report the status of every button */ | ||
| 798 | - for (row = 0; row < pdata->nr_rows; row++) { | ||
| 799 | - for (col = 0; col < pdata->nr_cols; col++) { | ||
| 800 | - p = KPASMKP(col) & KPASMKPx_MKC(row, col) ? | ||
| 801 | - 1 : 0; | ||
| 802 | - pr_debug("keycode %x - pressed %x\n", | ||
| 803 | - pdata->keycodes[row][col], p); | ||
| 804 | - input_report_key(input_dev, | ||
| 805 | - pdata->keycodes[row][col], p); | ||
| 806 | - } | ||
| 807 | - } | ||
| 808 | - input_sync(input_dev); | ||
| 809 | - } | ||
| 810 | - | ||
| 811 | - return IRQ_HANDLED; | ||
| 812 | -} | ||
| 813 | - | ||
| 814 | -static int pxakbd_open(struct input_dev *dev) | ||
| 815 | -{ | ||
| 816 | - /* Set keypad control register */ | ||
| 817 | - KPC |= (KPC_ASACT | | ||
| 818 | - KPC_MS_ALL | | ||
| 819 | - (2 << 6) | KPC_REE0 | KPC_DK_DEB_SEL | | ||
| 820 | - KPC_ME | KPC_MIE | KPC_DE | KPC_DIE); | ||
| 821 | - | ||
| 822 | - KPC &= ~KPC_AS; /* disable automatic scan */ | ||
| 823 | - KPC &= ~KPC_IMKP; /* do not ignore multiple keypresses */ | ||
| 824 | - | ||
| 825 | - /* Set rotary count to mid-point value */ | ||
| 826 | - KPREC = 0x7F; | ||
| 827 | - | ||
| 828 | - /* Enable unit clock */ | ||
| 829 | - clk_enable(pxakbd_clk); | ||
| 830 | - | ||
| 831 | - return 0; | ||
| 832 | -} | ||
| 833 | - | ||
| 834 | -static void pxakbd_close(struct input_dev *dev) | ||
| 835 | -{ | ||
| 836 | - /* Disable clock unit */ | ||
| 837 | - clk_disable(pxakbd_clk); | ||
| 838 | -} | ||
| 839 | - | ||
| 840 | -#ifdef CONFIG_PM | ||
| 841 | -static int pxakbd_suspend(struct platform_device *pdev, pm_message_t state) | ||
| 842 | -{ | ||
| 843 | - struct pxa27x_keyboard_platform_data *pdata = pdev->dev.platform_data; | ||
| 844 | - | ||
| 845 | - /* Save controller status */ | ||
| 846 | - pdata->reg_kpc = KPC; | ||
| 847 | - pdata->reg_kprec = KPREC; | ||
| 848 | - | ||
| 849 | - return 0; | ||
| 850 | -} | ||
| 851 | - | ||
| 852 | -static int pxakbd_resume(struct platform_device *pdev) | ||
| 853 | -{ | ||
| 854 | - struct pxa27x_keyboard_platform_data *pdata = pdev->dev.platform_data; | ||
| 855 | - struct input_dev *input_dev = platform_get_drvdata(pdev); | ||
| 856 | - | ||
| 857 | - mutex_lock(&input_dev->mutex); | ||
| 858 | - | ||
| 859 | - if (input_dev->users) { | ||
| 860 | - /* Restore controller status */ | ||
| 861 | - KPC = pdata->reg_kpc; | ||
| 862 | - KPREC = pdata->reg_kprec; | ||
| 863 | - | ||
| 864 | - /* Enable unit clock */ | ||
| 865 | - clk_disable(pxakbd_clk); | ||
| 866 | - clk_enable(pxakbd_clk); | ||
| 867 | - } | ||
| 868 | - | ||
| 869 | - mutex_unlock(&input_dev->mutex); | ||
| 870 | - | ||
| 871 | - return 0; | ||
| 872 | -} | ||
| 873 | -#else | ||
| 874 | -#define pxakbd_suspend NULL | ||
| 875 | -#define pxakbd_resume NULL | ||
| 876 | -#endif | ||
| 877 | - | ||
| 878 | -static int __devinit pxakbd_probe(struct platform_device *pdev) | ||
| 879 | -{ | ||
| 880 | - struct pxa27x_keyboard_platform_data *pdata = pdev->dev.platform_data; | ||
| 881 | - struct input_dev *input_dev; | ||
| 882 | - int i, row, col, error; | ||
| 883 | - | ||
| 884 | - pxakbd_clk = clk_get(&pdev->dev, "KBDCLK"); | ||
| 885 | - if (IS_ERR(pxakbd_clk)) { | ||
| 886 | - error = PTR_ERR(pxakbd_clk); | ||
| 887 | - goto err_clk; | ||
| 888 | - } | ||
| 889 | - | ||
| 890 | - /* Create and register the input driver. */ | ||
| 891 | - input_dev = input_allocate_device(); | ||
| 892 | - if (!input_dev) { | ||
| 893 | - printk(KERN_ERR "Cannot request keypad device\n"); | ||
| 894 | - error = -ENOMEM; | ||
| 895 | - goto err_alloc; | ||
| 896 | - } | ||
| 897 | - | ||
| 898 | - input_dev->name = DRIVER_NAME; | ||
| 899 | - input_dev->id.bustype = BUS_HOST; | ||
| 900 | - input_dev->open = pxakbd_open; | ||
| 901 | - input_dev->close = pxakbd_close; | ||
| 902 | - input_dev->dev.parent = &pdev->dev; | ||
| 903 | - | ||
| 904 | - input_dev->evbit[0] = BIT(EV_KEY) | BIT(EV_REP) | BIT(EV_REL); | ||
| 905 | - input_dev->relbit[LONG(REL_WHEEL)] = BIT(REL_WHEEL); | ||
| 906 | - for (row = 0; row < pdata->nr_rows; row++) { | ||
| 907 | - for (col = 0; col < pdata->nr_cols; col++) { | ||
| 908 | - int code = pdata->keycodes[row][col]; | ||
| 909 | - if (code > 0) | ||
| 910 | - set_bit(code, input_dev->keybit); | ||
| 911 | - } | ||
| 912 | - } | ||
| 913 | - | ||
| 914 | - error = request_irq(IRQ_KEYPAD, pxakbd_irq_handler, IRQF_DISABLED, | ||
| 915 | - DRIVER_NAME, pdev); | ||
| 916 | - if (error) { | ||
| 917 | - printk(KERN_ERR "Cannot request keypad IRQ\n"); | ||
| 918 | - goto err_free_dev; | ||
| 919 | - } | ||
| 920 | - | ||
| 921 | - platform_set_drvdata(pdev, input_dev); | ||
| 922 | - | ||
| 923 | - /* Register the input device */ | ||
| 924 | - error = input_register_device(input_dev); | ||
| 925 | - if (error) | ||
| 926 | - goto err_free_irq; | ||
| 927 | - | ||
| 928 | - /* Setup GPIOs. */ | ||
| 929 | - for (i = 0; i < pdata->nr_rows + pdata->nr_cols; i++) | ||
| 930 | - pxa_gpio_mode(pdata->gpio_modes[i]); | ||
| 931 | - | ||
| 932 | - /* | ||
| 933 | - * Store rows/cols info into keyboard registers. | ||
| 934 | - */ | ||
| 935 | - | ||
| 936 | - KPC |= (pdata->nr_rows - 1) << 26; | ||
| 937 | - KPC |= (pdata->nr_cols - 1) << 23; | ||
| 938 | - | ||
| 939 | - for (col = 0; col < pdata->nr_cols; col++) | ||
| 940 | - KPC |= KPC_MS0 << col; | ||
| 941 | - | ||
| 942 | - return 0; | ||
| 943 | - | ||
| 944 | - err_free_irq: | ||
| 945 | - platform_set_drvdata(pdev, NULL); | ||
| 946 | - free_irq(IRQ_KEYPAD, pdev); | ||
| 947 | - err_free_dev: | ||
| 948 | - input_free_device(input_dev); | ||
| 949 | - err_alloc: | ||
| 950 | - clk_put(pxakbd_clk); | ||
| 951 | - err_clk: | ||
| 952 | - return error; | ||
| 953 | -} | ||
| 954 | - | ||
| 955 | -static int __devexit pxakbd_remove(struct platform_device *pdev) | ||
| 956 | -{ | ||
| 957 | - struct input_dev *input_dev = platform_get_drvdata(pdev); | ||
| 958 | - | ||
| 959 | - input_unregister_device(input_dev); | ||
| 960 | - free_irq(IRQ_KEYPAD, pdev); | ||
| 961 | - clk_put(pxakbd_clk); | ||
| 962 | - platform_set_drvdata(pdev, NULL); | ||
| 963 | - | ||
| 964 | - return 0; | ||
| 965 | -} | ||
| 966 | - | ||
| 967 | -static struct platform_driver pxakbd_driver = { | ||
| 968 | - .probe = pxakbd_probe, | ||
| 969 | - .remove = __devexit_p(pxakbd_remove), | ||
| 970 | - .suspend = pxakbd_suspend, | ||
| 971 | - .resume = pxakbd_resume, | ||
| 972 | - .driver = { | ||
| 973 | - .name = DRIVER_NAME, | ||
| 974 | - }, | ||
| 975 | -}; | ||
| 976 | - | ||
| 977 | -static int __init pxakbd_init(void) | ||
| 978 | -{ | ||
| 979 | - return platform_driver_register(&pxakbd_driver); | ||
| 980 | -} | ||
| 981 | - | ||
| 982 | -static void __exit pxakbd_exit(void) | ||
| 983 | -{ | ||
| 984 | - platform_driver_unregister(&pxakbd_driver); | ||
| 985 | -} | ||
| 986 | - | ||
| 987 | -module_init(pxakbd_init); | ||
| 988 | -module_exit(pxakbd_exit); | ||
| 989 | - | ||
| 990 | -MODULE_DESCRIPTION("PXA27x Matrix Keyboard Driver"); | ||
| 991 | -MODULE_LICENSE("GPL"); | ||
| 992 | Index: linux-2.6.23-z-input/arch/arm/mach-pxa/zylonite.c | ||
| 993 | =================================================================== | ||
| 994 | --- linux-2.6.23-z-input.orig/arch/arm/mach-pxa/zylonite.c 2008-02-18 01:43:28.000000000 +0100 | ||
| 995 | +++ linux-2.6.23-z-input/arch/arm/mach-pxa/zylonite.c 2008-02-19 01:31:33.000000000 +0100 | ||
| 996 | @@ -25,6 +25,7 @@ | ||
| 997 | #include <asm/arch/gpio.h> | ||
| 998 | #include <asm/arch/pxafb.h> | ||
| 999 | #include <asm/arch/zylonite.h> | ||
| 1000 | +#include <asm/arch/pxa27x_keypad.h> | ||
| 1001 | |||
| 1002 | #include "generic.h" | ||
| 1003 | |||
| 1004 | @@ -173,6 +174,72 @@ | ||
| 1005 | static inline void zylonite_init_lcd(void) {} | ||
| 1006 | #endif | ||
| 1007 | |||
| 1008 | +#if defined(CONFIG_KEYBOARD_PXA27x) || defined(CONFIG_KEYBOARD_PXA27x_MODULES) | ||
| 1009 | +static unsigned int zylonite_matrix_key_map[] = { | ||
| 1010 | + /* KEY(row, col, key_code) */ | ||
| 1011 | + KEY(0, 0, KEY_A), KEY(0, 1, KEY_B), KEY(0, 2, KEY_C), KEY(0, 5, KEY_D), | ||
| 1012 | + KEY(1, 0, KEY_E), KEY(1, 1, KEY_F), KEY(1, 2, KEY_G), KEY(1, 5, KEY_H), | ||
| 1013 | + KEY(2, 0, KEY_I), KEY(2, 1, KEY_J), KEY(2, 2, KEY_K), KEY(2, 5, KEY_L), | ||
| 1014 | + KEY(3, 0, KEY_M), KEY(3, 1, KEY_N), KEY(3, 2, KEY_O), KEY(3, 5, KEY_P), | ||
| 1015 | + KEY(5, 0, KEY_Q), KEY(5, 1, KEY_R), KEY(5, 2, KEY_S), KEY(5, 5, KEY_T), | ||
| 1016 | + KEY(6, 0, KEY_U), KEY(6, 1, KEY_V), KEY(6, 2, KEY_W), KEY(6, 5, KEY_X), | ||
| 1017 | + KEY(7, 1, KEY_Y), KEY(7, 2, KEY_Z), | ||
| 1018 | + | ||
| 1019 | + KEY(4, 4, KEY_0), KEY(1, 3, KEY_1), KEY(4, 1, KEY_2), KEY(1, 4, KEY_3), | ||
| 1020 | + KEY(2, 3, KEY_4), KEY(4, 2, KEY_5), KEY(2, 4, KEY_6), KEY(3, 3, KEY_7), | ||
| 1021 | + KEY(4, 3, KEY_8), KEY(3, 4, KEY_9), | ||
| 1022 | + | ||
| 1023 | + KEY(4, 5, KEY_SPACE), | ||
| 1024 | + KEY(5, 3, KEY_KPASTERISK), /* * */ | ||
| 1025 | + KEY(5, 4, KEY_KPDOT), /* #" */ | ||
| 1026 | + | ||
| 1027 | + KEY(0, 7, KEY_UP), | ||
| 1028 | + KEY(1, 7, KEY_DOWN), | ||
| 1029 | + KEY(2, 7, KEY_LEFT), | ||
| 1030 | + KEY(3, 7, KEY_RIGHT), | ||
| 1031 | + KEY(2, 6, KEY_HOME), | ||
| 1032 | + KEY(3, 6, KEY_END), | ||
| 1033 | + KEY(6, 4, KEY_DELETE), | ||
| 1034 | + KEY(6, 6, KEY_BACK), | ||
| 1035 | + KEY(6, 3, KEY_CAPSLOCK), /* KEY_LEFTSHIFT), */ | ||
| 1036 | + | ||
| 1037 | + KEY(4, 6, KEY_ENTER), /* scroll push */ | ||
| 1038 | + KEY(5, 7, KEY_ENTER), /* keypad action */ | ||
| 1039 | + | ||
| 1040 | + KEY(0, 4, KEY_EMAIL), | ||
| 1041 | + KEY(5, 6, KEY_SEND), | ||
| 1042 | + KEY(4, 0, KEY_CALENDAR), | ||
| 1043 | + KEY(7, 6, KEY_RECORD), | ||
| 1044 | + KEY(6, 7, KEY_VOLUMEUP), | ||
| 1045 | + KEY(7, 7, KEY_VOLUMEDOWN), | ||
| 1046 | + | ||
| 1047 | + KEY(0, 6, KEY_F22), /* soft1 */ | ||
| 1048 | + KEY(1, 6, KEY_F23), /* soft2 */ | ||
| 1049 | + KEY(0, 3, KEY_AUX), /* contact */ | ||
| 1050 | +}; | ||
| 1051 | + | ||
| 1052 | +static struct pxa27x_keypad_platform_data zylonite_keypad_info = { | ||
| 1053 | + .matrix_key_rows = 8, | ||
| 1054 | + .matrix_key_cols = 8, | ||
| 1055 | + .matrix_key_map = zylonite_matrix_key_map, | ||
| 1056 | + .matrix_key_map_size = ARRAY_SIZE(zylonite_matrix_key_map), | ||
| 1057 | + | ||
| 1058 | + .enable_rotary0 = 1, | ||
| 1059 | + .rotary0_up_key = KEY_UP, | ||
| 1060 | + .rotary0_down_key = KEY_DOWN, | ||
| 1061 | + | ||
| 1062 | + .debounce_interval = 30, | ||
| 1063 | +}; | ||
| 1064 | + | ||
| 1065 | +static void __init zylonite_init_keypad(void) | ||
| 1066 | +{ | ||
| 1067 | + pxa_set_keypad_info(&zylonite_keypad_info); | ||
| 1068 | +} | ||
| 1069 | +#else | ||
| 1070 | +static inline void zylonite_init_keypad(void) {} | ||
| 1071 | +#endif | ||
| 1072 | + | ||
| 1073 | + | ||
| 1074 | static void __init zylonite_init(void) | ||
| 1075 | { | ||
| 1076 | /* board-processor specific initialization */ | ||
| 1077 | @@ -190,6 +257,7 @@ | ||
| 1078 | platform_device_register(&touch_device); | ||
| 1079 | |||
| 1080 | zylonite_init_lcd(); | ||
| 1081 | + zylonite_init_keypad(); | ||
| 1082 | } | ||
| 1083 | |||
| 1084 | MACHINE_START(ZYLONITE, "PXA3xx Platform Development Kit (aka Zylonite)") | ||
| 1085 | Index: linux-2.6.23-z-input/arch/arm/mach-pxa/devices.h | ||
| 1086 | =================================================================== | ||
| 1087 | --- linux-2.6.23-z-input.orig/arch/arm/mach-pxa/devices.h 2008-02-18 01:43:28.000000000 +0100 | ||
| 1088 | +++ linux-2.6.23-z-input/arch/arm/mach-pxa/devices.h 2008-02-18 01:43:28.000000000 +0100 | ||
| 1089 | @@ -12,3 +12,4 @@ | ||
| 1090 | |||
| 1091 | extern struct platform_device pxa27x_device_i2c_power; | ||
| 1092 | extern struct platform_device pxa27x_device_ohci; | ||
| 1093 | +extern struct platform_device pxa27x_device_keypad; | ||
| 1094 | Index: linux-2.6.23-z-input/arch/arm/mach-pxa/generic.c | ||
| 1095 | =================================================================== | ||
| 1096 | --- linux-2.6.23-z-input.orig/arch/arm/mach-pxa/generic.c 2008-02-18 01:43:28.000000000 +0100 | ||
| 1097 | +++ linux-2.6.23-z-input/arch/arm/mach-pxa/generic.c 2008-02-18 01:43:28.000000000 +0100 | ||
| 1098 | @@ -450,3 +450,34 @@ | ||
| 1099 | .name = "sa1100-rtc", | ||
| 1100 | .id = -1, | ||
| 1101 | }; | ||
| 1102 | + | ||
| 1103 | +static struct resource pxa27x_resource_keypad[] = { | ||
| 1104 | + [0] = { | ||
| 1105 | + .start = 0x41500000, | ||
| 1106 | + .end = 0x4150004c, | ||
| 1107 | + .flags = IORESOURCE_MEM, | ||
| 1108 | + }, | ||
| 1109 | + [1] = { | ||
| 1110 | + .start = IRQ_KEYPAD, | ||
| 1111 | + .end = IRQ_KEYPAD, | ||
| 1112 | + .flags = IORESOURCE_IRQ, | ||
| 1113 | + }, | ||
| 1114 | +}; | ||
| 1115 | + | ||
| 1116 | +struct platform_device pxa27x_device_keypad = { | ||
| 1117 | + .name = "pxa27x-keypad", | ||
| 1118 | + .id = -1, | ||
| 1119 | + .resource = pxa27x_resource_keypad, | ||
| 1120 | + .num_resources = ARRAY_SIZE(pxa27x_resource_keypad), | ||
| 1121 | +}; | ||
| 1122 | + | ||
| 1123 | +void __init pxa_set_keypad_info(struct pxa27x_keypad_platform_data *info) | ||
| 1124 | +{ | ||
| 1125 | + int ret; | ||
| 1126 | + | ||
| 1127 | + pxa27x_device_keypad.dev.platform_data = info; | ||
| 1128 | + | ||
| 1129 | + ret = platform_device_register(&pxa27x_device_keypad); | ||
| 1130 | + if (ret) | ||
| 1131 | + dev_err(&pxa27x_device_keypad.dev, "unable to register device: %d\n", ret); | ||
| 1132 | +} | ||
| 1133 | Index: linux-2.6.23-z-input/arch/arm/mach-pxa/pxa27x.c | ||
| 1134 | =================================================================== | ||
| 1135 | --- linux-2.6.23-z-input.orig/arch/arm/mach-pxa/pxa27x.c 2008-02-18 01:43:28.000000000 +0100 | ||
| 1136 | +++ linux-2.6.23-z-input/arch/arm/mach-pxa/pxa27x.c 2008-02-18 01:43:28.000000000 +0100 | ||
| 1137 | @@ -148,7 +148,7 @@ | ||
| 1138 | |||
| 1139 | INIT_CKEN("USBCLK", USB, 48000000, 0, &pxa27x_device_ohci.dev), | ||
| 1140 | INIT_CKEN("I2CCLK", PWRI2C, 13000000, 0, &pxa27x_device_i2c_power.dev), | ||
| 1141 | - INIT_CKEN("KBDCLK", KEYPAD, 32768, 0, NULL), | ||
| 1142 | + INIT_CKEN("KBDCLK", KEYPAD, 32768, 0, &pxa27x_device_keypad.dev), | ||
| 1143 | |||
| 1144 | /* | ||
| 1145 | INIT_CKEN("PWMCLK", PWM0, 13000000, 0, NULL), | ||
| 1146 | Index: linux-2.6.23-z-input/arch/arm/mach-pxa/pxa3xx.c | ||
| 1147 | =================================================================== | ||
| 1148 | --- linux-2.6.23-z-input.orig/arch/arm/mach-pxa/pxa3xx.c 2008-02-18 01:43:28.000000000 +0100 | ||
| 1149 | +++ linux-2.6.23-z-input/arch/arm/mach-pxa/pxa3xx.c 2008-02-19 01:32:40.000000000 +0100 | ||
| 1150 | @@ -159,6 +159,7 @@ | ||
| 1151 | static struct clk pxa3xx_clks[] = { | ||
| 1152 | INIT_CK("LCDCLK", LCD, &clk_pxa3xx_hsio_ops, &pxa_device_fb.dev), | ||
| 1153 | INIT_CK("CAMCLK", CAMERA, &clk_pxa3xx_hsio_ops, NULL), | ||
| 1154 | + INIT_CK("KBDCLK", KEYPAD, &clk_pxa3xx_hsio_ops, &pxa27x_device_keypad.dev), | ||
| 1155 | |||
| 1156 | INIT_CKEN("UARTCLK", FFUART, 14857000, 1, &pxa_device_ffuart.dev), | ||
| 1157 | INIT_CKEN("UARTCLK", BTUART, 14857000, 1, &pxa_device_btuart.dev), | ||
| 1158 | Index: linux-2.6.23-z-input/include/asm-arm/arch-pxa/irqs.h | ||
| 1159 | =================================================================== | ||
| 1160 | --- linux-2.6.23-z-input.orig/include/asm-arm/arch-pxa/irqs.h 2008-02-18 01:43:28.000000000 +0100 | ||
| 1161 | +++ linux-2.6.23-z-input/include/asm-arm/arch-pxa/irqs.h 2008-02-18 01:43:28.000000000 +0100 | ||
| 1162 | @@ -13,7 +13,7 @@ | ||
| 1163 | |||
| 1164 | #define PXA_IRQ(x) (x) | ||
| 1165 | |||
| 1166 | -#ifdef CONFIG_PXA27x | ||
| 1167 | +#if defined(CONFIG_PXA27x) || defined(CONFIG_PXA3xx) | ||
| 1168 | #define IRQ_SSP3 PXA_IRQ(0) /* SSP3 service request */ | ||
| 1169 | #define IRQ_MSL PXA_IRQ(1) /* MSL Interface interrupt */ | ||
| 1170 | #define IRQ_USBH2 PXA_IRQ(2) /* USB Host interrupt 1 (OHCI) */ | ||
| 1171 | Index: linux-2.6.23-z-input/arch/arm/mach-pxa/pxa300.c | ||
| 1172 | =================================================================== | ||
| 1173 | --- linux-2.6.23-z-input.orig/arch/arm/mach-pxa/pxa300.c 2008-02-19 01:33:58.000000000 +0100 | ||
| 1174 | +++ linux-2.6.23-z-input/arch/arm/mach-pxa/pxa300.c 2008-02-19 01:34:35.000000000 +0100 | ||
| 1175 | @@ -23,8 +23,10 @@ | ||
| 1176 | |||
| 1177 | MFP_ADDR_X(GPIO0, GPIO2, 0x00b4), | ||
| 1178 | MFP_ADDR_X(GPIO3, GPIO26, 0x027c), | ||
| 1179 | - MFP_ADDR_X(GPIO27, GPIO127, 0x0400), | ||
| 1180 | - MFP_ADDR_X(GPIO0_2, GPIO6_2, 0x02ec), | ||
| 1181 | + MFP_ADDR_X(GPIO27, GPIO98, 0x0400), | ||
| 1182 | + MFP_ADDR_X(GPIO99, GPIO127, 0x0600), | ||
| 1183 | + MFP_ADDR_X(GPIO0_2, GPIO1_2, 0x0674), | ||
| 1184 | + MFP_ADDR_X(GPIO2_2, GPIO6_2, 0x02dc), | ||
| 1185 | |||
| 1186 | MFP_ADDR(nBE0, 0x0204), | ||
| 1187 | MFP_ADDR(nBE1, 0x0208), | ||
diff --git a/meta/packages/linux/linux-rp-2.6.25+2.6.26-rc4/zylonite_mtd-r0.patch b/meta/packages/linux/linux-rp-2.6.25+2.6.26-rc4/zylonite_mtd-r0.patch new file mode 100644 index 0000000000..cb5a9c5f72 --- /dev/null +++ b/meta/packages/linux/linux-rp-2.6.25+2.6.26-rc4/zylonite_mtd-r0.patch | |||
| @@ -0,0 +1,4093 @@ | |||
| 1 | Gross hacks to make the Zylonite boot from flash in VGA. | ||
| 2 | |||
| 3 | Flash driver forward ported to 2.6.14 | ||
| 4 | |||
| 5 | Index: linux-2.6.23/drivers/mtd/nand/Kconfig | ||
| 6 | =================================================================== | ||
| 7 | --- linux-2.6.23.orig/drivers/mtd/nand/Kconfig 2007-10-09 21:31:38.000000000 +0100 | ||
| 8 | +++ linux-2.6.23/drivers/mtd/nand/Kconfig 2008-02-13 00:59:45.000000000 +0000 | ||
| 9 | @@ -223,6 +223,10 @@ | ||
| 10 | tristate "Support for NAND Flash on Sharp SL Series (C7xx + others)" | ||
| 11 | depends on ARCH_PXA | ||
| 12 | |||
| 13 | +config MTD_NAND_ZYLONITE | ||
| 14 | + tristate "Support for NAND Flash on Zylonite" | ||
| 15 | + depends on ARCH_PXA | ||
| 16 | + | ||
| 17 | config MTD_NAND_BASLER_EXCITE | ||
| 18 | tristate "Support for NAND Flash on Basler eXcite" | ||
| 19 | depends on BASLER_EXCITE | ||
| 20 | Index: linux-2.6.23/drivers/mtd/nand/Makefile | ||
| 21 | =================================================================== | ||
| 22 | --- linux-2.6.23.orig/drivers/mtd/nand/Makefile 2007-10-09 21:31:38.000000000 +0100 | ||
| 23 | +++ linux-2.6.23/drivers/mtd/nand/Makefile 2008-02-13 00:59:45.000000000 +0000 | ||
| 24 | @@ -19,6 +19,7 @@ | ||
| 25 | obj-$(CONFIG_MTD_NAND_H1900) += h1910.o | ||
| 26 | obj-$(CONFIG_MTD_NAND_RTC_FROM4) += rtc_from4.o | ||
| 27 | obj-$(CONFIG_MTD_NAND_SHARPSL) += sharpsl.o | ||
| 28 | +obj-$(CONFIG_MTD_NAND_ZYLONITE) += mhn_nand.o | ||
| 29 | obj-$(CONFIG_MTD_NAND_TS7250) += ts7250.o | ||
| 30 | obj-$(CONFIG_MTD_NAND_NANDSIM) += nandsim.o | ||
| 31 | obj-$(CONFIG_MTD_NAND_CS553X) += cs553x_nand.o | ||
| 32 | Index: linux-2.6.23/drivers/mtd/nand/mhn_nand.c | ||
| 33 | =================================================================== | ||
| 34 | --- /dev/null 1970-01-01 00:00:00.000000000 +0000 | ||
| 35 | +++ linux-2.6.23/drivers/mtd/nand/mhn_nand.c 2008-02-13 00:59:45.000000000 +0000 | ||
| 36 | @@ -0,0 +1,3869 @@ | ||
| 37 | +/* | ||
| 38 | + * drivers/mtd/nand/mhn_nand.c | ||
| 39 | + * | ||
| 40 | + * Copyright (C) 2005 Intel Coporation (chao.xie@intel.com) | ||
| 41 | + * | ||
| 42 | + * This program is free software; you can redistribute it and/or modify | ||
| 43 | + * it under the terms of the GNU General Public License version 2 as | ||
| 44 | + * published by the Free Software Foundation. | ||
| 45 | + * | ||
| 46 | + * Overview: | ||
| 47 | + * This is a device driver for the NAND flash device on zylonite board | ||
| 48 | + * which utilizes the Samsung K9K1216Q0C parts. This is a 64Mibit NAND | ||
| 49 | + * flash device. | ||
| 50 | + | ||
| 51 | + *(C) Copyright 2006 Marvell International Ltd. | ||
| 52 | + * All Rights Reserved | ||
| 53 | + */ | ||
| 54 | + | ||
| 55 | +#include <linux/slab.h> | ||
| 56 | +#include <linux/module.h> | ||
| 57 | +#include <linux/mtd/mtd.h> | ||
| 58 | +#include <linux/mtd/nand.h> | ||
| 59 | +#include <linux/mtd/partitions.h> | ||
| 60 | +#include <linux/interrupt.h> | ||
| 61 | +#include <linux/device.h> | ||
| 62 | +#include <linux/platform_device.h> | ||
| 63 | +#include <linux/delay.h> | ||
| 64 | +#include <linux/dma-mapping.h> | ||
| 65 | +#include <asm/hardware.h> | ||
| 66 | +#include <asm/io.h> | ||
| 67 | +#include <asm/irq.h> | ||
| 68 | +#include <asm/delay.h> | ||
| 69 | +#include <asm/dma.h> | ||
| 70 | +#include <asm/arch/mfp.h> | ||
| 71 | +//#include <asm/arch/cpu-freq-voltage-mhn.h> | ||
| 72 | + | ||
| 73 | +//#define NDCR 0xf0000000 | ||
| 74 | +//#define NDCR (*((volatile u32 *)0xf0000000)) | ||
| 75 | +//#define NDCR __REG_2(0x43100000) /* Data Flash Control register */ | ||
| 76 | +#define NDCR_SPARE_EN (0x1<<31) | ||
| 77 | +#define NDCR_ECC_EN (0x1<<30) | ||
| 78 | +#define NDCR_DMA_EN (0x1<<29) | ||
| 79 | +#define NDCR_ND_RUN (0x1<<28) | ||
| 80 | +#define NDCR_DWIDTH_C (0x1<<27) | ||
| 81 | +#define NDCR_DWIDTH_M (0x1<<26) | ||
| 82 | +#define NDCR_PAGE_SZ (0x1<<24) | ||
| 83 | +#define NDCR_NCSX (0x1<<23) | ||
| 84 | +#define NDCR_ND_MODE (0x3<<21) | ||
| 85 | +#define NDCR_NAND_MODE 0x0 | ||
| 86 | +#define NDCR_CLR_PG_CNT (0x1<<20) | ||
| 87 | +#define NDCR_CLR_ECC ( 0x1<<19) | ||
| 88 | +#define NDCR_RD_ID_CNT_MASK (0x7<<16) | ||
| 89 | +#define NDCR_RD_ID_CNT(x) (((x) << 16) & NDCR_RD_ID_CNT_MASK) | ||
| 90 | +#define NDCR_RA_START (0x1<<15) | ||
| 91 | +#define NDCR_PG_PER_BLK (0x1<<14) | ||
| 92 | +#define NDCR_ND_ARB_EN (0x1<<12) | ||
| 93 | + | ||
| 94 | +//#define NDSR (*((volatile u32 *)0xf0000014)) | ||
| 95 | +//#define NDSR __REG_2(0x43100014) /* Data Controller Status Register */ | ||
| 96 | +#define NDSR_RDY (0x1<<11) | ||
| 97 | +#define NDSR_CS0_PAGED (0x1<<10) | ||
| 98 | +#define NDSR_CS1_PAGED (0x1<<9) | ||
| 99 | +#define NDSR_CS0_CMDD (0x1<<8) | ||
| 100 | +#define NDSR_CS1_CMDD (0x1<<7) | ||
| 101 | +#define NDSR_CS0_BBD (0x1<<6) | ||
| 102 | +#define NDSR_CS1_BBD (0x1<<5) | ||
| 103 | +#define NDSR_DBERR (0x1<<4) | ||
| 104 | +#define NDSR_SBERR (0x1<<3) | ||
| 105 | +#define NDSR_WRDREQ (0x1<<2) | ||
| 106 | +#define NDSR_RDDREQ (0x1<<1) | ||
| 107 | +#define NDSR_WRCMDREQ (0x1) | ||
| 108 | + | ||
| 109 | +#define OSCR __REG(0x40A00010) /* OS Timer Counter Register */ | ||
| 110 | +//#define NDCB0 __REG_2(0x43100048) /* Data Controller Command Buffer0 */ | ||
| 111 | +//#define NDCB1 __REG_2(0x4310004C) /* Data Controller Command Buffer1 */ | ||
| 112 | +//#define NDCB2 __REG_2(0x43100050) /* Data Controller Command Buffer2 */ | ||
| 113 | +#define NDCB0_AUTO_RS (0x1<<25) | ||
| 114 | +#define NDCB0_CSEL (0x1<<24) | ||
| 115 | +#define NDCB0_CMD_TYPE_MASK (0x7<<21) | ||
| 116 | +#define NDCB0_CMD_TYPE(x) (((x) << 21) & NDCB0_CMD_TYPE_MASK) | ||
| 117 | +#define NDCB0_NC (0x1<<20) | ||
| 118 | +#define NDCB0_DBC (0x1<<19) | ||
| 119 | +#define NDCB0_ADDR_CYC_MASK (0x7<<16) | ||
| 120 | +#define NDCB0_ADDR_CYC(x) (((x) << 16) & NDCB0_ADDR_CYC_MASK) | ||
| 121 | +#define NDCB0_CMD2_MASK (0xff<<8) | ||
| 122 | +#define NDCB0_CMD1_MASK (0xff) | ||
| 123 | +#define NDCB0_ADDR_CYC_SHIFT (16) | ||
| 124 | +#define DCMD0 __REG(0x4000020c) /* DMA Command Address Register Channel 0 */ | ||
| 125 | +#define DCMD1 __REG(0x4000021c) /* DMA Command Address Register Channel 1 */ | ||
| 126 | +#define DCMD2 __REG(0x4000022c) /* DMA Command Address Register Channel 2 */ | ||
| 127 | +#define DCMD3 __REG(0x4000023c) /* DMA Command Address Register Channel 3 */ | ||
| 128 | +#define DCMD4 __REG(0x4000024c) /* DMA Command Address Register Channel 4 */ | ||
| 129 | +#define DCMD5 __REG(0x4000025c) /* DMA Command Address Register Channel 5 */ | ||
| 130 | +#define DCMD6 __REG(0x4000026c) /* DMA Command Address Register Channel 6 */ | ||
| 131 | +#define DCMD7 __REG(0x4000027c) /* DMA Command Address Register Channel 7 */ | ||
| 132 | +#define DCMD8 __REG(0x4000028c) /* DMA Command Address Register Channel 8 */ | ||
| 133 | +#define DCMD9 __REG(0x4000029c) /* DMA Command Address Register Channel 9 */ | ||
| 134 | +#define DCMD10 __REG(0x400002ac) /* DMA Command Address Register Channel 10 */ | ||
| 135 | +#define DCMD11 __REG(0x400002bc) /* DMA Command Address Register Channel 11 */ | ||
| 136 | +#define DCMD12 __REG(0x400002cc) /* DMA Command Address Register Channel 12 */ | ||
| 137 | +#define DCMD13 __REG(0x400002dc) /* DMA Command Address Register Channel 13 */ | ||
| 138 | +#define DCMD14 __REG(0x400002ec) /* DMA Command Address Register Channel 14 */ | ||
| 139 | +#define DCMD15 __REG(0x400002fc) /* DMA Command Address Register Channel 15 */ | ||
| 140 | +#define DCMD(x) __REG2(0x4000020c, (x) << 4) | ||
| 141 | +#define DCMD_INCSRCADDR (1 << 31) /* Source Address Increment Setting. */ | ||
| 142 | +#define DCMD_INCTRGADDR (1 << 30) /* Target Address Increment Setting. */ | ||
| 143 | +#define DCMD_FLOWSRC (1 << 29) /* Flow Control by the source. */ | ||
| 144 | +#define DCMD_FLOWTRG (1 << 28) /* Flow Control by the target. */ | ||
| 145 | +#define DCMD_STARTIRQEN (1 << 22) /* Start Interrupt Enable */ | ||
| 146 | +#define DCMD_ENDIRQEN (1 << 21) /* End Interrupt Enable */ | ||
| 147 | +#define DCMD_ENDIAN (1 << 18) /* Device Endian-ness. */ | ||
| 148 | +#define DCMD_BURST8 (1 << 16) /* 8 byte burst */ | ||
| 149 | +#define DCMD_BURST16 (2 << 16) /* 16 byte burst */ | ||
| 150 | +#define DCMD_BURST32 (3 << 16) /* 32 byte burst */ | ||
| 151 | +#define DCMD_WIDTH1 (1 << 14) /* 1 byte width */ | ||
| 152 | +#define DCMD_WIDTH2 (2 << 14) /* 2 byte width (HalfWord) */ | ||
| 153 | +#define DCMD_WIDTH4 (3 << 14) /* 4 byte width (Word) */ | ||
| 154 | +#define DCMD_LENGTH 0x01fff /* length mask (max = 8K - 1) */ | ||
| 155 | +#define DCMD_RXPCDR (DCMD_INCTRGADDR|DCMD_FLOWSRC|DCMD_BURST32|DCMD_WIDTH4) | ||
| 156 | +#define DCMD_RXMCDR (DCMD_INCTRGADDR|DCMD_FLOWSRC|DCMD_BURST32|DCMD_WIDTH4) | ||
| 157 | +#define DCMD_TXPCDR (DCMD_INCSRCADDR|DCMD_FLOWTRG|DCMD_BURST32|DCMD_WIDTH4) | ||
| 158 | +#define DRCMR(n) __REG2(0x40000100, (n)<<2) | ||
| 159 | +#define DRCMR97 __REG(0x40001184) /* Request to Channel Map Register for NAND interface data transmit & receive Request */ | ||
| 160 | +#define DRCMR98 __REG(0x40001188) /* Reserved */ | ||
| 161 | +#define DRCMR99 __REG(0x4000118C) /* Request to Channel Map Register for NAND interface command transmit Request */ | ||
| 162 | +#define DRCMRRXSADR DRCMR2 | ||
| 163 | +#define DRCMRTXSADR DRCMR3 | ||
| 164 | +#define DRCMRRXBTRBR DRCMR4 | ||
| 165 | +#define DRCMRTXBTTHR DRCMR5 | ||
| 166 | +#define DRCMRRXFFRBR DRCMR6 | ||
| 167 | +#define DRCMRTXFFTHR DRCMR7 | ||
| 168 | +#define DRCMRRXMCDR DRCMR8 | ||
| 169 | +#define DRCMRRXMODR DRCMR9 | ||
| 170 | +#define DRCMRTXMODR DRCMR10 | ||
| 171 | +#define DRCMRRXPCDR DRCMR11 | ||
| 172 | +#define DRCMRTXPCDR DRCMR12 | ||
| 173 | +#define DRCMRRXSSDR DRCMR13 | ||
| 174 | +#define DRCMRTXSSDR DRCMR14 | ||
| 175 | +#define DRCMRRXICDR DRCMR17 | ||
| 176 | +#define DRCMRTXICDR DRCMR18 | ||
| 177 | +#define DRCMRRXSTRBR DRCMR19 | ||
| 178 | +#define DRCMRTXSTTHR DRCMR20 | ||
| 179 | +#define DRCMRRXMMC DRCMR21 | ||
| 180 | +#define DRCMRTXMMC DRCMR22 | ||
| 181 | +#define DRCMRRXMMC2 DRCMR93 | ||
| 182 | +#define DRCMRTXMMC2 DRCMR94 | ||
| 183 | +#define DRCMRRXMMC3 DRCMR100 | ||
| 184 | +#define DRCMRTXMMC3 DRCMR101 | ||
| 185 | +#define DRCMRUDC(x) DRCMR((x) + 24) | ||
| 186 | +#define DRCMR_MAPVLD (1 << 7) /* Map Valid (read / write) */ | ||
| 187 | +#define DRCMR_CHLNUM 0x1f /* mask for Channel Number (read / write) */ | ||
| 188 | +#define DCSR0 __REG(0x40000000) /* DMA Control / Status Register for Channel 0 */ | ||
| 189 | +#define DCSR1 __REG(0x40000004) /* DMA Control / Status Register for Channel 1 */ | ||
| 190 | +#define DCSR2 __REG(0x40000008) /* DMA Control / Status Register for Channel 2 */ | ||
| 191 | +#define DCSR3 __REG(0x4000000c) /* DMA Control / Status Register for Channel 3 */ | ||
| 192 | +#define DCSR4 __REG(0x40000010) /* DMA Control / Status Register for Channel 4 */ | ||
| 193 | +#define DCSR5 __REG(0x40000014) /* DMA Control / Status Register for Channel 5 */ | ||
| 194 | +#define DCSR6 __REG(0x40000018) /* DMA Control / Status Register for Channel 6 */ | ||
| 195 | +#define DCSR7 __REG(0x4000001c) /* DMA Control / Status Register for Channel 7 */ | ||
| 196 | +#define DCSR8 __REG(0x40000020) /* DMA Control / Status Register for Channel 8 */ | ||
| 197 | +#define DCSR9 __REG(0x40000024) /* DMA Control / Status Register for Channel 9 */ | ||
| 198 | +#define DCSR10 __REG(0x40000028) /* DMA Control / Status Register for Channel 10 */ | ||
| 199 | +#define DCSR11 __REG(0x4000002c) /* DMA Control / Status Register for Channel 11 */ | ||
| 200 | +#define DCSR12 __REG(0x40000030) /* DMA Control / Status Register for Channel 12 */ | ||
| 201 | +#define DCSR13 __REG(0x40000034) /* DMA Control / Status Register for Channel 13 */ | ||
| 202 | +#define DCSR14 __REG(0x40000038) /* DMA Control / Status Register for Channel 14 */ | ||
| 203 | +#define DCSR15 __REG(0x4000003c) /* DMA Control / Status Register for Channel 15 */ | ||
| 204 | +#define DCSR16 __REG(0x40000040) /* DMA Control / Status Register for Channel 16 */ | ||
| 205 | +#define DCSR17 __REG(0x40000044) /* DMA Control / Status Register for Channel 17 */ | ||
| 206 | +#define DCSR18 __REG(0x40000048) /* DMA Control / Status Register for Channel 18 */ | ||
| 207 | +#define DCSR19 __REG(0x4000004c) /* DMA Control / Status Register for Channel 19 */ | ||
| 208 | +#define DCSR20 __REG(0x40000050) /* DMA Control / Status Register for Channel 20 */ | ||
| 209 | +#define DCSR21 __REG(0x40000054) /* DMA Control / Status Register for Channel 21 */ | ||
| 210 | +#define DCSR22 __REG(0x40000058) /* DMA Control / Status Register for Channel 22 */ | ||
| 211 | +#define DCSR23 __REG(0x4000005c) /* DMA Control / Status Register for Channel 23 */ | ||
| 212 | +#define DCSR24 __REG(0x40000060) /* DMA Control / Status Register for Channel 24 */ | ||
| 213 | +#define DCSR25 __REG(0x40000064) /* DMA Control / Status Register for Channel 25 */ | ||
| 214 | +#define DCSR26 __REG(0x40000068) /* DMA Control / Status Register for Channel 26 */ | ||
| 215 | +#define DCSR27 __REG(0x4000006c) /* DMA Control / Status Register for Channel 27 */ | ||
| 216 | +#define DCSR28 __REG(0x40000070) /* DMA Control / Status Register for Channel 28 */ | ||
| 217 | +#define DCSR29 __REG(0x40000074) /* DMA Control / Status Register for Channel 29 */ | ||
| 218 | +#define DCSR30 __REG(0x40000078) /* DMA Control / Status Register for Channel 30 */ | ||
| 219 | +#define DCSR31 __REG(0x4000007c) /* DMA Control / Status Register for Channel 31 */ | ||
| 220 | +#define DCSR(x) __REG2(0x40000000, (x) << 2) | ||
| 221 | +#define DCSR_RUN (1 << 31) /* Run Bit (read / write) */ | ||
| 222 | +#define DCSR_NODESC (1 << 30) /* No-Descriptor Fetch (read / write) */ | ||
| 223 | +#define DCSR_STOPIRQEN (1 << 29) /* Stop Interrupt Enable (read / write) */ | ||
| 224 | +#define DCSR_EORIRQEN (1 << 28) /* End of Receive Interrupt Enable (R/W) */ | ||
| 225 | +#define DCSR_EORJMPEN (1 << 27) /* Jump to next descriptor on EOR */ | ||
| 226 | +#define DCSR_EORSTOPEN (1 << 26) /* STOP on an EOR */ | ||
| 227 | +#define DCSR_SETCMPST (1 << 25) /* Set Descriptor Compare Status */ | ||
| 228 | +#define DCSR_CLRCMPST (1 << 24) /* Clear Descriptor Compare Status */ | ||
| 229 | +#define DCSR_CMPST (1 << 10) /* The Descriptor Compare Status */ | ||
| 230 | +#define DCSR_EORINTR (1 << 9) /* The end of Receive */ | ||
| 231 | +#define DCSR_REQPEND (1 << 8) /* Request Pending (read-only) */ | ||
| 232 | +#define DCSR_RASINTR (1 << 4) /* Request After Channel Stopped */ | ||
| 233 | +#define DCSR_STOPSTATE (1 << 3) /* Stop State (read-only) */ | ||
| 234 | +#define DCSR_ENDINTR (1 << 2) /* End Interrupt (read / write) */ | ||
| 235 | +#define DCSR_STARTINTR (1 << 1) /* Start Interrupt (read / write) */ | ||
| 236 | +#define DCSR_BUSERR (1 << 0) /* Bus Error Interrupt (read / write) */ | ||
| 237 | +#define DDADR(x) __REG2(0x40000200, (x) << 4) | ||
| 238 | +//#define __REG_2(x) (*((volatile u32 *)io_p2v_2(x))) | ||
| 239 | +#define IRQ_NAND PXA_IRQ(45) | ||
| 240 | +#define CKEN_NAND 4 ///< NAND Flash Controller Clock Enable | ||
| 241 | + | ||
| 242 | +/* #define CONFIG_MTD_NAND_MONAHANS_DEBUG */ | ||
| 243 | +#ifdef CONFIG_MTD_NAND_MONAHANS_DEBUG | ||
| 244 | +#define D1(x) do { \ | ||
| 245 | + printk(KERN_DEBUG "%s: ", __FUNCTION__); \ | ||
| 246 | + x; \ | ||
| 247 | + }while(0) | ||
| 248 | + | ||
| 249 | +#define DPRINTK(fmt,args...) printk(KERN_DEBUG fmt, ##args ) | ||
| 250 | +#define PRINT_BUF(buf, num) print_buf(buf, num) | ||
| 251 | +#else | ||
| 252 | +#define D1(x) | ||
| 253 | +#define DPRINTK(fmt,args...) | ||
| 254 | +#define PRINT_BUF(buf, num) | ||
| 255 | +#endif | ||
| 256 | + | ||
| 257 | +/* DFC timing 0 register */ | ||
| 258 | +#define DFC_TIMING_tRP 0 | ||
| 259 | +#define DFC_TIMING_tRH 3 | ||
| 260 | +#define DFC_TIMING_tWP 8 | ||
| 261 | +#define DFC_TIMING_tWH 11 | ||
| 262 | +#define DFC_TIMING_tCS 16 | ||
| 263 | +#define DFC_TIMING_tCH 19 | ||
| 264 | + | ||
| 265 | +/* DFC timing 1 register */ | ||
| 266 | +#define DFC_TIMING_tAR 0 | ||
| 267 | +#define DFC_TIMING_tWHR 4 | ||
| 268 | +#define DFC_TIMING_tR 16 | ||
| 269 | + | ||
| 270 | +/* max value for each timing setting in DFC */ | ||
| 271 | +#define DFC_TIMING_MAX_tCH 7 | ||
| 272 | +#define DFC_TIMING_MAX_tCS 7 | ||
| 273 | +#define DFC_TIMING_MAX_tWH 7 | ||
| 274 | +#define DFC_TIMING_MAX_tWP 7 | ||
| 275 | +#define DFC_TIMING_MAX_tRH 7 | ||
| 276 | +#define DFC_TIMING_MAX_tRP 7 | ||
| 277 | +#define DFC_TIMING_MAX_tR 65535 | ||
| 278 | +#define DFC_TIMING_MAX_tWHR 15 | ||
| 279 | +#define DFC_TIMING_MAX_tAR 15 | ||
| 280 | + | ||
| 281 | +/* | ||
| 282 | + * The Data Flash Controller Flash timing structure | ||
| 283 | + * For NAND flash used on Zylonite board(Samsung K9K1216Q0C), | ||
| 284 | + * user should use value at end of each row of following member | ||
| 285 | + * bracketed. | ||
| 286 | + */ | ||
| 287 | +struct dfc_flash_timing { | ||
| 288 | + uint32_t tCH; /* Enable signal hold time */ | ||
| 289 | + uint32_t tCS; /* Enable signal setup time */ | ||
| 290 | + uint32_t tWH; /* ND_nWE high duration */ | ||
| 291 | + uint32_t tWP; /* ND_nWE pulse time */ | ||
| 292 | + uint32_t tRH; /* ND_nRE high duration */ | ||
| 293 | + uint32_t tRP; /* ND_nRE pulse width */ | ||
| 294 | + uint32_t tR; /* ND_nWE high to ND_nRE low for read */ | ||
| 295 | + uint32_t tWHR;/* ND_nWE high to ND_nRE low delay for status read */ | ||
| 296 | + uint32_t tAR; /* ND_ALE low to ND_nRE low delay */ | ||
| 297 | +}; | ||
| 298 | + | ||
| 299 | +/* DFC command type */ | ||
| 300 | +enum { | ||
| 301 | + DFC_CMD_READ = 0x00000000, | ||
| 302 | + DFC_CMD_PROGRAM = 0x00200000, | ||
| 303 | + DFC_CMD_ERASE = 0x00400000, | ||
| 304 | + DFC_CMD_READ_ID = 0x00600000, | ||
| 305 | + DFC_CMD_STATUS_READ = 0x00800000, | ||
| 306 | + DFC_CMD_RESET = 0x00a00000 | ||
| 307 | +}; | ||
| 308 | + | ||
| 309 | +/* | ||
| 310 | + * The Data Flash Controller Flash specification structure | ||
| 311 | + * For NAND flash used on Zylonite board(Samsung K9K1216Q0C), | ||
| 312 | + * user should use value at end of each row of following member | ||
| 313 | + * bracketed. | ||
| 314 | + */ | ||
| 315 | +struct dfc_flash_info { | ||
| 316 | + struct dfc_flash_timing timing; /* NAND Flash timing */ | ||
| 317 | + | ||
| 318 | + int enable_arbiter;/* Data flash bus arbiter enable (ND_ARB_EN) */ | ||
| 319 | + uint32_t page_per_block;/* Pages per block (PG_PER_BLK) */ | ||
| 320 | + uint32_t row_addr_start;/* Row address start position (RA_START) */ | ||
| 321 | + uint32_t read_id_bytes; /* returned ID bytes(RD_ID_CNT) */ | ||
| 322 | + uint32_t dfc_mode; /* NAND, CARBONDALE, PIXLEY... (ND_MODE) */ | ||
| 323 | + uint32_t ncsx; /* Chip select don't care bit (NCSX) */ | ||
| 324 | + uint32_t page_size; /* Page size in bytes (PAGE_SZ) */ | ||
| 325 | + uint32_t oob_size; /* OOB size */ | ||
| 326 | + uint32_t flash_width; /* Width of Flash memory (DWIDTH_M) */ | ||
| 327 | + uint32_t dfc_width; /* Width of flash controller(DWIDTH_C) */ | ||
| 328 | + uint32_t num_blocks; /* Number of physical blocks in Flash */ | ||
| 329 | + uint32_t chip_id; | ||
| 330 | + | ||
| 331 | + /* command codes */ | ||
| 332 | + uint32_t read1; /* Read */ | ||
| 333 | + uint32_t read2; /* unused, DFC don't support yet */ | ||
| 334 | + uint32_t program; /* two cycle command */ | ||
| 335 | + uint32_t read_status; | ||
| 336 | + uint32_t read_id; | ||
| 337 | + uint32_t erase; /* two cycle command */ | ||
| 338 | + uint32_t reset; | ||
| 339 | + uint32_t lock; /* lock whole flash */ | ||
| 340 | + uint32_t unlock; /* two cycle command, supporting partial unlock */ | ||
| 341 | + uint32_t lock_status; /* read block lock status */ | ||
| 342 | + | ||
| 343 | + /* addr2ndcb1 - encode address cycles into register NDCB1 */ | ||
| 344 | + /* ndbbr2addr - convert register NDBBR to bad block address */ | ||
| 345 | + int (*addr2ndcb1)(uint16_t cmd, uint32_t addr, uint32_t *p); | ||
| 346 | + int (*ndbbr2addr)(uint16_t cmd, uint32_t ndbbr,uint32_t *p); | ||
| 347 | +}; | ||
| 348 | + | ||
| 349 | +enum { | ||
| 350 | + DFC_FLASH_NULL = 0 , | ||
| 351 | + DFC_FLASH_Samsung_512Mb_X_16 = 1, | ||
| 352 | + DFC_FLASH_Micron_1Gb_X_8 = 2, | ||
| 353 | + DFC_FLASH_Micron_1Gb_X_16 = 3, | ||
| 354 | + DFC_FLASH_STM_1Gb_X_16 = 4, | ||
| 355 | + DFC_FLASH_STM_2Gb_X_16 = 5, | ||
| 356 | + DFC_FLASH_END, | ||
| 357 | +}; | ||
| 358 | + | ||
| 359 | +static int dfc_get_flash_info(int type, struct dfc_flash_info **flash_info); | ||
| 360 | + | ||
| 361 | +#define DFC_NDCR 0 | ||
| 362 | +#define DFC_NDTR0CS0 1 | ||
| 363 | +#define DFC_NDTR1CS0 3 | ||
| 364 | +#define DFC_NDSR 5 | ||
| 365 | +#define DFC_NDPCR 6 | ||
| 366 | +#define DFC_NDBDR0 7 | ||
| 367 | +#define DFC_NDBDR1 8 | ||
| 368 | +#define DFC_NDDB 16 | ||
| 369 | +#define DFC_NDCB0 18 | ||
| 370 | +#define DFC_NDCB1 19 | ||
| 371 | +#define DFC_NDCB2 20 | ||
| 372 | + | ||
| 373 | +/* The Data Flash Controller Mode structure */ | ||
| 374 | +struct dfc_mode { | ||
| 375 | + int enable_dma; /* DMA, or nonDMA mode */ | ||
| 376 | + int enable_ecc; /* ECC on/off */ | ||
| 377 | + int enable_spare; /* Spare enable */ | ||
| 378 | + int chip_select; /* CS0 or CS1 */ | ||
| 379 | +}; | ||
| 380 | + | ||
| 381 | +/* The Data Flash Controller Context structure */ | ||
| 382 | +struct dfc_context { | ||
| 383 | + unsigned char __iomem *membase; /* DFC register base */ | ||
| 384 | + struct dfc_mode *dfc_mode; /* DFC mode */ | ||
| 385 | + int data_dma_ch; /* Data DMA channel number */ | ||
| 386 | + int cmd_dma_ch; /* CMD DMA channel number */ | ||
| 387 | + struct dfc_flash_info *flash_info; /* Flash Spec */ | ||
| 388 | + struct mtd_info *mtd; | ||
| 389 | +}; | ||
| 390 | + | ||
| 391 | +#define NDCB0_DMA_ADDR 0x43100048 | ||
| 392 | +#define NDDB_DMA_ADDR 0x43100040 | ||
| 393 | + | ||
| 394 | +#define NDSR_MASK 0xFFF | ||
| 395 | + | ||
| 396 | +/* The following data is a rough evaluation */ | ||
| 397 | + | ||
| 398 | +/* microsecond, for readID/readStatus/reset */ | ||
| 399 | +#define NAND_OTHER_TIMEOUT 10 | ||
| 400 | +/* microsecond, for readID/readStatus/reset */ | ||
| 401 | +#define NAND_CMD_TIMEOUT 10 | ||
| 402 | + | ||
| 403 | +#define BBT_BLOCK_BAD 0x03 | ||
| 404 | +#define BBT_BLOCK_GOOD 0x00 | ||
| 405 | +#define BBT_BLOCK_REV1 0x01 | ||
| 406 | +#define BBT_BLOCK_REV2 0x02 | ||
| 407 | + | ||
| 408 | +#define BUFLEN (2048 + 64) | ||
| 409 | + | ||
| 410 | +/* | ||
| 411 | + * DFC data size enumeration transfered from/to controller, | ||
| 412 | + * including padding (zero)to be a multiple of 32. | ||
| 413 | + */ | ||
| 414 | +enum { | ||
| 415 | + DFC_DATA_SIZE_STATUS = 8, /* ReadStatus/ReadBlockLockStatus */ | ||
| 416 | + DFC_DATA_SIZE_ID = 7, /* ReadID */ | ||
| 417 | + | ||
| 418 | + DFC_DATA_SIZE_32 = 32, | ||
| 419 | + DFC_DATA_SIZE_512 = 512, /* R/W disabling spare area */ | ||
| 420 | + DFC_DATA_SIZE_520 = 520, /* Spare=1, ECC=1 */ | ||
| 421 | + DFC_DATA_SIZE_528 = 528, /* Spare=1, ECC=0 */ | ||
| 422 | + DFC_DATA_SIZE_544 = 544, /* R/W enabling spare area.(DMA mode)*/ | ||
| 423 | + | ||
| 424 | + DFC_DATA_SIZE_64 = 64, | ||
| 425 | + DFC_DATA_SIZE_2048 = 2048, /* R/W disabling spare area */ | ||
| 426 | + DFC_DATA_SIZE_2088 = 2088, /* R/W enabling spare area with ecc */ | ||
| 427 | + DFC_DATA_SIZE_2112 = 2112, /* R/W enabling spare area without ecc*/ | ||
| 428 | + DFC_DATA_SIZE_2096 = 2096, /* R/W enabling spare area */ | ||
| 429 | + DFC_DATA_SIZE_UNUSED = 0xFFFF | ||
| 430 | +}; | ||
| 431 | + | ||
| 432 | +/* DFC padding size enumeration transfered from/to controller */ | ||
| 433 | +enum { | ||
| 434 | + /* | ||
| 435 | + * ReadStatus/ReadBlockLockStatus/ReadID/ | ||
| 436 | + * Read/Program disabling spare area(Both 512 and 2048) | ||
| 437 | + * Read/Program enabling spare area, disabling ECC | ||
| 438 | + */ | ||
| 439 | + DFC_PADDING_SIZE_0 = 0, | ||
| 440 | + | ||
| 441 | + /* Read/program with SPARE_EN=1, ECC_EN=0, pgSize=512 */ | ||
| 442 | + DFC_PADDING_SIZE_16 = 16, | ||
| 443 | + /* for read/program with SPARE_EN=1, ECC_EN=1, pgSize=512 and 2048 */ | ||
| 444 | + DFC_PADDING_SIZE_24 = 24, | ||
| 445 | + DFC_PADDING_SIZE_UNUSED = 0xFFFF | ||
| 446 | +}; | ||
| 447 | + | ||
| 448 | +static unsigned int flash_config = DFC_FLASH_NULL; | ||
| 449 | + | ||
| 450 | +void dfc_set_timing(struct dfc_context *context, struct dfc_flash_timing *t); | ||
| 451 | +void dfc_set_dma(struct dfc_context *context); | ||
| 452 | +void dfc_set_ecc(struct dfc_context *context); | ||
| 453 | +void dfc_set_spare(struct dfc_context *context); | ||
| 454 | + | ||
| 455 | +int dfc_get_pattern(struct dfc_context *context, uint16_t cmd, | ||
| 456 | + int *data_size, int *padding); | ||
| 457 | + | ||
| 458 | +static int dfc_wait_event(struct dfc_context *context, uint32_t event, | ||
| 459 | + uint32_t *event_out, uint32_t timeout, int enable_int); | ||
| 460 | + | ||
| 461 | +int dfc_send_cmd(struct dfc_context *context, uint16_t cmd, | ||
| 462 | + uint32_t addr, int num_pages); | ||
| 463 | + | ||
| 464 | +void dfc_stop(struct dfc_context *context); | ||
| 465 | +void dfc_read_fifo_partial(struct dfc_context *context, uint8_t *buffer, | ||
| 466 | + int nbytes, int data_size); | ||
| 467 | +void dfc_write_fifo_partial(struct dfc_context *context, uint8_t *buffer, | ||
| 468 | + int nbytes, int data_size); | ||
| 469 | + | ||
| 470 | +void dfc_read_fifo(struct dfc_context *context, uint8_t *buffer, int nbytes); | ||
| 471 | +void dfc_write_fifo(struct dfc_context *context, uint8_t *buffer, int nbytes); | ||
| 472 | + | ||
| 473 | +void dfc_read_badblock_addr(struct dfc_context *context, uint32_t *bbaddr); | ||
| 474 | + | ||
| 475 | +void dfc_clear_int(struct dfc_context *context, uint32_t int_mask); | ||
| 476 | +void dfc_enable_int(struct dfc_context *context, uint32_t int_mask); | ||
| 477 | +void dfc_disable_int(struct dfc_context *context, uint32_t int_mask); | ||
| 478 | + | ||
| 479 | +/* high level primitives */ | ||
| 480 | +int dfc_init(struct dfc_context *context, int type); | ||
| 481 | +int dfc_init_no_gpio(struct dfc_context *context, int type); | ||
| 482 | + | ||
| 483 | +int dfc_reset_flash(struct dfc_context *context); | ||
| 484 | + | ||
| 485 | +int dfc_setup_cmd_dma(struct dfc_context *context, | ||
| 486 | + uint16_t cmd, uint32_t addr, int num_pages, | ||
| 487 | + uint32_t *buf, uint32_t buf_phys, | ||
| 488 | + uint32_t next_desc_phys, uint32_t dma_int_en, | ||
| 489 | + struct pxa_dma_desc *dma_desc); | ||
| 490 | + | ||
| 491 | +int dfc_setup_data_dma(struct dfc_context *context, | ||
| 492 | + uint16_t cmd, uint32_t buf_phys, | ||
| 493 | + uint32_t next_desc_phys, uint32_t dma_int_en, | ||
| 494 | + struct pxa_dma_desc *dma_desc); | ||
| 495 | + | ||
| 496 | +void dfc_start_cmd_dma(struct dfc_context *context, | ||
| 497 | + struct pxa_dma_desc *dma_desc); | ||
| 498 | +void dfc_start_data_dma(struct dfc_context *context, | ||
| 499 | + struct pxa_dma_desc *dma_desc); | ||
| 500 | +static int monahans_df_dev_ready(struct mtd_info *mtd); | ||
| 501 | + | ||
| 502 | +#ifdef CONFIG_DVFM | ||
| 503 | +static int mhn_nand_dvfm_notifier(unsigned cmd, void *client_data, void *info); | ||
| 504 | +static struct mhn_fv_notifier dvfm_notifier = { | ||
| 505 | + .name = "monahans-nand-flash", | ||
| 506 | + .priority = 0, | ||
| 507 | + .notifier_call = mhn_nand_dvfm_notifier, | ||
| 508 | +}; | ||
| 509 | +#endif | ||
| 510 | + | ||
| 511 | +static unsigned short search_rel_block(int block, struct mtd_info *mtd); | ||
| 512 | + | ||
| 513 | +/***************************************************************************** | ||
| 514 | + * The DFC registers read/write routines | ||
| 515 | + *****************************************************************************/ | ||
| 516 | +static inline void dfc_write(struct dfc_context *context, int offset, | ||
| 517 | + unsigned long value) | ||
| 518 | +{ | ||
| 519 | + offset <<= 2; | ||
| 520 | + writel(value, context->membase + offset); | ||
| 521 | +} | ||
| 522 | + | ||
| 523 | +static inline unsigned int dfc_read(struct dfc_context *context, int offset) | ||
| 524 | +{ | ||
| 525 | + offset <<= 2; | ||
| 526 | + return __raw_readl(context->membase + offset); | ||
| 527 | +} | ||
| 528 | + | ||
| 529 | +/**************************************************************************** | ||
| 530 | + * Flash Information | ||
| 531 | + ***************************************************************************/ | ||
| 532 | + | ||
| 533 | +static int Samsung512MbX16Addr2NDCB1(uint16_t cmd, uint32_t addr, uint32_t *p); | ||
| 534 | +static int Samsung512MbX16NDBBR2Addr(uint16_t cmd, uint32_t ndbbr, uint32_t *p); | ||
| 535 | + | ||
| 536 | +static struct dfc_flash_info samsung512MbX16 = | ||
| 537 | +{ | ||
| 538 | + .timing = { | ||
| 539 | + .tCH = 10, /* tCH, Enable signal hold time */ | ||
| 540 | + .tCS = 0, /* tCS, Enable signal setup time */ | ||
| 541 | + .tWH = 20, /* tWH, ND_nWE high duration */ | ||
| 542 | + .tWP = 40, /* tWP, ND_nWE pulse time */ | ||
| 543 | + .tRH = 30, /* tRH, ND_nRE high duration */ | ||
| 544 | + .tRP = 40, /* tRP, ND_nRE pulse width */ | ||
| 545 | + /* tR = tR+tRR+tWB+1, ND_nWE high to ND_nRE low for read */ | ||
| 546 | + .tR = 11123, | ||
| 547 | + /* tWHR, ND_nWE high to ND_nRE low delay for status read */ | ||
| 548 | + .tWHR = 110, | ||
| 549 | + .tAR = 10, /* tAR, ND_ALE low to ND_nRE low delay */ | ||
| 550 | + }, | ||
| 551 | + .enable_arbiter = 1, /* Data flash bus arbiter enable */ | ||
| 552 | + .page_per_block = 32, /* Pages per block */ | ||
| 553 | + .row_addr_start = 0, /* Second cycle start, Row address start position */ | ||
| 554 | + .read_id_bytes = 2, /* 2 bytes, returned ID bytes */ | ||
| 555 | + .dfc_mode = 0, /* NAND mode */ | ||
| 556 | + .ncsx = 0, | ||
| 557 | + .page_size = 512, /* Page size in bytes */ | ||
| 558 | + .oob_size = 16, /* OOB size in bytes */ | ||
| 559 | + .flash_width = 16, /* Width of Flash memory */ | ||
| 560 | + .dfc_width = 16, /* Width of flash controller */ | ||
| 561 | + .num_blocks = 4096, /* Number of physical blocks in Flash */ | ||
| 562 | + .chip_id = 0x46ec, | ||
| 563 | + | ||
| 564 | + /* command codes */ | ||
| 565 | + .read1 = 0x0000, /* Read */ | ||
| 566 | + .read2 = 0x0050, /* Read1 unused, current DFC don't support */ | ||
| 567 | + .program = 0x1080, /* Write, two cycle command */ | ||
| 568 | + .read_status = 0x0070, /* Read status */ | ||
| 569 | + .read_id = 0x0090, /* Read ID */ | ||
| 570 | + .erase = 0xD060, /* Erase, two cycle command */ | ||
| 571 | + .reset = 0x00FF, /* Reset */ | ||
| 572 | + .lock = 0x002A, /* Lock whole flash */ | ||
| 573 | + .unlock = 0x2423, /* Unlock, two cycle command, supporting partial unlock */ | ||
| 574 | + .lock_status = 0x007A, /* Read block lock status */ | ||
| 575 | + .addr2ndcb1 = Samsung512MbX16Addr2NDCB1, | ||
| 576 | + .ndbbr2addr = Samsung512MbX16NDBBR2Addr, | ||
| 577 | +}; | ||
| 578 | + | ||
| 579 | +static int Samsung512MbX16Addr2NDCB1(uint16_t cmd, uint32_t addr, uint32_t *p) | ||
| 580 | +{ | ||
| 581 | + uint32_t ndcb1 = 0; | ||
| 582 | + | ||
| 583 | + if (addr >= 0x4000000) return -EINVAL; | ||
| 584 | + | ||
| 585 | + if (cmd == samsung512MbX16.read1 || cmd == samsung512MbX16.program) { | ||
| 586 | + ndcb1 = (addr & 0xFF) | ((addr >> 1) & 0x01FFFF00); | ||
| 587 | + } else if (cmd == samsung512MbX16.erase) { | ||
| 588 | + ndcb1 = ((addr >> 9) & 0x00FFFFFF); | ||
| 589 | + } | ||
| 590 | + | ||
| 591 | + *p = ndcb1; | ||
| 592 | + return 0; | ||
| 593 | + | ||
| 594 | +} | ||
| 595 | + | ||
| 596 | +static int Samsung512MbX16NDBBR2Addr(uint16_t cmd, uint32_t ndbbr, uint32_t *p) | ||
| 597 | +{ | ||
| 598 | + *p = ndbbr << 9; | ||
| 599 | + return 0; | ||
| 600 | +} | ||
| 601 | + | ||
| 602 | +static int Micron1GbX8Addr2NDCB1(uint16_t cmd, uint32_t addr, uint32_t *p); | ||
| 603 | +static int Micron1GbX8NDBBR2Addr(uint16_t cmd, uint32_t ndbbr, uint32_t *p); | ||
| 604 | + | ||
| 605 | +static struct dfc_flash_info micron1GbX8 = | ||
| 606 | +{ | ||
| 607 | + .timing = { | ||
| 608 | + .tCH = 10, /* tCH, Enable signal hold time */ | ||
| 609 | + .tCS = 25, /* tCS, Enable signal setup time */ | ||
| 610 | + .tWH = 15, /* tWH, ND_nWE high duration */ | ||
| 611 | + .tWP = 25, /* tWP, ND_nWE pulse time */ | ||
| 612 | + .tRH = 15, /* tRH, ND_nRE high duration */ | ||
| 613 | + .tRP = 25, /* tRP, ND_nRE pulse width */ | ||
| 614 | + /* tR = tR+tRR+tWB+1, ND_nWE high to ND_nRE low for read */ | ||
| 615 | + .tR = 25000, | ||
| 616 | + /* tWHR, ND_nWE high to ND_nRE low delay for status read */ | ||
| 617 | + .tWHR = 60, | ||
| 618 | + .tAR = 10, /* tAR, ND_ALE low to ND_nRE low delay */ | ||
| 619 | + }, | ||
| 620 | + .enable_arbiter = 1, /* Data flash bus arbiter enable */ | ||
| 621 | + .page_per_block = 64, /* Pages per block */ | ||
| 622 | + .row_addr_start = 1, /* Second cycle start, Row address start position */ | ||
| 623 | + .read_id_bytes = 4, /* Returned ID bytes */ | ||
| 624 | + .dfc_mode = 0, /* NAND mode */ | ||
| 625 | + .ncsx = 0, | ||
| 626 | + .page_size = 2048, /* Page size in bytes */ | ||
| 627 | + .oob_size = 64, /* OOB size in bytes */ | ||
| 628 | + .flash_width = 8, /* Width of Flash memory */ | ||
| 629 | + .dfc_width = 8, /* Width of flash controller */ | ||
| 630 | + .num_blocks = 1024, /* Number of physical blocks in Flash */ | ||
| 631 | + .chip_id = 0xa12c, | ||
| 632 | + /* command codes */ | ||
| 633 | + .read1 = 0x3000, /* Read */ | ||
| 634 | + .read2 = 0x0050, /* Read1 unused, current DFC don't support */ | ||
| 635 | + .program = 0x1080, /* Write, two cycle command */ | ||
| 636 | + .read_status = 0x0070, /* Read status */ | ||
| 637 | + .read_id = 0x0090, /* Read ID */ | ||
| 638 | + .erase = 0xD060, /* Erase, two cycle command */ | ||
| 639 | + .reset = 0x00FF, /* Reset */ | ||
| 640 | + .lock = 0x002A, /* Lock whole flash */ | ||
| 641 | + .unlock = 0x2423, /* Unlock, two cycle command, supporting partial unlock */ | ||
| 642 | + .lock_status = 0x007A, /* Read block lock status */ | ||
| 643 | + .addr2ndcb1 = Micron1GbX8Addr2NDCB1, | ||
| 644 | + .ndbbr2addr = Micron1GbX8NDBBR2Addr, | ||
| 645 | +}; | ||
| 646 | + | ||
| 647 | +static int Micron1GbX8Addr2NDCB1(uint16_t cmd, uint32_t addr, uint32_t *p) | ||
| 648 | +{ | ||
| 649 | + uint32_t ndcb1 = 0; | ||
| 650 | + uint32_t page; | ||
| 651 | + | ||
| 652 | + if (addr >= 0x8000000) | ||
| 653 | + return -EINVAL; | ||
| 654 | + page = addr / micron1GbX8.page_size; | ||
| 655 | + addr = (page / micron1GbX8.page_per_block) << 18 | | ||
| 656 | + (page % micron1GbX8.page_per_block) << 12; | ||
| 657 | + | ||
| 658 | + if (cmd == micron1GbX8.read1 || cmd == micron1GbX8.program) { | ||
| 659 | + ndcb1 = (addr & 0xFFF) | ((addr << 4) & 0xFFFF0000); | ||
| 660 | + } | ||
| 661 | + else if (cmd == micron1GbX8.erase) { | ||
| 662 | + ndcb1 = ((addr >> 18) << 6) & 0xFFFF; | ||
| 663 | + } | ||
| 664 | + | ||
| 665 | + *p = ndcb1; | ||
| 666 | + return 0; | ||
| 667 | +} | ||
| 668 | + | ||
| 669 | +static int Micron1GbX8NDBBR2Addr(uint16_t cmd, uint32_t ndbbr, uint32_t *p) | ||
| 670 | +{ | ||
| 671 | + if (cmd == micron1GbX8.read1 || cmd == micron1GbX8.program) { | ||
| 672 | + *p = ((ndbbr & 0xF) << 8) | ((ndbbr >> 8) << 16); | ||
| 673 | + } | ||
| 674 | + else if (cmd == micron1GbX8.erase) { | ||
| 675 | + *p = (ndbbr >> 6) << 18; | ||
| 676 | + } | ||
| 677 | + | ||
| 678 | + | ||
| 679 | + return 0; | ||
| 680 | +} | ||
| 681 | + | ||
| 682 | + | ||
| 683 | +static int Micron1GbX16Addr2NDCB1(uint16_t cmd, uint32_t addr, uint32_t *p); | ||
| 684 | +static int Micron1GbX16NDBBR2Addr(uint16_t cmd, uint32_t ndbbr, uint32_t *p); | ||
| 685 | + | ||
| 686 | +static struct dfc_flash_info micron1GbX16 = | ||
| 687 | +{ | ||
| 688 | + .timing = { | ||
| 689 | + .tCH = 10, /* tCH, Enable signal hold time */ | ||
| 690 | + .tCS = 25, /* tCS, Enable signal setup time */ | ||
| 691 | + .tWH = 15, /* tWH, ND_nWE high duration */ | ||
| 692 | + .tWP = 25, /* tWP, ND_nWE pulse time */ | ||
| 693 | + .tRH = 15, /* tRH, ND_nRE high duration */ | ||
| 694 | + .tRP = 25, /* tRP, ND_nRE pulse width */ | ||
| 695 | + /* tR = tR+tRR+tWB+1, ND_nWE high to ND_nRE low for read */ | ||
| 696 | + .tR = 25000, | ||
| 697 | + /* tWHR, ND_nWE high to ND_nRE low delay for status read */ | ||
| 698 | + .tWHR = 60, | ||
| 699 | + .tAR = 10, /* tAR, ND_ALE low to ND_nRE low delay */ | ||
| 700 | + }, | ||
| 701 | + .enable_arbiter = 1, /* Data flash bus arbiter enable */ | ||
| 702 | + .page_per_block = 64, /* Pages per block */ | ||
| 703 | + .row_addr_start = 1, /* Second cycle start, Row address start position */ | ||
| 704 | + .read_id_bytes = 4, /* Returned ID bytes */ | ||
| 705 | + .dfc_mode = 0, /* NAND mode */ | ||
| 706 | + .ncsx = 0, | ||
| 707 | + .page_size = 2048, /* Page size in bytes */ | ||
| 708 | + .oob_size = 64, /* OOB size in bytes */ | ||
| 709 | + .flash_width = 16, /* Width of Flash memory */ | ||
| 710 | + .dfc_width = 16, /* Width of flash controller */ | ||
| 711 | + .num_blocks = 1024, /* Number of physical blocks in Flash */ | ||
| 712 | + .chip_id = 0xb12c, | ||
| 713 | + | ||
| 714 | + /* command codes */ | ||
| 715 | + .read1 = 0x3000, /* Read */ | ||
| 716 | + .read2 = 0x0050, /* Read1 unused, current DFC don't support */ | ||
| 717 | + .program = 0x1080, /* Write, two cycle command */ | ||
| 718 | + .read_status = 0x0070, /* Read status */ | ||
| 719 | + .read_id = 0x0090, /* Read ID */ | ||
| 720 | + .erase = 0xD060, /* Erase, two cycle command */ | ||
| 721 | + .reset = 0x00FF, /* Reset */ | ||
| 722 | + .lock = 0x002A, /* Lock whole flash */ | ||
| 723 | + .unlock = 0x2423, /* Unlock, two cycle command, supporting partial unlock */ | ||
| 724 | + .lock_status = 0x007A, /* Read block lock status */ | ||
| 725 | + .addr2ndcb1 = Micron1GbX16Addr2NDCB1, | ||
| 726 | + .ndbbr2addr = Micron1GbX16NDBBR2Addr, | ||
| 727 | +}; | ||
| 728 | + | ||
| 729 | +static int Micron1GbX16Addr2NDCB1(uint16_t cmd, uint32_t addr, uint32_t *p) | ||
| 730 | +{ | ||
| 731 | + uint32_t ndcb1 = 0; | ||
| 732 | + uint32_t page; | ||
| 733 | + | ||
| 734 | + if (addr >= 0x8000000) | ||
| 735 | + return -EINVAL; | ||
| 736 | + page = addr / micron1GbX16.page_size; | ||
| 737 | + addr = (page / micron1GbX16.page_per_block) << 17 | | ||
| 738 | + (page % micron1GbX16.page_per_block) << 11; | ||
| 739 | + | ||
| 740 | + if (cmd == micron1GbX16.read1 || cmd == micron1GbX16.program) { | ||
| 741 | + ndcb1 = (addr & 0x7FF) | ((addr << 5) & 0xFFFF0000); | ||
| 742 | + } | ||
| 743 | + else if (cmd == micron1GbX16.erase) { | ||
| 744 | + ndcb1 = ((addr >> 17) << 6) & 0xFFFF; | ||
| 745 | + } | ||
| 746 | + *p = ndcb1; | ||
| 747 | + return 0; | ||
| 748 | +} | ||
| 749 | + | ||
| 750 | +static int Micron1GbX16NDBBR2Addr(uint16_t cmd, uint32_t ndbbr, uint32_t *p) | ||
| 751 | +{ | ||
| 752 | + if (cmd == micron1GbX16.read1 || cmd == micron1GbX16.program) { | ||
| 753 | + *p = ((ndbbr & 0x7) << 8) | ((ndbbr >> 8) << 16); | ||
| 754 | + } | ||
| 755 | + else if (cmd == micron1GbX16.erase) { | ||
| 756 | + *p = (ndbbr >> 6) << 17; | ||
| 757 | + } | ||
| 758 | + | ||
| 759 | + return 0; | ||
| 760 | +} | ||
| 761 | + | ||
| 762 | +static int STM1GbX16Addr2NDCB1(uint16_t cmd, uint32_t addr, uint32_t *p); | ||
| 763 | +static int STM1GbX16NDBBR2Addr(uint16_t cmd, uint32_t ndbbr, uint32_t *p); | ||
| 764 | + | ||
| 765 | +static struct dfc_flash_info stm1GbX16 = | ||
| 766 | +{ | ||
| 767 | + .timing = { | ||
| 768 | + .tCH = 10, /* tCH, Enable signal hold time */ | ||
| 769 | + .tCS = 10, /* tCS, Enable signal setup time */ | ||
| 770 | + .tWH = 20, /* tWH, ND_nWE high duration */ | ||
| 771 | + .tWP = 25, /* tWP, ND_nWE pulse time */ | ||
| 772 | + .tRH = 20, /* tRH, ND_nRE high duration */ | ||
| 773 | + .tRP = 25, /* tRP, ND_nRE pulse width */ | ||
| 774 | + /* tR = tR+tRR+tWB+1, ND_nWE high to ND_nRE low for read */ | ||
| 775 | + .tR = 25000, | ||
| 776 | + /* tWHR, ND_nWE high to ND_nRE low delay for status read */ | ||
| 777 | + .tWHR = 60, | ||
| 778 | + .tAR = 10, /* tAR, ND_ALE low to ND_nRE low delay */ | ||
| 779 | + }, | ||
| 780 | + .enable_arbiter = 1, /* Data flash bus arbiter enable */ | ||
| 781 | + .page_per_block = 64, /* Pages per block */ | ||
| 782 | + .row_addr_start = 1, /* Second cycle start, Row address start position */ | ||
| 783 | + .read_id_bytes = 4, /* Returned ID bytes */ | ||
| 784 | + .dfc_mode = 0, /* NAND mode */ | ||
| 785 | + .ncsx = 0, | ||
| 786 | + .page_size = 2048, /* Page size in bytes */ | ||
| 787 | + .oob_size = 64, /* OOB size in bytes */ | ||
| 788 | + .flash_width = 16, /* Width of Flash memory */ | ||
| 789 | + .dfc_width = 16, /* Width of flash controller */ | ||
| 790 | + .num_blocks = 1024, /* Number of physical blocks in Flash */ | ||
| 791 | + .chip_id = 0xb120, | ||
| 792 | + | ||
| 793 | + /* command codes */ | ||
| 794 | + .read1 = 0x3000, /* Read */ | ||
| 795 | + .read2 = 0x0050, /* Read1 unused, current DFC don't support */ | ||
| 796 | + .program = 0x1080, /* Write, two cycle command */ | ||
| 797 | + .read_status = 0x0070, /* Read status */ | ||
| 798 | + .read_id = 0x0090, /* Read ID */ | ||
| 799 | + .erase = 0xD060, /* Erase, two cycle command */ | ||
| 800 | + .reset = 0x00FF, /* Reset */ | ||
| 801 | + .lock = 0x002A, /* Lock whole flash */ | ||
| 802 | + .unlock = 0x2423, /* Unlock, two cycle command, supporting partial unlock */ | ||
| 803 | + .lock_status = 0x007A, /* Read block lock status */ | ||
| 804 | + .addr2ndcb1 = STM1GbX16Addr2NDCB1, | ||
| 805 | + .ndbbr2addr = STM1GbX16NDBBR2Addr, | ||
| 806 | +}; | ||
| 807 | + | ||
| 808 | +static int STM1GbX16Addr2NDCB1(uint16_t cmd, uint32_t addr, uint32_t *p) | ||
| 809 | +{ | ||
| 810 | + uint32_t ndcb1 = 0; | ||
| 811 | + uint32_t page; | ||
| 812 | + | ||
| 813 | + if (addr >= 0x8000000) | ||
| 814 | + return -EINVAL; | ||
| 815 | + page = addr / stm1GbX16.page_size; | ||
| 816 | + addr = (page / stm1GbX16.page_per_block) << 17 | | ||
| 817 | + (page % stm1GbX16.page_per_block) << 11; | ||
| 818 | + | ||
| 819 | + if (cmd == stm1GbX16.read1 || cmd == stm1GbX16.program) { | ||
| 820 | + ndcb1 = (addr & 0x7FF) | ((addr << 5) & 0xFFFF0000); | ||
| 821 | + } | ||
| 822 | + else if (cmd == stm1GbX16.erase) { | ||
| 823 | + ndcb1 = ((addr >> 17) << 6) & 0xFFFF; | ||
| 824 | + } | ||
| 825 | + *p = ndcb1; | ||
| 826 | + return 0; | ||
| 827 | +} | ||
| 828 | + | ||
| 829 | +static int STM1GbX16NDBBR2Addr(uint16_t cmd, uint32_t ndbbr, uint32_t *p) | ||
| 830 | +{ | ||
| 831 | + if (cmd == stm1GbX16.read1 || cmd == stm1GbX16.program) { | ||
| 832 | + *p = ((ndbbr & 0x7) << 8) | ((ndbbr >> 8) << 16); | ||
| 833 | + } | ||
| 834 | + else if (cmd == stm1GbX16.erase) { | ||
| 835 | + *p = (ndbbr >> 6) << 17; | ||
| 836 | + } | ||
| 837 | + | ||
| 838 | + return 0; | ||
| 839 | +} | ||
| 840 | + | ||
| 841 | +static int STM2GbX16Addr2NDCB1(uint16_t cmd, uint32_t addr, uint32_t *p); | ||
| 842 | +static int STM2GbX16NDBBR2Addr(uint16_t cmd, uint32_t ndbbr, uint32_t *p); | ||
| 843 | + | ||
| 844 | +static struct dfc_flash_info stm2GbX16 = | ||
| 845 | +{ | ||
| 846 | + .timing = { | ||
| 847 | + .tCH = 10, /* tCH, Enable signal hold time */ | ||
| 848 | + .tCS = 10, /* tCS, Enable signal setup time */ | ||
| 849 | + .tWH = 20, /* tWH, ND_nWE high duration */ | ||
| 850 | + .tWP = 25, /* tWP, ND_nWE pulse time */ | ||
| 851 | + .tRH = 20, /* tRH, ND_nRE high duration */ | ||
| 852 | + .tRP = 25, /* tRP, ND_nRE pulse width */ | ||
| 853 | + /* tR = tR+tRR+tWB+1, ND_nWE high to ND_nRE low for read */ | ||
| 854 | + .tR = 25000, | ||
| 855 | + /* tWHR, ND_nWE high to ND_nRE low delay for status read */ | ||
| 856 | + .tWHR = 60, | ||
| 857 | + .tAR = 10, /* tAR, ND_ALE low to ND_nRE low delay */ | ||
| 858 | + }, | ||
| 859 | + .enable_arbiter = 1, /* Data flash bus arbiter enable */ | ||
| 860 | + .page_per_block = 64, /* Pages per block */ | ||
| 861 | + .row_addr_start = 1, /* Second cycle start, Row address start position */ | ||
| 862 | + .read_id_bytes = 4, /* Returned ID bytes */ | ||
| 863 | + .dfc_mode = 0, /* NAND mode */ | ||
| 864 | + .ncsx = 0, | ||
| 865 | + .page_size = 2048, /* Page size in bytes */ | ||
| 866 | + .oob_size = 64, /* OOB size in bytes */ | ||
| 867 | + .flash_width = 16, /* Width of Flash memory */ | ||
| 868 | + .dfc_width = 16, /* Width of flash controller */ | ||
| 869 | + .num_blocks = 2048, /* Number of physical blocks in Flash */ | ||
| 870 | + .chip_id = 0xca20, | ||
| 871 | + | ||
| 872 | + /* command codes */ | ||
| 873 | + .read1 = 0x3000, /* Read */ | ||
| 874 | + .read2 = 0x0050, /* Read1 unused, current DFC don't support */ | ||
| 875 | + .program = 0x1080, /* Write, two cycle command */ | ||
| 876 | + .read_status = 0x0070, /* Read status */ | ||
| 877 | + .read_id = 0x0090, /* Read ID */ | ||
| 878 | + .erase = 0xD060, /* Erase, two cycle command */ | ||
| 879 | + .reset = 0x00FF, /* Reset */ | ||
| 880 | + .lock = 0x002A, /* Lock whole flash */ | ||
| 881 | + .unlock = 0x2423, /* Unlock, two cycle command, supporting partial unlock */ | ||
| 882 | + .lock_status = 0x007A, /* Read block lock status */ | ||
| 883 | + .addr2ndcb1 = STM2GbX16Addr2NDCB1, | ||
| 884 | + .ndbbr2addr = STM2GbX16NDBBR2Addr, | ||
| 885 | +}; | ||
| 886 | + | ||
| 887 | +static int STM2GbX16Addr2NDCB1(uint16_t cmd, uint32_t addr, uint32_t *p) | ||
| 888 | +{ | ||
| 889 | + uint32_t ndcb1 = 0; | ||
| 890 | + uint32_t page; | ||
| 891 | + | ||
| 892 | + if (addr >= 0x8000000) | ||
| 893 | + return -EINVAL; | ||
| 894 | + page = addr / stm2GbX16.page_size; | ||
| 895 | + addr = (page / stm2GbX16.page_per_block) << 17 | | ||
| 896 | + (page % stm2GbX16.page_per_block) << 11; | ||
| 897 | + | ||
| 898 | + if (cmd == stm2GbX16.read1 || cmd == stm2GbX16.program) { | ||
| 899 | + ndcb1 = (addr & 0x7FF) | ((addr << 5) & 0xFFFF0000); | ||
| 900 | + } | ||
| 901 | + else if (cmd == stm2GbX16.erase) { | ||
| 902 | + ndcb1 = ((addr >> 17) << 6) & 0xFFFF; | ||
| 903 | + } | ||
| 904 | + *p = ndcb1; | ||
| 905 | + return 0; | ||
| 906 | +} | ||
| 907 | + | ||
| 908 | +static int STM2GbX16NDBBR2Addr(uint16_t cmd, uint32_t ndbbr, uint32_t *p) | ||
| 909 | +{ | ||
| 910 | + if (cmd == stm2GbX16.read1 || cmd == stm2GbX16.program) { | ||
| 911 | + *p = ((ndbbr & 0x7) << 8) | ((ndbbr >> 8) << 16); | ||
| 912 | + } | ||
| 913 | + else if (cmd == stm2GbX16.erase) { | ||
| 914 | + *p = (ndbbr >> 6) << 17; | ||
| 915 | + } | ||
| 916 | + | ||
| 917 | + return 0; | ||
| 918 | +} | ||
| 919 | + | ||
| 920 | +static struct { | ||
| 921 | + int type; | ||
| 922 | + struct dfc_flash_info *flash_info; | ||
| 923 | +} type_info[] = { | ||
| 924 | + { DFC_FLASH_Samsung_512Mb_X_16, &samsung512MbX16}, | ||
| 925 | + { DFC_FLASH_Micron_1Gb_X_8, µn1GbX8}, | ||
| 926 | + { DFC_FLASH_Micron_1Gb_X_16, µn1GbX16}, | ||
| 927 | + { DFC_FLASH_STM_1Gb_X_16, &stm1GbX16}, | ||
| 928 | + { DFC_FLASH_STM_2Gb_X_16, &stm2GbX16}, | ||
| 929 | + { DFC_FLASH_NULL, NULL}, | ||
| 930 | +}; | ||
| 931 | + | ||
| 932 | +int dfc_get_flash_info(int type, struct dfc_flash_info **flash_info) | ||
| 933 | +{ | ||
| 934 | + uint32_t i = 0; | ||
| 935 | + | ||
| 936 | + while(type_info[i].type != DFC_FLASH_NULL) { | ||
| 937 | + if (type_info[i].type == type) { | ||
| 938 | + *flash_info = type_info[i].flash_info; | ||
| 939 | + return 0; | ||
| 940 | + } | ||
| 941 | + i++; | ||
| 942 | + } | ||
| 943 | + *flash_info = NULL; | ||
| 944 | + return -EINVAL; | ||
| 945 | +} | ||
| 946 | + | ||
| 947 | +/****************************************************************************** | ||
| 948 | + dfc_set_timing | ||
| 949 | + | ||
| 950 | + Description: | ||
| 951 | + This function sets flash timing property in DFC timing register | ||
| 952 | + according to input timing value embodied in context structure. | ||
| 953 | + It is called once during the hardware initialization. | ||
| 954 | + Input Parameters: | ||
| 955 | + Output Parameters: | ||
| 956 | + None | ||
| 957 | + Returns: | ||
| 958 | + None | ||
| 959 | +*******************************************************************************/ | ||
| 960 | +//#if defined(CONFIG_CPU_MONAHANS_L) || defined(CONFIG_CPU_MONAHANS_LV) | ||
| 961 | +#define DFC_CLOCK 208 | ||
| 962 | +//#else | ||
| 963 | +//#define DFC_CLOCK 104 | ||
| 964 | +//#endif | ||
| 965 | +#define CLOCK_NS DFC_CLOCK/1000 | ||
| 966 | + | ||
| 967 | +void dfc_set_timing(struct dfc_context *context, struct dfc_flash_timing *t) | ||
| 968 | +{ | ||
| 969 | + struct dfc_flash_timing timing = *t; | ||
| 970 | + | ||
| 971 | + uint32_t r0 = 0; | ||
| 972 | + uint32_t r1 = 0; | ||
| 973 | + | ||
| 974 | + /* | ||
| 975 | + * num of clock cycles = time (ns) / one clock sycle (ns) + 1 | ||
| 976 | + * - integer division will truncate the result, so add a 1 in all cases | ||
| 977 | + * - subtract the extra 1 cycle added to all register timing values | ||
| 978 | + */ | ||
| 979 | + timing.tCH = min(((int) (timing.tCH * CLOCK_NS) + 1), | ||
| 980 | + DFC_TIMING_MAX_tCH); | ||
| 981 | + timing.tCS = min(((int) (timing.tCS * CLOCK_NS) + 1), | ||
| 982 | + DFC_TIMING_MAX_tCS); | ||
| 983 | + timing.tWH = min(((int) (timing.tWH * CLOCK_NS) + 1), | ||
| 984 | + DFC_TIMING_MAX_tWH); | ||
| 985 | + timing.tWP = min(((int) (timing.tWP * CLOCK_NS) + 1), | ||
| 986 | + DFC_TIMING_MAX_tWP); | ||
| 987 | + timing.tRH = min(((int) (timing.tRH * CLOCK_NS) + 1), | ||
| 988 | + DFC_TIMING_MAX_tRH); | ||
| 989 | + timing.tRP = min(((int) (timing.tRP * CLOCK_NS) + 1), | ||
| 990 | + DFC_TIMING_MAX_tRP); | ||
| 991 | + | ||
| 992 | + r0 = (timing.tCH << DFC_TIMING_tCH) | | ||
| 993 | + (timing.tCS << DFC_TIMING_tCS) | | ||
| 994 | + (timing.tWH << DFC_TIMING_tWH) | | ||
| 995 | + (timing.tWP << DFC_TIMING_tWP) | | ||
| 996 | + (timing.tRH << DFC_TIMING_tRH) | | ||
| 997 | + (timing.tRP << DFC_TIMING_tRP); | ||
| 998 | + | ||
| 999 | + dfc_write(context, DFC_NDTR0CS0, r0); | ||
| 1000 | + | ||
| 1001 | + timing.tR = min(((int) (timing.tR * CLOCK_NS) + 1), | ||
| 1002 | + DFC_TIMING_MAX_tR); | ||
| 1003 | + timing.tWHR = min(((int) (timing.tWHR * CLOCK_NS) + 1), | ||
| 1004 | + DFC_TIMING_MAX_tWHR); | ||
| 1005 | + timing.tAR = min(((int) (timing.tAR * CLOCK_NS) + 1), | ||
| 1006 | + DFC_TIMING_MAX_tAR); | ||
| 1007 | + | ||
| 1008 | + r1 = (timing.tR << DFC_TIMING_tR) | | ||
| 1009 | + (timing.tWHR << DFC_TIMING_tWHR) | | ||
| 1010 | + (timing.tAR << DFC_TIMING_tAR); | ||
| 1011 | + | ||
| 1012 | + dfc_write(context, DFC_NDTR1CS0, r1); | ||
| 1013 | + return; | ||
| 1014 | +} | ||
| 1015 | + | ||
| 1016 | +/****************************************************************************** | ||
| 1017 | + dfc_set_dma | ||
| 1018 | + | ||
| 1019 | + Description: | ||
| 1020 | + Enables or Disables DMA in line with setting in DFC mode of context | ||
| 1021 | + structure. DMA mode of DFC. Performs a read-modify-write operation that | ||
| 1022 | + only changes the driven DMA_EN bit field In DMA mode, all commands and | ||
| 1023 | + data are transferred by DMA. DMA can be enable/disable on the fly. | ||
| 1024 | + Input Parameters: | ||
| 1025 | + context -Pointer to DFC context structure | ||
| 1026 | + Output Parameters: | ||
| 1027 | + None | ||
| 1028 | + Returns: | ||
| 1029 | + None | ||
| 1030 | +*******************************************************************************/ | ||
| 1031 | +void | ||
| 1032 | +dfc_set_dma(struct dfc_context* context) | ||
| 1033 | +{ | ||
| 1034 | + uint32_t ndcr; | ||
| 1035 | + | ||
| 1036 | + ndcr = dfc_read(context, DFC_NDCR); | ||
| 1037 | + if (context->dfc_mode->enable_dma) | ||
| 1038 | + ndcr |= NDCR_DMA_EN; | ||
| 1039 | + else | ||
| 1040 | + ndcr &= ~NDCR_DMA_EN; | ||
| 1041 | + | ||
| 1042 | + dfc_write(context, DFC_NDCR, ndcr); | ||
| 1043 | + | ||
| 1044 | + /* Read again to make sure write work */ | ||
| 1045 | + ndcr = dfc_read(context, DFC_NDCR); | ||
| 1046 | + return; | ||
| 1047 | +} | ||
| 1048 | + | ||
| 1049 | + | ||
| 1050 | +/****************************************************************************** | ||
| 1051 | + dfc_set_ecc | ||
| 1052 | + | ||
| 1053 | + Description: | ||
| 1054 | + This function enables or disables hardware ECC capability of DFC in line | ||
| 1055 | + with setting in DFC mode of context structure. | ||
| 1056 | + Input Parameters: | ||
| 1057 | + context -Pointer to DFC context structure | ||
| 1058 | + Output Parameters: | ||
| 1059 | + None | ||
| 1060 | + Returns: | ||
| 1061 | + None | ||
| 1062 | +*******************************************************************************/ | ||
| 1063 | +void | ||
| 1064 | +dfc_set_ecc(struct dfc_context* context) | ||
| 1065 | +{ | ||
| 1066 | + uint32_t ndcr; | ||
| 1067 | + | ||
| 1068 | + ndcr = dfc_read(context, DFC_NDCR); | ||
| 1069 | + if (context->dfc_mode->enable_ecc) | ||
| 1070 | + ndcr |= NDCR_ECC_EN; | ||
| 1071 | + else | ||
| 1072 | + ndcr &= ~NDCR_ECC_EN; | ||
| 1073 | + | ||
| 1074 | + dfc_write(context, DFC_NDCR, ndcr); | ||
| 1075 | + | ||
| 1076 | + /* Read again to make sure write work */ | ||
| 1077 | + ndcr = dfc_read(context, DFC_NDCR); | ||
| 1078 | + return; | ||
| 1079 | +} | ||
| 1080 | + | ||
| 1081 | +/****************************************************************************** | ||
| 1082 | + dfc_set_spare | ||
| 1083 | + | ||
| 1084 | + Description: | ||
| 1085 | + This function enables or disables accesses to spare area of NAND Flash | ||
| 1086 | + through DFC in line with setting in DFC mode of context structure. | ||
| 1087 | + Input Parameters: | ||
| 1088 | + context -Pointer to DFC context structure | ||
| 1089 | + Output Parameters: | ||
| 1090 | + None | ||
| 1091 | + Returns: | ||
| 1092 | + None | ||
| 1093 | +*******************************************************************************/ | ||
| 1094 | +void | ||
| 1095 | +dfc_set_spare(struct dfc_context* context) | ||
| 1096 | +{ | ||
| 1097 | + uint32_t ndcr; | ||
| 1098 | + | ||
| 1099 | + ndcr = dfc_read(context, DFC_NDCR); | ||
| 1100 | + if (context->dfc_mode->enable_spare) | ||
| 1101 | + ndcr |= NDCR_SPARE_EN; | ||
| 1102 | + else | ||
| 1103 | + ndcr &= ~NDCR_SPARE_EN; | ||
| 1104 | + | ||
| 1105 | + dfc_write(context, DFC_NDCR, ndcr); | ||
| 1106 | + | ||
| 1107 | + /* Read again to make sure write work */ | ||
| 1108 | + ndcr = dfc_read(context, DFC_NDCR); | ||
| 1109 | + return; | ||
| 1110 | +} | ||
| 1111 | + | ||
| 1112 | +static unsigned int get_delta (unsigned int start) | ||
| 1113 | +{ | ||
| 1114 | + unsigned int stop = OSCR; | ||
| 1115 | + return (stop - start); | ||
| 1116 | +} | ||
| 1117 | + | ||
| 1118 | +static int dfc_wait_event(struct dfc_context *context, uint32_t event, | ||
| 1119 | + uint32_t *event_out, uint32_t timeout, int enable_int) | ||
| 1120 | +{ | ||
| 1121 | + uint32_t ndsr; | ||
| 1122 | + uint32_t to = 3 * timeout; /* 3 ticks ~ 1us */ | ||
| 1123 | + int status; | ||
| 1124 | + int start = OSCR; | ||
| 1125 | + | ||
| 1126 | + if (enable_int) | ||
| 1127 | + dfc_enable_int(context, event); | ||
| 1128 | + | ||
| 1129 | + while (1) { | ||
| 1130 | + ndsr = dfc_read(context, DFC_NDSR); | ||
| 1131 | + ndsr &= NDSR_MASK; | ||
| 1132 | + if (ndsr & event) { | ||
| 1133 | + /* event happened */ | ||
| 1134 | + *event_out = ndsr & event; | ||
| 1135 | + dfc_clear_int(context, *event_out); | ||
| 1136 | + status = 0; | ||
| 1137 | + break; | ||
| 1138 | + } else if (get_delta(start) > to) { | ||
| 1139 | + status = -ETIME; | ||
| 1140 | + break; | ||
| 1141 | + } | ||
| 1142 | + } | ||
| 1143 | + | ||
| 1144 | + if (enable_int) | ||
| 1145 | + dfc_disable_int(context, event); | ||
| 1146 | + return status; | ||
| 1147 | +} | ||
| 1148 | + | ||
| 1149 | +/****************************************************************************** | ||
| 1150 | + dfc_get_pattern | ||
| 1151 | + | ||
| 1152 | + Description: | ||
| 1153 | + This function is used to retrieve buffer size setting for a transaction | ||
| 1154 | + based on cmd. | ||
| 1155 | + Input Parameters: | ||
| 1156 | + context - Pointer to DFC context structure | ||
| 1157 | + cmd | ||
| 1158 | + Specifies type of command to be sent to NAND flash .The LSB of this | ||
| 1159 | + parameter defines the first command code for 2-cycles command. The | ||
| 1160 | + MSB defines the second command code for 2-cycles command. If MSB is | ||
| 1161 | + set to zero, this indicates that one cycle command | ||
| 1162 | + Output Parameters: | ||
| 1163 | + data_size | ||
| 1164 | + It is used to retrieve length of data transferred to/from DFC, | ||
| 1165 | + which includes padding bytes | ||
| 1166 | + padding | ||
| 1167 | + It is used to retrieve how many padding bytes there should be | ||
| 1168 | + in buffer of data_size. | ||
| 1169 | + Returns: | ||
| 1170 | + 0 | ||
| 1171 | + If size setting is returned successfully | ||
| 1172 | + -EINVAL | ||
| 1173 | + If page size specified in flash spec of context structure is not 512 or | ||
| 1174 | + 2048;If specified command index is not read1/program/erase/reset/readID/ | ||
| 1175 | + readStatus. | ||
| 1176 | +*******************************************************************************/ | ||
| 1177 | +int dfc_get_pattern(struct dfc_context *context, uint16_t cmd, | ||
| 1178 | + int *data_size, int *padding) | ||
| 1179 | +{ | ||
| 1180 | + struct dfc_mode* dfc_mode = context->dfc_mode; | ||
| 1181 | + struct dfc_flash_info * flash_info = context->flash_info; | ||
| 1182 | + uint32_t page_size = context->flash_info->page_size; /* 512 or 2048 */ | ||
| 1183 | + | ||
| 1184 | + if (cmd == flash_info->read1 || | ||
| 1185 | + cmd == flash_info->program) { | ||
| 1186 | + if (512 == page_size) { | ||
| 1187 | + /* add for DMA */ | ||
| 1188 | + if (dfc_mode->enable_dma) { | ||
| 1189 | + *data_size = DFC_DATA_SIZE_544; | ||
| 1190 | + if (dfc_mode->enable_ecc) | ||
| 1191 | + *padding = DFC_PADDING_SIZE_24; | ||
| 1192 | + else | ||
| 1193 | + *padding = DFC_PADDING_SIZE_16; | ||
| 1194 | + } else if (!dfc_mode->enable_spare) { | ||
| 1195 | + *data_size = DFC_DATA_SIZE_512; | ||
| 1196 | + *padding = DFC_PADDING_SIZE_0; | ||
| 1197 | + } else { | ||
| 1198 | + | ||
| 1199 | + if (dfc_mode->enable_ecc) | ||
| 1200 | + *data_size = DFC_DATA_SIZE_520; | ||
| 1201 | + else | ||
| 1202 | + *data_size = DFC_DATA_SIZE_528; | ||
| 1203 | + | ||
| 1204 | + *padding = DFC_PADDING_SIZE_0; | ||
| 1205 | + } | ||
| 1206 | + } else if (2048 == page_size) { | ||
| 1207 | + /* add for DMA */ | ||
| 1208 | + if (dfc_mode->enable_dma) { | ||
| 1209 | + *data_size = DFC_DATA_SIZE_2112; | ||
| 1210 | + if (dfc_mode->enable_ecc) | ||
| 1211 | + *padding = DFC_PADDING_SIZE_24; | ||
| 1212 | + else | ||
| 1213 | + *padding = DFC_PADDING_SIZE_0; | ||
| 1214 | + } else if (!dfc_mode->enable_spare) { | ||
| 1215 | + *data_size = DFC_DATA_SIZE_2048; | ||
| 1216 | + *padding = DFC_PADDING_SIZE_0; | ||
| 1217 | + } else { | ||
| 1218 | + | ||
| 1219 | + if (dfc_mode->enable_ecc) | ||
| 1220 | + *data_size = DFC_DATA_SIZE_2088; | ||
| 1221 | + else | ||
| 1222 | + *data_size = DFC_DATA_SIZE_2112; | ||
| 1223 | + | ||
| 1224 | + *padding = DFC_PADDING_SIZE_0; | ||
| 1225 | + } | ||
| 1226 | + } else /* if the page_size is neither 512 or 2048 */ | ||
| 1227 | + return -EINVAL; | ||
| 1228 | + } else if (cmd == flash_info->read_id) { | ||
| 1229 | + *data_size = DFC_DATA_SIZE_ID; | ||
| 1230 | + *padding = DFC_PADDING_SIZE_0; | ||
| 1231 | + } else if(cmd == flash_info->read_status) { | ||
| 1232 | + *data_size = DFC_DATA_SIZE_STATUS; | ||
| 1233 | + *padding = DFC_PADDING_SIZE_0; | ||
| 1234 | + } else if (cmd == flash_info->erase || cmd == flash_info->reset) { | ||
| 1235 | + *data_size = DFC_DATA_SIZE_UNUSED; | ||
| 1236 | + *padding = DFC_PADDING_SIZE_UNUSED; | ||
| 1237 | + } else | ||
| 1238 | + return -EINVAL; | ||
| 1239 | + return 0; | ||
| 1240 | +} | ||
| 1241 | + | ||
| 1242 | + | ||
| 1243 | +/****************************************************************************** | ||
| 1244 | + dfc_send_cmd | ||
| 1245 | + | ||
| 1246 | + Description: | ||
| 1247 | + This function configures DFC to send command through DFC to NAND flash | ||
| 1248 | + Input Parameters: | ||
| 1249 | + context | ||
| 1250 | + Pointer to DFC context structure | ||
| 1251 | + cmd | ||
| 1252 | + Specifies type of command to be sent to NAND flash .The LSB of this | ||
| 1253 | + parameter defines the first command code for 2-cycles command. The | ||
| 1254 | + MSB defines the second command code for 2-cycles command. If MSB is | ||
| 1255 | + set to zero, this indicates that one cycle command | ||
| 1256 | + addr | ||
| 1257 | + Address sent out to the flash device withthis command. For page read/ | ||
| 1258 | + program commands , 4-cycles address is sent. For erase command only | ||
| 1259 | + 3-cycles address is sent. If it is equal to 0xFFFFFFFF, the address | ||
| 1260 | + should not be used. | ||
| 1261 | + num_pages | ||
| 1262 | + It specifies the number of pages of data to be transferred for | ||
| 1263 | + a program or read commands. Unused for any other commands than | ||
| 1264 | + read/program. | ||
| 1265 | + | ||
| 1266 | + Output Parameters: | ||
| 1267 | + None | ||
| 1268 | + Returns: | ||
| 1269 | + 0 | ||
| 1270 | + If size setting is returned successfully | ||
| 1271 | + -EINVAL | ||
| 1272 | + If specified command index is not read1/program/erase/reset/readID/ | ||
| 1273 | + readStatus. | ||
| 1274 | +*******************************************************************************/ | ||
| 1275 | +int dfc_send_cmd(struct dfc_context *context, uint16_t cmd, | ||
| 1276 | + uint32_t addr, int num_pages) | ||
| 1277 | +{ | ||
| 1278 | + struct dfc_flash_info *flash_info = context->flash_info; | ||
| 1279 | + struct dfc_mode *dfc_mode = context->dfc_mode; | ||
| 1280 | + uint8_t cmd2; | ||
| 1281 | + uint32_t event_out; | ||
| 1282 | + uint32_t ndcb0=0, ndcb1=0, ndcb2=0, ndcr; | ||
| 1283 | + int status; | ||
| 1284 | + | ||
| 1285 | + /* It is a must to set ND_RUN firstly, then write command buffer | ||
| 1286 | + * If conversely,it does not work | ||
| 1287 | + */ | ||
| 1288 | + dfc_write(context, DFC_NDSR, NDSR_MASK); | ||
| 1289 | + | ||
| 1290 | + /* Set ND_RUN */ | ||
| 1291 | + ndcr = dfc_read(context, DFC_NDCR); | ||
| 1292 | + dfc_write(context, DFC_NDCR, (ndcr | NDCR_ND_RUN)); | ||
| 1293 | + | ||
| 1294 | + // Wait for write command request | ||
| 1295 | + status = dfc_wait_event(context, NDSR_WRCMDREQ, | ||
| 1296 | + &event_out, NAND_CMD_TIMEOUT, 0); | ||
| 1297 | + | ||
| 1298 | + if (status) /* Timeout */ | ||
| 1299 | + return status; | ||
| 1300 | + | ||
| 1301 | + cmd2 = (cmd>>8) & 0xFF; | ||
| 1302 | + ndcb0 = cmd | (dfc_mode->chip_select<<24) | ((cmd2?1:0)<<19); | ||
| 1303 | + | ||
| 1304 | + if (cmd == flash_info->read1) { | ||
| 1305 | + if (0xFFFFFFFF != addr) { | ||
| 1306 | + ndcb0 |= NDCB0_ADDR_CYC(4); | ||
| 1307 | + status = flash_info->addr2ndcb1(cmd, addr, &ndcb1); | ||
| 1308 | + if (status) | ||
| 1309 | + return status; | ||
| 1310 | + ndcb2 = (num_pages - 1) << 8; | ||
| 1311 | + } | ||
| 1312 | + } else if (cmd == flash_info->program) { | ||
| 1313 | + ndcb0 |= NDCB0_CMD_TYPE(1) | NDCB0_AUTO_RS; | ||
| 1314 | + ndcb0 |= NDCB0_ADDR_CYC(4); | ||
| 1315 | + status = flash_info->addr2ndcb1(cmd, addr, &ndcb1); | ||
| 1316 | + if (status) | ||
| 1317 | + return status; | ||
| 1318 | + ndcb2 = (num_pages-1) << 8; | ||
| 1319 | + } else if (cmd == flash_info->erase) { | ||
| 1320 | + ndcb0 |= NDCB0_CMD_TYPE(2) | NDCB0_AUTO_RS; | ||
| 1321 | + ndcb0 |= NDCB0_ADDR_CYC(3); | ||
| 1322 | + status = flash_info->addr2ndcb1(cmd, addr, &ndcb1); | ||
| 1323 | + if (status) | ||
| 1324 | + return status; | ||
| 1325 | + } else if (cmd == flash_info->read_id) { | ||
| 1326 | + ndcb0 |= NDCB0_CMD_TYPE(3); | ||
| 1327 | + } else if(cmd == flash_info->read_status) { | ||
| 1328 | + ndcb0 |= NDCB0_CMD_TYPE(4); | ||
| 1329 | + } else if(cmd == flash_info->reset) { | ||
| 1330 | + ndcb0 |= NDCB0_CMD_TYPE(5); | ||
| 1331 | + } else if (cmd == flash_info->lock) { | ||
| 1332 | + ndcb0 |= NDCB0_CMD_TYPE(5); | ||
| 1333 | + } else | ||
| 1334 | + return -EINVAL; | ||
| 1335 | + | ||
| 1336 | + /* Write to DFC command register */ | ||
| 1337 | + dfc_write(context, DFC_NDCB0, ndcb0); | ||
| 1338 | + dfc_write(context, DFC_NDCB0, ndcb1); | ||
| 1339 | + dfc_write(context, DFC_NDCB0, ndcb2); | ||
| 1340 | + | ||
| 1341 | + return 0; | ||
| 1342 | +} | ||
| 1343 | + | ||
| 1344 | +/****************************************************************************** | ||
| 1345 | + dfc_stop | ||
| 1346 | + | ||
| 1347 | + Description: | ||
| 1348 | + This function clears ND_RUN bit of NDCR. | ||
| 1349 | + Input Parameters: | ||
| 1350 | + context--Pointer to DFC context structure | ||
| 1351 | + Output Parameters: | ||
| 1352 | + None | ||
| 1353 | + Returns: | ||
| 1354 | + None | ||
| 1355 | +*******************************************************************************/ | ||
| 1356 | +void dfc_stop(struct dfc_context *context) | ||
| 1357 | +{ | ||
| 1358 | + unsigned int ndcr; | ||
| 1359 | + ndcr = dfc_read(context, DFC_NDCR); | ||
| 1360 | + dfc_write(context, DFC_NDCR, (ndcr & ~NDCR_ND_RUN)); | ||
| 1361 | + ndcr = dfc_read(context, DFC_NDCR); | ||
| 1362 | + | ||
| 1363 | + return; | ||
| 1364 | +} | ||
| 1365 | + | ||
| 1366 | +int dfc_setup_cmd_dma(struct dfc_context *context, | ||
| 1367 | + uint16_t cmd, uint32_t addr, int num_pages, | ||
| 1368 | + uint32_t *buf, uint32_t buf_phys, | ||
| 1369 | + uint32_t next_desc_phys, uint32_t dma_int_en, | ||
| 1370 | + struct pxa_dma_desc *dma_desc) | ||
| 1371 | +{ | ||
| 1372 | + struct dfc_flash_info *flash_info = context->flash_info; | ||
| 1373 | + struct dfc_mode *dfc_mode = context->dfc_mode; | ||
| 1374 | + uint8_t cmd2; | ||
| 1375 | + uint32_t event_out; | ||
| 1376 | + uint32_t ndcb0=0, ndcb1=0, ndcb2=0, ndcr; | ||
| 1377 | + int status; | ||
| 1378 | + | ||
| 1379 | + /* | ||
| 1380 | + * It is a must to set ND_RUN firstly, then write command buffer | ||
| 1381 | + * If conversely,it does not work | ||
| 1382 | + */ | ||
| 1383 | + dfc_write(context, DFC_NDSR, NDSR_MASK); | ||
| 1384 | + | ||
| 1385 | + /* Set ND_RUN */ | ||
| 1386 | + ndcr = dfc_read(context, DFC_NDCR); | ||
| 1387 | + ndcr |= NDCR_ND_RUN; | ||
| 1388 | + dfc_write(context, DFC_NDCR, ndcr); | ||
| 1389 | + | ||
| 1390 | + /* Wait for write command request */ | ||
| 1391 | + status = dfc_wait_event(context, NDSR_WRCMDREQ, | ||
| 1392 | + &event_out, NAND_CMD_TIMEOUT, 0); | ||
| 1393 | + | ||
| 1394 | + if (status) | ||
| 1395 | + return status; /* Timeout */ | ||
| 1396 | + | ||
| 1397 | + cmd2 = (cmd>>8) & 0xFF; | ||
| 1398 | + ndcb0 = cmd | (dfc_mode->chip_select<<24) | ((cmd2?1:0)<<19); | ||
| 1399 | + | ||
| 1400 | + if (cmd == flash_info->read1) { | ||
| 1401 | + if (0xFFFFFFFF != addr) { | ||
| 1402 | + ndcb0 |= NDCB0_ADDR_CYC(4); | ||
| 1403 | + status = flash_info->addr2ndcb1(cmd, addr, &ndcb1); | ||
| 1404 | + if (status) | ||
| 1405 | + return status; | ||
| 1406 | + ndcb2 = (num_pages-1) << 8; | ||
| 1407 | + } | ||
| 1408 | + } else if (cmd == flash_info->program) { | ||
| 1409 | + ndcb0 |= NDCB0_CMD_TYPE(1) | NDCB0_AUTO_RS; | ||
| 1410 | + ndcb0 |= NDCB0_ADDR_CYC(4); | ||
| 1411 | + | ||
| 1412 | + status = flash_info->addr2ndcb1(cmd, addr, &ndcb1); | ||
| 1413 | + if (status) | ||
| 1414 | + return status; | ||
| 1415 | + ndcb2 = (num_pages-1) << 8; | ||
| 1416 | + } else if (cmd == flash_info->erase) { | ||
| 1417 | + ndcb0 |= NDCB0_CMD_TYPE(2) | NDCB0_AUTO_RS; | ||
| 1418 | + ndcb0 |= NDCB0_ADDR_CYC(3); | ||
| 1419 | + | ||
| 1420 | + status = flash_info->addr2ndcb1(cmd, addr, &ndcb1); | ||
| 1421 | + if (status) | ||
| 1422 | + return status; | ||
| 1423 | + } else if (cmd == flash_info->read_id) { | ||
| 1424 | + ndcb0 |= NDCB0_CMD_TYPE(3); | ||
| 1425 | + } else if (cmd == flash_info->read_status) { | ||
| 1426 | + ndcb0 |= NDCB0_CMD_TYPE(4); | ||
| 1427 | + } else if (cmd == flash_info->reset) { | ||
| 1428 | + ndcb0 |= NDCB0_CMD_TYPE(5); | ||
| 1429 | + } else if (cmd == flash_info->lock) { | ||
| 1430 | + ndcb0 |= NDCB0_CMD_TYPE(5); | ||
| 1431 | + } else | ||
| 1432 | + return -EINVAL; | ||
| 1433 | + | ||
| 1434 | + *((uint32_t *)buf) = ndcb0; | ||
| 1435 | + *((uint32_t *)buf + 1) = ndcb1; | ||
| 1436 | + *((uint32_t *)buf + 2) = ndcb2; | ||
| 1437 | + | ||
| 1438 | + dma_int_en &= (DCMD_STARTIRQEN | DCMD_ENDIRQEN); | ||
| 1439 | + | ||
| 1440 | + dma_desc->ddadr = next_desc_phys; | ||
| 1441 | + dma_desc->dsadr = buf_phys; | ||
| 1442 | + dma_desc->dtadr = NDCB0_DMA_ADDR; | ||
| 1443 | + dma_desc->dcmd = DCMD_INCSRCADDR | DCMD_FLOWTRG | dma_int_en | | ||
| 1444 | + DCMD_WIDTH4 | DCMD_BURST16 | 12; | ||
| 1445 | + return 0; | ||
| 1446 | +} | ||
| 1447 | + | ||
| 1448 | +int dfc_setup_data_dma(struct dfc_context* context, | ||
| 1449 | + uint16_t cmd, uint32_t buf_phys, | ||
| 1450 | + uint32_t next_desc_phys, uint32_t dma_int_en, | ||
| 1451 | + struct pxa_dma_desc* dma_desc) | ||
| 1452 | +{ | ||
| 1453 | + struct dfc_flash_info * flash_info = context->flash_info; | ||
| 1454 | + int data_size, padding; | ||
| 1455 | + | ||
| 1456 | + dfc_get_pattern(context, cmd, &data_size, &padding); | ||
| 1457 | + | ||
| 1458 | + dma_desc->ddadr = next_desc_phys; | ||
| 1459 | + dma_int_en &= (DCMD_STARTIRQEN | DCMD_ENDIRQEN); | ||
| 1460 | + | ||
| 1461 | + if (cmd == flash_info->program) { | ||
| 1462 | + | ||
| 1463 | + dma_desc->dsadr = buf_phys; | ||
| 1464 | + dma_desc->dtadr = NDDB_DMA_ADDR; | ||
| 1465 | + dma_desc->dcmd = DCMD_INCSRCADDR | DCMD_FLOWTRG | dma_int_en | | ||
| 1466 | + DCMD_WIDTH4 | DCMD_BURST32 | data_size; | ||
| 1467 | + | ||
| 1468 | + } else if (cmd == flash_info->read1 || cmd == flash_info->read_id || | ||
| 1469 | + cmd == flash_info->read_status) { | ||
| 1470 | + | ||
| 1471 | + dma_desc->dsadr = NDDB_DMA_ADDR; | ||
| 1472 | + dma_desc->dtadr = buf_phys; | ||
| 1473 | + dma_desc->dcmd = DCMD_INCTRGADDR | DCMD_FLOWSRC | dma_int_en | | ||
| 1474 | + DCMD_WIDTH4 | DCMD_BURST32 | data_size; | ||
| 1475 | + } | ||
| 1476 | + else | ||
| 1477 | + return -EINVAL; | ||
| 1478 | + return 0; | ||
| 1479 | +} | ||
| 1480 | + | ||
| 1481 | +void dfc_start_cmd_dma(struct dfc_context* context, struct pxa_dma_desc* dma_desc) | ||
| 1482 | +{ | ||
| 1483 | + DRCMR99 = DRCMR_MAPVLD | context->cmd_dma_ch; /* NAND CMD DRCMR */ | ||
| 1484 | + DDADR(context->cmd_dma_ch) = (uint32_t)dma_desc; | ||
| 1485 | + DCSR(context->cmd_dma_ch) |= DCSR_RUN; | ||
| 1486 | +} | ||
| 1487 | + | ||
| 1488 | +void dfc_start_data_dma(struct dfc_context* context, struct pxa_dma_desc* dma_desc) | ||
| 1489 | +{ | ||
| 1490 | + DRCMR97 = DRCMR_MAPVLD | context->data_dma_ch; | ||
| 1491 | + DDADR(context->data_dma_ch) = (uint32_t)dma_desc; | ||
| 1492 | + DCSR(context->data_dma_ch) |= DCSR_RUN; | ||
| 1493 | +} | ||
| 1494 | + | ||
| 1495 | +/****************************************************************************** | ||
| 1496 | + dfc_read_fifo_partial | ||
| 1497 | + | ||
| 1498 | + Description: | ||
| 1499 | + This function reads data from data buffer of DFC.Bytes can be any less than | ||
| 1500 | + or equal to data_size, the left is ignored by ReadFIFO though they will be | ||
| 1501 | + read from NDDB to clear data buffer. | ||
| 1502 | + Input Parameters: | ||
| 1503 | + context | ||
| 1504 | + Pointer to DFC context structure | ||
| 1505 | + nbytes | ||
| 1506 | + Indicating how much data should be read into buffer. | ||
| 1507 | + data_size | ||
| 1508 | + Specifing length of data transferred to/from DFC, which includes | ||
| 1509 | + padding bytes | ||
| 1510 | + Output Parameters: | ||
| 1511 | + pBuffer | ||
| 1512 | + Pointer to the data buffer where data should be placed. | ||
| 1513 | + Returns: | ||
| 1514 | + None | ||
| 1515 | +*******************************************************************************/ | ||
| 1516 | +void dfc_read_fifo_partial(struct dfc_context *context, uint8_t *buffer, | ||
| 1517 | + int nbytes, int data_size) | ||
| 1518 | +{ | ||
| 1519 | + uint32_t data = 0; | ||
| 1520 | + uint32_t i = 0; | ||
| 1521 | + uint32_t bytes_multi; | ||
| 1522 | + uint32_t bytes_remain; | ||
| 1523 | + | ||
| 1524 | + | ||
| 1525 | + if (1 == data_size) { | ||
| 1526 | + data = dfc_read(context, DFC_NDDB) & 0xFF; | ||
| 1527 | + *buffer++ = (uint8_t)data; | ||
| 1528 | + } else if (2 == data_size) { | ||
| 1529 | + data = dfc_read(context, DFC_NDDB) & 0xFFFF; | ||
| 1530 | + *buffer++ = data & 0xFF; | ||
| 1531 | + *buffer++ = (data >> 8) & 0xFF; | ||
| 1532 | + } else { | ||
| 1533 | + bytes_multi = (nbytes & 0xFFFFFFFC); | ||
| 1534 | + bytes_remain = nbytes & 0x03; | ||
| 1535 | + | ||
| 1536 | + i = 0; | ||
| 1537 | + /* Read the bytes_multi*4 bytes data */ | ||
| 1538 | + while (i < bytes_multi) { | ||
| 1539 | + data = dfc_read(context, DFC_NDDB); | ||
| 1540 | + /* FIXME: we don't know whether the buffer | ||
| 1541 | + * align to 4 bytes or not. Cast the buffer | ||
| 1542 | + * to int is not safe here. Especially under | ||
| 1543 | + * gcc 4.x. Used memcpy here. But the memcpy | ||
| 1544 | + * may be not correct on BE architecture. | ||
| 1545 | + * --by Yin, Fengwei | ||
| 1546 | + */ | ||
| 1547 | + memcpy(buffer, &data, sizeof(data)); | ||
| 1548 | + i += sizeof(data); | ||
| 1549 | + buffer += sizeof(data); | ||
| 1550 | + } | ||
| 1551 | + | ||
| 1552 | + /* Read the left bytes_remain bytes data */ | ||
| 1553 | + if (bytes_remain) { | ||
| 1554 | + data = dfc_read(context, DFC_NDDB); | ||
| 1555 | + for (i = 0; i < bytes_remain; i++) | ||
| 1556 | + *buffer++ = (uint8_t)((data >> (8*i)) & 0xFF); | ||
| 1557 | + } | ||
| 1558 | + | ||
| 1559 | + /* When read the remain bytes, we always read 4 bytes data | ||
| 1560 | + * to DFC. So the data_size should subtract following number. | ||
| 1561 | + */ | ||
| 1562 | + data_size -= bytes_multi + (bytes_remain ? sizeof(data) : 0); | ||
| 1563 | + | ||
| 1564 | + /* We need Read data_size bytes data totally */ | ||
| 1565 | + while (data_size > 0) { | ||
| 1566 | + data = dfc_read(context, DFC_NDDB); | ||
| 1567 | + data_size -= sizeof(data); | ||
| 1568 | + } | ||
| 1569 | + | ||
| 1570 | +/* | ||
| 1571 | + while(i < ((uint32_t)data_size) ) { | ||
| 1572 | + if (i < bytes_multi) { | ||
| 1573 | + temp = (uint32_t *)buffer; | ||
| 1574 | + *temp = dfc_reg->nddb; | ||
| 1575 | + } else if (i == bytes_multi && bytes_remain){ | ||
| 1576 | + uint32_t j = 0; | ||
| 1577 | + data = dfc_reg->nddb; | ||
| 1578 | + while (j++ < bytes_remain) { | ||
| 1579 | + *buffer++ = (uint8_t) \ | ||
| 1580 | + ((data>>(8*j)) & 0xFF); | ||
| 1581 | + } | ||
| 1582 | + } else { | ||
| 1583 | + data = dfc_reg->nddb; | ||
| 1584 | + } | ||
| 1585 | + i += 4; | ||
| 1586 | + buffer += 4; | ||
| 1587 | + } | ||
| 1588 | +*/ | ||
| 1589 | + } | ||
| 1590 | + return; | ||
| 1591 | +} | ||
| 1592 | + | ||
| 1593 | +/****************************************************************************** | ||
| 1594 | + dfc_write_fifo_partial | ||
| 1595 | + | ||
| 1596 | + Description: | ||
| 1597 | + Write to data buffer of DFC from a buffer. Bytes can be same as | ||
| 1598 | + data_size, also can be data_size-padding, but can¡¯t be random value, | ||
| 1599 | + the left will be automatically padded by WriteFIFO. | ||
| 1600 | + Input Parameters: | ||
| 1601 | + context | ||
| 1602 | + Pointer to DFC context structure | ||
| 1603 | + bytes | ||
| 1604 | + Indicating how much data should be read into buffer. | ||
| 1605 | + data_size | ||
| 1606 | + Specifing length of data transferred to/from DFC, which includes | ||
| 1607 | + padding bytes | ||
| 1608 | + buffer | ||
| 1609 | + Pointer to the data buffer where data will be taken from to be written | ||
| 1610 | + to DFC data buffer | ||
| 1611 | + Output Parameters: | ||
| 1612 | + None | ||
| 1613 | + Returns: | ||
| 1614 | + None | ||
| 1615 | +*******************************************************************************/ | ||
| 1616 | +void dfc_write_fifo_partial(struct dfc_context *context, uint8_t *buffer, | ||
| 1617 | + int nbytes, int data_size) | ||
| 1618 | +{ | ||
| 1619 | + uint32_t i = 0; | ||
| 1620 | + | ||
| 1621 | + uint32_t bytes_multi = (nbytes & 0xFFFFFFFC); | ||
| 1622 | + uint32_t bytes_remain = nbytes & 0x03; | ||
| 1623 | + uint32_t temp; | ||
| 1624 | + /* | ||
| 1625 | + * caller guarantee buffer contains appropriate data thereby | ||
| 1626 | + * it is impossible for nbytes not to be a multiple of 4 byte | ||
| 1627 | + */ | ||
| 1628 | + | ||
| 1629 | + /* Write the bytes_multi*4 bytes data */ | ||
| 1630 | + while (i < bytes_multi) { | ||
| 1631 | + temp = buffer[0] | buffer[1] << 8 | | ||
| 1632 | + buffer[2] << 16 | buffer[3] << 24; | ||
| 1633 | + dfc_write(context, DFC_NDDB, temp); | ||
| 1634 | + buffer += 4; | ||
| 1635 | + i += 4; | ||
| 1636 | + } | ||
| 1637 | + | ||
| 1638 | + /* Write the left bytes_remain bytes data */ | ||
| 1639 | + if (bytes_remain) { | ||
| 1640 | + temp = 0xFFFFFFFF; | ||
| 1641 | + for (i = 0; i < bytes_remain; i++) | ||
| 1642 | + temp &= *buffer++ << i*8; | ||
| 1643 | + | ||
| 1644 | + dfc_write(context, DFC_NDDB, temp); | ||
| 1645 | + } | ||
| 1646 | + | ||
| 1647 | + /* When write the remain bytes, we always write 4 bytes data | ||
| 1648 | + * to DFC. So the data_size should subtract following number. | ||
| 1649 | + */ | ||
| 1650 | + data_size -= bytes_multi + (bytes_remain ? sizeof(temp) : 0); | ||
| 1651 | + | ||
| 1652 | + while (data_size > 0) { | ||
| 1653 | + dfc_write(context, DFC_NDDB, 0xFFFFFFFF); | ||
| 1654 | + data_size -= 4; | ||
| 1655 | + } | ||
| 1656 | + | ||
| 1657 | +/* | ||
| 1658 | + while (i < ((uint32_t)data_size)) { | ||
| 1659 | + if (i < bytes_multi) { | ||
| 1660 | + temp = (uint32_t *)buffer; | ||
| 1661 | + dfc_reg->nddb = *temp; | ||
| 1662 | + } | ||
| 1663 | + else if (i == bytes_multi && bytes_remain) { | ||
| 1664 | + uint32_t j = 0, data = 0xFFFFFFFF; | ||
| 1665 | + while (j < bytes_remain) { | ||
| 1666 | + data &= (uint8_t)(*buffer) << j; | ||
| 1667 | + buffer++; | ||
| 1668 | + j++; | ||
| 1669 | + } | ||
| 1670 | + dfc_reg->nddb = data; | ||
| 1671 | + } | ||
| 1672 | + else { | ||
| 1673 | + dfc_reg->nddb = 0xFFFFFFFF; | ||
| 1674 | + } | ||
| 1675 | + i += 4; | ||
| 1676 | + buffer += 4; | ||
| 1677 | + } | ||
| 1678 | +*/ | ||
| 1679 | + | ||
| 1680 | + return; | ||
| 1681 | +} | ||
| 1682 | + | ||
| 1683 | +/****************************************************************************** | ||
| 1684 | + dfc_read_fifo | ||
| 1685 | + Description: | ||
| 1686 | + This function reads data from data buffer of DFC.Bytes can be any less | ||
| 1687 | + than or equal to data_size, the left is ignored by ReadFIFO though they | ||
| 1688 | + will be read from NDDB to clear data buffer. | ||
| 1689 | + Input Parameters: | ||
| 1690 | + context | ||
| 1691 | + Pointer to DFC context structure | ||
| 1692 | + nbytes | ||
| 1693 | + Indicating how much data should be read into buffer. | ||
| 1694 | + data_size | ||
| 1695 | + Specifing length of data transferred to/from DFC, which includes | ||
| 1696 | + padding bytes | ||
| 1697 | + Output Parameters: | ||
| 1698 | + buffer | ||
| 1699 | + Pointer to the data buffer where data should be placed. | ||
| 1700 | + Returns: | ||
| 1701 | + None | ||
| 1702 | +*******************************************************************************/ | ||
| 1703 | + | ||
| 1704 | +void dfc_read_fifo(struct dfc_context *context, uint8_t *buffer, int nbytes) | ||
| 1705 | +{ | ||
| 1706 | + uint32_t i = 0; | ||
| 1707 | + | ||
| 1708 | + uint32_t bytes_multi = (nbytes & 0xFFFFFFFC); | ||
| 1709 | + uint32_t bytes_remain = nbytes & 0x03; | ||
| 1710 | + uint32_t temp; | ||
| 1711 | + | ||
| 1712 | + /* Read the bytes_multi*4 bytes data */ | ||
| 1713 | + while (i < bytes_multi) { | ||
| 1714 | + temp = dfc_read(context, DFC_NDDB); | ||
| 1715 | + /* FIXME: we don't know whether the buffer | ||
| 1716 | + * align to 4 bytes or not. Cast the buffer | ||
| 1717 | + * to int is not safe here. Especially under | ||
| 1718 | + * gcc 4.x. Used memcpy here. But the memcpy | ||
| 1719 | + * may be not correct on BE architecture. | ||
| 1720 | + * --by Yin, Fengwei | ||
| 1721 | + */ | ||
| 1722 | + memcpy(buffer, &temp, sizeof(temp)); | ||
| 1723 | + i += sizeof(temp); | ||
| 1724 | + buffer += sizeof(temp); | ||
| 1725 | + } | ||
| 1726 | + | ||
| 1727 | + /* Read the left bytes_remain bytes data */ | ||
| 1728 | + temp = dfc_read(context, DFC_NDDB); | ||
| 1729 | + for (i = 0; i < bytes_remain; i++) { | ||
| 1730 | + *buffer++ = (uint8_t)((temp >> (8*i)) & 0xFF); | ||
| 1731 | + } | ||
| 1732 | + | ||
| 1733 | +/* | ||
| 1734 | + while (i < bytes_multi) { | ||
| 1735 | + temp = (uint32_t *)buffer; | ||
| 1736 | + *temp = dfc_reg->nddb; | ||
| 1737 | + i += 4; | ||
| 1738 | + buffer += 4; | ||
| 1739 | + } | ||
| 1740 | + | ||
| 1741 | + if (bytes_remain) { | ||
| 1742 | + data = dfc_reg->nddb; | ||
| 1743 | + for (i = 0; i < bytes_remain; i++) { | ||
| 1744 | + *buffer++ = (uint8_t)((data>>(8*i)) & 0xFF); | ||
| 1745 | + } | ||
| 1746 | + } | ||
| 1747 | +*/ | ||
| 1748 | + | ||
| 1749 | + return; | ||
| 1750 | +} | ||
| 1751 | + | ||
| 1752 | +/****************************************************************************** | ||
| 1753 | + dfc_write_fifo | ||
| 1754 | + Description: | ||
| 1755 | + Write to data buffer of DFC from a buffer.Bytes can be same as data_size, | ||
| 1756 | + also can be data_size-padding, but can¡¯t be random value, the left will | ||
| 1757 | + be automatically padded by WriteFIFO. | ||
| 1758 | + Input Parameters: | ||
| 1759 | + context | ||
| 1760 | + Pointer to DFC context structure | ||
| 1761 | + nbytes | ||
| 1762 | + Indicating how much data should be read into buffer. | ||
| 1763 | + data_size | ||
| 1764 | + Specifing length of data transferred to/from DFC, which includes | ||
| 1765 | + padding bytes | ||
| 1766 | + buffer | ||
| 1767 | + Pointer to the data buffer where data will be taken from to be written to | ||
| 1768 | + DFC data buffer | ||
| 1769 | + Output Parameters: | ||
| 1770 | + None | ||
| 1771 | + Returns: | ||
| 1772 | + None | ||
| 1773 | +*******************************************************************************/ | ||
| 1774 | +void dfc_write_fifo(struct dfc_context *context, uint8_t *buffer, int nbytes) | ||
| 1775 | +{ | ||
| 1776 | + uint32_t bytes_multi = (nbytes & 0xFFFFFFFC); | ||
| 1777 | + uint32_t bytes_remain = nbytes & 0x03; | ||
| 1778 | + uint32_t i=0; | ||
| 1779 | + uint32_t temp; | ||
| 1780 | + | ||
| 1781 | + /* Write the bytes_multi*4 bytes data */ | ||
| 1782 | + while (i < bytes_multi) { | ||
| 1783 | + temp = buffer[0] | buffer[1] << 8 | | ||
| 1784 | + buffer[2] << 16 | buffer[3] << 24; | ||
| 1785 | + dfc_write(context, DFC_NDDB, temp); | ||
| 1786 | + buffer += 4; | ||
| 1787 | + i += 4; | ||
| 1788 | + } | ||
| 1789 | + | ||
| 1790 | + /* Write the left bytes_remain bytes data */ | ||
| 1791 | + temp = 0xFFFFFFFF; | ||
| 1792 | + for (i = 0; i < bytes_remain; i++) | ||
| 1793 | + temp &= *buffer++ << i*8; | ||
| 1794 | + dfc_write(context, DFC_NDDB, temp); | ||
| 1795 | + | ||
| 1796 | +/* | ||
| 1797 | + while (i < nbytes) { | ||
| 1798 | + temp = (uint32_t *)buffer; | ||
| 1799 | + dfc_reg->nddb = *temp; | ||
| 1800 | + i += 4; | ||
| 1801 | + buffer += 4; | ||
| 1802 | + } | ||
| 1803 | +*/ | ||
| 1804 | +} | ||
| 1805 | + | ||
| 1806 | +/****************************************************************************** | ||
| 1807 | + dfc_read_badblock_addr | ||
| 1808 | + | ||
| 1809 | + Description: | ||
| 1810 | + This function reads bad block address in units of block starting from 0 | ||
| 1811 | + if bad block is detected. It takes into the account if the operation is | ||
| 1812 | + for CS0 or CS1 depending on settings of chip_select parameter of DFC | ||
| 1813 | + Mode structure. | ||
| 1814 | + Input Parameters: | ||
| 1815 | + context | ||
| 1816 | + Pointer to DFC context structure | ||
| 1817 | + Output Parameters: | ||
| 1818 | + pBadBlockAddr | ||
| 1819 | + Used to retrieve bad block address back to caller if bad block is | ||
| 1820 | + detected | ||
| 1821 | + Returns: | ||
| 1822 | + None | ||
| 1823 | +*******************************************************************************/ | ||
| 1824 | +void dfc_read_badblock_addr(struct dfc_context *context, uint32_t *bbaddr) | ||
| 1825 | +{ | ||
| 1826 | + uint32_t ndbdr; | ||
| 1827 | + if (0 == context->dfc_mode->chip_select) | ||
| 1828 | + ndbdr = dfc_read(context, DFC_NDBDR0); | ||
| 1829 | + else | ||
| 1830 | + ndbdr = dfc_read(context, DFC_NDBDR1); | ||
| 1831 | + | ||
| 1832 | + if (512 == context->flash_info->page_size) { | ||
| 1833 | + ndbdr = (ndbdr >> 5) & 0xFFF; | ||
| 1834 | + *bbaddr = ndbdr; | ||
| 1835 | + } else if (2048 == context->flash_info->page_size) { | ||
| 1836 | + /* 16 bits LB */ | ||
| 1837 | + ndbdr = (ndbdr >> 8); | ||
| 1838 | + *bbaddr = ndbdr; | ||
| 1839 | + } | ||
| 1840 | + return; | ||
| 1841 | +} | ||
| 1842 | + | ||
| 1843 | +/****************************************************************************** | ||
| 1844 | + dfc_enable_int | ||
| 1845 | + | ||
| 1846 | + Description: | ||
| 1847 | + This function is used to enable DFC interrupts. The bits in int_mask | ||
| 1848 | + will be used to unmask NDCR register to enable corresponding interrupts. | ||
| 1849 | + Input Parameters: | ||
| 1850 | + context | ||
| 1851 | + Pointer to DFC context structure | ||
| 1852 | + int_mask | ||
| 1853 | + Specifies what interrupts to enable | ||
| 1854 | + Output Parameters: | ||
| 1855 | + None | ||
| 1856 | + Returns: | ||
| 1857 | + None | ||
| 1858 | +*******************************************************************************/ | ||
| 1859 | +void dfc_enable_int(struct dfc_context *context, uint32_t int_mask) | ||
| 1860 | +{ | ||
| 1861 | + uint32_t ndcr; | ||
| 1862 | + | ||
| 1863 | + ndcr = dfc_read(context, DFC_NDCR); | ||
| 1864 | + ndcr &= ~int_mask; | ||
| 1865 | + dfc_write(context, DFC_NDCR, ndcr); | ||
| 1866 | + | ||
| 1867 | + ndcr = dfc_read(context, DFC_NDCR); | ||
| 1868 | + return; | ||
| 1869 | +} | ||
| 1870 | + | ||
| 1871 | +/****************************************************************************** | ||
| 1872 | + dfc_disable_int | ||
| 1873 | + | ||
| 1874 | + Description: | ||
| 1875 | + This function is used to disable DFC interrupts. | ||
| 1876 | + The bits inint_mask will be used to mask NDCR register to disable | ||
| 1877 | + corresponding interrupts. | ||
| 1878 | + Input Parameters: | ||
| 1879 | + context | ||
| 1880 | + Pointer to DFC context structure | ||
| 1881 | + int_mask | ||
| 1882 | + Specifies what interrupts to disable | ||
| 1883 | + Output Parameters: | ||
| 1884 | + None | ||
| 1885 | + Returns: | ||
| 1886 | + None | ||
| 1887 | +*******************************************************************************/ | ||
| 1888 | +void dfc_disable_int(struct dfc_context *context, uint32_t int_mask) | ||
| 1889 | +{ | ||
| 1890 | + uint32_t ndcr; | ||
| 1891 | + | ||
| 1892 | + ndcr = dfc_read(context, DFC_NDCR); | ||
| 1893 | + ndcr |= int_mask; | ||
| 1894 | + dfc_write(context, DFC_NDCR, ndcr); | ||
| 1895 | + | ||
| 1896 | + ndcr = dfc_read(context, DFC_NDCR); | ||
| 1897 | + return; | ||
| 1898 | +} | ||
| 1899 | + | ||
| 1900 | +/****************************************************************************** | ||
| 1901 | + dfc_clear_int | ||
| 1902 | + | ||
| 1903 | + Description: | ||
| 1904 | + This function is used to disable DFC interrupts. | ||
| 1905 | + The bits in int_mask will be used to clear corresponding interrupts | ||
| 1906 | + in NDCR register | ||
| 1907 | + Input Parameters: | ||
| 1908 | + context | ||
| 1909 | + Pointer to DFC context structure | ||
| 1910 | + int_mask | ||
| 1911 | + Specifies what interrupts to clear | ||
| 1912 | + Output Parameters: | ||
| 1913 | + None | ||
| 1914 | + Returns: | ||
| 1915 | + None | ||
| 1916 | +*******************************************************************************/ | ||
| 1917 | +void dfc_clear_int(struct dfc_context *context, uint32_t int_mask) | ||
| 1918 | +{ | ||
| 1919 | + dfc_write(context, DFC_NDSR, int_mask); | ||
| 1920 | + | ||
| 1921 | + dfc_read(context, DFC_NDSR); | ||
| 1922 | + return; | ||
| 1923 | +} | ||
| 1924 | + | ||
| 1925 | +/* | ||
| 1926 | + * high level primitives | ||
| 1927 | + */ | ||
| 1928 | + | ||
| 1929 | +/****************************************************************************** | ||
| 1930 | + dfc_init | ||
| 1931 | + | ||
| 1932 | + Description: | ||
| 1933 | + This function does entire DFC initialization according to the NAND | ||
| 1934 | + flash type currently used with platform, including setting MFP, set | ||
| 1935 | + flash timing, set DFC mode, configuring specified flash parameters | ||
| 1936 | + in DFC, clear ECC logic and page count register. | ||
| 1937 | + Input Parameters: | ||
| 1938 | + context | ||
| 1939 | + Pointer to DFC context structure | ||
| 1940 | + Output Parameters: | ||
| 1941 | + None | ||
| 1942 | + Returns: | ||
| 1943 | + 0 | ||
| 1944 | + if MFPRs are set correctly | ||
| 1945 | + -EINVAL | ||
| 1946 | + if specified flash is not support by check bytes per page and pages per | ||
| 1947 | + block | ||
| 1948 | +******************************************************************************/ | ||
| 1949 | + | ||
| 1950 | +static mfp_cfg_t pxa300_nand_cfg[] = { | ||
| 1951 | + /* NAND */ | ||
| 1952 | + MFP_CFG_X(DF_INT_RnB, AF0, DS10X, PULL_LOW), | ||
| 1953 | + MFP_CFG_X(DF_nRE_nOE, AF1, DS10X, PULL_LOW), | ||
| 1954 | + MFP_CFG_X(DF_nWE, AF1, DS10X, PULL_LOW), | ||
| 1955 | + MFP_CFG_X(DF_CLE_nOE, AF0, DS10X, PULL_LOW), | ||
| 1956 | + MFP_CFG_X(DF_nADV1_ALE, AF1, DS10X, PULL_LOW), | ||
| 1957 | + MFP_CFG_X(DF_nCS0, AF1, DS10X, PULL_LOW), | ||
| 1958 | + MFP_CFG_X(DF_nCS1, AF0, DS10X, PULL_LOW), | ||
| 1959 | + MFP_CFG_X(DF_IO0, AF1, DS08X, PULL_LOW), | ||
| 1960 | + MFP_CFG_X(DF_IO1, AF1, DS08X, PULL_LOW), | ||
| 1961 | + MFP_CFG_X(DF_IO2, AF1, DS08X, PULL_LOW), | ||
| 1962 | + MFP_CFG_X(DF_IO3, AF1, DS08X, PULL_LOW), | ||
| 1963 | + MFP_CFG_X(DF_IO4, AF1, DS08X, PULL_LOW), | ||
| 1964 | + MFP_CFG_X(DF_IO5, AF1, DS08X, PULL_LOW), | ||
| 1965 | + MFP_CFG_X(DF_IO6, AF1, DS08X, PULL_LOW), | ||
| 1966 | + MFP_CFG_X(DF_IO7, AF1, DS08X, PULL_LOW), | ||
| 1967 | + MFP_CFG_X(DF_IO8, AF1, DS08X, PULL_LOW), | ||
| 1968 | + MFP_CFG_X(DF_IO9, AF1, DS08X, PULL_LOW), | ||
| 1969 | + MFP_CFG_X(DF_IO10, AF1, DS08X, PULL_LOW), | ||
| 1970 | + MFP_CFG_X(DF_IO11, AF1, DS08X, PULL_LOW), | ||
| 1971 | + MFP_CFG_X(DF_IO12, AF1, DS08X, PULL_LOW), | ||
| 1972 | + MFP_CFG_X(DF_IO13, AF1, DS08X, PULL_LOW), | ||
| 1973 | + MFP_CFG_X(DF_IO14, AF1, DS08X, PULL_LOW), | ||
| 1974 | +}; | ||
| 1975 | + | ||
| 1976 | +#define ARRAY_AND_SIZE(x) (x), ARRAY_SIZE(x) | ||
| 1977 | + | ||
| 1978 | +int dfc_init(struct dfc_context* context, int type) | ||
| 1979 | +{ | ||
| 1980 | + int status; | ||
| 1981 | + struct dfc_flash_info * flash_info; | ||
| 1982 | + uint32_t ndcr = 0x00000FFF; /* disable all interrupts */ | ||
| 1983 | + | ||
| 1984 | + status = dfc_get_flash_info(type, &flash_info); | ||
| 1985 | + if (status) | ||
| 1986 | + return status; | ||
| 1987 | + context->flash_info = flash_info; | ||
| 1988 | + | ||
| 1989 | + pxa3xx_mfp_config(ARRAY_AND_SIZE(pxa300_nand_cfg)); | ||
| 1990 | + //enable_dfc_pins(); | ||
| 1991 | + | ||
| 1992 | + dfc_set_timing(context, &context->flash_info->timing); | ||
| 1993 | + | ||
| 1994 | + if (flash_info->enable_arbiter) | ||
| 1995 | + ndcr |= NDCR_ND_ARB_EN; | ||
| 1996 | + | ||
| 1997 | + if (64 == flash_info->page_per_block) | ||
| 1998 | + ndcr |= NDCR_PG_PER_BLK; | ||
| 1999 | + else if (32 != flash_info->page_per_block) | ||
| 2000 | + return -EINVAL; | ||
| 2001 | + | ||
| 2002 | + if (flash_info->row_addr_start) | ||
| 2003 | + ndcr |= NDCR_RA_START; | ||
| 2004 | + | ||
| 2005 | + ndcr |= (flash_info->read_id_bytes)<<16; | ||
| 2006 | + | ||
| 2007 | + ndcr |= (flash_info->dfc_mode) << 21; | ||
| 2008 | + | ||
| 2009 | + if (flash_info->ncsx) | ||
| 2010 | + ndcr |= NDCR_NCSX; | ||
| 2011 | + | ||
| 2012 | + if (2048 == flash_info->page_size) | ||
| 2013 | + ndcr |= NDCR_PAGE_SZ; | ||
| 2014 | + else if (512 != flash_info->page_size) | ||
| 2015 | + return -EINVAL; | ||
| 2016 | + | ||
| 2017 | + if (16 == flash_info->flash_width) | ||
| 2018 | + ndcr |= NDCR_DWIDTH_M; | ||
| 2019 | + else if (8 != flash_info->flash_width) | ||
| 2020 | + return -EINVAL; | ||
| 2021 | + | ||
| 2022 | + if (16 == flash_info->dfc_width) | ||
| 2023 | + ndcr |= NDCR_DWIDTH_C; | ||
| 2024 | + else if (8 != flash_info->dfc_width) | ||
| 2025 | + return -EINVAL; | ||
| 2026 | + | ||
| 2027 | + dfc_write(context, DFC_NDCR, ndcr); | ||
| 2028 | + | ||
| 2029 | + dfc_set_dma(context); | ||
| 2030 | + dfc_set_ecc(context); | ||
| 2031 | + dfc_set_spare(context); | ||
| 2032 | + | ||
| 2033 | + return 0; | ||
| 2034 | +} | ||
| 2035 | + | ||
| 2036 | +/****************************************************************************** | ||
| 2037 | + dfc_init_no_gpio | ||
| 2038 | + | ||
| 2039 | + Description: | ||
| 2040 | + This function does entire DFC initialization according to the NAND | ||
| 2041 | + flash type currently used with platform, including set flash timing, | ||
| 2042 | + set DFC mode, configuring specified flash parameters in DFC, clear | ||
| 2043 | + ECC logic and page count register. The only difference with dfc_init | ||
| 2044 | + is that it does not set MFP&GPIO, very useful in OS loader | ||
| 2045 | + Input Parameters: | ||
| 2046 | + context | ||
| 2047 | + Pointer to DFC context structure | ||
| 2048 | + Output Parameters: | ||
| 2049 | + None | ||
| 2050 | + Returns: | ||
| 2051 | + 0 | ||
| 2052 | + if MFPRs are set correctly | ||
| 2053 | + -EINVAL | ||
| 2054 | + if specified flash is not support by check bytes per page and pages | ||
| 2055 | + per block | ||
| 2056 | +******************************************************************************/ | ||
| 2057 | +int dfc_init_no_gpio(struct dfc_context* context, int type) | ||
| 2058 | +{ | ||
| 2059 | + struct dfc_flash_info * flash_info; | ||
| 2060 | + uint32_t ndcr = 0x00000FFF; /* disable all interrupts */ | ||
| 2061 | + int status; | ||
| 2062 | + | ||
| 2063 | + status = dfc_get_flash_info(type, &flash_info); | ||
| 2064 | + if (status) | ||
| 2065 | + return status; | ||
| 2066 | + context->flash_info = flash_info; | ||
| 2067 | + | ||
| 2068 | + dfc_set_timing(context, &context->flash_info->timing); | ||
| 2069 | + | ||
| 2070 | + if (flash_info->enable_arbiter) | ||
| 2071 | + ndcr |= NDCR_ND_ARB_EN; | ||
| 2072 | + | ||
| 2073 | + if (64 == flash_info->page_per_block) | ||
| 2074 | + ndcr |= NDCR_PG_PER_BLK; | ||
| 2075 | + else if (32 != flash_info->page_per_block) | ||
| 2076 | + return -EINVAL; | ||
| 2077 | + | ||
| 2078 | + if (flash_info->row_addr_start) | ||
| 2079 | + ndcr |= NDCR_RA_START; | ||
| 2080 | + | ||
| 2081 | + ndcr |= (flash_info->read_id_bytes)<<16; | ||
| 2082 | + | ||
| 2083 | + ndcr |= (flash_info->dfc_mode) << 21; | ||
| 2084 | + | ||
| 2085 | + if (flash_info->ncsx) | ||
| 2086 | + ndcr |= NDCR_NCSX; | ||
| 2087 | + | ||
| 2088 | + if (2048 == flash_info->page_size) | ||
| 2089 | + ndcr |= NDCR_PAGE_SZ; | ||
| 2090 | + else if (512 != flash_info->page_size) | ||
| 2091 | + return -EINVAL; | ||
| 2092 | + | ||
| 2093 | + if (16 == flash_info->flash_width) | ||
| 2094 | + ndcr |= NDCR_DWIDTH_M; | ||
| 2095 | + else if (8 != flash_info->flash_width) | ||
| 2096 | + return -EINVAL; | ||
| 2097 | + | ||
| 2098 | + if (16 == flash_info->dfc_width) | ||
| 2099 | + ndcr |= NDCR_DWIDTH_C; | ||
| 2100 | + else if (8 != flash_info->dfc_width) | ||
| 2101 | + return -EINVAL; | ||
| 2102 | + | ||
| 2103 | + dfc_write(context, DFC_NDCR, ndcr); | ||
| 2104 | + | ||
| 2105 | + dfc_set_dma(context); | ||
| 2106 | + dfc_set_ecc(context); | ||
| 2107 | + dfc_set_spare(context); | ||
| 2108 | + | ||
| 2109 | + return 0; | ||
| 2110 | +} | ||
| 2111 | + | ||
| 2112 | +/* | ||
| 2113 | + * This macro will be used in following NAND operation functions. | ||
| 2114 | + * It is used to clear command buffer to ensure cmd buffer is empty | ||
| 2115 | + * in case of operation is timeout | ||
| 2116 | + */ | ||
| 2117 | +#define ClearCMDBuf() do { \ | ||
| 2118 | + dfc_stop(context); \ | ||
| 2119 | + udelay(NAND_OTHER_TIMEOUT); \ | ||
| 2120 | + } while (0) | ||
| 2121 | + | ||
| 2122 | +/****************************************************************************** | ||
| 2123 | + dfc_reset_flash | ||
| 2124 | + | ||
| 2125 | + Description: | ||
| 2126 | + It reset the flash. The function can be called at any time when the | ||
| 2127 | + device is in Busy state during random read/program/erase mode and | ||
| 2128 | + reset operation will abort all these operations. After reset operation | ||
| 2129 | + the device is ready to wait for next command | ||
| 2130 | + Input Parameters: | ||
| 2131 | + context | ||
| 2132 | + Pointer to DFC context structure | ||
| 2133 | + Output Parameters: | ||
| 2134 | + None | ||
| 2135 | + Returns: | ||
| 2136 | + 0 | ||
| 2137 | + execution succeeds | ||
| 2138 | + -ETIME | ||
| 2139 | + if timeout | ||
| 2140 | +*******************************************************************************/ | ||
| 2141 | +int dfc_reset_flash(struct dfc_context *context) | ||
| 2142 | +{ | ||
| 2143 | + struct dfc_flash_info *flash_info = context->flash_info; | ||
| 2144 | + uint32_t event, event_out; | ||
| 2145 | + unsigned long timeo; | ||
| 2146 | + int status; | ||
| 2147 | + | ||
| 2148 | + /* Send command */ | ||
| 2149 | + dfc_send_cmd(context, (uint16_t)flash_info->reset, 0xFFFFFFFF, 0); | ||
| 2150 | + | ||
| 2151 | + event = (context->dfc_mode->chip_select)? \ | ||
| 2152 | + NDSR_CS1_CMDD : NDSR_CS0_CMDD; | ||
| 2153 | + | ||
| 2154 | + /* Wait for CMDDM(command done successfully) */ | ||
| 2155 | + status = dfc_wait_event(context, event, &event_out, | ||
| 2156 | + NAND_OTHER_TIMEOUT, 0); | ||
| 2157 | + | ||
| 2158 | + if (status) { | ||
| 2159 | + ClearCMDBuf(); | ||
| 2160 | + return status; | ||
| 2161 | + } | ||
| 2162 | + | ||
| 2163 | + | ||
| 2164 | + /* Wait until flash device is stable or timeout (10ms) */ | ||
| 2165 | + timeo = jiffies + HZ; | ||
| 2166 | + do { | ||
| 2167 | + if (monahans_df_dev_ready(context->mtd)) | ||
| 2168 | + break; | ||
| 2169 | + } while (time_before(jiffies, timeo)); | ||
| 2170 | + | ||
| 2171 | + return 0; | ||
| 2172 | +} | ||
| 2173 | + | ||
| 2174 | +int dfc_readid(struct dfc_context *context, uint32_t *id) | ||
| 2175 | +{ | ||
| 2176 | + struct dfc_flash_info *flash_info = context->flash_info; | ||
| 2177 | + uint32_t event_out; | ||
| 2178 | + int status; | ||
| 2179 | + char tmp[DFC_DATA_SIZE_ID]; | ||
| 2180 | + | ||
| 2181 | + /* Send command */ | ||
| 2182 | + status = dfc_send_cmd(context, (uint16_t)flash_info->read_id, | ||
| 2183 | + 0xFFFFFFFF, 0); | ||
| 2184 | + if (status) { | ||
| 2185 | + ClearCMDBuf(); | ||
| 2186 | + return status; | ||
| 2187 | + } | ||
| 2188 | + | ||
| 2189 | + /* Wait for CMDDM(command done successfully) */ | ||
| 2190 | + status = dfc_wait_event(context, NDSR_RDDREQ, &event_out, | ||
| 2191 | + NAND_OTHER_TIMEOUT, 0); | ||
| 2192 | + if (status) { | ||
| 2193 | + ClearCMDBuf(); | ||
| 2194 | + return status; | ||
| 2195 | + } | ||
| 2196 | + dfc_read_fifo_partial(context, (unsigned char *)tmp, | ||
| 2197 | + context->flash_info->read_id_bytes, DFC_DATA_SIZE_ID); | ||
| 2198 | + | ||
| 2199 | + *id = tmp[0] | (tmp[1] << 8); | ||
| 2200 | + return 0; | ||
| 2201 | +} | ||
| 2202 | + | ||
| 2203 | +#define ERR_NONE 0x0 | ||
| 2204 | +#define ERR_DMABUSERR (-0x01) | ||
| 2205 | +#define ERR_SENDCMD (-0x02) | ||
| 2206 | +#define ERR_DBERR (-0x03) | ||
| 2207 | +#define ERR_BBERR (-0x04) | ||
| 2208 | +#define ERR_BUSY (-0x05) | ||
| 2209 | + | ||
| 2210 | +#define STATE_CMD_SEND 0x1 | ||
| 2211 | +#define STATE_CMD_HANDLE 0x2 | ||
| 2212 | +#define STATE_DMA_TRANSFER 0x3 | ||
| 2213 | +#define STATE_DMA_DONE 0x4 | ||
| 2214 | +#define STATE_READY 0x5 | ||
| 2215 | +#define STATE_SUSPENDED 0x6 | ||
| 2216 | +#define STATE_DATA_TRANSFER 0x7 | ||
| 2217 | + | ||
| 2218 | +#define NAND_RELOC_MAX 127 | ||
| 2219 | +#define NAND_RELOC_HEADER 0x524e | ||
| 2220 | +#define MAX_CHIP 1 | ||
| 2221 | +#define NAND_CMD_DMA_LEN 12 | ||
| 2222 | + | ||
| 2223 | +#define MAX_TIM_SIZE 0x1000 | ||
| 2224 | +#define MAX_BBT_SLOTS 24 | ||
| 2225 | + | ||
| 2226 | +struct reloc_item { | ||
| 2227 | + unsigned short from; | ||
| 2228 | + unsigned short to; | ||
| 2229 | +}; | ||
| 2230 | + | ||
| 2231 | +struct reloc_table { | ||
| 2232 | + unsigned short header; | ||
| 2233 | + unsigned short total; | ||
| 2234 | + struct reloc_item reloc[NAND_RELOC_MAX]; | ||
| 2235 | +}; | ||
| 2236 | + | ||
| 2237 | +struct monahans_dfc_info { | ||
| 2238 | + unsigned int state; | ||
| 2239 | + struct dfc_context *context; | ||
| 2240 | +#ifdef CONFIG_MTD_NAND_MONAHANS_DMA | ||
| 2241 | + dma_addr_t data_buf_addr; | ||
| 2242 | + char *data_buf; | ||
| 2243 | + int data_dma; | ||
| 2244 | + struct pxa_dma_desc *data_desc; | ||
| 2245 | + dma_addr_t data_desc_addr; | ||
| 2246 | + dma_addr_t cmd_buf_addr; | ||
| 2247 | + char *cmd_buf; | ||
| 2248 | + int cmd_dma; | ||
| 2249 | + struct pxa_dma_desc *cmd_desc; | ||
| 2250 | + dma_addr_t cmd_desc_addr; | ||
| 2251 | + u64 dma_mask; | ||
| 2252 | +#else | ||
| 2253 | + char *data_buf; | ||
| 2254 | +#endif | ||
| 2255 | + u32 current_slot; | ||
| 2256 | + struct reloc_table table; | ||
| 2257 | + unsigned int table_init; | ||
| 2258 | + /* relate to the command */ | ||
| 2259 | + unsigned int cmd; | ||
| 2260 | + unsigned int addr; | ||
| 2261 | + unsigned int column; | ||
| 2262 | + int retcode; | ||
| 2263 | + unsigned int buf_count; | ||
| 2264 | + struct completion cmd_complete; | ||
| 2265 | +}; | ||
| 2266 | + | ||
| 2267 | +static struct dfc_mode dfc_mode = | ||
| 2268 | +{ | ||
| 2269 | +#ifdef CONFIG_MTD_NAND_MONAHANS_DMA | ||
| 2270 | + 1, /* enable DMA */ | ||
| 2271 | +#else | ||
| 2272 | + 0, | ||
| 2273 | +#endif | ||
| 2274 | + 1, /* enable ECC */ | ||
| 2275 | + 1, /* enable SPARE */ | ||
| 2276 | + 0, /* CS0 */ | ||
| 2277 | +}; | ||
| 2278 | + | ||
| 2279 | + | ||
| 2280 | +struct dfc_context dfc_context = | ||
| 2281 | +{ | ||
| 2282 | + 0, /* Initialized at function monahans_df_init() */ | ||
| 2283 | + &dfc_mode, | ||
| 2284 | + 0, /* data dma channel */ | ||
| 2285 | + 0, /* cmd dma channel */ | ||
| 2286 | + NULL, /* &zylonite_flashinfo */ | ||
| 2287 | +}; | ||
| 2288 | + | ||
| 2289 | + | ||
| 2290 | +/* | ||
| 2291 | + * MTD structure for Zylonite board | ||
| 2292 | + */ | ||
| 2293 | +static struct mtd_info *monahans_mtd = NULL; | ||
| 2294 | + | ||
| 2295 | +/* | ||
| 2296 | + * BootRom and XDB will use last 127 block, and they will keep all the status | ||
| 2297 | + * of the bootloader and image, so skip the first 2M size and last 2M size | ||
| 2298 | + */ | ||
| 2299 | +static struct mtd_partition partition_info[] = { | ||
| 2300 | + { | ||
| 2301 | + name: "Bootloader", | ||
| 2302 | +//#ifdef CONFIG_CPU_MONAHANS_LV | ||
| 2303 | + size: 0x00060000, | ||
| 2304 | +//#else | ||
| 2305 | +// size: 0x00040000, | ||
| 2306 | +//#endif | ||
| 2307 | + offset: 0, | ||
| 2308 | + mask_flags: MTD_WRITEABLE /* force read-only */ | ||
| 2309 | + },{ | ||
| 2310 | + name: "Kernel", | ||
| 2311 | + size: 0x00200000, | ||
| 2312 | +//#ifdef CONFIG_CPU_MONAHANS_LV | ||
| 2313 | + offset: 0x00060000, | ||
| 2314 | +//#else | ||
| 2315 | +// offset: 0x00040000, | ||
| 2316 | +//#endif | ||
| 2317 | + mask_flags: MTD_WRITEABLE /* force read-only */ | ||
| 2318 | + },{ | ||
| 2319 | + name: "Filesystem", | ||
| 2320 | + size: 0x05000000, | ||
| 2321 | +//#ifdef CONFIG_CPU_MONAHANS_LV | ||
| 2322 | + offset: 0x00260000, | ||
| 2323 | +//#else | ||
| 2324 | +// offset: 0x00240000, | ||
| 2325 | +//#endif | ||
| 2326 | + }, { | ||
| 2327 | + name: "MassStorage", | ||
| 2328 | + size: 0x0, /* It will be set at probe function */ | ||
| 2329 | + offset: MTDPART_OFS_APPEND /* Append after fs section */ | ||
| 2330 | + }, { | ||
| 2331 | + name: "BBT", | ||
| 2332 | + size: 0x0, /* It will be set at probe function */ | ||
| 2333 | + offset: MTDPART_OFS_APPEND,/* Append after fs section */ | ||
| 2334 | + mask_flags: MTD_WRITEABLE /* force read-only */ | ||
| 2335 | + } | ||
| 2336 | +}; | ||
| 2337 | + | ||
| 2338 | +#define PART_NUM ARRAY_SIZE(partition_info) | ||
| 2339 | + | ||
| 2340 | +/* MHN_OBM_V2 is related to BBT in MOBM V2 | ||
| 2341 | + * MHN_OBM_V3 is related to BBT in MOBM V3 | ||
| 2342 | + */ | ||
| 2343 | +enum { | ||
| 2344 | + MHN_OBM_NULL = 0, | ||
| 2345 | + MHN_OBM_V1, | ||
| 2346 | + MHN_OBM_V2, | ||
| 2347 | + MHN_OBM_V3, | ||
| 2348 | + MHN_OBM_INVAL | ||
| 2349 | +} MHN_OBM_TYPE; | ||
| 2350 | + | ||
| 2351 | +static uint8_t scan_ff_pattern[] = { 0xff, 0xff }; | ||
| 2352 | +static uint8_t scan_main_bbt_pattern[] = { 'p', 'x', 'a', '1' }; | ||
| 2353 | +static uint8_t scan_mirror_bbt_pattern[] = { '0', 'a', 'x', 'p' }; | ||
| 2354 | + | ||
| 2355 | +static struct nand_bbt_descr monahans_bbt_default = { | ||
| 2356 | + .options = NAND_BBT_LASTBLOCK | NAND_BBT_CREATE | NAND_BBT_WRITE | ||
| 2357 | + | NAND_BBT_2BIT | NAND_BBT_VERSION, | ||
| 2358 | + .maxblocks = 2, | ||
| 2359 | + .len = 2, | ||
| 2360 | + .offs = 0, | ||
| 2361 | + .pattern = scan_ff_pattern, | ||
| 2362 | +}; | ||
| 2363 | + | ||
| 2364 | +static struct nand_bbt_descr monahans_bbt_main = { | ||
| 2365 | + .options = NAND_BBT_LASTBLOCK | NAND_BBT_CREATE | NAND_BBT_WRITE | ||
| 2366 | + | NAND_BBT_2BIT | NAND_BBT_VERSION, | ||
| 2367 | + .veroffs = 6, | ||
| 2368 | + .maxblocks = 2, | ||
| 2369 | + .offs = 2, | ||
| 2370 | + .len = 4, | ||
| 2371 | + .pattern = scan_main_bbt_pattern, | ||
| 2372 | +}; | ||
| 2373 | + | ||
| 2374 | +static struct nand_bbt_descr monahans_bbt_mirror = { | ||
| 2375 | + .options = NAND_BBT_LASTBLOCK | NAND_BBT_CREATE | NAND_BBT_WRITE | ||
| 2376 | + | NAND_BBT_2BIT | NAND_BBT_VERSION, | ||
| 2377 | + .veroffs = 6, | ||
| 2378 | + .maxblocks = 2, | ||
| 2379 | + .offs = 2, | ||
| 2380 | + .len = 4, | ||
| 2381 | + .pattern = scan_mirror_bbt_pattern, | ||
| 2382 | +}; | ||
| 2383 | + | ||
| 2384 | +#if 0 | ||
| 2385 | +static struct nand_bbt_descr monahans_bbt_main = { | ||
| 2386 | + .options = NAND_BBT_LASTBLOCK | NAND_BBT_CREATE | NAND_BBT_WRITE | ||
| 2387 | + | NAND_BBT_2BIT | NAND_BBT_VERSION, | ||
| 2388 | + .veroffs = 2, | ||
| 2389 | + .maxblocks = 2, | ||
| 2390 | + .offs = 0x0, | ||
| 2391 | + .len = 2, | ||
| 2392 | + .pattern = scan_ff_pattern | ||
| 2393 | +}; | ||
| 2394 | +static struct nand_bbt_descr monahans_bbt_mirror = { | ||
| 2395 | + .options = NAND_BBT_LASTBLOCK | NAND_BBT_CREATE | NAND_BBT_WRITE | ||
| 2396 | + | NAND_BBT_2BIT | NAND_BBT_VERSION, | ||
| 2397 | + .veroffs = 2, | ||
| 2398 | + .maxblocks = 2, | ||
| 2399 | + .offs = 0x0, | ||
| 2400 | + .len = 2, | ||
| 2401 | + .pattern = scan_ff_pattern | ||
| 2402 | +}; | ||
| 2403 | +#endif | ||
| 2404 | + | ||
| 2405 | +static struct nand_ecclayout monahans_lb_nand_oob = { | ||
| 2406 | + .eccbytes = 24, | ||
| 2407 | + .eccpos = { | ||
| 2408 | + 40, 41, 42, 43, 44, 45, 46, 47, | ||
| 2409 | + 48, 49, 50, 51, 52, 53, 54, 55, | ||
| 2410 | + 56, 57, 58, 59, 60, 61, 62, 63}, | ||
| 2411 | + .oobfree = { {2, 38} } | ||
| 2412 | +}; | ||
| 2413 | + | ||
| 2414 | +/* | ||
| 2415 | + * Monahans OOB size is only 8 bytes, and the rest 8 bytes is controlled by | ||
| 2416 | + * hardware for ECC. We construct virutal ECC buffer. Acutally, ECC is 6 bytes | ||
| 2417 | + * and the remain 2 bytes are reserved. | ||
| 2418 | + */ | ||
| 2419 | +static struct nand_ecclayout monahans_sb_nand_oob = { | ||
| 2420 | + .eccbytes = 6, | ||
| 2421 | + .eccpos = {8, 9, 10, 11, 12, 13 }, | ||
| 2422 | + .oobfree = { {2, 6} } | ||
| 2423 | +}; | ||
| 2424 | + | ||
| 2425 | + | ||
| 2426 | +static inline int is_buf_blank(u8 * buf, int size) | ||
| 2427 | +{ | ||
| 2428 | + int i = 0; | ||
| 2429 | + while(i < size) { | ||
| 2430 | + if (*((unsigned long *)(buf + i)) != 0xFFFFFFFF) | ||
| 2431 | + return 0; | ||
| 2432 | + i += 4; | ||
| 2433 | + } | ||
| 2434 | + if (i > size) { | ||
| 2435 | + i -= 4; | ||
| 2436 | + while( i < size) { | ||
| 2437 | + if(*(buf + i) != 0xFF) | ||
| 2438 | + return 0; | ||
| 2439 | + i++; | ||
| 2440 | + } | ||
| 2441 | + } | ||
| 2442 | + return 1; | ||
| 2443 | +} | ||
| 2444 | + | ||
| 2445 | +static void print_buf(char *buf, int num) | ||
| 2446 | +{ | ||
| 2447 | + int i = 0; | ||
| 2448 | + | ||
| 2449 | + while (i < num) { | ||
| 2450 | + printk(KERN_ERR "0x%08x: %02x %02x %02x %02x %02x %02x %02x" | ||
| 2451 | + " %02x %02x %02x %02x %02x %02x %02x %02x %02x\n", | ||
| 2452 | + (unsigned int) (i), buf[i], buf[i+1], buf[i+2], | ||
| 2453 | + buf[i+3], buf[i+4], buf[i+5], buf[i+6], buf[i+7], | ||
| 2454 | + buf[i+8], buf[i+9], buf[i+10],buf[i+11], buf[i+12], | ||
| 2455 | + buf[i+13], buf[i+14], buf[i+15]); | ||
| 2456 | + i += 16; | ||
| 2457 | + } | ||
| 2458 | +} | ||
| 2459 | + | ||
| 2460 | +static int inline enable_dfc_dma(struct dfc_context *context, int enable) | ||
| 2461 | +{ | ||
| 2462 | + int ret = dfc_mode.enable_dma; | ||
| 2463 | + unsigned long ndcr; | ||
| 2464 | + | ||
| 2465 | + if (!enable) { | ||
| 2466 | + ndcr = dfc_read(context, DFC_NDCR); | ||
| 2467 | + ndcr &= ~NDCR_DMA_EN; | ||
| 2468 | + dfc_write(context, DFC_NDCR, ndcr); | ||
| 2469 | + dfc_mode.enable_dma = 0; | ||
| 2470 | + } else { | ||
| 2471 | + ndcr = dfc_read(context, DFC_NDCR); | ||
| 2472 | + ndcr |= NDCR_DMA_EN; | ||
| 2473 | + dfc_write(context, DFC_NDCR, ndcr); | ||
| 2474 | + dfc_mode.enable_dma = 1; | ||
| 2475 | + } | ||
| 2476 | + return ret; | ||
| 2477 | +} | ||
| 2478 | + | ||
| 2479 | + | ||
| 2480 | +static void inline dump_info(struct monahans_dfc_info *info) | ||
| 2481 | +{ | ||
| 2482 | + if (!info) | ||
| 2483 | + return; | ||
| 2484 | + | ||
| 2485 | + printk(KERN_ERR "cmd:0x%x; addr:0x%x; retcode:%d; state:%d \n", | ||
| 2486 | + info->cmd, info->addr, info->retcode, info->state); | ||
| 2487 | +} | ||
| 2488 | + | ||
| 2489 | +static void inline enable_hw_ecc(struct dfc_context* context, int enable) | ||
| 2490 | +{ | ||
| 2491 | + unsigned long ndcr; | ||
| 2492 | + | ||
| 2493 | + if (!enable) { | ||
| 2494 | + ndcr = dfc_read(context, DFC_NDCR); | ||
| 2495 | + ndcr &= ~NDCR_ECC_EN; | ||
| 2496 | + dfc_write(context, DFC_NDCR, ndcr); | ||
| 2497 | + dfc_mode.enable_ecc = 0; | ||
| 2498 | + } | ||
| 2499 | + else { | ||
| 2500 | + ndcr = dfc_read(context, DFC_NDCR); | ||
| 2501 | + ndcr |= NDCR_ECC_EN; | ||
| 2502 | + dfc_write(context, DFC_NDCR, ndcr); | ||
| 2503 | + dfc_mode.enable_ecc = 1; | ||
| 2504 | + } | ||
| 2505 | +} | ||
| 2506 | + | ||
| 2507 | +/* | ||
| 2508 | + * Now, we are not sure that the NDSR_RDY mean the flash is ready. | ||
| 2509 | + * Need more test. | ||
| 2510 | + */ | ||
| 2511 | +static int monahans_df_dev_ready(struct mtd_info *mtd) | ||
| 2512 | +{ | ||
| 2513 | + struct monahans_dfc_info *info = (struct monahans_dfc_info *) | ||
| 2514 | + (((struct nand_chip *)(mtd->priv))->priv); | ||
| 2515 | + | ||
| 2516 | + struct dfc_context* context = info->context; | ||
| 2517 | + | ||
| 2518 | + return ((dfc_read(context, DFC_NDSR) & NDSR_RDY)); | ||
| 2519 | +} | ||
| 2520 | + | ||
| 2521 | +/* each read, we can only read 4bytes from NDDB, we must buffer it */ | ||
| 2522 | +static u_char monahans_df_read_byte(struct mtd_info *mtd) | ||
| 2523 | +{ | ||
| 2524 | + char retval = 0xFF; | ||
| 2525 | + struct monahans_dfc_info *info = (struct monahans_dfc_info *) | ||
| 2526 | + (((struct nand_chip *)(mtd->priv))->priv); | ||
| 2527 | + | ||
| 2528 | + if (info->column < info->buf_count) { | ||
| 2529 | + /* Has just send a new command? */ | ||
| 2530 | + retval = info->data_buf[info->column++]; | ||
| 2531 | + } | ||
| 2532 | + return retval; | ||
| 2533 | +} | ||
| 2534 | + | ||
| 2535 | +static void monahans_df_write_byte(struct mtd_info *mtd, u8 byte) | ||
| 2536 | +{ | ||
| 2537 | + struct monahans_dfc_info *info = (struct monahans_dfc_info *) | ||
| 2538 | + (((struct nand_chip *)(mtd->priv))->priv); | ||
| 2539 | + info->data_buf[info->column++] = byte; | ||
| 2540 | +} | ||
| 2541 | + | ||
| 2542 | +static u16 monahans_df_read_word(struct mtd_info *mtd) | ||
| 2543 | +{ | ||
| 2544 | + u16 retval = 0xFFFF; | ||
| 2545 | + struct monahans_dfc_info *info = (struct monahans_dfc_info *) | ||
| 2546 | + (((struct nand_chip *)(mtd->priv))->priv); | ||
| 2547 | + | ||
| 2548 | + if (!(info->column & 0x01) && info->column < info->buf_count) { | ||
| 2549 | + retval = *((u16 *)(info->data_buf+info->column)); | ||
| 2550 | + info->column += 2; | ||
| 2551 | + } | ||
| 2552 | + return retval; | ||
| 2553 | +} | ||
| 2554 | + | ||
| 2555 | +static void monahans_df_write_word(struct mtd_info *mtd, u16 word) | ||
| 2556 | +{ | ||
| 2557 | + struct monahans_dfc_info *info = (struct monahans_dfc_info *) | ||
| 2558 | + (((struct nand_chip *)(mtd->priv))->priv); | ||
| 2559 | + | ||
| 2560 | + if (!(info->column & 0x01) && info->column < info->buf_count) { | ||
| 2561 | + *((u16 *)(info->data_buf+info->column)) = word; | ||
| 2562 | + info->column += 2; | ||
| 2563 | + } | ||
| 2564 | +} | ||
| 2565 | + | ||
| 2566 | +static void monahans_df_read_buf(struct mtd_info *mtd, u_char *buf, int len) | ||
| 2567 | +{ | ||
| 2568 | + struct monahans_dfc_info *info = (struct monahans_dfc_info *) | ||
| 2569 | + (((struct nand_chip *)(mtd->priv))->priv); | ||
| 2570 | + int real_len = min((unsigned int)len, info->buf_count - info->column); | ||
| 2571 | + | ||
| 2572 | + memcpy(buf, info->data_buf + info->column, real_len); | ||
| 2573 | + info->column += real_len; | ||
| 2574 | +} | ||
| 2575 | + | ||
| 2576 | +static void monahans_df_write_buf(struct mtd_info *mtd, | ||
| 2577 | + const u_char *buf, int len) | ||
| 2578 | +{ | ||
| 2579 | + struct monahans_dfc_info *info = (struct monahans_dfc_info *) | ||
| 2580 | + (((struct nand_chip *)(mtd->priv))->priv); | ||
| 2581 | + int real_len = min((unsigned int)len, info->buf_count - info->column); | ||
| 2582 | + | ||
| 2583 | + memcpy(info->data_buf + info->column, buf, real_len); | ||
| 2584 | + info->column += real_len; | ||
| 2585 | +} | ||
| 2586 | + | ||
| 2587 | +static int monahans_df_verify_buf(struct mtd_info *mtd, | ||
| 2588 | + const u_char *buf, int len) | ||
| 2589 | +{ | ||
| 2590 | + return 0; | ||
| 2591 | +} | ||
| 2592 | + | ||
| 2593 | +#ifdef CONFIG_MTD_NAND_MONAHANS_DMA | ||
| 2594 | +static void monahans_dfc_cmd_dma_irq(int channel, void *data, | ||
| 2595 | + struct pt_regs *regs) | ||
| 2596 | +{ | ||
| 2597 | + unsigned int dcsr; | ||
| 2598 | + struct monahans_dfc_info *info = (struct monahans_dfc_info *)data; | ||
| 2599 | + struct dfc_context* context = info->context; | ||
| 2600 | + struct dfc_mode* dfc_mode = context->dfc_mode; | ||
| 2601 | + unsigned int intm; | ||
| 2602 | + | ||
| 2603 | + dcsr = DCSR(channel); | ||
| 2604 | + DCSR(channel) = dcsr; | ||
| 2605 | + | ||
| 2606 | + intm = (dfc_mode->chip_select) ? \ | ||
| 2607 | + (NDSR_CS1_BBD | NDSR_CS1_CMDD) : (NDSR_CS0_BBD | NDSR_CS0_CMDD); | ||
| 2608 | + | ||
| 2609 | + D1(printk("cmd dma interrupt, channel:%d, DCSR:0x%08x\n", \ | ||
| 2610 | + channel, dcsr)); | ||
| 2611 | + | ||
| 2612 | + if (dcsr & DCSR_BUSERR) { | ||
| 2613 | + info->retcode = ERR_DMABUSERR; | ||
| 2614 | + complete(&info->cmd_complete); | ||
| 2615 | + } else { | ||
| 2616 | + if ((info->cmd == NAND_CMD_READ0) || | ||
| 2617 | + (info->cmd == NAND_CMD_READOOB)|| \ | ||
| 2618 | + (info->cmd == NAND_CMD_READID) || \ | ||
| 2619 | + (info->cmd == NAND_CMD_STATUS)) { | ||
| 2620 | + dfc_enable_int(context, NDSR_RDDREQ | NDSR_DBERR); | ||
| 2621 | + } else if (info->cmd == NAND_CMD_PAGEPROG) | ||
| 2622 | + dfc_enable_int(context, NDSR_WRDREQ); | ||
| 2623 | + else if (info->cmd == NAND_CMD_ERASE1) | ||
| 2624 | + dfc_enable_int(context, intm); | ||
| 2625 | + } | ||
| 2626 | + | ||
| 2627 | + return; | ||
| 2628 | +} | ||
| 2629 | + | ||
| 2630 | + | ||
| 2631 | +static void monahans_dfc_data_dma_irq(int channel, void *data, | ||
| 2632 | + struct pt_regs *regs) | ||
| 2633 | +{ | ||
| 2634 | + unsigned int dcsr, intm; | ||
| 2635 | + struct monahans_dfc_info *info = (struct monahans_dfc_info *)data; | ||
| 2636 | + struct dfc_context* context = info->context; | ||
| 2637 | + struct dfc_mode* dfc_mode = context->dfc_mode; | ||
| 2638 | + | ||
| 2639 | + dcsr = DCSR(channel); | ||
| 2640 | + DCSR(channel) = dcsr; | ||
| 2641 | + | ||
| 2642 | + intm = (dfc_mode->chip_select) ? \ | ||
| 2643 | + (NDSR_CS1_BBD | NDSR_CS1_CMDD) : (NDSR_CS0_BBD | NDSR_CS0_CMDD); | ||
| 2644 | + | ||
| 2645 | + D1(printk("data dma interrupt, channel:%d, DCSR:0x%08x\n", | ||
| 2646 | + channel, dcsr)); | ||
| 2647 | + if (dcsr & DCSR_BUSERR) { | ||
| 2648 | + info->retcode = ERR_DMABUSERR; | ||
| 2649 | + complete(&info->cmd_complete); | ||
| 2650 | + } | ||
| 2651 | + | ||
| 2652 | + if (info->cmd == NAND_CMD_PAGEPROG) { | ||
| 2653 | + /* DMA interrupt may be interrupted by other IRQs*/ | ||
| 2654 | + info->state = STATE_DMA_DONE; | ||
| 2655 | + dfc_enable_int(context, intm); | ||
| 2656 | + } else { | ||
| 2657 | + info->state = STATE_READY; | ||
| 2658 | + complete(&info->cmd_complete); | ||
| 2659 | + } | ||
| 2660 | + | ||
| 2661 | +} | ||
| 2662 | +#endif | ||
| 2663 | + | ||
| 2664 | +static irqreturn_t monahans_dfc_irq(int irq, void *devid) | ||
| 2665 | +{ | ||
| 2666 | + unsigned int status, event, intm, cmd; | ||
| 2667 | + struct monahans_dfc_info *info = (struct monahans_dfc_info *)devid; | ||
| 2668 | + struct dfc_context* context = info->context; | ||
| 2669 | + struct dfc_mode* dfc_mode = context->dfc_mode; | ||
| 2670 | + | ||
| 2671 | + intm = (dfc_mode->chip_select) ? \ | ||
| 2672 | + (NDSR_CS1_BBD | NDSR_CS1_CMDD) : (NDSR_CS0_BBD | NDSR_CS0_CMDD); | ||
| 2673 | + event = (dfc_mode->chip_select) ? \ | ||
| 2674 | + (NDSR_CS1_BBD | NDSR_CS1_CMDD) : (NDSR_CS0_BBD | NDSR_CS0_CMDD); | ||
| 2675 | + | ||
| 2676 | + status = dfc_read(context, DFC_NDSR); | ||
| 2677 | + D1(printk("DFC irq, NDSR:0x%x\n", status)); | ||
| 2678 | + if (status & (NDSR_RDDREQ | NDSR_DBERR)) { | ||
| 2679 | + if (status & NDSR_DBERR) { | ||
| 2680 | + info->retcode = ERR_DBERR; | ||
| 2681 | + } | ||
| 2682 | + | ||
| 2683 | + dfc_disable_int(context, NDSR_RDDREQ | NDSR_DBERR); | ||
| 2684 | + dfc_clear_int(context, NDSR_RDDREQ | NDSR_DBERR); | ||
| 2685 | + if (info->cmd == NAND_CMD_READID) | ||
| 2686 | + cmd = context->flash_info->read_id; | ||
| 2687 | + else if (info->cmd == NAND_CMD_STATUS) | ||
| 2688 | + cmd = context->flash_info->read_status; | ||
| 2689 | + else if (info->cmd == NAND_CMD_READ0 || | ||
| 2690 | + info->cmd == NAND_CMD_READOOB) | ||
| 2691 | + cmd = context->flash_info->read1; | ||
| 2692 | + else { | ||
| 2693 | + printk(KERN_ERR "No according command:0x%x happens\n", | ||
| 2694 | + info->cmd); | ||
| 2695 | + goto out; | ||
| 2696 | + } | ||
| 2697 | +#ifdef CONFIG_MTD_NAND_MONAHANS_DMA | ||
| 2698 | + info->state = STATE_DMA_TRANSFER; | ||
| 2699 | + dfc_start_data_dma(context, | ||
| 2700 | + (struct pxa_dma_desc*)info->data_desc_addr); | ||
| 2701 | +#else | ||
| 2702 | + info->state = STATE_DATA_TRANSFER; | ||
| 2703 | + complete(&info->cmd_complete); | ||
| 2704 | +#endif | ||
| 2705 | + } else if (status & NDSR_WRDREQ) { | ||
| 2706 | + dfc_disable_int(context, NDSR_WRDREQ); | ||
| 2707 | + dfc_clear_int(context, NDSR_WRDREQ); | ||
| 2708 | +#ifdef CONFIG_MTD_NAND_MONAHANS_DMA | ||
| 2709 | + info->state = STATE_DMA_TRANSFER; | ||
| 2710 | + dfc_start_data_dma(context, | ||
| 2711 | + (struct pxa_dma_desc*)info->data_desc_addr); | ||
| 2712 | +#else | ||
| 2713 | + info->state = STATE_DATA_TRANSFER; | ||
| 2714 | + complete(&info->cmd_complete); | ||
| 2715 | +#endif | ||
| 2716 | + } else if (status & event) { | ||
| 2717 | + if (status & NDSR_CS0_BBD) { | ||
| 2718 | + info->retcode = ERR_BBERR; | ||
| 2719 | + } | ||
| 2720 | + | ||
| 2721 | + dfc_disable_int(context, intm); | ||
| 2722 | + dfc_clear_int(context, event); | ||
| 2723 | + info->state = STATE_READY; | ||
| 2724 | + complete(&info->cmd_complete); | ||
| 2725 | + } | ||
| 2726 | +out: | ||
| 2727 | + return IRQ_HANDLED; | ||
| 2728 | +} | ||
| 2729 | + | ||
| 2730 | +static int dfc_send_command(struct mtd_info *mtd, unsigned int cmd, | ||
| 2731 | + unsigned int addr, unsigned int num_pages, | ||
| 2732 | + unsigned int event) | ||
| 2733 | +{ | ||
| 2734 | + | ||
| 2735 | + struct monahans_dfc_info *info = (struct monahans_dfc_info *) | ||
| 2736 | + (((struct nand_chip *)(mtd->priv))->priv); | ||
| 2737 | + struct dfc_context* context = info->context; | ||
| 2738 | + int status; | ||
| 2739 | + int ret; | ||
| 2740 | + | ||
| 2741 | + D1(printk("ready send command, cmd:0x%x, at address:0x%x," | ||
| 2742 | + " num_pages:%d, wait event:0x%x\n", cmd, addr, num_pages, event)); | ||
| 2743 | + | ||
| 2744 | + info->state = STATE_CMD_SEND; | ||
| 2745 | +#ifdef CONFIG_MTD_NAND_MONAHANS_DMA | ||
| 2746 | + status = dfc_setup_cmd_dma(context, cmd, addr, num_pages, | ||
| 2747 | + (uint32_t *)info->cmd_buf, info->cmd_buf_addr, | ||
| 2748 | + DDADR_STOP, DCMD_ENDIRQEN, info->cmd_desc); | ||
| 2749 | +#else | ||
| 2750 | + status = dfc_send_cmd(context, cmd, addr, num_pages); | ||
| 2751 | +#endif | ||
| 2752 | + if (status) { | ||
| 2753 | + info->retcode = ERR_SENDCMD; | ||
| 2754 | + dfc_stop(context); | ||
| 2755 | + udelay(20); | ||
| 2756 | + printk(KERN_ERR "fail send command\n"); | ||
| 2757 | + return info->retcode; | ||
| 2758 | + } | ||
| 2759 | + info->state = STATE_CMD_HANDLE; | ||
| 2760 | +#ifdef CONFIG_MTD_NAND_MONAHANS_DMA | ||
| 2761 | + dfc_setup_data_dma(context, cmd, info->data_buf_addr, | ||
| 2762 | + DDADR_STOP, DCMD_ENDIRQEN, info->data_desc); | ||
| 2763 | + dfc_start_cmd_dma(context, (struct pxa_dma_desc*)info->cmd_desc_addr); | ||
| 2764 | +#endif | ||
| 2765 | +#ifndef CONFIG_MTD_NAND_MONAHANS_DMA | ||
| 2766 | + dfc_enable_int(context, event); | ||
| 2767 | +#endif | ||
| 2768 | + ret = wait_for_completion_timeout(&info->cmd_complete, 2*HZ); | ||
| 2769 | + if (!ret){ | ||
| 2770 | + printk(KERN_ERR "Command time out\n"); | ||
| 2771 | + dump_info(info); | ||
| 2772 | + } | ||
| 2773 | + D1(printk("command return, cmd:0x%x, retcode:%d\n", | ||
| 2774 | + info->cmd, info->retcode)); | ||
| 2775 | + return 0; | ||
| 2776 | +} | ||
| 2777 | + | ||
| 2778 | +static void monahans_df_command(struct mtd_info *mtd, unsigned command, | ||
| 2779 | + int column, int page_addr ) | ||
| 2780 | +{ | ||
| 2781 | + struct nand_chip *this = (struct nand_chip *)(mtd->priv); | ||
| 2782 | + struct monahans_dfc_info *info = | ||
| 2783 | + (struct monahans_dfc_info *)(this->priv); | ||
| 2784 | + struct dfc_context *context = info->context; | ||
| 2785 | + struct dfc_flash_info * flash_info = context->flash_info; | ||
| 2786 | + int ret, pages_shift; | ||
| 2787 | + int status; | ||
| 2788 | +#ifndef CONFIG_MTD_NAND_MONAHANS_DMA | ||
| 2789 | + int datasize; | ||
| 2790 | + int paddingsize; | ||
| 2791 | +#endif | ||
| 2792 | + unsigned int to; | ||
| 2793 | + | ||
| 2794 | + D1(printk("command:0x%x at address:0x%x, column:0x%x\n", | ||
| 2795 | + command, page_addr, column)); | ||
| 2796 | + | ||
| 2797 | + if (info->state != STATE_READY) { | ||
| 2798 | + printk(KERN_ERR "CHIP is not ready.\n"); | ||
| 2799 | + dump_info(info); | ||
| 2800 | + info->retcode = ERR_BUSY; | ||
| 2801 | + return; | ||
| 2802 | + } | ||
| 2803 | + info->retcode = ERR_NONE; | ||
| 2804 | + pages_shift = this->phys_erase_shift - this->page_shift; | ||
| 2805 | + if (info->table_init) { | ||
| 2806 | + to = search_rel_block((page_addr >> pages_shift), mtd); | ||
| 2807 | + if (to) { | ||
| 2808 | + page_addr = (to << pages_shift) | (page_addr | ||
| 2809 | + & ((1 << pages_shift) - 1)); | ||
| 2810 | + } | ||
| 2811 | + } | ||
| 2812 | + | ||
| 2813 | + switch ( command ) { | ||
| 2814 | + case NAND_CMD_READOOB: | ||
| 2815 | + /* | ||
| 2816 | + * DFC has mark the last 8 bytes OOB data if HARDEARE_ECC is | ||
| 2817 | + * enabled. We must first disable the HARDWARE_ECC for getting | ||
| 2818 | + * all the 16 bytes OOB | ||
| 2819 | + */ | ||
| 2820 | + enable_hw_ecc(context, 0); | ||
| 2821 | + info->buf_count = mtd->writesize + mtd->oobsize; | ||
| 2822 | + info->column = mtd->writesize + column; | ||
| 2823 | + info->cmd = command; | ||
| 2824 | + info->addr = page_addr << this->page_shift; | ||
| 2825 | + ret = dfc_send_command(mtd, flash_info->read1, info->addr, | ||
| 2826 | + 1, NDSR_RDDREQ | NDSR_DBERR); | ||
| 2827 | +#ifndef CONFIG_MTD_NAND_MONAHANS_DMA | ||
| 2828 | + dfc_get_pattern(info->context, flash_info->read1, &datasize, | ||
| 2829 | + &paddingsize); | ||
| 2830 | + dfc_read_fifo_partial(info->context, info->data_buf, | ||
| 2831 | + min(info->buf_count, datasize), datasize); | ||
| 2832 | + info->state = STATE_READY; | ||
| 2833 | +#endif | ||
| 2834 | + /* We only are OOB, so if the data has error, does not matter */ | ||
| 2835 | + if (info->retcode == ERR_DBERR) | ||
| 2836 | + info->retcode = ERR_NONE; | ||
| 2837 | + enable_hw_ecc(context, 1); | ||
| 2838 | + break; | ||
| 2839 | + | ||
| 2840 | + case NAND_CMD_READ0: | ||
| 2841 | + enable_hw_ecc(context, 1); | ||
| 2842 | + info->column = column; | ||
| 2843 | + info->cmd = command; | ||
| 2844 | + info->buf_count = mtd->writesize + mtd->oobsize; | ||
| 2845 | + memset(info->data_buf, 0xFF, info->buf_count); | ||
| 2846 | + info->addr = page_addr << this->page_shift; | ||
| 2847 | + | ||
| 2848 | + ret = dfc_send_command(mtd, flash_info->read1, info->addr, | ||
| 2849 | + 1, NDSR_RDDREQ | NDSR_DBERR); | ||
| 2850 | +#ifndef CONFIG_MTD_NAND_MONAHANS_DMA | ||
| 2851 | + dfc_get_pattern(info->context, flash_info->read1, &datasize, | ||
| 2852 | + &paddingsize); | ||
| 2853 | + dfc_read_fifo_partial(info->context, info->data_buf, | ||
| 2854 | + min(info->buf_count, datasize), datasize); | ||
| 2855 | + info->state = STATE_READY; | ||
| 2856 | +#endif | ||
| 2857 | + /* When the data buf is blank, the DFC will report DB error */ | ||
| 2858 | + if (info->retcode == ERR_DBERR && is_buf_blank(info->data_buf, | ||
| 2859 | + mtd->writesize)) | ||
| 2860 | + info->retcode = ERR_NONE; | ||
| 2861 | + | ||
| 2862 | + if (info->retcode == ERR_DBERR) { | ||
| 2863 | + printk(KERN_ERR "DB error at address 0x%x\n", | ||
| 2864 | + info->addr); | ||
| 2865 | + print_buf(info->data_buf, info->buf_count); | ||
| 2866 | + } | ||
| 2867 | + break; | ||
| 2868 | + case NAND_CMD_SEQIN: | ||
| 2869 | + /* Write only OOB? */ | ||
| 2870 | + | ||
| 2871 | + info->cmd = command; | ||
| 2872 | + if (column >= mtd->writesize) { | ||
| 2873 | + info->buf_count = mtd->writesize + mtd->oobsize; | ||
| 2874 | + enable_hw_ecc(context, 0); | ||
| 2875 | + } else { | ||
| 2876 | + info->buf_count = mtd->writesize + mtd->oobsize; | ||
| 2877 | + enable_hw_ecc(context, 1); | ||
| 2878 | + } | ||
| 2879 | + memset(info->data_buf, 0xFF, mtd->writesize + mtd->oobsize); | ||
| 2880 | + info->column = column; | ||
| 2881 | + info->addr = page_addr << this->page_shift; | ||
| 2882 | + break; | ||
| 2883 | + case NAND_CMD_PAGEPROG: | ||
| 2884 | + /* prevois command is NAND_CMD_SEIN ?*/ | ||
| 2885 | + if (info->cmd != NAND_CMD_SEQIN) { | ||
| 2886 | + info->cmd = command; | ||
| 2887 | + info->retcode = ERR_SENDCMD; | ||
| 2888 | + printk(KERN_ERR "Monahans NAND device: " | ||
| 2889 | + "No NAND_CMD_SEQIN executed before.\n"); | ||
| 2890 | + enable_hw_ecc(context, 1); | ||
| 2891 | + break; | ||
| 2892 | + } | ||
| 2893 | + info->cmd = command; | ||
| 2894 | + ret = dfc_send_command(mtd, flash_info->program, info->addr, | ||
| 2895 | + 1, NDSR_WRDREQ); | ||
| 2896 | + | ||
| 2897 | +#ifndef CONFIG_MTD_NAND_MONAHANS_DMA | ||
| 2898 | + if (ret != 0) | ||
| 2899 | + break; | ||
| 2900 | + | ||
| 2901 | + dfc_get_pattern(info->context, flash_info->program, &datasize, | ||
| 2902 | + &paddingsize); | ||
| 2903 | + dfc_write_fifo_partial(info->context, info->data_buf, datasize, | ||
| 2904 | + datasize); | ||
| 2905 | + | ||
| 2906 | + if (info->context->dfc_mode->chip_select) | ||
| 2907 | + dfc_enable_int(info->context, | ||
| 2908 | + NDSR_CS1_BBD | NDSR_CS1_CMDD); | ||
| 2909 | + else | ||
| 2910 | + dfc_enable_int(info->context, | ||
| 2911 | + NDSR_CS0_BBD | NDSR_CS0_CMDD); | ||
| 2912 | + | ||
| 2913 | + ret = wait_for_completion_timeout(&info->cmd_complete, 2*HZ); | ||
| 2914 | + if (!ret){ | ||
| 2915 | + printk(KERN_ERR "Programm Command time out\n"); | ||
| 2916 | + dump_info(info); | ||
| 2917 | + } | ||
| 2918 | + | ||
| 2919 | + if (info->retcode == ERR_BBERR) { | ||
| 2920 | + mtd->block_markbad(mtd, info->addr); | ||
| 2921 | + } | ||
| 2922 | +#endif | ||
| 2923 | + break; | ||
| 2924 | + case NAND_CMD_ERASE1: | ||
| 2925 | + info->cmd = command; | ||
| 2926 | + info->addr = (page_addr >> pages_shift) << this->phys_erase_shift; | ||
| 2927 | + | ||
| 2928 | + if (info->context->dfc_mode->chip_select) | ||
| 2929 | + ret = dfc_send_command(mtd, flash_info->erase, | ||
| 2930 | + info->addr, 0, NDSR_CS1_BBD | NDSR_CS1_CMDD); | ||
| 2931 | + else | ||
| 2932 | + ret = dfc_send_command(mtd, flash_info->erase, | ||
| 2933 | + info->addr, 0, NDSR_CS0_BBD | NDSR_CS0_CMDD); | ||
| 2934 | + | ||
| 2935 | + if (info->retcode == ERR_BBERR) { | ||
| 2936 | + mtd->block_markbad(mtd, info->addr); | ||
| 2937 | + } | ||
| 2938 | + break; | ||
| 2939 | + case NAND_CMD_ERASE2: | ||
| 2940 | + break; | ||
| 2941 | + case NAND_CMD_READID: | ||
| 2942 | + info->cmd = command; | ||
| 2943 | + info->buf_count = flash_info->read_id_bytes; | ||
| 2944 | + info->column = 0; | ||
| 2945 | + info->addr = 0xFFFFFFFF; | ||
| 2946 | + ret = dfc_send_command(mtd, flash_info->read_id, info->addr, | ||
| 2947 | + 0, NDSR_RDDREQ); | ||
| 2948 | +#ifndef CONFIG_MTD_NAND_MONAHANS_DMA | ||
| 2949 | + dfc_get_pattern(info->context, flash_info->read_id, &datasize, | ||
| 2950 | + &paddingsize); | ||
| 2951 | + dfc_read_fifo_partial(info->context, info->data_buf, | ||
| 2952 | + info->buf_count, datasize); | ||
| 2953 | + info->state = STATE_READY; | ||
| 2954 | +#endif | ||
| 2955 | + D1(printk("ReadID, [1]:0x%x, [2]:0x%x\n", | ||
| 2956 | + info->data_buf[0], info->data_buf[1])); | ||
| 2957 | + break; | ||
| 2958 | + case NAND_CMD_STATUS: | ||
| 2959 | + info->cmd = command; | ||
| 2960 | + info->buf_count = 1; | ||
| 2961 | + info->column = 0; | ||
| 2962 | + info->addr = 0xFFFFFFFF; | ||
| 2963 | + ret = dfc_send_command(mtd, flash_info->read_status, | ||
| 2964 | + info->addr, 0, NDSR_RDDREQ); | ||
| 2965 | +#ifndef CONFIG_MTD_NAND_MONAHANS_DMA | ||
| 2966 | + dfc_get_pattern(info->context, flash_info->read_status, | ||
| 2967 | + &datasize, &paddingsize); | ||
| 2968 | + dfc_read_fifo_partial(info->context, info->data_buf, | ||
| 2969 | + info->buf_count, datasize); | ||
| 2970 | + info->state = STATE_READY; | ||
| 2971 | +#endif | ||
| 2972 | + break; | ||
| 2973 | + | ||
| 2974 | + case NAND_CMD_RESET: | ||
| 2975 | + status = dfc_reset_flash(&dfc_context); | ||
| 2976 | + if (status) { | ||
| 2977 | + printk(KERN_WARNING "Monahans NAND device:" | ||
| 2978 | + "NAND_CMD_RESET error\n"); | ||
| 2979 | + } | ||
| 2980 | + break; | ||
| 2981 | + default: | ||
| 2982 | + printk(KERN_WARNING "Monahans NAND device:" | ||
| 2983 | + "Non-support the command.\n"); | ||
| 2984 | + break; | ||
| 2985 | + } | ||
| 2986 | + | ||
| 2987 | + if (info->retcode != ERR_NONE) | ||
| 2988 | + dfc_stop(info->context); | ||
| 2989 | +} | ||
| 2990 | + | ||
| 2991 | +static void monahans_df_select_chip(struct mtd_info *mtd, int chip) | ||
| 2992 | +{ | ||
| 2993 | + struct monahans_dfc_info *info = (struct monahans_dfc_info *) | ||
| 2994 | + (((struct nand_chip *)(mtd->priv))->priv); | ||
| 2995 | + | ||
| 2996 | + if (chip <= MAX_CHIP) | ||
| 2997 | + info->context->dfc_mode->chip_select = chip; | ||
| 2998 | + else | ||
| 2999 | + printk(KERN_ERR "Monahans NAND device:" | ||
| 3000 | + "not select the NAND chips!\n"); | ||
| 3001 | +} | ||
| 3002 | + | ||
| 3003 | +static int monahans_df_waitfunc(struct mtd_info *mtd, | ||
| 3004 | + struct nand_chip *this) | ||
| 3005 | +{ | ||
| 3006 | + struct monahans_dfc_info *info = (struct monahans_dfc_info *) | ||
| 3007 | + (((struct nand_chip *)(mtd->priv))->priv); | ||
| 3008 | + | ||
| 3009 | + /* monahans_df_send_command has waited for command complete */ | ||
| 3010 | + if (this->state == FL_WRITING || this->state == FL_ERASING) { | ||
| 3011 | + if (info->retcode == ERR_NONE) | ||
| 3012 | + return 0; | ||
| 3013 | + else { | ||
| 3014 | + /* | ||
| 3015 | + * any error make it return 0x01 which will tell | ||
| 3016 | + * the caller the erase and write fail | ||
| 3017 | + */ | ||
| 3018 | + return 0x01; | ||
| 3019 | + } | ||
| 3020 | + } | ||
| 3021 | + | ||
| 3022 | + return 0; | ||
| 3023 | +} | ||
| 3024 | + | ||
| 3025 | +static int monahans_df_calculate_ecc(struct mtd_info *mtd, | ||
| 3026 | + const u_char *dat, u_char *ecc_code) | ||
| 3027 | +{ | ||
| 3028 | + return 0; | ||
| 3029 | +} | ||
| 3030 | + | ||
| 3031 | +static int monahans_df_correct_data(struct mtd_info *mtd, | ||
| 3032 | + u_char *dat, u_char *read_ecc, u_char *calc_ecc) | ||
| 3033 | +{ | ||
| 3034 | + struct monahans_dfc_info *info = (struct monahans_dfc_info *) | ||
| 3035 | + (((struct nand_chip *)(mtd->priv))->priv); | ||
| 3036 | + | ||
| 3037 | + /* | ||
| 3038 | + * Any error include ERR_SEND_CMD, ERR_DBERR, ERR_BUSERR, we | ||
| 3039 | + * consider it as a ecc error which will tell the caller the | ||
| 3040 | + * read fail We have distinguish all the errors, but the | ||
| 3041 | + * nand_read_ecc only check this function return value | ||
| 3042 | + */ | ||
| 3043 | + if (info->retcode != ERR_NONE) | ||
| 3044 | + return -1; | ||
| 3045 | + | ||
| 3046 | + return 0; | ||
| 3047 | +} | ||
| 3048 | + | ||
| 3049 | +static void monahans_df_enable_hwecc(struct mtd_info *mtd, int mode) | ||
| 3050 | +{ | ||
| 3051 | + return; | ||
| 3052 | +} | ||
| 3053 | + | ||
| 3054 | +/* | ||
| 3055 | + * The relocation table management is different between MOBM V2 and V3. | ||
| 3056 | + * | ||
| 3057 | + * MOBM V2 is applied on chips taped out before MhnLV A0. | ||
| 3058 | + * MOBM V3 is applied on chips taped out after MhnLV A0. It's also applied | ||
| 3059 | + * on MhnLV A0. | ||
| 3060 | + */ | ||
| 3061 | +static int calc_obm_ver(void) | ||
| 3062 | +{ | ||
| 3063 | + unsigned int cpuid; | ||
| 3064 | + /* read CPU ID */ | ||
| 3065 | + __asm__ ( | ||
| 3066 | + "mrc p15, 0, %0, c0, c0, 0\n" | ||
| 3067 | + : "=r" (cpuid) | ||
| 3068 | + ); | ||
| 3069 | + /* It's not xscale chip. */ | ||
| 3070 | + if ((cpuid & 0xFFFF0000) != 0x69050000) | ||
| 3071 | + return MHN_OBM_INVAL; | ||
| 3072 | + /* It's MhnP Ax */ | ||
| 3073 | + if ((cpuid & 0x0000FFF0) == 0x00006420) | ||
| 3074 | + return MHN_OBM_V2; | ||
| 3075 | + /* It's MhnP Bx */ | ||
| 3076 | + if ((cpuid & 0x0000FFF0) == 0x00006820) { | ||
| 3077 | + if ((cpuid & 0x0F) <= 5) | ||
| 3078 | + return MHN_OBM_V2; | ||
| 3079 | + else | ||
| 3080 | + return MHN_OBM_V3; | ||
| 3081 | + } | ||
| 3082 | + /* It's MhnL Ax */ | ||
| 3083 | + if ((cpuid & 0x0000FFF0) == 0x00006880) { | ||
| 3084 | + if ((cpuid & 0x0F) == 0) | ||
| 3085 | + return MHN_OBM_V2; | ||
| 3086 | + else | ||
| 3087 | + return MHN_OBM_V3; | ||
| 3088 | + } | ||
| 3089 | + /* It's MhnLV Ax */ | ||
| 3090 | + if ((cpuid & 0x0000FFF0) == 0x00006890) | ||
| 3091 | + return MHN_OBM_V3; | ||
| 3092 | + return MHN_OBM_INVAL; | ||
| 3093 | +} | ||
| 3094 | + | ||
| 3095 | + | ||
| 3096 | +/* | ||
| 3097 | + * MOBM maintains a relocation table. It's used to replace bad blocks. | ||
| 3098 | + * If block A is bad, it will use block B instead. | ||
| 3099 | + * There're 127 relocated blocks. All of them reside in the bottom of NAND | ||
| 3100 | + * flash. So they're reserved and can't be calculated in mtd size and chip | ||
| 3101 | + * size. | ||
| 3102 | + */ | ||
| 3103 | +static int read_reloc_table(struct mtd_info *mtd) | ||
| 3104 | +{ | ||
| 3105 | + struct nand_chip *this = NULL; | ||
| 3106 | + struct monahans_dfc_info *info = NULL; | ||
| 3107 | + struct dfc_context *context = NULL; | ||
| 3108 | + struct reloc_table *table = NULL; | ||
| 3109 | + int page, maxslot; | ||
| 3110 | + int obm, valid; | ||
| 3111 | + | ||
| 3112 | + obm = calc_obm_ver(); | ||
| 3113 | + this = (struct nand_chip *)(mtd->priv); | ||
| 3114 | + info = (struct monahans_dfc_info *)(this->priv); | ||
| 3115 | + context = info->context; | ||
| 3116 | + | ||
| 3117 | + mtd->size -= (NAND_RELOC_MAX * mtd->erasesize); | ||
| 3118 | + this->chipsize -= (NAND_RELOC_MAX << this->phys_erase_shift); | ||
| 3119 | + page = (1 << (this->phys_erase_shift - this->page_shift)) - 1; | ||
| 3120 | + | ||
| 3121 | + this->select_chip(mtd, 0); | ||
| 3122 | + valid = 0; | ||
| 3123 | + if (obm == MHN_OBM_V2) { | ||
| 3124 | + /* On MOBM V2, the relocation table resides in the last page | ||
| 3125 | + * of the first block. | ||
| 3126 | + */ | ||
| 3127 | + memset(info->data_buf, 0, BUFLEN); | ||
| 3128 | + monahans_df_command(mtd, NAND_CMD_READ0, 0, page); | ||
| 3129 | + memcpy(((unsigned char *)&(info->table)), info->data_buf, | ||
| 3130 | + sizeof(struct reloc_table)); | ||
| 3131 | + if (info->table.header == NAND_RELOC_HEADER) | ||
| 3132 | + valid = 1; | ||
| 3133 | + } else if (obm == MHN_OBM_V3) { | ||
| 3134 | + /* On MOBM V3, there're several relocation tables in the first | ||
| 3135 | + * block. | ||
| 3136 | + * When new bad blocks are found, a new relocation table will | ||
| 3137 | + * be generated and written back to the first block. But the | ||
| 3138 | + * original relocation table won't be erased. Even if the new | ||
| 3139 | + * relocation table is written wrong, system can still find an | ||
| 3140 | + * old one. | ||
| 3141 | + * One page contains one slot. | ||
| 3142 | + */ | ||
| 3143 | + maxslot = 1 << (this->phys_erase_shift - this->page_shift); | ||
| 3144 | + page = maxslot - MAX_BBT_SLOTS; | ||
| 3145 | + for (; page < maxslot; page++) { | ||
| 3146 | + monahans_df_command(mtd, NAND_CMD_READ0, 0, page); | ||
| 3147 | + table = (struct reloc_table *)info->data_buf; | ||
| 3148 | + if (info->retcode == ERR_NONE) { | ||
| 3149 | + if (table->header != NAND_RELOC_HEADER) { | ||
| 3150 | + continue; | ||
| 3151 | + } else { | ||
| 3152 | + memcpy(((unsigned char *)&(info->table)), | ||
| 3153 | + table, sizeof(struct reloc_table)); | ||
| 3154 | + valid = 1; | ||
| 3155 | + break; | ||
| 3156 | + } | ||
| 3157 | + } | ||
| 3158 | + } | ||
| 3159 | + | ||
| 3160 | + } else { | ||
| 3161 | + printk(KERN_ERR "The version of MOBM isn't supported\n"); | ||
| 3162 | + } | ||
| 3163 | + if (valid) { | ||
| 3164 | + memcpy(((unsigned char *)&(info->table)), info->data_buf, | ||
| 3165 | + sizeof(struct reloc_table)); | ||
| 3166 | + printk(KERN_DEBUG "relocation table at page:%d\n", page); | ||
| 3167 | + PRINT_BUF((unsigned char *)&(info->table), | ||
| 3168 | + sizeof(struct reloc_table)); | ||
| 3169 | + info->table_init = 1; | ||
| 3170 | + } else { | ||
| 3171 | + /* There should be a valid relocation table slot at least. */ | ||
| 3172 | + printk(KERN_ERR "NO VALID relocation table can be \ | ||
| 3173 | + recognized\n"); | ||
| 3174 | + printk(KERN_ERR "CAUTION: It may cause unpredicated error\n"); | ||
| 3175 | + printk(KERN_ERR "Please re-initialize the NAND flash.\n"); | ||
| 3176 | + memset((unsigned char *)&(info->table), 0, | ||
| 3177 | + sizeof(struct reloc_table)); | ||
| 3178 | + info->table_init = 0; | ||
| 3179 | + return -EINVAL; | ||
| 3180 | + } | ||
| 3181 | + return 0; | ||
| 3182 | +} | ||
| 3183 | + | ||
| 3184 | +/* add the relocation entry into the relocation table | ||
| 3185 | + * It's valid on MOBM V3. | ||
| 3186 | + * If the relocated block is bad, an new entry will be added into the | ||
| 3187 | + * bottom of the relocation table. | ||
| 3188 | + */ | ||
| 3189 | +static int update_rel_table(struct mtd_info *mtd, int block) | ||
| 3190 | +{ | ||
| 3191 | + struct nand_chip *this = NULL; | ||
| 3192 | + struct monahans_dfc_info *info = NULL; | ||
| 3193 | + struct reloc_table *table = NULL; | ||
| 3194 | + int obm, reloc_block; | ||
| 3195 | + | ||
| 3196 | + this = (struct nand_chip *)(mtd->priv); | ||
| 3197 | + info = (struct monahans_dfc_info *)(this->priv); | ||
| 3198 | + obm = calc_obm_ver(); | ||
| 3199 | + if (obm == MHN_OBM_V3) { | ||
| 3200 | + table = &info->table; | ||
| 3201 | + if (info->table_init == 0) { | ||
| 3202 | + printk(KERN_ERR "Error: the initial relocation \ | ||
| 3203 | + table can't be read\n"); | ||
| 3204 | + memset(table, 0, sizeof(struct reloc_table)); | ||
| 3205 | + table->header = NAND_RELOC_HEADER; | ||
| 3206 | + info->table_init = 1; | ||
| 3207 | + } | ||
| 3208 | + if (table->total == 0) { | ||
| 3209 | + /* Point to the first relocated block. | ||
| 3210 | + * It resides in the last block of flash. | ||
| 3211 | + * the relocation entry has calculated in | ||
| 3212 | + * chipsize | ||
| 3213 | + */ | ||
| 3214 | + reloc_block = (this->chipsize | ||
| 3215 | + >> this->phys_erase_shift) | ||
| 3216 | + + NAND_RELOC_MAX - 1; | ||
| 3217 | + } else if (table->total < NAND_RELOC_MAX) { | ||
| 3218 | + reloc_block = table->reloc[table->total - 1].to - 1; | ||
| 3219 | + } else { | ||
| 3220 | + printk(KERN_ERR "Relocation table exceed max number, \ | ||
| 3221 | + cannot mark block 0x%x as bad block\n", block); | ||
| 3222 | + return -ENOSPC; | ||
| 3223 | + } | ||
| 3224 | + /* Make sure that reloc_block is pointing to a valid block */ | ||
| 3225 | + for (; ; reloc_block--) { | ||
| 3226 | + /* The relocate table is full */ | ||
| 3227 | + if (reloc_block < (this->chipsize | ||
| 3228 | + >> this->phys_erase_shift)) | ||
| 3229 | + return -ENOSPC; | ||
| 3230 | + this->cmdfunc(mtd, NAND_CMD_ERASE1, 0, reloc_block | ||
| 3231 | + << (this->phys_erase_shift | ||
| 3232 | + - this->page_shift)); | ||
| 3233 | + if (info->retcode == ERR_NONE) | ||
| 3234 | + break; | ||
| 3235 | + } | ||
| 3236 | + /* Create the relocated block information in the table */ | ||
| 3237 | + table->reloc[table->total].from = block; | ||
| 3238 | + table->reloc[table->total].to = reloc_block; | ||
| 3239 | + table->total++; | ||
| 3240 | + } | ||
| 3241 | + return 0; | ||
| 3242 | +} | ||
| 3243 | + | ||
| 3244 | +/* Write the relocation table back to device, if there's room. */ | ||
| 3245 | +static int sync_rel_table(struct mtd_info *mtd, int *idx) | ||
| 3246 | +{ | ||
| 3247 | + struct nand_chip *this = NULL; | ||
| 3248 | + struct monahans_dfc_info *info = NULL; | ||
| 3249 | + int obm, start_page, len; | ||
| 3250 | + | ||
| 3251 | + if (*idx >= MAX_BBT_SLOTS) { | ||
| 3252 | + printk(KERN_ERR "Can't write relocation table to device \ | ||
| 3253 | + any more.\n"); | ||
| 3254 | + return -1; | ||
| 3255 | + } | ||
| 3256 | + if (*idx < 0) { | ||
| 3257 | + printk(KERN_ERR "Wrong Slot is specified.\n"); | ||
| 3258 | + return -1; | ||
| 3259 | + } | ||
| 3260 | + this = (struct nand_chip *)(mtd->priv); | ||
| 3261 | + info = (struct monahans_dfc_info *)(this->priv); | ||
| 3262 | + len = 4; | ||
| 3263 | + len += info->table.total << 2; | ||
| 3264 | + obm = calc_obm_ver(); | ||
| 3265 | + if (obm == MHN_OBM_V3) { | ||
| 3266 | + /* write to device */ | ||
| 3267 | + start_page = 1 << (this->phys_erase_shift - this->page_shift); | ||
| 3268 | + start_page = start_page - 1 - *idx; | ||
| 3269 | + memset(&(info->data_buf), 0xFF, BUFLEN); | ||
| 3270 | + memcpy(&(info->data_buf), &(info->table), len); | ||
| 3271 | + | ||
| 3272 | + printk(KERN_DEBUG "DUMP relocation table before write. \ | ||
| 3273 | + page:0x%x\n", start_page); | ||
| 3274 | + monahans_df_command(mtd, NAND_CMD_SEQIN, 0, start_page); | ||
| 3275 | + monahans_df_command(mtd, NAND_CMD_PAGEPROG, 0, start_page); | ||
| 3276 | + /* write to idx */ | ||
| 3277 | + (*idx)++; | ||
| 3278 | + /* dump it */ | ||
| 3279 | + memset(&(info->data_buf), 0, BUFLEN); | ||
| 3280 | + monahans_df_command(mtd, NAND_CMD_READOOB, 0, start_page); | ||
| 3281 | + PRINT_BUF(info->data_buf, len); | ||
| 3282 | + } | ||
| 3283 | + return 0; | ||
| 3284 | +} | ||
| 3285 | + | ||
| 3286 | + | ||
| 3287 | +/* Find the relocated block of the bad one. | ||
| 3288 | + * If it's a good block, return 0. Otherwise, return a relocated one. | ||
| 3289 | + * idx points to the next relocation entry | ||
| 3290 | + * If the relocated block is bad, an new entry will be added into the | ||
| 3291 | + * bottom of the relocation table. | ||
| 3292 | + */ | ||
| 3293 | +static unsigned short search_rel_block(int block, struct mtd_info *mtd) | ||
| 3294 | +{ | ||
| 3295 | + struct nand_chip *this = NULL; | ||
| 3296 | + struct monahans_dfc_info *info = NULL; | ||
| 3297 | + struct reloc_table *table = NULL; | ||
| 3298 | + int i, max, reloc_block = 0; | ||
| 3299 | + | ||
| 3300 | + this = (struct nand_chip *)(mtd->priv); | ||
| 3301 | + info = (struct monahans_dfc_info *)(this->priv); | ||
| 3302 | + table = &(info->table); | ||
| 3303 | + if ((block <= 0) || (block > this->chipsize) | ||
| 3304 | + || (info->table_init == 0) || (table->total == 0)) | ||
| 3305 | + return 0; | ||
| 3306 | + if (table->total > NAND_RELOC_MAX) | ||
| 3307 | + table->total = NAND_RELOC_MAX; | ||
| 3308 | + max = table->total; | ||
| 3309 | + for (i = 0; i < max; i++) { | ||
| 3310 | + if (block == table->reloc[i].from) | ||
| 3311 | + reloc_block = table->reloc[i].to; | ||
| 3312 | + } | ||
| 3313 | + return reloc_block; | ||
| 3314 | +} | ||
| 3315 | + | ||
| 3316 | +/* | ||
| 3317 | + * Check whether the block is a bad one. | ||
| 3318 | + * At first, it will search the relocation table. | ||
| 3319 | + * If necessary, it will search the BBT. Because relocation table can only | ||
| 3320 | + * maintain limited record. If there're more bad blocks, they can't be | ||
| 3321 | + * recorded in relocation table. They can only be recorded in BBT. | ||
| 3322 | + */ | ||
| 3323 | +static int monahans_df_block_bad(struct mtd_info *mtd, loff_t ofs, int getchip) | ||
| 3324 | +{ | ||
| 3325 | + struct nand_chip *this = NULL; | ||
| 3326 | + int page, block, reloc_block, chipnr, res = 0; | ||
| 3327 | + u16 bad; | ||
| 3328 | + | ||
| 3329 | + /* At here, we only support one flash chip */ | ||
| 3330 | + this = (struct nand_chip *)mtd->priv; | ||
| 3331 | + block = (int)(ofs >> this->phys_erase_shift); | ||
| 3332 | + /* search the block in the relocation table */ | ||
| 3333 | + reloc_block = search_rel_block(block, mtd); | ||
| 3334 | + if (reloc_block) { | ||
| 3335 | + ofs = ((reloc_block << this->phys_erase_shift) | | ||
| 3336 | + (ofs & ((1 << this->phys_erase_shift) - 1))); | ||
| 3337 | + } | ||
| 3338 | + | ||
| 3339 | + /* search BBT | ||
| 3340 | + * Maybe the relocation table is full, but some bad blocks aren't | ||
| 3341 | + * recordered in it. | ||
| 3342 | + * The below code are copied from nand_block_bad(). | ||
| 3343 | + */ | ||
| 3344 | + if (getchip) { | ||
| 3345 | + page = (int)(ofs >> this->page_shift); | ||
| 3346 | + chipnr = (int)(ofs >> this->chip_shift); | ||
| 3347 | + | ||
| 3348 | + /* Select the NAND chips */ | ||
| 3349 | + this->select_chip(mtd, chipnr); | ||
| 3350 | + } else | ||
| 3351 | + page = (int)ofs; | ||
| 3352 | + | ||
| 3353 | + if (this->options & NAND_BUSWIDTH_16) { | ||
| 3354 | + this->cmdfunc(mtd, NAND_CMD_READOOB, this->badblockpos & 0xFE, | ||
| 3355 | + page & this->pagemask); | ||
| 3356 | + bad = cpu_to_le16(this->read_word(mtd)); | ||
| 3357 | + if (this->badblockpos & 0x1) | ||
| 3358 | + bad >>= 1; | ||
| 3359 | + if ((bad & 0xFF) != 0xFF) | ||
| 3360 | + res = 1; | ||
| 3361 | + } else { | ||
| 3362 | + this->cmdfunc(mtd, NAND_CMD_READOOB, this->badblockpos, | ||
| 3363 | + page & this->pagemask); | ||
| 3364 | + if (this->read_byte(mtd) != 0xFF) | ||
| 3365 | + res = 1; | ||
| 3366 | + } | ||
| 3367 | + | ||
| 3368 | + return res; | ||
| 3369 | +} | ||
| 3370 | + | ||
| 3371 | +static int monahans_df_block_markbad(struct mtd_info *mtd, loff_t ofs) | ||
| 3372 | +{ | ||
| 3373 | + struct nand_chip *this = NULL; | ||
| 3374 | + struct monahans_dfc_info *info = NULL; | ||
| 3375 | + unsigned char buf[2] = {0, 0}; | ||
| 3376 | + int block, reloc_block, page, ret; | ||
| 3377 | + | ||
| 3378 | + this = (struct nand_chip *)mtd->priv; | ||
| 3379 | + info = (struct monahans_dfc_info *)(this->priv); | ||
| 3380 | + /* Get block number */ | ||
| 3381 | + block = ((int)ofs) >> this->bbt_erase_shift; | ||
| 3382 | + ret = update_rel_table(mtd, block); | ||
| 3383 | + if (!ret) { | ||
| 3384 | + sync_rel_table(mtd, &(info->current_slot)); | ||
| 3385 | + return 0; | ||
| 3386 | + } else { | ||
| 3387 | + reloc_block = search_rel_block(block, mtd); | ||
| 3388 | + if (reloc_block) | ||
| 3389 | + block = reloc_block; | ||
| 3390 | + if (this->bbt) | ||
| 3391 | + this->bbt[block >> 2] |= 0x01 << ((block & 0x03) << 1); | ||
| 3392 | + } | ||
| 3393 | + | ||
| 3394 | + /* Do we have a flash based bad block table ? */ | ||
| 3395 | + if (this->options & NAND_USE_FLASH_BBT) | ||
| 3396 | + return nand_update_bbt(mtd, ofs); | ||
| 3397 | + | ||
| 3398 | + /* mark the bad block flag at the first two pages */ | ||
| 3399 | + page = block << (this->phys_erase_shift - this->page_shift); | ||
| 3400 | + ofs = mtd->writesize + this->badblockpos; | ||
| 3401 | + this->cmdfunc(mtd, NAND_CMD_SEQIN, ofs, page); | ||
| 3402 | + this->write_buf(mtd, buf, 2); | ||
| 3403 | + this->cmdfunc(mtd, NAND_CMD_PAGEPROG, -1, -1); | ||
| 3404 | + page++; | ||
| 3405 | + this->cmdfunc(mtd, NAND_CMD_SEQIN, ofs, page); | ||
| 3406 | + this->write_buf(mtd, buf, 2); | ||
| 3407 | + this->cmdfunc(mtd, NAND_CMD_PAGEPROG, -1, -1); | ||
| 3408 | + return 0; | ||
| 3409 | +} | ||
| 3410 | + | ||
| 3411 | +static int dump_bbt_flash(struct mtd_info *mtd) | ||
| 3412 | +{ | ||
| 3413 | + struct nand_chip *this = NULL; | ||
| 3414 | + struct monahans_dfc_info *info = NULL; | ||
| 3415 | + int block, page, totlen; | ||
| 3416 | + | ||
| 3417 | + this = (struct nand_chip *)mtd->priv; | ||
| 3418 | + info = (struct monahans_dfc_info *)this->priv; | ||
| 3419 | + block = (this->chipsize >> this->phys_erase_shift) - 1; | ||
| 3420 | + totlen = (this->chipsize >> this->phys_erase_shift) >> 2; | ||
| 3421 | + printk(KERN_ERR "totlen:0x%x\n", totlen); | ||
| 3422 | + this->select_chip(mtd, 0); | ||
| 3423 | + if (this->bbt_td) { | ||
| 3424 | + printk(KERN_ERR "BBT page:0x%x\n", this->bbt_td->pages[0]); | ||
| 3425 | + page = this->bbt_td->pages[0]; | ||
| 3426 | + if (this->bbt_td->pages[0] <= 0) { | ||
| 3427 | + page = block << (this->phys_erase_shift | ||
| 3428 | + - this->page_shift); | ||
| 3429 | + } | ||
| 3430 | + while (totlen > 0) { | ||
| 3431 | + printk(KERN_ERR "page:0x%x\n", page); | ||
| 3432 | + monahans_df_command(mtd, NAND_CMD_READ0, 0, page); | ||
| 3433 | + printk(KERN_ERR "read result:0x%x\n", info->retcode); | ||
| 3434 | + PRINT_BUF(info->data_buf, BUFLEN); | ||
| 3435 | + totlen -= (1 << this->page_shift); | ||
| 3436 | + page++; | ||
| 3437 | + } | ||
| 3438 | + } | ||
| 3439 | + if (this->bbt_md) { | ||
| 3440 | + printk(KERN_ERR "BBT page:0x%x\n", this->bbt_md->pages[0]); | ||
| 3441 | + page = this->bbt_md->pages[0]; | ||
| 3442 | + if (this->bbt_td->pages[0] <= 0) { | ||
| 3443 | + page = block << (this->phys_erase_shift | ||
| 3444 | + - this->page_shift); | ||
| 3445 | + } | ||
| 3446 | + while (totlen > 0) { | ||
| 3447 | + printk(KERN_ERR "page:0x%x\n", page); | ||
| 3448 | + monahans_df_command(mtd, NAND_CMD_READ0, 0, page); | ||
| 3449 | + printk(KERN_ERR "read result:0x%x\n", info->retcode); | ||
| 3450 | + PRINT_BUF(info->data_buf, BUFLEN); | ||
| 3451 | + totlen -= (1 << this->page_shift); | ||
| 3452 | + page++; | ||
| 3453 | + } | ||
| 3454 | + | ||
| 3455 | + } | ||
| 3456 | + return 0; | ||
| 3457 | +} | ||
| 3458 | + | ||
| 3459 | +static int dump_bbt_mem(struct mtd_info *mtd) | ||
| 3460 | +{ | ||
| 3461 | + struct nand_chip *this = NULL; | ||
| 3462 | + | ||
| 3463 | + this = (struct nand_chip *)mtd->priv; | ||
| 3464 | + PRINT_BUF(this->bbt, 225); | ||
| 3465 | + return 0; | ||
| 3466 | +} | ||
| 3467 | + | ||
| 3468 | +static int monahans_df_scan_bbt(struct mtd_info *mtd) | ||
| 3469 | +{ | ||
| 3470 | + struct nand_chip *this = NULL; | ||
| 3471 | + int ret; | ||
| 3472 | + | ||
| 3473 | + this = (struct nand_chip *)mtd->priv; | ||
| 3474 | + ret = read_reloc_table(mtd); | ||
| 3475 | + if (ret) { | ||
| 3476 | + printk(KERN_ERR "Failed to get relocation table\n"); | ||
| 3477 | + printk(KERN_ERR "Try to build a new BBT. It may result \ | ||
| 3478 | + unpredicated error.\n"); | ||
| 3479 | + /* Create new memory based and flash based BBT */ | ||
| 3480 | + } | ||
| 3481 | + nand_scan_bbt(mtd, &monahans_bbt_default); | ||
| 3482 | + //dump_bbt_flash(mtd); | ||
| 3483 | + dump_bbt_mem(mtd); | ||
| 3484 | + return 0; | ||
| 3485 | +#if 0 | ||
| 3486 | + /* Read flashed based BBT from device */ | ||
| 3487 | + return (nand_scan_bbt(mtd, &monahans_bbt_main)); | ||
| 3488 | +#endif | ||
| 3489 | +} | ||
| 3490 | + | ||
| 3491 | + | ||
| 3492 | +static int monahans_df_probe(struct platform_device *pdev) | ||
| 3493 | +{ | ||
| 3494 | + struct nand_chip *this; | ||
| 3495 | + struct monahans_dfc_info *info; | ||
| 3496 | + int status = -1; | ||
| 3497 | + unsigned int data_buf_len; | ||
| 3498 | +#ifdef CONFIG_MTD_NAND_MONAHANS_DMA | ||
| 3499 | + unsigned int buf_len; | ||
| 3500 | +#endif | ||
| 3501 | + int i, ret = 0; | ||
| 3502 | + | ||
| 3503 | + printk(KERN_ERR "Nand driver probe\n"); | ||
| 3504 | + | ||
| 3505 | + dfc_context.membase = ioremap_nocache(0x43100000, 0x100000); | ||
| 3506 | + if (!dfc_context.membase) | ||
| 3507 | + printk(KERN_ERR "Couldn't ioremap\n"); | ||
| 3508 | + | ||
| 3509 | + pxa_set_cken(CKEN_NAND, 1); | ||
| 3510 | + | ||
| 3511 | + for (i = DFC_FLASH_NULL + 1; i < DFC_FLASH_END; i++) | ||
| 3512 | + { | ||
| 3513 | + uint32_t id; | ||
| 3514 | + | ||
| 3515 | + status = dfc_init(&dfc_context, i); | ||
| 3516 | + if (status) | ||
| 3517 | + continue; | ||
| 3518 | + status = dfc_readid(&dfc_context, &id); | ||
| 3519 | + if (status) | ||
| 3520 | + continue; | ||
| 3521 | + printk(KERN_DEBUG "id:0x%x, chipid:0x%x\n", | ||
| 3522 | + id, dfc_context.flash_info->chip_id); | ||
| 3523 | + if (id == dfc_context.flash_info->chip_id) | ||
| 3524 | + break; | ||
| 3525 | + } | ||
| 3526 | + | ||
| 3527 | + if(i == DFC_FLASH_END) { | ||
| 3528 | + printk(KERN_ALERT "Monahans NAND device:" | ||
| 3529 | + "Nand Flash initialize failure!\n"); | ||
| 3530 | + ret = -ENXIO; | ||
| 3531 | + goto out; | ||
| 3532 | + } | ||
| 3533 | + flash_config = i; | ||
| 3534 | + | ||
| 3535 | + monahans_mtd = kzalloc(sizeof(struct mtd_info) + sizeof(struct nand_chip) + | ||
| 3536 | + sizeof(struct monahans_dfc_info) , GFP_KERNEL); | ||
| 3537 | + if (!monahans_mtd) { | ||
| 3538 | + printk (KERN_ERR "Monahans NAND device:" | ||
| 3539 | + "Unable to allocate NAND MTD device structure.\n"); | ||
| 3540 | + ret = -ENOMEM; | ||
| 3541 | + goto out; | ||
| 3542 | + } | ||
| 3543 | + | ||
| 3544 | + /* Get pointer to private data */ | ||
| 3545 | + this = (struct nand_chip *)((void *)monahans_mtd + sizeof(struct mtd_info)); | ||
| 3546 | + info = (struct monahans_dfc_info *)((void *)this + sizeof(struct nand_chip)); | ||
| 3547 | + dfc_context.mtd = monahans_mtd; | ||
| 3548 | + | ||
| 3549 | + monahans_mtd->priv = this; | ||
| 3550 | + this->priv = info; | ||
| 3551 | + data_buf_len = dfc_context.flash_info->page_size + | ||
| 3552 | + dfc_context.flash_info->oob_size; | ||
| 3553 | + info->state = STATE_READY; | ||
| 3554 | + init_completion(&info->cmd_complete); | ||
| 3555 | + info->table_init = 0; | ||
| 3556 | + memset(&info->table, 0x0, sizeof(struct reloc_table)); | ||
| 3557 | + printk(KERN_DEBUG "%s: this->controller: 0x%x, &this->controller: 0x%x\n",__func__, (unsigned int)this->controller, (unsigned int)&(this->controller)); | ||
| 3558 | +#ifdef CONFIG_MTD_NAND_MONAHANS_DMA | ||
| 3559 | + info->dma_mask = 0xffffffffUL; | ||
| 3560 | + | ||
| 3561 | + dev->dma_mask = &info->dma_mask; | ||
| 3562 | + dev->coherent_dma_mask = 0xffffffffUL; | ||
| 3563 | + | ||
| 3564 | + /* alloc dma data buffer for data | ||
| 3565 | + * buffer + 2*descriptor + command buffer | ||
| 3566 | + */ | ||
| 3567 | + buf_len = ALIGN(2*sizeof(struct pxa_dma_desc), 32) + | ||
| 3568 | + ALIGN(data_buf_len, 32) + ALIGN(NAND_CMD_DMA_LEN, 32); | ||
| 3569 | + | ||
| 3570 | + printk(KERN_INFO "Try to allocate dma buffer(len:%d)" | ||
| 3571 | + "for data buffer + 2*descriptor + command buffer\n", buf_len); | ||
| 3572 | + info->data_desc = (struct pxa_dma_desc*)dma_alloc_writecombine(dev, | ||
| 3573 | + buf_len, &info->data_desc_addr, GFP_KERNEL); | ||
| 3574 | + if (!info->data_desc) { | ||
| 3575 | + printk(KERN_ERR "Monahans NAND device:" | ||
| 3576 | + "Unable to alloc dma buffer\n"); | ||
| 3577 | + ret = -ENOMEM; | ||
| 3578 | + goto free_mtd; | ||
| 3579 | + } | ||
| 3580 | + | ||
| 3581 | + info->cmd_desc = (struct pxa_dma_desc*)((char *)info->data_desc + | ||
| 3582 | + sizeof(struct pxa_dma_desc)); | ||
| 3583 | + info->cmd_desc_addr = (dma_addr_t)((char *)info->data_desc_addr + | ||
| 3584 | + sizeof(struct pxa_dma_desc)); | ||
| 3585 | + info->data_buf = (char *)info->data_desc + | ||
| 3586 | + ALIGN(2*sizeof(struct pxa_dma_desc), 32); | ||
| 3587 | + info->data_buf_addr = (dma_addr_t)((char *)info->data_desc_addr + | ||
| 3588 | + ALIGN(2*sizeof(struct pxa_dma_desc), 32)); | ||
| 3589 | + info->cmd_buf = (char *)info->data_buf + ALIGN(data_buf_len, 32); | ||
| 3590 | + info->cmd_buf_addr = (dma_addr_t)((char *)info->data_buf_addr + | ||
| 3591 | + ALIGN(data_buf_len, 32)); | ||
| 3592 | + | ||
| 3593 | + D1(printk("Get dma buffer for data dma descriptor, virt:0x%x, phys0x:%x\n", | ||
| 3594 | + (unsigned int)info->data_desc, info->data_desc_addr)); | ||
| 3595 | + D1(printk("Get dma buffer for command dma descriptors, virt:0x%x," | ||
| 3596 | + "phys0x:%x\n", (unsigned int)info->cmd_desc, info->cmd_desc_addr)); | ||
| 3597 | + D1(printk("Get dma buffer for data, virt:0x%x, phys0x:%x\n", | ||
| 3598 | + (unsigned int)info->data_buf, info->data_buf_addr)); | ||
| 3599 | + D1(printk("Get dma buffer for command, virt:0x%x, phys0x:%x\n", | ||
| 3600 | + (unsigned int)info->cmd_buf, info->cmd_buf_addr)); | ||
| 3601 | + | ||
| 3602 | + D1(printk("Try to allocate dma channel for data\n")); | ||
| 3603 | + | ||
| 3604 | + info->data_dma = pxa_request_dma("NAND DATA", DMA_PRIO_LOW, | ||
| 3605 | + monahans_dfc_data_dma_irq, info); | ||
| 3606 | + if (info->data_dma < 0) { | ||
| 3607 | + printk(KERN_ERR "Monahans NAND device:" | ||
| 3608 | + "Unable to alloc dma channel for data\n"); | ||
| 3609 | + ret = info->data_dma; | ||
| 3610 | + goto free_buf; | ||
| 3611 | + } | ||
| 3612 | + D1(printk("Get dma channel:%d for data\n", info->data_dma)); | ||
| 3613 | + | ||
| 3614 | + D1(printk("Try to allocate dma channel for command\n")); | ||
| 3615 | + info->cmd_dma = pxa_request_dma("NAND CMD", DMA_PRIO_LOW, | ||
| 3616 | + monahans_dfc_cmd_dma_irq, info); | ||
| 3617 | + if (info->cmd_dma < 0) { | ||
| 3618 | + printk(KERN_ERR "Monahans NAND device:" | ||
| 3619 | + "Unable to alloc dma channel for command\n"); | ||
| 3620 | + ret = info->cmd_dma; | ||
| 3621 | + goto free_data_dma; | ||
| 3622 | + } | ||
| 3623 | + D1(printk("Get dma channel:%d for command\n", info->cmd_dma)); | ||
| 3624 | + | ||
| 3625 | + dfc_context.cmd_dma_ch = info->cmd_dma; | ||
| 3626 | + dfc_context.data_dma_ch = info->data_dma; | ||
| 3627 | +#else | ||
| 3628 | + printk(KERN_DEBUG "Try to allocate data buffer(len:%d)\n", data_buf_len); | ||
| 3629 | + info->data_buf = kmalloc(data_buf_len, GFP_KERNEL); | ||
| 3630 | + if (!info->data_buf) { | ||
| 3631 | + printk(KERN_ERR "Monahans NAND device:" | ||
| 3632 | + "Unable to alloc data buffer\n"); | ||
| 3633 | + ret = -ENOMEM; | ||
| 3634 | + goto free_mtd; | ||
| 3635 | + } | ||
| 3636 | +#endif | ||
| 3637 | + | ||
| 3638 | + D1(printk("Try to request irq:%d\n", IRQ_NAND)); | ||
| 3639 | + ret = request_irq(IRQ_NAND, monahans_dfc_irq, 0, pdev->name, info); | ||
| 3640 | + if (ret < 0) { | ||
| 3641 | + printk(KERN_ERR "Monahans NAND device: Unable to request irq\n"); | ||
| 3642 | +#ifdef CONFIG_MTD_NAND_MONAHANS_DMA | ||
| 3643 | + goto free_cmd_dma; | ||
| 3644 | +#else | ||
| 3645 | + goto free_buf; | ||
| 3646 | +#endif | ||
| 3647 | + } | ||
| 3648 | + | ||
| 3649 | + D1(printk("Success request irq\n")); | ||
| 3650 | + | ||
| 3651 | + /* set address of NAND IO lines */ | ||
| 3652 | + this->options = (dfc_context.flash_info->flash_width == 16)? \ | ||
| 3653 | + NAND_BUSWIDTH_16: 0 | NAND_USE_FLASH_BBT; | ||
| 3654 | + | ||
| 3655 | + /* this->IO_ADDR_R = this->IO_ADDR_W = NDDB */ | ||
| 3656 | + this->waitfunc = monahans_df_waitfunc; | ||
| 3657 | + this->select_chip = monahans_df_select_chip; | ||
| 3658 | + this->dev_ready = monahans_df_dev_ready; | ||
| 3659 | + this->cmdfunc = monahans_df_command; | ||
| 3660 | + this->read_word= monahans_df_read_word; | ||
| 3661 | + /*this->write_word= monahans_df_write_word;*/ | ||
| 3662 | + this->read_byte = monahans_df_read_byte; | ||
| 3663 | + this->read_buf = monahans_df_read_buf; | ||
| 3664 | + this->write_buf = monahans_df_write_buf; | ||
| 3665 | + this->verify_buf = monahans_df_verify_buf; | ||
| 3666 | + this->ecc.hwctl = monahans_df_enable_hwecc; | ||
| 3667 | + this->ecc.calculate = monahans_df_calculate_ecc; | ||
| 3668 | + this->ecc.correct = monahans_df_correct_data; | ||
| 3669 | + this->block_bad = monahans_df_block_bad; | ||
| 3670 | + this->block_markbad = monahans_df_block_markbad; | ||
| 3671 | + this->scan_bbt = monahans_df_scan_bbt; | ||
| 3672 | + this->chip_delay= 25; | ||
| 3673 | + this->bbt_td = &monahans_bbt_main; | ||
| 3674 | + this->bbt_md = &monahans_bbt_mirror; | ||
| 3675 | + | ||
| 3676 | + /* If the NAND flash is small block flash, only 512-byte pagesize | ||
| 3677 | + * is supported. | ||
| 3678 | + * Adjust parameters of BBT what is depended on large block nand | ||
| 3679 | + * flash or small block nand flash. | ||
| 3680 | + */ | ||
| 3681 | + if (dfc_context.flash_info->oob_size > 16) { | ||
| 3682 | + this->ecc.layout = &monahans_lb_nand_oob; | ||
| 3683 | + this->ecc.mode = NAND_ECC_HW; | ||
| 3684 | + this->ecc.size = 2048; | ||
| 3685 | + this->ecc.bytes = 24; | ||
| 3686 | + this->bbt_td->offs = 2; | ||
| 3687 | + this->bbt_td->veroffs = 6; | ||
| 3688 | + this->bbt_md->offs = 2; | ||
| 3689 | + this->bbt_md->veroffs = 6; | ||
| 3690 | + this->badblockpos = NAND_LARGE_BADBLOCK_POS; | ||
| 3691 | + monahans_bbt_default.offs = NAND_LARGE_BADBLOCK_POS; | ||
| 3692 | + monahans_bbt_default.len = 2; | ||
| 3693 | + /* when scan_bbt() is executed, bbt version can get */ | ||
| 3694 | + monahans_bbt_default.veroffs = 2; | ||
| 3695 | + } else { | ||
| 3696 | + this->ecc.layout = &monahans_sb_nand_oob; | ||
| 3697 | + this->ecc.mode = NAND_ECC_HW; | ||
| 3698 | + this->ecc.size = 512; | ||
| 3699 | + this->ecc.bytes = 6; | ||
| 3700 | + this->bbt_td->offs = 8; | ||
| 3701 | + this->bbt_td->veroffs = 12; | ||
| 3702 | + this->bbt_md->offs = 8; | ||
| 3703 | + this->bbt_md->veroffs = 12; | ||
| 3704 | + this->badblockpos = NAND_SMALL_BADBLOCK_POS; | ||
| 3705 | + monahans_bbt_default.offs = NAND_SMALL_BADBLOCK_POS; | ||
| 3706 | + monahans_bbt_default.len = 1; | ||
| 3707 | + monahans_bbt_default.veroffs = 8; | ||
| 3708 | + } | ||
| 3709 | + | ||
| 3710 | + info->context = &dfc_context; | ||
| 3711 | + /* TODO: allocate dma buffer and channel */ | ||
| 3712 | + | ||
| 3713 | + platform_set_drvdata(pdev, monahans_mtd); | ||
| 3714 | + | ||
| 3715 | + if (nand_scan(monahans_mtd, 1)) { | ||
| 3716 | + printk(KERN_ERR "Nand scan failed\n"); | ||
| 3717 | + ret = -ENXIO; | ||
| 3718 | + goto free_irq; | ||
| 3719 | + } | ||
| 3720 | + | ||
| 3721 | + /* There is a potential limitation that no more partition can be | ||
| 3722 | + * added between MassStorage and BBT(last block). | ||
| 3723 | + * | ||
| 3724 | + * The last 127 blocks is reserved for relocation table, they aren't | ||
| 3725 | + * statistical data of mtd size and chip size. | ||
| 3726 | + * | ||
| 3727 | + * BBT partitions contains 4 blocks. Two blocks are used to store | ||
| 3728 | + * main descriptor, the other two are used to store mirror descriptor. | ||
| 3729 | + */ | ||
| 3730 | + partition_info[PART_NUM - 1].size = (monahans_bbt_main.maxblocks | ||
| 3731 | + + monahans_bbt_mirror.maxblocks) | ||
| 3732 | + << this->phys_erase_shift; | ||
| 3733 | + partition_info[PART_NUM - 1].offset = this->chipsize | ||
| 3734 | + - partition_info[PART_NUM - 1].size; | ||
| 3735 | + partition_info[PART_NUM - 2].offset = partition_info[PART_NUM - 3].offset | ||
| 3736 | + + partition_info[PART_NUM - 3].size; | ||
| 3737 | + partition_info[PART_NUM - 2].size = this->chipsize | ||
| 3738 | + - partition_info[PART_NUM - 2].offset | ||
| 3739 | + - partition_info[PART_NUM - 1].size; | ||
| 3740 | + add_mtd_partitions(monahans_mtd, partition_info, PART_NUM); | ||
| 3741 | + | ||
| 3742 | +#ifdef CONFIG_DVFM | ||
| 3743 | + dvfm_notifier.client_data = info; | ||
| 3744 | + mhn_fv_register_notifier(&dvfm_notifier); | ||
| 3745 | +#endif | ||
| 3746 | + | ||
| 3747 | + return 0; | ||
| 3748 | + | ||
| 3749 | +free_irq: | ||
| 3750 | + free_irq(IRQ_NAND, info); | ||
| 3751 | +#ifdef CONFIG_MTD_NAND_MONAHANS_DMA | ||
| 3752 | +free_cmd_dma: | ||
| 3753 | + pxa_free_dma(info->cmd_dma); | ||
| 3754 | +free_data_dma: | ||
| 3755 | + pxa_free_dma(info->data_dma); | ||
| 3756 | +free_buf: | ||
| 3757 | + dma_free_writecombine(dev, buf_len, info->data_desc, info->data_desc_addr); | ||
| 3758 | +#else | ||
| 3759 | +free_buf: | ||
| 3760 | + kfree(info->data_buf); | ||
| 3761 | +#endif | ||
| 3762 | +free_mtd: | ||
| 3763 | + kfree(monahans_mtd); | ||
| 3764 | +out: | ||
| 3765 | + return ret; | ||
| 3766 | + | ||
| 3767 | +} | ||
| 3768 | + | ||
| 3769 | +static int __devexit monahans_df_remove(struct platform_device *dev) | ||
| 3770 | +{ | ||
| 3771 | + struct mtd_info *mtd = (struct mtd_info *)platform_get_drvdata(dev); | ||
| 3772 | + struct monahans_dfc_info *info = (struct monahans_dfc_info *) | ||
| 3773 | + (((struct nand_chip *)(mtd->priv))->priv); | ||
| 3774 | +#ifdef CONFIG_MTD_NAND_MONAHANS_DMA | ||
| 3775 | + unsigned int data_buf_len = dfc_context.flash_info->page_size + | ||
| 3776 | + dfc_context.flash_info->oob_size; | ||
| 3777 | + unsigned int buf_len = ALIGN(2*sizeof(struct pxa_dma_desc), 32) + | ||
| 3778 | + ALIGN(data_buf_len, 32) + ALIGN(NAND_CMD_DMA_LEN, 32); | ||
| 3779 | +#endif | ||
| 3780 | + | ||
| 3781 | +#ifdef CONFIG_DVFM | ||
| 3782 | + mhn_fv_unregister_notifier(&dvfm_notifier); | ||
| 3783 | +#endif | ||
| 3784 | + | ||
| 3785 | + platform_set_drvdata(dev, NULL); | ||
| 3786 | + | ||
| 3787 | + del_mtd_device(mtd); | ||
| 3788 | + del_mtd_partitions(mtd); | ||
| 3789 | + free_irq(IRQ_NAND, info); | ||
| 3790 | +#ifdef CONFIG_MTD_NAND_MONAHANS_DMA | ||
| 3791 | + pxa_free_dma(info->cmd_dma); | ||
| 3792 | + pxa_free_dma(info->data_dma); | ||
| 3793 | + dma_free_writecombine(dev, buf_len, info->data_desc, | ||
| 3794 | + info->data_desc_addr); | ||
| 3795 | +#else | ||
| 3796 | + kfree(info->data_buf); | ||
| 3797 | +#endif | ||
| 3798 | + kfree(mtd); | ||
| 3799 | + | ||
| 3800 | + return 0; | ||
| 3801 | +} | ||
| 3802 | + | ||
| 3803 | +#ifdef CONFIG_PM | ||
| 3804 | +static int monahans_df_suspend(struct platform_device *dev, pm_message_t state, u32 level) | ||
| 3805 | +{ | ||
| 3806 | + struct mtd_info *mtd = (struct mtd_info *)platform_get_drvdata(dev); | ||
| 3807 | + struct monahans_dfc_info *info = (struct monahans_dfc_info *) | ||
| 3808 | + (((struct nand_chip *)(mtd->priv))->priv); | ||
| 3809 | + | ||
| 3810 | + if( SUSPEND_DISABLE == level){ /*SUSPEND_NOTIFY*/ | ||
| 3811 | + if (info->state != STATE_READY) { | ||
| 3812 | + printk(KERN_ERR "current state is %d\n", info->state); | ||
| 3813 | + return -EAGAIN; | ||
| 3814 | + } | ||
| 3815 | + info->state = STATE_SUSPENDED; | ||
| 3816 | + /* | ||
| 3817 | + * The PM code need read the mobm from NAND. | ||
| 3818 | + * So the NAND clock can't be stop here. | ||
| 3819 | + * The PM code will cover this. | ||
| 3820 | + */ | ||
| 3821 | + /* pxa_set_cken(CKEN_NAND, 0); */ | ||
| 3822 | + } | ||
| 3823 | + return 0; | ||
| 3824 | +} | ||
| 3825 | + | ||
| 3826 | +static int monahans_df_resume(struct platform_device *dev, u32 level) | ||
| 3827 | +{ | ||
| 3828 | + struct mtd_info *mtd = (struct mtd_info *)platform_get_drvdata(dev); | ||
| 3829 | + struct monahans_dfc_info *info = (struct monahans_dfc_info *) | ||
| 3830 | + (((struct nand_chip *)(mtd->priv))->priv); | ||
| 3831 | + int status; | ||
| 3832 | + | ||
| 3833 | + if(RESUME_ENABLE == level){ | ||
| 3834 | + if (info->state != STATE_SUSPENDED) | ||
| 3835 | + printk(KERN_WARNING "Error State after resume back\n"); | ||
| 3836 | + | ||
| 3837 | + info->state = STATE_READY; | ||
| 3838 | + | ||
| 3839 | + pxa_set_cken(CKEN_NAND, 1); | ||
| 3840 | + | ||
| 3841 | + status = dfc_init(&dfc_context, flash_config); | ||
| 3842 | + if (status) { | ||
| 3843 | + printk(KERN_ALERT "Monahans NAND device:" | ||
| 3844 | + "Nand Flash initialize failure!\n"); | ||
| 3845 | + return -ENXIO; | ||
| 3846 | + } | ||
| 3847 | + } | ||
| 3848 | + return 0; | ||
| 3849 | +} | ||
| 3850 | +#endif | ||
| 3851 | + | ||
| 3852 | +#ifdef CONFIG_DVFM | ||
| 3853 | +static int mhn_nand_dvfm_notifier(unsigned cmd, void *client_data, void *info) | ||
| 3854 | +{ | ||
| 3855 | + struct monahans_dfc_info *dfc_info = | ||
| 3856 | + (struct monahans_dfc_info *)client_data; | ||
| 3857 | + | ||
| 3858 | + switch (cmd) { | ||
| 3859 | + case FV_NOTIFIER_QUERY_SET : | ||
| 3860 | + if (dfc_info->state != STATE_READY) | ||
| 3861 | + return -1; | ||
| 3862 | + break; | ||
| 3863 | + | ||
| 3864 | + case FV_NOTIFIER_PRE_SET : | ||
| 3865 | + break; | ||
| 3866 | + | ||
| 3867 | + case FV_NOTIFIER_POST_SET : | ||
| 3868 | + break; | ||
| 3869 | + } | ||
| 3870 | + | ||
| 3871 | + return 0; | ||
| 3872 | +} | ||
| 3873 | +#endif | ||
| 3874 | + | ||
| 3875 | +static struct platform_driver monahans_df_driver = { | ||
| 3876 | + .probe = monahans_df_probe, | ||
| 3877 | + .remove = __devexit_p(monahans_df_remove), | ||
| 3878 | +#ifdef CONFIG_PM | ||
| 3879 | + .suspend = monahans_df_suspend, | ||
| 3880 | + .resume = monahans_df_resume, | ||
| 3881 | +#endif | ||
| 3882 | + .driver = { | ||
| 3883 | + .name = "monahans-nand-flash", | ||
| 3884 | + } | ||
| 3885 | +}; | ||
| 3886 | + | ||
| 3887 | +static void __exit monahans_df_cleanup(void) | ||
| 3888 | +{ | ||
| 3889 | + printk(KERN_ERR "Nand driver registered\n"); | ||
| 3890 | + platform_driver_unregister(&monahans_df_driver); | ||
| 3891 | +} | ||
| 3892 | + | ||
| 3893 | +static int __init monahans_df_init(void) | ||
| 3894 | +{ | ||
| 3895 | + return platform_driver_register(&monahans_df_driver); | ||
| 3896 | +} | ||
| 3897 | + | ||
| 3898 | +module_init(monahans_df_init); | ||
| 3899 | +module_exit(monahans_df_cleanup); | ||
| 3900 | + | ||
| 3901 | +MODULE_LICENSE("GPL"); | ||
| 3902 | +MODULE_AUTHOR("Jingqing.xu (jingqing.xu@intel.com)"); | ||
| 3903 | +MODULE_DESCRIPTION("Glue logic layer for NAND flash on monahans DFC"); | ||
| 3904 | + | ||
| 3905 | + | ||
| 3906 | Index: linux-2.6.23/arch/arm/mach-pxa/zylonite.c | ||
| 3907 | =================================================================== | ||
| 3908 | --- linux-2.6.23.orig/arch/arm/mach-pxa/zylonite.c 2008-02-13 00:59:45.000000000 +0000 | ||
| 3909 | +++ linux-2.6.23/arch/arm/mach-pxa/zylonite.c 2008-02-13 09:11:02.000000000 +0000 | ||
| 3910 | @@ -29,6 +29,8 @@ | ||
| 3911 | #include "generic.h" | ||
| 3912 | |||
| 3913 | int gpio_backlight; | ||
| 3914 | +int gpio_vsync; | ||
| 3915 | +int gpio_vsync1; | ||
| 3916 | int gpio_eth_irq; | ||
| 3917 | |||
| 3918 | int lcd_id; | ||
| 3919 | @@ -54,6 +56,16 @@ | ||
| 3920 | .resource = smc91x_resources, | ||
| 3921 | }; | ||
| 3922 | |||
| 3923 | +static struct platform_device nand_device = { | ||
| 3924 | + .name = "monahans-nand-flash", | ||
| 3925 | + .id = -1, | ||
| 3926 | +}; | ||
| 3927 | + | ||
| 3928 | +static struct platform_device touch_device = { | ||
| 3929 | + .name = "pxa2xx-touch", | ||
| 3930 | + .id = -1, | ||
| 3931 | +}; | ||
| 3932 | + | ||
| 3933 | #if defined(CONFIG_FB_PXA) || (CONFIG_FB_PXA_MODULES) | ||
| 3934 | static void zylonite_backlight_power(int on) | ||
| 3935 | { | ||
| 3936 | @@ -96,7 +108,7 @@ | ||
| 3937 | }; | ||
| 3938 | |||
| 3939 | static struct pxafb_mode_info sharp_ls037_modes[] = { | ||
| 3940 | - [0] = { | ||
| 3941 | + [1] = { | ||
| 3942 | .pixclock = 158000, | ||
| 3943 | .xres = 240, | ||
| 3944 | .yres = 320, | ||
| 3945 | @@ -109,8 +121,8 @@ | ||
| 3946 | .lower_margin = 3, | ||
| 3947 | .sync = 0, | ||
| 3948 | }, | ||
| 3949 | - [1] = { | ||
| 3950 | - .pixclock = 39700, | ||
| 3951 | + [0] = { | ||
| 3952 | + .pixclock = 45000, | ||
| 3953 | .xres = 480, | ||
| 3954 | .yres = 640, | ||
| 3955 | .bpp = 16, | ||
| 3956 | @@ -137,6 +149,11 @@ | ||
| 3957 | /* backlight GPIO: output, default on */ | ||
| 3958 | gpio_direction_output(gpio_backlight, 1); | ||
| 3959 | |||
| 3960 | + gpio_direction_output(gpio_vsync, 0); | ||
| 3961 | + gpio_direction_output(gpio_vsync1, 0); | ||
| 3962 | + | ||
| 3963 | + printk(KERN_ERR "LCD ID is %x\n", lcd_id); | ||
| 3964 | + | ||
| 3965 | if (lcd_id & 0x20) { | ||
| 3966 | set_pxa_fb_info(&zylonite_sharp_lcd_info); | ||
| 3967 | return; | ||
| 3968 | @@ -169,6 +186,8 @@ | ||
| 3969 | smc91x_resources[1].start = gpio_to_irq(gpio_eth_irq); | ||
| 3970 | smc91x_resources[1].end = gpio_to_irq(gpio_eth_irq); | ||
| 3971 | platform_device_register(&smc91x_device); | ||
| 3972 | + platform_device_register(&nand_device); | ||
| 3973 | + platform_device_register(&touch_device); | ||
| 3974 | |||
| 3975 | zylonite_init_lcd(); | ||
| 3976 | } | ||
| 3977 | Index: linux-2.6.23/arch/arm/mach-pxa/zylonite_pxa300.c | ||
| 3978 | =================================================================== | ||
| 3979 | --- linux-2.6.23.orig/arch/arm/mach-pxa/zylonite_pxa300.c 2008-02-13 00:59:45.000000000 +0000 | ||
| 3980 | +++ linux-2.6.23/arch/arm/mach-pxa/zylonite_pxa300.c 2008-02-13 14:01:13.000000000 +0000 | ||
| 3981 | @@ -62,12 +62,12 @@ | ||
| 3982 | GPIO110_UART3_RXD, | ||
| 3983 | |||
| 3984 | /* AC97 */ | ||
| 3985 | - GPIO23_AC97_nACRESET, | ||
| 3986 | + /*GPIO23_AC97_nACRESET, | ||
| 3987 | GPIO24_AC97_SYSCLK, | ||
| 3988 | GPIO29_AC97_BITCLK, | ||
| 3989 | GPIO25_AC97_SDATA_IN_0, | ||
| 3990 | GPIO27_AC97_SDATA_OUT, | ||
| 3991 | - GPIO28_AC97_SYNC, | ||
| 3992 | + GPIO28_AC97_SYNC,*/ | ||
| 3993 | |||
| 3994 | /* Keypad */ | ||
| 3995 | GPIO107_KP_DKIN_0, | ||
| 3996 | @@ -104,6 +104,41 @@ | ||
| 3997 | /* Ethernet */ | ||
| 3998 | GPIO2_nCS3, | ||
| 3999 | GPIO99_GPIO, | ||
| 4000 | + | ||
| 4001 | + /* NAND */ | ||
| 4002 | + MFP_CFG_X(DF_INT_RnB, AF0, DS10X, PULL_LOW), | ||
| 4003 | + MFP_CFG_X(DF_nRE_nOE, AF1, DS10X, PULL_LOW), | ||
| 4004 | + MFP_CFG_X(DF_nWE, AF1, DS10X, PULL_LOW), | ||
| 4005 | + MFP_CFG_X(DF_CLE_nOE, AF0, DS10X, PULL_LOW), | ||
| 4006 | + MFP_CFG_X(DF_nADV1_ALE, AF1, DS10X, PULL_LOW), | ||
| 4007 | + MFP_CFG_X(DF_nCS0, AF1, DS10X, PULL_LOW), | ||
| 4008 | + MFP_CFG_X(DF_nCS1, AF0, DS10X, PULL_LOW), | ||
| 4009 | + MFP_CFG_X(DF_IO0, AF1, DS08X, PULL_LOW), | ||
| 4010 | + MFP_CFG_X(DF_IO1, AF1, DS08X, PULL_LOW), | ||
| 4011 | + MFP_CFG_X(DF_IO2, AF1, DS08X, PULL_LOW), | ||
| 4012 | + MFP_CFG_X(DF_IO3, AF1, DS08X, PULL_LOW), | ||
| 4013 | + MFP_CFG_X(DF_IO4, AF1, DS08X, PULL_LOW), | ||
| 4014 | + MFP_CFG_X(DF_IO5, AF1, DS08X, PULL_LOW), | ||
| 4015 | + MFP_CFG_X(DF_IO6, AF1, DS08X, PULL_LOW), | ||
| 4016 | + MFP_CFG_X(DF_IO7, AF1, DS08X, PULL_LOW), | ||
| 4017 | + MFP_CFG_X(DF_IO8, AF1, DS08X, PULL_LOW), | ||
| 4018 | + MFP_CFG_X(DF_IO9, AF1, DS08X, PULL_LOW), | ||
| 4019 | + MFP_CFG_X(DF_IO10, AF1, DS08X, PULL_LOW), | ||
| 4020 | + MFP_CFG_X(DF_IO11, AF1, DS08X, PULL_LOW), | ||
| 4021 | + MFP_CFG_X(DF_IO12, AF1, DS08X, PULL_LOW), | ||
| 4022 | + MFP_CFG_X(DF_IO13, AF1, DS08X, PULL_LOW), | ||
| 4023 | + MFP_CFG_X(DF_IO14, AF1, DS08X, PULL_LOW), | ||
| 4024 | + | ||
| 4025 | + /* AC97 */ | ||
| 4026 | + MFP_CFG_X(GPIO23, AF1, DS03X, PULL_LOW), | ||
| 4027 | + MFP_CFG_X(GPIO27, AF1, DS03X, PULL_LOW), | ||
| 4028 | + MFP_CFG_X(GPIO28, AF1, DS03X, PULL_LOW), | ||
| 4029 | + MFP_CFG_X(GPIO29, AF1, DS03X, PULL_LOW), | ||
| 4030 | + MFP_CFG_X(GPIO25, AF1, DS03X, PULL_LOW), | ||
| 4031 | + | ||
| 4032 | + MFP_CFG_X(GPIO26, AF0, DS01X, PULL_LOW), /* Interrupt */ | ||
| 4033 | + MFP_CFG_X(GPIO24, AF0, DS03X, PULL_LOW), /*SYSCLK external */ | ||
| 4034 | + MFP_CFG_X(GPIO11, AF0, DS01X, PULL_LOW), | ||
| 4035 | }; | ||
| 4036 | |||
| 4037 | static mfp_cfg_t pxa310_mfp_cfg[] __initdata = { | ||
| 4038 | @@ -163,6 +198,9 @@ | ||
| 4039 | pxa3xx_mfp_write(lcd_detect_pins[i], mfpr_save[i]); | ||
| 4040 | } | ||
| 4041 | |||
| 4042 | +extern int gpio_vsync; | ||
| 4043 | +extern int gpio_vsync1; | ||
| 4044 | + | ||
| 4045 | void __init zylonite_pxa300_init(void) | ||
| 4046 | { | ||
| 4047 | if (cpu_is_pxa300() || cpu_is_pxa310()) { | ||
| 4048 | @@ -174,6 +212,8 @@ | ||
| 4049 | |||
| 4050 | /* GPIO pin assignment */ | ||
| 4051 | gpio_backlight = mfp_to_gpio(MFP_PIN_GPIO20); | ||
| 4052 | + gpio_vsync = mfp_to_gpio(GPIO76_LCD_VSYNC); | ||
| 4053 | + gpio_vsync1 = mfp_to_gpio(GPIO71_LCD_LDD_17); | ||
| 4054 | } | ||
| 4055 | |||
| 4056 | if (cpu_is_pxa300()) { | ||
| 4057 | Index: linux-2.6.23/drivers/video/pxafb.c | ||
| 4058 | =================================================================== | ||
| 4059 | --- linux-2.6.23.orig/drivers/video/pxafb.c 2008-02-13 00:59:45.000000000 +0000 | ||
| 4060 | +++ linux-2.6.23/drivers/video/pxafb.c 2008-02-13 00:59:45.000000000 +0000 | ||
| 4061 | @@ -1543,9 +1543,9 @@ | ||
| 4062 | if (inf->lccr0 & LCCR0_INVALID_CONFIG_MASK) | ||
| 4063 | dev_warn(&dev->dev, "machine LCCR0 setting contains illegal bits: %08x\n", | ||
| 4064 | inf->lccr0 & LCCR0_INVALID_CONFIG_MASK); | ||
| 4065 | - if (inf->lccr3 & LCCR3_INVALID_CONFIG_MASK) | ||
| 4066 | - dev_warn(&dev->dev, "machine LCCR3 setting contains illegal bits: %08x\n", | ||
| 4067 | - inf->lccr3 & LCCR3_INVALID_CONFIG_MASK); | ||
| 4068 | + //if (inf->lccr3 & LCCR3_INVALID_CONFIG_MASK) | ||
| 4069 | + // dev_warn(&dev->dev, "machine LCCR3 setting contains illegal bits: %08x\n", | ||
| 4070 | + // inf->lccr3 & LCCR3_INVALID_CONFIG_MASK); | ||
| 4071 | if (inf->lccr0 & LCCR0_DPD && | ||
| 4072 | ((inf->lccr0 & LCCR0_PAS) != LCCR0_Pas || | ||
| 4073 | (inf->lccr0 & LCCR0_SDS) != LCCR0_Sngl || | ||
| 4074 | Index: linux-2.6.23/include/asm-arm/arch-pxa/mfp-pxa300.h | ||
| 4075 | =================================================================== | ||
| 4076 | --- linux-2.6.23.orig/include/asm-arm/arch-pxa/mfp-pxa300.h 2008-02-13 00:59:45.000000000 +0000 | ||
| 4077 | +++ linux-2.6.23/include/asm-arm/arch-pxa/mfp-pxa300.h 2008-02-13 00:59:45.000000000 +0000 | ||
| 4078 | @@ -175,13 +175,13 @@ | ||
| 4079 | #define GPIO68_LCD_LDD_14 MFP_CFG_DRV(GPIO68, AF1, DS01X) | ||
| 4080 | #define GPIO69_LCD_LDD_15 MFP_CFG_DRV(GPIO69, AF1, DS01X) | ||
| 4081 | #define GPIO70_LCD_LDD_16 MFP_CFG_DRV(GPIO70, AF1, DS01X) | ||
| 4082 | -#define GPIO71_LCD_LDD_17 MFP_CFG_DRV(GPIO71, AF1, DS01X) | ||
| 4083 | +#define GPIO71_LCD_LDD_17 MFP_CFG_DRV(GPIO71, AF0, DS01X) | ||
| 4084 | #define GPIO62_LCD_CS_N MFP_CFG_DRV(GPIO62, AF2, DS01X) | ||
| 4085 | #define GPIO72_LCD_FCLK MFP_CFG_DRV(GPIO72, AF1, DS01X) | ||
| 4086 | #define GPIO73_LCD_LCLK MFP_CFG_DRV(GPIO73, AF1, DS01X) | ||
| 4087 | #define GPIO74_LCD_PCLK MFP_CFG_DRV(GPIO74, AF1, DS01X) | ||
| 4088 | #define GPIO75_LCD_BIAS MFP_CFG_DRV(GPIO75, AF1, DS01X) | ||
| 4089 | -#define GPIO76_LCD_VSYNC MFP_CFG_DRV(GPIO76, AF2, DS01X) | ||
| 4090 | +#define GPIO76_LCD_VSYNC MFP_CFG_DRV(GPIO76, AF0, DS01X) | ||
| 4091 | |||
| 4092 | #define GPIO15_LCD_CS_N MFP_CFG_DRV(GPIO15, AF2, DS01X) | ||
| 4093 | #define GPIO127_LCD_CS_N MFP_CFG_DRV(GPIO127, AF1, DS01X) | ||
diff --git a/meta/packages/linux/linux-rp-2.6.25+2.6.26-rc4/zylonite_touch-r0.patch b/meta/packages/linux/linux-rp-2.6.25+2.6.26-rc4/zylonite_touch-r0.patch new file mode 100644 index 0000000000..1c00696051 --- /dev/null +++ b/meta/packages/linux/linux-rp-2.6.25+2.6.26-rc4/zylonite_touch-r0.patch | |||
| @@ -0,0 +1,1548 @@ | |||
| 1 | Index: linux-2.6.23/drivers/input/touchscreen/Kconfig | ||
| 2 | =================================================================== | ||
| 3 | --- linux-2.6.23.orig/drivers/input/touchscreen/Kconfig 2008-02-13 01:12:29.000000000 +0000 | ||
| 4 | +++ linux-2.6.23/drivers/input/touchscreen/Kconfig 2008-02-13 01:13:20.000000000 +0000 | ||
| 5 | @@ -54,6 +54,12 @@ | ||
| 6 | To compile this driver as a module, choose M here: the | ||
| 7 | module will be called corgi_ts. | ||
| 8 | |||
| 9 | +config TOUCHSCREEN_ZYLONITE | ||
| 10 | + tristate "Zylonite touchscreen driver" | ||
| 11 | + default y | ||
| 12 | + help | ||
| 13 | + Say Y here for the Zylonite touchscreen driver | ||
| 14 | + | ||
| 15 | config TOUCHSCREEN_FUJITSU | ||
| 16 | tristate "Fujitsu serial touchscreen" | ||
| 17 | select SERIO | ||
| 18 | Index: linux-2.6.23/drivers/input/touchscreen/Makefile | ||
| 19 | =================================================================== | ||
| 20 | --- linux-2.6.23.orig/drivers/input/touchscreen/Makefile 2008-02-13 01:12:29.000000000 +0000 | ||
| 21 | +++ linux-2.6.23/drivers/input/touchscreen/Makefile 2008-02-13 01:13:38.000000000 +0000 | ||
| 22 | @@ -19,3 +19,4 @@ | ||
| 23 | obj-$(CONFIG_TOUCHSCREEN_TOUCHWIN) += touchwin.o | ||
| 24 | obj-$(CONFIG_TOUCHSCREEN_UCB1400) += ucb1400_ts.o | ||
| 25 | obj-$(CONFIG_TOUCHSCREEN_TSC2101) += tsc2101_ts.o | ||
| 26 | +obj-$(CONFIG_TOUCHSCREEN_ZYLONITE) += zylonite-ts.o | ||
| 27 | Index: linux-2.6.23/drivers/input/touchscreen/zylonite-ts.c | ||
| 28 | =================================================================== | ||
| 29 | --- /dev/null 1970-01-01 00:00:00.000000000 +0000 | ||
| 30 | +++ linux-2.6.23/drivers/input/touchscreen/zylonite-ts.c 2008-02-13 16:19:15.000000000 +0000 | ||
| 31 | @@ -0,0 +1,1517 @@ | ||
| 32 | +/* | ||
| 33 | + * drivers/input/touchscreen/mhn_audio_touch.c. | ||
| 34 | + * | ||
| 35 | + * Author: bridge.wu@marvell.com | ||
| 36 | + * Created: Nov 17, 2006 | ||
| 37 | + * Copyright: Marvell Corporation. | ||
| 38 | + * | ||
| 39 | + * This program is free software; you can redistribute it and/or modify | ||
| 40 | + * it under the terms of the GNU General Public License version 2 as | ||
| 41 | + * published by the Free Software Foundation. | ||
| 42 | + */ | ||
| 43 | +#include <linux/init.h> | ||
| 44 | +#include <linux/module.h> | ||
| 45 | +#include <linux/kernel.h> | ||
| 46 | +#include <linux/device.h> | ||
| 47 | +#include <linux/platform_device.h> | ||
| 48 | +#include <linux/interrupt.h> | ||
| 49 | +#include <linux/delay.h> | ||
| 50 | + | ||
| 51 | +#include <sound/driver.h> | ||
| 52 | +#include <sound/core.h> | ||
| 53 | +#include <sound/pcm.h> | ||
| 54 | +#include <sound/initval.h> | ||
| 55 | + | ||
| 56 | +#include <asm/semaphore.h> | ||
| 57 | +#include <asm/hardware.h> | ||
| 58 | +#include <asm/arch/pxa-regs.h> | ||
| 59 | +#include <asm/arch/gpio.h> | ||
| 60 | +#include <asm/arch/mfp.h> | ||
| 61 | +//#include <asm/arch/ipmc.h> | ||
| 62 | +#include <linux/suspend.h> | ||
| 63 | +#include <linux/spinlock.h> | ||
| 64 | + | ||
| 65 | +//#include <asm/arch/codec/acodec.h> | ||
| 66 | +//#include <asm/arch/mhn_audio_plat.h> | ||
| 67 | + | ||
| 68 | +#define OSCC __REG(0x41350000) /* Oscillator Configuration Register */ | ||
| 69 | +#define AC97_DIV __REG(0x41340014) | ||
| 70 | + | ||
| 71 | +#define ALSA_ZY_CARD_DEBUG | ||
| 72 | +#undef ALSA_ZY_CARD_DEBUG | ||
| 73 | + | ||
| 74 | +#define WM_9713_ID 0x4C13 /* this should be the 7E register value */ | ||
| 75 | + | ||
| 76 | +#ifdef ALSA_ZY_CARD_DEBUG | ||
| 77 | +#define dbg(format, arg...) printk(KERN_DEBUG format, ##arg) | ||
| 78 | +#else | ||
| 79 | +#define dbg(format, arg...) | ||
| 80 | +#endif | ||
| 81 | + | ||
| 82 | +#define DEBUG | ||
| 83 | +#undef DEBUG | ||
| 84 | +#ifdef DEBUG | ||
| 85 | +unsigned int start_time; | ||
| 86 | +unsigned int end_time; | ||
| 87 | +unsigned int time; | ||
| 88 | +#define PRINT_TIME() do {\ | ||
| 89 | + time = ((end_time > start_time))?\ | ||
| 90 | + (end_time - start_time)*100/325:\ | ||
| 91 | + (0xffffffff - start_time + end_time)*100/325;\ | ||
| 92 | + printk("\n%s:%dus\n", __FUNCTION__, time);\ | ||
| 93 | +} while(0) | ||
| 94 | +#endif | ||
| 95 | + | ||
| 96 | + | ||
| 97 | + | ||
| 98 | + | ||
| 99 | +/* 9713 specific | ||
| 100 | + * Register Name Index | ||
| 101 | + */ | ||
| 102 | +#define RESET 0X00 | ||
| 103 | +#define SPEAKER_VOLUME 0X02 | ||
| 104 | +#define HEADPHONE_VOLUME 0X04 | ||
| 105 | +#define OUT3_OUT4_VOLUME 0X06 | ||
| 106 | +#define MONOVOL_MONOINPGA_ROUTE 0X08 | ||
| 107 | +#define LINE_IN_PGA_VOL_ROUTE 0X0A | ||
| 108 | +#define DAC_PGA_VOL_ROUTE 0X0C | ||
| 109 | +#define MIC_PGA_VOLUME 0X0E | ||
| 110 | +#define MIC_ROUTING 0X10 | ||
| 111 | +#define REC_PGA_VOL 0X12 | ||
| 112 | +#define REC_ROUTE_MUX_SEL 0X14 | ||
| 113 | +#define PCBEEP_VOL_ROUTE 0X16 | ||
| 114 | +#define VXDAC_VOLUME_ROUTE 0X18 | ||
| 115 | +#define AUX_DAC_VOL_ROUTE 0X1A | ||
| 116 | +#define OUTPUT_PGA_MUX 0X1C | ||
| 117 | +#define DAC_3D_CTRL_INV_MUX_SEL 0X1E | ||
| 118 | +#define DAC_TONE_CTRL 0X20 | ||
| 119 | +#define MIC_BIAS 0X22 | ||
| 120 | +#define OUTPUT_VOL_MAPPING_JACK 0X24 | ||
| 121 | +#define POWERDOWN_CTRL_STAT 0X26 | ||
| 122 | +#define EXTENDED_AUD_ID 0X28 | ||
| 123 | +#define EXTENDED_AUD_STAT_CTRL 0X2A | ||
| 124 | +#define AUDIO_DAC_RATE 0X2C | ||
| 125 | +#define AUX_DAC_RATE 0X2E | ||
| 126 | +#define AUDIO_ADC_RATE 0X32 | ||
| 127 | +#define PCM_CODEC_CTRL 0X36 | ||
| 128 | +#define SPDIF_CTRL 0X3A | ||
| 129 | +#define POWER_DOWN_1 0X3C | ||
| 130 | +#define POWER_DOWN_2 0X3E | ||
| 131 | +#define GENERAL_PURPOSE_WM_13 0X40 | ||
| 132 | +#define FAST_POWERUP_CTRL 0X42 | ||
| 133 | +#define MCLK_PLL_CTRL_1 0X44 | ||
| 134 | +#define MCLK_PLL_CTRL_2 0X46 | ||
| 135 | +#define GPIO_PIN_CFG 0X4C | ||
| 136 | +#define GPIO_PIN_POL_TYPE 0X4E | ||
| 137 | +#define GPIO_PIN_STICKY 0X50 | ||
| 138 | +#define GPIO_PIN_WAKEUP 0X52 | ||
| 139 | +#define GPIO_PIN_STATUS 0X54 | ||
| 140 | +#define GPIO_PIN_SHARING 0X56 | ||
| 141 | +#define GPIO_PULL_UP_DOWN_CTRL 0X58 | ||
| 142 | +#define ADD_FUNC_1 0X5A | ||
| 143 | +#define ADD_FUNC_2 0X5C | ||
| 144 | +#define ALC_CTRL 0X60 | ||
| 145 | +#define ALC_NOISE_GATE_CTRL 0X62 | ||
| 146 | +#define AUX_DAC_INPUT_CTRL 0X64 | ||
| 147 | +#define TEST_REG_1 0X68 | ||
| 148 | +#define TEST_REG_2 0X6A | ||
| 149 | +#define TEST_REG_3 0X6C | ||
| 150 | +#define TEST_REG_4 0X6E | ||
| 151 | +#define DIGITIZER_1_WM13 0x74 | ||
| 152 | +#define DIGITIZER_2_WM13 0x76 | ||
| 153 | +#define DIGITIZER_3_WM13 0x78 | ||
| 154 | +#define DIGITIZER_READ_BACK 0x7a | ||
| 155 | +#define VENDOR_ID1 0x7c | ||
| 156 | +#define VENDOR_ID2 0x7e | ||
| 157 | + | ||
| 158 | +#define ZY_TOUCH_SAMPLE_X 1 | ||
| 159 | +#define ZY_TOUCH_SAMPLE_Y 2 | ||
| 160 | + | ||
| 161 | +#define ZY_EVENT_TYPE_NONE 0 | ||
| 162 | +#define ZY_EVENT_TYPE_PDN 1 | ||
| 163 | + | ||
| 164 | + | ||
| 165 | +typedef enum _zy_acodec_error_t { | ||
| 166 | + ZY_ACODEC_SUCCESS = 0, /* successful completion of a function */ | ||
| 167 | + ZY_ACODEC_GENERAL_SW_ERR, /* null pointer to registers or other software error */ | ||
| 168 | + ZY_ACODEC_CONTROLLER_INTERFACE_TIMEOUT, /* time-out for waiting for respponse */ | ||
| 169 | + ZY_ACODEC_SAMPLERATE_NOT_SUPPORTED, /* the sample rate is not supported either in controller or codec */ | ||
| 170 | + ZY_ACODEC_FEATURE_NO_SUPPORTED, /* this codec feature is not supported */ | ||
| 171 | + ZY_ACODEC_GENERAL_HW_ERR ,/* other hardware error besides time out */ | ||
| 172 | + ZY_ACODEC_ROUTE_NO_SUPPORTED, /* the codec can not set the route required */ | ||
| 173 | + ZY_ACODEC_SLEEP /* the codec is sleep */ | ||
| 174 | +} zy_acodec_error_t; | ||
| 175 | + | ||
| 176 | +typedef unsigned int zy_acodec_device_id_t; | ||
| 177 | + | ||
| 178 | +typedef enum _codec_state { | ||
| 179 | + ZY_CODEC_SLEEP = 0, | ||
| 180 | + ZY_CODEC_WAKEUP = 1 | ||
| 181 | +} acodec_state_t; | ||
| 182 | + | ||
| 183 | +typedef enum { | ||
| 184 | + ZY_FM = 0, | ||
| 185 | + ZY_MIC1 = 1, | ||
| 186 | + ZY_MIC2 = 2, | ||
| 187 | + ZY_SPEAKER =3, | ||
| 188 | + ZY_HEADSET =4, | ||
| 189 | + ZY_HANDSET =5, | ||
| 190 | +} vol_port_type_t; | ||
| 191 | + | ||
| 192 | +typedef struct _context_t { | ||
| 193 | + int use_count; /* probe/remove and suspend/resume usage count, sync among multiple devices */ | ||
| 194 | + zy_acodec_device_id_t acodec_id;/* - an ID that uniquely identifies the codec to be used */ | ||
| 195 | + unsigned long init_number; /* used by driver to track whether it is inited or not */ | ||
| 196 | + | ||
| 197 | + void *p_voice_reg; /* pointer to Monahans registers that has PCM interface to codec */ | ||
| 198 | + void *p_hifi_reg; /* pointer to Monahans registers that has hifi interface to codec */ | ||
| 199 | + void *p_ctrl_reg; /* pointer to Monahans registers that has control interface to codec */ | ||
| 200 | + int *p_ost_regs; /* needed for time out */ | ||
| 201 | + void *p_save_memory; /* pointer to a memory region to save context while suspend */ | ||
| 202 | + void *p_zy_scenario; /* pointer to the scenario data structure */ | ||
| 203 | + long u_max_read_write_time_out_ms;/* input the max time to wait in milliseconds before giving up on a read or write operation */ | ||
| 204 | + long u_max_setup_time_out_ms; /* input the maximum time in milliseconds to wait during initial setup of the ACODEC controller and codec */ | ||
| 205 | + | ||
| 206 | + /* member functions these pointers must be set by */ | ||
| 207 | + zy_acodec_error_t (* g_pfn_codec_specific_init) (struct _context_t *p_device_context); | ||
| 208 | + zy_acodec_error_t (* g_pfn_codec_specific_dinit) (struct _context_t *p_device_context); | ||
| 209 | + zy_acodec_error_t (* g_pfn_acodec_read) (struct _context_t *p_dev_context, unsigned short reg_addr, unsigned short *p_reg_value); | ||
| 210 | + zy_acodec_error_t (* g_pfn_acodec_write) (struct _context_t *p_dev_context, unsigned short reg_addr, unsigned short reg_value); | ||
| 211 | + | ||
| 212 | + /* add for route */ | ||
| 213 | + zy_acodec_error_t (* g_pfn_set_route) (struct _context_t *p_device_context, unsigned short * rout_map ,unsigned short* current_map); | ||
| 214 | + /* add for sleep the codec */ | ||
| 215 | + zy_acodec_error_t (* g_pfn_sleep_codec) (struct _context_t *p_device_context); | ||
| 216 | + /* add for Wake up the codec */ | ||
| 217 | + zy_acodec_error_t (* g_pfn_wake_codec) (struct _context_t *p_device_context); | ||
| 218 | + /* add for get codec state */ | ||
| 219 | + zy_acodec_error_t (* g_pfn_get_state) (struct _context_t *p_device_context, acodec_state_t *p_state); | ||
| 220 | + /* add for volume */ | ||
| 221 | + zy_acodec_error_t (* g_pfn_get_vol)(struct _context_t *p_device_context, vol_port_type_t port, unsigned short *gain_in_db); | ||
| 222 | + zy_acodec_error_t (* g_pfn_set_vol)(struct _context_t *p_device_context, vol_port_type_t port, unsigned short gain_in_db); | ||
| 223 | + | ||
| 224 | + void (* g_pfn_get_event)(struct _context_t *p_device_context, unsigned char * event_type); | ||
| 225 | + void (* g_pfn_event_ack)(struct _context_t *p_device_context, unsigned char event_type); | ||
| 226 | + zy_acodec_error_t (* g_pfn_enable_touch)(struct _context_t *p_device_context); | ||
| 227 | + zy_acodec_error_t (* g_pfn_disable_touch)(struct _context_t *p_device_context); | ||
| 228 | +} zy_acocec_context_t, *p_zy_acocec_context_t; | ||
| 229 | + | ||
| 230 | + | ||
| 231 | + | ||
| 232 | + | ||
| 233 | + | ||
| 234 | +static p_zy_acocec_context_t p_zy_codec_ctxt = NULL; | ||
| 235 | + | ||
| 236 | +#include <linux/input.h> | ||
| 237 | +//#include <asm/arch/codec/wm9713.h> | ||
| 238 | + | ||
| 239 | +#define PEN_DOWN 1 | ||
| 240 | +#define PEN_UP 0 | ||
| 241 | +#define TS_SAMPLE_INTERVAL 1 | ||
| 242 | + | ||
| 243 | +typedef struct { | ||
| 244 | + struct input_dev *idev; | ||
| 245 | + struct timer_list *timer; | ||
| 246 | + int use_count; | ||
| 247 | +} codec_zy_ts_t; | ||
| 248 | + | ||
| 249 | +codec_zy_ts_t codec_zy_ts; | ||
| 250 | + | ||
| 251 | +static struct input_dev *codec_zy_ts_input; | ||
| 252 | + | ||
| 253 | +#ifdef CONFIG_PM | ||
| 254 | +static volatile int touch_suspend = 0 ; | ||
| 255 | +#endif | ||
| 256 | + | ||
| 257 | +#define ZY_AC97_CODEC_REGS_NUM 0x40 | ||
| 258 | + | ||
| 259 | +typedef struct | ||
| 260 | +{ // Register symbol // Usage | ||
| 261 | + volatile unsigned long pocr; // PCM Out Control Register | ||
| 262 | + volatile unsigned long picr; // PCM In Control Register | ||
| 263 | + volatile unsigned long mccr; // Mic In Control Register | ||
| 264 | + volatile unsigned long gcr; // Global Control Register | ||
| 265 | + volatile unsigned long posr; // PCM Out Status Register | ||
| 266 | + volatile unsigned long pisr; // PCM In Status Register | ||
| 267 | + volatile unsigned long mcsr; // Mic In Status Register | ||
| 268 | + volatile unsigned long gsr; // Global Status Register | ||
| 269 | + volatile unsigned long car; // CODEC Access Register | ||
| 270 | + volatile unsigned long pcscr; // PCM Surround Out Control | ||
| 271 | + volatile unsigned long pcssr; // PCM Surround Out Status | ||
| 272 | + volatile unsigned long pcsdr; // PCM Surround Out Data | ||
| 273 | + volatile unsigned long pcclcr; // PCM Center/LFE Out Control | ||
| 274 | + volatile unsigned long pcclsr; // PCM Center/LFE Out Status | ||
| 275 | + volatile unsigned long pccldr; // PCM Center/LFE Out Data | ||
| 276 | + volatile unsigned long reserved1; // | ||
| 277 | + volatile unsigned long pcdr; // PCM FIFO Data Register | ||
| 278 | + volatile unsigned long reserved2 [0x7]; // 0x4050-0044 through 0x4050-005C | ||
| 279 | + volatile unsigned long mcdr; // Mic-in FIFO Data Register | ||
| 280 | + volatile unsigned long reserved3 [0x27]; // 0x4050-0064 through 0x4050-00FC | ||
| 281 | + volatile unsigned long mocr; // MODEM Out Control Register | ||
| 282 | + volatile unsigned long reserved4; | ||
| 283 | + volatile unsigned long micr; // MODEM In Control Register | ||
| 284 | + volatile unsigned long reserved5; | ||
| 285 | + volatile unsigned long mosr; // MODEM Out Status Register | ||
| 286 | + volatile unsigned long reserved6; | ||
| 287 | + volatile unsigned long misr; // MODEM In Status Register | ||
| 288 | + volatile unsigned long reserved7 [0x9]; // 0x4050-011C through 0x4050-013C | ||
| 289 | + volatile unsigned long modr; // MODEM FIFO Data Register | ||
| 290 | + volatile unsigned long reserved8 [0x2F]; // 0x4050-0144 through 0x4050-01FC | ||
| 291 | + // Primary Audio CODEC registers access | ||
| 292 | + volatile unsigned long codec_regs_primary_aud [ZY_AC97_CODEC_REGS_NUM]; | ||
| 293 | + // Secondary ID 01 Audio CODEC registers access | ||
| 294 | + volatile unsigned long codec_regs_secondary_aud [ZY_AC97_CODEC_REGS_NUM]; | ||
| 295 | + // Primary MODEM CODEC registers access | ||
| 296 | + volatile unsigned long codec_regs_primary_mdm [ZY_AC97_CODEC_REGS_NUM]; | ||
| 297 | + // Secondary ID 01 MODEM CODEC registers access | ||
| 298 | + volatile unsigned long codec_regs_secondary_mdm [ZY_AC97_CODEC_REGS_NUM]; | ||
| 299 | + // Secondary ID 10 MODEM CODEC registers access | ||
| 300 | + volatile unsigned long codec_regs_third_mdm [ZY_AC97_CODEC_REGS_NUM]; | ||
| 301 | + // Secondary ID 11 MODEM CODEC registers access | ||
| 302 | + volatile unsigned long codec_regs_fouth_mdm [ZY_AC97_CODEC_REGS_NUM]; | ||
| 303 | + // Secondary ID 10 Audio CODEC registers access | ||
| 304 | + volatile unsigned long codec_regs_third_aud [ZY_AC97_CODEC_REGS_NUM]; | ||
| 305 | + // Secondary ID 11 Audio CODEC registers access | ||
| 306 | + volatile unsigned long codec_regs_fouth_aud [ZY_AC97_CODEC_REGS_NUM]; | ||
| 307 | +} zy_ac97_acodec_t, *p_zy_ac97acodec_t ; | ||
| 308 | + | ||
| 309 | + | ||
| 310 | +/* Constants for the Global Control Register and Global Status Register */ | ||
| 311 | + | ||
| 312 | +// AC97 Global Control Register bit mask constants | ||
| 313 | + | ||
| 314 | +#define ZY_AC97_GCR_GIE_MSK (1u << 0 ) | ||
| 315 | +#define ZY_AC97_GCR_COLD_RESET_MSK (1u << 1 ) | ||
| 316 | +#define ZY_AC97_GCR_WARM_RESET_MSK (1u << 2 ) | ||
| 317 | +#define ZY_AC97_GCR_LINK_OFF_MSK (1u << 3 ) | ||
| 318 | +#define ZY_AC97_GCR_PCRSM_IEN_MSK (1u << 4 ) | ||
| 319 | +#define ZY_AC97_GCR_SCRSM_IEN_MSK (1u << 5 ) | ||
| 320 | +#define ZY_AC97_GCR_PCRDY_IEN_MSK (1u << 8 ) | ||
| 321 | +#define ZY_AC97_GCR_SCRDY_IEN_MSK (1u << 9 ) | ||
| 322 | +#define ZY_AC97_GCR_SDONE_IE_MSK (1u << 18) | ||
| 323 | +#define ZY_AC97_GCR_CDONE_IE_MSK (1u << 19) | ||
| 324 | +#define ZY_AC97_GCR_nDMAEN_MSK (1u << 24) | ||
| 325 | +#define ZY_AC97_GCR_CLKBPB_MSK (1u << 31) | ||
| 326 | +#define ZY_AC97_GCR_FRCRST_MSK (1u << 30) | ||
| 327 | +// Global Status Register bit mask constants | ||
| 328 | + | ||
| 329 | +#define ZY_AC97_GSR_GSCI_MSK (1u << 0 ) | ||
| 330 | +#define ZY_AC97_GSR_MIINT_MSK (1u << 1 ) | ||
| 331 | +#define ZY_AC97_GSR_MOINT_MSK (1u << 2 ) | ||
| 332 | +#define ZY_AC97_GSR_ACOFFD_MSK (1u << 3 ) | ||
| 333 | +#define ZY_AC97_GSR_PIINT_MSK (1u << 5 ) | ||
| 334 | +#define ZY_AC97_GSR_POINT_MSK (1u << 6 ) | ||
| 335 | +#define ZY_AC97_GSR_MINT_MSK (1u << 7 ) | ||
| 336 | +#define ZY_AC97_GSR_PCRDY_MSK (1u << 8 ) | ||
| 337 | +#define ZY_AC97_GSR_SCRDY_MSK (1u << 9 ) | ||
| 338 | +#define ZY_AC97_GSR_PCRSM_MSK (1u << 10) | ||
| 339 | +#define ZY_AC97_GSR_SCRSM_MSK (1u << 11) | ||
| 340 | +#define ZY_AC97_GSR_SLT12_BITS_MSK (7u << 12) | ||
| 341 | +#define ZY_AC97_GSR_RCS_ERR_MSK (1u << 15) | ||
| 342 | +#define ZY_AC97_GSR_SDONE_MSK (1u << 18) | ||
| 343 | +#define ZY_AC97_GSR_CDONE_MSK (1u << 19) | ||
| 344 | + | ||
| 345 | + | ||
| 346 | +// Bit mask and values for CAIP bit in car register. | ||
| 347 | +#define ZY_AC97_CAR_CAIP_MSK (0x1<<0) | ||
| 348 | +#define ZY_AC97_CAR_CAIP_LOCKED (0x1<<0) | ||
| 349 | +#define ZY_AC97_CAR_CAIP_CLEAR (0<<0) | ||
| 350 | + | ||
| 351 | +/* Constants for FIFO status reporting and control */ | ||
| 352 | + | ||
| 353 | +// One bit location is used to report FIFO error conditions and clear | ||
| 354 | +// interrupts on those conditions in the various non-global status registers. | ||
| 355 | + | ||
| 356 | +// ZY_AC97_FIFOSTAT_FIFOE is used in: | ||
| 357 | + // posr | ||
| 358 | + // pisr | ||
| 359 | + // mcsr | ||
| 360 | + // mosr | ||
| 361 | + // misr | ||
| 362 | + | ||
| 363 | +#define ZY_AC97_FIFOSTAT_FIFOE (1u << 4) | ||
| 364 | +#define ZY_AC97_FIFOSTAT_EOC (1u << 3) | ||
| 365 | +#define ZY_AC97_FIFOSTAT_FSR (1u << 2) | ||
| 366 | + | ||
| 367 | +// A different bit location is used to enable or disable interrupts based on | ||
| 368 | +// FIFO error conditions in the various non-global control registers. | ||
| 369 | + | ||
| 370 | +// ZY_AC97_FIFOCTRL_FEIE is used in: | ||
| 371 | + // pocr | ||
| 372 | + // picr | ||
| 373 | + // mccr | ||
| 374 | + // mocr | ||
| 375 | + // micr | ||
| 376 | + | ||
| 377 | +#define ZY_AC97_FIFOCTRL_FEIE (1u << 3) | ||
| 378 | +#define ZY_AC97_FIFOCTRL_FSRIE (1u << 1) | ||
| 379 | + | ||
| 380 | +/* | ||
| 381 | +******************************************************************************* | ||
| 382 | + AC'97 Codec Registers Location and Bit Definition | ||
| 383 | +******************************************************************************* | ||
| 384 | +*/ | ||
| 385 | + | ||
| 386 | +/* */ | ||
| 387 | + | ||
| 388 | + // Includes symbolic values for certain proprietary register asssignments | ||
| 389 | + // in AC'97 devices that might be used with ZY_AC97. | ||
| 390 | + | ||
| 391 | + // Valid for subset of R 2.1 specification. | ||
| 392 | + // Leading "e" in comment means it is an "expanded" register definition as | ||
| 393 | + // found in one or more of the Appendices A-D of the R 2.1 specification. | ||
| 394 | + // Appendix identifier will immediately follow the "e", such as "eA" | ||
| 395 | + // R/O indicates read-only | ||
| 396 | + // Registers not supported by the assumed controller will be commented out. | ||
| 397 | + | ||
| 398 | +#define ZY_AC97_CR_RESET_ID 0x00 // RESET CODEC TO DEFAULT, get ID info | ||
| 399 | +#define ZY_AC97_CR_MASTER_VOLUME 0x02 // LINE OUT VOLUME | ||
| 400 | +#define ZY_AC97_CR_HEADPHONE_VOLUME 0x04 // | ||
| 401 | +#define ZY_AC97_CR_MASTER_VOLUME_MONO 0x06 // | ||
| 402 | +#define ZY_AC97_CR_MASTER_TONE_R_L 0x08 // | ||
| 403 | +#define ZY_AC97_CR_PC_BEEP_VOLUME 0x0A // | ||
| 404 | +#define ZY_AC97_CR_PHONE_VOLUME 0x0C // | ||
| 405 | +#define ZY_AC97_CR_MIC_VOLUME 0x0E // micrOPHONE VOLUME/ AGC | ||
| 406 | +#define ZY_AC97_CR_LINE_IN_VOLUME 0x10 // LINE IN VOLUME | ||
| 407 | +#define ZY_AC97_CR_CD_VOLUME 0x12 // | ||
| 408 | +#define ZY_AC97_CR_VIDEO_VOLUME 0x14 // | ||
| 409 | +#define ZY_AC97_CR_AUX_VOLUME 0x16 // | ||
| 410 | +#define ZY_AC97_CR_PCM_OUT_VOLUME 0x18 // | ||
| 411 | +#define ZY_AC97_CR_RECORD_SELECT 0x1A // SELECT LINE IN OR micrOPHONE | ||
| 412 | +#define ZY_AC97_CR_RECORD_GAIN 0x1C // | ||
| 413 | +#define ZY_AC97_CR_RECORD_GAIN_MIC 0x1E // | ||
| 414 | +#define ZY_AC97_CR_GENERAL_PURPOSE 0x20 // | ||
| 415 | +#define ZY_AC97_CR_CONTROL_3D 0x22 // | ||
| 416 | +#define ZY_AC97_CR_POWERDOWN_CTRL_STAT 0x26 // POWER MANAGEMENT | ||
| 417 | +#define ZY_AC97_CR_E_AUDIO_ID 0x28 // eA Extended audio sprt info, R/O | ||
| 418 | +#define ZY_AC97_CR_E_AUDIO_CTRL_STAT 0x2A // eA Extended audio stat + control | ||
| 419 | + | ||
| 420 | +// | ||
| 421 | +// Audio Sample Rate Control Registers, 0x2C - 0x34 | ||
| 422 | +// | ||
| 423 | + // eA PCM Front DAC rate control | ||
| 424 | +#define ZY_AC97_CR_E_ASR_PCM_FRNT_DAC_RT 0x2C // (output slots 3, 4, 6) | ||
| 425 | +#define ZY_AC97_CR_E_ASR_PCM_LR_ADC_RT 0x32 // eA PCM L+R ADC rate control (3+4) | ||
| 426 | +#define ZY_AC97_CR_E_ASR_MIC_ADC_RT 0x34 // eA PCM Mic ADC rate control (5) | ||
| 427 | + | ||
| 428 | + | ||
| 429 | +#define ZY_AC97_CR_E_MDM_GPIO_PIN_STAT 0x54 | ||
| 430 | +// | ||
| 431 | +// 5Ah-7Ah: Vendor Reserved | ||
| 432 | +// | ||
| 433 | +// | ||
| 434 | +// 7Ch-7Eh: Vendor ID registers. Optional but standardized for Plug'n'Play | ||
| 435 | +// | ||
| 436 | +#define ZY_AC97_CR_VENDOR_ID1 0x7C | ||
| 437 | +#define ZY_AC97_CR_VENDOR_ID2 0x7E | ||
| 438 | + | ||
| 439 | +#define ZY_AC97_CR_MAX ZY_AC97_CR_VENDOR_ID2 | ||
| 440 | + | ||
| 441 | +#define ZY_AC97_CR_END_OF_LIST (ZY_AC97_CR_MAX + 2) | ||
| 442 | + | ||
| 443 | + | ||
| 444 | + | ||
| 445 | +/* Other Constants */ | ||
| 446 | + | ||
| 447 | +// For accessing the Codec mixer registers, each increment of one 32-bit word | ||
| 448 | +// in processor space increments the addressed mixer register by two. | ||
| 449 | +// This does not cause any ambiguities because only even mixer register | ||
| 450 | +// addresses are currently supported (AC '97 spec, R 2.2) | ||
| 451 | +#define ZY_AC97_CODEC_REGS_PER_WORD 2 | ||
| 452 | + | ||
| 453 | +/* Default timeout and holdtime settings */ | ||
| 454 | + | ||
| 455 | +// timeout in reading and writing codec registers through AC link | ||
| 456 | +#define ZY_AC97_RW_TIMEOUT_DEF 200 //unit is us | ||
| 457 | + | ||
| 458 | +// timeout in waiting for codec's ready signal during setup process | ||
| 459 | +#define ZY_AC97_SETUP_TIMEOUT_DEF 500 //unit is us | ||
| 460 | + | ||
| 461 | +// timeout in waiting for locking the link successfully | ||
| 462 | +#define ZY_AC97_LOCK_TIMEOUT_DEF 300 //unit is us | ||
| 463 | + | ||
| 464 | +// timeout in shutting down the link | ||
| 465 | +#define ZY_AC97_LINKOFF_TIMEOUT_DEF 500 //unit is us | ||
| 466 | + | ||
| 467 | +// holdtime for keeping nReset signal active(low) in AC link | ||
| 468 | +#define ZY_AC97_COLD_HOLDTIME 100 //unit is us | ||
| 469 | + | ||
| 470 | +/* | ||
| 471 | +******************************************************************************* | ||
| 472 | + ZY AC97 data structure used in function interface | ||
| 473 | +******************************************************************************* | ||
| 474 | +*/ | ||
| 475 | + | ||
| 476 | +typedef struct | ||
| 477 | +{ | ||
| 478 | + unsigned long pocr; // PCM Out Control Register | ||
| 479 | + unsigned long picr; // PCM In Control Register | ||
| 480 | + unsigned long mccr; // Mic In Control Register | ||
| 481 | + unsigned long gcr; // Global Control Register | ||
| 482 | + unsigned long pcscr; // PCM Surround Out Control | ||
| 483 | + unsigned long pcclcr; // PCM Center/LFE Out Control | ||
| 484 | + unsigned long mocr; // MODEM Out Control Register | ||
| 485 | + unsigned long micr; // MODEM In Control Register | ||
| 486 | +}zy_ac97_save_context_t; | ||
| 487 | + | ||
| 488 | + | ||
| 489 | +#define AC97_SAVE_CONTEXT_SIZE (sizeof(zy_ac97_save_context_t)) | ||
| 490 | + | ||
| 491 | +static int zy_ac97_acodec_link_lock(p_zy_ac97acodec_t p_ac97_reg) | ||
| 492 | +{ | ||
| 493 | + int status = 1; | ||
| 494 | + volatile unsigned long car_tmp; | ||
| 495 | + | ||
| 496 | + car_tmp = p_ac97_reg->car; | ||
| 497 | + if (car_tmp & ZY_AC97_CAR_CAIP_MSK) /* "1" in CAIP bit means lock failed. */ | ||
| 498 | + { | ||
| 499 | + status = 0; | ||
| 500 | + } | ||
| 501 | + return (status); | ||
| 502 | +} | ||
| 503 | + | ||
| 504 | + | ||
| 505 | +zy_acodec_error_t zy_ac97_acodec_write (zy_acocec_context_t *p_dev_context, unsigned short offset, unsigned short data) | ||
| 506 | +{ | ||
| 507 | + zy_acodec_error_t status = ZY_ACODEC_SUCCESS; | ||
| 508 | + int got_link; | ||
| 509 | + unsigned long time_remaining; | ||
| 510 | + volatile unsigned long * p_codec_reg; | ||
| 511 | + p_zy_ac97acodec_t p_ac97_reg = (p_zy_ac97acodec_t)(p_dev_context->p_ctrl_reg); | ||
| 512 | + unsigned long max_rw_time_out_us = (p_dev_context->u_max_read_write_time_out_ms) * 1000; | ||
| 513 | + | ||
| 514 | + | ||
| 515 | + if(offset == ZY_AC97_CR_E_MDM_GPIO_PIN_STAT) | ||
| 516 | + {/* it is a special register and sent out on slot 12 */ | ||
| 517 | + p_codec_reg = &(p_ac97_reg->codec_regs_primary_mdm[0]); | ||
| 518 | + p_codec_reg += offset / ZY_AC97_CODEC_REGS_PER_WORD; | ||
| 519 | + /* The data will be sent out on slot 12. */ | ||
| 520 | + *p_codec_reg = (unsigned long)data; | ||
| 521 | + goto done; | ||
| 522 | + } | ||
| 523 | + | ||
| 524 | + /* Point to specified register within area mapped to target codec regs */ | ||
| 525 | + p_codec_reg = &(p_ac97_reg->codec_regs_primary_aud[0]); | ||
| 526 | + p_codec_reg += offset / ZY_AC97_CODEC_REGS_PER_WORD; | ||
| 527 | + | ||
| 528 | + | ||
| 529 | + /* Lock the ACLINK */ | ||
| 530 | + time_remaining = ZY_AC97_LOCK_TIMEOUT_DEF; | ||
| 531 | + do | ||
| 532 | + { | ||
| 533 | + got_link = zy_ac97_acodec_link_lock(p_ac97_reg); | ||
| 534 | + if (0 == got_link) /* 1 usec is a long time. Skip delay if possible. */ | ||
| 535 | + { | ||
| 536 | + udelay(1); | ||
| 537 | + } | ||
| 538 | + } /* Wait while time remaining and ACLINK not available */ | ||
| 539 | + while (time_remaining-- && (0 == got_link)); | ||
| 540 | + | ||
| 541 | + if (0 == got_link) /* Didn't get the ACLINK */ | ||
| 542 | + { | ||
| 543 | + status = ZY_ACODEC_CONTROLLER_INTERFACE_TIMEOUT; | ||
| 544 | + printk(KERN_ERR "AC97 Write Link Timeout\n"); | ||
| 545 | + } | ||
| 546 | + else /* We got the link. Perform the write operation and don't wait. */ | ||
| 547 | + { | ||
| 548 | + /* First, clear old write status indication CDONE by writing a ONE to that bit. */ | ||
| 549 | + p_ac97_reg->gsr = ZY_AC97_GSR_CDONE_MSK; | ||
| 550 | + | ||
| 551 | + *p_codec_reg = (unsigned long)data; /* Now the write! */ | ||
| 552 | + | ||
| 553 | + /* Wait until write cycle is complete. There should be a way | ||
| 554 | + * to do this speculatively at the beginning of the procedure. | ||
| 555 | + * Need to discover it. Too inefficient to always wait. | ||
| 556 | + */ | ||
| 557 | + | ||
| 558 | + time_remaining = max_rw_time_out_us; | ||
| 559 | + do | ||
| 560 | + { | ||
| 561 | + udelay(1); | ||
| 562 | + } /* Wait while time remaining and command I/O still incomplete. */ | ||
| 563 | + while ( (time_remaining--) && !(p_ac97_reg->gsr & ZY_AC97_GSR_CDONE_MSK)); | ||
| 564 | + if (!(p_ac97_reg->gsr & ZY_AC97_GSR_CDONE_MSK)) | ||
| 565 | + { | ||
| 566 | + status = ZY_ACODEC_CONTROLLER_INTERFACE_TIMEOUT; | ||
| 567 | + p_ac97_reg->car = ZY_AC97_CAR_CAIP_CLEAR; | ||
| 568 | + } | ||
| 569 | + } /* Got AC link */ | ||
| 570 | + | ||
| 571 | +done: | ||
| 572 | + return(status); | ||
| 573 | +} /* Ac97CtrlCodecWrite() */ | ||
| 574 | + | ||
| 575 | +#define CKENA __REG(0x4134000C) /* A Clock Enable Register */ | ||
| 576 | +#define CKENB __REG(0x41340010) | ||
| 577 | + | ||
| 578 | +zy_acodec_error_t zy_ac97_acodec_read (zy_acocec_context_t *p_dev_context, unsigned short offset, unsigned short *pdata) | ||
| 579 | +{ | ||
| 580 | + zy_acodec_error_t status = ZY_ACODEC_SUCCESS; | ||
| 581 | + int got_link; | ||
| 582 | + unsigned long time_remaining; | ||
| 583 | + volatile unsigned long * p_codec_reg; | ||
| 584 | + p_zy_ac97acodec_t p_ac97_reg = (p_zy_ac97acodec_t)(p_dev_context->p_ctrl_reg); | ||
| 585 | + unsigned long max_rw_time_out_us = (p_dev_context->u_max_read_write_time_out_ms) * 1000; | ||
| 586 | + | ||
| 587 | + /* Point to specified register within area mapped to target codec regs */ | ||
| 588 | + p_codec_reg = &(p_ac97_reg->codec_regs_primary_aud[0]); | ||
| 589 | + p_codec_reg += offset / ZY_AC97_CODEC_REGS_PER_WORD; | ||
| 590 | + | ||
| 591 | + /* Lock the ACLINK */ | ||
| 592 | + time_remaining = ZY_AC97_LOCK_TIMEOUT_DEF; | ||
| 593 | + do | ||
| 594 | + { | ||
| 595 | + got_link = zy_ac97_acodec_link_lock(p_ac97_reg); | ||
| 596 | + if (0 == got_link) /* 1 usec is a long time. Skip delay if possible. */ | ||
| 597 | + { | ||
| 598 | + udelay(1); | ||
| 599 | + } | ||
| 600 | + } /* Wait while time remaining and ACLINK not available */ | ||
| 601 | + while (time_remaining-- && (0 == got_link)); | ||
| 602 | + | ||
| 603 | + if (0 == got_link) /* Didn't get the ACLINK */ | ||
| 604 | + { | ||
| 605 | + status = ZY_ACODEC_CONTROLLER_INTERFACE_TIMEOUT; | ||
| 606 | + printk(KERN_ERR "AC97 Read Link Timeout\n"); | ||
| 607 | + } | ||
| 608 | + else /* We got the link. Perform the write operation and don't wait. */ | ||
| 609 | + { | ||
| 610 | + /* First, clear old read status indications. */ | ||
| 611 | + p_ac97_reg->gsr = ZY_AC97_GSR_SDONE_MSK | ZY_AC97_GSR_RCS_ERR_MSK; | ||
| 612 | + | ||
| 613 | + *pdata = (unsigned short)(*p_codec_reg); /* This is THE DUMMY READ. */ | ||
| 614 | + | ||
| 615 | + /* Wait for read I/O with codec to complete before doing real read. */ | ||
| 616 | + time_remaining = max_rw_time_out_us; | ||
| 617 | + do | ||
| 618 | + { | ||
| 619 | + udelay(1); | ||
| 620 | + } /* Wait while time remaining and read I/O still incomplete */ | ||
| 621 | + while( (time_remaining--) && (!(p_ac97_reg->gsr & ZY_AC97_GSR_SDONE_MSK)) ); | ||
| 622 | + | ||
| 623 | + if ((p_ac97_reg->gsr & ZY_AC97_GSR_SDONE_MSK) && (!(p_ac97_reg->gsr & ZY_AC97_GSR_RCS_ERR_MSK)) ) | ||
| 624 | + { | ||
| 625 | + if (p_ac97_reg->gsr & ZY_AC97_GSR_RCS_ERR_MSK) | ||
| 626 | + {/* timeout indicated by RCS bit */ | ||
| 627 | + status = ZY_ACODEC_CONTROLLER_INTERFACE_TIMEOUT; | ||
| 628 | + } | ||
| 629 | + /* succeed in reading. clear status bits first. */ | ||
| 630 | + p_ac97_reg->gsr = ZY_AC97_GSR_SDONE_MSK | ZY_AC97_GSR_RCS_ERR_MSK; | ||
| 631 | + *pdata = (unsigned short)(*p_codec_reg); /* THE REAL READ. */ | ||
| 632 | + if (*pdata == 0xffff) | ||
| 633 | + {/* timeout indicated by returned value */ | ||
| 634 | + status = ZY_ACODEC_CONTROLLER_INTERFACE_TIMEOUT; | ||
| 635 | + } | ||
| 636 | + /* check later: is second waiting really needed? */ | ||
| 637 | + time_remaining = max_rw_time_out_us; | ||
| 638 | + do | ||
| 639 | + { | ||
| 640 | + udelay(1); | ||
| 641 | + } /* Wait while time remaining and read I/O still incomplete */ | ||
| 642 | + while( (time_remaining--) && (!(p_ac97_reg->gsr & ZY_AC97_GSR_SDONE_MSK)) ); | ||
| 643 | + //printk(KERN_ERR "AC97 Read Result %d\n", (p_ac97_reg->gsr & ZY_AC97_GSR_SDONE_MSK) ); | ||
| 644 | + } | ||
| 645 | + else /* failed */ | ||
| 646 | + { | ||
| 647 | + status = ZY_ACODEC_CONTROLLER_INTERFACE_TIMEOUT; | ||
| 648 | + p_ac97_reg->car = ZY_AC97_CAR_CAIP_CLEAR; | ||
| 649 | + //printk(KERN_ERR "AC97 Read Link Timeout2 %x %x %x\n", CKENA, OSCC, CKENB); | ||
| 650 | + } /* else (OK to do real read) */ | ||
| 651 | + | ||
| 652 | + } /* else (We got the link. Perform the read operations.) */ | ||
| 653 | + | ||
| 654 | + return (status); | ||
| 655 | +} | ||
| 656 | + | ||
| 657 | + | ||
| 658 | + | ||
| 659 | +zy_acodec_error_t zy_acodec_get_adc_sample(zy_acocec_context_t *p_device_context, unsigned short *p_sample_data, unsigned short adc_type, int *p_pen_down) | ||
| 660 | +{ | ||
| 661 | + zy_acodec_error_t status = ZY_ACODEC_SUCCESS; | ||
| 662 | + unsigned short value; | ||
| 663 | + unsigned long wait; | ||
| 664 | + | ||
| 665 | + if (adc_type == ZY_TOUCH_SAMPLE_X) | ||
| 666 | + { | ||
| 667 | + value = 0x202; | ||
| 668 | + } | ||
| 669 | + else | ||
| 670 | + {/* Y sample */ | ||
| 671 | + value = 0x204; | ||
| 672 | + } | ||
| 673 | + | ||
| 674 | + status = zy_ac97_acodec_write(p_device_context, DIGITIZER_1_WM13, value); | ||
| 675 | + | ||
| 676 | + wait = 0; | ||
| 677 | + do | ||
| 678 | + { | ||
| 679 | + status = zy_ac97_acodec_read(p_device_context, DIGITIZER_1_WM13, &value); | ||
| 680 | + if ( !(value & 0x200 ) ) | ||
| 681 | + { | ||
| 682 | + break; | ||
| 683 | + } | ||
| 684 | + }while ( 100 > wait++ ); | ||
| 685 | + | ||
| 686 | + status = zy_ac97_acodec_read(p_device_context, DIGITIZER_READ_BACK, &value); | ||
| 687 | + if (value & 0x8000) | ||
| 688 | + {/* means pen down */ | ||
| 689 | + *p_pen_down = 1; | ||
| 690 | + } | ||
| 691 | + else | ||
| 692 | + { | ||
| 693 | + *p_pen_down = 0; | ||
| 694 | + } | ||
| 695 | + *p_sample_data = value & 0xfff; | ||
| 696 | + | ||
| 697 | + return status; | ||
| 698 | +} | ||
| 699 | + | ||
| 700 | + | ||
| 701 | + | ||
| 702 | +/* | ||
| 703 | + * add a touch event | ||
| 704 | + */ | ||
| 705 | +static int codec_zy_ts_evt_add(codec_zy_ts_t* ts, u16 pressure, u16 x, u16 y) | ||
| 706 | +{ | ||
| 707 | + /* add event and remove adc src bits */ | ||
| 708 | + static u16 pre_press = 0; | ||
| 709 | + | ||
| 710 | + input_report_abs(ts->idev, ABS_X, x & 0xfff); | ||
| 711 | + input_report_abs(ts->idev, ABS_Y, y & 0xfff); | ||
| 712 | + if (pressure == pre_press){ | ||
| 713 | + pressure--; | ||
| 714 | + } | ||
| 715 | + pre_press = pressure; | ||
| 716 | + input_report_abs(ts->idev, ABS_PRESSURE, pressure & 0xfff); | ||
| 717 | + input_sync(ts->idev); | ||
| 718 | +#ifdef CONFIG_IPM | ||
| 719 | + ipm_event_notify(IPM_EVENT_UI, IPM_EVENT_DEVICE_TSI, NULL, 0); | ||
| 720 | +#endif | ||
| 721 | + return 0; | ||
| 722 | +} | ||
| 723 | + | ||
| 724 | +/* | ||
| 725 | + * add a pen up event | ||
| 726 | + */ | ||
| 727 | +static void codec_zy_ts_evt_release(codec_zy_ts_t* ts) | ||
| 728 | +{ | ||
| 729 | + input_report_abs(ts->idev, ABS_PRESSURE, 0); | ||
| 730 | + input_sync(ts->idev); | ||
| 731 | + | ||
| 732 | +#ifdef CONFIG_IPM | ||
| 733 | + ipm_event_notify(IPM_EVENT_UI, IPM_EVENT_DEVICE_TSI, NULL, 0); | ||
| 734 | +#endif | ||
| 735 | + p_zy_codec_ctxt->g_pfn_event_ack(p_zy_codec_ctxt,ZY_EVENT_TYPE_PDN); | ||
| 736 | +} | ||
| 737 | + | ||
| 738 | +/* | ||
| 739 | + * Kill the touchscreen thread and stop | ||
| 740 | + * the touch digitiser. | ||
| 741 | + */ | ||
| 742 | +static void codec_zy_ts_input_close(struct input_dev *idev) | ||
| 743 | +{ | ||
| 744 | + codec_zy_ts_t *ts = (codec_zy_ts_t *) &codec_zy_ts; | ||
| 745 | + | ||
| 746 | +#ifdef CONFIG_PM | ||
| 747 | + if(touch_suspend){ | ||
| 748 | + pr_info("touch is suspended!\n"); | ||
| 749 | + return -1; | ||
| 750 | + } | ||
| 751 | +#endif | ||
| 752 | + dbg("close ts input!\n"); | ||
| 753 | + if (--ts->use_count == 0) { | ||
| 754 | + del_timer(ts->timer); | ||
| 755 | + if (ts->timer != NULL) | ||
| 756 | + kfree(ts->timer); | ||
| 757 | + p_zy_codec_ctxt->g_pfn_disable_touch(p_zy_codec_ctxt); | ||
| 758 | + } | ||
| 759 | +} | ||
| 760 | + | ||
| 761 | +/* | ||
| 762 | + * Sample the touchscreen | ||
| 763 | + */ | ||
| 764 | +int ac97_poll_touch(codec_zy_ts_t *ts) | ||
| 765 | +{ | ||
| 766 | + unsigned short x=0, y=0; | ||
| 767 | + int if_down= 0; | ||
| 768 | + zy_acodec_error_t status = ZY_ACODEC_SUCCESS; | ||
| 769 | + | ||
| 770 | +#ifdef DEBUG | ||
| 771 | + start_time = OSCR; | ||
| 772 | +#endif | ||
| 773 | + | ||
| 774 | + /* get x value */ | ||
| 775 | + status = zy_acodec_get_adc_sample(p_zy_codec_ctxt, &x, ZY_TOUCH_SAMPLE_X, &if_down); | ||
| 776 | + if (ZY_ACODEC_SUCCESS != status ){ | ||
| 777 | + return -EIO; | ||
| 778 | + } | ||
| 779 | + dbg("x:0x%x\n", x); | ||
| 780 | + | ||
| 781 | + /* the pen is up */ | ||
| 782 | + if (1 != if_down){ | ||
| 783 | + return PEN_UP; | ||
| 784 | + } | ||
| 785 | + | ||
| 786 | + /* get y vaule */ | ||
| 787 | + status = zy_acodec_get_adc_sample(p_zy_codec_ctxt, &y, ZY_TOUCH_SAMPLE_Y, &if_down); | ||
| 788 | + if (ZY_ACODEC_SUCCESS != status ){ | ||
| 789 | + return -EIO; | ||
| 790 | + } | ||
| 791 | + dbg("y:0x%x\n",y); | ||
| 792 | + | ||
| 793 | + /* the pen is up */ | ||
| 794 | + if (1 != if_down){ | ||
| 795 | + return PEN_UP; | ||
| 796 | + } | ||
| 797 | + | ||
| 798 | + /* the pen is down, can not get the pressure value, | ||
| 799 | + * so if pen is down, give the max pressure value | ||
| 800 | + */ | ||
| 801 | + codec_zy_ts_evt_add(ts,0xfff, x, y); | ||
| 802 | + | ||
| 803 | +#ifdef DEBUG | ||
| 804 | + end_time = OSCR; | ||
| 805 | + PRINT_TIME(); | ||
| 806 | +#endif | ||
| 807 | + | ||
| 808 | + return PEN_DOWN; | ||
| 809 | +} | ||
| 810 | + | ||
| 811 | +static void touch_timer_handler(unsigned long unused) | ||
| 812 | +{ | ||
| 813 | + int event; | ||
| 814 | + codec_zy_ts_t *ts = &codec_zy_ts; | ||
| 815 | + | ||
| 816 | + event = ac97_poll_touch(ts); | ||
| 817 | + | ||
| 818 | + if (event == PEN_DOWN) { | ||
| 819 | + dbg("pen down!\n"); | ||
| 820 | + ts->timer->expires = jiffies + TS_SAMPLE_INTERVAL; | ||
| 821 | + add_timer(ts->timer); | ||
| 822 | + } else if(event == PEN_UP) { | ||
| 823 | + dbg("pen up!\n"); | ||
| 824 | + codec_zy_ts_evt_release(ts); | ||
| 825 | + } else if(event == -EIO) { | ||
| 826 | + printk(KERN_ERR "Access touch interface error!\n"); | ||
| 827 | + } | ||
| 828 | + return; | ||
| 829 | +} | ||
| 830 | + | ||
| 831 | +static zy_acodec_error_t zy_ac97_acodec_cold_reset(zy_acocec_context_t * p_ac97_ctxt) | ||
| 832 | +{ | ||
| 833 | + zy_acodec_error_t status = ZY_ACODEC_SUCCESS; | ||
| 834 | + p_zy_ac97acodec_t p_ac97 = (p_zy_ac97acodec_t)(p_ac97_ctxt->p_ctrl_reg); | ||
| 835 | + int pri_codec_ready; | ||
| 836 | + unsigned long time_remaining; | ||
| 837 | + | ||
| 838 | + p_ac97->gcr = 0; | ||
| 839 | + p_ac97->gcr |= ZY_AC97_GCR_CLKBPB_MSK; | ||
| 840 | + /* Hold reset active for a minimum time */ | ||
| 841 | + udelay(ZY_AC97_COLD_HOLDTIME); | ||
| 842 | + p_ac97->gcr &= ~ZY_AC97_GCR_CLKBPB_MSK; | ||
| 843 | + | ||
| 844 | + /* Deactivate cold reset condition */ | ||
| 845 | + p_ac97->gcr |= (ZY_AC97_GCR_COLD_RESET_MSK | ZY_AC97_GCR_WARM_RESET_MSK); | ||
| 846 | + | ||
| 847 | + | ||
| 848 | + pri_codec_ready = 0; | ||
| 849 | + time_remaining = (p_ac97_ctxt->u_max_setup_time_out_ms) * 10; | ||
| 850 | + do | ||
| 851 | + { | ||
| 852 | + udelay(1); | ||
| 853 | + if (p_ac97->gsr & ZY_AC97_GSR_PCRDY_MSK) | ||
| 854 | + pri_codec_ready = 1; | ||
| 855 | + } | ||
| 856 | + while (time_remaining-- && (pri_codec_ready == 0)); | ||
| 857 | + | ||
| 858 | + /* Timeout status if some of the devices weren't ready. */ | ||
| 859 | + if (pri_codec_ready == 0) | ||
| 860 | + { | ||
| 861 | + status = ZY_ACODEC_CONTROLLER_INTERFACE_TIMEOUT; | ||
| 862 | + } | ||
| 863 | + | ||
| 864 | + return (status); | ||
| 865 | +} | ||
| 866 | + | ||
| 867 | + | ||
| 868 | +zy_acodec_error_t zy_ac97_acodec_init(zy_acocec_context_t *p_ac97_ctxt) | ||
| 869 | +{ | ||
| 870 | + zy_acodec_error_t status ; | ||
| 871 | + | ||
| 872 | + status = zy_ac97_acodec_cold_reset(p_ac97_ctxt); | ||
| 873 | + | ||
| 874 | + return (status); | ||
| 875 | +} | ||
| 876 | + | ||
| 877 | + | ||
| 878 | +/* | ||
| 879 | + * Start the touchscreen thread and | ||
| 880 | + * the touch digitiser. | ||
| 881 | + */ | ||
| 882 | +static int codec_zy_ts_input_open(struct input_dev *idev) | ||
| 883 | +{ | ||
| 884 | + codec_zy_ts_t *ts = (codec_zy_ts_t *) &codec_zy_ts; | ||
| 885 | + | ||
| 886 | +#ifdef CONFIG_PM | ||
| 887 | + if(touch_suspend){ | ||
| 888 | + pr_info("touch is suspended!\n"); | ||
| 889 | + return -1; | ||
| 890 | + } | ||
| 891 | +#endif | ||
| 892 | + | ||
| 893 | + if (ts->use_count++ > 0) | ||
| 894 | + return 0; | ||
| 895 | + | ||
| 896 | + dbg("Touch is opened. Use count: %d\n", ts->use_count); | ||
| 897 | + ts->idev = idev; | ||
| 898 | + ts->timer = kmalloc(sizeof(struct timer_list), GFP_KERNEL); | ||
| 899 | + if (!ts->timer) { | ||
| 900 | + printk(KERN_ERR "Alloc memory error for timer!\n"); | ||
| 901 | + return -ENOMEM; | ||
| 902 | + } | ||
| 903 | + | ||
| 904 | + init_timer(ts->timer); | ||
| 905 | + ts->timer->function = touch_timer_handler; | ||
| 906 | + ts->timer->data = 0; | ||
| 907 | + p_zy_codec_ctxt->g_pfn_enable_touch(p_zy_codec_ctxt); | ||
| 908 | + | ||
| 909 | + return 0; | ||
| 910 | +} | ||
| 911 | + | ||
| 912 | +/* | ||
| 913 | + * initilze the pxa touch screen | ||
| 914 | + */ | ||
| 915 | +static int alsa_ts_init( void ) | ||
| 916 | +{ | ||
| 917 | + codec_zy_ts_t* ts = &codec_zy_ts; | ||
| 918 | + | ||
| 919 | + memset(ts, 0, sizeof(codec_zy_ts_t)); | ||
| 920 | + | ||
| 921 | + codec_zy_ts_input = input_allocate_device(); | ||
| 922 | + if (!codec_zy_ts_input) | ||
| 923 | + return -ENOMEM; | ||
| 924 | + | ||
| 925 | + | ||
| 926 | + /* tell input system what we events we accept and register */ | ||
| 927 | + codec_zy_ts_input->name = "codec zy touchscreen"; | ||
| 928 | + codec_zy_ts_input->open = codec_zy_ts_input_open; | ||
| 929 | + codec_zy_ts_input->close = codec_zy_ts_input_close; | ||
| 930 | + __set_bit(EV_ABS, codec_zy_ts_input->evbit); | ||
| 931 | + __set_bit(ABS_X, codec_zy_ts_input->absbit); | ||
| 932 | + __set_bit(ABS_Y, codec_zy_ts_input->absbit); | ||
| 933 | + __set_bit(ABS_PRESSURE, codec_zy_ts_input->absbit); | ||
| 934 | + input_register_device(codec_zy_ts_input); | ||
| 935 | + | ||
| 936 | + return 0; | ||
| 937 | +} | ||
| 938 | + | ||
| 939 | +static irqreturn_t pxa_touch_irq(int irq, void *dev) | ||
| 940 | +{ | ||
| 941 | + unsigned char event_type; | ||
| 942 | + | ||
| 943 | + //printk(KERN_ERR "%s: enter codec event handler\n", __FUNCTION__); | ||
| 944 | + | ||
| 945 | + dbg("%s: enter codec event handler\n", __FUNCTION__); | ||
| 946 | + p_zy_codec_ctxt->g_pfn_get_event(p_zy_codec_ctxt, &event_type); | ||
| 947 | + switch (event_type) { | ||
| 948 | + case ZY_EVENT_TYPE_PDN: | ||
| 949 | + { | ||
| 950 | + codec_zy_ts_t *ts = &codec_zy_ts; | ||
| 951 | + /*if the touch is not open need not acknowledge the event*/ | ||
| 952 | + if (ts->use_count <= 0) | ||
| 953 | + break; | ||
| 954 | + ts->timer->expires = jiffies + TS_SAMPLE_INTERVAL; | ||
| 955 | + add_timer(ts->timer); | ||
| 956 | + break; | ||
| 957 | + } | ||
| 958 | + default: | ||
| 959 | + printk("unsupported codec event:0x%x\n", event_type); | ||
| 960 | + } | ||
| 961 | + | ||
| 962 | + return IRQ_HANDLED; | ||
| 963 | +} | ||
| 964 | + | ||
| 965 | + | ||
| 966 | + | ||
| 967 | + | ||
| 968 | + | ||
| 969 | + | ||
| 970 | + | ||
| 971 | + | ||
| 972 | + | ||
| 973 | +static mfp_cfg_t extra_cfg[] = { | ||
| 974 | + MFP_CFG_X(GPIO17, AF3, DS03X, PULL_LOW), | ||
| 975 | + MFP_CFG_X(GPIO25, AF0, DS01X, PULL_LOW), | ||
| 976 | +}; | ||
| 977 | + | ||
| 978 | +#define ARRAY_AND_SIZE(x) (x), ARRAY_SIZE(x) | ||
| 979 | + | ||
| 980 | +extern void dump_mfp(void); | ||
| 981 | + | ||
| 982 | +zy_acodec_error_t zy_ac97_acodec_mfp_init(zy_acocec_context_t *p_device_context) | ||
| 983 | +{ | ||
| 984 | + unsigned short codec_id; | ||
| 985 | + | ||
| 986 | + //mhn_mfp_set_afds(MFP_RSVD_AC97_SDATA_IN_0, MFP_AF0, MFP_DS03X); | ||
| 987 | + //enable_ac97_pins(); | ||
| 988 | + zy_ac97_acodec_init(p_device_context); | ||
| 989 | + if (zy_ac97_acodec_read(p_device_context, 0x0, &codec_id)){ | ||
| 990 | + | ||
| 991 | + /* | ||
| 992 | + * there is a bug on MonahansL/MonhansPL PC card: AC97_SDATA_IN is not connected to CODEC | ||
| 993 | + * ECO 72: Connect PWM_0(MFP_RSVD_AC97_SDATA_IN_0) to CODEC as AC97_SDATA_IN | ||
| 994 | + */ | ||
| 995 | + | ||
| 996 | + //mhn_mfp_set_afds(MFP_RSVD_AC97_SDATA_IN_0, MFP_RSVD_AC97_SDATA_IN_0_AF, MFP_DS03X); | ||
| 997 | + //mhn_mfp_set_afds(MFP_AC97_SDATA_IN_0, MFP_AF0, MFP_DS01X); | ||
| 998 | + | ||
| 999 | + gpio_direction_output(mfp_to_gpio(MFP_PIN_GPIO17), 0); | ||
| 1000 | + pxa3xx_mfp_config(ARRAY_AND_SIZE(extra_cfg)); | ||
| 1001 | + gpio_direction_input(mfp_to_gpio(MFP_PIN_GPIO25)); | ||
| 1002 | + } | ||
| 1003 | + | ||
| 1004 | + | ||
| 1005 | + return ZY_ACODEC_SUCCESS; | ||
| 1006 | +} | ||
| 1007 | + | ||
| 1008 | +#define ZY_AC97_WM9713_GPIO_PIN_PDN ( 0x1 << 13 ) /* Pen down */ | ||
| 1009 | + | ||
| 1010 | +/*power enable bit in 3ch and 3eh */ | ||
| 1011 | +/*3ch */ | ||
| 1012 | +#define ZY_AC97_9713_PWR_PADCPD ( 0x1 << 15 ) | ||
| 1013 | +#define ZY_AC97_9713_PWR_VMID ( 0x1 << 14 ) | ||
| 1014 | +#define ZY_AC97_9713_PWR_TSHUT ( 0x1 << 13 ) | ||
| 1015 | +#define ZY_AC97_9713_PWR_VXDAC ( 0x1 << 12 ) | ||
| 1016 | +#define ZY_AC97_9713_PWR_AUXDAC ( 0x1 << 11 ) | ||
| 1017 | +#define ZY_AC97_9713_PWR_MBIAS ( 0x1 << 10 ) | ||
| 1018 | +#define ZY_AC97_9713_PWR_PLL ( 0x1 << 9 ) | ||
| 1019 | +#define ZY_AC97_9713_PWR_DACL ( 0x1 << 7 ) | ||
| 1020 | +#define ZY_AC97_9713_PWR_DACR ( 0x1 << 6 ) | ||
| 1021 | +#define ZY_AC97_9713_PWR_ADCL ( 0x1 << 5 ) | ||
| 1022 | +#define ZY_AC97_9713_PWR_ADCR ( 0x1 << 4 ) | ||
| 1023 | +#define ZY_AC97_9713_PWR_HPLX ( 0x1 << 3 ) | ||
| 1024 | +#define ZY_AC97_9713_PWR_HPRX ( 0x1 << 2 ) | ||
| 1025 | +#define ZY_AC97_9713_PWR_SPKX ( 0x1 << 1 ) | ||
| 1026 | +#define ZY_AC97_9713_PWR_MX ( 0x1 << 0 ) | ||
| 1027 | + | ||
| 1028 | +/*3EH */ | ||
| 1029 | +#define ZY_AC97_9713_PWR_MCD ( 0x1 << 15 ) | ||
| 1030 | +#define ZY_AC97_9713_PWR_MICBIAS ( 0x1 << 14 ) | ||
| 1031 | +#define ZY_AC97_9713_PWR_MONO ( 0x1 << 13 ) | ||
| 1032 | +#define ZY_AC97_9713_PWR_OUT4 ( 0x1 << 12 ) | ||
| 1033 | +#define ZY_AC97_9713_PWR_OUT3 ( 0x1 << 11 ) | ||
| 1034 | +#define ZY_AC97_9713_PWR_HPL ( 0x1 << 10 ) | ||
| 1035 | +#define ZY_AC97_9713_PWR_HPR ( 0x1 << 9 ) | ||
| 1036 | +#define ZY_AC97_9713_PWR_SPKL ( 0x1 << 8 ) | ||
| 1037 | +#define ZY_AC97_9713_PWR_SPKR ( 0x1 << 7 ) | ||
| 1038 | +#define ZY_AC97_9713_PWR_LL ( 0x1 << 6 ) | ||
| 1039 | +#define ZY_AC97_9713_PWR_LR ( 0x1 << 5 ) | ||
| 1040 | +#define ZY_AC97_9713_PWR_MOIN ( 0x1 << 4 ) | ||
| 1041 | +#define ZY_AC97_9713_PWR_MA ( 0x1 << 3 ) | ||
| 1042 | +#define ZY_AC97_9713_PWR_MB ( 0x1 << 2 ) | ||
| 1043 | +#define ZY_AC97_9713_PWR_MPA ( 0x1 << 1 ) | ||
| 1044 | +#define ZY_AC97_9713_PWR_MPB ( 0x1 << 0 ) | ||
| 1045 | + | ||
| 1046 | + | ||
| 1047 | +void zy_wm9713_get_event(zy_acocec_context_t *p_device_context, unsigned char * event_type) | ||
| 1048 | +{ | ||
| 1049 | + unsigned short event_state = 0; | ||
| 1050 | + zy_ac97_acodec_read(p_device_context, GPIO_PIN_STATUS, &event_state); | ||
| 1051 | + if(event_state & ZY_AC97_WM9713_GPIO_PIN_PDN){ | ||
| 1052 | + *event_type = ZY_EVENT_TYPE_PDN; | ||
| 1053 | + return; | ||
| 1054 | + } | ||
| 1055 | + return; | ||
| 1056 | +} | ||
| 1057 | + | ||
| 1058 | +void zy_wm9713_event_ack(zy_acocec_context_t *p_device_context, unsigned char event_type) | ||
| 1059 | +{ | ||
| 1060 | + unsigned short event_state = 0; | ||
| 1061 | + zy_ac97_acodec_read(p_device_context, GPIO_PIN_STATUS, &event_state); | ||
| 1062 | + if( event_type == ZY_EVENT_TYPE_PDN){ | ||
| 1063 | + zy_ac97_acodec_write(p_device_context, | ||
| 1064 | + GPIO_PIN_STATUS, | ||
| 1065 | + (event_state & (~ZY_AC97_WM9713_GPIO_PIN_PDN))); | ||
| 1066 | + } | ||
| 1067 | + | ||
| 1068 | + zy_ac97_acodec_read(p_device_context, GPIO_PIN_STATUS, &event_state); | ||
| 1069 | + return; | ||
| 1070 | +} | ||
| 1071 | + | ||
| 1072 | +static void * p_saved_memory = NULL; | ||
| 1073 | +static void * p_zy_scenario = NULL; | ||
| 1074 | +static p_zy_acocec_context_t p_zy_ctxt = NULL; | ||
| 1075 | + | ||
| 1076 | +#define WM9713_SAVE_REGISTER_NO (64-11) | ||
| 1077 | +typedef struct { | ||
| 1078 | + unsigned short wm9713RegisterContext [WM9713_SAVE_REGISTER_NO + 1]; /* Fixed (data misalignment error) */ | ||
| 1079 | +}ZY_9713_CONTEXT_SAVE_T; | ||
| 1080 | + | ||
| 1081 | + | ||
| 1082 | +/** | ||
| 1083 | + * alsa_prepare_for_zy - create and initialize the p_zy_acocec_context_t | ||
| 1084 | + * open the clock of data link | ||
| 1085 | + * @p_p_zy_ctxt: return the data structure p_zy_acocec_context_t | ||
| 1086 | + * return: 0 success ; -ENOMEM | ||
| 1087 | + **/ | ||
| 1088 | +int alsa_prepare_for_zy(p_zy_acocec_context_t * p_p_zy_ctxt) | ||
| 1089 | +{ | ||
| 1090 | + if (p_zy_ctxt) { | ||
| 1091 | + p_zy_ctxt->use_count++; | ||
| 1092 | + *p_p_zy_ctxt = p_zy_ctxt; | ||
| 1093 | + return 0; | ||
| 1094 | + } | ||
| 1095 | + | ||
| 1096 | + p_zy_ctxt = kzalloc(sizeof(zy_acocec_context_t), GFP_KERNEL); | ||
| 1097 | + if (!p_zy_ctxt) | ||
| 1098 | + return -ENOMEM; | ||
| 1099 | + | ||
| 1100 | + /* enable CLK_POUT as CODEC clock input */ | ||
| 1101 | + OSCC |= 0x800; | ||
| 1102 | + | ||
| 1103 | + p_saved_memory = kzalloc(sizeof(ZY_9713_CONTEXT_SAVE_T) + | ||
| 1104 | + sizeof(zy_ac97_save_context_t), GFP_KERNEL); | ||
| 1105 | + if (NULL == p_saved_memory) { | ||
| 1106 | + if (p_zy_ctxt) | ||
| 1107 | + kfree(p_zy_ctxt); | ||
| 1108 | + return -ENOMEM; | ||
| 1109 | + } | ||
| 1110 | + | ||
| 1111 | + p_zy_ctxt->acodec_id = (zy_acodec_device_id_t) (WM_9713_ID); | ||
| 1112 | + p_zy_ctxt->use_count++; | ||
| 1113 | + /* | ||
| 1114 | + p_zy_ctxt->pMfpRegBase = (unsigned long) (MFP_BASE); | ||
| 1115 | + p_zy_ctxt->pMfpRmDb = ZY_MFP_RM_DATABASE; | ||
| 1116 | + p_zy_ctxt->p_ost_regs = OST_BASE; | ||
| 1117 | + */ | ||
| 1118 | + p_zy_ctxt->p_voice_reg = NULL; | ||
| 1119 | + p_zy_ctxt->p_hifi_reg = (void *) (&POCR); | ||
| 1120 | + p_zy_ctxt->p_ctrl_reg = (void *) (&POCR); | ||
| 1121 | + p_zy_ctxt->u_max_read_write_time_out_ms = ZY_AC97_RW_TIMEOUT_DEF; | ||
| 1122 | + p_zy_ctxt->u_max_setup_time_out_ms = ZY_AC97_SETUP_TIMEOUT_DEF; | ||
| 1123 | + p_zy_ctxt->p_save_memory = p_saved_memory; | ||
| 1124 | + p_zy_ctxt->p_zy_scenario = p_zy_scenario; | ||
| 1125 | +// pxa_set_cken(24, 1); | ||
| 1126 | + CKENA |= (1 << 24); | ||
| 1127 | + AC97_DIV = 1625<<12 | 128; | ||
| 1128 | +#ifdef DEBUG_ALSA_ZY | ||
| 1129 | + debug_pac97ctxt = p_zy_ctxt; | ||
| 1130 | + misc_register(&audio_dev); | ||
| 1131 | +#endif | ||
| 1132 | + | ||
| 1133 | + (*p_p_zy_ctxt) = p_zy_ctxt; | ||
| 1134 | + | ||
| 1135 | + return 0; | ||
| 1136 | +} | ||
| 1137 | + | ||
| 1138 | + | ||
| 1139 | +/* this is platform specific */ | ||
| 1140 | +/* do later: not to enable recording route and playback route in this function, | ||
| 1141 | + * leave it to driver to call other function | ||
| 1142 | + */ | ||
| 1143 | +zy_acodec_error_t zy_wm9713_specific_init (zy_acocec_context_t *p_device_context) | ||
| 1144 | +{ | ||
| 1145 | + | ||
| 1146 | + unsigned short value; | ||
| 1147 | + | ||
| 1148 | + /* this assumes that the aclink is initialized wait some time and then | ||
| 1149 | + * do a warm reset to enabled the ACLINK, required for wm9713 | ||
| 1150 | + * (not wm9712 or ucb1400) | ||
| 1151 | + */ | ||
| 1152 | + | ||
| 1153 | + /* pay attention: whether the workaround is still needed? */ | ||
| 1154 | + p_zy_ac97acodec_t p_ac97_reg = (p_zy_ac97acodec_t)(p_device_context->p_ctrl_reg); | ||
| 1155 | + | ||
| 1156 | + p_ac97_reg->gcr |= ZY_AC97_GCR_WARM_RESET_MSK; | ||
| 1157 | + | ||
| 1158 | + mdelay(5); | ||
| 1159 | + | ||
| 1160 | + /* power on all the necessary unit */ | ||
| 1161 | + zy_ac97_acodec_write(p_device_context,POWERDOWN_CTRL_STAT, 0x000); /*26*/ | ||
| 1162 | + /* open left headphone mixer */ | ||
| 1163 | + /* open right headphone mixer */ | ||
| 1164 | + /* open right/left dac */ | ||
| 1165 | + /* open right/left adc */ | ||
| 1166 | + /* open temperature sensor */ | ||
| 1167 | + /* enable reference generator */ | ||
| 1168 | + zy_ac97_acodec_write(p_device_context,POWER_DOWN_1, 0xda00); /*3c */ | ||
| 1169 | + /* open microphone bias */ | ||
| 1170 | + /* open HPL output PGA */ | ||
| 1171 | + /* open HPR output PGA */ | ||
| 1172 | + /* open mic PGA MA */ | ||
| 1173 | + /* open mic pre-amp MPA */ | ||
| 1174 | + /* if here we enable SPKL and SPKR PGA, then Touch screen will doesn't work */ | ||
| 1175 | + zy_ac97_acodec_write(p_device_context,POWER_DOWN_2,0xb9f5); /*3e */ | ||
| 1176 | + | ||
| 1177 | + /* recording route and microphone input */ | ||
| 1178 | + /* microphone selection, now fixed to MIC1 input and mic bias output */ | ||
| 1179 | + /* MIC1 only, MICBIAS enable */ | ||
| 1180 | + zy_ac97_acodec_write (p_device_context, MIC_BIAS, 0xC440); /*0x22h*/ | ||
| 1181 | + | ||
| 1182 | + /* mic pga setting to mixer (side tone) */ | ||
| 1183 | + /* comment the below code to make MICA/B play back volume gain + 0db */ | ||
| 1184 | + /* zy_ac97_acodec_write (p_device_context, MIC_PGA_VOLUME, 0x0000); */ /*0x0eh*/ | ||
| 1185 | + | ||
| 1186 | + /* recording side tone and ADC boost, now fixed to default (14h) */ | ||
| 1187 | + /* recording volume 0dB */ | ||
| 1188 | + zy_ac97_acodec_write(p_device_context, REC_PGA_VOL, 0x0); /*12*/ | ||
| 1189 | + | ||
| 1190 | + /* hifi playback route and output mixer */ | ||
| 1191 | + /* by default, fixed to enable headphone only */ | ||
| 1192 | + | ||
| 1193 | + /* comment the below code to make SPEAKER default MUTE */ | ||
| 1194 | + zy_ac97_acodec_write (p_device_context, SPEAKER_VOLUME, 0x0); /*02*/ | ||
| 1195 | + | ||
| 1196 | + /* comment the below code to make OUT3_OUT4 default MUTE */ | ||
| 1197 | + /* zy_ac97_acodec_write (p_device_context, OUT3_OUT4_VOLUME, 0x8000); */ /*06*/ | ||
| 1198 | + | ||
| 1199 | + /* remove all the mute bit volume gain + 0db */ | ||
| 1200 | + zy_ac97_acodec_write(p_device_context, HEADPHONE_VOLUME, 0x0); /*04*/ | ||
| 1201 | + | ||
| 1202 | + /* DAC route */ | ||
| 1203 | + /* open DAC to headphone mixer path */ | ||
| 1204 | + /* left DAC gain +0db */ | ||
| 1205 | + /* right DAC gain +0db */ | ||
| 1206 | + zy_ac97_acodec_write(p_device_context, DAC_PGA_VOL_ROUTE,0x0808); /*0c*/ | ||
| 1207 | + | ||
| 1208 | + /* out3 configure, invert to HPMIXR */ | ||
| 1209 | + /* zy_ac97_acodec_write(p_device_context,DAC_3D_CTRL_INV_MUX_SEL, 0x8000); */ /*1e*/ | ||
| 1210 | + | ||
| 1211 | + /* output control */ | ||
| 1212 | + /* select HPMIXR HPMIXL out */ | ||
| 1213 | + /* other out are all VIM */ | ||
| 1214 | + zy_ac97_acodec_write(p_device_context,OUTPUT_PGA_MUX, 0x9BA8); /*1c*/ | ||
| 1215 | + | ||
| 1216 | + /* set sample rates */ | ||
| 1217 | + /* enable variable rate conversion */ | ||
| 1218 | + zy_ac97_acodec_write(p_device_context, EXTENDED_AUD_STAT_CTRL , 0x1); /*2a*/ | ||
| 1219 | + /* DAC 44kHZ */ | ||
| 1220 | + zy_ac97_acodec_write(p_device_context,AUDIO_DAC_RATE,0xac44); /*2c*/ | ||
| 1221 | + /* ADC 16KHZ */ | ||
| 1222 | + zy_ac97_acodec_write(p_device_context,AUDIO_ADC_RATE,0x3E80); /*32*/ | ||
| 1223 | + | ||
| 1224 | + /* clock scheme, use external clock, it is 24MHZ from MCLK_A */ | ||
| 1225 | + | ||
| 1226 | + | ||
| 1227 | + zy_ac97_acodec_read(p_device_context, MCLK_PLL_CTRL_1, &value); | ||
| 1228 | + zy_ac97_acodec_write(p_device_context, MCLK_PLL_CTRL_1, value | 0x2); | ||
| 1229 | + | ||
| 1230 | + return ZY_ACODEC_SUCCESS; | ||
| 1231 | +} | ||
| 1232 | + | ||
| 1233 | +zy_acodec_error_t zy_wm9713_specific_deinit (zy_acocec_context_t *p_device_context) | ||
| 1234 | +{/* do later: shut down all power */ | ||
| 1235 | + unsigned short value = 0; | ||
| 1236 | + | ||
| 1237 | + /* close the power of all units */ | ||
| 1238 | + zy_ac97_acodec_write(p_device_context, POWER_DOWN_1, 0xffff); | ||
| 1239 | + zy_ac97_acodec_write(p_device_context, POWER_DOWN_2, 0xffff); | ||
| 1240 | + zy_ac97_acodec_read(p_device_context, POWER_DOWN_1, &value); | ||
| 1241 | + value &= ~(ZY_AC97_9713_PWR_MBIAS); | ||
| 1242 | + zy_ac97_acodec_write(p_device_context, POWER_DOWN_1, value); | ||
| 1243 | + | ||
| 1244 | + return ZY_ACODEC_SUCCESS; | ||
| 1245 | +} | ||
| 1246 | + | ||
| 1247 | +zy_acodec_error_t zy_acodec_set_pen_down_interrupt(zy_acocec_context_t *p_device_context, int enable) | ||
| 1248 | +{/* disable/enable pen down interrupt in the codec. This function is not implemented for Wm9713 */ | ||
| 1249 | + /* because the pen down detection could not be disabled in codec */ | ||
| 1250 | + return ZY_ACODEC_SUCCESS; | ||
| 1251 | +} | ||
| 1252 | + | ||
| 1253 | +zy_acodec_error_t zy_wm9713_enable_touch(zy_acocec_context_t *p_device_context) | ||
| 1254 | +{/* enable touch functionality in the codec */ | ||
| 1255 | + zy_acodec_error_t status = ZY_ACODEC_SUCCESS; | ||
| 1256 | + unsigned short value; | ||
| 1257 | + | ||
| 1258 | + /* power setting */ | ||
| 1259 | + status = zy_ac97_acodec_read(p_device_context, POWER_DOWN_1, &value); | ||
| 1260 | + value &= ~(ZY_AC97_9713_PWR_PADCPD); | ||
| 1261 | + status = zy_ac97_acodec_write(p_device_context, POWER_DOWN_1, value); | ||
| 1262 | + | ||
| 1263 | + /* basic touch setting */ | ||
| 1264 | + status = zy_ac97_acodec_write(p_device_context, DIGITIZER_3_WM13, 0xc008); | ||
| 1265 | + status = zy_ac97_acodec_write(p_device_context, DIGITIZER_2_WM13, 0x6); | ||
| 1266 | + | ||
| 1267 | + | ||
| 1268 | + /* 9713 powerdown virtual gpio setting (polarity, sticky, wakeup) */ | ||
| 1269 | + /* 9713 gpio 2(pin45) route to IRQ */ | ||
| 1270 | + /* Notes: Can use defaults for IRQ polarity, PENDOWN polarity in IRQ, */ | ||
| 1271 | + /* sticky for PENDOWN in IRQ and wakeup for PENDOWN. */ | ||
| 1272 | + status = zy_ac97_acodec_read(p_device_context, GPIO_PIN_CFG, &value); | ||
| 1273 | + value &= ~(0x4); | ||
| 1274 | + status = zy_ac97_acodec_write(p_device_context, GPIO_PIN_CFG, value); | ||
| 1275 | + | ||
| 1276 | + status = zy_ac97_acodec_read(p_device_context, GPIO_PIN_SHARING, &value); | ||
| 1277 | + value &= ~(0x4); | ||
| 1278 | + status = zy_ac97_acodec_write(p_device_context, GPIO_PIN_SHARING, value); | ||
| 1279 | + | ||
| 1280 | + status = zy_ac97_acodec_read(p_device_context, GPIO_PIN_WAKEUP, &value); | ||
| 1281 | + value |= (0x2000); | ||
| 1282 | + status = zy_ac97_acodec_write(p_device_context, GPIO_PIN_WAKEUP, value); | ||
| 1283 | + | ||
| 1284 | + status = zy_ac97_acodec_read(p_device_context, GPIO_PIN_STICKY, &value); | ||
| 1285 | + value |= (0x2000); | ||
| 1286 | + status = zy_ac97_acodec_write(p_device_context, GPIO_PIN_STICKY, value); | ||
| 1287 | + | ||
| 1288 | + return status; | ||
| 1289 | +} | ||
| 1290 | + | ||
| 1291 | +zy_acodec_error_t zy_wm9713_disable_touch(zy_acocec_context_t *p_device_context) | ||
| 1292 | +{/* disable touch functionality in the codec */ | ||
| 1293 | + zy_acodec_error_t status = ZY_ACODEC_SUCCESS; | ||
| 1294 | + unsigned short value; | ||
| 1295 | + | ||
| 1296 | + /* power setting */ | ||
| 1297 | + status = zy_ac97_acodec_read(p_device_context, POWER_DOWN_1, &value); | ||
| 1298 | + value |= (ZY_AC97_9713_PWR_PADCPD); | ||
| 1299 | + status = zy_ac97_acodec_write(p_device_context, POWER_DOWN_1, value); | ||
| 1300 | + | ||
| 1301 | + return status; | ||
| 1302 | +} | ||
| 1303 | +zy_acodec_error_t zy_ac97_acodec_mfp_deinit(zy_acocec_context_t *p_device_context) | ||
| 1304 | +{/* do later: free all MFP resources. */ | ||
| 1305 | + return ZY_ACODEC_SUCCESS; | ||
| 1306 | +} | ||
| 1307 | + | ||
| 1308 | +static zy_acodec_error_t zy_ac97_acodec_shut_down_aclink(p_zy_ac97acodec_t p_ac97_reg, int * p_ost_regs) | ||
| 1309 | +{ | ||
| 1310 | + zy_acodec_error_t status = ZY_ACODEC_SUCCESS; | ||
| 1311 | + unsigned long time_remaining = ZY_AC97_LINKOFF_TIMEOUT_DEF; | ||
| 1312 | + | ||
| 1313 | + p_ac97_reg->gcr |= ZY_AC97_GCR_LINK_OFF_MSK; | ||
| 1314 | + p_ac97_reg->gcr |= ZY_AC97_GCR_CLKBPB_MSK; | ||
| 1315 | + | ||
| 1316 | + while (!(p_ac97_reg->gsr & ZY_AC97_GSR_ACOFFD_MSK)) | ||
| 1317 | + { | ||
| 1318 | + time_remaining --; | ||
| 1319 | + if (0 == time_remaining) | ||
| 1320 | + { | ||
| 1321 | + status = ZY_ACODEC_CONTROLLER_INTERFACE_TIMEOUT; | ||
| 1322 | + break; | ||
| 1323 | + } | ||
| 1324 | + udelay(1); | ||
| 1325 | + } | ||
| 1326 | + p_ac97_reg->gcr |= ZY_AC97_GCR_FRCRST_MSK; | ||
| 1327 | + /* check later: any delay needed */ | ||
| 1328 | + p_ac97_reg->gcr &= ~ZY_AC97_GCR_FRCRST_MSK; | ||
| 1329 | + p_ac97_reg->gcr &= ~ZY_AC97_GCR_CLKBPB_MSK; | ||
| 1330 | + | ||
| 1331 | + return(status); | ||
| 1332 | +} | ||
| 1333 | + | ||
| 1334 | + | ||
| 1335 | +zy_acodec_error_t zy_ac97_acodec_deinit(zy_acocec_context_t * p_ac97_ctxt) | ||
| 1336 | +{ | ||
| 1337 | + zy_acodec_error_t status ; | ||
| 1338 | + | ||
| 1339 | + status = zy_ac97_acodec_shut_down_aclink((p_zy_ac97acodec_t)(p_ac97_ctxt->p_ctrl_reg), p_ac97_ctxt->p_ost_regs); | ||
| 1340 | + | ||
| 1341 | + return (status); | ||
| 1342 | +} | ||
| 1343 | + | ||
| 1344 | +zy_acodec_error_t zy_acodec_deinit(zy_acocec_context_t *p_device_context) | ||
| 1345 | +{ | ||
| 1346 | + /* power down codec by codec specific power down function */ | ||
| 1347 | + if (p_device_context->g_pfn_codec_specific_dinit) | ||
| 1348 | + { | ||
| 1349 | + p_device_context->g_pfn_codec_specific_dinit(p_device_context); | ||
| 1350 | + } | ||
| 1351 | + /* call bus deinit function */ | ||
| 1352 | + zy_ac97_acodec_deinit(p_device_context); | ||
| 1353 | + /* restore MFP, set GPIO to suitable value */ | ||
| 1354 | + zy_ac97_acodec_mfp_deinit(p_device_context); | ||
| 1355 | + | ||
| 1356 | + return ZY_ACODEC_SUCCESS; | ||
| 1357 | +} | ||
| 1358 | + | ||
| 1359 | +void alsa_zy_codec_put(p_zy_acocec_context_t p_acodectxt) | ||
| 1360 | +{ | ||
| 1361 | + | ||
| 1362 | + zy_acodec_deinit(p_acodectxt); | ||
| 1363 | + //pxa_set_cken(24, 0); | ||
| 1364 | + CKENA &= ~(1 << 24); | ||
| 1365 | + | ||
| 1366 | + if(p_acodectxt->p_save_memory){ | ||
| 1367 | + kfree(p_saved_memory); | ||
| 1368 | + } | ||
| 1369 | + if(p_acodectxt->p_zy_scenario){ | ||
| 1370 | + kfree(p_zy_scenario); | ||
| 1371 | + } | ||
| 1372 | +} | ||
| 1373 | + | ||
| 1374 | + | ||
| 1375 | +zy_acodec_error_t zy_acodec_init(zy_acocec_context_t *p_device_context, int hw_init) | ||
| 1376 | +{ | ||
| 1377 | + /* set codec specific functions | ||
| 1378 | + * set mfp for Zylonite platform | ||
| 1379 | + * call bus init function (AC97, I2S, I2C, SSP) | ||
| 1380 | + * call specific init of codec | ||
| 1381 | + */ | ||
| 1382 | + zy_acodec_error_t retval = ZY_ACODEC_SUCCESS; | ||
| 1383 | + | ||
| 1384 | + if (p_device_context->acodec_id != WM_9713_ID) | ||
| 1385 | + {/* on Zylonite, it is Wolfson 9713 codec only */ | ||
| 1386 | + return ZY_ACODEC_GENERAL_SW_ERR; | ||
| 1387 | + } | ||
| 1388 | + | ||
| 1389 | + if (1 == hw_init) | ||
| 1390 | + { | ||
| 1391 | + zy_ac97_acodec_mfp_init(p_device_context); | ||
| 1392 | + zy_ac97_acodec_init(p_device_context); /* codec init common to ac97 */ | ||
| 1393 | + } | ||
| 1394 | + | ||
| 1395 | + /* wm9713-specific functions */ | ||
| 1396 | + (p_device_context->g_pfn_codec_specific_init) = zy_wm9713_specific_init; | ||
| 1397 | + (p_device_context->g_pfn_codec_specific_dinit) = zy_wm9713_specific_deinit; | ||
| 1398 | + (p_device_context->g_pfn_acodec_read) = zy_ac97_acodec_read; | ||
| 1399 | + (p_device_context->g_pfn_acodec_write) = zy_ac97_acodec_write; | ||
| 1400 | + | ||
| 1401 | + (p_device_context->g_pfn_event_ack) = zy_wm9713_event_ack; | ||
| 1402 | + (p_device_context->g_pfn_get_event) = zy_wm9713_get_event; | ||
| 1403 | + (p_device_context->g_pfn_disable_touch) = zy_wm9713_disable_touch; | ||
| 1404 | + (p_device_context->g_pfn_enable_touch) = zy_wm9713_enable_touch; | ||
| 1405 | + | ||
| 1406 | + if (1 == hw_init) | ||
| 1407 | + { | ||
| 1408 | + retval = p_device_context->g_pfn_codec_specific_init(p_device_context); | ||
| 1409 | + } | ||
| 1410 | + | ||
| 1411 | + return retval; | ||
| 1412 | +} | ||
| 1413 | + | ||
| 1414 | +static int __devinit touch_codec_zy_probe(struct platform_device *dev) | ||
| 1415 | +{ | ||
| 1416 | + int ret = 0; | ||
| 1417 | + struct snd_card *card = NULL; | ||
| 1418 | + zy_acodec_error_t status; | ||
| 1419 | + | ||
| 1420 | + /* will increase codec context use count */ | ||
| 1421 | + ret = alsa_prepare_for_zy(&p_zy_codec_ctxt); | ||
| 1422 | + if (ret) | ||
| 1423 | + goto err; | ||
| 1424 | + | ||
| 1425 | + /* codec specific initialization, audio will do it either */ | ||
| 1426 | + if (1 == p_zy_codec_ctxt->use_count) { | ||
| 1427 | + status = zy_acodec_init(p_zy_codec_ctxt, 1); | ||
| 1428 | + if (ZY_ACODEC_SUCCESS != status) { | ||
| 1429 | + printk(KERN_ERR "initialize codec error\n"); | ||
| 1430 | + ret = -EIO; | ||
| 1431 | + goto err; | ||
| 1432 | + } | ||
| 1433 | + | ||
| 1434 | + /* power down the units of the acodec, sleep the acodec, zy_acodec_init() | ||
| 1435 | + * will open all the units' power of the codec while ALSA need all the codec | ||
| 1436 | + * units power down and the codec should sleep if it can. | ||
| 1437 | + * So on the zylonite platform we call below function to power down and sleep | ||
| 1438 | + * wm9713 codec. | ||
| 1439 | + */ | ||
| 1440 | + p_zy_codec_ctxt->g_pfn_codec_specific_dinit(p_zy_codec_ctxt); | ||
| 1441 | + | ||
| 1442 | + } | ||
| 1443 | + | ||
| 1444 | + alsa_ts_init(); | ||
| 1445 | + | ||
| 1446 | + //mhn_mfp_set_afds(MFP_AC97_INT_N_GPIO,0,0); | ||
| 1447 | + //mhn_gpio_set_direction(MFP_AC97_INT_N_GPIO, GPIO_DIR_IN); | ||
| 1448 | + //mhn_gpio_clear_edge_detect_status(MFP_AC97_INT_N_GPIO); | ||
| 1449 | + gpio_direction_input(mfp_to_gpio(MFP_PIN_GPIO26)); | ||
| 1450 | + ret = request_irq(IRQ_GPIO(mfp_to_gpio(MFP_PIN_GPIO26)), | ||
| 1451 | + pxa_touch_irq, IRQF_TRIGGER_RISING, | ||
| 1452 | + "wm9713 touch event interrupt", NULL); | ||
| 1453 | + if (ret) { | ||
| 1454 | + printk(KERN_ERR "Request IRQ for touch failed (%d).\n", ret); | ||
| 1455 | + goto err; | ||
| 1456 | + } | ||
| 1457 | + | ||
| 1458 | + return 0; | ||
| 1459 | +err: | ||
| 1460 | + if (p_zy_codec_ctxt && (!--p_zy_codec_ctxt->use_count)) { | ||
| 1461 | + zy_acodec_deinit(p_zy_codec_ctxt); | ||
| 1462 | + //pxa_set_cken(24, 0); | ||
| 1463 | + CKENA &= ~(1 << 24); | ||
| 1464 | + kfree(p_zy_codec_ctxt); | ||
| 1465 | + p_zy_codec_ctxt = NULL; | ||
| 1466 | + } | ||
| 1467 | + | ||
| 1468 | + if (card) | ||
| 1469 | + snd_card_free(card); | ||
| 1470 | + | ||
| 1471 | + return ret; | ||
| 1472 | +} | ||
| 1473 | + | ||
| 1474 | +static int __devexit touch_codec_zy_remove(struct platform_device *dev) | ||
| 1475 | +{ | ||
| 1476 | + struct snd_card *card = platform_get_drvdata(dev); | ||
| 1477 | + | ||
| 1478 | + input_unregister_device(codec_zy_ts_input); | ||
| 1479 | + | ||
| 1480 | + if (p_zy_codec_ctxt && (!--p_zy_codec_ctxt->use_count)) { | ||
| 1481 | + alsa_zy_codec_put(p_zy_codec_ctxt); | ||
| 1482 | + kfree(p_zy_codec_ctxt); | ||
| 1483 | + p_zy_codec_ctxt = NULL; | ||
| 1484 | + } | ||
| 1485 | + | ||
| 1486 | + if (card) { | ||
| 1487 | + snd_card_free(card); | ||
| 1488 | + platform_set_drvdata(dev, NULL); | ||
| 1489 | + } | ||
| 1490 | + | ||
| 1491 | + return 0; | ||
| 1492 | +} | ||
| 1493 | + | ||
| 1494 | +#ifdef CONFIG_PM | ||
| 1495 | +static int touch_codec_zy_suspend(struct platform_device *_dev, pm_message_t state, u32 level) | ||
| 1496 | +{ | ||
| 1497 | + int ret=0; | ||
| 1498 | + | ||
| 1499 | + if (level == SUSPEND_DISABLE) { | ||
| 1500 | + ret = audio_codec_zy_do_suspend(NULL, SNDRV_CTL_POWER_D3cold, p_zy_codec_ctxt); | ||
| 1501 | + touch_suspend = 1; | ||
| 1502 | + } | ||
| 1503 | + return ret; | ||
| 1504 | +} | ||
| 1505 | + | ||
| 1506 | +static int touch_codec_zy_resume(struct platform_device *_dev, u32 level) | ||
| 1507 | +{ | ||
| 1508 | + int ret = 0; | ||
| 1509 | + | ||
| 1510 | + if (level == RESUME_ENABLE) { | ||
| 1511 | + ret = audio_codec_zy_do_resume(NULL, SNDRV_CTL_POWER_D0, p_zy_codec_ctxt); | ||
| 1512 | + touch_suspend = 0; | ||
| 1513 | + } | ||
| 1514 | + return ret; | ||
| 1515 | +} | ||
| 1516 | +#else | ||
| 1517 | +#define touch_codec_zy_suspend NULL | ||
| 1518 | +#define touch_codec_zy_resume NULL | ||
| 1519 | +#endif | ||
| 1520 | + | ||
| 1521 | +static struct platform_driver touch_codec_zy_driver = { | ||
| 1522 | + .probe = touch_codec_zy_probe, | ||
| 1523 | + .remove = __devexit_p(touch_codec_zy_remove), | ||
| 1524 | + .suspend= touch_codec_zy_suspend, | ||
| 1525 | + .resume = touch_codec_zy_resume, | ||
| 1526 | + .driver = { | ||
| 1527 | + .name = "pxa2xx-touch", | ||
| 1528 | + }, | ||
| 1529 | +}; | ||
| 1530 | + | ||
| 1531 | +static int __init touch_codec_zy_init(void) | ||
| 1532 | +{ | ||
| 1533 | + return platform_driver_register(&touch_codec_zy_driver); | ||
| 1534 | +} | ||
| 1535 | + | ||
| 1536 | +static void __exit touch_code_zy_exit(void) | ||
| 1537 | +{ | ||
| 1538 | + platform_driver_unregister(&touch_codec_zy_driver); | ||
| 1539 | +} | ||
| 1540 | +module_init(touch_codec_zy_init); | ||
| 1541 | +module_exit(touch_code_zy_exit); | ||
| 1542 | + | ||
| 1543 | +EXPORT_SYMBOL(p_zy_codec_ctxt); | ||
| 1544 | + | ||
| 1545 | +MODULE_AUTHOR("bridge.wu@marvell.com"); | ||
| 1546 | +MODULE_DESCRIPTION("zylonite audio touch codec driver on ALSA"); | ||
| 1547 | +MODULE_LICENSE("GPL"); | ||
| 1548 | + | ||
diff --git a/meta/packages/linux/linux-rp_2.6.25+2.6.26-rc4.bb b/meta/packages/linux/linux-rp_2.6.25+2.6.26-rc4.bb new file mode 100644 index 0000000000..fc8b179507 --- /dev/null +++ b/meta/packages/linux/linux-rp_2.6.25+2.6.26-rc4.bb | |||
| @@ -0,0 +1,190 @@ | |||
| 1 | require linux-rp.inc | ||
| 2 | |||
| 3 | PR = "r5" | ||
| 4 | |||
| 5 | DEFAULT_PREFERENCE = "-1" | ||
| 6 | DEFAULT_PREFERENCE_qemuarm = "1" | ||
| 7 | DEFAULT_PREFERENCE_qemux86 = "1" | ||
| 8 | DEFAULT_PREFERENCE_spitz = "1" | ||
| 9 | |||
| 10 | # Handy URLs | ||
| 11 | # git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git;protocol=git;tag=ef7d1b244fa6c94fb76d5f787b8629df64ea4046 | ||
| 12 | # ${KERNELORG_MIRROR}pub/linux/kernel/v2.6/linux-2.6.18.tar.bz2 | ||
| 13 | # ${KERNELORG_MIRROR}pub/linux/kernel/v2.6/testing/linux-2.6.20-rc4.tar.bz2 | ||
| 14 | # ${KERNELORG_MIRROR}pub/linux/kernel/v2.6/testing/patch-2.6.18-rc6.bz2;patch=1 | ||
| 15 | # ${KERNELORG_MIRROR}pub/linux/kernel/v2.6/snapshots/patch-2.6.18-rc2-git1.bz2;patch=1 | ||
| 16 | # ${KERNELORG_MIRROR}pub/linux/kernel/people/alan/linux-2.6/2.6.10/patch-2.6.10-ac8.gz;patch=1 | ||
| 17 | # ${KERNELORG_MIRROR}pub/linux/kernel/people/akpm/patches/2.6/2.6.14-rc2/2.6.14-rc2-mm1/2.6.14-rc2-mm1.bz2;patch=1 | ||
| 18 | |||
| 19 | # Patches submitted upstream are towards top of this list | ||
| 20 | # Hacks should clearly named and at the bottom | ||
| 21 | SRC_URI = "${KERNELORG_MIRROR}pub/linux/kernel/v2.6/linux-2.6.25.tar.bz2 \ | ||
| 22 | ${KERNELORG_MIRROR}pub/linux/kernel/v2.6/testing/patch-2.6.26-rc4.bz2;patch=1 \ | ||
| 23 | ${RPSRC}/lzo_jffs2_sysfs-r1.patch;patch=1 \ | ||
| 24 | ${RPSRC}/hx2750_base-r34.patch;patch=1 \ | ||
| 25 | ${RPSRC}/hx2750_bl-r9.patch;patch=1 \ | ||
| 26 | ${RPSRC}/hx2750_pcmcia-r3.patch;patch=1 \ | ||
| 27 | ${RPSRC}/pxa_keys-r9.patch;patch=1 \ | ||
| 28 | ${RPSRC}/tsc2101-r19.patch;patch=1 \ | ||
| 29 | ${RPSRC}/hx2750_test1-r8.patch;patch=1 \ | ||
| 30 | ${RPSRC}/sharpsl_pm_fixes1-r0.patch;patch=1 \ | ||
| 31 | ${RPSRC}/pm_changes-r1.patch;patch=1 \ | ||
| 32 | ${RPSRC}/locomo_kbd_tweak-r2.patch;patch=1 \ | ||
| 33 | # ${RPSRC}/pxa27x_overlay-r8.patch;patch=1 \ | ||
| 34 | ${RPSRC}/w100_extaccel-r2.patch;patch=1 \ | ||
| 35 | ${RPSRC}/w100_extmem-r1.patch;patch=1 \ | ||
| 36 | ${RPSRC}/poodle_pm-r6.patch;patch=1 \ | ||
| 37 | ${RPSRC}/poodle_lcd_hack-r0.patch;patch=1 \ | ||
| 38 | ${RPSRC}/poodle_asoc_fix-r1.patch;patch=1 \ | ||
| 39 | ${RPSRC}/logo_oh-r1.patch.bz2;patch=1;status=unmergable \ | ||
| 40 | ${RPSRC}/pxa-linking-bug.patch;patch=1;status=unmergable \ | ||
| 41 | file://hostap-monitor-mode.patch;patch=1;status=unmergable \ | ||
| 42 | file://serial-add-support-for-non-standard-xtals-to-16c950-driver.patch;patch=1;status=unmergable \ | ||
| 43 | ${RPSRC}/mmcsd_large_cards-r1.patch;patch=1;status=hack \ | ||
| 44 | ${RPSRC}/mmcsd_no_scr_check-r2.patch;patch=1;status=hack \ | ||
| 45 | ${RPSRC}/integrator_rgb-r1.patch;patch=1;status=hack \ | ||
| 46 | ${RPSRC}/pxa_cf_initorder_hack-r1.patch;patch=1;status=hack \ | ||
| 47 | file://sharpsl-rc-r1.patch;patch=1 \ | ||
| 48 | file://sharpsl-rc-r2.patch;patch=1 \ | ||
| 49 | file://spitz_h_rewrite.patch;patch=1 \ | ||
| 50 | file://pxa-serial-hack.patch;patch=1;status=hack \ | ||
| 51 | file://connectplus-remove-ide-HACK.patch;patch=1;status=hack \ | ||
| 52 | file://connectplus-prevent-oops-HACK.patch;patch=1;status=hack \ | ||
| 53 | file://htcuni.patch;patch=1 \ | ||
| 54 | file://versatile-armv6.patch;patch=1 \ | ||
| 55 | file://defconfig-c7x0 \ | ||
| 56 | file://defconfig-hx2000 \ | ||
| 57 | file://defconfig-akita \ | ||
| 58 | file://defconfig-spitz \ | ||
| 59 | file://defconfig-qemuarm \ | ||
| 60 | file://defconfig-qemux86 \ | ||
| 61 | file://defconfig-bootcdx86 \ | ||
| 62 | file://defconfig-htcuniversal \ | ||
| 63 | file://defconfig-zylonite" | ||
| 64 | # Disabled until the patchset is updated: | ||
| 65 | # file://defconfig-tosa | ||
| 66 | # file://defconfig-collie | ||
| 67 | # file://defconfig-poodle | ||
| 68 | |||
| 69 | |||
| 70 | # FIXMEs before made default | ||
| 71 | # ${RPSRC}/mmcsd_no_scr_check-r1.patch;patch=1;status=hack | ||
| 72 | |||
| 73 | |||
| 74 | # Add this to enable pm debug code (useful with a serial lead) | ||
| 75 | # ${RPSRC}/sharpsl_pm_debug-r0.patch;patch=1 | ||
| 76 | |||
| 77 | # Disabled until I find the reason this gives issues with cdc_subset | ||
| 78 | # ${RPSRC}/usb_rndis_tweaks-r0.patch;patch=1 \ | ||
| 79 | |||
| 80 | |||
| 81 | SRC_URI_append_collie = "\ | ||
| 82 | ${TKSRC}/mtd-sharp-flash-hack-r4.patch;patch=1 \ | ||
| 83 | ${TKSRC}/mcp-sa11x0-r0.patch;patch=1 \ | ||
| 84 | ${TKSRC}/locomo-r1.patch;patch=1 \ | ||
| 85 | ${TKSRC}/collie-kexec-r1.patch;patch=1 \ | ||
| 86 | ${TKSRC}/sharpsl_pm-4.patch;patch=1 \ | ||
| 87 | ${TKSRC}/collie_pm-3.patch;patch=1 \ | ||
| 88 | ${TKSRC}/ucb1x00_suspend.patch;patch=1 \ | ||
| 89 | ${TKSRC}/collie-ts.patch;patch=1 \ | ||
| 90 | ${TKSRC}/pcmcia_suspend.patch;patch=1 \ | ||
| 91 | ${TKSRC}/locomo_spi-6.patch;patch=1 \ | ||
| 92 | ${TKSRC}/config.patch;patch=1 \ | ||
| 93 | ${TKSRC}/locomokeyb-2.patch;patch=1 \ | ||
| 94 | ${TKSRC}/mmc-spi.patch;patch=1 \ | ||
| 95 | ${TKSRC}/linux-2.6.24-SIMpad-rtc-sa1100.patch;patch=1 \ | ||
| 96 | ${TKSRC}/sa1100_spinlock.patch;patch=1 \ | ||
| 97 | ${TKSRC}/sa1100-dma.patch;patch=1 \ | ||
| 98 | ${TKSRC}/sa1100_udc_g_ether-2.patch;patch=1 \ | ||
| 99 | " | ||
| 100 | |||
| 101 | SRC_URI_append_poodle = "\ | ||
| 102 | ${RPSRC}/poodle_serial_vcc-r0.patch;patch=1 \ | ||
| 103 | file://poodle_ts.patch;patch=1 \ | ||
| 104 | file://pxafb.patch;patch=1 \ | ||
| 105 | " | ||
| 106 | |||
| 107 | SRC_URI_append_tosa = "\ | ||
| 108 | file://tosa/0001-Allow-runtime-registration-of-regions-of-memory-that.patch;patch=1 \ | ||
| 109 | file://tosa/0002-Modify-dma_alloc_coherent-on-ARM-so-that-it-supports.patch;patch=1 \ | ||
| 110 | file://tosa/0003-Core-MFD-support.patch;patch=1 \ | ||
| 111 | file://tosa/0004-Add-support-for-tc6393xb-MFD-core.patch;patch=1 \ | ||
| 112 | file://tosa/0005-Add-support-for-tc6387xb-MFD-core.patch;patch=1 \ | ||
| 113 | file://tosa/0006-Add-support-for-t7l66xb-MFD-core.patch;patch=1 \ | ||
| 114 | file://tosa/0007-Common-headers-for-TMIO-MFD-subdevices.patch;patch=1 \ | ||
| 115 | file://tosa/0008-Nand-driver-for-TMIO-devices.patch;patch=1 \ | ||
| 116 | file://tosa/0009-FB-driver-for-TMIO-devices.patch;patch=1 \ | ||
| 117 | file://tosa/0010-OHCI-driver-for-TMIO-devices.patch;patch=1 \ | ||
| 118 | file://tosa/0011-MMC-driver-for-TMIO-devices.patch;patch=1 \ | ||
| 119 | file://tosa/0012-Tosa-keyboard-support.patch;patch=1 \ | ||
| 120 | file://tosa/0013-USB-gadget-pxa2xx_udc-supports-inverted-vbus.patch;patch=1 \ | ||
| 121 | file://tosa/0014-tosa_udc_use_gpio_vbus.patch.patch;patch=1 \ | ||
| 122 | file://tosa/0015-sharpsl-export-params.patch;patch=1 \ | ||
| 123 | file://tosa/0016-This-patch-fixes-the-pxa25x-clocks-definitions-to-ad.patch;patch=1 \ | ||
| 124 | file://tosa/0017-Convert-pxa2xx-UDC-to-use-debugfs.patch;patch=1 \ | ||
| 125 | file://tosa/0018-Fix-the-pxa2xx_udc-to-balance-calls-to-clk_enable-cl.patch;patch=1 \ | ||
| 126 | file://tosa/0026-I-don-t-think-we-should-check-for-IRQs-when-determin.patch;patch=1 \ | ||
| 127 | file://tosa/0027-Add-LiMn-one-of-the-most-common-for-small-non-recha.patch;patch=1 \ | ||
| 128 | file://tosa/0028-Add-suspend-resume-wakeup-support-for-pda_power.patch;patch=1 \ | ||
| 129 | file://tosa/0029-Support-using-VOLTAGE_-properties-for-apm-calculati.patch;patch=1 \ | ||
| 130 | file://tosa/0030-Core-driver-for-WM97xx-touchscreens.patch;patch=1 \ | ||
| 131 | file://tosa/0031-Add-chip-driver-for-WM9705-touchscreen.patch;patch=1 \ | ||
| 132 | file://tosa/0032-Add-chip-driver-for-WM9712-touchscreen.patch;patch=1 \ | ||
| 133 | file://tosa/0033-Add-chip-driver-for-WM9713-touchscreen.patch;patch=1 \ | ||
| 134 | file://tosa/0034-Driver-for-WM97xx-touchscreens-in-streaming-mode-on.patch;patch=1 \ | ||
| 135 | file://tosa/0035-Build-system-and-MAINTAINERS-entry-for-WM97xx-touchs.patch;patch=1 \ | ||
| 136 | file://tosa/0036-Set-id-to-1-for-wm97xx-subdevices.patch;patch=1 \ | ||
| 137 | file://tosa/0037-Don-t-lock-the-codec-list-in-snd_soc_dapm_new_widget.patch;patch=1 \ | ||
| 138 | file://tosa/0038-Don-t-lock-the-codec-list-in-snd_soc_dapm_new_widget.patch;patch=1 \ | ||
| 139 | file://tosa/0044-fix-tmio_mmc-debug-compilation.patch;patch=1 \ | ||
| 140 | file://tosa/0045-Update-tmio_ohci.patch;patch=1 \ | ||
| 141 | file://tosa/0046-patch-tc6393xb-cleanup.patch;patch=1 \ | ||
| 142 | file://tosa/0047-tc6393xb-use-bitmasks-instead-of-bit-field-structs.patch;patch=1 \ | ||
| 143 | file://tosa/0048-tc6393xb-GPIO-support.patch;patch=1 \ | ||
| 144 | file://tosa/0049-platform-support-for-TMIO-on-tosa.patch;patch=1 \ | ||
| 145 | file://tosa/0050-tosa-update-for-tc6393xb-gpio.patch;patch=1 \ | ||
| 146 | file://tosa/0051-fix-sound-soc-pxa-tosa.c-to-new-gpio-api.patch;patch=1 \ | ||
| 147 | file://tosa/0052-tosa-platform-backlight-support.patch;patch=1 \ | ||
| 148 | file://tosa/0053-sound-soc-codecs-wm9712.c-28.patch;patch=1 \ | ||
| 149 | file://tosa/0054-sound-soc-codecs-wm9712.c-2.patch;patch=1 \ | ||
| 150 | file://tosa/0055-Add-GPIO_POWERON-to-the-list-of-devices-that-we-supp.patch;patch=1 \ | ||
| 151 | file://tosa/0058-Fix-tosakbd-suspend.patch;patch=1 \ | ||
| 152 | file://tosa/0059-patch-tosa-wakeup-test.patch;patch=1 \ | ||
| 153 | file://tosa/0060-Add-support-for-power_supply-on-tosa.patch;patch=1 \ | ||
| 154 | file://tosa/0061-tosa-bat-unify.patch;patch=1 \ | ||
| 155 | file://tosa/0062-tosa-bat-fix-charging.patch;patch=1 \ | ||
| 156 | file://tosa/0063-patch-tosa-bat-jacket-detect.patch;patch=1 \ | ||
| 157 | file://tosa/0064-Export-modes-via-sysfs.patch;patch=1 \ | ||
| 158 | file://tosa/0065-wm97xx-core-fixes.patch;patch=1 \ | ||
| 159 | file://tosa/0066-tmiofb_probe-should-be-__devinit.patch;patch=1 \ | ||
| 160 | file://tosa/0067-modeswitching.patch;patch=1 \ | ||
| 161 | file://tosa/0068-Preliminary-tosa-denoiser.patch;patch=1 \ | ||
| 162 | file://tosa/0019-pxa-remove-periodic-mode-emulation-support.patch;patch=1 \ | ||
| 163 | file://tosa/0020-Provide-dew-device-clock-backports-from-2.6.24-git.patch;patch=1 \ | ||
| 164 | file://tosa/0021-Add-an-empty-drivers-gpio-directory-for-gpiolib-infr.patch;patch=1 \ | ||
| 165 | file://tosa/0022-Provide-new-implementation-infrastructure-that-platf.patch;patch=1 \ | ||
| 166 | file://tosa/0023-This-adds-gpiolib-support-for-the-PXA-architecture.patch;patch=1 \ | ||
| 167 | file://tosa/0024-Update-Documentation-gpio.txt-primarily-to-include.patch;patch=1 \ | ||
| 168 | file://tosa/0025-Signed-off-by-Dmitry-Baryshkov-dbaryshkov-gmail.co.patch;patch=1 \ | ||
| 169 | file://tosa/0039-Add-generic-framework-for-managing-clocks.patch;patch=1 \ | ||
| 170 | file://tosa/0040-Clocklib-debugfs-support.patch;patch=1 \ | ||
| 171 | file://tosa/0041-From-80a359e60c2aec59ccf4fca0a7fd20495f82b1d2-Mon-Se.patch;patch=1 \ | ||
| 172 | file://tosa/0042-Use-correct-clock-for-IrDA-on-pxa.patch;patch=1 \ | ||
| 173 | file://tosa/0043-Use-clocklib-for-sa1100-sub-arch.patch;patch=1 \ | ||
| 174 | file://tosa/0056-Support-resetting-by-asserting-GPIO-pin.patch;patch=1 \ | ||
| 175 | file://tosa/0057-Clean-up-tosa-resetting.patch;patch=1 \ | ||
| 176 | " | ||
| 177 | |||
| 178 | SRC_URI_append_htcuniversal ="\ | ||
| 179 | file://htcuni-acx.patch;patch=1;status=external \ | ||
| 180 | " | ||
| 181 | |||
| 182 | SRC_URI_append_zylonite ="\ | ||
| 183 | file://pxa_fb_overlay.patch;patch=1 \ | ||
| 184 | file://zylonite-boot.patch;patch=1 \ | ||
| 185 | file://zylonite_mtd-r0.patch;patch=1 \ | ||
| 186 | file://zylonite_touch-r0.patch;patch=1 \ | ||
| 187 | file://zylonite_keypad-r0.patch;patch=1 \ | ||
| 188 | " | ||
| 189 | |||
| 190 | S = "${WORKDIR}/linux-2.6.25" | ||
